wind-agent-cli 1.37.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (932) hide show
  1. package/LICENSE +718 -0
  2. package/README.md +26 -0
  3. package/dist/api-docs.html +901 -0
  4. package/dist/assets/CodeEditor-B2Wf7Fg0.js +110 -0
  5. package/dist/assets/FileTree-N2IkkHlv.js +127 -0
  6. package/dist/assets/GitPanel-DZCeuFZ2.js +29 -0
  7. package/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  8. package/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  9. package/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  10. package/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  11. package/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  12. package/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  13. package/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  14. package/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  15. package/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  16. package/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  17. package/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  18. package/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  19. package/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  20. package/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  21. package/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  22. package/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  23. package/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  24. package/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  25. package/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  26. package/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  27. package/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  28. package/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  29. package/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  30. package/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  31. package/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  32. package/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  33. package/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  34. package/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  35. package/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  36. package/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  37. package/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  38. package/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  39. package/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  40. package/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  41. package/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  42. package/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  43. package/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  44. package/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  45. package/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  46. package/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  47. package/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  48. package/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  49. package/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  50. package/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  51. package/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  52. package/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  53. package/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  54. package/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  55. package/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  56. package/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  57. package/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  58. package/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  59. package/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  60. package/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  61. package/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  62. package/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  63. package/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  64. package/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  65. package/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  66. package/dist/assets/MarkdownPreview-C0tqYnVu.js +41 -0
  67. package/dist/assets/PluginTabContent-Bnuf-fb8.js +1 -0
  68. package/dist/assets/Shell-BfFnMZ-f.js +81 -0
  69. package/dist/assets/Shell-qxJ8_QYu.css +32 -0
  70. package/dist/assets/StandaloneShell-QmyYwNAl.js +1 -0
  71. package/dist/assets/TaskMasterPanel-fMsmvN9L.js +32 -0
  72. package/dist/assets/abnfDiagram-N423BO3Z-DjPU7HLs.js +1 -0
  73. package/dist/assets/arc-Pdq6Tvr3.js +1 -0
  74. package/dist/assets/architectureDiagram-T3A2C74G-D0JnT0Vh.js +36 -0
  75. package/dist/assets/blockDiagram-VBNYF7ZC-DpaEf3mv.js +132 -0
  76. package/dist/assets/c4Diagram-5PPSVZJV-MpqlPGFi.js +10 -0
  77. package/dist/assets/channel-Bm0ZLE4z.js +1 -0
  78. package/dist/assets/chunk-2GRJ4B5K-DoSdNo8u.js +1 -0
  79. package/dist/assets/chunk-2Q5K7J3B-CE7I3uMn.js +1 -0
  80. package/dist/assets/chunk-5RXB4S5H-B4UQ8snD.js +231 -0
  81. package/dist/assets/chunk-5VM5RSS4-B55XgqHZ.js +15 -0
  82. package/dist/assets/chunk-6Q2QTUOP-BS1KpefW.js +88 -0
  83. package/dist/assets/chunk-GF5L2VYU-DkEPedJP.js +206 -0
  84. package/dist/assets/chunk-JWPE2WC7-DOtkNhMm.js +1 -0
  85. package/dist/assets/chunk-KBJHAD2P-BXLjviqM.js +1 -0
  86. package/dist/assets/chunk-RYQCIY6F-C50fjNNz.js +1 -0
  87. package/dist/assets/chunk-XXDRQBXY-QBYqCkb7.js +1 -0
  88. package/dist/assets/classDiagram-JCYQIIEL-DqEOcNxw.js +1 -0
  89. package/dist/assets/classDiagram-v2-OCEON4UE-DqEOcNxw.js +1 -0
  90. package/dist/assets/code-xml-VK1YfShP.js +6 -0
  91. package/dist/assets/cose-bilkent-JH36ORCC-DrVTo1Nh.js +1 -0
  92. package/dist/assets/cynefin-VYW2F7L2-DnJa_OlQ.js +178 -0
  93. package/dist/assets/cynefinDiagram-MW4NZA55-CCxBjw9E.js +62 -0
  94. package/dist/assets/cytoscape.esm-C10L9Icf.js +331 -0
  95. package/dist/assets/dagre-VZM6K2ZE-C_GvE4lu.js +4 -0
  96. package/dist/assets/defaultLocale-DX6XiGOO.js +1 -0
  97. package/dist/assets/diagram-7IWD3JNH-pFzs9HEu.js +30 -0
  98. package/dist/assets/diagram-B4RE2ZJO-CcehQC7x.js +3 -0
  99. package/dist/assets/diagram-LBJQPF4R-hfKcrrxe.js +24 -0
  100. package/dist/assets/diagram-Q27KOJAE-C1semJfK.js +24 -0
  101. package/dist/assets/diagram-UB23O5K3-57hvXQXO.js +41 -0
  102. package/dist/assets/ebnfDiagram-BXEA7PRR-9KIAlAVw.js +1 -0
  103. package/dist/assets/erDiagram-JOGREHBK-B7OzJ767.js +85 -0
  104. package/dist/assets/flowDiagram-UKHOOZJN-CJV8fQPR.js +156 -0
  105. package/dist/assets/ganttDiagram-PKOTCBZU-CbMNWWQu.js +292 -0
  106. package/dist/assets/gitGraphDiagram-DS77QQ5N-I_vZ5waO.js +106 -0
  107. package/dist/assets/graph-Cx-EqisW.js +1 -0
  108. package/dist/assets/index-DFnVoqpx.js +1174 -0
  109. package/dist/assets/index-DlSeAkw_.js +11 -0
  110. package/dist/assets/index-GFhXZyl2.js +62 -0
  111. package/dist/assets/index-ZHwIojzi.js +1 -0
  112. package/dist/assets/index-t1w8KNxn.css +1 -0
  113. package/dist/assets/infoDiagram-6WML65LV-Dh20Tsbq.js +2 -0
  114. package/dist/assets/init-Gi6I4Gst.js +1 -0
  115. package/dist/assets/ishikawaDiagram-WSZJBQD7-DH2Sm3ko.js +70 -0
  116. package/dist/assets/journeyDiagram-NVQOT4AX-BNFQqlVu.js +139 -0
  117. package/dist/assets/kanban-definition-27J2QSJJ-B3iL0ztJ.js +89 -0
  118. package/dist/assets/layout-D6BstSzF.js +1 -0
  119. package/dist/assets/linear-Cwe9dEKA.js +1 -0
  120. package/dist/assets/map-CV9uif0g.js +1 -0
  121. package/dist/assets/mermaid.core-BYRQSshi.js +312 -0
  122. package/dist/assets/mindmap-definition-FAOFIHXS-BgfBYMzr.js +96 -0
  123. package/dist/assets/ordinal-Cboi1Yqb.js +1 -0
  124. package/dist/assets/pegDiagram-VL7TDLO6-CNYpECr8.js +1 -0
  125. package/dist/assets/pieDiagram-7S7Q4E2Y-DeSrxc4I.js +39 -0
  126. package/dist/assets/quadrantDiagram-CIZ2JOQS-BXVVQsa6.js +7 -0
  127. package/dist/assets/railroadDiagram-AXF67PYL-JTroIW8F.js +1 -0
  128. package/dist/assets/requirementDiagram-LRYGKXZP-C1Z_inLz.js +84 -0
  129. package/dist/assets/sankeyDiagram-W5VNT64P-DCJgKFUk.js +40 -0
  130. package/dist/assets/sequenceDiagram-SI44F4Z6-D8Wrx5Vc.js +162 -0
  131. package/dist/assets/sizeCapture-X5ZJPWSS-CXqD68vD.js +1 -0
  132. package/dist/assets/stateDiagram-OKZ733FA-CF0Ekqjo.js +1 -0
  133. package/dist/assets/stateDiagram-v2-UEYNNEHI-DARLpEFJ.js +1 -0
  134. package/dist/assets/swimlanes-SLNWSIFB-DVIax_k4.js +2 -0
  135. package/dist/assets/swimlanesDiagram-ULZ7WXOC-CrgDgaY8.js +8 -0
  136. package/dist/assets/timeline-definition-Z64GVDOM-DSqk3ApG.js +120 -0
  137. package/dist/assets/vendor-react-whEHfigN.js +59 -0
  138. package/dist/assets/vennDiagram-T6HMQDX7-DNbTqyG5.js +34 -0
  139. package/dist/assets/wardleyDiagram-T6FBY63Y-BNCpsFZV.js +78 -0
  140. package/dist/assets/xychartDiagram-ELKLHX3M-XsVZphHr.js +7 -0
  141. package/dist/clear-cache.html +85 -0
  142. package/dist/convert-icons.md +53 -0
  143. package/dist/favicon.png +0 -0
  144. package/dist/favicon.svg +9 -0
  145. package/dist/generate-icons.js +49 -0
  146. package/dist/icons/claude-ai-icon.svg +1 -0
  147. package/dist/icons/codex-white.svg +3 -0
  148. package/dist/icons/codex.svg +3 -0
  149. package/dist/icons/cursor-white.svg +12 -0
  150. package/dist/icons/cursor.svg +1 -0
  151. package/dist/icons/icon-128x128.png +0 -0
  152. package/dist/icons/icon-128x128.svg +12 -0
  153. package/dist/icons/icon-144x144.png +0 -0
  154. package/dist/icons/icon-144x144.svg +12 -0
  155. package/dist/icons/icon-152x152.png +0 -0
  156. package/dist/icons/icon-152x152.svg +12 -0
  157. package/dist/icons/icon-192x192.png +0 -0
  158. package/dist/icons/icon-192x192.svg +12 -0
  159. package/dist/icons/icon-384x384.png +0 -0
  160. package/dist/icons/icon-384x384.svg +12 -0
  161. package/dist/icons/icon-512x512.png +0 -0
  162. package/dist/icons/icon-512x512.svg +12 -0
  163. package/dist/icons/icon-72x72.png +0 -0
  164. package/dist/icons/icon-72x72.svg +12 -0
  165. package/dist/icons/icon-96x96.png +0 -0
  166. package/dist/icons/icon-96x96.svg +12 -0
  167. package/dist/icons/icon-template.svg +12 -0
  168. package/dist/index.html +58 -0
  169. package/dist/logo-128.png +0 -0
  170. package/dist/logo-256.png +0 -0
  171. package/dist/logo-32.png +0 -0
  172. package/dist/logo-512.png +0 -0
  173. package/dist/logo-64.png +0 -0
  174. package/dist/logo.svg +17 -0
  175. package/dist/manifest.json +61 -0
  176. package/dist/screenshots/cli-selection.png +0 -0
  177. package/dist/screenshots/desktop-main.png +0 -0
  178. package/dist/screenshots/mobile-chat.png +0 -0
  179. package/dist/screenshots/new-session.png +0 -0
  180. package/dist/screenshots/tools-modal.png +0 -0
  181. package/dist/sw.js +124 -0
  182. package/dist-server/scripts/fix-codex-sdk-windows-hide.js +47 -0
  183. package/dist-server/scripts/fix-codex-sdk-windows-hide.js.map +1 -0
  184. package/dist-server/server/index.js +339 -0
  185. package/dist-server/server/index.js.map +1 -0
  186. package/dist-server/server/load-env.js +45 -0
  187. package/dist-server/server/load-env.js.map +1 -0
  188. package/dist-server/server/modules/agent/agent.module.js +38 -0
  189. package/dist-server/server/modules/agent/agent.module.js.map +1 -0
  190. package/dist-server/server/modules/agent/agent.routes.js +1161 -0
  191. package/dist-server/server/modules/agent/agent.routes.js.map +1 -0
  192. package/dist-server/server/modules/agent/index.js +3 -0
  193. package/dist-server/server/modules/agent/index.js.map +1 -0
  194. package/dist-server/server/modules/agent/tests/agent.routes.test.js +176 -0
  195. package/dist-server/server/modules/agent/tests/agent.routes.test.js.map +1 -0
  196. package/dist-server/server/modules/assets/assets.routes.js +130 -0
  197. package/dist-server/server/modules/assets/assets.routes.js.map +1 -0
  198. package/dist-server/server/modules/assets/index.js +4 -0
  199. package/dist-server/server/modules/assets/index.js.map +1 -0
  200. package/dist-server/server/modules/assets/services/image-assets.service.js +95 -0
  201. package/dist-server/server/modules/assets/services/image-assets.service.js.map +1 -0
  202. package/dist-server/server/modules/assets/tests/image-assets.service.test.js +56 -0
  203. package/dist-server/server/modules/assets/tests/image-assets.service.test.js.map +1 -0
  204. package/dist-server/server/modules/auth/auth.middleware.js +133 -0
  205. package/dist-server/server/modules/auth/auth.middleware.js.map +1 -0
  206. package/dist-server/server/modules/auth/auth.module.js +29 -0
  207. package/dist-server/server/modules/auth/auth.module.js.map +1 -0
  208. package/dist-server/server/modules/auth/auth.routes.js +45 -0
  209. package/dist-server/server/modules/auth/auth.routes.js.map +1 -0
  210. package/dist-server/server/modules/auth/auth.service.js +113 -0
  211. package/dist-server/server/modules/auth/auth.service.js.map +1 -0
  212. package/dist-server/server/modules/auth/index.js +9 -0
  213. package/dist-server/server/modules/auth/index.js.map +1 -0
  214. package/dist-server/server/modules/auth/tests/auth.service.test.js +80 -0
  215. package/dist-server/server/modules/auth/tests/auth.service.test.js.map +1 -0
  216. package/dist-server/server/modules/browser-use/browser-use-mcp.js +352 -0
  217. package/dist-server/server/modules/browser-use/browser-use-mcp.js.map +1 -0
  218. package/dist-server/server/modules/browser-use/browser-use-mcp.routes.js +107 -0
  219. package/dist-server/server/modules/browser-use/browser-use-mcp.routes.js.map +1 -0
  220. package/dist-server/server/modules/browser-use/browser-use-runtime.js +10 -0
  221. package/dist-server/server/modules/browser-use/browser-use-runtime.js.map +1 -0
  222. package/dist-server/server/modules/browser-use/browser-use.routes.js +93 -0
  223. package/dist-server/server/modules/browser-use/browser-use.routes.js.map +1 -0
  224. package/dist-server/server/modules/browser-use/browser-use.service.js +687 -0
  225. package/dist-server/server/modules/browser-use/browser-use.service.js.map +1 -0
  226. package/dist-server/server/modules/browser-use/index.js +11 -0
  227. package/dist-server/server/modules/browser-use/index.js.map +1 -0
  228. package/dist-server/server/modules/browser-use/tests/browser-use.service.test.js +8 -0
  229. package/dist-server/server/modules/browser-use/tests/browser-use.service.test.js.map +1 -0
  230. package/dist-server/server/modules/cli/cli.js +17 -0
  231. package/dist-server/server/modules/cli/cli.js.map +1 -0
  232. package/dist-server/server/modules/cli/cli.module.js +85 -0
  233. package/dist-server/server/modules/cli/cli.module.js.map +1 -0
  234. package/dist-server/server/modules/cli/cli.service.js +225 -0
  235. package/dist-server/server/modules/cli/cli.service.js.map +1 -0
  236. package/dist-server/server/modules/cli/index.js +3 -0
  237. package/dist-server/server/modules/cli/index.js.map +1 -0
  238. package/dist-server/server/modules/cli/sandbox.service.js +332 -0
  239. package/dist-server/server/modules/cli/sandbox.service.js.map +1 -0
  240. package/dist-server/server/modules/cli/tests/cli-environment-bootstrap.test.js +154 -0
  241. package/dist-server/server/modules/cli/tests/cli-environment-bootstrap.test.js.map +1 -0
  242. package/dist-server/server/modules/cli/tests/cli.service.test.js +82 -0
  243. package/dist-server/server/modules/cli/tests/cli.service.test.js.map +1 -0
  244. package/dist-server/server/modules/cli/tests/sandbox.service.test.js +56 -0
  245. package/dist-server/server/modules/cli/tests/sandbox.service.test.js.map +1 -0
  246. package/dist-server/server/modules/commands/commands.module.js +20 -0
  247. package/dist-server/server/modules/commands/commands.module.js.map +1 -0
  248. package/dist-server/server/modules/commands/commands.routes.js +547 -0
  249. package/dist-server/server/modules/commands/commands.routes.js.map +1 -0
  250. package/dist-server/server/modules/commands/index.js +3 -0
  251. package/dist-server/server/modules/commands/index.js.map +1 -0
  252. package/dist-server/server/modules/commands/tests/commands.test.js +144 -0
  253. package/dist-server/server/modules/commands/tests/commands.test.js.map +1 -0
  254. package/dist-server/server/modules/database/connection.js +125 -0
  255. package/dist-server/server/modules/database/connection.js.map +1 -0
  256. package/dist-server/server/modules/database/index.js +18 -0
  257. package/dist-server/server/modules/database/index.js.map +1 -0
  258. package/dist-server/server/modules/database/init-db.js +18 -0
  259. package/dist-server/server/modules/database/init-db.js.map +1 -0
  260. package/dist-server/server/modules/database/migrations.js +434 -0
  261. package/dist-server/server/modules/database/migrations.js.map +1 -0
  262. package/dist-server/server/modules/database/repositories/api-keys.js +72 -0
  263. package/dist-server/server/modules/database/repositories/api-keys.js.map +1 -0
  264. package/dist-server/server/modules/database/repositories/app-config.js +47 -0
  265. package/dist-server/server/modules/database/repositories/app-config.js.map +1 -0
  266. package/dist-server/server/modules/database/repositories/credentials.js +68 -0
  267. package/dist-server/server/modules/database/repositories/credentials.js.map +1 -0
  268. package/dist-server/server/modules/database/repositories/github-tokens.js +54 -0
  269. package/dist-server/server/modules/database/repositories/github-tokens.js.map +1 -0
  270. package/dist-server/server/modules/database/repositories/notification-channel-endpoints.js +100 -0
  271. package/dist-server/server/modules/database/repositories/notification-channel-endpoints.js.map +1 -0
  272. package/dist-server/server/modules/database/repositories/notification-preferences.js +82 -0
  273. package/dist-server/server/modules/database/repositories/notification-preferences.js.map +1 -0
  274. package/dist-server/server/modules/database/repositories/projects.db.js +172 -0
  275. package/dist-server/server/modules/database/repositories/projects.db.js.map +1 -0
  276. package/dist-server/server/modules/database/repositories/provider-models.js +112 -0
  277. package/dist-server/server/modules/database/repositories/provider-models.js.map +1 -0
  278. package/dist-server/server/modules/database/repositories/push-subscriptions.js +49 -0
  279. package/dist-server/server/modules/database/repositories/push-subscriptions.js.map +1 -0
  280. package/dist-server/server/modules/database/repositories/scan-state.db.js +31 -0
  281. package/dist-server/server/modules/database/repositories/scan-state.db.js.map +1 -0
  282. package/dist-server/server/modules/database/repositories/sessions.db.js +375 -0
  283. package/dist-server/server/modules/database/repositories/sessions.db.js.map +1 -0
  284. package/dist-server/server/modules/database/repositories/users.js +88 -0
  285. package/dist-server/server/modules/database/repositories/users.js.map +1 -0
  286. package/dist-server/server/modules/database/repositories/vapid-keys.js +38 -0
  287. package/dist-server/server/modules/database/repositories/vapid-keys.js.map +1 -0
  288. package/dist-server/server/modules/database/schema.js +199 -0
  289. package/dist-server/server/modules/database/schema.js.map +1 -0
  290. package/dist-server/server/modules/database/tests/projects.db.integration.test.js +64 -0
  291. package/dist-server/server/modules/database/tests/projects.db.integration.test.js.map +1 -0
  292. package/dist-server/server/modules/database/tests/provider-models.db.integration.test.js +102 -0
  293. package/dist-server/server/modules/database/tests/provider-models.db.integration.test.js.map +1 -0
  294. package/dist-server/server/modules/database/tests/sessions-provider-mapping.test.js +79 -0
  295. package/dist-server/server/modules/database/tests/sessions-provider-mapping.test.js.map +1 -0
  296. package/dist-server/server/modules/database/tests/sessions.db.integration.test.js +93 -0
  297. package/dist-server/server/modules/database/tests/sessions.db.integration.test.js.map +1 -0
  298. package/dist-server/server/modules/file-tree/file-tree.module.js +95 -0
  299. package/dist-server/server/modules/file-tree/file-tree.module.js.map +1 -0
  300. package/dist-server/server/modules/file-tree/file-tree.routes.js +208 -0
  301. package/dist-server/server/modules/file-tree/file-tree.routes.js.map +1 -0
  302. package/dist-server/server/modules/file-tree/file-tree.service.js +584 -0
  303. package/dist-server/server/modules/file-tree/file-tree.service.js.map +1 -0
  304. package/dist-server/server/modules/file-tree/index.js +3 -0
  305. package/dist-server/server/modules/file-tree/index.js.map +1 -0
  306. package/dist-server/server/modules/file-tree/tests/file-tree.routes.test.js +123 -0
  307. package/dist-server/server/modules/file-tree/tests/file-tree.routes.test.js.map +1 -0
  308. package/dist-server/server/modules/file-tree/tests/file-tree.service.test.js +311 -0
  309. package/dist-server/server/modules/file-tree/tests/file-tree.service.test.js.map +1 -0
  310. package/dist-server/server/modules/git/git-branch.service.js +15 -0
  311. package/dist-server/server/modules/git/git-branch.service.js.map +1 -0
  312. package/dist-server/server/modules/git/git-parsing.service.js +61 -0
  313. package/dist-server/server/modules/git/git-parsing.service.js.map +1 -0
  314. package/dist-server/server/modules/git/git.module.js +14 -0
  315. package/dist-server/server/modules/git/git.module.js.map +1 -0
  316. package/dist-server/server/modules/git/git.routes.js +1348 -0
  317. package/dist-server/server/modules/git/git.routes.js.map +1 -0
  318. package/dist-server/server/modules/git/index.js +3 -0
  319. package/dist-server/server/modules/git/index.js.map +1 -0
  320. package/dist-server/server/modules/git/tests/git-branch.service.test.js +52 -0
  321. package/dist-server/server/modules/git/tests/git-branch.service.test.js.map +1 -0
  322. package/dist-server/server/modules/git/tests/git-init.routes.test.js +177 -0
  323. package/dist-server/server/modules/git/tests/git-init.routes.test.js.map +1 -0
  324. package/dist-server/server/modules/git/tests/git.test.js +80 -0
  325. package/dist-server/server/modules/git/tests/git.test.js.map +1 -0
  326. package/dist-server/server/modules/notifications/index.js +20 -0
  327. package/dist-server/server/modules/notifications/index.js.map +1 -0
  328. package/dist-server/server/modules/notifications/notifications.routes.js +115 -0
  329. package/dist-server/server/modules/notifications/notifications.routes.js.map +1 -0
  330. package/dist-server/server/modules/notifications/services/desktop-notification-clients.service.js +97 -0
  331. package/dist-server/server/modules/notifications/services/desktop-notification-clients.service.js.map +1 -0
  332. package/dist-server/server/modules/notifications/services/notification-orchestrator.service.js +249 -0
  333. package/dist-server/server/modules/notifications/services/notification-orchestrator.service.js.map +1 -0
  334. package/dist-server/server/modules/notifications/tests/notification-orchestrator.integration.test.js +44 -0
  335. package/dist-server/server/modules/notifications/tests/notification-orchestrator.integration.test.js.map +1 -0
  336. package/dist-server/server/modules/notifications/vapid-keys.service.js +28 -0
  337. package/dist-server/server/modules/notifications/vapid-keys.service.js.map +1 -0
  338. package/dist-server/server/modules/notifications/websocket/desktop-notifications-websocket.service.js +79 -0
  339. package/dist-server/server/modules/notifications/websocket/desktop-notifications-websocket.service.js.map +1 -0
  340. package/dist-server/server/modules/plugins/index.js +9 -0
  341. package/dist-server/server/modules/plugins/index.js.map +1 -0
  342. package/dist-server/server/modules/plugins/plugin-process.service.js +191 -0
  343. package/dist-server/server/modules/plugins/plugin-process.service.js.map +1 -0
  344. package/dist-server/server/modules/plugins/plugin-registry.service.js +414 -0
  345. package/dist-server/server/modules/plugins/plugin-registry.service.js.map +1 -0
  346. package/dist-server/server/modules/plugins/plugins.module.js +30 -0
  347. package/dist-server/server/modules/plugins/plugins.module.js.map +1 -0
  348. package/dist-server/server/modules/plugins/plugins.routes.js +70 -0
  349. package/dist-server/server/modules/plugins/plugins.routes.js.map +1 -0
  350. package/dist-server/server/modules/plugins/plugins.service.js +123 -0
  351. package/dist-server/server/modules/plugins/plugins.service.js.map +1 -0
  352. package/dist-server/server/modules/plugins/tests/plugins.service.test.js +28 -0
  353. package/dist-server/server/modules/plugins/tests/plugins.service.test.js.map +1 -0
  354. package/dist-server/server/modules/projects/index.js +9 -0
  355. package/dist-server/server/modules/projects/index.js.map +1 -0
  356. package/dist-server/server/modules/projects/projects.routes.js +205 -0
  357. package/dist-server/server/modules/projects/projects.routes.js.map +1 -0
  358. package/dist-server/server/modules/projects/services/project-clone.service.js +220 -0
  359. package/dist-server/server/modules/projects/services/project-clone.service.js.map +1 -0
  360. package/dist-server/server/modules/projects/services/project-delete.service.js +78 -0
  361. package/dist-server/server/modules/projects/services/project-delete.service.js.map +1 -0
  362. package/dist-server/server/modules/projects/services/project-management.service.js +90 -0
  363. package/dist-server/server/modules/projects/services/project-management.service.js.map +1 -0
  364. package/dist-server/server/modules/projects/services/project-star.service.js +60 -0
  365. package/dist-server/server/modules/projects/services/project-star.service.js.map +1 -0
  366. package/dist-server/server/modules/projects/services/projects-has-taskmaster.service.js +167 -0
  367. package/dist-server/server/modules/projects/services/projects-has-taskmaster.service.js.map +1 -0
  368. package/dist-server/server/modules/projects/services/projects-with-sessions-fetch.service.js +188 -0
  369. package/dist-server/server/modules/projects/services/projects-with-sessions-fetch.service.js.map +1 -0
  370. package/dist-server/server/modules/projects/tests/project-clone.service.test.js +126 -0
  371. package/dist-server/server/modules/projects/tests/project-clone.service.test.js.map +1 -0
  372. package/dist-server/server/modules/projects/tests/project-management.service.test.js +85 -0
  373. package/dist-server/server/modules/projects/tests/project-management.service.test.js.map +1 -0
  374. package/dist-server/server/modules/projects/tests/project-star.service.test.js +95 -0
  375. package/dist-server/server/modules/projects/tests/project-star.service.test.js.map +1 -0
  376. package/dist-server/server/modules/projects/tests/projects-has-taskmaster.service.test.js +87 -0
  377. package/dist-server/server/modules/projects/tests/projects-has-taskmaster.service.test.js.map +1 -0
  378. package/dist-server/server/modules/providers/index.js +9 -0
  379. package/dist-server/server/modules/providers/index.js.map +1 -0
  380. package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js +132 -0
  381. package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js.map +1 -0
  382. package/dist-server/server/modules/providers/list/claude/claude-mcp.provider.js +103 -0
  383. package/dist-server/server/modules/providers/list/claude/claude-mcp.provider.js.map +1 -0
  384. package/dist-server/server/modules/providers/list/claude/claude-models.provider.js +249 -0
  385. package/dist-server/server/modules/providers/list/claude/claude-models.provider.js.map +1 -0
  386. package/dist-server/server/modules/providers/list/claude/claude-runtime.provider.js +928 -0
  387. package/dist-server/server/modules/providers/list/claude/claude-runtime.provider.js.map +1 -0
  388. package/dist-server/server/modules/providers/list/claude/claude-session-synchronizer.provider.js +141 -0
  389. package/dist-server/server/modules/providers/list/claude/claude-session-synchronizer.provider.js.map +1 -0
  390. package/dist-server/server/modules/providers/list/claude/claude-sessions.provider.js +586 -0
  391. package/dist-server/server/modules/providers/list/claude/claude-sessions.provider.js.map +1 -0
  392. package/dist-server/server/modules/providers/list/claude/claude-skills.provider.js +205 -0
  393. package/dist-server/server/modules/providers/list/claude/claude-skills.provider.js.map +1 -0
  394. package/dist-server/server/modules/providers/list/claude/claude.provider.js +21 -0
  395. package/dist-server/server/modules/providers/list/claude/claude.provider.js.map +1 -0
  396. package/dist-server/server/modules/providers/list/codex/codex-app-server.client.js +180 -0
  397. package/dist-server/server/modules/providers/list/codex/codex-app-server.client.js.map +1 -0
  398. package/dist-server/server/modules/providers/list/codex/codex-auth.provider.js +84 -0
  399. package/dist-server/server/modules/providers/list/codex/codex-auth.provider.js.map +1 -0
  400. package/dist-server/server/modules/providers/list/codex/codex-mcp.provider.js +107 -0
  401. package/dist-server/server/modules/providers/list/codex/codex-mcp.provider.js.map +1 -0
  402. package/dist-server/server/modules/providers/list/codex/codex-models.provider.js +109 -0
  403. package/dist-server/server/modules/providers/list/codex/codex-models.provider.js.map +1 -0
  404. package/dist-server/server/modules/providers/list/codex/codex-native-command.service.js +22 -0
  405. package/dist-server/server/modules/providers/list/codex/codex-native-command.service.js.map +1 -0
  406. package/dist-server/server/modules/providers/list/codex/codex-native-runtime.provider.js +473 -0
  407. package/dist-server/server/modules/providers/list/codex/codex-native-runtime.provider.js.map +1 -0
  408. package/dist-server/server/modules/providers/list/codex/codex-runtime.provider.js +462 -0
  409. package/dist-server/server/modules/providers/list/codex/codex-runtime.provider.js.map +1 -0
  410. package/dist-server/server/modules/providers/list/codex/codex-session-synchronizer.provider.js +145 -0
  411. package/dist-server/server/modules/providers/list/codex/codex-session-synchronizer.provider.js.map +1 -0
  412. package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js +822 -0
  413. package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js.map +1 -0
  414. package/dist-server/server/modules/providers/list/codex/codex-skills.provider.js +62 -0
  415. package/dist-server/server/modules/providers/list/codex/codex-skills.provider.js.map +1 -0
  416. package/dist-server/server/modules/providers/list/codex/codex.provider.js +21 -0
  417. package/dist-server/server/modules/providers/list/codex/codex.provider.js.map +1 -0
  418. package/dist-server/server/modules/providers/list/cursor/cursor-auth.provider.js +118 -0
  419. package/dist-server/server/modules/providers/list/cursor/cursor-auth.provider.js.map +1 -0
  420. package/dist-server/server/modules/providers/list/cursor/cursor-mcp.provider.js +80 -0
  421. package/dist-server/server/modules/providers/list/cursor/cursor-mcp.provider.js.map +1 -0
  422. package/dist-server/server/modules/providers/list/cursor/cursor-models.provider.js +100 -0
  423. package/dist-server/server/modules/providers/list/cursor/cursor-models.provider.js.map +1 -0
  424. package/dist-server/server/modules/providers/list/cursor/cursor-runtime.provider.js +303 -0
  425. package/dist-server/server/modules/providers/list/cursor/cursor-runtime.provider.js.map +1 -0
  426. package/dist-server/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.js +111 -0
  427. package/dist-server/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.js.map +1 -0
  428. package/dist-server/server/modules/providers/list/cursor/cursor-sessions.provider.js +566 -0
  429. package/dist-server/server/modules/providers/list/cursor/cursor-sessions.provider.js.map +1 -0
  430. package/dist-server/server/modules/providers/list/cursor/cursor-skills.provider.js +35 -0
  431. package/dist-server/server/modules/providers/list/cursor/cursor-skills.provider.js.map +1 -0
  432. package/dist-server/server/modules/providers/list/cursor/cursor.provider.js +21 -0
  433. package/dist-server/server/modules/providers/list/cursor/cursor.provider.js.map +1 -0
  434. package/dist-server/server/modules/providers/list/opencode/opencode-auth.provider.js +91 -0
  435. package/dist-server/server/modules/providers/list/opencode/opencode-auth.provider.js.map +1 -0
  436. package/dist-server/server/modules/providers/list/opencode/opencode-mcp.provider.js +181 -0
  437. package/dist-server/server/modules/providers/list/opencode/opencode-mcp.provider.js.map +1 -0
  438. package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js +177 -0
  439. package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js.map +1 -0
  440. package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.js +368 -0
  441. package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.js.map +1 -0
  442. package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.test.js +225 -0
  443. package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.test.js.map +1 -0
  444. package/dist-server/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.js +136 -0
  445. package/dist-server/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.js.map +1 -0
  446. package/dist-server/server/modules/providers/list/opencode/opencode-sessions.provider.js +404 -0
  447. package/dist-server/server/modules/providers/list/opencode/opencode-sessions.provider.js.map +1 -0
  448. package/dist-server/server/modules/providers/list/opencode/opencode-skills.provider.js +62 -0
  449. package/dist-server/server/modules/providers/list/opencode/opencode-skills.provider.js.map +1 -0
  450. package/dist-server/server/modules/providers/list/opencode/opencode.provider.js +21 -0
  451. package/dist-server/server/modules/providers/list/opencode/opencode.provider.js.map +1 -0
  452. package/dist-server/server/modules/providers/provider.registry.js +31 -0
  453. package/dist-server/server/modules/providers/provider.registry.js.map +1 -0
  454. package/dist-server/server/modules/providers/provider.routes.js +651 -0
  455. package/dist-server/server/modules/providers/provider.routes.js.map +1 -0
  456. package/dist-server/server/modules/providers/services/mcp.service.js +84 -0
  457. package/dist-server/server/modules/providers/services/mcp.service.js.map +1 -0
  458. package/dist-server/server/modules/providers/services/provider-auth.service.js +25 -0
  459. package/dist-server/server/modules/providers/services/provider-auth.service.js.map +1 -0
  460. package/dist-server/server/modules/providers/services/provider-capabilities.service.js +67 -0
  461. package/dist-server/server/modules/providers/services/provider-capabilities.service.js.map +1 -0
  462. package/dist-server/server/modules/providers/services/provider-models.service.js +289 -0
  463. package/dist-server/server/modules/providers/services/provider-models.service.js.map +1 -0
  464. package/dist-server/server/modules/providers/services/provider-runtime.service.js +66 -0
  465. package/dist-server/server/modules/providers/services/provider-runtime.service.js.map +1 -0
  466. package/dist-server/server/modules/providers/services/provider-token-usage.service.js +268 -0
  467. package/dist-server/server/modules/providers/services/provider-token-usage.service.js.map +1 -0
  468. package/dist-server/server/modules/providers/services/session-conversations-search.service.js +974 -0
  469. package/dist-server/server/modules/providers/services/session-conversations-search.service.js.map +1 -0
  470. package/dist-server/server/modules/providers/services/session-synchronizer.service.js +56 -0
  471. package/dist-server/server/modules/providers/services/session-synchronizer.service.js.map +1 -0
  472. package/dist-server/server/modules/providers/services/session-watch-scheduler.js +130 -0
  473. package/dist-server/server/modules/providers/services/session-watch-scheduler.js.map +1 -0
  474. package/dist-server/server/modules/providers/services/sessions-watcher.service.js +310 -0
  475. package/dist-server/server/modules/providers/services/sessions-watcher.service.js.map +1 -0
  476. package/dist-server/server/modules/providers/services/sessions.service.js +349 -0
  477. package/dist-server/server/modules/providers/services/sessions.service.js.map +1 -0
  478. package/dist-server/server/modules/providers/services/skills.service.js +22 -0
  479. package/dist-server/server/modules/providers/services/skills.service.js.map +1 -0
  480. package/dist-server/server/modules/providers/shared/base/abstract.provider.js +13 -0
  481. package/dist-server/server/modules/providers/shared/base/abstract.provider.js.map +1 -0
  482. package/dist-server/server/modules/providers/shared/mcp/mcp.provider.js +102 -0
  483. package/dist-server/server/modules/providers/shared/mcp/mcp.provider.js.map +1 -0
  484. package/dist-server/server/modules/providers/shared/skills/skills.provider.js +207 -0
  485. package/dist-server/server/modules/providers/shared/skills/skills.provider.js.map +1 -0
  486. package/dist-server/server/modules/providers/tests/claude-auth.test.js +122 -0
  487. package/dist-server/server/modules/providers/tests/claude-auth.test.js.map +1 -0
  488. package/dist-server/server/modules/providers/tests/claude-sessions.test.js +44 -0
  489. package/dist-server/server/modules/providers/tests/claude-sessions.test.js.map +1 -0
  490. package/dist-server/server/modules/providers/tests/codex-app-server.client.test.js +65 -0
  491. package/dist-server/server/modules/providers/tests/codex-app-server.client.test.js.map +1 -0
  492. package/dist-server/server/modules/providers/tests/codex-native-command.service.test.js +192 -0
  493. package/dist-server/server/modules/providers/tests/codex-native-command.service.test.js.map +1 -0
  494. package/dist-server/server/modules/providers/tests/codex-sdk-windows-hide-patch.test.js +26 -0
  495. package/dist-server/server/modules/providers/tests/codex-sdk-windows-hide-patch.test.js.map +1 -0
  496. package/dist-server/server/modules/providers/tests/codex-sdk-windows-hide.test.js +13 -0
  497. package/dist-server/server/modules/providers/tests/codex-sdk-windows-hide.test.js.map +1 -0
  498. package/dist-server/server/modules/providers/tests/codex-sessions.test.js +202 -0
  499. package/dist-server/server/modules/providers/tests/codex-sessions.test.js.map +1 -0
  500. package/dist-server/server/modules/providers/tests/mcp.test.js +291 -0
  501. package/dist-server/server/modules/providers/tests/mcp.test.js.map +1 -0
  502. package/dist-server/server/modules/providers/tests/opencode-models.test.js +19 -0
  503. package/dist-server/server/modules/providers/tests/opencode-models.test.js.map +1 -0
  504. package/dist-server/server/modules/providers/tests/opencode-sessions.test.js +424 -0
  505. package/dist-server/server/modules/providers/tests/opencode-sessions.test.js.map +1 -0
  506. package/dist-server/server/modules/providers/tests/provider-attachment-history.test.js +205 -0
  507. package/dist-server/server/modules/providers/tests/provider-attachment-history.test.js.map +1 -0
  508. package/dist-server/server/modules/providers/tests/provider-models.service.test.js +268 -0
  509. package/dist-server/server/modules/providers/tests/provider-models.service.test.js.map +1 -0
  510. package/dist-server/server/modules/providers/tests/provider-runtime.service.test.js +126 -0
  511. package/dist-server/server/modules/providers/tests/provider-runtime.service.test.js.map +1 -0
  512. package/dist-server/server/modules/providers/tests/provider-token-usage.service.test.js +166 -0
  513. package/dist-server/server/modules/providers/tests/provider-token-usage.service.test.js.map +1 -0
  514. package/dist-server/server/modules/providers/tests/provider.routes.test.js +161 -0
  515. package/dist-server/server/modules/providers/tests/provider.routes.test.js.map +1 -0
  516. package/dist-server/server/modules/providers/tests/session-watch-scheduler.test.js +76 -0
  517. package/dist-server/server/modules/providers/tests/session-watch-scheduler.test.js.map +1 -0
  518. package/dist-server/server/modules/providers/tests/sessions-details.test.js +62 -0
  519. package/dist-server/server/modules/providers/tests/sessions-details.test.js.map +1 -0
  520. package/dist-server/server/modules/providers/tests/sessions-watcher-filter.test.js +22 -0
  521. package/dist-server/server/modules/providers/tests/sessions-watcher-filter.test.js.map +1 -0
  522. package/dist-server/server/modules/providers/tests/sessions.service.test.js +87 -0
  523. package/dist-server/server/modules/providers/tests/sessions.service.test.js.map +1 -0
  524. package/dist-server/server/modules/providers/tests/skills.test.js +398 -0
  525. package/dist-server/server/modules/providers/tests/skills.test.js.map +1 -0
  526. package/dist-server/server/modules/settings/index.js +3 -0
  527. package/dist-server/server/modules/settings/index.js.map +1 -0
  528. package/dist-server/server/modules/settings/settings.module.js +35 -0
  529. package/dist-server/server/modules/settings/settings.module.js.map +1 -0
  530. package/dist-server/server/modules/settings/settings.routes.js +34 -0
  531. package/dist-server/server/modules/settings/settings.routes.js.map +1 -0
  532. package/dist-server/server/modules/settings/settings.service.js +116 -0
  533. package/dist-server/server/modules/settings/settings.service.js.map +1 -0
  534. package/dist-server/server/modules/settings/tests/settings.service.test.js +48 -0
  535. package/dist-server/server/modules/settings/tests/settings.service.test.js.map +1 -0
  536. package/dist-server/server/modules/system/index.js +3 -0
  537. package/dist-server/server/modules/system/index.js.map +1 -0
  538. package/dist-server/server/modules/system/system.module.js +44 -0
  539. package/dist-server/server/modules/system/system.module.js.map +1 -0
  540. package/dist-server/server/modules/system/system.routes.js +16 -0
  541. package/dist-server/server/modules/system/system.routes.js.map +1 -0
  542. package/dist-server/server/modules/system/system.service.js +45 -0
  543. package/dist-server/server/modules/system/system.service.js.map +1 -0
  544. package/dist-server/server/modules/system/tests/system.service.test.js +100 -0
  545. package/dist-server/server/modules/system/tests/system.service.test.js.map +1 -0
  546. package/dist-server/server/modules/taskmaster/index.js +3 -0
  547. package/dist-server/server/modules/taskmaster/index.js.map +1 -0
  548. package/dist-server/server/modules/taskmaster/taskmaster.module.js +20 -0
  549. package/dist-server/server/modules/taskmaster/taskmaster.module.js.map +1 -0
  550. package/dist-server/server/modules/taskmaster/taskmaster.routes.js +1372 -0
  551. package/dist-server/server/modules/taskmaster/taskmaster.routes.js.map +1 -0
  552. package/dist-server/server/modules/taskmaster/taskmaster.service.js +107 -0
  553. package/dist-server/server/modules/taskmaster/taskmaster.service.js.map +1 -0
  554. package/dist-server/server/modules/taskmaster/tests/taskmaster.routes.test.js +132 -0
  555. package/dist-server/server/modules/taskmaster/tests/taskmaster.routes.test.js.map +1 -0
  556. package/dist-server/server/modules/taskmaster/tests/taskmaster.service.test.js +85 -0
  557. package/dist-server/server/modules/taskmaster/tests/taskmaster.service.test.js.map +1 -0
  558. package/dist-server/server/modules/user/index.js +3 -0
  559. package/dist-server/server/modules/user/index.js.map +1 -0
  560. package/dist-server/server/modules/user/tests/user.service.test.js +53 -0
  561. package/dist-server/server/modules/user/tests/user.service.test.js.map +1 -0
  562. package/dist-server/server/modules/user/user.module.js +47 -0
  563. package/dist-server/server/modules/user/user.module.js.map +1 -0
  564. package/dist-server/server/modules/user/user.routes.js +44 -0
  565. package/dist-server/server/modules/user/user.routes.js.map +1 -0
  566. package/dist-server/server/modules/user/user.service.js +59 -0
  567. package/dist-server/server/modules/user/user.service.js.map +1 -0
  568. package/dist-server/server/modules/voice/index.js +3 -0
  569. package/dist-server/server/modules/voice/index.js.map +1 -0
  570. package/dist-server/server/modules/voice/tests/voice.service.test.js +86 -0
  571. package/dist-server/server/modules/voice/tests/voice.service.test.js.map +1 -0
  572. package/dist-server/server/modules/voice/voice.module.js +44 -0
  573. package/dist-server/server/modules/voice/voice.module.js.map +1 -0
  574. package/dist-server/server/modules/voice/voice.routes.js +87 -0
  575. package/dist-server/server/modules/voice/voice.routes.js.map +1 -0
  576. package/dist-server/server/modules/voice/voice.service.js +148 -0
  577. package/dist-server/server/modules/voice/voice.service.js.map +1 -0
  578. package/dist-server/server/modules/websocket/index.js +4 -0
  579. package/dist-server/server/modules/websocket/index.js.map +1 -0
  580. package/dist-server/server/modules/websocket/services/chat-run-registry.service.js +266 -0
  581. package/dist-server/server/modules/websocket/services/chat-run-registry.service.js.map +1 -0
  582. package/dist-server/server/modules/websocket/services/chat-session-writer.service.js +105 -0
  583. package/dist-server/server/modules/websocket/services/chat-session-writer.service.js.map +1 -0
  584. package/dist-server/server/modules/websocket/services/chat-websocket.service.js +310 -0
  585. package/dist-server/server/modules/websocket/services/chat-websocket.service.js.map +1 -0
  586. package/dist-server/server/modules/websocket/services/plugin-websocket-proxy.service.js +52 -0
  587. package/dist-server/server/modules/websocket/services/plugin-websocket-proxy.service.js.map +1 -0
  588. package/dist-server/server/modules/websocket/services/shell-websocket.service.js +570 -0
  589. package/dist-server/server/modules/websocket/services/shell-websocket.service.js.map +1 -0
  590. package/dist-server/server/modules/websocket/services/terminal-replay-store.js +161 -0
  591. package/dist-server/server/modules/websocket/services/terminal-replay-store.js.map +1 -0
  592. package/dist-server/server/modules/websocket/services/websocket-auth.service.js +36 -0
  593. package/dist-server/server/modules/websocket/services/websocket-auth.service.js.map +1 -0
  594. package/dist-server/server/modules/websocket/services/websocket-server.service.js +91 -0
  595. package/dist-server/server/modules/websocket/services/websocket-server.service.js.map +1 -0
  596. package/dist-server/server/modules/websocket/services/websocket-state.service.js +14 -0
  597. package/dist-server/server/modules/websocket/services/websocket-state.service.js.map +1 -0
  598. package/dist-server/server/modules/websocket/services/websocket-writer.service.js +32 -0
  599. package/dist-server/server/modules/websocket/services/websocket-writer.service.js.map +1 -0
  600. package/dist-server/server/modules/websocket/tests/chat-attachment-filter.test.js +40 -0
  601. package/dist-server/server/modules/websocket/tests/chat-attachment-filter.test.js.map +1 -0
  602. package/dist-server/server/modules/websocket/tests/chat-run-registry.test.js +249 -0
  603. package/dist-server/server/modules/websocket/tests/chat-run-registry.test.js.map +1 -0
  604. package/dist-server/server/modules/websocket/tests/shell-websocket.service.test.js +346 -0
  605. package/dist-server/server/modules/websocket/tests/shell-websocket.service.test.js.map +1 -0
  606. package/dist-server/server/modules/websocket/tests/terminal-replay-store.test.js +65 -0
  607. package/dist-server/server/modules/websocket/tests/terminal-replay-store.test.js.map +1 -0
  608. package/dist-server/server/modules/websocket/tests/websocket-heartbeat.service.test.js +61 -0
  609. package/dist-server/server/modules/websocket/tests/websocket-heartbeat.service.test.js.map +1 -0
  610. package/dist-server/server/modules/worktrees/index.js +3 -0
  611. package/dist-server/server/modules/worktrees/index.js.map +1 -0
  612. package/dist-server/server/modules/worktrees/services/worktree-create-and-open.service.js +37 -0
  613. package/dist-server/server/modules/worktrees/services/worktree-create-and-open.service.js.map +1 -0
  614. package/dist-server/server/modules/worktrees/services/worktree-create.service.js +67 -0
  615. package/dist-server/server/modules/worktrees/services/worktree-create.service.js.map +1 -0
  616. package/dist-server/server/modules/worktrees/services/worktree-git.service.js +172 -0
  617. package/dist-server/server/modules/worktrees/services/worktree-git.service.js.map +1 -0
  618. package/dist-server/server/modules/worktrees/services/worktree-list.service.js +91 -0
  619. package/dist-server/server/modules/worktrees/services/worktree-list.service.js.map +1 -0
  620. package/dist-server/server/modules/worktrees/services/worktree-merge.service.js +118 -0
  621. package/dist-server/server/modules/worktrees/services/worktree-merge.service.js.map +1 -0
  622. package/dist-server/server/modules/worktrees/services/worktree-open.service.js +58 -0
  623. package/dist-server/server/modules/worktrees/services/worktree-open.service.js.map +1 -0
  624. package/dist-server/server/modules/worktrees/services/worktree-remove.service.js +65 -0
  625. package/dist-server/server/modules/worktrees/services/worktree-remove.service.js.map +1 -0
  626. package/dist-server/server/modules/worktrees/tests/worktree-create-and-open.service.test.js +58 -0
  627. package/dist-server/server/modules/worktrees/tests/worktree-create-and-open.service.test.js.map +1 -0
  628. package/dist-server/server/modules/worktrees/tests/worktree-create.service.test.js +85 -0
  629. package/dist-server/server/modules/worktrees/tests/worktree-create.service.test.js.map +1 -0
  630. package/dist-server/server/modules/worktrees/tests/worktree-git.service.test.js +58 -0
  631. package/dist-server/server/modules/worktrees/tests/worktree-git.service.test.js.map +1 -0
  632. package/dist-server/server/modules/worktrees/tests/worktree-list.service.test.js +34 -0
  633. package/dist-server/server/modules/worktrees/tests/worktree-list.service.test.js.map +1 -0
  634. package/dist-server/server/modules/worktrees/tests/worktree-merge.service.test.js +137 -0
  635. package/dist-server/server/modules/worktrees/tests/worktree-merge.service.test.js.map +1 -0
  636. package/dist-server/server/modules/worktrees/tests/worktree-open.service.test.js +99 -0
  637. package/dist-server/server/modules/worktrees/tests/worktree-open.service.test.js.map +1 -0
  638. package/dist-server/server/modules/worktrees/tests/worktree-remove.service.test.js +157 -0
  639. package/dist-server/server/modules/worktrees/tests/worktree-remove.service.test.js.map +1 -0
  640. package/dist-server/server/modules/worktrees/tests/worktrees.routes.test.js +167 -0
  641. package/dist-server/server/modules/worktrees/tests/worktrees.routes.test.js.map +1 -0
  642. package/dist-server/server/modules/worktrees/worktrees.module.js +97 -0
  643. package/dist-server/server/modules/worktrees/worktrees.module.js.map +1 -0
  644. package/dist-server/server/modules/worktrees/worktrees.routes.js +84 -0
  645. package/dist-server/server/modules/worktrees/worktrees.routes.js.map +1 -0
  646. package/dist-server/server/shared/claude-cli-path.js +103 -0
  647. package/dist-server/server/shared/claude-cli-path.js.map +1 -0
  648. package/dist-server/server/shared/frontmatter.js +16 -0
  649. package/dist-server/server/shared/frontmatter.js.map +1 -0
  650. package/dist-server/server/shared/image-attachments.js +343 -0
  651. package/dist-server/server/shared/image-attachments.js.map +1 -0
  652. package/dist-server/server/shared/interfaces.js +2 -0
  653. package/dist-server/server/shared/interfaces.js.map +1 -0
  654. package/dist-server/server/shared/tests/claude-cli-path.test.js +45 -0
  655. package/dist-server/server/shared/tests/claude-cli-path.test.js.map +1 -0
  656. package/dist-server/server/shared/tests/image-attachments.test.js +262 -0
  657. package/dist-server/server/shared/tests/image-attachments.test.js.map +1 -0
  658. package/dist-server/server/shared/tests/slice-tail-page.test.js +35 -0
  659. package/dist-server/server/shared/tests/slice-tail-page.test.js.map +1 -0
  660. package/dist-server/server/shared/types.js +2 -0
  661. package/dist-server/server/shared/types.js.map +1 -0
  662. package/dist-server/server/shared/utils.js +966 -0
  663. package/dist-server/server/shared/utils.js.map +1 -0
  664. package/dist-server/shared/networkHosts.js +20 -0
  665. package/dist-server/shared/networkHosts.js.map +1 -0
  666. package/electron/assets/logo-macos.icns +0 -0
  667. package/electron/assets/logo-macos.png +0 -0
  668. package/electron/assets/logo-windows.ico +0 -0
  669. package/electron/cloud.js +260 -0
  670. package/electron/desktopNotifications.js +378 -0
  671. package/electron/desktopWindow.js +766 -0
  672. package/electron/launcher/index.html +14 -0
  673. package/electron/launcher/launcher.css +801 -0
  674. package/electron/launcher/launcher.js +687 -0
  675. package/electron/localServer.js +549 -0
  676. package/electron/main.js +944 -0
  677. package/electron/preload.cjs +60 -0
  678. package/electron/scripts/generate-macos-icon.js +62 -0
  679. package/electron/serverInstaller.js +277 -0
  680. package/electron/tabs.js +87 -0
  681. package/electron/viewHost.js +331 -0
  682. package/package.json +259 -0
  683. package/public/api-docs.html +901 -0
  684. package/scripts/fix-codex-sdk-windows-hide.js +66 -0
  685. package/scripts/fix-node-pty.js +67 -0
  686. package/scripts/promote-dist-server.mjs +50 -0
  687. package/scripts/release/build-server-bundle.js +176 -0
  688. package/scripts/release/prepare-desktop-app.js +152 -0
  689. package/server/index.ts +400 -0
  690. package/server/load-env.ts +47 -0
  691. package/server/modules/agent/agent.module.ts +52 -0
  692. package/server/modules/agent/agent.routes.ts +1287 -0
  693. package/server/modules/agent/index.ts +2 -0
  694. package/server/modules/agent/tests/agent.routes.test.ts +205 -0
  695. package/server/modules/assets/assets.routes.ts +150 -0
  696. package/server/modules/assets/index.ts +3 -0
  697. package/server/modules/assets/services/image-assets.service.ts +127 -0
  698. package/server/modules/assets/tests/image-assets.service.test.ts +74 -0
  699. package/server/modules/auth/auth.middleware.ts +163 -0
  700. package/server/modules/auth/auth.module.ts +38 -0
  701. package/server/modules/auth/auth.routes.ts +57 -0
  702. package/server/modules/auth/auth.service.ts +155 -0
  703. package/server/modules/auth/index.ts +9 -0
  704. package/server/modules/auth/tests/auth.service.test.ts +95 -0
  705. package/server/modules/browser-use/browser-use-mcp.routes.ts +120 -0
  706. package/server/modules/browser-use/browser-use-mcp.ts +386 -0
  707. package/server/modules/browser-use/browser-use-runtime.ts +10 -0
  708. package/server/modules/browser-use/browser-use.routes.ts +96 -0
  709. package/server/modules/browser-use/browser-use.service.ts +836 -0
  710. package/server/modules/browser-use/index.ts +11 -0
  711. package/server/modules/browser-use/tests/browser-use.service.test.ts +10 -0
  712. package/server/modules/cli/cli.module.ts +95 -0
  713. package/server/modules/cli/cli.service.ts +260 -0
  714. package/server/modules/cli/cli.ts +19 -0
  715. package/server/modules/cli/index.ts +2 -0
  716. package/server/modules/cli/sandbox.service.ts +413 -0
  717. package/server/modules/cli/tests/cli-environment-bootstrap.test.ts +186 -0
  718. package/server/modules/cli/tests/cli.service.test.ts +98 -0
  719. package/server/modules/cli/tests/sandbox.service.test.ts +64 -0
  720. package/server/modules/commands/commands.module.ts +22 -0
  721. package/server/modules/commands/commands.routes.ts +655 -0
  722. package/server/modules/commands/index.ts +2 -0
  723. package/server/modules/commands/tests/commands.test.ts +171 -0
  724. package/server/modules/database/connection.ts +143 -0
  725. package/server/modules/database/index.ts +17 -0
  726. package/server/modules/database/init-db.ts +17 -0
  727. package/server/modules/database/migrations.ts +515 -0
  728. package/server/modules/database/repositories/api-keys.ts +119 -0
  729. package/server/modules/database/repositories/app-config.ts +53 -0
  730. package/server/modules/database/repositories/credentials.ts +106 -0
  731. package/server/modules/database/repositories/github-tokens.ts +100 -0
  732. package/server/modules/database/repositories/notification-channel-endpoints.ts +153 -0
  733. package/server/modules/database/repositories/notification-preferences.ts +117 -0
  734. package/server/modules/database/repositories/projects.db.ts +196 -0
  735. package/server/modules/database/repositories/provider-models.ts +168 -0
  736. package/server/modules/database/repositories/push-subscriptions.ts +80 -0
  737. package/server/modules/database/repositories/scan-state.db.ts +42 -0
  738. package/server/modules/database/repositories/sessions.db.ts +524 -0
  739. package/server/modules/database/repositories/users.ts +140 -0
  740. package/server/modules/database/repositories/vapid-keys.ts +57 -0
  741. package/server/modules/database/schema.ts +210 -0
  742. package/server/modules/database/tests/projects.db.integration.test.ts +72 -0
  743. package/server/modules/database/tests/provider-models.db.integration.test.ts +125 -0
  744. package/server/modules/database/tests/sessions-provider-mapping.test.ts +109 -0
  745. package/server/modules/database/tests/sessions.db.integration.test.ts +116 -0
  746. package/server/modules/file-tree/file-tree.module.ts +116 -0
  747. package/server/modules/file-tree/file-tree.routes.ts +258 -0
  748. package/server/modules/file-tree/file-tree.service.ts +675 -0
  749. package/server/modules/file-tree/index.ts +2 -0
  750. package/server/modules/file-tree/tests/file-tree.routes.test.ts +157 -0
  751. package/server/modules/file-tree/tests/file-tree.service.test.ts +371 -0
  752. package/server/modules/git/git-branch.service.ts +43 -0
  753. package/server/modules/git/git-parsing.service.ts +66 -0
  754. package/server/modules/git/git.module.ts +22 -0
  755. package/server/modules/git/git.routes.ts +1601 -0
  756. package/server/modules/git/index.ts +2 -0
  757. package/server/modules/git/tests/git-branch.service.test.ts +60 -0
  758. package/server/modules/git/tests/git-init.routes.test.ts +179 -0
  759. package/server/modules/git/tests/git.test.ts +106 -0
  760. package/server/modules/notifications/index.ts +24 -0
  761. package/server/modules/notifications/notifications.routes.ts +127 -0
  762. package/server/modules/notifications/services/desktop-notification-clients.service.ts +124 -0
  763. package/server/modules/notifications/services/notification-orchestrator.service.js +310 -0
  764. package/server/modules/notifications/tests/notification-orchestrator.integration.test.ts +55 -0
  765. package/server/modules/notifications/vapid-keys.service.ts +38 -0
  766. package/server/modules/notifications/websocket/desktop-notifications-websocket.service.ts +109 -0
  767. package/server/modules/plugins/index.ts +9 -0
  768. package/server/modules/plugins/plugin-process.service.ts +217 -0
  769. package/server/modules/plugins/plugin-registry.service.ts +459 -0
  770. package/server/modules/plugins/plugins.module.ts +33 -0
  771. package/server/modules/plugins/plugins.routes.ts +66 -0
  772. package/server/modules/plugins/plugins.service.ts +147 -0
  773. package/server/modules/plugins/tests/plugins.service.test.ts +32 -0
  774. package/server/modules/projects/index.ts +11 -0
  775. package/server/modules/projects/projects.routes.ts +273 -0
  776. package/server/modules/projects/services/project-clone.service.ts +323 -0
  777. package/server/modules/projects/services/project-delete.service.ts +90 -0
  778. package/server/modules/projects/services/project-management.service.ts +144 -0
  779. package/server/modules/projects/services/project-star.service.ts +78 -0
  780. package/server/modules/projects/services/projects-has-taskmaster.service.ts +248 -0
  781. package/server/modules/projects/services/projects-with-sessions-fetch.service.ts +314 -0
  782. package/server/modules/projects/tests/project-clone.service.test.ts +183 -0
  783. package/server/modules/projects/tests/project-management.service.test.ts +117 -0
  784. package/server/modules/projects/tests/project-star.service.test.ts +123 -0
  785. package/server/modules/projects/tests/projects-has-taskmaster.service.test.ts +105 -0
  786. package/server/modules/providers/README.md +380 -0
  787. package/server/modules/providers/index.ts +10 -0
  788. package/server/modules/providers/list/claude/claude-auth.provider.ts +160 -0
  789. package/server/modules/providers/list/claude/claude-mcp.provider.ts +135 -0
  790. package/server/modules/providers/list/claude/claude-models.provider.ts +294 -0
  791. package/server/modules/providers/list/claude/claude-runtime.provider.js +1068 -0
  792. package/server/modules/providers/list/claude/claude-session-synchronizer.provider.ts +203 -0
  793. package/server/modules/providers/list/claude/claude-sessions.provider.ts +684 -0
  794. package/server/modules/providers/list/claude/claude-skills.provider.ts +265 -0
  795. package/server/modules/providers/list/claude/claude.provider.ts +30 -0
  796. package/server/modules/providers/list/codex/codex-app-server.client.ts +226 -0
  797. package/server/modules/providers/list/codex/codex-auth.provider.ts +100 -0
  798. package/server/modules/providers/list/codex/codex-mcp.provider.ts +135 -0
  799. package/server/modules/providers/list/codex/codex-models.provider.ts +123 -0
  800. package/server/modules/providers/list/codex/codex-native-command.service.ts +31 -0
  801. package/server/modules/providers/list/codex/codex-native-runtime.provider.ts +577 -0
  802. package/server/modules/providers/list/codex/codex-runtime.provider.js +533 -0
  803. package/server/modules/providers/list/codex/codex-session-synchronizer.provider.ts +203 -0
  804. package/server/modules/providers/list/codex/codex-sessions.provider.ts +938 -0
  805. package/server/modules/providers/list/codex/codex-skills.provider.ts +73 -0
  806. package/server/modules/providers/list/codex/codex.provider.ts +30 -0
  807. package/server/modules/providers/list/cursor/cursor-auth.provider.ts +143 -0
  808. package/server/modules/providers/list/cursor/cursor-mcp.provider.ts +108 -0
  809. package/server/modules/providers/list/cursor/cursor-models.provider.ts +119 -0
  810. package/server/modules/providers/list/cursor/cursor-runtime.provider.js +385 -0
  811. package/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.ts +159 -0
  812. package/server/modules/providers/list/cursor/cursor-sessions.provider.ts +654 -0
  813. package/server/modules/providers/list/cursor/cursor-skills.provider.ts +39 -0
  814. package/server/modules/providers/list/cursor/cursor.provider.ts +30 -0
  815. package/server/modules/providers/list/opencode/opencode-auth.provider.ts +110 -0
  816. package/server/modules/providers/list/opencode/opencode-mcp.provider.ts +228 -0
  817. package/server/modules/providers/list/opencode/opencode-models.provider.ts +203 -0
  818. package/server/modules/providers/list/opencode/opencode-runtime.provider.js +434 -0
  819. package/server/modules/providers/list/opencode/opencode-runtime.provider.test.js +261 -0
  820. package/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.ts +179 -0
  821. package/server/modules/providers/list/opencode/opencode-sessions.provider.ts +500 -0
  822. package/server/modules/providers/list/opencode/opencode-skills.provider.ts +78 -0
  823. package/server/modules/providers/list/opencode/opencode.provider.ts +30 -0
  824. package/server/modules/providers/provider.registry.ts +36 -0
  825. package/server/modules/providers/provider.routes.ts +877 -0
  826. package/server/modules/providers/services/mcp.service.ts +109 -0
  827. package/server/modules/providers/services/provider-auth.service.ts +26 -0
  828. package/server/modules/providers/services/provider-capabilities.service.ts +97 -0
  829. package/server/modules/providers/services/provider-models.service.ts +401 -0
  830. package/server/modules/providers/services/provider-runtime.service.ts +108 -0
  831. package/server/modules/providers/services/provider-token-usage.service.ts +357 -0
  832. package/server/modules/providers/services/session-conversations-search.service.ts +1321 -0
  833. package/server/modules/providers/services/session-synchronizer.service.ts +74 -0
  834. package/server/modules/providers/services/session-watch-scheduler.ts +183 -0
  835. package/server/modules/providers/services/sessions-watcher.service.ts +377 -0
  836. package/server/modules/providers/services/sessions.service.ts +471 -0
  837. package/server/modules/providers/services/skills.service.ts +39 -0
  838. package/server/modules/providers/shared/base/abstract.provider.ts +32 -0
  839. package/server/modules/providers/shared/mcp/mcp.provider.ts +151 -0
  840. package/server/modules/providers/shared/skills/skills.provider.ts +287 -0
  841. package/server/modules/providers/tests/claude-auth.test.ts +150 -0
  842. package/server/modules/providers/tests/claude-sessions.test.ts +61 -0
  843. package/server/modules/providers/tests/codex-app-server.client.test.ts +74 -0
  844. package/server/modules/providers/tests/codex-native-command.service.test.ts +223 -0
  845. package/server/modules/providers/tests/codex-sdk-windows-hide-patch.test.ts +33 -0
  846. package/server/modules/providers/tests/codex-sdk-windows-hide.test.ts +20 -0
  847. package/server/modules/providers/tests/codex-sessions.test.ts +231 -0
  848. package/server/modules/providers/tests/mcp.test.ts +349 -0
  849. package/server/modules/providers/tests/opencode-models.test.ts +41 -0
  850. package/server/modules/providers/tests/opencode-sessions.test.ts +522 -0
  851. package/server/modules/providers/tests/provider-attachment-history.test.ts +247 -0
  852. package/server/modules/providers/tests/provider-models.service.test.ts +353 -0
  853. package/server/modules/providers/tests/provider-runtime.service.test.ts +138 -0
  854. package/server/modules/providers/tests/provider-token-usage.service.test.ts +186 -0
  855. package/server/modules/providers/tests/provider.routes.test.ts +244 -0
  856. package/server/modules/providers/tests/session-watch-scheduler.test.ts +87 -0
  857. package/server/modules/providers/tests/sessions-details.test.ts +73 -0
  858. package/server/modules/providers/tests/sessions-watcher-filter.test.ts +27 -0
  859. package/server/modules/providers/tests/sessions.service.test.ts +127 -0
  860. package/server/modules/providers/tests/skills.test.ts +692 -0
  861. package/server/modules/settings/index.ts +2 -0
  862. package/server/modules/settings/settings.module.ts +50 -0
  863. package/server/modules/settings/settings.routes.ts +51 -0
  864. package/server/modules/settings/settings.service.ts +186 -0
  865. package/server/modules/settings/tests/settings.service.test.ts +54 -0
  866. package/server/modules/system/index.ts +2 -0
  867. package/server/modules/system/system.module.ts +62 -0
  868. package/server/modules/system/system.routes.ts +21 -0
  869. package/server/modules/system/system.service.ts +76 -0
  870. package/server/modules/system/tests/system.service.test.ts +118 -0
  871. package/server/modules/taskmaster/index.ts +2 -0
  872. package/server/modules/taskmaster/taskmaster.module.ts +24 -0
  873. package/server/modules/taskmaster/taskmaster.routes.ts +1482 -0
  874. package/server/modules/taskmaster/taskmaster.service.ts +132 -0
  875. package/server/modules/taskmaster/tests/taskmaster.routes.test.ts +144 -0
  876. package/server/modules/taskmaster/tests/taskmaster.service.test.ts +97 -0
  877. package/server/modules/user/index.ts +2 -0
  878. package/server/modules/user/tests/user.service.test.ts +61 -0
  879. package/server/modules/user/user.module.ts +58 -0
  880. package/server/modules/user/user.routes.ts +50 -0
  881. package/server/modules/user/user.service.ts +85 -0
  882. package/server/modules/voice/index.ts +2 -0
  883. package/server/modules/voice/tests/voice.service.test.ts +98 -0
  884. package/server/modules/voice/voice.module.ts +47 -0
  885. package/server/modules/voice/voice.routes.ts +113 -0
  886. package/server/modules/voice/voice.service.ts +192 -0
  887. package/server/modules/websocket/README.md +273 -0
  888. package/server/modules/websocket/index.ts +3 -0
  889. package/server/modules/websocket/services/chat-run-registry.service.ts +343 -0
  890. package/server/modules/websocket/services/chat-session-writer.service.ts +145 -0
  891. package/server/modules/websocket/services/chat-websocket.service.ts +425 -0
  892. package/server/modules/websocket/services/plugin-websocket-proxy.service.ts +65 -0
  893. package/server/modules/websocket/services/shell-websocket.service.ts +776 -0
  894. package/server/modules/websocket/services/terminal-replay-store.ts +218 -0
  895. package/server/modules/websocket/services/websocket-auth.service.ts +59 -0
  896. package/server/modules/websocket/services/websocket-server.service.ts +127 -0
  897. package/server/modules/websocket/services/websocket-state.service.ts +16 -0
  898. package/server/modules/websocket/services/websocket-writer.service.ts +38 -0
  899. package/server/modules/websocket/tests/chat-attachment-filter.test.ts +59 -0
  900. package/server/modules/websocket/tests/chat-run-registry.test.ts +282 -0
  901. package/server/modules/websocket/tests/shell-websocket.service.test.ts +432 -0
  902. package/server/modules/websocket/tests/terminal-replay-store.test.ts +79 -0
  903. package/server/modules/websocket/tests/websocket-heartbeat.service.test.ts +78 -0
  904. package/server/modules/worktrees/index.ts +2 -0
  905. package/server/modules/worktrees/services/worktree-create-and-open.service.ts +53 -0
  906. package/server/modules/worktrees/services/worktree-create.service.ts +104 -0
  907. package/server/modules/worktrees/services/worktree-git.service.ts +207 -0
  908. package/server/modules/worktrees/services/worktree-list.service.ts +143 -0
  909. package/server/modules/worktrees/services/worktree-merge.service.ts +157 -0
  910. package/server/modules/worktrees/services/worktree-open.service.ts +85 -0
  911. package/server/modules/worktrees/services/worktree-remove.service.ts +88 -0
  912. package/server/modules/worktrees/tests/worktree-create-and-open.service.test.ts +68 -0
  913. package/server/modules/worktrees/tests/worktree-create.service.test.ts +142 -0
  914. package/server/modules/worktrees/tests/worktree-git.service.test.ts +84 -0
  915. package/server/modules/worktrees/tests/worktree-list.service.test.ts +45 -0
  916. package/server/modules/worktrees/tests/worktree-merge.service.test.ts +213 -0
  917. package/server/modules/worktrees/tests/worktree-open.service.test.ts +122 -0
  918. package/server/modules/worktrees/tests/worktree-remove.service.test.ts +227 -0
  919. package/server/modules/worktrees/tests/worktrees.routes.test.ts +199 -0
  920. package/server/modules/worktrees/worktrees.module.ts +113 -0
  921. package/server/modules/worktrees/worktrees.routes.ts +116 -0
  922. package/server/shared/claude-cli-path.ts +139 -0
  923. package/server/shared/frontmatter.ts +18 -0
  924. package/server/shared/image-attachments.ts +435 -0
  925. package/server/shared/interfaces.ts +179 -0
  926. package/server/shared/tests/claude-cli-path.test.ts +61 -0
  927. package/server/shared/tests/image-attachments.test.ts +353 -0
  928. package/server/shared/tests/slice-tail-page.test.ts +42 -0
  929. package/server/shared/types.ts +1268 -0
  930. package/server/shared/utils.ts +1161 -0
  931. package/server/tsconfig.json +40 -0
  932. package/shared/networkHosts.js +22 -0
@@ -0,0 +1,29 @@
1
+ import{c as fe,b as Z,j as e,Y as Fe,G as he,Q as pe,Z as Ae,T as oe,$ as ft,R as V,a0 as P,I as xe,w as Xe,X as we,a1 as pt,A as gt,a2 as Ye,a3 as Le,D as Ze,a4 as Pe,t as bt,L as yt,F as jt,i as Nt}from"./index-DFnVoqpx.js";import{r as n}from"./vendor-react-whEHfigN.js";/**
2
+ * @license lucide-react v0.515.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const wt=[["path",{d:"m16 3 4 4-4 4",key:"1x1c3m"}],["path",{d:"M20 7H4",key:"zbl0bi"}],["path",{d:"m8 21-4-4 4-4",key:"h9nckh"}],["path",{d:"M4 17h16",key:"g4d7ey"}]],vt=fe("arrow-right-left",wt);/**
7
+ * @license lucide-react v0.515.0 - ISC
8
+ *
9
+ * This source code is licensed under the ISC license.
10
+ * See the LICENSE file in the root directory of this source tree.
11
+ */const Ct=[["circle",{cx:"12",cy:"18",r:"3",key:"1mpf1b"}],["circle",{cx:"6",cy:"6",r:"3",key:"1lh9wr"}],["circle",{cx:"18",cy:"6",r:"3",key:"1h7g24"}],["path",{d:"M18 9v2c0 .6-.4 1-1 1H7c-.6 0-1-.4-1-1V9",key:"1uq4wg"}],["path",{d:"M12 12v3",key:"158kv8"}]],ve=fe("git-fork",Ct);/**
12
+ * @license lucide-react v0.515.0 - ISC
13
+ *
14
+ * This source code is licensed under the ISC license.
15
+ * See the LICENSE file in the root directory of this source tree.
16
+ */const kt=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}],["path",{d:"M12 7v5l4 2",key:"1fdv2h"}]],et=fe("history",kt);/**
17
+ * @license lucide-react v0.515.0 - ISC
18
+ *
19
+ * This source code is licensed under the ISC license.
20
+ * See the LICENSE file in the root directory of this source tree.
21
+ */const St=[["path",{d:"M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8",key:"5wwlr5"}],["path",{d:"M3 10a2 2 0 0 1 .709-1.528l7-5.999a2 2 0 0 1 2.582 0l7 5.999A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z",key:"1d0kgt"}]],$t=fe("house",St);/**
22
+ * @license lucide-react v0.515.0 - ISC
23
+ *
24
+ * This source code is licensed under the ISC license.
25
+ * See the LICENSE file in the root directory of this source tree.
26
+ */const Et=[["path",{d:"M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z",key:"vktsd0"}],["circle",{cx:"7.5",cy:"7.5",r:".5",fill:"currentColor",key:"kqv944"}]],It=fe("tag",Et),Tt="main",Ft=50,tt=[{key:"modified",status:"M"},{key:"added",status:"A"},{key:"deleted",status:"D"},{key:"untracked",status:"U"}],Lt={M:"Modified",A:"Added",D:"Deleted",U:"Untracked"},Me={M:"bg-yellow-100 text-yellow-700 dark:bg-yellow-900/40 dark:text-yellow-300 border-yellow-200 dark:border-yellow-800/50",A:"bg-green-100 text-green-700 dark:bg-green-900/40 dark:text-green-300 border-green-200 dark:border-green-800/50",D:"bg-red-100 text-red-700 dark:bg-red-900/40 dark:text-red-300 border-red-200 dark:border-red-800/50",U:"bg-muted text-muted-foreground border-border"},Rt={discard:"Discard Changes",delete:"Delete File",commit:"Confirm Action",pull:"Confirm Pull",push:"Confirm Push",publish:"Publish Branch",revertLocalCommit:"Revert Local Commit",deleteBranch:"Delete Branch"},At={discard:"Discard",delete:"Delete",commit:"Confirm",pull:"Pull",push:"Push",publish:"Publish",revertLocalCommit:"Revert Commit",deleteBranch:"Delete"},Dt={discard:"bg-red-600 hover:bg-red-700",delete:"bg-red-600 hover:bg-red-700",commit:"bg-primary hover:bg-primary/90",pull:"bg-green-600 hover:bg-green-700",push:"bg-orange-600 hover:bg-orange-700",publish:"bg-purple-600 hover:bg-purple-700",revertLocalCommit:"bg-yellow-600 hover:bg-yellow-700",deleteBranch:"bg-red-600 hover:bg-red-700"},Ot={discard:"bg-red-100 dark:bg-red-900/30",delete:"bg-red-100 dark:bg-red-900/30",commit:"bg-yellow-100 dark:bg-yellow-900/30",pull:"bg-yellow-100 dark:bg-yellow-900/30",push:"bg-yellow-100 dark:bg-yellow-900/30",publish:"bg-yellow-100 dark:bg-yellow-900/30",revertLocalCommit:"bg-yellow-100 dark:bg-yellow-900/30",deleteBranch:"bg-red-100 dark:bg-red-900/30"};function De(t){return t?tt.flatMap(({key:r})=>t[r]||[]):[]}function rt(t){return De(t).length}function We(t){return rt(t)>0}function Bt(t){return Lt[t]||t}function Oe(t){return Me[t]||Me.U}function Mt(t){const r=[],s=t.split(/^diff --git /m).slice(1);for(const a of s){const o=a.split(`
27
+ `),i=(o[0]??"").match(/^a\/(.+?) b\/(.+)/);if(!i)continue;const g=i[1],h=i[2];let m="M";const f=o.slice(0,6).join(`
28
+ `);f.includes("new file mode")?m="A":f.includes("deleted file mode")&&(m="D");const v=m==="D"?g:h;let y=0,p=0;for(const x of o)x.startsWith("+++")||x.startsWith("---")||(x.startsWith("+")?y++:x.startsWith("-")&&p++);const j=v.lastIndexOf("/"),u=j>=0?v.substring(0,j+1):"",N=j>=0?v.substring(j+1):v;r.push({path:v,directory:u,filename:N,status:m,insertions:y,deletions:p})}return{files:r,totalFiles:r.length,totalInsertions:r.reduce((a,o)=>a+o.insertions,0),totalDeletions:r.reduce((a,o)=>a+o.deletions,0)}}function Wt(){const[t,r]=n.useState(()=>localStorage.getItem("selected-provider")||"claude");return n.useEffect(()=>{const s=()=>{const a=localStorage.getItem("selected-provider")||"claude";r(a)};return window.addEventListener("storage",s),()=>window.removeEventListener("storage",s)},[]),t}const M=Z;function _e(t){return t instanceof DOMException&&t.name==="AbortError"}async function O(t,r){if(r?.aborted)throw new DOMException("Request aborted","AbortError");const s=await t.json();if(r?.aborted)throw new DOMException("Request aborted","AbortError");return s}function _t({selectedProject:t,activeView:r,onFileOpen:s}){const[a,o]=n.useState(null),[d,i]=n.useState({}),[g,h]=n.useState(!1),[m,f]=n.useState(""),[v,y]=n.useState([]),[p,j]=n.useState([]),[u,N]=n.useState(!1),[x,T]=n.useState(!1),[I,B]=n.useState({}),[W,w]=n.useState(null),[$,k]=n.useState([]),[L,S]=n.useState([]),[R,G]=n.useState(!1),[J,Y]=n.useState(!1),[U,C]=n.useState(!1),[A,H]=n.useState(!1),[Q,se]=n.useState(!1),[ie,ne]=n.useState(!1),[le,D]=n.useState(!1),[K,z]=n.useState(null),Ce=n.useCallback(()=>z(null),[]),X=n.useRef(t?.projectId??null);n.useEffect(()=>{X.current=t?.projectId??null},[t]);const ge=Wt(),be=n.useCallback(async(c,l)=>{if(!t)return;const b=t.projectId;try{const F=await M(`/api/git/diff?project=${encodeURIComponent(b)}&file=${encodeURIComponent(c)}`,{signal:l}),je=await O(F,l);if(l?.aborted||X.current!==b)return;!je.error&&je.diff&&i(Ie=>({...Ie,[c]:je.diff}))}catch(F){if(l?.aborted||_e(F))return;console.error("Error fetching file diff:",F)}},[t]),E=n.useCallback(async c=>{if(!t)return;const l=t.projectId;h(!0);try{const b=await M(`/api/git/status?project=${encodeURIComponent(l)}`,{signal:c}),F=await O(b,c);if(c?.aborted||X.current!==l)return;if(F.error){F.notGitRepository||console.error("Git status error:",F.error),o({error:F.error,details:F.details,notGitRepository:F.notGitRepository}),f("");return}o(F),f(F.branch||Tt),De(F).forEach(Ie=>{be(Ie,c)})}catch(b){if(c?.aborted||_e(b)||X.current!==l)return;console.error("Error fetching git status:",b),o({error:"Git operation failed",details:String(b)}),f("")}finally{h(!1)}},[be,t]),q=n.useCallback(async()=>{if(t)try{const c=await M(`/api/git/branches?project=${encodeURIComponent(t.projectId)}`),l=await O(c);if(!l.error&&l.branches){y(l.branches),k(l.localBranches??l.branches),S(l.remoteBranches??[]);return}y([]),k([]),S([])}catch(c){console.error("Error fetching branches:",c),y([]),k([]),S([])}},[t]),_=n.useCallback(async()=>{if(t)try{const c=await M(`/api/git/remote-status?project=${encodeURIComponent(t.projectId)}`),l=await O(c);if(!l.error){w(l);return}w(null)}catch(c){console.error("Error fetching remote status:",c),w(null)}},[t]),ke=n.useCallback(async c=>{if(!t)return!1;try{const l=await M("/api/git/checkout",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project:t.projectId,branch:c})}),b=await O(l);return b.success?(f(c),E(),!0):(console.error("Failed to switch branch:",b.error),!1)}catch(l){return console.error("Error switching branch:",l),!1}},[E,t]),Se=n.useCallback(async c=>{const l=c.trim();if(!t||!l)return!1;G(!0);try{const b=await M("/api/git/create-branch",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project:t.projectId,branch:l})}),F=await O(b);return F.success?(f(l),q(),E(),!0):(console.error("Failed to create branch:",F.error),!1)}catch(b){return console.error("Error creating branch:",b),!1}finally{G(!1)}},[q,E,t]),$e=n.useCallback(async(c,l=!1)=>{if(!t)return!1;try{const b=await M("/api/git/delete-branch",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project:t.projectId,branch:c,force:l})}),F=await O(b);return F.success?(q(),!0):(z(F.error??"Delete branch failed"),!1)}catch(b){return z(b instanceof Error?b.message:"Delete branch failed"),!1}},[q,t]),Ee=n.useCallback(async()=>{if(t){Y(!0);try{const c=await M("/api/git/fetch",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project:t.projectId})}),l=await O(c);if(l.success){E(),_(),q();return}z(l.error??"Fetch failed")}catch(c){z(c instanceof Error?c.message:"Fetch failed")}finally{Y(!1)}}},[q,E,_,t]),ce=n.useCallback(async()=>{if(t){C(!0);try{const c=await M("/api/git/pull",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project:t.projectId})}),l=await O(c);if(l.success){E(),_();return}z(l.error??"Pull failed")}catch(c){z(c instanceof Error?c.message:"Pull failed")}finally{C(!1)}}},[E,_,t]),de=n.useCallback(async()=>{if(t){H(!0);try{const c=await M("/api/git/push",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project:t.projectId})}),l=await O(c);if(l.success){E(),_();return}z(l.error??"Push failed")}catch(c){z(c instanceof Error?c.message:"Push failed")}finally{H(!1)}}},[E,_,t]),me=n.useCallback(async()=>{if(t){se(!0);try{const c=await M("/api/git/publish",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project:t.projectId,branch:m})}),l=await O(c);if(l.success){E(),_();return}console.error("Publish failed:",l.error)}catch(c){console.error("Error publishing branch:",c)}finally{se(!1)}}},[m,E,_,t]),ye=n.useCallback(async c=>{if(t)try{const l=await M("/api/git/discard",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project:t.projectId,file:c})}),b=await O(l);if(b.success){E();return}console.error("Discard failed:",b.error)}catch(l){console.error("Error discarding changes:",l)}},[E,t]),at=n.useCallback(async c=>{if(t)try{const l=await M("/api/git/delete-untracked",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project:t.projectId,file:c})}),b=await O(l);if(b.success){E();return}console.error("Delete failed:",b.error)}catch(l){console.error("Error deleting untracked file:",l)}},[E,t]),ot=n.useCallback(async c=>{if(!t||c.length===0)return!1;try{const l=await M("/api/git/stage",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project:t.projectId,files:c})}),b=await O(l);return b.success?(await E(),!0):(z(b.error??"Stage failed"),!1)}catch(l){return z(l instanceof Error?l.message:"Stage failed"),!1}},[E,t]),it=n.useCallback(async c=>{if(!t||c.length===0)return!1;try{const l=await M("/api/git/unstage",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project:t.projectId,files:c})}),b=await O(l);return b.success?(await E(),!0):(z(b.error??"Unstage failed"),!1)}catch(l){return z(l instanceof Error?l.message:"Unstage failed"),!1}},[E,t]),Be=n.useCallback(async()=>{if(!t)return;const c=t.projectId;N(!0);try{const l=await M(`/api/git/commits?project=${encodeURIComponent(c)}&limit=${Ft}`),b=await O(l);if(X.current!==c)return;!b.error&&b.commits&&j(b.commits)}catch(l){console.error("Error fetching commits:",l)}finally{X.current===c&&(N(!1),T(!0))}},[t]),lt=n.useCallback(async c=>{if(t)try{const l=await M(`/api/git/commit-diff?project=${encodeURIComponent(t.projectId)}&commit=${c}`),b=await O(l);!b.error&&b.diff&&B(F=>({...F,[c]:b.diff}))}catch(l){console.error("Error fetching commit diff:",l)}},[t]),ct=n.useCallback(async c=>{if(!t||c.length===0)return null;try{const l=await Z("/api/git/generate-commit-message",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project:t.projectId,files:c,provider:ge})}),b=await O(l);return b.message?b.message:(console.error("Failed to generate commit message:",b.error),null)}catch(l){return console.error("Error generating commit message:",l),null}},[ge,t]),dt=n.useCallback(async(c,l)=>{if(!t||!c.trim()||l.length===0)return!1;try{const b=await M("/api/git/commit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project:t.projectId,message:c,files:l})}),F=await O(b);return F.success?(E(),_(),!0):(console.error("Commit failed:",F.error),!1)}catch(b){return console.error("Error committing changes:",b),!1}},[E,_,t]),mt=n.useCallback(async()=>{if(!t)throw new Error("No project selected");ne(!0);try{const c=await M("/api/git/initial-commit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project:t.projectId})}),l=await O(c);if(l.success)return E(),_(),!0;throw new Error(l.error||"Failed to create initial commit")}catch(c){throw console.error("Error creating initial commit:",c),c}finally{ne(!1)}},[E,_,t]),ut=n.useCallback(async()=>{if(!t)return!1;const c=t.projectId;D(!0);try{const l=await M("/api/git/init",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project:c})}),b=await O(l);return X.current!==c?!1:b.success?(E(),q(),_(),!0):(z(b.error??"Failed to initialize repository"),!1)}catch(l){return X.current===c&&z(l instanceof Error?l.message:"Failed to initialize repository"),!1}finally{D(!1)}},[q,E,_,t]),ht=n.useCallback(async c=>{if(s){if(!t){s(c);return}try{const l=await M(`/api/git/file-with-diff?project=${encodeURIComponent(t.projectId)}&file=${encodeURIComponent(c)}`),b=await O(l);if(b.error){console.error("Error fetching file with diff:",b.error),s(c);return}s(c,{old_string:b.oldContent||"",new_string:b.currentContent||""})}catch(l){console.error("Error opening file:",l),s(c)}}},[s,t]),xt=n.useCallback(()=>{E(),q(),_()},[q,E,_]);return n.useEffect(()=>{const c=new AbortController;return f(""),y([]),k([]),S([]),o(null),w(null),i({}),j([]),B({}),h(!1),N(!1),T(!1),z(null),t?(E(c.signal),q(),_(),()=>{c.abort()}):()=>{c.abort()}},[q,E,_,t]),n.useEffect(()=>{!t||r!=="history"||Be()},[r,Be,t]),{gitStatus:a,gitDiff:d,isLoading:g,isLoadingCommits:u||!x,currentBranch:m,branches:v,localBranches:$,remoteBranches:L,recentCommits:p,commitDiffs:I,remoteStatus:W,isCreatingBranch:R,isFetching:J,isPulling:U,isPushing:A,isPublishing:Q,isCreatingInitialCommit:ie,isInitializingRepository:le,operationError:K,clearOperationError:Ce,refreshAll:xt,switchBranch:ke,createBranch:Se,deleteBranch:$e,handleFetch:Ee,handlePull:ce,handlePush:de,handlePublish:me,discardChanges:ye,deleteUntrackedFile:at,stageFiles:ot,unstageFiles:it,fetchCommitDiff:lt,generateCommitMessage:ct,commitChanges:dt,createInitialCommit:mt,initRepository:ut,openFile:ht}}async function Ut(t){return await t.json()}function zt({projectId:t,onSuccess:r}){const[s,a]=n.useState(!1),o=n.useCallback(async()=>{if(t){a(!0);try{const d=await Z("/api/git/revert-local-commit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project:t})}),i=await Ut(d);if(!i.success){console.error("Revert local commit failed:",i.error||i.details||"Unknown error");return}r?.()}catch(d){console.error("Error reverting local commit:",d)}finally{a(!1)}}},[r,t]);return{isRevertingLocalCommit:s,revertLatestLocalCommit:o}}const Te=new Map;function Gt({isMobile:t,projectPath:r,selectedFileCount:s,isHidden:a,onCommit:o,onRequestConfirmation:d}){const[i,g]=n.useState(()=>Te.get(r)??""),h=u=>{g(u),u?Te.set(r,u):Te.delete(r)},[m,f]=n.useState(!1),[v,y]=n.useState(t),p=async(u=i)=>{const N=u.trim();if(!N||s===0||m)return!1;f(!0);try{const x=await o(N);return x&&h(""),x}finally{f(!1)}},j=()=>{const u=i.trim();!u||s===0||m||d({type:"commit",message:`Commit ${s} file${s!==1?"s":""} with message: "${u}"?`,onConfirm:async()=>{await p(u)}})};return e.jsx("div",{className:`transition-all duration-300 ease-in-out ${a?"max-h-0 -translate-y-2 overflow-hidden opacity-0":"max-h-96 translate-y-0 opacity-100"}`,children:t&&v?e.jsx("div",{className:"border-b border-border/60 px-4 py-2",children:e.jsxs("button",{onClick:()=>y(!1),className:"flex w-full items-center justify-center gap-2 rounded-lg bg-primary px-3 py-2 text-sm text-primary-foreground transition-colors hover:bg-primary/90",children:[e.jsx(Fe,{className:"h-4 w-4"}),e.jsxs("span",{children:["Commit ",s," file",s!==1?"s":""]}),e.jsx(he,{className:"h-3 w-3"})]})}):e.jsxs("div",{className:"border-b border-border/60 px-4 py-3",children:[t&&e.jsxs("div",{className:"mb-2 flex items-center justify-between",children:[e.jsx("span",{className:"text-sm font-medium text-foreground",children:"Commit Changes"}),e.jsx("button",{onClick:()=>y(!0),className:"rounded-lg p-1 transition-colors hover:bg-accent",children:e.jsx(he,{className:"h-4 w-4 rotate-180"})})]}),e.jsx("textarea",{value:i,onChange:u=>h(u.target.value),placeholder:"Message (Ctrl+Enter to commit)",className:"w-full resize-none rounded-xl border border-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:border-primary/30 focus:outline-none focus:ring-2 focus:ring-primary/20",rows:3,onKeyDown:u=>{u.key==="Enter"&&(u.ctrlKey||u.metaKey)&&(u.preventDefault(),p())}}),e.jsxs("div",{className:"mt-2 flex items-center justify-between",children:[e.jsxs("span",{className:"text-sm text-muted-foreground",children:[s," file",s!==1?"s":""," selected"]}),e.jsxs("button",{onClick:j,disabled:!i.trim()||s===0||m,className:"flex items-center space-x-1 rounded-lg bg-primary px-3 py-1.5 text-sm text-primary-foreground transition-colors hover:bg-primary/90 disabled:cursor-not-allowed disabled:opacity-50",children:[e.jsx(pe,{className:"h-3 w-3"}),e.jsx("span",{children:m?"Committing...":"Commit"})]})]})]})})}const Ue=2e5,ze=1500;function Ht(t){const r=t.length>Ue,a=(r?t.slice(0,Ue):t).split(`
29
+ `),o=a.length>ze;return{lines:o?a.slice(0,ze):a,isCharacterTruncated:r,isLineTruncated:o}}function st({diff:t,isMobile:r,wrapText:s}){const a=n.useMemo(()=>Ht(t||""),[t]),o=a.isCharacterTruncated||a.isLineTruncated;if(!t)return e.jsx("div",{className:"p-4 text-center text-sm text-muted-foreground",children:"No diff available"});const d=(i,g)=>{const h=i.startsWith("+")&&!i.startsWith("+++"),m=i.startsWith("-")&&!i.startsWith("---"),f=i.startsWith("@@");return e.jsx("div",{className:`px-3 py-0.5 font-mono text-xs ${r&&s?"whitespace-pre-wrap break-all":"overflow-x-auto whitespace-pre"} ${h?"bg-green-50 text-green-700 dark:bg-green-950/50 dark:text-green-300":m?"bg-red-50 text-red-700 dark:bg-red-950/50 dark:text-red-300":f?"bg-primary/5 text-primary":"text-muted-foreground/70"}`,children:i},g)};return e.jsxs("div",{className:"diff-viewer",children:[o&&e.jsx("div",{className:"mb-2 rounded-md border border-border bg-card px-3 py-2 text-xs text-muted-foreground",children:"Large diff preview: rendering is limited to keep the tab responsive."}),a.lines.map((i,g)=>d(i,g))]})}function Jt({filePath:t,status:r,isMobile:s,isExpanded:a,isSelected:o,diff:d,wrapText:i,onToggleSelected:g,onToggleExpanded:h,onOpenFile:m,onToggleWrapText:f,onRequestFileAction:v}){const y=Bt(r),p=Oe(r);return e.jsxs("div",{className:"border-b border-border last:border-0",children:[e.jsxs("div",{className:`flex items-center transition-colors hover:bg-accent/50 ${s?"px-2 py-1.5":"px-3 py-2"}`,children:[e.jsx("input",{type:"checkbox",checked:o,onChange:()=>g(t),onClick:j=>j.stopPropagation(),className:`rounded border-border bg-background text-primary checked:bg-primary focus:ring-primary/40 ${s?"mr-1.5":"mr-2"}`}),e.jsxs("div",{className:"flex min-w-0 flex-1 items-center",children:[e.jsx("button",{onClick:j=>{j.stopPropagation(),h(t)},className:`cursor-pointer rounded p-0.5 hover:bg-accent ${s?"mr-1":"mr-2"}`,title:a?"Collapse diff":"Expand diff",children:e.jsx(Ae,{className:`h-3 w-3 transition-transform duration-200 ease-in-out ${a?"rotate-90":"rotate-0"}`})}),e.jsx("span",{className:`flex-1 truncate ${s?"text-xs":"text-sm"} cursor-pointer hover:text-primary hover:underline`,onClick:j=>{j.stopPropagation(),m(t)},title:"Click to open file",children:t}),e.jsxs("span",{className:"flex items-center gap-1",children:[(r==="M"||r==="D"||r==="U")&&e.jsxs("button",{onClick:j=>{j.stopPropagation(),v(t,r)},className:`${s?"px-2 py-1 text-xs":"p-1"} flex items-center gap-1 rounded font-medium text-destructive hover:bg-destructive/10`,title:r==="U"?"Delete untracked file":"Discard changes",children:[e.jsx(oe,{className:"h-3 w-3"}),s&&e.jsx("span",{children:r==="U"?"Delete":"Discard"})]}),e.jsx("span",{className:`inline-flex h-5 w-5 items-center justify-center rounded border text-[10px] font-bold ${p}`,title:y,children:r})]})]})]}),e.jsxs("div",{className:`duration-400 overflow-hidden bg-muted/50 transition-all ease-in-out ${a&&d?"max-h-[600px] translate-y-0 opacity-100":"max-h-0 -translate-y-1 opacity-0"}`,children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-border p-2",children:[e.jsxs("span",{className:"flex items-center gap-2",children:[e.jsx("span",{className:`inline-flex h-5 w-5 items-center justify-center rounded border text-[10px] font-bold ${p}`,children:r}),e.jsx("span",{className:"text-sm font-medium text-foreground",children:y})]}),s&&e.jsx("button",{onClick:j=>{j.stopPropagation(),f()},className:"text-sm text-muted-foreground transition-colors hover:text-foreground",title:i?"Switch to horizontal scroll":"Switch to text wrap",children:i?"Scroll":"Wrap"})]}),e.jsx("div",{className:"max-h-96 overflow-y-auto",children:d&&e.jsx(st,{diff:d,isMobile:s,wrapText:i})})]})]})}function Ge({gitStatus:t,gitDiff:r,expandedFiles:s,selectedFiles:a,isMobile:o,wrapText:d,filePaths:i,onToggleSelected:g,onToggleExpanded:h,onOpenFile:m,onToggleWrapText:f,onRequestFileAction:v}){return e.jsx(e.Fragment,{children:tt.map(({key:y,status:p})=>(t[y]||[]).filter(j=>!i||i.has(j)).map(j=>e.jsx(Jt,{filePath:j,status:p,isMobile:o,isExpanded:s.has(j),isSelected:a.has(j),diff:r[j],wrapText:d,onToggleSelected:g,onToggleExpanded:h,onOpenFile:m,onToggleWrapText:f,onRequestFileAction:v},j)))})}const qt=[{status:"M",label:"Modified"},{status:"A",label:"Added"},{status:"D",label:"Deleted"},{status:"U",label:"Untracked"}];function Vt({isMobile:t}){const[r,s]=n.useState(!1);return t?null:e.jsxs("div",{className:"border-b border-border/60",children:[e.jsxs("button",{onClick:()=>s(a=>!a),className:"flex w-full items-center justify-center gap-1 bg-muted/30 px-4 py-2 text-sm text-muted-foreground transition-colors hover:bg-muted/50",children:[e.jsx(ft,{className:"h-3 w-3"}),e.jsx("span",{children:"File Status Guide"}),r?e.jsx(he,{className:"h-3 w-3"}):e.jsx(Ae,{className:"h-3 w-3"})]}),r&&e.jsx("div",{className:"bg-muted/30 px-4 py-3 text-sm",children:e.jsx("div",{className:"flex justify-center gap-6",children:qt.map(a=>e.jsxs("span",{className:"flex items-center gap-2",children:[e.jsx("span",{className:`inline-flex h-5 w-5 items-center justify-center rounded border text-[10px] font-bold ${Oe(a.status)}`,children:a.status}),e.jsx("span",{className:"italic text-muted-foreground",children:a.label})]},a.status))})})]})}function Qt({isMobile:t,projectPath:r,gitStatus:s,gitDiff:a,isLoading:o,wrapText:d,isCreatingInitialCommit:i,onWrapTextChange:g,onCreateInitialCommit:h,onOpenFile:m,onDiscardFile:f,onDeleteFile:v,onStageFiles:y,onUnstageFiles:p,onCommitChanges:j,onRequestConfirmation:u,onExpandedFilesChange:N}){const[x,T]=n.useState(new Set),[I,B]=n.useState(new Set),[W,w]=n.useState(0),$=n.useRef(Promise.resolve()),k=n.useMemo(()=>De(s),[s]),L=x.size>0,S=n.useCallback(C=>{w(A=>A+1),$.current=$.current.catch(()=>{}).then(C).finally(()=>w(A=>A-1))},[]);n.useEffect(()=>{if(!s||s.error){B(new Set);return}W>0||B(new Set(s.staged??[]))},[s,W]),n.useEffect(()=>{N(L)},[L,N]),n.useEffect(()=>()=>{N(!1)},[N]);const R=n.useCallback(C=>{T(A=>{const H=new Set(A);return H.has(C)?H.delete(C):H.add(C),H})},[]),G=n.useCallback(C=>{const A=I.has(C);B(H=>{const Q=new Set(H);return A?Q.delete(C):Q.add(C),Q}),S(()=>A?p([C]):y([C]))},[S,y,p,I]),J=n.useCallback((C,A)=>{if(A==="U"){u({type:"delete",message:`Delete untracked file "${C}"? This action cannot be undone.`,onConfirm:async()=>{await v(C)}});return}u({type:"discard",message:`Discard all changes to "${C}"? This action cannot be undone.`,onConfirm:async()=>{await f(C)}})},[v,f,u]),Y=n.useCallback(C=>j(C,Array.from(I)),[j,I]),U=n.useMemo(()=>new Set(k.filter(C=>!I.has(C))),[k,I]);return e.jsxs(e.Fragment,{children:[e.jsx(Gt,{isMobile:t,projectPath:r,selectedFileCount:I.size,isHidden:L,onCommit:Y,onRequestConfirmation:u}),!s?.error&&e.jsx(Vt,{isMobile:t}),e.jsx("div",{className:"flex-1 overflow-y-auto",children:o?e.jsx("div",{className:"flex h-32 items-center justify-center",children:e.jsx(V,{className:"h-5 w-5 animate-spin text-muted-foreground"})}):s?.hasCommits===!1&&We(s)?e.jsxs("div",{className:"flex flex-col items-center justify-center p-8 text-center",children:[e.jsx("div",{className:"mb-4 flex h-14 w-14 items-center justify-center rounded-2xl bg-muted/50",children:e.jsx(P,{className:"h-7 w-7 text-muted-foreground/50"})}),e.jsx("h3",{className:"mb-2 text-lg font-medium text-foreground",children:"No commits yet"}),e.jsx("p",{className:"mb-6 max-w-md text-sm text-muted-foreground",children:"This repository doesn't have any commits yet. Create your first commit to start tracking changes."}),e.jsx("button",{onClick:()=>void h(),disabled:i,className:"flex items-center gap-2 rounded-lg bg-primary px-4 py-2 text-primary-foreground transition-colors hover:bg-primary/90 disabled:cursor-not-allowed disabled:opacity-50",children:i?e.jsxs(e.Fragment,{children:[e.jsx(V,{className:"h-4 w-4 animate-spin"}),e.jsx("span",{children:"Creating Initial Commit..."})]}):e.jsxs(e.Fragment,{children:[e.jsx(Fe,{className:"h-4 w-4"}),e.jsx("span",{children:"Create Initial Commit"})]})})]}):!s||!We(s)?e.jsxs("div",{className:"flex h-32 flex-col items-center justify-center text-muted-foreground",children:[e.jsx(Fe,{className:"mb-2 h-10 w-10 opacity-40"}),e.jsx("p",{className:"text-sm",children:"No changes detected"})]}):e.jsxs("div",{className:t?"pb-4":"",children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-border/60 bg-muted/30 px-3 py-1.5",children:[e.jsxs("span",{className:"text-xs font-semibold uppercase tracking-wide text-muted-foreground",children:["Staged (",I.size,")"]}),I.size>0&&e.jsx("button",{onClick:()=>{const C=Array.from(I);B(new Set),S(()=>p(C))},className:"text-xs text-primary transition-colors hover:text-primary/80",children:"Unstage All"})]}),I.size===0?e.jsx("div",{className:"px-3 py-2 text-xs text-muted-foreground italic",children:"No staged files"}):e.jsx(Ge,{gitStatus:s,gitDiff:a,expandedFiles:x,selectedFiles:I,isMobile:t,wrapText:d,filePaths:I,onToggleSelected:G,onToggleExpanded:R,onOpenFile:C=>{m(C)},onToggleWrapText:()=>g(!d),onRequestFileAction:J}),e.jsxs("div",{className:"flex items-center justify-between border-b border-border/60 bg-muted/30 px-3 py-1.5",children:[e.jsxs("span",{className:"text-xs font-semibold uppercase tracking-wide text-muted-foreground",children:["Changes (",U.size,")"]}),U.size>0&&e.jsx("button",{onClick:()=>{const C=Array.from(U);B(new Set(k)),S(()=>y(C))},className:"text-xs text-primary transition-colors hover:text-primary/80",children:"Stage All"})]}),U.size===0?e.jsx("div",{className:"px-3 py-2 text-xs text-muted-foreground italic",children:"All changes staged"}):e.jsx(Ge,{gitStatus:s,gitDiff:a,expandedFiles:x,selectedFiles:I,isMobile:t,wrapText:d,filePaths:U,onToggleSelected:G,onToggleExpanded:R,onOpenFile:C=>{m(C)},onToggleWrapText:()=>g(!d),onRequestFileAction:J})]})})]})}const He=["#0ea5e9","#f97316","#a855f7","#22c55e","#ef4444","#eab308","#14b8a6","#ec4899","#6366f1","#84cc16"],ae=t=>He[t%He.length];function Kt(t){const r=[],s=[],a=()=>{const o=r.indexOf(null);return o!==-1?o:(r.push(null),r.length-1)};for(const o of t){const d=new Set;r.forEach((u,N)=>{u!==null&&d.add(N)});const i=[];r.forEach((u,N)=>{u===o.hash&&i.push(N)});const g=i.length>0,h=g?i[0]:a(),m=i.slice(1);for(const u of m)r[u]=null;const f=o.parents??[];r[h]=f.length>0?f[0]:null;const v=[];for(const u of f.slice(1)){const N=r.findIndex(x=>x===u);if(N!==-1&&N!==h)v.push(N);else{const x=a();r[x]=u,v.push(x)}}const y=[...d].filter(u=>u!==h&&!i.includes(u)).sort((u,N)=>u-N),p=[];r.forEach((u,N)=>{u!==null&&p.push(N)});const j=Math.max(r.length,h+1);for(;r.length>0&&r[r.length-1]===null;)r.pop();s.push({nodeLane:h,laneCount:j,hasTopContinuation:g,hasParentContinuation:f.length>0,inbound:m,outbound:v,passThrough:y,bottomLanes:p})}return s}const Re=12,ue=56,ee=28,Je=3.5,te=2,re=t=>t*Re+Re/2;function Xt({row:t}){const r=t.laneCount*Re,s=re(t.nodeLane),a=ae(t.nodeLane);return e.jsxs("div",{"aria-hidden":!0,className:"relative shrink-0 self-stretch overflow-hidden",style:{width:r},children:[e.jsxs("svg",{className:"absolute left-0 top-0",width:r,height:ue,fill:"none",children:[t.passThrough.map(o=>e.jsx("path",{d:`M ${re(o)} 0 V ${ue}`,stroke:ae(o),strokeWidth:te},`pass-${o}`)),t.hasTopContinuation&&e.jsx("path",{d:`M ${s} 0 V ${ee}`,stroke:a,strokeWidth:te}),t.hasParentContinuation&&e.jsx("path",{d:`M ${s} ${ee} V ${ue}`,stroke:a,strokeWidth:te}),t.inbound.map(o=>e.jsx("path",{d:`M ${re(o)} 0 Q ${re(o)} ${ee} ${s} ${ee}`,stroke:ae(o),strokeWidth:te},`in-${o}`)),t.outbound.map(o=>e.jsx("path",{d:`M ${s} ${ee} Q ${re(o)} ${ee} ${re(o)} ${ue}`,stroke:ae(o),strokeWidth:te},`out-${o}`)),e.jsx("circle",{cx:s,cy:ee,r:t.inbound.length>0||t.outbound.length>0?Je+.5:Je,fill:a})]}),t.bottomLanes.map(o=>e.jsx("div",{className:"absolute",style:{left:re(o)-te/2,top:ue,bottom:0,width:te,backgroundColor:ae(o)}},`rail-${o}`))]})}function Yt(t){return new Date(t).toLocaleDateString("en-US",{year:"numeric",month:"short",day:"numeric"})}function Zt({refName:t,color:r}){const s=t.startsWith("tag: "),a=t.startsWith("HEAD -> "),o=s?t.slice(5):a?t.slice(8):t;return e.jsxs("span",{className:"inline-flex max-w-40 items-center gap-1 rounded-full border px-1.5 py-px text-[10px] font-medium leading-4",style:{borderColor:r,color:r,backgroundColor:a?`${r}22`:"transparent"},title:t,children:[s?e.jsx(It,{className:"h-2.5 w-2.5 shrink-0"}):e.jsx(P,{className:"h-2.5 w-2.5 shrink-0"}),e.jsx("span",{className:"truncate",children:o})]})}function Pt({commit:t,isExpanded:r,diff:s,isMobile:a,wrapText:o,graphRow:d,onToggle:i}){const g=n.useMemo(()=>s?Mt(s):null,[s]),h=d?ae(d.nodeLane):"#0ea5e9";return e.jsxs("div",{className:"flex border-b border-border last:border-0",children:[d&&e.jsx(Xt,{row:d}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("button",{type:"button","aria-expanded":r,className:"flex w-full cursor-pointer items-start border-0 bg-transparent p-3 text-left transition-colors hover:bg-accent/50",onClick:i,children:[e.jsx("span",{className:"mr-2 mt-1 rounded p-0.5 hover:bg-accent",children:r?e.jsx(he,{className:"h-3 w-3"}):e.jsx(Ae,{className:"h-3 w-3"})}),e.jsx("div",{className:"min-w-0 flex-1",children:e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[t.refs&&t.refs.length>0&&e.jsx("span",{className:"mb-0.5 flex flex-wrap gap-1",children:t.refs.map(m=>e.jsx(Zt,{refName:m,color:h},m))}),e.jsx("p",{className:"truncate text-sm font-medium text-foreground",children:t.message}),e.jsxs("p",{className:"mt-1 text-sm text-muted-foreground",children:[t.author," • ",t.date]})]}),e.jsx("span",{className:"flex-shrink-0 font-mono text-sm text-muted-foreground/60",children:t.hash.substring(0,7)})]})})]}),r&&s&&e.jsx("div",{className:"bg-muted/50",children:e.jsxs("div",{className:"max-h-[32rem] overflow-y-auto p-3",children:[e.jsx("p",{className:"mb-2 select-all font-mono text-xs text-muted-foreground/70",children:t.hash}),e.jsxs("div",{className:"mb-3 flex gap-4 text-xs text-muted-foreground",children:[e.jsxs("span",{children:[e.jsx("span",{className:"text-muted-foreground/60",children:"Author "}),t.author]}),e.jsxs("span",{children:[e.jsx("span",{className:"text-muted-foreground/60",children:"Date "}),Yt(t.date)]})]}),g&&e.jsxs("div",{className:"mb-3 flex gap-4 rounded-md bg-muted/80 px-4 py-2 text-center text-xs",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-muted-foreground/60",children:"Files"}),e.jsx("div",{className:"font-semibold text-foreground",children:g.totalFiles})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-muted-foreground/60",children:"Added"}),e.jsxs("div",{className:"font-semibold text-green-600 dark:text-green-400",children:["+",g.totalInsertions]})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-muted-foreground/60",children:"Removed"}),e.jsxs("div",{className:"font-semibold text-red-600 dark:text-red-400",children:["-",g.totalDeletions]})]})]}),g&&g.files.length>0&&e.jsxs("div",{className:"mb-3",children:[e.jsx("p",{className:"mb-1.5 text-xs font-semibold uppercase tracking-wider text-muted-foreground/60",children:"Changed Files"}),e.jsx("div",{className:"rounded-md border border-border/60",children:g.files.map((m,f)=>e.jsxs("div",{className:`flex items-center gap-2 px-2.5 py-1.5 text-xs ${f<g.files.length-1?"border-b border-border/40":""}`,children:[e.jsx("span",{className:`inline-flex h-4 w-4 flex-shrink-0 items-center justify-center rounded border text-[9px] font-bold ${Oe(m.status)}`,children:m.status}),e.jsxs("span",{className:"min-w-0 flex-1 truncate",children:[m.directory&&e.jsx("span",{className:"text-muted-foreground/60",children:m.directory}),e.jsx("span",{className:"font-medium text-foreground",children:m.filename})]}),e.jsxs("span",{className:"flex-shrink-0 font-mono text-muted-foreground/60",children:[m.insertions>0&&e.jsxs("span",{className:"text-green-600 dark:text-green-400",children:["+",m.insertions]}),m.insertions>0&&m.deletions>0&&"/",m.deletions>0&&e.jsxs("span",{className:"text-red-600 dark:text-red-400",children:["-",m.deletions]})]})]},m.path))})]}),e.jsx(st,{diff:s,isMobile:a,wrapText:o})]})})]})]})}function er({isMobile:t,isLoading:r,recentCommits:s,commitDiffs:a,wrapText:o,onFetchCommitDiff:d}){const[i,g]=n.useState(new Set),h=n.useMemo(()=>s.some(f=>f.parents!==void 0)?Kt(s):null,[s]),m=n.useCallback(f=>{const v=!i.has(f);g(y=>{const p=new Set(y);return p.has(f)?p.delete(f):p.add(f),p}),v&&!a[f]&&d(f).catch(y=>{console.error("Failed to fetch commit diff:",y)})},[a,i,d,g]);return e.jsx("div",{className:"flex-1 overflow-y-auto",children:r?e.jsx("div",{className:"flex h-32 items-center justify-center",children:e.jsx(V,{className:"h-5 w-5 animate-spin text-muted-foreground"})}):s.length===0?e.jsxs("div",{className:"flex h-32 flex-col items-center justify-center text-muted-foreground",children:[e.jsx(et,{className:"mb-2 h-10 w-10 opacity-40"}),e.jsx("p",{className:"text-sm",children:"No commits found"})]}):e.jsx("div",{className:t?"pb-4":"",children:s.map((f,v)=>e.jsx(Pt,{commit:f,isExpanded:i.has(f.hash),diff:a[f.hash],isMobile:t,wrapText:o,graphRow:h?.[v],onToggle:()=>m(f.hash)},f.hash))})})}function nt({isOpen:t,currentBranch:r,isCreatingBranch:s,onClose:a,onCreateBranch:o}){const[d,i]=n.useState("");n.useEffect(()=>{t||i("")},[t]);const g=async()=>{const h=d.trim();if(!h)return!1;try{const m=await o(h);return m&&(i(""),a()),m}catch(m){return console.error("Failed to create branch:",m),!1}};return t?e.jsxs("div",{className:"fixed inset-0 z-50 flex items-center justify-center p-4",children:[e.jsx("div",{className:"fixed inset-0 bg-black/60 backdrop-blur-sm",onClick:a}),e.jsx("div",{className:"relative w-full max-w-md overflow-hidden rounded-xl border border-border bg-card shadow-2xl",role:"dialog","aria-modal":"true","aria-labelledby":"new-branch-title",children:e.jsxs("div",{className:"p-6",children:[e.jsx("h3",{className:"mb-4 text-lg font-semibold text-foreground",children:"Create New Branch"}),e.jsxs("div",{className:"mb-4",children:[e.jsx("label",{htmlFor:"git-new-branch-name",className:"mb-2 block text-sm font-medium text-foreground/80",children:"Branch Name"}),e.jsx("input",{id:"git-new-branch-name",type:"text",value:d,onChange:h=>i(h.target.value),onKeyDown:h=>{if(h.key==="Enter"&&!s){h.preventDefault(),h.stopPropagation(),g();return}h.key==="Escape"&&!s&&(h.preventDefault(),h.stopPropagation(),a())},placeholder:"feature/new-feature",className:"w-full rounded-xl border border-border bg-background px-3 py-2 text-foreground placeholder:text-muted-foreground focus:border-primary/30 focus:outline-none focus:ring-2 focus:ring-primary/20",autoFocus:!0})]}),e.jsxs("p",{className:"mb-4 text-sm text-muted-foreground",children:["This will create a new branch from the current branch (",r,")"]}),e.jsxs("div",{className:"flex justify-end space-x-3",children:[e.jsx("button",{onClick:a,className:"rounded-lg px-4 py-2 text-sm text-muted-foreground transition-colors hover:bg-accent hover:text-foreground",children:"Cancel"}),e.jsx("button",{onClick:()=>void g(),disabled:!d.trim()||s,className:"flex items-center space-x-2 rounded-lg bg-primary px-4 py-2 text-sm text-primary-foreground transition-colors hover:bg-primary/90 disabled:cursor-not-allowed disabled:opacity-50",children:s?e.jsxs(e.Fragment,{children:[e.jsx(V,{className:"h-3 w-3 animate-spin"}),e.jsx("span",{children:"Creating..."})]}):e.jsxs(e.Fragment,{children:[e.jsx(xe,{className:"h-3 w-3"}),e.jsx("span",{children:"Create Branch"})]})})]})]})})]}):null}function qe({name:t,isCurrent:r,isRemote:s,aheadCount:a,behindCount:o,isMobile:d,onSwitch:i,onDelete:g}){return e.jsxs("div",{className:`group flex items-center gap-3 border-b border-border/40 px-4 transition-colors hover:bg-accent/40 ${d?"py-2.5":"py-3"} ${r?"bg-primary/5":""}`,children:[e.jsx("div",{className:`flex h-7 w-7 shrink-0 items-center justify-center rounded-md border ${r?"border-primary/30 bg-primary/10 text-primary":s?"border-border bg-muted text-muted-foreground":"border-border bg-muted/50 text-muted-foreground"}`,children:s?e.jsx(pt,{className:"h-3.5 w-3.5"}):e.jsx(P,{className:"h-3.5 w-3.5"})}),e.jsxs("div",{className:"flex min-w-0 flex-1 flex-col gap-0.5",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:`truncate text-sm font-medium ${r?"text-foreground":"text-foreground/80"}`,children:t}),r&&e.jsx("span",{className:"shrink-0 rounded-full bg-primary/15 px-1.5 py-0.5 text-xs font-semibold text-primary",children:"current"}),s&&!r&&e.jsx("span",{className:"shrink-0 rounded-full bg-muted px-1.5 py-0.5 text-xs text-muted-foreground",children:"remote"})]}),r&&(a>0||o>0)&&e.jsxs("div",{className:"flex items-center gap-2 text-xs",children:[a>0&&e.jsxs("span",{className:"text-green-600 dark:text-green-400",children:["↑",a," ahead"]}),o>0&&e.jsxs("span",{className:"text-primary",children:["↓",o," behind"]})]})]}),e.jsx("div",{className:`flex shrink-0 items-center gap-1 ${r?"opacity-100":"opacity-0 group-hover:opacity-100"} transition-opacity`,children:r?e.jsx(pe,{className:"h-4 w-4 text-primary"}):s?null:e.jsxs(e.Fragment,{children:[e.jsx("button",{onClick:i,className:"rounded-md px-2 py-1 text-xs font-medium text-muted-foreground transition-colors hover:bg-accent hover:text-foreground",title:`Switch to ${t}`,children:"Switch"}),e.jsx("button",{onClick:g,className:"rounded-md p-1 text-muted-foreground transition-colors hover:bg-destructive/10 hover:text-destructive",title:`Delete ${t}`,children:e.jsx(oe,{className:"h-3.5 w-3.5"})})]})})]})}function Ve({label:t,count:r}){return e.jsxs("div",{className:"sticky top-0 z-10 flex items-center justify-between bg-background/95 px-4 py-2 backdrop-blur-sm",children:[e.jsx("span",{className:"text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:t}),e.jsx("span",{className:"rounded-full bg-muted px-1.5 py-0.5 text-xs text-muted-foreground",children:r})]})}function tr({isMobile:t,isLoading:r,currentBranch:s,localBranches:a,remoteBranches:o,remoteStatus:d,isCreatingBranch:i,onSwitchBranch:g,onCreateBranch:h,onDeleteBranch:m,onRequestConfirmation:f}){const[v,y]=n.useState(!1),[p,j]=n.useState(""),u=d?.ahead??0,N=d?.behind??0,x=p.trim().toLowerCase(),T=n.useMemo(()=>x?a.filter(w=>w.toLowerCase().includes(x)):a,[a,x]),I=n.useMemo(()=>x?o.filter(w=>w.toLowerCase().includes(x)):o,[x,o]),B=w=>{f({type:"commit",message:`Switch to branch "${w}"? Make sure you have no uncommitted changes.`,onConfirm:()=>void g(w)})},W=w=>{f({type:"deleteBranch",message:`Delete branch "${w}"? A normal delete only succeeds when the branch is fully merged. This cannot be undone.`,onConfirm:()=>void m(w),alternateConfirmation:{label:"Force delete this unmerged branch",description:"Permanently removes the branch even when it contains commits that have not been merged elsewhere.",actionLabel:"Force delete",onConfirm:()=>void m(w,!0)}})};return r&&a.length===0?e.jsx("div",{className:"flex h-32 items-center justify-center",children:e.jsx(V,{className:"h-5 w-5 animate-spin text-muted-foreground"})}):e.jsxs("div",{className:"flex flex-1 flex-col overflow-hidden",children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-border/40 px-4 py-2.5",children:[e.jsxs("span",{className:"text-sm text-muted-foreground",children:[a.length," local",o.length>0?`, ${o.length} remote`:""]}),e.jsxs("button",{onClick:()=>y(!0),className:"flex items-center gap-1.5 rounded-lg bg-primary/10 px-3 py-1.5 text-sm font-medium text-primary transition-colors hover:bg-primary/20",children:[e.jsx(xe,{className:"h-3.5 w-3.5"}),"New branch"]})]}),e.jsxs("div",{className:"flex items-center gap-2 border-b border-border/40 px-4 py-2",children:[e.jsx(Xe,{className:"h-3.5 w-3.5 shrink-0 text-muted-foreground"}),e.jsx("input",{type:"text",value:p,onChange:w=>j(w.target.value),placeholder:"Search branches...",className:"w-full bg-transparent text-sm text-foreground placeholder:text-muted-foreground focus:outline-none"}),p&&e.jsx("button",{onClick:()=>j(""),className:"shrink-0 text-muted-foreground transition-colors hover:text-foreground",title:"Clear search",children:e.jsx(we,{className:"h-3.5 w-3.5"})})]}),e.jsxs("div",{className:"flex-1 overflow-y-auto",children:[T.length>0&&e.jsxs(e.Fragment,{children:[e.jsx(Ve,{label:"Local",count:T.length}),T.map(w=>e.jsx(qe,{name:w,isCurrent:w===s,isRemote:!1,aheadCount:w===s?u:0,behindCount:w===s?N:0,isMobile:t,onSwitch:()=>B(w),onDelete:()=>W(w)},`local:${w}`))]}),I.length>0&&e.jsxs(e.Fragment,{children:[e.jsx(Ve,{label:"Remote",count:I.length}),I.map(w=>e.jsx(qe,{name:w,isCurrent:!1,isRemote:!0,aheadCount:0,behindCount:0,isMobile:t,onSwitch:()=>B(w),onDelete:()=>W(w)},`remote:${w}`))]}),T.length===0&&I.length===0&&e.jsxs("div",{className:"flex h-32 flex-col items-center justify-center gap-2 text-muted-foreground",children:[e.jsx(P,{className:"h-10 w-10 opacity-30"}),e.jsx("p",{className:"text-sm",children:x?"No branches match your search":"No branches found"})]})]}),e.jsx(nt,{isOpen:v,currentBranch:s,isCreatingBranch:i,onClose:()=>y(!1),onCreateBranch:h})]})}function Ne(t,r){const s=t.error?.message||r,a=t.error?.details;return Array.isArray(a)&&a.length>0?`${s}: ${a.slice(0,5).join(", ")}${a.length>5?", …":""}`:typeof a=="string"&&a.trim()?`${s}: ${a.trim()}`:s}function rr({selectedProject:t,onProjectSelect:r,onProjectsRefresh:s}){const[a,o]=n.useState(null),[d,i]=n.useState(!1),[g,h]=n.useState(!1),[m,f]=n.useState(!1),[v,y]=n.useState(null),p=n.useRef(null),[j,u]=n.useState(null),N=n.useCallback(()=>u(null),[]),x=n.useRef(t?.projectId??null);n.useEffect(()=>{x.current=t?.projectId??null},[t]);const T=n.useCallback(async()=>{if(!t)return;const $=t.projectId;i(!0);try{const k=await Z(`/api/worktrees?project=${encodeURIComponent($)}`),L=await k.json();if(x.current!==$)return;if(!k.ok||!L.data){o(null);return}o(L.data)}catch(k){console.error("Error fetching worktrees:",k),x.current===$&&o(null)}finally{x.current===$&&(i(!1),h(!0))}},[t]);n.useEffect(()=>{o(null),h(!1),u(null),T()},[T]);const I=n.useCallback(async($,k,L)=>{const S=$.trim();if(!t||!S)return!1;const R=t.projectId;f(!0),u(null);try{const G=await Z("/api/worktrees/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project:R,branch:S,baseBranch:k})}),J=await G.json();return x.current!==R?!1:!G.ok||!J.data?(u(Ne(J,"Failed to create worktree")),!1):(s?.(),L&&J.data.project&&r?r(J.data.project):T(),!0)}catch(G){return x.current===R&&u(G instanceof Error?G.message:"Failed to create worktree"),!1}finally{f(!1)}},[T,r,s,t]),B=n.useCallback(async $=>{if(!t||p.current!==null)return!1;const k=t.projectId,L=Symbol("open-worktree");p.current=L,y($),u(null);try{const S=await Z("/api/worktrees/open",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project:k,worktreePath:$})}),R=await S.json();return x.current!==k?!1:!S.ok||!R.data?.project?(u(Ne(R,"Failed to open worktree")),!1):(s?.(),r?.(R.data.project),!0)}catch(S){return x.current===k&&u(S instanceof Error?S.message:"Failed to open worktree"),!1}finally{p.current===L&&(p.current=null,y(null))}},[r,s,t]),W=n.useCallback(async($,k)=>{if(!t||p.current!==null)return!1;const L=Symbol("merge-worktree");p.current=L,y($),u(null);try{const S=await Z("/api/worktrees/merge",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project:t.projectId,worktreePath:$,squash:k.squash,message:k.message,removeAfterMerge:k.removeAfterMerge})}),R=await S.json();return!S.ok||!R.success?(u(Ne(R,"Merge failed")),!1):(s?.(),T(),!0)}catch(S){return u(S instanceof Error?S.message:"Merge failed"),!1}finally{p.current===L&&(p.current=null,y(null))}},[T,s,t]),w=n.useCallback(async($,k)=>{if(!t||p.current!==null)return!1;const L=Symbol("remove-worktree");p.current=L,y($),u(null);try{const S=await Z("/api/worktrees/remove",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project:t.projectId,worktreePath:$,force:k.force,deleteBranch:k.deleteBranch})}),R=await S.json();return!S.ok||!R.success?(u(Ne(R,"Failed to remove worktree")),!1):(s?.(),T(),!0)}catch(S){return u(S instanceof Error?S.message:"Failed to remove worktree"),!1}finally{p.current===L&&(p.current=null,y(null))}},[T,s,t]);return{worktreeData:a,isLoading:d||!g,isCreatingWorktree:m,busyWorktreePath:v,actionError:j,clearActionError:N,refreshWorktrees:T,createWorktree:I,openWorktree:B,mergeWorktree:W,removeWorktree:w}}function Qe(t,r){return t?r?`Squash merge branch '${t}'`:`Merge branch '${t}'`:""}function sr({worktree:t,baseBranch:r,isMerging:s,onClose:a,onMerge:o}){const[d,i]=n.useState(!0),[g,h]=n.useState(""),[m,f]=n.useState(!0),[v,y]=n.useState(!1);n.useEffect(()=>{t&&(i(!0),f(!0),h(Qe(t.branch,!0)),y(!1))},[t]);const p=N=>{i(N),v||h(Qe(t?.branch??null,N))},j=async()=>{if(!t)return;await o(t.path,{squash:d,message:g.trim(),removeAfterMerge:m})&&a()};if(!t)return null;const u=`${t.ahead} commit${t.ahead===1?"":"s"}`;return e.jsxs("div",{className:"fixed inset-0 z-50 flex items-center justify-center p-4",children:[e.jsx("div",{className:"fixed inset-0 bg-black/60 backdrop-blur-sm",onClick:a}),e.jsx("div",{className:"relative w-full max-w-md overflow-hidden rounded-xl border border-border bg-card shadow-2xl",role:"dialog","aria-modal":"true","aria-labelledby":"merge-worktree-title",children:e.jsxs("div",{className:"p-6",children:[e.jsx("h3",{id:"merge-worktree-title",className:"mb-1 text-lg font-semibold text-foreground",children:"Merge Worktree"}),e.jsxs("div",{className:"mb-4 flex items-center gap-2 text-sm",children:[e.jsx("span",{className:"max-w-[45%] truncate rounded-md bg-primary/10 px-2 py-1 font-mono text-primary",children:t.branch}),e.jsx(gt,{className:"h-3.5 w-3.5 shrink-0 text-muted-foreground"}),e.jsx("span",{className:"max-w-[45%] truncate rounded-md bg-muted px-2 py-1 font-mono text-foreground/80",children:r}),e.jsx("span",{className:"ml-auto shrink-0 text-xs text-muted-foreground",children:u})]}),e.jsxs("label",{className:"mb-3 flex cursor-pointer items-start gap-2 text-sm text-foreground/80",children:[e.jsx("input",{type:"checkbox",checked:d,onChange:N=>p(N.target.checked),className:"mt-0.5 h-4 w-4 rounded border-border accent-primary"}),e.jsxs("span",{children:["Squash commits",e.jsxs("span",{className:"block text-xs text-muted-foreground",children:["Combine all ",u," into a single commit on ",r]})]})]}),e.jsxs("div",{className:"mb-3",children:[e.jsx("label",{htmlFor:"merge-worktree-message",className:"mb-2 block text-sm font-medium text-foreground/80",children:"Commit message"}),e.jsx("textarea",{id:"merge-worktree-message",value:g,onChange:N=>{h(N.target.value),y(!0)},rows:2,className:"w-full resize-none rounded-xl border border-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:border-primary/30 focus:outline-none focus:ring-2 focus:ring-primary/20"})]}),e.jsxs("label",{className:"mb-4 flex cursor-pointer items-start gap-2 text-sm text-foreground/80",children:[e.jsx("input",{type:"checkbox",checked:m,onChange:N=>f(N.target.checked),className:"mt-0.5 h-4 w-4 rounded border-border accent-primary"}),e.jsxs("span",{children:["Clean up after merge",e.jsx("span",{className:"block text-xs text-muted-foreground",children:"Remove the worktree and delete its branch once merged"})]})]}),e.jsxs("div",{className:"flex justify-end space-x-3",children:[e.jsx("button",{onClick:a,className:"rounded-lg px-4 py-2 text-sm text-muted-foreground transition-colors hover:bg-accent hover:text-foreground",children:"Cancel"}),e.jsx("button",{onClick:()=>void j(),disabled:s||!g.trim(),className:"flex items-center space-x-2 rounded-lg bg-primary px-4 py-2 text-sm text-primary-foreground transition-colors hover:bg-primary/90 disabled:cursor-not-allowed disabled:opacity-50",children:s?e.jsxs(e.Fragment,{children:[e.jsx(V,{className:"h-3 w-3 animate-spin"}),e.jsx("span",{children:"Merging..."})]}):e.jsxs(e.Fragment,{children:[e.jsx(Ye,{className:"h-3 w-3"}),e.jsx("span",{children:d?"Squash & Merge":"Merge"})]})})]})]})})]})}function nr(t){return t.replace(/[/\\:*?"<>|\s]+/g,"-").replace(/\.+$/g,"").replace(/^-+|-+$/g,"")}function ar(t){const r=t.split(/[\\/]/).filter(Boolean);return r[r.length-1]??t}function or({isOpen:t,baseBranch:r,localBranches:s,repositoryRoot:a,isCreating:o,onClose:d,onCreate:i}){const[g,h]=n.useState(""),[m,f]=n.useState(""),[v,y]=n.useState(!0);n.useEffect(()=>{if(!t)h(""),y(!0);else{const x=r&&s.includes(r)?r:s[0]??"";f(x)}},[t,r,s]);const p=g.trim(),j=s.includes(p),u=n.useMemo(()=>{if(!p)return null;const x=nr(p);return x?`${ar(a)}-worktrees/${x}`:null},[a,p]),N=async()=>{if(!p)return!1;const x=await i(p,j?null:m||null,v);return x&&d(),x};return t?e.jsxs("div",{className:"fixed inset-0 z-50 flex items-center justify-center p-4",children:[e.jsx("div",{className:"fixed inset-0 bg-black/60 backdrop-blur-sm",onClick:d}),e.jsx("div",{className:"relative w-full max-w-md overflow-hidden rounded-xl border border-border bg-card shadow-2xl",role:"dialog","aria-modal":"true","aria-labelledby":"new-worktree-title",children:e.jsxs("div",{className:"p-6",children:[e.jsx("h3",{id:"new-worktree-title",className:"mb-1 text-lg font-semibold text-foreground",children:"New Worktree"}),e.jsx("p",{className:"mb-4 text-sm text-muted-foreground",children:"Check out a branch in its own folder and work on it in parallel."}),e.jsxs("div",{className:"mb-4",children:[e.jsx("label",{htmlFor:"worktree-branch-name",className:"mb-2 block text-sm font-medium text-foreground/80",children:"Branch"}),e.jsx("input",{id:"worktree-branch-name",type:"text",value:g,onChange:x=>h(x.target.value),onKeyDown:x=>{if(x.key==="Enter"&&!o){x.preventDefault(),x.stopPropagation(),N();return}x.key==="Escape"&&!o&&(x.preventDefault(),x.stopPropagation(),d())},placeholder:"feature/new-feature",className:"w-full rounded-xl border border-border bg-background px-3 py-2 text-foreground placeholder:text-muted-foreground focus:border-primary/30 focus:outline-none focus:ring-2 focus:ring-primary/20",autoFocus:!0}),j&&e.jsx("p",{className:"mt-1.5 text-xs text-muted-foreground",children:"Existing branch — it will be checked out as-is."})]}),!j&&e.jsxs("div",{className:"mb-4",children:[e.jsx("label",{htmlFor:"worktree-base-branch",className:"mb-2 block text-sm font-medium text-foreground/80",children:"Create from"}),e.jsx("select",{id:"worktree-base-branch",value:m,onChange:x=>f(x.target.value),className:"w-full rounded-xl border border-border bg-background px-3 py-2 text-foreground focus:border-primary/30 focus:outline-none focus:ring-2 focus:ring-primary/20",children:s.map(x=>e.jsx("option",{value:x,children:x},x))})]}),u&&e.jsxs("p",{className:"mb-4 rounded-lg bg-muted/50 px-3 py-2 text-xs text-muted-foreground",children:["Will be created in ",e.jsx("span",{className:"font-mono text-foreground/80",children:u})]}),e.jsxs("label",{className:"mb-4 flex cursor-pointer items-center gap-2 text-sm text-foreground/80",children:[e.jsx("input",{type:"checkbox",checked:v,onChange:x=>y(x.target.checked),className:"h-4 w-4 rounded border-border accent-primary"}),"Switch to the worktree after creating it"]}),e.jsxs("div",{className:"flex justify-end space-x-3",children:[e.jsx("button",{onClick:d,className:"rounded-lg px-4 py-2 text-sm text-muted-foreground transition-colors hover:bg-accent hover:text-foreground",children:"Cancel"}),e.jsx("button",{onClick:()=>void N(),disabled:!p||o,className:"flex items-center space-x-2 rounded-lg bg-primary px-4 py-2 text-sm text-primary-foreground transition-colors hover:bg-primary/90 disabled:cursor-not-allowed disabled:opacity-50",children:o?e.jsxs(e.Fragment,{children:[e.jsx(V,{className:"h-3 w-3 animate-spin"}),e.jsx("span",{children:"Creating..."})]}):e.jsxs(e.Fragment,{children:[e.jsx(ve,{className:"h-3 w-3"}),e.jsx("span",{children:"Create Worktree"})]})})]})]})})]}):null}function ir({worktree:t,isRemoving:r,onClose:s,onRemove:a}){const[o,d]=n.useState(!0),[i,g]=n.useState(!1);n.useEffect(()=>{t&&(d(!0),g(!1))},[t]);const h=async()=>{if(!t)return;await a(t.path,{force:i,deleteBranch:o})&&s()};if(!t)return null;const m=t.changedFileCount>0;return e.jsxs("div",{className:"fixed inset-0 z-50 flex items-center justify-center p-4",children:[e.jsx("div",{className:"fixed inset-0 bg-black/60 backdrop-blur-sm",onClick:s}),e.jsx("div",{className:"relative w-full max-w-md overflow-hidden rounded-xl border border-border bg-card shadow-2xl",role:"dialog","aria-modal":"true","aria-labelledby":"remove-worktree-title",children:e.jsxs("div",{className:"p-6",children:[e.jsxs("div",{className:"mb-4 flex items-center",children:[e.jsx("div",{className:"mr-3 rounded-full bg-red-100 p-2 dark:bg-red-900/30",children:e.jsx(oe,{className:"h-4 w-4 text-red-600 dark:text-red-400"})}),e.jsx("h3",{id:"remove-worktree-title",className:"text-lg font-semibold text-foreground",children:"Remove Worktree"})]}),e.jsxs("p",{className:"mb-3 text-sm text-muted-foreground",children:["Remove the worktree for"," ",e.jsx("span",{className:"font-mono text-foreground/80",children:t.branch??"detached HEAD"}),"? Its folder is deleted and the linked project is archived — chat sessions stay recoverable."]}),m&&e.jsxs("p",{className:"mb-3 rounded-lg border border-amber-500/30 bg-amber-500/10 px-3 py-2 text-xs text-amber-600 dark:text-amber-400",children:["This worktree has ",t.changedFileCount," uncommitted change",t.changedFileCount===1?"":"s"," that will be lost."]}),t.branch&&e.jsxs("label",{className:"mb-2 flex cursor-pointer items-center gap-2 text-sm text-foreground/80",children:[e.jsx("input",{type:"checkbox",checked:o,onChange:f=>d(f.target.checked),className:"h-4 w-4 rounded border-border accent-primary"}),"Also delete branch ",e.jsx("span",{className:"font-mono",children:t.branch})]}),m&&e.jsxs("label",{className:"mb-2 flex cursor-pointer items-center gap-2 text-sm text-foreground/80",children:[e.jsx("input",{type:"checkbox",checked:i,onChange:f=>g(f.target.checked),className:"h-4 w-4 rounded border-border accent-primary"}),"Discard uncommitted changes"]}),e.jsxs("div",{className:"mt-4 flex justify-end space-x-3",children:[e.jsx("button",{onClick:s,className:"rounded-lg px-4 py-2 text-sm text-muted-foreground transition-colors hover:bg-accent hover:text-foreground",children:"Cancel"}),e.jsx("button",{onClick:()=>void h(),disabled:r||m&&!i,className:"flex items-center space-x-2 rounded-lg bg-red-600 px-4 py-2 text-sm text-white transition-colors hover:bg-red-700 disabled:cursor-not-allowed disabled:opacity-50",children:r?e.jsxs(e.Fragment,{children:[e.jsx(V,{className:"h-3 w-3 animate-spin"}),e.jsx("span",{children:"Removing..."})]}):e.jsxs(e.Fragment,{children:[e.jsx(oe,{className:"h-3 w-3"}),e.jsx("span",{children:"Remove"})]})})]})]})})]})}function lr(t){return t.split(/[\\/]/).filter(Boolean).slice(-2).join("/")||t}function cr({worktree:t,isMobile:r,isBusy:s,onOpen:a,onMerge:o,onRemove:d}){const i=t.branch??(t.headSha?`detached @ ${t.headSha.slice(0,7)}`:"detached");return e.jsxs("div",{className:`group flex items-center gap-3 border-b border-border/40 px-4 transition-colors hover:bg-accent/40 ${r?"py-2.5":"py-3"} ${t.isCurrent?"bg-primary/5":""}`,children:[e.jsx("div",{className:`flex h-7 w-7 shrink-0 items-center justify-center rounded-md border ${t.isCurrent?"border-primary/30 bg-primary/10 text-primary":"border-border bg-muted/50 text-muted-foreground"}`,children:t.isMain?e.jsx($t,{className:"h-3.5 w-3.5"}):e.jsx(ve,{className:"h-3.5 w-3.5"})}),e.jsxs("div",{className:"flex min-w-0 flex-1 flex-col gap-0.5",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:`truncate text-sm font-medium ${t.isCurrent?"text-foreground":"text-foreground/80"}`,children:i}),t.isCurrent&&e.jsx("span",{className:"shrink-0 rounded-full bg-primary/15 px-1.5 py-0.5 text-xs font-semibold text-primary",children:"current"}),t.isMain&&e.jsx("span",{className:"shrink-0 rounded-full bg-muted px-1.5 py-0.5 text-xs text-muted-foreground",children:"main worktree"}),t.isLocked&&e.jsx("span",{className:"shrink-0 rounded-full bg-muted px-1.5 py-0.5 text-xs text-muted-foreground",children:"locked"})]}),e.jsxs("div",{className:"flex min-w-0 items-center gap-2 text-xs text-muted-foreground",children:[e.jsx("span",{className:"shrink-0 font-mono",children:lr(t.path)}),t.ahead>0&&e.jsxs("span",{className:"shrink-0 text-green-600 dark:text-green-400",children:["↑",t.ahead]}),t.behind>0&&e.jsxs("span",{className:"shrink-0 text-primary",children:["↓",t.behind]}),t.changedFileCount>0&&e.jsxs("span",{className:"shrink-0 text-amber-600 dark:text-amber-400",children:["● ",t.changedFileCount," change",t.changedFileCount===1?"":"s"]}),t.lastCommitSubject&&e.jsx("span",{className:"truncate",children:t.lastCommitSubject})]})]}),e.jsx("div",{className:`flex shrink-0 items-center gap-1 ${t.isCurrent||s?"opacity-100":"opacity-100 sm:opacity-0 sm:focus-within:opacity-100 sm:group-hover:opacity-100"} transition-opacity`,children:s?e.jsx(V,{className:"h-4 w-4 animate-spin text-muted-foreground"}):t.isCurrent?e.jsx(pe,{className:"h-4 w-4 text-primary"}):e.jsxs(e.Fragment,{children:[e.jsxs("button",{onClick:a,className:"flex items-center gap-1 rounded-md px-2 py-1 text-xs font-medium text-muted-foreground transition-colors hover:bg-accent hover:text-foreground",title:`Switch to ${i}`,children:[e.jsx(vt,{className:"h-3 w-3"}),"Open"]}),!t.isMain&&e.jsxs(e.Fragment,{children:[e.jsx("button",{onClick:o,disabled:!t.branch||t.ahead===0,className:"rounded-md p-1 text-muted-foreground transition-colors hover:bg-primary/10 hover:text-primary disabled:cursor-not-allowed disabled:opacity-40",title:t.ahead===0?"Nothing to merge — no commits ahead of the base branch":`Merge ${i} into the base branch`,children:e.jsx(Ye,{className:"h-3.5 w-3.5"})}),e.jsx("button",{onClick:d,className:"rounded-md p-1 text-muted-foreground transition-colors hover:bg-destructive/10 hover:text-destructive",title:`Remove worktree for ${i}`,children:e.jsx(oe,{className:"h-3.5 w-3.5"})})]})]})})]})}function dr({isMobile:t,selectedProject:r,localBranches:s,onProjectSelect:a,onProjectsRefresh:o}){const{worktreeData:d,isLoading:i,isCreatingWorktree:g,busyWorktreePath:h,actionError:m,clearActionError:f,refreshWorktrees:v,createWorktree:y,openWorktree:p,mergeWorktree:j,removeWorktree:u}=rr({selectedProject:r,onProjectSelect:a,onProjectsRefresh:o}),[N,x]=n.useState(!1),[T,I]=n.useState(null),[B,W]=n.useState(null),w=d?.worktrees??[],$=w.filter(k=>!k.isMain).length;return i&&w.length===0?e.jsx("div",{className:"flex h-32 items-center justify-center",children:e.jsx(V,{className:"h-5 w-5 animate-spin text-muted-foreground"})}):e.jsxs("div",{className:"flex flex-1 flex-col overflow-hidden",children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-border/40 px-4 py-2.5",children:[e.jsx("span",{className:"text-sm text-muted-foreground",children:$===0?"No worktrees":`${$} worktree${$===1?"":"s"}`}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("button",{onClick:()=>void v(),className:"rounded-lg p-1.5 text-muted-foreground transition-colors hover:bg-accent hover:text-foreground",title:"Refresh worktrees",children:e.jsx(V,{className:`h-3.5 w-3.5 ${i?"animate-spin":""}`})}),e.jsxs("button",{onClick:()=>x(!0),disabled:!d,className:"flex items-center gap-1.5 rounded-lg bg-primary/10 px-3 py-1.5 text-sm font-medium text-primary transition-colors hover:bg-primary/20 disabled:cursor-not-allowed disabled:opacity-50",children:[e.jsx(xe,{className:"h-3.5 w-3.5"}),"New worktree"]})]})]}),m&&e.jsxs("div",{className:"flex items-start gap-2 border-b border-destructive/30 bg-destructive/10 px-4 py-2.5",children:[e.jsx("p",{className:"min-w-0 flex-1 break-words text-xs text-destructive",children:m}),e.jsx("button",{onClick:f,className:"shrink-0 text-destructive/70 transition-colors hover:text-destructive",title:"Dismiss",children:e.jsx(we,{className:"h-3.5 w-3.5"})})]}),e.jsxs("div",{className:"flex-1 overflow-y-auto",children:[w.map(k=>e.jsx(cr,{worktree:k,isMobile:t,isBusy:h===k.path,onOpen:()=>void p(k.path),onMerge:()=>I(k),onRemove:()=>W(k)},k.path)),$===0&&e.jsxs("div",{className:"flex flex-col items-center gap-3 px-6 py-10 text-center",children:[e.jsx(ve,{className:"h-10 w-10 text-muted-foreground opacity-30"}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium text-foreground/80",children:"Work on branches in parallel"}),e.jsx("p",{className:"mx-auto mt-1 max-w-xs text-xs text-muted-foreground",children:"A worktree checks out a branch in its own folder, so you can run separate chat sessions side by side and merge the results back when they're ready."})]}),e.jsxs("button",{onClick:()=>x(!0),disabled:!d,className:"flex items-center gap-1.5 rounded-lg bg-primary px-4 py-2 text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90 disabled:cursor-not-allowed disabled:opacity-50",children:[e.jsx(xe,{className:"h-3.5 w-3.5"}),"Create your first worktree"]})]})]}),e.jsx(or,{isOpen:N,baseBranch:d?.baseBranch??null,localBranches:s,repositoryRoot:d?.repositoryRoot??"",isCreating:g,onClose:()=>x(!1),onCreate:y}),e.jsx(sr,{worktree:T,baseBranch:d?.baseBranch??null,isMerging:T!==null&&h===T.path,onClose:()=>I(null),onMerge:j}),e.jsx(ir,{worktree:B,isRemoving:B!==null&&h===B.path,onClose:()=>W(null),onRemove:u})]})}function mr({isMobile:t,currentBranch:r,branches:s,remoteStatus:a,isLoading:o,isCreatingBranch:d,isFetching:i,isPulling:g,isPushing:h,isPublishing:m,isRevertingLocalCommit:f,operationError:v,onRefresh:y,onRevertLocalCommit:p,onSwitchBranch:j,onCreateBranch:u,onFetch:N,onPull:x,onPush:T,onPublish:I,onClearError:B,onRequestConfirmation:W}){const[w,$]=n.useState(!1),[k,L]=n.useState(!1),[S,R]=n.useState(""),G=n.useRef(null),J=n.useRef(null);n.useEffect(()=>{w?J.current?.focus():R("")},[w]);const Y=n.useMemo(()=>{const D=S.trim().toLowerCase();return D?s.filter(K=>K.toLowerCase().includes(D)):s},[s,S]);n.useEffect(()=>{const D=K=>{G.current&&!G.current.contains(K.target)&&$(!1)};return document.addEventListener("mousedown",D),()=>document.removeEventListener("mousedown",D)},[]);const U=a?.ahead??0,C=a?.behind??0,A=a?.remoteName??"remote",H=i||g||h||m,Q=()=>{W({type:"pull",message:`Pull ${C} commit${C!==1?"s":""} from ${A}?`,onConfirm:x})},se=()=>{W({type:"push",message:`Push ${U} commit${U!==1?"s":""} to ${A}?`,onConfirm:T})},ie=()=>{W({type:"publish",message:`Publish branch "${r}" to ${A}?`,onConfirm:I})},ne=()=>{W({type:"revertLocalCommit",message:"Revert the latest local commit? This removes the commit but keeps its changes staged.",onConfirm:p})},le=async D=>{try{await j(D)&&$(!1)}catch(K){console.error("[GitPanelHeader] Failed to switch branch:",K)}};return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:`flex items-center justify-between border-b border-border/60 ${t?"px-3 py-2":"px-4 py-3"}`,children:[e.jsxs("div",{className:"relative",ref:G,children:[e.jsxs("button",{onClick:()=>$(D=>!D),className:`flex items-center rounded-lg transition-colors hover:bg-accent ${t?"space-x-1 px-2 py-1":"space-x-2 px-3 py-1.5"}`,children:[e.jsx(P,{className:`text-muted-foreground ${t?"h-3 w-3":"h-4 w-4"}`}),e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx("span",{className:`font-medium ${t?"text-xs":"text-sm"}`,children:r}),a?.hasRemote&&e.jsxs("span",{className:"flex items-center gap-0.5 text-xs",children:[U>0&&e.jsxs("span",{className:"text-green-600 dark:text-green-400",title:`${U} ahead`,children:["↑",U]}),C>0&&e.jsxs("span",{className:"text-primary",title:`${C} behind`,children:["↓",C]}),a.isUpToDate&&e.jsx("span",{className:"text-muted-foreground",title:"Up to date",children:"✓"})]})]}),e.jsx(he,{className:`h-3 w-3 text-muted-foreground transition-transform ${w?"rotate-180":""}`})]}),w&&e.jsxs("div",{className:"absolute left-0 top-full z-50 mt-1 w-64 overflow-hidden rounded-xl border border-border bg-card shadow-lg",children:[e.jsxs("div",{className:"flex items-center gap-2 border-b border-border px-3 py-2",children:[e.jsx(Xe,{className:"h-3.5 w-3.5 shrink-0 text-muted-foreground"}),e.jsx("input",{ref:J,type:"text",value:S,onChange:D=>R(D.target.value),placeholder:"Search branches...",className:"w-full bg-transparent text-sm text-foreground placeholder:text-muted-foreground focus:outline-none"}),S&&e.jsx("button",{onClick:()=>R(""),className:"shrink-0 text-muted-foreground transition-colors hover:text-foreground",title:"Clear search",children:e.jsx(we,{className:"h-3.5 w-3.5"})})]}),e.jsx("div",{className:"max-h-64 overflow-y-auto py-1",children:Y.length===0?e.jsx("div",{className:"px-4 py-3 text-center text-sm text-muted-foreground",children:"No matching branches"}):Y.map(D=>e.jsx("button",{onClick:()=>void le(D),className:`w-full px-4 py-2 text-left text-sm transition-colors hover:bg-accent ${D===r?"bg-accent/50 text-foreground":"text-muted-foreground"}`,children:e.jsxs("span",{className:"flex items-center space-x-2",children:[D===r&&e.jsx(pe,{className:"h-3 w-3 text-primary"}),e.jsx("span",{className:D===r?"font-medium":"",children:D})]})},D))}),e.jsx("div",{className:"border-t border-border py-1",children:e.jsxs("button",{onClick:()=>{L(!0),$(!1)},className:"flex w-full items-center space-x-2 px-4 py-2 text-left text-sm transition-colors hover:bg-accent",children:[e.jsx(xe,{className:"h-3 w-3"}),e.jsx("span",{children:"Create new branch"})]})})]})]}),e.jsxs("div",{className:`flex items-center ${t?"gap-1":"gap-2"}`,children:[a?.hasRemote&&e.jsx(e.Fragment,{children:a.hasUpstream?e.jsxs(e.Fragment,{children:[e.jsxs("button",{onClick:()=>void N(),disabled:H,className:"flex items-center gap-1 rounded-lg bg-primary px-2.5 py-1 text-sm text-primary-foreground transition-colors hover:bg-primary/90 disabled:opacity-50",title:`Fetch from ${A}`,children:[e.jsx(V,{className:`h-3 w-3 ${i?"animate-spin":""}`}),!t&&e.jsx("span",{children:i?"Fetching…":"Fetch"})]}),C>0&&e.jsxs("button",{onClick:Q,disabled:H,className:"flex items-center gap-1 rounded-lg bg-green-600 px-2.5 py-1 text-sm text-white transition-colors hover:bg-green-700 disabled:opacity-50",title:`Pull ${C} from ${A}`,children:[e.jsx(Ze,{className:`h-3 w-3 ${g?"animate-pulse":""}`}),!t&&e.jsx("span",{children:g?"Pulling…":`Pull ${C}`})]}),U>0&&e.jsxs("button",{onClick:se,disabled:H,className:"flex items-center gap-1 rounded-lg bg-orange-600 px-2.5 py-1 text-sm text-white transition-colors hover:bg-orange-700 disabled:opacity-50",title:`Push ${U} to ${A}`,children:[e.jsx(Le,{className:`h-3 w-3 ${h?"animate-pulse":""}`}),!t&&e.jsx("span",{children:h?"Pushing…":`Push ${U}`})]})]}):e.jsxs("button",{onClick:ie,disabled:H,className:"flex items-center gap-1 rounded-lg bg-primary px-2.5 py-1 text-sm text-primary-foreground transition-colors hover:bg-primary/90 disabled:opacity-50",title:`Publish "${r}" to ${A}`,children:[e.jsx(Le,{className:`h-3 w-3 ${m?"animate-pulse":""}`}),!t&&e.jsx("span",{children:m?"Publishing…":"Publish"})]})}),e.jsx("button",{onClick:ne,disabled:f,className:`rounded-lg transition-colors hover:bg-accent disabled:opacity-50 ${t?"p-1":"p-1.5"}`,title:"Revert latest local commit",children:e.jsx(Pe,{className:`text-muted-foreground ${f?"animate-pulse":""} ${t?"h-3 w-3":"h-4 w-4"}`})}),e.jsx("button",{onClick:y,disabled:o,className:`rounded-lg transition-colors hover:bg-accent ${t?"p-1":"p-1.5"}`,title:"Refresh git status",children:e.jsx(V,{className:`text-muted-foreground ${o?"animate-spin":""} ${t?"h-3 w-3":"h-4 w-4"}`})})]})]}),v&&e.jsxs("div",{className:"flex items-start gap-2 border-b border-destructive/20 bg-destructive/10 px-4 py-2.5 text-sm text-destructive",children:[e.jsx(bt,{className:"mt-0.5 h-4 w-4 shrink-0"}),e.jsx("span",{className:"flex-1 leading-snug",children:v}),e.jsx("button",{onClick:B,className:"shrink-0 rounded p-0.5 hover:bg-destructive/20","aria-label":"Dismiss error",children:e.jsx(we,{className:"h-3.5 w-3.5"})})]}),e.jsx(nt,{isOpen:k,currentBranch:r,isCreatingBranch:d,onClose:()=>L(!1),onCreateBranch:u})]})}function ur({error:t,details:r,canInitRepository:s=!1,isInitializingRepository:a=!1,initError:o,onInitRepository:d}){const i=s&&!!d;return e.jsxs("div",{className:"flex flex-1 flex-col items-center justify-center px-6 py-12 text-muted-foreground",children:[e.jsx("div",{className:"mb-6 flex h-16 w-16 items-center justify-center rounded-2xl bg-muted/50",children:e.jsx(P,{className:"h-8 w-8 opacity-40"})}),i?e.jsxs(e.Fragment,{children:[e.jsx("h3",{className:"mb-3 text-center text-lg font-medium text-foreground",children:"No git repository"}),e.jsx("p",{className:"mb-6 max-w-md text-center text-sm leading-relaxed",children:"This project is not a git repository yet. Initialize one to start tracking changes and use source control features."}),e.jsx("button",{onClick:d,disabled:a,className:"flex items-center gap-2 rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90 disabled:cursor-not-allowed disabled:opacity-60",children:a?e.jsxs(e.Fragment,{children:[e.jsx(yt,{className:"h-4 w-4 animate-spin"}),"Initializing repository..."]}):e.jsxs(e.Fragment,{children:[e.jsx(P,{className:"h-4 w-4"}),"Run git init"]})}),o&&e.jsx("p",{className:"mt-4 max-w-md text-center text-sm leading-relaxed text-destructive",children:o})]}):e.jsxs(e.Fragment,{children:[e.jsx("h3",{className:"mb-3 text-center text-lg font-medium text-foreground",children:t}),r&&e.jsx("p",{className:"max-w-md text-center text-sm leading-relaxed",children:r})]})]})}const hr=[{id:"changes",label:"Changes",Icon:jt},{id:"history",label:"Commits",Icon:et},{id:"branches",label:"Branches",Icon:P},{id:"worktrees",label:"Worktrees",Icon:ve}];function xr({activeView:t,isHidden:r,changeCount:s,onChange:a}){return e.jsx("div",{className:`border-b border-border/60 transition-all duration-300 ease-in-out ${r?"max-h-0 -translate-y-2 overflow-hidden opacity-0":"max-h-16 translate-y-0 opacity-100"}`,children:e.jsx("div",{className:"scrollbar-hide flex w-full snap-x overflow-x-auto overscroll-x-contain [-webkit-overflow-scrolling:touch]",role:"tablist","aria-label":"Source control views",children:hr.map(({id:o,label:d,Icon:i})=>e.jsx("button",{type:"button",role:"tab","aria-selected":t===o,onClick:()=>a(o),className:`min-w-max flex-none snap-start px-4 py-2 text-sm font-medium transition-colors sm:min-w-0 sm:flex-1 ${t===o?"border-b-2 border-primary text-primary":"text-muted-foreground hover:text-foreground"}`,children:e.jsxs("span",{className:"flex items-center justify-center gap-2",children:[e.jsx(i,{className:"h-4 w-4"}),e.jsx("span",{children:d}),o==="changes"&&s>0&&e.jsx("span",{className:"rounded-full bg-primary/15 px-1.5 py-0.5 text-xs font-semibold text-primary",children:s})]})},o))})})}function Ke(t){return t==="discard"||t==="delete"?e.jsx(oe,{className:"h-4 w-4"}):t==="commit"?e.jsx(pe,{className:"h-4 w-4"}):t==="pull"?e.jsx(Ze,{className:"h-4 w-4"}):t==="revertLocalCommit"?e.jsx(Pe,{className:"h-4 w-4"}):e.jsx(Le,{className:"h-4 w-4"})}function fr({action:t,onCancel:r,onConfirm:s}){const[a,o]=n.useState(!1),d=t?`confirmation-title-${t.type}`:void 0,i=()=>{o(!1),r()},g=()=>{const h=a&&!!t?.alternateConfirmation;o(!1),s(h)};return n.useEffect(()=>{if(!t)return;const h=m=>{m.key==="Escape"&&(o(!1),r())};return window.addEventListener("keydown",h),()=>{window.removeEventListener("keydown",h)}},[t,r]),t?e.jsxs("div",{className:"fixed inset-0 z-50 flex items-center justify-center p-4",children:[e.jsx("div",{className:"fixed inset-0 bg-black/60 backdrop-blur-sm",onClick:i}),e.jsxs("div",{className:"relative flex max-h-[calc(100dvh-2rem)] w-full max-w-md flex-col overflow-hidden rounded-xl border border-border bg-card shadow-2xl",role:"dialog","aria-modal":"true","aria-labelledby":d,children:[e.jsxs("div",{className:"flex shrink-0 items-center px-6 pt-6",children:[e.jsx("div",{className:`mr-3 rounded-full p-2 ${Ot[t.type]}`,children:Ke(t.type)}),e.jsx("h3",{id:d,className:"text-lg font-semibold text-foreground",children:Rt[t.type]})]}),e.jsx("p",{className:"scrollbar-thin my-4 min-h-0 flex-1 overflow-y-auto overscroll-contain whitespace-pre-wrap break-words px-6 text-sm text-muted-foreground",children:t.message}),t.alternateConfirmation&&e.jsxs("label",{className:"mx-6 mb-5 flex cursor-pointer items-start gap-3 rounded-lg border border-destructive/30 bg-destructive/5 p-3 transition-colors hover:bg-destructive/10",children:[e.jsx("input",{type:"checkbox",checked:a,onChange:h=>o(h.target.checked),className:"mt-0.5 h-4 w-4 shrink-0 accent-destructive"}),e.jsxs("span",{className:"min-w-0",children:[e.jsxs("span",{className:"flex items-center gap-1.5 text-sm font-medium text-foreground",children:[e.jsx(Nt,{className:"h-3.5 w-3.5 text-destructive"}),t.alternateConfirmation.label]}),e.jsx("span",{className:"mt-1 block text-xs leading-relaxed text-muted-foreground",children:t.alternateConfirmation.description})]})]}),e.jsxs("div",{className:"flex shrink-0 justify-end space-x-3 px-6 pb-6",children:[e.jsx("button",{onClick:i,className:"rounded-lg px-4 py-2 text-sm text-muted-foreground transition-colors hover:bg-accent hover:text-foreground",children:"Cancel"}),e.jsxs("button",{onClick:g,className:`flex items-center space-x-2 rounded-lg px-4 py-2 text-sm text-white transition-colors ${Dt[t.type]}`,children:[Ke(t.type),e.jsx("span",{children:a&&t.alternateConfirmation?t.alternateConfirmation.actionLabel:At[t.type]})]})]})]})]}):null}function br({selectedProject:t,isMobile:r=!1,onFileOpen:s,onProjectSelect:a,onProjectsRefresh:o}){const[d,i]=n.useState("changes"),[g,h]=n.useState(!0),[m,f]=n.useState(!1),[v,y]=n.useState(null),{gitStatus:p,gitDiff:j,isLoading:u,isLoadingCommits:N,currentBranch:x,branches:T,localBranches:I,remoteBranches:B,recentCommits:W,commitDiffs:w,remoteStatus:$,isCreatingBranch:k,isFetching:L,isPulling:S,isPushing:R,isPublishing:G,isCreatingInitialCommit:J,isInitializingRepository:Y,operationError:U,clearOperationError:C,refreshAll:A,switchBranch:H,createBranch:Q,deleteBranch:se,handleFetch:ie,handlePull:ne,handlePush:le,handlePublish:D,discardChanges:K,deleteUntrackedFile:z,stageFiles:Ce,unstageFiles:X,fetchCommitDiff:ge,commitChanges:be,createInitialCommit:E,initRepository:q,openFile:_}=_t({selectedProject:t,activeView:d,onFileOpen:s}),{isRevertingLocalCommit:ke,revertLatestLocalCommit:Se}=zt({projectId:t?.projectId??null,onSuccess:A}),$e=n.useCallback(async(de=!1)=>{if(!v)return;const me=v;y(null);try{await(de?me.alternateConfirmation?.onConfirm??me.onConfirm:me.onConfirm)()}catch(ye){console.error("Error executing confirmation action:",ye)}},[v]),Ee=rt(p),ce=!!p?.notGitRepository;return t?e.jsxs("div",{className:"flex h-full flex-col bg-background",children:[!ce&&e.jsx(mr,{isMobile:r,currentBranch:x,branches:T,remoteStatus:$,isLoading:u,isCreatingBranch:k,isFetching:L,isPulling:S,isPushing:R,isPublishing:G,isRevertingLocalCommit:ke,operationError:U,onRefresh:A,onRevertLocalCommit:Se,onSwitchBranch:H,onCreateBranch:Q,onFetch:ie,onPull:ne,onPush:le,onPublish:D,onClearError:C,onRequestConfirmation:y}),p?.error?e.jsx(ur,{error:p.error,details:p.details,canInitRepository:ce,isInitializingRepository:Y,initError:ce?U:null,onInitRepository:()=>{C(),q()}}):e.jsxs(e.Fragment,{children:[e.jsx(xr,{activeView:d,isHidden:m,changeCount:Ee,onChange:i}),d==="changes"&&e.jsx(Qt,{isMobile:r,projectPath:t.fullPath,gitStatus:p,gitDiff:j,isLoading:u,wrapText:g,isCreatingInitialCommit:J,onWrapTextChange:h,onCreateInitialCommit:E,onOpenFile:_,onDiscardFile:K,onDeleteFile:z,onStageFiles:Ce,onUnstageFiles:X,onCommitChanges:be,onRequestConfirmation:y,onExpandedFilesChange:f},t.fullPath),d==="history"&&e.jsx(er,{isMobile:r,isLoading:u||W.length===0&&N,recentCommits:W,commitDiffs:w,wrapText:g,onFetchCommitDiff:ge}),d==="worktrees"&&e.jsx(dr,{isMobile:r,selectedProject:t,localBranches:I,onProjectSelect:a,onProjectsRefresh:o},t.fullPath),d==="branches"&&e.jsx(tr,{isMobile:r,isLoading:u,currentBranch:x,localBranches:I,remoteBranches:B,remoteStatus:$,isCreatingBranch:k,onSwitchBranch:H,onCreateBranch:Q,onDeleteBranch:se,onRequestConfirmation:y})]}),e.jsx(fr,{action:v,onCancel:()=>y(null),onConfirm:de=>{$e(de)}})]}):e.jsx("div",{className:"flex h-full items-center justify-center text-muted-foreground",children:e.jsx("p",{children:"Select a project to view source control"})})}export{br as default};