viba-cli 0.40.0 → 0.41.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (273) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +2 -2
  3. package/.next/fallback-build-manifest.json +2 -2
  4. package/.next/prerender-manifest.json +3 -3
  5. package/.next/server/app/_global-error/page.js +1 -1
  6. package/.next/server/app/_global-error/page.js.nft.json +1 -1
  7. package/.next/server/app/_global-error.html +2 -2
  8. package/.next/server/app/_global-error.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  14. package/.next/server/app/_not-found/page.js +1 -1
  15. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  16. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  17. package/.next/server/app/_not-found.html +2 -2
  18. package/.next/server/app/_not-found.rsc +2 -2
  19. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  20. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  21. package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  22. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  23. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  24. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  25. package/.next/server/app/api/component-source/resolve/route.js +1 -1
  26. package/.next/server/app/api/component-source/resolve/route.js.nft.json +1 -1
  27. package/.next/server/app/api/credentials/github/repos/route.js +1 -1
  28. package/.next/server/app/api/credentials/github/repos/route.js.nft.json +1 -1
  29. package/.next/server/app/api/credentials/route.js +1 -1
  30. package/.next/server/app/api/credentials/route.js.nft.json +1 -1
  31. package/.next/server/app/api/custom-scripts/route.js.nft.json +1 -1
  32. package/.next/server/app/api/git/action/route.js +1 -1
  33. package/.next/server/app/api/git/action/route.js.nft.json +1 -1
  34. package/.next/server/app/api/git/branches/route.js.nft.json +1 -1
  35. package/.next/server/app/api/git/diff/route.js +1 -1
  36. package/.next/server/app/api/git/diff/route.js.nft.json +1 -1
  37. package/.next/server/app/api/git/log/route.js.nft.json +1 -1
  38. package/.next/server/app/api/git/status/route.js.nft.json +1 -1
  39. package/.next/server/app/api/preview-proxy/start/route.js +1 -1
  40. package/.next/server/app/api/preview-proxy/start/route.js.nft.json +1 -1
  41. package/.next/server/app/api/repos/clone/route.js +1 -1
  42. package/.next/server/app/api/repos/clone/route.js.nft.json +1 -1
  43. package/.next/server/app/api/repos/route.js +1 -1
  44. package/.next/server/app/api/repos/route.js.nft.json +1 -1
  45. package/.next/server/app/api/settings/route.js +1 -1
  46. package/.next/server/app/api/settings/route.js.nft.json +1 -1
  47. package/.next/server/app/credentials/page/server-reference-manifest.json +7 -7
  48. package/.next/server/app/credentials/page.js +1 -1
  49. package/.next/server/app/credentials/page.js.nft.json +1 -1
  50. package/.next/server/app/credentials/page_client-reference-manifest.js +1 -1
  51. package/.next/server/app/credentials.html +2 -2
  52. package/.next/server/app/credentials.rsc +4 -4
  53. package/.next/server/app/credentials.segments/_full.segment.rsc +4 -4
  54. package/.next/server/app/credentials.segments/_head.segment.rsc +1 -1
  55. package/.next/server/app/credentials.segments/_index.segment.rsc +2 -2
  56. package/.next/server/app/credentials.segments/_tree.segment.rsc +2 -2
  57. package/.next/server/app/credentials.segments/credentials/__PAGE__.segment.rsc +2 -2
  58. package/.next/server/app/credentials.segments/credentials.segment.rsc +1 -1
  59. package/.next/server/app/git/changes/page.js +1 -1
  60. package/.next/server/app/git/changes/page.js.nft.json +1 -1
  61. package/.next/server/app/git/changes/page_client-reference-manifest.js +1 -1
  62. package/.next/server/app/git/changes.html +2 -2
  63. package/.next/server/app/git/changes.rsc +2 -2
  64. package/.next/server/app/git/changes.segments/_full.segment.rsc +2 -2
  65. package/.next/server/app/git/changes.segments/_head.segment.rsc +1 -1
  66. package/.next/server/app/git/changes.segments/_index.segment.rsc +2 -2
  67. package/.next/server/app/git/changes.segments/_tree.segment.rsc +2 -2
  68. package/.next/server/app/git/changes.segments/git/changes/__PAGE__.segment.rsc +1 -1
  69. package/.next/server/app/git/changes.segments/git/changes.segment.rsc +1 -1
  70. package/.next/server/app/git/changes.segments/git.segment.rsc +1 -1
  71. package/.next/server/app/git/custom-scripts/page.js +1 -1
  72. package/.next/server/app/git/custom-scripts/page.js.nft.json +1 -1
  73. package/.next/server/app/git/custom-scripts/page_client-reference-manifest.js +1 -1
  74. package/.next/server/app/git/custom-scripts.html +2 -2
  75. package/.next/server/app/git/custom-scripts.rsc +2 -2
  76. package/.next/server/app/git/custom-scripts.segments/_full.segment.rsc +2 -2
  77. package/.next/server/app/git/custom-scripts.segments/_head.segment.rsc +1 -1
  78. package/.next/server/app/git/custom-scripts.segments/_index.segment.rsc +2 -2
  79. package/.next/server/app/git/custom-scripts.segments/_tree.segment.rsc +2 -2
  80. package/.next/server/app/git/custom-scripts.segments/git/custom-scripts/__PAGE__.segment.rsc +1 -1
  81. package/.next/server/app/git/custom-scripts.segments/git/custom-scripts.segment.rsc +1 -1
  82. package/.next/server/app/git/custom-scripts.segments/git.segment.rsc +1 -1
  83. package/.next/server/app/git/history/page/server-reference-manifest.json +17 -1
  84. package/.next/server/app/git/history/page.js +3 -2
  85. package/.next/server/app/git/history/page.js.nft.json +1 -1
  86. package/.next/server/app/git/history/page_client-reference-manifest.js +1 -1
  87. package/.next/server/app/git/history.html +2 -2
  88. package/.next/server/app/git/history.rsc +4 -4
  89. package/.next/server/app/git/history.segments/_full.segment.rsc +4 -4
  90. package/.next/server/app/git/history.segments/_head.segment.rsc +1 -1
  91. package/.next/server/app/git/history.segments/_index.segment.rsc +2 -2
  92. package/.next/server/app/git/history.segments/_tree.segment.rsc +2 -2
  93. package/.next/server/app/git/history.segments/git/history/__PAGE__.segment.rsc +2 -2
  94. package/.next/server/app/git/history.segments/git/history.segment.rsc +1 -1
  95. package/.next/server/app/git/history.segments/git.segment.rsc +1 -1
  96. package/.next/server/app/git/page/server-reference-manifest.json +17 -1
  97. package/.next/server/app/git/page.js +3 -2
  98. package/.next/server/app/git/page.js.nft.json +1 -1
  99. package/.next/server/app/git/page_client-reference-manifest.js +1 -1
  100. package/.next/server/app/git/stashes/page.js +1 -1
  101. package/.next/server/app/git/stashes/page.js.nft.json +1 -1
  102. package/.next/server/app/git/stashes/page_client-reference-manifest.js +1 -1
  103. package/.next/server/app/git/stashes.html +2 -2
  104. package/.next/server/app/git/stashes.rsc +2 -2
  105. package/.next/server/app/git/stashes.segments/_full.segment.rsc +2 -2
  106. package/.next/server/app/git/stashes.segments/_head.segment.rsc +1 -1
  107. package/.next/server/app/git/stashes.segments/_index.segment.rsc +2 -2
  108. package/.next/server/app/git/stashes.segments/_tree.segment.rsc +2 -2
  109. package/.next/server/app/git/stashes.segments/git/stashes/__PAGE__.segment.rsc +1 -1
  110. package/.next/server/app/git/stashes.segments/git/stashes.segment.rsc +1 -1
  111. package/.next/server/app/git/stashes.segments/git.segment.rsc +1 -1
  112. package/.next/server/app/git.html +2 -2
  113. package/.next/server/app/git.rsc +4 -4
  114. package/.next/server/app/git.segments/_full.segment.rsc +4 -4
  115. package/.next/server/app/git.segments/_head.segment.rsc +1 -1
  116. package/.next/server/app/git.segments/_index.segment.rsc +2 -2
  117. package/.next/server/app/git.segments/_tree.segment.rsc +2 -2
  118. package/.next/server/app/git.segments/git/__PAGE__.segment.rsc +2 -2
  119. package/.next/server/app/git.segments/git.segment.rsc +1 -1
  120. package/.next/server/app/index.html +2 -2
  121. package/.next/server/app/index.rsc +4 -4
  122. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  123. package/.next/server/app/index.segments/_full.segment.rsc +4 -4
  124. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  125. package/.next/server/app/index.segments/_index.segment.rsc +2 -2
  126. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  127. package/.next/server/app/new/page/server-reference-manifest.json +29 -29
  128. package/.next/server/app/new/page.js +3 -3
  129. package/.next/server/app/new/page.js.nft.json +1 -1
  130. package/.next/server/app/new/page_client-reference-manifest.js +1 -1
  131. package/.next/server/app/page/server-reference-manifest.json +29 -29
  132. package/.next/server/app/page.js +3 -3
  133. package/.next/server/app/page.js.nft.json +1 -1
  134. package/.next/server/app/page_client-reference-manifest.js +1 -1
  135. package/.next/server/app/session/[sessionId]/page/server-reference-manifest.json +34 -19
  136. package/.next/server/app/session/[sessionId]/page.js +2 -2
  137. package/.next/server/app/session/[sessionId]/page.js.nft.json +1 -1
  138. package/.next/server/app/session/[sessionId]/page_client-reference-manifest.js +1 -1
  139. package/.next/server/chunks/[externals]__4610b07e._.js +3 -0
  140. package/.next/server/chunks/{[root-of-the-server]__51f9ab28._.js → [root-of-the-server]__093d29e3._.js} +2 -2
  141. package/.next/server/chunks/{[root-of-the-server]__f52f1c06._.js → [root-of-the-server]__2bdd2171._.js} +2 -2
  142. package/.next/server/chunks/{[root-of-the-server]__ceda8fbc._.js → [root-of-the-server]__34da758c._.js} +2 -2
  143. package/.next/server/chunks/{[root-of-the-server]__9af2c9bf._.js → [root-of-the-server]__5ebd9b2a._.js} +2 -2
  144. package/.next/server/chunks/{[root-of-the-server]__3ffc9919._.js → [root-of-the-server]__6a2576a8._.js} +2 -2
  145. package/.next/server/chunks/{[root-of-the-server]__5b08b37e._.js → [root-of-the-server]__7147e7f8._.js} +2 -2
  146. package/.next/server/chunks/{[root-of-the-server]__1bf60374._.js → [root-of-the-server]__93d494cc._.js} +2 -2
  147. package/.next/server/chunks/{[root-of-the-server]__8b29248a._.js → [root-of-the-server]__952874bc._.js} +2 -2
  148. package/.next/server/chunks/ssr/[root-of-the-server]__05e6fb4c._.js +1 -1
  149. package/.next/server/chunks/ssr/[root-of-the-server]__2f5cb477._.js +3 -0
  150. package/.next/server/chunks/ssr/{[root-of-the-server]__0ed2deb1._.js.map → [root-of-the-server]__2f5cb477._.js.map} +1 -1
  151. package/.next/server/chunks/ssr/[root-of-the-server]__32cb19cb._.js +3 -0
  152. package/.next/server/chunks/ssr/{[root-of-the-server]__a65a3900._.js.map → [root-of-the-server]__32cb19cb._.js.map} +1 -1
  153. package/.next/server/chunks/ssr/{[root-of-the-server]__5be652da._.js → [root-of-the-server]__35dc6469._.js} +2 -2
  154. package/.next/server/chunks/ssr/[root-of-the-server]__46af1502._.js +1 -1
  155. package/.next/server/chunks/ssr/[root-of-the-server]__46af1502._.js.map +1 -1
  156. package/.next/server/chunks/ssr/{_476e86d1._.js → [root-of-the-server]__4928d640._.js} +3 -3
  157. package/.next/server/chunks/ssr/{_476e86d1._.js.map → [root-of-the-server]__4928d640._.js.map} +1 -1
  158. package/.next/server/chunks/ssr/[root-of-the-server]__6e6c1134._.js +4 -0
  159. package/.next/server/chunks/ssr/[root-of-the-server]__6e6c1134._.js.map +1 -0
  160. package/.next/server/chunks/ssr/{[root-of-the-server]__e86a1b81._.js → [root-of-the-server]__79ab29ee._.js} +2 -2
  161. package/.next/server/chunks/ssr/[root-of-the-server]__8d19726f._.js +4 -0
  162. package/.next/server/chunks/ssr/[root-of-the-server]__8d19726f._.js.map +1 -0
  163. package/.next/server/chunks/ssr/{[root-of-the-server]__96a8b4aa._.js → [root-of-the-server]__905c5090._.js} +2 -2
  164. package/.next/server/chunks/ssr/{[root-of-the-server]__1ed5a76d._.js → [root-of-the-server]__afccdb61._.js} +3 -3
  165. package/.next/server/chunks/ssr/{[root-of-the-server]__1ed5a76d._.js.map → [root-of-the-server]__afccdb61._.js.map} +1 -1
  166. package/.next/server/chunks/ssr/_1232faca._.js +3 -0
  167. package/.next/server/chunks/ssr/_1232faca._.js.map +1 -0
  168. package/.next/server/chunks/ssr/_21376a5e._.js +3 -0
  169. package/.next/server/chunks/ssr/_21376a5e._.js.map +1 -0
  170. package/.next/server/chunks/ssr/_25f614f9._.js +3 -0
  171. package/.next/server/chunks/ssr/_25f614f9._.js.map +1 -0
  172. package/.next/server/chunks/ssr/{node_modules_next_dist_0ff44e32._.js → _4e480580._.js} +2 -2
  173. package/.next/server/chunks/ssr/_4e480580._.js.map +1 -0
  174. package/.next/server/chunks/ssr/_707e5fab._.js +1 -1
  175. package/.next/server/chunks/ssr/_707e5fab._.js.map +1 -1
  176. package/.next/server/chunks/ssr/_7e1d1983._.js +3 -0
  177. package/.next/server/chunks/ssr/_7e1d1983._.js.map +1 -0
  178. package/.next/server/chunks/ssr/_9493de08._.js +1 -1
  179. package/.next/server/chunks/ssr/_9493de08._.js.map +1 -1
  180. package/.next/server/chunks/ssr/{_ebf4c61c._.js → _979edf0c._.js} +2 -2
  181. package/.next/server/chunks/ssr/_979edf0c._.js.map +1 -0
  182. package/.next/server/chunks/ssr/_9db6d532._.js +3 -0
  183. package/.next/server/chunks/ssr/_9db6d532._.js.map +1 -0
  184. package/.next/server/chunks/ssr/{_a07f93fb._.js → _a30f8faf._.js} +2 -2
  185. package/.next/server/chunks/ssr/_a30f8faf._.js.map +1 -0
  186. package/.next/server/chunks/ssr/{node_modules_bf7b09f8._.js → node_modules_3aaf320c._.js} +2 -2
  187. package/.next/server/chunks/ssr/node_modules_3aaf320c._.js.map +1 -0
  188. package/.next/server/chunks/ssr/{node_modules_8e38eac2._.js → node_modules_f0d9388d._.js} +2 -2
  189. package/.next/server/chunks/ssr/node_modules_f0d9388d._.js.map +1 -0
  190. package/.next/server/chunks/ssr/{node_modules_3e692bb2._.js → node_modules_fae6b458._.js} +2 -2
  191. package/.next/server/chunks/ssr/node_modules_fae6b458._.js.map +1 -0
  192. package/.next/server/chunks/ssr/node_modules_next_dist_35575f97._.js +3 -0
  193. package/.next/server/chunks/ssr/node_modules_next_dist_35575f97._.js.map +1 -0
  194. package/.next/server/chunks/ssr/node_modules_next_dist_b34e0340._.js +3 -0
  195. package/.next/server/chunks/ssr/node_modules_next_dist_b34e0340._.js.map +1 -0
  196. package/.next/server/chunks/ssr/src_app_credentials_page_tsx_63d8d34a._.js +1 -1
  197. package/.next/server/chunks/ssr/src_app_credentials_page_tsx_63d8d34a._.js.map +1 -1
  198. package/.next/server/chunks/ssr/src_app_session_[sessionId]_SessionPageClient_tsx_dab490d7._.js +1 -1
  199. package/.next/server/chunks/ssr/src_app_session_[sessionId]_SessionPageClient_tsx_dab490d7._.js.map +1 -1
  200. package/.next/server/chunks/ssr/src_components_GitRepoSelector_tsx_05c81afa._.js +3 -3
  201. package/.next/server/chunks/ssr/src_components_GitRepoSelector_tsx_05c81afa._.js.map +1 -1
  202. package/.next/server/chunks/ssr/src_components_git_history-view_tsx_fd62126a._.js +6 -6
  203. package/.next/server/chunks/ssr/src_components_git_history-view_tsx_fd62126a._.js.map +1 -1
  204. package/.next/server/pages/404.html +2 -2
  205. package/.next/server/pages/500.html +2 -2
  206. package/.next/server/server-reference-manifest.js +1 -1
  207. package/.next/server/server-reference-manifest.json +77 -48
  208. package/.next/static/chunks/15bbad1a4cefc870.js +3 -0
  209. package/.next/static/chunks/{db4cb4eb290e3be9.js → 2ca45fcc772c4ea0.js} +2 -2
  210. package/.next/static/chunks/3df671a7fdd91e3e.js +1 -0
  211. package/.next/static/chunks/53f66f12a3d0dc7f.js +3 -0
  212. package/.next/static/chunks/6242d36c3f387ddb.js +1 -0
  213. package/.next/static/chunks/697655e0e9336655.js +1 -0
  214. package/.next/static/chunks/c08840e14b1e627c.css +1 -0
  215. package/.next/static/chunks/d6c7a0b35251160d.js +8 -0
  216. package/.next/static/chunks/dcba19c95b8bc155.js +1 -0
  217. package/.next/static/chunks/e45cecb04475a86a.js +9 -0
  218. package/.next/static/chunks/f31a3f4a435e3f86.js +3 -0
  219. package/README.md +2 -1
  220. package/bin/viba.mjs +9 -5
  221. package/package.json +1 -1
  222. package/.next/server/chunks/[externals]__7ece43c5._.js +0 -3
  223. package/.next/server/chunks/ssr/[root-of-the-server]__0ed2deb1._.js +0 -3
  224. package/.next/server/chunks/ssr/[root-of-the-server]__a65a3900._.js +0 -3
  225. package/.next/server/chunks/ssr/_2eaa7035._.js +0 -3
  226. package/.next/server/chunks/ssr/_2eaa7035._.js.map +0 -1
  227. package/.next/server/chunks/ssr/_4343fa01._.js +0 -3
  228. package/.next/server/chunks/ssr/_4343fa01._.js.map +0 -1
  229. package/.next/server/chunks/ssr/_a07f93fb._.js.map +0 -1
  230. package/.next/server/chunks/ssr/_ebf4c61c._.js.map +0 -1
  231. package/.next/server/chunks/ssr/_ff20dbae._.js +0 -3
  232. package/.next/server/chunks/ssr/_ff20dbae._.js.map +0 -1
  233. package/.next/server/chunks/ssr/_next-internal_server_app_git_history_page_actions_9e9b26bc.js +0 -3
  234. package/.next/server/chunks/ssr/_next-internal_server_app_git_history_page_actions_9e9b26bc.js.map +0 -1
  235. package/.next/server/chunks/ssr/_next-internal_server_app_git_page_actions_511f286b.js +0 -3
  236. package/.next/server/chunks/ssr/_next-internal_server_app_git_page_actions_511f286b.js.map +0 -1
  237. package/.next/server/chunks/ssr/node_modules_3e692bb2._.js.map +0 -1
  238. package/.next/server/chunks/ssr/node_modules_50fa454f._.js +0 -5
  239. package/.next/server/chunks/ssr/node_modules_50fa454f._.js.map +0 -1
  240. package/.next/server/chunks/ssr/node_modules_8e38eac2._.js.map +0 -1
  241. package/.next/server/chunks/ssr/node_modules_bf7b09f8._.js.map +0 -1
  242. package/.next/server/chunks/ssr/node_modules_next_dist_0ff44e32._.js.map +0 -1
  243. package/.next/server/chunks/ssr/node_modules_next_dist_f6fd30d1._.js +0 -3
  244. package/.next/server/chunks/ssr/node_modules_next_dist_f6fd30d1._.js.map +0 -1
  245. package/.next/server/chunks/ssr/src_408d74ba._.js +0 -3
  246. package/.next/server/chunks/ssr/src_408d74ba._.js.map +0 -1
  247. package/.next/server/chunks/ssr/src_49325427._.js +0 -3
  248. package/.next/server/chunks/ssr/src_49325427._.js.map +0 -1
  249. package/.next/static/chunks/1ca050861ead915f.js +0 -3
  250. package/.next/static/chunks/4aab1f3ea2ed1aef.js +0 -1
  251. package/.next/static/chunks/4de7bc5a00a1aed9.js +0 -3
  252. package/.next/static/chunks/5e0dada5236f9065.js +0 -8
  253. package/.next/static/chunks/73f859ef915277c7.js +0 -3
  254. package/.next/static/chunks/74f887e69c1fcefa.js +0 -9
  255. package/.next/static/chunks/977137e155012c13.js +0 -1
  256. package/.next/static/chunks/b18cc1247b979318.js +0 -1
  257. package/.next/static/chunks/e5bcfa7f94c34b77.js +0 -1
  258. package/.next/static/chunks/eec24a7b35c2d7bd.css +0 -1
  259. /package/.next/server/chunks/{[externals]__7ece43c5._.js.map → [externals]__4610b07e._.js.map} +0 -0
  260. /package/.next/server/chunks/{[root-of-the-server]__51f9ab28._.js.map → [root-of-the-server]__093d29e3._.js.map} +0 -0
  261. /package/.next/server/chunks/{[root-of-the-server]__f52f1c06._.js.map → [root-of-the-server]__2bdd2171._.js.map} +0 -0
  262. /package/.next/server/chunks/{[root-of-the-server]__ceda8fbc._.js.map → [root-of-the-server]__34da758c._.js.map} +0 -0
  263. /package/.next/server/chunks/{[root-of-the-server]__9af2c9bf._.js.map → [root-of-the-server]__5ebd9b2a._.js.map} +0 -0
  264. /package/.next/server/chunks/{[root-of-the-server]__3ffc9919._.js.map → [root-of-the-server]__6a2576a8._.js.map} +0 -0
  265. /package/.next/server/chunks/{[root-of-the-server]__5b08b37e._.js.map → [root-of-the-server]__7147e7f8._.js.map} +0 -0
  266. /package/.next/server/chunks/{[root-of-the-server]__1bf60374._.js.map → [root-of-the-server]__93d494cc._.js.map} +0 -0
  267. /package/.next/server/chunks/{[root-of-the-server]__8b29248a._.js.map → [root-of-the-server]__952874bc._.js.map} +0 -0
  268. /package/.next/server/chunks/ssr/{[root-of-the-server]__5be652da._.js.map → [root-of-the-server]__35dc6469._.js.map} +0 -0
  269. /package/.next/server/chunks/ssr/{[root-of-the-server]__e86a1b81._.js.map → [root-of-the-server]__79ab29ee._.js.map} +0 -0
  270. /package/.next/server/chunks/ssr/{[root-of-the-server]__96a8b4aa._.js.map → [root-of-the-server]__905c5090._.js.map} +0 -0
  271. /package/.next/static/{SPowgKQ4GVFmr1hEouu16 → f6hBCO8U8SWC5F77QTqGY}/_buildManifest.js +0 -0
  272. /package/.next/static/{SPowgKQ4GVFmr1hEouu16 → f6hBCO8U8SWC5F77QTqGY}/_clientMiddlewareManifest.json +0 -0
  273. /package/.next/static/{SPowgKQ4GVFmr1hEouu16 → f6hBCO8U8SWC5F77QTqGY}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/app/session/%5BsessionId%5D/SessionPageClient.tsx","../../../../src/app/actions/data%3Ac2db46%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Ab653d5%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Ae5ca7f%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Ac35fd0%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A05305b%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A2e1ea9%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A4f71ac%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Ae33955%20%3Ctext/javascript%3E","../../../../src/components/SessionRepoViewer.tsx","../../../../src/components/SessionView.tsx","../../../../src/app/actions/data%3A562eea%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Abc2f33%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A8987c2%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A29f539%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Acce26e%20%3Ctext/javascript%3E","../../../../src/lib/url.ts","../../../../src/lib/shell.ts","../../../../node_modules/lucide-react/src/icons/chevron-left.ts","../../../../src/lib/terminal-session.ts","../../../../node_modules/lucide-react/src/icons/grip.ts","../../../../node_modules/lucide-react/src/icons/refresh-cw.ts","../../../../node_modules/lucide-react/src/icons/text-cursor-input.ts","../../../../node_modules/lucide-react/src/icons/rotate-cw.ts","../../../../node_modules/lucide-react/src/icons/arrow-right.ts","../../../../node_modules/lucide-react/src/icons/git-pull-request-arrow.ts","../../../../node_modules/lucide-react/src/icons/play.ts","../../../../node_modules/lucide-react/src/icons/mouse-pointer-2.ts","../../../../node_modules/lucide-react/src/icons/folder-open.ts","../../../../node_modules/lucide-react/src/icons/git-merge.ts","../../../../node_modules/lucide-react/src/icons/scroll-text.ts","../../../../src/hooks/useTerminalLink.ts"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useState } from 'react';\nimport { useRouter, useParams } from 'next/navigation';\nimport { SessionView } from '@/components/SessionView';\nimport { consumeSessionLaunchContext, getSessionMetadata, SessionMetadata, markSessionInitialized } from '@/app/actions/session';\nimport { getSessionTerminalSources, startTtydProcess } from '@/app/actions/git';\n\ntype SessionNotificationPayload = {\n type: 'session-notification';\n sessionId: string;\n title: string;\n description: string;\n timestamp: string;\n};\n\nexport default function SessionPage() {\n const params = useParams<{ sessionId: string }>();\n const sessionIdParam = params.sessionId;\n const sessionId = Array.isArray(sessionIdParam) ? sessionIdParam[0] : sessionIdParam;\n const router = useRouter();\n\n const [metadata, setMetadata] = useState<SessionMetadata | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [terminalSources, setTerminalSources] = useState<{\n agentTerminalSrc: string;\n floatingTerminalSrc: string;\n } | null>(null);\n\n // Startup params — only populated on first open (initialized === false)\n const [initialMessage, setInitialMessage] = useState<string | undefined>(undefined);\n const [startupScript, setStartupScript] = useState<string | undefined>(undefined);\n const [contextTitle, setContextTitle] = useState<string | undefined>(undefined);\n const [contextAgentProvider, setContextAgentProvider] = useState<string | undefined>(undefined);\n const [contextSessionMode, setContextSessionMode] = useState<'fast' | 'plan' | undefined>(undefined);\n const [contextAttachmentPaths, setContextAttachmentPaths] = useState<string[]>([]);\n\n // True = send --resume to agent; False = send fresh start params\n const [isResume, setIsResume] = useState<boolean>(true);\n const [terminalPersistenceMode, setTerminalPersistenceMode] = useState<'tmux' | 'shell'>('shell');\n\n const handleOpenSessionNotification = useCallback(() => {\n if (!sessionId) return;\n\n window.focus();\n const targetPath = `/session/${sessionId}`;\n if (window.location.pathname !== targetPath) {\n router.push(targetPath);\n }\n }, [router, sessionId]);\n\n useEffect(() => {\n document.documentElement.classList.add('session-page');\n return () => {\n document.documentElement.classList.remove('session-page');\n };\n }, []);\n\n useEffect(() => {\n if (!sessionId) return;\n\n let cancelled = false;\n let socket: WebSocket | null = null;\n let reconnectTimer: number | null = null;\n let reconnectAttempt = 0;\n let browserNotification: Notification | null = null;\n\n const clearReconnectTimer = () => {\n if (reconnectTimer === null) return;\n window.clearTimeout(reconnectTimer);\n reconnectTimer = null;\n };\n\n const scheduleReconnect = () => {\n if (cancelled) return;\n const delay = Math.min(10000, 1000 * (2 ** reconnectAttempt));\n reconnectAttempt += 1;\n reconnectTimer = window.setTimeout(() => {\n reconnectTimer = null;\n void connect();\n }, delay);\n };\n\n const showBrowserNotification = async (payload: SessionNotificationPayload) => {\n if (!('Notification' in window)) return;\n\n let permission = Notification.permission;\n if (permission === 'default') {\n permission = await Notification.requestPermission();\n }\n if (permission !== 'granted') return;\n\n if (browserNotification) {\n browserNotification.close();\n }\n\n browserNotification = new Notification(payload.title, {\n body: payload.description,\n tag: `viba-session-notification-${payload.sessionId}`,\n });\n browserNotification.onclick = (event) => {\n event.preventDefault();\n handleOpenSessionNotification();\n browserNotification?.close();\n };\n };\n\n const handleIncomingNotification = (payload: SessionNotificationPayload) => {\n void showBrowserNotification(payload);\n };\n\n const connect = async () => {\n try {\n const response = await fetch(\n `/api/notifications/socket?sessionId=${encodeURIComponent(sessionId)}`,\n { cache: 'no-store' }\n );\n if (!response.ok) {\n throw new Error('Failed to initialize notification socket');\n }\n\n const data = await response.json() as { wsUrl?: string };\n if (!data.wsUrl) {\n throw new Error('Notification socket URL missing');\n }\n\n if (cancelled) return;\n\n socket = new WebSocket(data.wsUrl);\n socket.onopen = () => {\n reconnectAttempt = 0;\n clearReconnectTimer();\n };\n socket.onerror = () => {\n socket?.close();\n };\n socket.onclose = () => {\n if (cancelled) return;\n scheduleReconnect();\n };\n socket.onmessage = (event) => {\n try {\n const payload = JSON.parse(event.data as string) as Partial<SessionNotificationPayload>;\n if (\n payload.type !== 'session-notification' ||\n payload.sessionId !== sessionId ||\n typeof payload.title !== 'string' ||\n !payload.title.trim() ||\n typeof payload.description !== 'string' ||\n !payload.description.trim() ||\n typeof payload.timestamp !== 'string'\n ) {\n return;\n }\n\n handleIncomingNotification(payload as SessionNotificationPayload);\n } catch {\n // Ignore malformed notification messages.\n }\n };\n } catch {\n scheduleReconnect();\n }\n };\n\n void connect();\n\n return () => {\n cancelled = true;\n clearReconnectTimer();\n socket?.close();\n browserNotification?.close();\n };\n }, [handleOpenSessionNotification, sessionId]);\n\n useEffect(() => {\n if (!sessionId) return;\n\n const loadSession = async () => {\n try {\n setTerminalSources(null);\n\n // Ensure ttyd is running\n const ttydResult = await startTtydProcess();\n if (!ttydResult.success) {\n setError('Failed to start terminal service');\n setLoading(false);\n return;\n }\n setTerminalPersistenceMode(ttydResult.persistenceMode === 'tmux' ? 'tmux' : 'shell');\n\n const data = await getSessionMetadata(sessionId);\n if (!data) {\n setError('Session not found');\n setLoading(false);\n return;\n }\n\n setMetadata(data);\n const resolvedTerminalSources = await getSessionTerminalSources(\n data.sessionName,\n data.repoPath,\n data.agent,\n );\n setTerminalSources(resolvedTerminalSources);\n\n // Determine fresh start vs resume purely from the initialized flag:\n // - initialized === false → first open, send startup params\n // - initialized === true → already started before, resume\n // - initialized === undefined → legacy session (no flag), treat as resume\n const isFirstOpen = data.initialized === false;\n\n if (isFirstOpen) {\n // Consume the launch context (startup params) written by GitRepoSelector\n const contextResult = await consumeSessionLaunchContext(sessionId);\n if (contextResult.success && contextResult.context) {\n const ctx = contextResult.context;\n setInitialMessage(ctx.initialMessage);\n setStartupScript(ctx.startupScript);\n setContextTitle(ctx.title);\n setContextAgentProvider(ctx.agentProvider);\n setContextSessionMode(ctx.sessionMode);\n const launchAttachmentPaths = (ctx.attachmentPaths || [])\n .map((entry) => entry.trim())\n .filter(Boolean);\n const resolvedAttachmentPaths = launchAttachmentPaths.length > 0\n ? Array.from(new Set(launchAttachmentPaths))\n : Array.from(\n new Set(\n (ctx.attachmentNames || [])\n .map((name) => name.trim())\n .filter(Boolean)\n .map((name) => `${data.worktreePath}-attachments/${name}`)\n )\n );\n setContextAttachmentPaths(resolvedAttachmentPaths);\n }\n // Whether or not we got context, this is a fresh start\n setIsResume(false);\n } else {\n // Already initialized (or legacy) — resume\n setIsResume(true);\n }\n\n setLoading(false);\n } catch (e) {\n console.error('Failed to load session:', e);\n setError('Failed to load session');\n setLoading(false);\n }\n };\n\n loadSession();\n }, [sessionId]);\n\n const handleExit = (force?: boolean) => {\n if (force) {\n // Force a full page navigation — used after cleanup where\n // router.push can get stuck due to iframe teardown state\n window.location.href = '/';\n } else {\n router.push('/');\n }\n };\n\n // Called by SessionView once the agent command has been sent for the first time\n const handleSessionStart = async () => {\n if (sessionId) {\n await markSessionInitialized(sessionId);\n }\n };\n\n if (loading) {\n return (\n <div className=\"flex h-screen w-full items-center justify-center bg-[#f6f6f8] dark:bg-[#0d1117]\">\n <div className=\"flex flex-col items-center gap-4\">\n <span className=\"loading loading-spinner loading-lg text-primary\"></span>\n <p className=\"opacity-60 dark:text-slate-400\">Loading session...</p>\n </div>\n </div>\n );\n }\n\n if (error || !metadata) {\n return (\n <div className=\"flex h-screen w-full items-center justify-center bg-[#f6f6f8] dark:bg-[#0d1117]\">\n <div className=\"card w-96 border border-slate-200 bg-white shadow-xl dark:border-[#30363d] dark:bg-[#161b22]\">\n <div className=\"card-body items-center text-center\">\n <h2 className=\"card-title text-error dark:text-red-300\">Error</h2>\n <p className=\"text-slate-700 dark:text-slate-300\">{error || 'Session not found'}</p>\n <div className=\"card-actions justify-end\">\n <button className=\"btn btn-primary\" onClick={() => handleExit()}>Back to Home</button>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n if (!terminalSources) {\n return (\n <div className=\"flex h-screen w-full items-center justify-center bg-[#f6f6f8] dark:bg-[#0d1117]\">\n <div className=\"flex flex-col items-center gap-4\">\n <span className=\"loading loading-spinner loading-lg text-primary\"></span>\n <p className=\"opacity-60 dark:text-slate-400\">Initializing terminals...</p>\n </div>\n </div>\n );\n }\n\n return (\n <SessionView\n repo={metadata.repoPath}\n worktree={metadata.worktreePath}\n branch={metadata.branchName}\n baseBranch={metadata.baseBranch}\n sessionName={metadata.sessionName}\n agent={contextAgentProvider || metadata.agent}\n startupScript={startupScript}\n devServerScript={metadata.devServerScript}\n initialMessage={initialMessage}\n attachmentPaths={contextAttachmentPaths}\n title={contextTitle || metadata.title}\n sessionMode={contextSessionMode}\n onExit={handleExit}\n isResume={isResume}\n terminalPersistenceMode={terminalPersistenceMode}\n onSessionStart={handleSessionStart}\n agentTerminalSrc={terminalSources.agentTerminalSrc}\n floatingTerminalSrc={terminalSources.floatingTerminalSrc}\n />\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"408332446dc02dad408161688cbb401a72d91ebb97\":\"deleteSessionInBackground\"},\"src/app/actions/session.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_11=/*#__PURE__*/createServerReference(\"408332446dc02dad408161688cbb401a72d91ebb97\",callServer,void 0,findSourceMapURL,\"deleteSessionInBackground\");export{$$RSC_SERVER_ACTION_11 as deleteSessionInBackground};","/* __next_internal_action_entry_do_not_use__ [{\"407e25b80d6fb52c1cb4f5b9b5e2dfb01dc65fb043\":\"listSessionBaseBranches\"},\"src/app/actions/session.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_16=/*#__PURE__*/createServerReference(\"407e25b80d6fb52c1cb4f5b9b5e2dfb01dc65fb043\",callServer,void 0,findSourceMapURL,\"listSessionBaseBranches\");export{$$RSC_SERVER_ACTION_16 as listSessionBaseBranches};","/* __next_internal_action_entry_do_not_use__ [{\"4028996676377f1857cb91ef1125bd419c73c5fea4\":\"mergeSessionToBase\"},\"src/app/actions/session.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_12=/*#__PURE__*/createServerReference(\"4028996676377f1857cb91ef1125bd419c73c5fea4\",callServer,void 0,findSourceMapURL,\"mergeSessionToBase\");export{$$RSC_SERVER_ACTION_12 as mergeSessionToBase};","/* __next_internal_action_entry_do_not_use__ [{\"40d8852935ba1f9d4e40138ba0d8d75f8ecef45ebf\":\"rebaseSessionOntoBase\"},\"src/app/actions/session.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_13=/*#__PURE__*/createServerReference(\"40d8852935ba1f9d4e40138ba0d8d75f8ecef45ebf\",callServer,void 0,findSourceMapURL,\"rebaseSessionOntoBase\");export{$$RSC_SERVER_ACTION_13 as rebaseSessionOntoBase};","/* __next_internal_action_entry_do_not_use__ [{\"605fa32f4968d64da5aa738537f6feef5e5ac5546c\":\"updateSessionBaseBranch\"},\"src/app/actions/session.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_17=/*#__PURE__*/createServerReference(\"605fa32f4968d64da5aa738537f6feef5e5ac5546c\",callServer,void 0,findSourceMapURL,\"updateSessionBaseBranch\");export{$$RSC_SERVER_ACTION_17 as updateSessionBaseBranch};","/* __next_internal_action_entry_do_not_use__ [{\"60a5549138685083ba90bb520c385341df13eb74f8\":\"writeSessionPromptFile\"},\"src/app/actions/session.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_1=/*#__PURE__*/createServerReference(\"60a5549138685083ba90bb520c385341df13eb74f8\",callServer,void 0,findSourceMapURL,\"writeSessionPromptFile\");export{$$RSC_SERVER_ACTION_1 as writeSessionPromptFile};","/* __next_internal_action_entry_do_not_use__ [{\"7fa057c23b672919a4468d94651b3e672f88229d11\":\"setTmuxSessionMouseMode\"},\"src/app/actions/git.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_11=/*#__PURE__*/createServerReference(\"7fa057c23b672919a4468d94651b3e672f88229d11\",callServer,void 0,findSourceMapURL,\"setTmuxSessionMouseMode\");export{$$RSC_SERVER_ACTION_11 as setTmuxSessionMouseMode};","/* __next_internal_action_entry_do_not_use__ [{\"7f8957576d4459d07a500bc0f13b9d9cc9666aa369\":\"setTmuxSessionStatusVisibility\"},\"src/app/actions/git.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_12=/*#__PURE__*/createServerReference(\"7f8957576d4459d07a500bc0f13b9d9cc9666aa369\",callServer,void 0,findSourceMapURL,\"setTmuxSessionStatusVisibility\");export{$$RSC_SERVER_ACTION_12 as setTmuxSessionStatusVisibility};","'use client';\n\nimport { useMemo, useState } from 'react';\nimport { RefreshCw } from 'lucide-react';\nimport { useGitBranches, useGitLog, useGitMergeBase } from '@/hooks/use-git';\nimport { Commit } from '@/lib/types';\nimport { CommitChangesView } from './git/commit-changes-view';\n\nfunction formatCommitDate(value: string): string {\n const parsed = Date.parse(value);\n if (Number.isNaN(parsed)) return value;\n return new Date(parsed).toLocaleString();\n}\n\nfunction commitLabel(commit: Commit): string {\n return `${commit.hash} ${commit.message}`.trim();\n}\n\ntype SessionRepoViewerProps = {\n repoPath: string;\n branchHint?: string;\n baseBranchHint?: string;\n};\n\ntype CommitSelectionState =\n | { mode: 'auto'; hash: null }\n | { mode: 'manual'; hash: string }\n | { mode: 'unselected'; hash: null };\n\nexport function SessionRepoViewer({ repoPath, branchHint, baseBranchHint }: SessionRepoViewerProps) {\n const [selection, setSelection] = useState<CommitSelectionState>({ mode: 'auto', hash: null });\n const { data: branchData } = useGitBranches(repoPath);\n const {\n data: log,\n isLoading,\n isFetching,\n isError,\n error,\n refetch,\n } = useGitLog(repoPath, 200, { scope: 'current' });\n const allCommits = useMemo(() => log?.all ?? [], [log]);\n const currentBranch = branchData?.current?.trim() || branchHint?.trim() || 'unknown';\n const currentBranchRef = branchData?.current?.trim() || branchHint?.trim() || null;\n const baseBranchRef = baseBranchHint?.trim() || null;\n const { data: mergeBaseHash } = useGitMergeBase(repoPath, baseBranchRef, currentBranchRef);\n const commits = useMemo(() => {\n if (!mergeBaseHash) return allCommits;\n const normalizedMergeBase = mergeBaseHash.trim();\n if (!normalizedMergeBase) return allCommits;\n\n const branchPointIndex = allCommits.findIndex((commit) =>\n normalizedMergeBase.startsWith(commit.hash) || commit.hash.startsWith(normalizedMergeBase)\n );\n if (branchPointIndex < 0) return allCommits;\n return allCommits.slice(0, branchPointIndex + 1);\n }, [allCommits, mergeBaseHash]);\n const selectedCommitHash = useMemo(() => {\n if (commits.length === 0) return null;\n if (selection.mode === 'unselected') return null;\n if (selection.mode === 'manual' && commits.some((commit) => commit.hash === selection.hash)) {\n return selection.hash;\n }\n return commits[0].hash;\n }, [commits, selection]);\n\n const handleCommitClick = (commitHash: string) => {\n if (selectedCommitHash === commitHash) {\n setSelection({ mode: 'unselected', hash: null });\n return;\n }\n setSelection({ mode: 'manual', hash: commitHash });\n };\n\n return (\n <div className=\"flex h-full min-h-0 flex-col bg-slate-50 dark:bg-[#0d1117]\">\n <div className=\"flex min-h-0 flex-[2] flex-col border-b border-slate-200 dark:border-[#30363d]\">\n <div className=\"flex h-9 shrink-0 items-center justify-between border-b border-slate-200 px-3 text-[11px] font-semibold text-slate-600 dark:border-[#30363d] dark:bg-[#161b22] dark:text-slate-400\">\n <div className=\"flex min-w-0 items-center gap-2 uppercase tracking-wide\">\n <span className=\"h-2 w-2 shrink-0 rounded-full bg-emerald-500\"></span>\n <span className=\"truncate\">Repo Diff</span>\n <span className=\"truncate opacity-70 normal-case\" title={currentBranch}>\n {currentBranch}\n </span>\n </div>\n <span className=\"shrink-0 text-[10px] opacity-70\">\n {commits.length} commit{commits.length === 1 ? '' : 's'}\n </span>\n </div>\n <div className=\"min-h-0 flex-1\">\n <CommitChangesView\n repoPath={repoPath}\n commitHash={selectedCommitHash}\n showWorkingTreeWhenNoCommit\n fileListWidthClass=\"w-52\"\n />\n </div>\n </div>\n\n <div className=\"flex min-h-0 flex-1 flex-col\">\n <div className=\"flex h-9 shrink-0 items-center justify-between border-b border-slate-200 px-3 text-[11px] font-semibold text-slate-600 dark:border-[#30363d] dark:bg-[#161b22] dark:text-slate-400\">\n <span className=\"uppercase tracking-wide\">Commit History</span>\n <button\n type=\"button\"\n className=\"btn btn-ghost btn-xs h-6 min-h-6 w-7 border-none p-0 text-slate-600 hover:bg-slate-100 dark:text-slate-300 dark:hover:bg-[#30363d]/60\"\n onClick={() => void refetch()}\n title=\"Refresh commit history\"\n aria-label=\"Refresh commit history\"\n >\n <RefreshCw className={`h-3.5 w-3.5 ${isFetching ? 'animate-spin' : ''}`} />\n </button>\n </div>\n <div className=\"min-h-0 flex-1 overflow-y-auto\">\n {isLoading ? (\n <div className=\"flex h-full items-center justify-center text-xs text-slate-500 dark:text-slate-400\">\n <span className=\"loading loading-spinner loading-sm\"></span>\n </div>\n ) : isError ? (\n <div className=\"flex h-full items-center justify-center px-6 text-center text-xs text-red-500 dark:text-red-300\">\n {error instanceof Error ? error.message : 'Failed to load commit history'}\n </div>\n ) : commits.length === 0 ? (\n <div className=\"flex h-full items-center justify-center px-6 text-center text-xs text-slate-500 dark:text-slate-400\">\n No commits found on this branch.\n </div>\n ) : (\n <div className=\"divide-y divide-slate-200 dark:divide-[#30363d]\">\n {commits.map((commit) => {\n const isSelected = selectedCommitHash === commit.hash;\n return (\n <button\n key={commit.hash}\n type=\"button\"\n onClick={() => handleCommitClick(commit.hash)}\n className={`w-full px-3 py-2 text-left transition-colors ${isSelected\n ? 'bg-blue-100/80 dark:bg-[#1f2a3d]'\n : 'hover:bg-slate-100 dark:hover:bg-[#161b22]'\n }`}\n title={commitLabel(commit)}\n >\n <div className=\"flex items-center gap-2 text-[11px] font-mono text-slate-500 dark:text-slate-400\">\n <span className=\"rounded bg-slate-200 px-1.5 py-0.5 dark:bg-[#30363d]\">{commit.hash}</span>\n <span className=\"truncate\">{formatCommitDate(commit.date)}</span>\n </div>\n <div className=\"mt-1 truncate text-xs font-medium text-slate-800 dark:text-slate-100\">\n {commit.message || '(no subject)'}\n </div>\n <div className=\"truncate text-[11px] text-slate-500 dark:text-slate-400\">\n {commit.author_name}\n </div>\n </button>\n );\n })}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport React, { useRef, useState, useEffect, useCallback, useMemo } from 'react';\n// import { useRouter } from 'next/navigation';\nimport {\n deleteSessionInBackground,\n getSessionDivergence,\n listSessionBaseBranches,\n mergeSessionToBase,\n rebaseSessionOntoBase,\n updateSessionBaseBranch,\n writeSessionPromptFile\n} from '@/app/actions/session';\nimport { setTmuxSessionMouseMode, setTmuxSessionStatusVisibility } from '@/app/actions/git';\nimport { getConfig, updateConfig } from '@/app/actions/config';\nimport { Trash2, ExternalLink, Play, GitMerge, GitPullRequestArrow, GitBranch, ArrowUp, ArrowDown, FolderOpen, ChevronLeft, ChevronRight, Grip, ChevronDown, Plus, MousePointer2, ArrowLeft, ArrowRight, RotateCw, ScrollText, TextCursorInput, X } from 'lucide-react';\nimport SessionFileBrowser from './SessionFileBrowser';\nimport { SessionRepoViewer } from './SessionRepoViewer';\nimport { getBaseName, isWindowsAbsolutePath } from '@/lib/path';\nimport { notifySessionsUpdated } from '@/lib/session-updates';\nimport { buildTtydTerminalSrc } from '@/lib/terminal-session';\nimport { normalizePreviewUrl } from '@/lib/url';\nimport { useTerminalLink, type TerminalWindow } from '@/hooks/useTerminalLink';\nimport { quoteShellArg } from '@/lib/shell';\n\nconst SUPPORTED_IDES = [\n { id: 'vscode', name: 'VS Code', protocol: 'vscode' },\n { id: 'cursor', name: 'Cursor', protocol: 'cursor' },\n { id: 'windsurf', name: 'Windsurf', protocol: 'windsurf' },\n { id: 'antigravity', name: 'Antigravity', protocol: 'antigravity' },\n];\n\n\ntype CleanupPhase = 'idle' | 'error';\n\ntype PreviewNavigationAction = 'back' | 'forward' | 'reload';\ntype TerminalBootstrapSlot = 'agent' | 'terminal';\ntype TerminalBootstrapState = 'idle' | 'in_progress' | 'done';\ntype TerminalBootstrapRegistry = Record<string, TerminalBootstrapState>;\ntype TerminalInteractionMode = 'scroll' | 'select';\ntype TerminalOnWriteParsedDisposable = { dispose?: () => void };\ntype TerminalWithOnWriteParsed = NonNullable<TerminalWindow['term']> & {\n onWriteParsed?: (callback: () => void) => TerminalOnWriteParsedDisposable | void;\n};\ntype TerminalWithClearLineShortcutState = NonNullable<TerminalWindow['term']> & {\n __vibaClearLineShortcutInstalled?: boolean;\n};\n\nconst TERMINAL_SIZE_STORAGE_KEY = 'viba-terminal-size';\nconst SPLIT_RATIO_STORAGE_KEY = 'viba-agent-preview-split-ratio';\nconst RIGHT_PANEL_COLLAPSED_STORAGE_KEY = 'viba-right-panel-collapsed';\nconst DEFAULT_AGENT_PANE_RATIO = 0.5;\nconst TERMINAL_HEADER_HEIGHT = 36;\nconst TERMINAL_BOOTSTRAP_STORAGE_PREFIX = 'viba:terminal-bootstrap:';\nconst TERMINAL_BOOTSTRAP_RUNTIME_KEY = '__vibaTerminalBootstrapRegistry';\nconst SHELL_PROMPT_PATTERN = /(?:\\$|%|#|>) $/;\nconst TERMINAL_THEME_LIGHT = {\n background: '#ffffff',\n foreground: '#0f172a', // slate-900\n cursor: '#0f172a',\n selectionBackground: 'rgba(59, 130, 246, 0.4)',\n black: '#000000',\n red: '#cd3131',\n green: '#00BC00',\n yellow: '#949800',\n blue: '#0451a5',\n magenta: '#bc05bc',\n cyan: '#0598bc',\n white: '#555555',\n brightBlack: '#666666',\n brightRed: '#cd3131',\n brightGreen: '#14CE14',\n brightYellow: '#b5ba00',\n brightBlue: '#0451a5',\n brightMagenta: '#bc05bc',\n brightCyan: '#0598bc',\n brightWhite: '#a5a5a5'\n};\n\nconst TERMINAL_THEME_DARK = {\n background: '#0d1117',\n foreground: '#e6edf3',\n cursor: '#e6edf3',\n selectionBackground: 'rgba(59, 130, 246, 0.4)',\n black: '#484f58',\n red: '#ff7b72',\n green: '#3fb950',\n yellow: '#d29922',\n blue: '#58a6ff',\n magenta: '#bc8cff',\n cyan: '#39c5cf',\n white: '#b1bac4',\n brightBlack: '#6e7681',\n brightRed: '#ffa198',\n brightGreen: '#56d364',\n brightYellow: '#e3b341',\n brightBlue: '#79c0ff',\n brightMagenta: '#d2a8ff',\n brightCyan: '#56d4dd',\n brightWhite: '#ffffff'\n};\n\nconst PLAN_MODE_STARTUP_INSTRUCTION =\n 'Plan mode: inspect the relevant code first, present a concrete implementation plan, and wait for explicit user approval before any file edits or write commands.';\nconst AUTO_COMMIT_INSTRUCTION =\n 'After each round, if work is complete and files changed, commit all changes without confirmation. Use a commit message with a clear title and a detailed body explaining what changed and why. If GITHUB_TOKEN or GITLAB_TOKEN is set, push the current branch after committed rounds and create (or update) a pull/merge request with an appropriate title and description; include the pull/merge request link in the first push reply.';\nconst AGENT_BROWSER_SKILL_INSTRUCTION =\n 'For visual web tasks, use the `agent-browser` skill (https://skills.sh/vercel-labs/agent-browser/agent-browser).';\nconst SYSTEMATIC_DEBUGGING_SKILL_INSTRUCTION =\n 'For bugfix/debugging tasks, use the `systematic-debugging` skill (https://github.com/obra/superpowers).';\nconst VISUAL_EVIDENCE_INSTRUCTION =\n 'When working on a visual-related feature or bugfix in a web project, after coding is complete, use `agent-browser` or equivalent Chrome MCP tooling to load the relevant page, take screenshot(s), and include them as evidence in the pull/merge request.';\nconst NOTIFICATION_INSTRUCTION =\n 'When your task is completed or you need user attention (for plan approval, permissions, or blockers), send a notification to the matching Viba session.';\n\nconst clampAgentPaneRatio = (value: number): number => Math.max(0.2, Math.min(0.8, value));\n\ntype PreviewComponentStackEntry = {\n name?: unknown;\n source?: {\n fileName?: unknown;\n } | null;\n};\n\nconst normalizePickerSourceFileName = (value: string): string => {\n let normalized = value.trim();\n if (!normalized) return '';\n\n normalized = normalized.replace(/[#?].*$/, '');\n\n if (/^file:\\/\\//i.test(normalized)) {\n try {\n const asUrl = new URL(normalized);\n normalized = decodeURIComponent(asUrl.pathname);\n } catch {\n // Keep original value when URL parsing fails\n }\n } else if (/^https?:\\/\\//i.test(normalized)) {\n try {\n const asUrl = new URL(normalized);\n normalized = decodeURIComponent(asUrl.pathname);\n } catch {\n // Keep original value when URL parsing fails\n }\n }\n\n normalized = normalized\n .replace(/^webpack(?:-internal)?:\\/\\/\\/?/, '')\n .replace(/^rsc:\\/\\//, '')\n .replace(/^\\(.*?\\)\\//, '')\n .replace(/^\\/\\.\\//, '/')\n .replace(/^\\.\\//, '')\n .replace(/\\\\/g, '/');\n\n return normalized.trim();\n};\n\nconst joinPath = (base: string, relative: string): string => {\n const normalizedBase = base.replace(/\\\\/g, '/').replace(/\\/+$/, '');\n const normalizedRelative = relative.replace(/\\\\/g, '/').replace(/^\\/+/, '');\n return `${normalizedBase}/${normalizedRelative}`;\n};\n\nconst resolveComponentSourcePath = (rawSourceFileName: string, workspaceRoot: string): string | null => {\n const normalizedWorkspaceRoot = workspaceRoot.trim().replace(/\\\\/g, '/').replace(/\\/+$/, '');\n if (!normalizedWorkspaceRoot) return null;\n\n const normalizedSource = normalizePickerSourceFileName(rawSourceFileName);\n if (!normalizedSource) return null;\n\n if (normalizedSource.startsWith('/') || isWindowsAbsolutePath(normalizedSource)) {\n return normalizedSource;\n }\n\n const relativeCandidates = new Set<string>();\n relativeCandidates.add(normalizedSource.replace(/^\\.\\/+/, ''));\n\n const srcIndex = normalizedSource.indexOf('/src/');\n if (srcIndex >= 0) {\n relativeCandidates.add(normalizedSource.slice(srcIndex + 1));\n }\n\n if (normalizedSource.startsWith('src/')) {\n relativeCandidates.add(normalizedSource);\n }\n\n for (const relative of relativeCandidates) {\n if (!relative) continue;\n return joinPath(normalizedWorkspaceRoot, relative);\n }\n\n return null;\n};\n\nconst buildComponentReferenceText = (reactStack: unknown[], workspaceRoot: string): string | null => {\n for (const entry of reactStack) {\n if (!entry || typeof entry !== 'object') continue;\n\n const componentEntry = entry as PreviewComponentStackEntry;\n const componentName = typeof componentEntry.name === 'string' ? componentEntry.name.trim() : '';\n if (!componentName) continue;\n\n const sourceFileName = typeof componentEntry.source?.fileName === 'string'\n ? componentEntry.source.fileName.trim()\n : '';\n const sourcePath = sourceFileName ? resolveComponentSourcePath(sourceFileName, workspaceRoot) : null;\n\n if (sourcePath) {\n return `${componentName} (${sourcePath})`;\n }\n }\n\n return null;\n};\n\nconst normalizeComponentLookupName = (value: string): string => {\n const trimmed = value.trim();\n if (!trimmed) return '';\n\n const match = trimmed.match(/[A-Za-z_$][\\w$]*/);\n return match ? match[0] : '';\n};\n\nexport interface SessionViewProps {\n repo: string;\n worktree: string;\n branch: string;\n baseBranch?: string;\n sessionName: string;\n agent?: string;\n startupScript?: string;\n devServerScript?: string;\n initialMessage?: string;\n attachmentPaths?: string[];\n attachmentNames?: string[];\n title?: string;\n sessionMode?: 'fast' | 'plan';\n onExit: (force?: boolean) => void;\n isResume?: boolean;\n terminalPersistenceMode?: 'tmux' | 'shell';\n onSessionStart?: () => void;\n agentTerminalSrc?: string;\n floatingTerminalSrc?: string;\n}\n\nexport function SessionView({\n repo,\n worktree,\n branch,\n baseBranch,\n sessionName,\n agent,\n startupScript,\n devServerScript,\n initialMessage,\n attachmentPaths,\n attachmentNames,\n title,\n sessionMode = 'fast',\n onExit,\n isResume,\n terminalPersistenceMode = 'shell',\n onSessionStart,\n agentTerminalSrc: agentTerminalSrcOverride,\n floatingTerminalSrc: floatingTerminalSrcOverride,\n}: SessionViewProps) {\n const headerButtonLabelClass = 'hidden min-[1900px]:inline';\n\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const terminalRef = useRef<HTMLIFrameElement>(null);\n const previewIframeRef = useRef<HTMLIFrameElement>(null);\n const previewAddressInputRef = useRef<HTMLInputElement>(null);\n const splitContainerRef = useRef<HTMLDivElement>(null);\n const splitResizeRef = useRef({ startX: 0, startRatio: DEFAULT_AGENT_PANE_RATIO });\n const agentFrameLinkCleanupRef = useRef<(() => void) | null>(null);\n const terminalFrameLinkCleanupRef = useRef<(() => void) | null>(null);\n const terminalProcessMonitorCleanupRef = useRef<(() => void) | null>(null);\n const terminalStartupScriptStateRef = useRef<{ injected: boolean; timer: number | null }>({\n injected: false,\n timer: null,\n });\n const agentTerminalSrc = useMemo(\n () => agentTerminalSrcOverride || buildTtydTerminalSrc(sessionName, 'agent'),\n [agentTerminalSrcOverride, sessionName],\n );\n const floatingTerminalSrc = useMemo(\n () => floatingTerminalSrcOverride || buildTtydTerminalSrc(sessionName, 'terminal'),\n [floatingTerminalSrcOverride, sessionName],\n );\n\n const terminalBootstrapStateRef = useRef<Record<TerminalBootstrapSlot, TerminalBootstrapState>>({\n agent: 'idle',\n terminal: 'idle',\n });\n const tmuxStatusAppliedRef = useRef<Record<TerminalBootstrapSlot, boolean>>({\n agent: false,\n terminal: false,\n });\n\n useEffect(() => {\n terminalBootstrapStateRef.current = {\n agent: 'idle',\n terminal: 'idle',\n };\n tmuxStatusAppliedRef.current = {\n agent: false,\n terminal: false,\n };\n if (terminalStartupScriptStateRef.current.timer !== null) {\n window.clearTimeout(terminalStartupScriptStateRef.current.timer);\n }\n terminalStartupScriptStateRef.current = {\n injected: false,\n timer: null,\n };\n }, [sessionName]);\n\n useEffect(() => {\n return () => {\n if (terminalStartupScriptStateRef.current.timer !== null) {\n window.clearTimeout(terminalStartupScriptStateRef.current.timer);\n terminalStartupScriptStateRef.current.timer = null;\n }\n };\n }, []);\n\n const getTerminalBootstrapKey = useCallback((slot: TerminalBootstrapSlot) => {\n return `${TERMINAL_BOOTSTRAP_STORAGE_PREFIX}${sessionName}:${slot}`;\n }, [sessionName]);\n\n const getRuntimeBootstrapKey = useCallback((slot: TerminalBootstrapSlot) => {\n return `${sessionName}:${slot}`;\n }, [sessionName]);\n\n const getRuntimeBootstrapRegistry = useCallback((): TerminalBootstrapRegistry | null => {\n if (typeof window === 'undefined') return null;\n const runtimeWindow = window as Window & {\n __vibaTerminalBootstrapRegistry?: TerminalBootstrapRegistry;\n };\n if (!runtimeWindow[TERMINAL_BOOTSTRAP_RUNTIME_KEY]) {\n runtimeWindow[TERMINAL_BOOTSTRAP_RUNTIME_KEY] = {};\n }\n return runtimeWindow[TERMINAL_BOOTSTRAP_RUNTIME_KEY] || null;\n }, []);\n\n const getRuntimeBootstrapState = useCallback((slot: TerminalBootstrapSlot): TerminalBootstrapState => {\n const registry = getRuntimeBootstrapRegistry();\n if (!registry) return 'idle';\n return registry[getRuntimeBootstrapKey(slot)] || 'idle';\n }, [getRuntimeBootstrapRegistry, getRuntimeBootstrapKey]);\n\n const setRuntimeBootstrapState = useCallback((slot: TerminalBootstrapSlot, state: TerminalBootstrapState): void => {\n const registry = getRuntimeBootstrapRegistry();\n if (!registry) return;\n registry[getRuntimeBootstrapKey(slot)] = state;\n }, [getRuntimeBootstrapRegistry, getRuntimeBootstrapKey]);\n\n const hasTerminalBootstrapped = useCallback((slot: TerminalBootstrapSlot): boolean => {\n if (terminalBootstrapStateRef.current[slot] === 'done') {\n return true;\n }\n if (getRuntimeBootstrapState(slot) === 'done') {\n return true;\n }\n try {\n return window.sessionStorage.getItem(getTerminalBootstrapKey(slot)) === '1';\n } catch {\n return false;\n }\n }, [getRuntimeBootstrapState, getTerminalBootstrapKey]);\n\n const beginTerminalBootstrap = useCallback((slot: TerminalBootstrapSlot): boolean => {\n const current = terminalBootstrapStateRef.current[slot];\n const runtimeState = getRuntimeBootstrapState(slot);\n if (current === 'done' || current === 'in_progress' || runtimeState === 'done' || runtimeState === 'in_progress') {\n return false;\n }\n terminalBootstrapStateRef.current[slot] = 'in_progress';\n setRuntimeBootstrapState(slot, 'in_progress');\n return true;\n }, [getRuntimeBootstrapState, setRuntimeBootstrapState]);\n\n const resetTerminalBootstrap = useCallback((slot: TerminalBootstrapSlot): void => {\n if (terminalBootstrapStateRef.current[slot] !== 'done') {\n terminalBootstrapStateRef.current[slot] = 'idle';\n }\n if (getRuntimeBootstrapState(slot) !== 'done') {\n setRuntimeBootstrapState(slot, 'idle');\n }\n }, [getRuntimeBootstrapState, setRuntimeBootstrapState]);\n\n const markTerminalBootstrapped = useCallback((slot: TerminalBootstrapSlot): void => {\n terminalBootstrapStateRef.current[slot] = 'done';\n setRuntimeBootstrapState(slot, 'done');\n try {\n window.sessionStorage.setItem(getTerminalBootstrapKey(slot), '1');\n } catch {\n // Ignore storage failures (private mode / disabled storage).\n }\n }, [getTerminalBootstrapKey, setRuntimeBootstrapState]);\n\n const isShellPromptReady = useCallback((term: TerminalWindow['term']): boolean => {\n const activeBuffer = term?.buffer?.active;\n if (!activeBuffer || typeof activeBuffer.getLine !== 'function') {\n // Fall back to ready when xterm internals are unavailable.\n return true;\n }\n\n const cursorLine = activeBuffer.baseY + activeBuffer.cursorY;\n for (let offset = 0; offset < 6; offset += 1) {\n const line = activeBuffer.getLine(cursorLine - offset);\n const text = line?.translateToString(true) ?? '';\n if (!text.trim()) continue;\n return SHELL_PROMPT_PATTERN.test(text);\n }\n return false;\n }, []);\n\n const stopTerminalProcessMonitor = useCallback(() => {\n if (terminalProcessMonitorCleanupRef.current) {\n terminalProcessMonitorCleanupRef.current();\n terminalProcessMonitorCleanupRef.current = null;\n }\n }, []);\n\n const startTerminalProcessMonitor = useCallback((\n iframe: HTMLIFrameElement,\n term: NonNullable<TerminalWindow['term']>\n ) => {\n stopTerminalProcessMonitor();\n\n let disposed = false;\n let writeDisposable: { dispose?: () => void } | null = null;\n let mutationObserver: MutationObserver | null = null;\n let intervalId: number | null = null;\n\n const updateProcessState = () => {\n if (disposed) return;\n const isRunning = !isShellPromptReady(term);\n setIsTerminalForegroundProcessRunning((current) => (current === isRunning ? current : isRunning));\n };\n\n updateProcessState();\n intervalId = window.setInterval(updateProcessState, 1000);\n\n try {\n const xterm = term as TerminalWithOnWriteParsed;\n if (typeof xterm.onWriteParsed === 'function') {\n writeDisposable = xterm.onWriteParsed(updateProcessState) || null;\n } else {\n const screen = iframe.contentDocument?.querySelector('.xterm-screen') || iframe.contentDocument?.body;\n if (screen) {\n mutationObserver = new MutationObserver(updateProcessState);\n mutationObserver.observe(screen, { childList: true, subtree: true, characterData: true });\n }\n }\n } catch (error) {\n console.error('Failed to setup terminal process monitor:', error);\n }\n\n terminalProcessMonitorCleanupRef.current = () => {\n disposed = true;\n if (intervalId !== null) {\n window.clearInterval(intervalId);\n intervalId = null;\n }\n if (writeDisposable && typeof writeDisposable.dispose === 'function') {\n writeDisposable.dispose();\n }\n mutationObserver?.disconnect();\n };\n }, [isShellPromptReady, stopTerminalProcessMonitor]);\n\n useEffect(() => {\n return () => {\n stopTerminalProcessMonitor();\n };\n }, [stopTerminalProcessMonitor]);\n\n useEffect(() => {\n setIsTerminalForegroundProcessRunning(false);\n stopTerminalProcessMonitor();\n }, [sessionName, stopTerminalProcessMonitor]);\n\n const injectTerminalStartupScript = useCallback((\n iframe: HTMLIFrameElement,\n win: TerminalWindow,\n term: NonNullable<TerminalWindow['term']>\n ): boolean => {\n if (isResume) return false;\n\n const script = startupScript?.trim();\n if (!script || terminalStartupScriptStateRef.current.injected) return false;\n\n const pressEnter = () => {\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) {\n textarea.dispatchEvent(new KeyboardEvent('keypress', {\n bubbles: true,\n cancelable: true,\n charCode: 13,\n keyCode: 13,\n key: 'Enter',\n view: win\n }));\n } else {\n term.paste('\\r');\n }\n };\n\n terminalStartupScriptStateRef.current.injected = true;\n if (terminalStartupScriptStateRef.current.timer !== null) {\n window.clearTimeout(terminalStartupScriptStateRef.current.timer);\n }\n terminalStartupScriptStateRef.current.timer = window.setTimeout(() => {\n terminalStartupScriptStateRef.current.timer = null;\n try {\n term.paste(script);\n pressEnter();\n } catch (error) {\n terminalStartupScriptStateRef.current.injected = false;\n console.error('Failed to inject startup script into terminal iframe:', error);\n }\n }, 500);\n\n return true;\n }, [isResume, startupScript]);\n\n useEffect(() => {\n if (isResume) return;\n if (!startupScript?.trim()) return;\n if (terminalStartupScriptStateRef.current.injected) return;\n\n let cancelled = false;\n\n const attemptInjection = (attempts = 0) => {\n if (cancelled || terminalStartupScriptStateRef.current.injected) return;\n if (attempts > 30) return;\n\n if (!hasTerminalBootstrapped('terminal')) {\n window.setTimeout(() => attemptInjection(attempts + 1), 200);\n return;\n }\n\n const iframe = terminalRef.current;\n if (!iframe) return;\n\n try {\n const win = iframe.contentWindow as TerminalWindow | null;\n if (win?.term) {\n injectTerminalStartupScript(iframe, win, win.term);\n return;\n }\n } catch {\n // Ignore transient iframe access errors and retry.\n }\n\n window.setTimeout(() => attemptInjection(attempts + 1), 200);\n };\n\n attemptInjection();\n return () => {\n cancelled = true;\n };\n }, [hasTerminalBootstrapped, injectTerminalStartupScript, isResume, startupScript]);\n\n const [feedback, setFeedback] = useState<string>('Initializing...');\n const [cleanupPhase, setCleanupPhase] = useState<CleanupPhase>('idle');\n const [cleanupError, setCleanupError] = useState<string | null>(null);\n const [isStartingDevServer, setIsStartingDevServer] = useState(false);\n const [isTerminalForegroundProcessRunning, setIsTerminalForegroundProcessRunning] = useState(false);\n const [isMerging, setIsMerging] = useState(false);\n const [isRebasing, setIsRebasing] = useState(false);\n const [isFileBrowserOpen, setIsFileBrowserOpen] = useState(false);\n const [lastFileBrowserPath, setLastFileBrowserPath] = useState(worktree || repo);\n const [isInsertingFilePaths, setIsInsertingFilePaths] = useState(false);\n const [currentBaseBranch, setCurrentBaseBranch] = useState(baseBranch?.trim() || '');\n const [baseBranchOptions, setBaseBranchOptions] = useState<string[]>([]);\n const [isLoadingBaseBranches, setIsLoadingBaseBranches] = useState(false);\n const isLoadingBaseBranchesRef = useRef(false);\n const [isUpdatingBaseBranch, setIsUpdatingBaseBranch] = useState(false);\n const [divergence, setDivergence] = useState({ ahead: 0, behind: 0 });\n const [isPreviewVisible, setIsPreviewVisible] = useState(true);\n const [previewInputUrl, setPreviewInputUrl] = useState('');\n const [previewUrl, setPreviewUrl] = useState('');\n const [isPreviewPickerActive, setIsPreviewPickerActive] = useState(false);\n const [isResolvingElement, setIsResolvingElement] = useState(false);\n const [isRepoViewActive, setIsRepoViewActive] = useState(false);\n const [agentPaneRatio, setAgentPaneRatio] = useState(DEFAULT_AGENT_PANE_RATIO);\n const [isSplitResizing, setIsSplitResizing] = useState(false);\n const [isRightPanelCollapsed, setIsRightPanelCollapsed] = useState(true);\n\n const [isTerminalMinimized, setIsTerminalMinimized] = useState(false);\n\n const [isDarkMode, setIsDarkMode] = useState(false);\n\n useEffect(() => {\n // Initial check\n setIsDarkMode(document.documentElement.classList.contains('dark'));\n\n // Observer for class changes on html element\n const observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n if (mutation.attributeName === 'class') {\n setIsDarkMode(document.documentElement.classList.contains('dark'));\n }\n });\n });\n\n observer.observe(document.documentElement, { attributes: true });\n\n return () => observer.disconnect();\n }, []);\n\n // Apply terminal theme based on dark mode state\n useEffect(() => {\n const applyTheme = (iframe: HTMLIFrameElement | null) => {\n if (!iframe) return;\n try {\n const win = iframe.contentWindow as TerminalWindow | null;\n if (win && win.term) {\n win.term.options.theme = {\n ...(win.term.options.theme || {}),\n ...(isDarkMode ? TERMINAL_THEME_DARK : TERMINAL_THEME_LIGHT)\n };\n }\n } catch (e) {\n // Ignore transient iframe access errors\n }\n };\n\n applyTheme(iframeRef.current);\n applyTheme(terminalRef.current);\n }, [isDarkMode]);\n\n // Terminal resize state\n const [terminalSize, setTerminalSize] = useState({ width: 460, height: 320 });\n const [isResizing, setIsResizing] = useState(false);\n const [isLoaded, setIsLoaded] = useState(false);\n const resizeRef = useRef({ startX: 0, startY: 0, startWidth: 0, startHeight: 0 });\n const [terminalInteractionMode, setTerminalInteractionMode] = useState<TerminalInteractionMode>('scroll');\n const [isUpdatingTerminalInteractionMode, setIsUpdatingTerminalInteractionMode] = useState(false);\n const terminalInteractionRequestIdRef = useRef(0);\n\n useEffect(() => {\n setLastFileBrowserPath(worktree || repo);\n }, [repo, worktree]);\n\n useEffect(() => {\n const saved = localStorage.getItem(TERMINAL_SIZE_STORAGE_KEY);\n if (saved) {\n try {\n setTerminalSize(JSON.parse(saved));\n } catch (e) {\n console.error('Failed to parse saved terminal size', e);\n }\n }\n\n const savedSplitRatio = localStorage.getItem(SPLIT_RATIO_STORAGE_KEY);\n if (savedSplitRatio) {\n const parsed = Number.parseFloat(savedSplitRatio);\n if (!Number.isNaN(parsed)) {\n setAgentPaneRatio(clampAgentPaneRatio(parsed));\n }\n }\n\n // Start with the right panel hidden on each session load.\n setIsRightPanelCollapsed(true);\n setIsLoaded(true);\n }, []);\n\n const startResize = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsResizing(true);\n resizeRef.current = {\n startX: e.clientX,\n startY: e.clientY,\n startWidth: terminalSize.width,\n startHeight: terminalSize.height\n };\n };\n\n useEffect(() => {\n if (!isResizing) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n const deltaX = resizeRef.current.startX - e.clientX; // Dragging left increases width\n const deltaY = resizeRef.current.startY - e.clientY; // Dragging up increases height\n\n setTerminalSize({\n width: Math.max(300, Math.min(window.innerWidth - 32, resizeRef.current.startWidth + deltaX)),\n height: Math.max(100, Math.min(window.innerHeight - 32, resizeRef.current.startHeight + deltaY))\n });\n };\n\n const handleMouseUp = () => {\n setIsResizing(false);\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [isResizing]);\n\n useEffect(() => {\n if (isLoaded && !isResizing) {\n localStorage.setItem(TERMINAL_SIZE_STORAGE_KEY, JSON.stringify(terminalSize));\n }\n }, [isLoaded, isResizing, terminalSize]);\n\n useEffect(() => {\n if (isLoaded && !isSplitResizing) {\n localStorage.setItem(SPLIT_RATIO_STORAGE_KEY, String(agentPaneRatio));\n }\n }, [agentPaneRatio, isLoaded, isSplitResizing]);\n\n useEffect(() => {\n if (!isLoaded) return;\n localStorage.setItem(RIGHT_PANEL_COLLAPSED_STORAGE_KEY, isRightPanelCollapsed ? '1' : '0');\n }, [isLoaded, isRightPanelCollapsed]);\n\n useEffect(() => {\n if (!isRightPanelCollapsed) return;\n setIsSplitResizing(false);\n }, [isRightPanelCollapsed]);\n\n const startSplitResize = (e: React.MouseEvent<HTMLDivElement>) => {\n if (isRightPanelCollapsed) return;\n e.preventDefault();\n setIsSplitResizing(true);\n splitResizeRef.current = {\n startX: e.clientX,\n startRatio: agentPaneRatio,\n };\n };\n\n const handleToggleRightPanelCollapse = useCallback(() => {\n setIsRightPanelCollapsed((previous) => !previous);\n }, []);\n\n const handleRepoButtonClick = useCallback(() => {\n if (isRightPanelCollapsed) {\n setIsRightPanelCollapsed(false);\n }\n setIsRepoViewActive((previous) => !previous);\n }, [isRightPanelCollapsed]);\n\n useEffect(() => {\n if (!isSplitResizing) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n const container = splitContainerRef.current;\n if (!container) return;\n\n const rect = container.getBoundingClientRect();\n if (rect.width <= 0) return;\n\n const delta = e.clientX - splitResizeRef.current.startX;\n const nextLeftWidth = splitResizeRef.current.startRatio * rect.width + delta;\n setAgentPaneRatio(clampAgentPaneRatio(nextLeftWidth / rect.width));\n };\n\n const handleMouseUp = () => {\n setIsSplitResizing(false);\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [isSplitResizing]);\n\n // Auto-scroll and focus terminal when restored from minimized state\n useEffect(() => {\n if (!isTerminalMinimized && terminalRef.current) {\n const iframe = terminalRef.current;\n // Small delay to allow layout to update and iframe to render\n setTimeout(() => {\n try {\n const win = iframe.contentWindow as TerminalWindow | null;\n if (win && win.term) {\n win.term.scrollToBottom?.();\n win.focus();\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) (textarea as HTMLElement).focus();\n }\n } catch (e) {\n console.error('Failed to focus/scroll terminal on restore:', e);\n }\n }, 100);\n }\n }, [isTerminalMinimized]);\n\n // IDE Selection\n const [selectedIde, setSelectedIde] = useState<string>('vscode');\n\n useEffect(() => {\n const trimmedTitle = title?.trim();\n if (trimmedTitle) {\n document.title = `${trimmedTitle} | Viba`;\n return () => {\n document.title = 'Viba';\n };\n }\n\n document.title = 'Viba';\n return undefined;\n }, [title]);\n\n useEffect(() => {\n const loadConfig = async () => {\n const config = await getConfig();\n if (config.selectedIde && SUPPORTED_IDES.some(ide => ide.id === config.selectedIde)) {\n setSelectedIde(config.selectedIde);\n }\n };\n loadConfig();\n }, []);\n\n useEffect(() => {\n setCurrentBaseBranch(baseBranch?.trim() || '');\n setBaseBranchOptions([]);\n }, [baseBranch, sessionName]);\n\n useEffect(() => {\n setTerminalInteractionMode('scroll');\n setIsUpdatingTerminalInteractionMode(false);\n terminalInteractionRequestIdRef.current += 1;\n }, [sessionName]);\n\n const handleIdeChange = async (e: React.ChangeEvent<HTMLSelectElement>) => {\n const value = e.target.value;\n setSelectedIde(value);\n await updateConfig({ selectedIde: value });\n };\n\n const handleOpenIde = () => {\n if (!worktree) return;\n const ide = SUPPORTED_IDES.find(i => i.id === selectedIde);\n if (!ide) return;\n\n const uri = `${ide.protocol}://file/${encodeURI(worktree)}`;\n window.open(uri, '_blank');\n };\n\n const applyTerminalInteractionMode = useCallback(async (\n mode: TerminalInteractionMode,\n options?: { silent?: boolean }\n ): Promise<boolean> => {\n if (terminalPersistenceMode !== 'tmux') return true;\n\n const requestId = ++terminalInteractionRequestIdRef.current;\n if (!options?.silent) {\n setIsUpdatingTerminalInteractionMode(true);\n }\n\n const mouseEnabled = mode === 'scroll';\n const [agentResult, terminalResult] = await Promise.all([\n setTmuxSessionMouseMode(sessionName, 'agent', mouseEnabled),\n setTmuxSessionMouseMode(sessionName, 'terminal', mouseEnabled),\n ]);\n\n if (requestId !== terminalInteractionRequestIdRef.current) {\n return false;\n }\n\n if (!options?.silent) {\n setIsUpdatingTerminalInteractionMode(false);\n }\n\n const failed = [agentResult, terminalResult].find((result) => !result.success);\n if (failed) {\n if (!options?.silent) {\n setFeedback(`Failed to switch to ${mode === 'scroll' ? 'scroll mode' : 'text select mode'}`);\n }\n return false;\n }\n\n if (!options?.silent) {\n setFeedback(mode === 'scroll' ? 'Terminal mode: Scroll' : 'Terminal mode: Text Select');\n }\n return true;\n }, [sessionName, terminalPersistenceMode]);\n\n const ensureTmuxStatusBarHidden = useCallback((slot: TerminalBootstrapSlot) => {\n if (terminalPersistenceMode !== 'tmux') return;\n if (tmuxStatusAppliedRef.current[slot]) return;\n\n void (async () => {\n const result = await setTmuxSessionStatusVisibility(sessionName, slot, false);\n if (result.success && result.applied) {\n tmuxStatusAppliedRef.current[slot] = true;\n } else if (!result.success) {\n console.error(`Failed to hide tmux status bar for ${slot}:`, result.error);\n }\n })();\n }, [sessionName, terminalPersistenceMode]);\n\n useEffect(() => {\n if (terminalPersistenceMode !== 'tmux') return;\n void applyTerminalInteractionMode('scroll', { silent: true });\n }, [applyTerminalInteractionMode, terminalPersistenceMode]);\n\n const handleToggleTerminalInteractionMode = useCallback(() => {\n if (terminalPersistenceMode !== 'tmux' || isUpdatingTerminalInteractionMode) return;\n\n const previousMode = terminalInteractionMode;\n const nextMode: TerminalInteractionMode = previousMode === 'scroll' ? 'select' : 'scroll';\n setTerminalInteractionMode(nextMode);\n\n void (async () => {\n const success = await applyTerminalInteractionMode(nextMode);\n if (!success) {\n setTerminalInteractionMode(previousMode);\n }\n })();\n }, [applyTerminalInteractionMode, isUpdatingTerminalInteractionMode, terminalInteractionMode, terminalPersistenceMode]);\n\n const handleNewAttempt = () => {\n if (!repo || !sessionName) return;\n const nextUrl = `/new?repo=${encodeURIComponent(repo)}&prefillFromSession=${encodeURIComponent(sessionName)}`;\n window.open(nextUrl, '_blank', 'noopener,noreferrer');\n };\n\n const runCleanup = async (requireConfirmation = true): Promise<boolean> => {\n if (!repo || !worktree || !branch) return false;\n if (requireConfirmation && !confirm('Are you sure you want to delete this session? This will remove the branch and worktree.')) return false;\n\n setCleanupError(null);\n setCleanupPhase('idle');\n setFeedback('Purging session...');\n\n try {\n const result = await deleteSessionInBackground(sessionName);\n if (!result.success) {\n console.error('Cleanup failed:', result.error || 'Unknown error');\n setCleanupPhase('error');\n setCleanupError(result.error || 'Failed to delete session');\n return false;\n }\n\n notifySessionsUpdated();\n } catch (error) {\n console.error('Cleanup request failed:', error);\n setCleanupPhase('error');\n setCleanupError(error instanceof Error ? error.message : 'Unknown error');\n return false;\n }\n\n // Use forced navigation here because App Router transitions can be\n // interrupted by iframe/server-action teardown in production builds.\n onExit(true);\n return true;\n };\n\n const handleCleanup = async () => {\n await runCleanup(true);\n };\n\n const pasteIntoAgentIframe = useCallback((text: string): Promise<boolean> => {\n return new Promise((resolve) => {\n const iframe = iframeRef.current;\n if (!iframe) {\n resolve(false);\n return;\n }\n\n const checkAndPaste = (attempts = 0) => {\n if (attempts > 30) {\n resolve(false);\n return;\n }\n\n try {\n const win = iframe.contentWindow as TerminalWindow | null;\n if (!win || !win.term) {\n setTimeout(() => checkAndPaste(attempts + 1), 300);\n return;\n }\n\n win.term.paste(text);\n\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) {\n (textarea as HTMLElement).focus();\n }\n win.focus();\n resolve(true);\n } catch (e) {\n console.error('Failed to paste into agent iframe:', e);\n setTimeout(() => checkAndPaste(attempts + 1), 300);\n }\n };\n\n checkAndPaste();\n });\n }, []);\n\n const handleInsertFilePaths = useCallback(async (paths: string[]) => {\n if (paths.length === 0) return;\n\n setIsInsertingFilePaths(true);\n const textToInsert = `${paths.join(' ')} `;\n const inserted = await pasteIntoAgentIframe(textToInsert);\n setFeedback(\n inserted\n ? `Inserted ${paths.length} file path${paths.length === 1 ? '' : 's'} into agent input`\n : 'Failed to insert file paths into agent input'\n );\n setIsInsertingFilePaths(false);\n }, [pasteIntoAgentIframe]);\n\n const resolveComponentSourcePathByNames = useCallback(async (componentNames: string[]): Promise<{ resolvedName: string; sourcePath: string } | null> => {\n const normalizedNames = componentNames.map(normalizeComponentLookupName).filter(Boolean);\n if (normalizedNames.length === 0) return null;\n\n const roots = Array.from(\n new Set(\n [repo, worktree]\n .map((root) => (root || '').trim())\n .filter(Boolean)\n )\n );\n if (roots.length === 0) return null;\n\n for (const workspaceRoot of roots) {\n try {\n const response = await fetch('/api/component-source/resolve', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n componentNames: normalizedNames,\n workspaceRoot,\n }),\n });\n\n const payload = await response.json().catch(() => null) as { resolvedName?: string; sourcePath?: string; error?: string } | null;\n if (!response.ok) {\n console.warn('Component source resolve miss', {\n componentNames: normalizedNames,\n workspaceRoot,\n error: payload?.error || response.statusText,\n });\n continue;\n }\n\n const sourcePath = typeof payload?.sourcePath === 'string' ? payload.sourcePath.trim() : '';\n const resolvedName = typeof payload?.resolvedName === 'string' ? payload.resolvedName.trim() : '';\n\n if (sourcePath && resolvedName) return { sourcePath, resolvedName };\n } catch (error) {\n console.error('Failed to resolve component source path:', error);\n }\n }\n\n return null;\n }, [repo, worktree]);\n\n const loadBaseBranchOptions = useCallback(async () => {\n if (!sessionName) return;\n if (isLoadingBaseBranchesRef.current) return;\n\n isLoadingBaseBranchesRef.current = true;\n setIsLoadingBaseBranches(true);\n\n try {\n const result = await listSessionBaseBranches(sessionName);\n if (result.success) {\n setBaseBranchOptions(result.branches ?? []);\n setCurrentBaseBranch(result.baseBranch?.trim() || '');\n } else if (result.error) {\n setFeedback(`Failed to load branches: ${result.error}`);\n }\n } catch (e) {\n console.error('Failed to load base branches:', e);\n } finally {\n isLoadingBaseBranchesRef.current = false;\n setIsLoadingBaseBranches(false);\n }\n }, [sessionName]);\n\n useEffect(() => {\n if (!sessionName) return;\n void loadBaseBranchOptions();\n }, [loadBaseBranchOptions, sessionName]);\n\n const loadSessionDivergence = useCallback(async () => {\n if (!sessionName) return;\n\n try {\n const result = await getSessionDivergence(sessionName);\n if (result.success && typeof result.ahead === 'number' && typeof result.behind === 'number') {\n setDivergence({ ahead: result.ahead, behind: result.behind });\n }\n } catch (e) {\n console.error('Failed to load branch divergence:', e);\n }\n }, [sessionName]);\n\n useEffect(() => {\n if (!sessionName || !currentBaseBranch) {\n setDivergence({ ahead: 0, behind: 0 });\n return;\n }\n\n void loadSessionDivergence();\n const timer = window.setInterval(() => {\n void loadSessionDivergence();\n }, 60000);\n\n return () => window.clearInterval(timer);\n }, [currentBaseBranch, loadSessionDivergence, sessionName]);\n\n const handleBaseBranchChange = async (e: React.ChangeEvent<HTMLSelectElement>) => {\n if (!sessionName) return;\n\n const nextBaseBranch = e.target.value.trim();\n if (!nextBaseBranch || nextBaseBranch === currentBaseBranch) return;\n\n setIsUpdatingBaseBranch(true);\n setFeedback(`Updating base branch to ${nextBaseBranch}...`);\n\n try {\n const result = await updateSessionBaseBranch(sessionName, nextBaseBranch);\n if (result.success && result.baseBranch) {\n setCurrentBaseBranch(result.baseBranch);\n setFeedback(`Base branch updated to ${result.baseBranch}`);\n await loadBaseBranchOptions();\n await loadSessionDivergence();\n } else {\n setFeedback(`Failed to update base branch: ${result.error}`);\n }\n } catch (error) {\n console.error('Failed to update base branch:', error);\n setFeedback('Failed to update base branch');\n } finally {\n setIsUpdatingBaseBranch(false);\n }\n };\n\n const runMerge = async (): Promise<boolean> => {\n if (!sessionName) return false;\n if (!currentBaseBranch) return false;\n\n setIsMerging(true);\n setFeedback('Merging session branch...');\n\n try {\n const result = await mergeSessionToBase(sessionName);\n if (result.success) {\n setFeedback(`Merged ${result.branchName} into ${result.baseBranch}`);\n void loadSessionDivergence();\n return true;\n } else {\n setFeedback(`Merge failed: ${result.error}`);\n return false;\n }\n } catch (e) {\n console.error('Merge request failed:', e);\n setFeedback('Merge failed');\n return false;\n } finally {\n setIsMerging(false);\n }\n };\n\n const handleMerge = async () => {\n await runMerge();\n };\n\n const [isRebaseDropdownOpen, setIsRebaseDropdownOpen] = useState(false);\n const rebaseDropdownRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (rebaseDropdownRef.current && !rebaseDropdownRef.current.contains(event.target as Node)) {\n setIsRebaseDropdownOpen(false);\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n const handleRebaseSelect = async (targetBranch: string) => {\n setIsRebaseDropdownOpen(false);\n if (!sessionName) return;\n\n const isNewBranch = targetBranch !== currentBaseBranch;\n\n setIsRebasing(true);\n setFeedback(isNewBranch ? `Updating base to ${targetBranch} and rebasing...` : 'Rebasing session branch...');\n\n try {\n if (isNewBranch) {\n const updateResult = await updateSessionBaseBranch(sessionName, targetBranch);\n if (!updateResult.success) {\n setFeedback(`Failed to update base branch: ${updateResult.error}`);\n setIsRebasing(false);\n return;\n }\n setCurrentBaseBranch(updateResult.baseBranch!);\n await loadBaseBranchOptions();\n }\n\n const result = await rebaseSessionOntoBase(sessionName);\n if (result.success) {\n setFeedback(`Rebased ${result.branchName} onto ${result.baseBranch}`);\n void loadSessionDivergence();\n } else {\n setFeedback(`Rebase failed: ${result.error}`);\n }\n } catch (e) {\n console.error('Rebase request failed:', e);\n setFeedback('Rebase failed');\n } finally {\n setIsRebasing(false);\n }\n };\n\n const handleRebase = () => {\n setIsRebaseDropdownOpen(!isRebaseDropdownOpen);\n };\n\n const loadPreviewViaProxy = useCallback(async (rawUrl: string, openPreview: boolean): Promise<boolean> => {\n const normalized = normalizePreviewUrl(rawUrl);\n if (!normalized) {\n setFeedback('Please enter a preview URL');\n return false;\n }\n\n setPreviewInputUrl(normalized);\n setIsPreviewPickerActive(false);\n setFeedback(`Loading preview: ${normalized}`);\n\n try {\n const response = await fetch('/api/preview-proxy/start', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n target: normalized,\n }),\n });\n\n const payload = await response.json().catch(() => null) as { error?: string; proxyUrl?: string } | null;\n if (!response.ok || !payload?.proxyUrl) {\n throw new Error(payload?.error || 'Failed to start preview proxy');\n }\n\n setPreviewUrl(payload.proxyUrl);\n if (openPreview) {\n setIsPreviewVisible(true);\n }\n setFeedback(`Loaded preview: ${normalized}`);\n return true;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to load preview';\n console.error('Failed to load preview via proxy:', error);\n setFeedback(`Failed to load preview: ${message}`);\n return false;\n }\n }, []);\n\n const handleTogglePreviewPicker = useCallback(() => {\n if (!previewUrl) {\n setFeedback('Load a preview before picking elements');\n return;\n }\n\n const previewWindow = previewIframeRef.current?.contentWindow;\n if (!previewWindow) {\n setFeedback('Preview is not ready yet');\n return;\n }\n\n const nextState = !isPreviewPickerActive;\n previewWindow.postMessage({\n type: 'viba:preview-picker-toggle',\n active: nextState,\n }, '*');\n\n setIsPreviewPickerActive(nextState);\n setFeedback(nextState ? 'Picker enabled: click an element in the preview' : 'Picker disabled');\n }, [isPreviewPickerActive, previewUrl]);\n\n const postPreviewControlMessage = useCallback((payload: { action?: PreviewNavigationAction; type: string }) => {\n const previewWindow = previewIframeRef.current?.contentWindow;\n if (!previewWindow) {\n setFeedback('Preview is not ready yet');\n return false;\n }\n\n previewWindow.postMessage(payload, '*');\n return true;\n }, []);\n\n const handlePreviewNavigate = useCallback((action: PreviewNavigationAction) => {\n if (!previewUrl) {\n setFeedback('Load a preview before using navigation controls');\n return;\n }\n\n if (!postPreviewControlMessage({ type: 'viba:preview-navigation', action })) {\n return;\n }\n\n if (action === 'reload') {\n setFeedback('Reloading preview...');\n }\n }, [postPreviewControlMessage, previewUrl]);\n\n const handleUnloadPreview = useCallback(() => {\n if (!previewUrl) {\n setFeedback('Preview is already unloaded');\n return;\n }\n\n setPreviewUrl('');\n setIsPreviewPickerActive(false);\n setFeedback('Preview unloaded');\n }, [previewUrl]);\n\n const handlePreviewIframeLoad = useCallback(() => {\n postPreviewControlMessage({ type: 'viba:preview-location-request' });\n }, [postPreviewControlMessage]);\n\n const { attachTerminalLinkHandler } = useTerminalLink({\n onLoadPreview: loadPreviewViaProxy\n });\n\n useEffect(() => {\n if (!isPreviewVisible) return;\n if (previewInputUrl.trim()) return;\n\n const timer = window.setTimeout(() => {\n previewAddressInputRef.current?.focus();\n }, 0);\n\n return () => {\n window.clearTimeout(timer);\n };\n }, [isPreviewVisible, previewInputUrl]);\n\n useEffect(() => {\n const handlePreviewMessage = (event: MessageEvent) => {\n if (!previewIframeRef.current || event.source !== previewIframeRef.current.contentWindow) return;\n\n const payload = event.data as {\n active?: boolean;\n element?: unknown;\n type?: string;\n url?: unknown;\n } | null;\n if (!payload || typeof payload !== 'object') return;\n\n if (payload.type === 'viba:preview-picker-state') {\n setIsPreviewPickerActive(Boolean(payload.active));\n return;\n }\n\n if (payload.type === 'viba:preview-picker-ready') {\n const previewWindow = previewIframeRef.current?.contentWindow;\n if (previewWindow) {\n previewWindow.postMessage({ type: 'viba:preview-location-request' }, '*');\n }\n return;\n }\n\n if (payload.type === 'viba:preview-link-open') {\n if (typeof payload.url === 'string' && payload.url.trim().length > 0) {\n window.open(payload.url, '_blank', 'noopener,noreferrer');\n }\n return;\n }\n\n if (payload.type === 'viba:preview-location-change') {\n if (typeof payload.url === 'string' && payload.url.trim().length > 0) {\n setPreviewInputUrl(payload.url);\n }\n return;\n }\n\n if (payload.type === 'viba:preview-element-selected') {\n const selectedElement = (payload.element && typeof payload.element === 'object')\n ? payload.element as { reactComponentStack?: unknown[]; selector?: string | null }\n : null;\n const reactStack = Array.isArray(selectedElement?.reactComponentStack)\n ? selectedElement.reactComponentStack\n : [];\n const componentReference = buildComponentReferenceText(reactStack, worktree || repo);\n const firstReactComponent = reactStack[0] && typeof reactStack[0] === 'object'\n ? (reactStack[0] as { name?: unknown }).name\n : undefined;\n const fallbackName = typeof firstReactComponent === 'string' && firstReactComponent.trim().length > 0\n ? firstReactComponent.trim()\n : '';\n const builtInComponents = new Set([\n 'Suspense', 'ErrorBoundary', 'Router', 'AppRouter', 'LayoutRouter',\n 'RenderFromTemplateContext', 'ScrollAndFocusHandler', 'InnerLayoutRouter',\n 'RedirectErrorBoundary', 'NotFoundBoundary', 'LoadingBoundary',\n 'ReactDevOverlay', 'HotReload', 'AppContainer', 'Route', 'Link', 'Image',\n 'OuterLayoutRouter', 'Head', 'StringRefs', 'Fragment', 'Profiler',\n 'StrictMode', 'SuspenseList', 'Script', 'Page', '__next_root_layout_boundary__'\n ]);\n\n const stackComponentNames = Array.from(\n new Set(\n reactStack\n .map((entry) => {\n if (!entry || typeof entry !== 'object') return '';\n const name = (entry as { name?: unknown }).name;\n return typeof name === 'string' ? name.trim() : '';\n })\n .filter((name) => {\n if (!name) return false;\n if (builtInComponents.has(name)) return false;\n if (name.startsWith('styled.') || name.startsWith('Styled(')) return false;\n return true;\n })\n )\n );\n\n console.log('Filtered stack component names:', stackComponentNames);\n\n const identifier = componentReference\n || fallbackName\n || (typeof selectedElement?.selector === 'string' ? selectedElement.selector : '');\n\n console.log('Preview selected element:', selectedElement);\n console.log('Preview selected reactComponentStack:', reactStack);\n console.log('Preview selected identifier:', identifier);\n setIsPreviewPickerActive(false);\n\n if (!identifier) {\n setFeedback('Element selected. No identifier was resolved.');\n return;\n }\n\n void (async () => {\n let finalIdentifier = componentReference || '';\n\n if (!finalIdentifier && stackComponentNames.length > 0) {\n setIsResolvingElement(true);\n try {\n const result = await resolveComponentSourcePathByNames(stackComponentNames);\n if (result?.resolvedName && result?.sourcePath) {\n finalIdentifier = `${result.resolvedName} (${result.sourcePath})`;\n }\n } finally {\n setIsResolvingElement(false);\n }\n }\n\n if (!finalIdentifier) {\n if (stackComponentNames.length > 0) {\n setFeedback('Element selected, but source file path could not be resolved for the component');\n return;\n }\n finalIdentifier = identifier;\n }\n\n console.log('Final resolved component identifier:', finalIdentifier);\n\n const inserted = await pasteIntoAgentIframe(`${finalIdentifier} `);\n setFeedback(\n inserted\n ? `Element identifier sent to agent: ${finalIdentifier}`\n : 'Element selected, but failed to send identifier to agent input'\n );\n })();\n }\n };\n\n window.addEventListener('message', handlePreviewMessage);\n return () => {\n window.removeEventListener('message', handlePreviewMessage);\n };\n }, [pasteIntoAgentIframe, repo, resolveComponentSourcePathByNames, worktree]);\n\n useEffect(() => {\n setIsPreviewPickerActive(false);\n }, [previewUrl]);\n\n const handlePreviewSubmit = (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n void loadPreviewViaProxy(previewInputUrl, true);\n };\n\n const handleOpenPreviewInNewTab = useCallback(() => {\n const preferredTarget = previewInputUrl.trim() || previewUrl;\n const normalizedTarget = normalizePreviewUrl(preferredTarget);\n\n if (!normalizedTarget) {\n setFeedback('Please enter a preview URL');\n return;\n }\n\n window.open(normalizedTarget, '_blank', 'noopener,noreferrer');\n setFeedback(`Opened preview in new tab: ${normalizedTarget}`);\n }, [previewInputUrl, previewUrl]);\n\n const handleStartDevServer = () => {\n const script = devServerScript?.trim();\n if (!script || !terminalRef.current || isTerminalForegroundProcessRunning) return;\n\n // Auto-show terminal if minimized\n setIsTerminalMinimized(false);\n\n const iframe = terminalRef.current;\n setIsStartingDevServer(true);\n setFeedback('Starting dev server...');\n\n const checkAndInject = (attempts = 0) => {\n if (attempts > 30) {\n setFeedback('Failed to start dev server: terminal is not ready');\n setIsStartingDevServer(false);\n return;\n }\n\n try {\n const win = iframe.contentWindow as TerminalWindow | null;\n if (win && win.term) {\n win.term.paste(script);\n\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) {\n textarea.dispatchEvent(new KeyboardEvent('keypress', {\n bubbles: true,\n cancelable: true,\n charCode: 13,\n keyCode: 13,\n key: 'Enter',\n view: win\n }));\n } else {\n win.term.paste('\\r');\n }\n\n win.focus();\n if (textarea) (textarea as HTMLElement).focus();\n\n setFeedback('Dev server start command sent');\n setIsStartingDevServer(false);\n } else {\n setTimeout(() => checkAndInject(attempts + 1), 300);\n }\n } catch (e) {\n console.error('Dev server injection error', e);\n setFeedback('Failed to start dev server');\n setIsStartingDevServer(false);\n }\n };\n\n checkAndInject();\n };\n\n const handleIframeLoad = () => {\n if (!iframeRef.current) return;\n const iframe = iframeRef.current;\n\n // Safety check for Same-Origin to avoid errors if proxy isn't working\n try {\n // Just accessing contentWindow to see if it throws\n const _ = iframe.contentWindow;\n } catch (e) {\n setFeedback(\"Error: Cross-Origin access blocked. Ensure proxy is working.\");\n return;\n }\n\n if (iframe.contentWindow) {\n // Attempt to nullify the internal ttyd handler\n iframe.contentWindow.onbeforeunload = null;\n\n // Or add a high-priority listener that stops the popup\n iframe.contentWindow.addEventListener('beforeunload', (event) => {\n event.stopImmediatePropagation();\n }, true);\n }\n\n setFeedback('Connecting to terminal...');\n\n const checkAndInject = (attempts = 0) => {\n if (attempts > 30) {\n setFeedback('Timeout waiting for terminal to be ready');\n return;\n }\n\n try {\n const win = iframe.contentWindow as TerminalWindow | null;\n if (win && win.term) {\n ensureTmuxStatusBarHidden('agent');\n const term = win.term;\n attachTerminalLinkHandler(iframe, agentFrameLinkCleanupRef, {\n directOpenBehavior: 'new_tab',\n modifierOpenBehavior: 'new_tab',\n });\n\n // Clear current input line on Cmd+Backspace/Cmd+Delete.\n const terminalWithShortcutState = term as TerminalWithClearLineShortcutState;\n if (!terminalWithShortcutState.__vibaClearLineShortcutInstalled && typeof term.attachCustomKeyEventHandler === 'function') {\n const existingCustomKeyEventHandler = term.customKeyEventHandler;\n term.attachCustomKeyEventHandler((event: KeyboardEvent) => {\n if (event.type === 'keydown' && event.metaKey && (event.key === 'Backspace' || event.key === 'Delete')) {\n const coreService = term._core?.coreService;\n if (coreService && typeof coreService.triggerDataEvent === 'function') {\n coreService.triggerDataEvent('\\x15', true);\n } else {\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) {\n textarea.dispatchEvent(new KeyboardEvent('keydown', {\n bubbles: true,\n cancelable: true,\n key: 'u',\n keyCode: 85,\n ctrlKey: true,\n view: win\n }));\n } else {\n term.paste('\\x15');\n }\n }\n return false;\n }\n\n if (typeof existingCustomKeyEventHandler === 'function') {\n try {\n return existingCustomKeyEventHandler.call(term, event) !== false;\n } catch (error) {\n console.error('Existing terminal key handler failed:', error);\n }\n }\n return true;\n });\n terminalWithShortcutState.__vibaClearLineShortcutInstalled = true;\n }\n\n // Set selection highlight color via xterm.js 5 theme API (canvas renderer)\n try {\n term.options.theme = {\n ...(term.options.theme || {}),\n ...(isDarkMode ? TERMINAL_THEME_DARK : TERMINAL_THEME_LIGHT)\n };\n } catch { /* ignore if API unavailable */ }\n\n const alreadyBootstrapped = hasTerminalBootstrapped('agent');\n const shouldSkipResumeInjection = Boolean(isResume) && terminalPersistenceMode === 'tmux';\n if (alreadyBootstrapped || shouldSkipResumeInjection) {\n if (shouldSkipResumeInjection && !alreadyBootstrapped) {\n markTerminalBootstrapped('agent');\n setFeedback('Attached to persisted terminal');\n } else {\n setFeedback('Reconnected to terminal');\n }\n win.focus();\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) (textarea as HTMLElement).focus();\n return;\n }\n\n if (!isShellPromptReady(term) && attempts < 10) {\n setTimeout(() => checkAndInject(attempts + 1), 200);\n return;\n }\n\n if (!beginTerminalBootstrap('agent')) {\n setFeedback('Reconnected to terminal');\n win.focus();\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) (textarea as HTMLElement).focus();\n return;\n }\n\n // Attempt injection\n\n // User instructions:\n // 1. paste cd command\n // 2. dispatch keypress 13\n\n const targetPath = worktree || repo; // Fallback to repo if no worktree\n const cmd = `cd ${quoteShellArg(targetPath)}`;\n // Send cd command\n term.paste(cmd);\n\n // Helper to press enter\n const pressEnter = () => {\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) {\n textarea.dispatchEvent(new KeyboardEvent('keypress', {\n bubbles: true,\n cancelable: true,\n charCode: 13,\n keyCode: 13,\n key: 'Enter',\n view: win\n }));\n } else {\n term.paste('\\r');\n }\n };\n\n pressEnter();\n markTerminalBootstrapped('agent');\n\n // Inject agent command if present\n if (agent) {\n const startAgentProcess = async () => {\n let agentCmd = '';\n const withCodexApiKeyLogin = (command: string): string => {\n return `if [ -n \"$OPENAI_API_KEY\" ]; then printenv OPENAI_API_KEY | codex login --with-api-key || exit 1; fi; ${command}`;\n };\n\n if (isResume) {\n const resumeCmd = `codex resume --last --sandbox danger-full-access --ask-for-approval on-request --search`;\n agentCmd = withCodexApiKeyLogin(resumeCmd);\n } else {\n const trimmedInitialMessage = initialMessage?.trim() || '';\n const taskContent = trimmedInitialMessage;\n const normalizedAttachmentPaths = (\n attachmentPaths && attachmentPaths.length > 0\n ? attachmentPaths\n : (attachmentNames || [])\n .map((name) => `${worktree || repo}-attachments/${name}`)\n )\n .map((entry) => entry.trim())\n .filter(Boolean);\n const resolvedAttachmentPaths = Array.from(new Set(normalizedAttachmentPaths));\n const taskSections: string[] = [];\n if (taskContent) taskSections.push(taskContent);\n if (resolvedAttachmentPaths.length > 0) {\n taskSections.push([\n 'Attachments:',\n ...resolvedAttachmentPaths.map((attachmentPath) => `- ${attachmentPath}`),\n ].join('\\n'));\n }\n const fullTaskContent = taskSections.join('\\n\\n');\n let safeMessage = '';\n\n // Send startup prompt when user provided a task or attachments.\n if (fullTaskContent) {\n const instructionLines: string[] = [];\n if (sessionMode === 'plan') {\n instructionLines.push(PLAN_MODE_STARTUP_INSTRUCTION);\n }\n instructionLines.push(AUTO_COMMIT_INSTRUCTION);\n instructionLines.push(AGENT_BROWSER_SKILL_INSTRUCTION);\n instructionLines.push(SYSTEMATIC_DEBUGGING_SKILL_INSTRUCTION);\n instructionLines.push(VISUAL_EVIDENCE_INSTRUCTION);\n instructionLines.push(NOTIFICATION_INSTRUCTION);\n const notificationApiUrl = `${window.location.origin}/api/notifications`;\n instructionLines.push(\n `Notification API endpoint: ${notificationApiUrl} (POST JSON with sessionId, title, and description).`\n );\n instructionLines.push(\n `Notification payload template: {\"sessionId\":\"${sessionName}\",\"title\":\"<short title>\",\"description\":\"<clear detail about completion or required attention>\"}.`\n );\n\n const fullMessage = [\n '# Instructions',\n '',\n instructionLines.map((line) => `- ${line}`).join('\\n'),\n '',\n '# Task',\n '',\n fullTaskContent,\n ].join('\\n');\n\n try {\n const result = await writeSessionPromptFile(sessionName, fullMessage);\n if (result.success && result.filePath) {\n safeMessage = ` \"$(cat ${quoteShellArg(result.filePath)})\"`;\n } else {\n console.error('Failed to write prompt file, falling back to inline prompt', result.error);\n safeMessage = ` ${quoteShellArg(fullMessage)}`;\n }\n } catch (err) {\n console.error('Exception writing prompt file', err);\n safeMessage = ` ${quoteShellArg(fullMessage)}`;\n }\n }\n\n const startCmd = `codex --sandbox danger-full-access --ask-for-approval on-request --search${safeMessage}`;\n agentCmd = withCodexApiKeyLogin(startCmd);\n }\n\n if (agentCmd) {\n term.paste(agentCmd);\n pressEnter();\n setFeedback(isResume ? 'Resumed session with codex' : 'Session started with codex');\n\n if (!isResume && onSessionStart) {\n onSessionStart();\n }\n }\n };\n\n setTimeout(() => startAgentProcess(), 500); // Wait a bit for cd to finish\n } else {\n setFeedback(`Session started ${worktree ? '(Worktree)' : ''}`);\n if (!isResume && onSessionStart) {\n onSessionStart();\n }\n }\n\n // Focus the iframe\n win.focus();\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) (textarea as HTMLElement).focus();\n\n } else {\n // Not ready yet\n setTimeout(() => checkAndInject(attempts + 1), 500);\n }\n } catch (e) {\n resetTerminalBootstrap('agent');\n console.error(\"Access error during injection:\", e);\n setFeedback('Error accessing terminal: ' + String(e));\n }\n };\n\n // Small delay to allow scripts to run\n setTimeout(() => checkAndInject(), 1000);\n };\n\n const handleTerminalLoad = () => {\n if (!terminalRef.current) return;\n const iframe = terminalRef.current;\n stopTerminalProcessMonitor();\n setIsTerminalForegroundProcessRunning(false);\n\n // Safety check\n try {\n const _ = iframe.contentWindow;\n } catch (e) {\n console.error(\"Secondary terminal: Cross-Origin access blocked.\");\n return;\n }\n\n if (iframe.contentWindow) {\n // Attempt to nullify the internal ttyd handler\n iframe.contentWindow.onbeforeunload = null;\n\n // Or add a high-priority listener that stops the popup\n iframe.contentWindow.addEventListener('beforeunload', (event) => {\n event.stopImmediatePropagation();\n }, true);\n }\n\n const checkAndInject = (attempts = 0) => {\n if (attempts > 30) {\n return;\n }\n\n try {\n const win = iframe.contentWindow as TerminalWindow | null;\n if (win && win.term) {\n ensureTmuxStatusBarHidden('terminal');\n const term = win.term;\n attachTerminalLinkHandler(iframe, terminalFrameLinkCleanupRef, {\n onLinkActivated: () => setIsTerminalMinimized(true),\n directOpenBehavior: 'preview',\n modifierOpenBehavior: 'new_tab',\n });\n\n // Set selection highlight color via xterm.js 5 theme API (canvas renderer)\n try {\n term.options.theme = {\n ...(term.options.theme || {}),\n ...(isDarkMode ? TERMINAL_THEME_DARK : TERMINAL_THEME_LIGHT)\n };\n } catch { /* ignore if API unavailable */ }\n\n startTerminalProcessMonitor(iframe, term);\n\n // Enable auto-scroll to bottom on output\n try {\n const xterm = term as TerminalWithOnWriteParsed;\n const scrollHandler = () => {\n const activeBuffer = xterm.buffer?.active as ({ baseY?: number; viewportY?: number } | undefined);\n const baseY = typeof activeBuffer?.baseY === 'number' ? activeBuffer.baseY : 0;\n const viewportY = typeof activeBuffer?.viewportY === 'number' ? activeBuffer.viewportY : baseY;\n\n // Only scroll if we are close to the bottom to allow reviewing history\n if (activeBuffer && (baseY - viewportY < 10)) {\n xterm.scrollToBottom?.();\n } else {\n // Fallback if buffer access fails or simple mode\n xterm.scrollToBottom?.();\n }\n };\n\n if (typeof xterm.onWriteParsed === 'function') {\n xterm.onWriteParsed(scrollHandler);\n } else {\n // Fallback for older xterm or different setups\n const screen = iframe.contentDocument?.querySelector('.xterm-screen') || iframe.contentDocument?.body;\n if (screen) {\n const observer = new MutationObserver(scrollHandler);\n observer.observe(screen, { childList: true, subtree: true, characterData: true });\n }\n }\n } catch (e) {\n console.error('Failed to setup auto-scroll:', e);\n }\n\n const alreadyBootstrapped = hasTerminalBootstrapped('terminal');\n const shouldSkipResumeInjection = Boolean(isResume) && terminalPersistenceMode === 'tmux';\n if (alreadyBootstrapped || shouldSkipResumeInjection) {\n if (shouldSkipResumeInjection && !alreadyBootstrapped) {\n markTerminalBootstrapped('terminal');\n }\n if (alreadyBootstrapped) {\n injectTerminalStartupScript(iframe, win, term);\n }\n win.focus();\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) (textarea as HTMLElement).focus();\n return;\n }\n\n if (!isShellPromptReady(term) && attempts < 10) {\n setTimeout(() => checkAndInject(attempts + 1), 200);\n return;\n }\n\n if (!beginTerminalBootstrap('terminal')) {\n win.focus();\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) (textarea as HTMLElement).focus();\n return;\n }\n\n const targetPath = worktree || repo;\n const cmd = `cd ${quoteShellArg(targetPath)}`;\n term.paste(cmd);\n\n const pressEnter = () => {\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) {\n textarea.dispatchEvent(new KeyboardEvent('keypress', {\n bubbles: true,\n cancelable: true,\n charCode: 13,\n keyCode: 13,\n key: 'Enter',\n view: win\n }));\n } else {\n term.paste('\\r');\n }\n };\n pressEnter();\n markTerminalBootstrapped('terminal');\n injectTerminalStartupScript(iframe, win, term);\n\n // Focus\n win.focus();\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) (textarea as HTMLElement).focus();\n } else {\n setTimeout(() => checkAndInject(attempts + 1), 500);\n }\n } catch (e) {\n setIsTerminalForegroundProcessRunning(false);\n resetTerminalBootstrap('terminal');\n console.error(\"Secondary terminal injection error\", e);\n }\n };\n\n setTimeout(() => checkAndInject(), 1000);\n };\n\n if (!repo) return <div className=\"p-4 text-error dark:bg-[#0d1117] dark:text-red-300\">No repository specified</div>;\n\n if (cleanupPhase === 'error') {\n return (\n <div className=\"flex h-screen w-full items-center justify-center bg-[#f6f6f8] dark:bg-[#0d1117]\">\n <div className=\"card w-96 border border-slate-200 bg-white shadow-xl dark:border-[#30363d] dark:bg-[#161b22]\">\n <div className=\"card-body items-center text-center\">\n <h2 className=\"card-title text-error dark:text-red-300\">Cleanup failed</h2>\n <p className=\"text-slate-700 dark:text-slate-300\">{cleanupError || 'An unknown error occurred while cleaning up this session.'}</p>\n <div className=\"card-actions justify-end\">\n <button className=\"btn btn-primary\" onClick={() => onExit()}>Back to Home</button>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n const selectableBaseBranches = Array.from(new Set([\n ...(currentBaseBranch ? [currentBaseBranch] : []),\n ...baseBranchOptions\n ])).filter((branchOption) => branchOption !== branch || branchOption === currentBaseBranch);\n const hasDevServerScript = Boolean(devServerScript?.trim());\n const isDevButtonDisabled = !hasDevServerScript || isStartingDevServer || isTerminalForegroundProcessRunning;\n const devButtonTitle = !hasDevServerScript\n ? 'Set a dev server script to enable this button'\n : isTerminalForegroundProcessRunning\n ? 'A process is already running in the terminal'\n : 'Run dev server script in terminal';\n\n return (\n <div className={`flex h-screen w-full flex-col overflow-hidden bg-[#f6f6f8] dark:bg-[#0d1117] ${(isResizing || isSplitResizing) ? 'select-none' : ''}`}>\n {(isResizing || isSplitResizing) && (\n <div className={`fixed inset-0 z-[9999] ${isResizing ? 'cursor-row-resize' : 'cursor-col-resize'}`} />\n )}\n <div className=\"z-20 flex items-center justify-between border-b border-slate-200 bg-white px-4 py-2 text-xs font-mono shadow-sm dark:border-[#30363d] dark:bg-[#161b22] dark:text-slate-300\">\n <div className=\"flex items-center gap-4\">\n <button\n className=\"btn btn-ghost btn-xs h-6 min-h-6 px-1 text-slate-600 hover:bg-base-content/10 dark:text-slate-300 dark:hover:bg-[#30363d]/60\"\n onClick={() => onExit()}\n title=\"Back to Home\"\n >\n <ChevronLeft className=\"w-4 h-4\" />\n </button>\n <div className=\"flex flex-col\">\n <div className=\"flex items-center gap-2\">\n <span className=\"opacity-50\">Repo:</span>\n <span className=\"font-bold\">{getBaseName(repo)}</span>\n </div>\n {sessionName && (\n <div className=\"hidden min-[1200px]:flex min-w-0 items-center gap-2 text-[10px] opacity-70\">\n <span>Session:</span>\n <span className=\"truncate max-w-[220px]\" title={sessionName}>{sessionName}</span>\n </div>\n )}\n </div>\n </div>\n\n <div className=\"flex items-center gap-4\">\n <div className=\"flex items-center overflow-hidden rounded border border-base-content/20 bg-base-100 dark:border-[#30363d] dark:bg-[#0d1117]\">\n <button\n className=\"btn btn-ghost btn-xs h-6 min-h-6 rounded-none border-none px-2 text-slate-700 hover:bg-base-content/10 dark:text-slate-300 dark:hover:bg-[#30363d]/60\"\n onClick={handleNewAttempt}\n title=\"Start a new attempt in a new tab with this session context\"\n >\n <Plus className=\"w-3 h-3\" />\n <span className={headerButtonLabelClass}>New Attempt</span>\n </button>\n </div>\n\n <div className=\"relative flex items-center rounded border border-base-content/20 bg-base-100 dark:border-[#30363d] dark:bg-[#0d1117]\" ref={rebaseDropdownRef}>\n <div className=\"relative\">\n <button\n className=\"btn btn-ghost btn-xs h-6 min-h-6 rounded-none rounded-l border-none px-2 text-slate-700 hover:bg-base-content/10 dark:text-slate-300 dark:hover:bg-[#30363d]/60\"\n onClick={handleRebase}\n disabled={isRebasing || isMerging || isUpdatingBaseBranch}\n title=\"Select base branch and rebase\"\n >\n {isRebasing ? <span className=\"loading loading-spinner loading-xs\"></span> : <GitMerge className=\"w-3 h-3\" />}\n <span className={headerButtonLabelClass}>Rebase</span>\n <ChevronDown className=\"w-3 h-3 opacity-50 ml-0.5\" />\n </button>\n {isRebaseDropdownOpen && (\n <div className=\"dropdown-content absolute left-0 top-full z-50 mt-1 flex max-h-80 w-64 flex-col overflow-hidden rounded-box border border-base-content/20 bg-base-200 p-0 shadow-xl dark:border-[#30363d] dark:bg-[#161b22] dark:text-slate-300\">\n <div className=\"flex shrink-0 items-center justify-between border-b border-base-content/10 bg-base-200 px-4 py-2 text-[10px] font-bold uppercase tracking-wider opacity-50 dark:border-[#30363d] dark:bg-[#161b22]\">\n <span>Select Base Branch</span>\n {(isLoadingBaseBranches || isUpdatingBaseBranch) && <span className=\"loading loading-spinner loading-xs\"></span>}\n </div>\n <ul className=\"menu custom-scrollbar w-full flex-nowrap overflow-y-auto overflow-x-hidden p-0\">\n {selectableBaseBranches.length > 0 ? (\n selectableBaseBranches.map((branchOption) => (\n <li key={branchOption}>\n <button\n onClick={() => handleRebaseSelect(branchOption)}\n className={`flex max-w-full items-center justify-between truncate rounded-none py-2 text-xs hover:bg-base-content/10 dark:hover:bg-[#30363d]/60 ${branchOption === currentBaseBranch ? 'active font-bold' : ''}`}\n title={branchOption}\n >\n <span className=\"truncate\">{branchOption}</span>\n {branchOption === currentBaseBranch && <span className=\"opacity-70 text-[10px] ml-2 shrink-0\">(Current)</span>}\n </button>\n </li>\n ))\n ) : (\n <li className=\"text-xs px-4 py-2 opacity-50 italic text-center\">No other branches found</li>\n )}\n <div className=\"divider my-1 opacity-50 dark:before:bg-[#30363d] dark:after:bg-[#30363d]\"></div>\n <li>\n <button onClick={() => void loadBaseBranchOptions()} className=\"text-[10px] justify-center opacity-70 hover:opacity-100\">\n Refresh Branches\n </button>\n </li>\n </ul>\n </div>\n )}\n </div>\n <div className=\"h-4 w-[1px] bg-base-content/10 dark:bg-[#30363d]\"></div>\n <button\n className=\"btn btn-ghost btn-xs btn-success h-6 min-h-6 rounded-none border-none px-2 hover:border-transparent hover:bg-success/20 dark:text-emerald-300\"\n onClick={handleMerge}\n disabled={isMerging || isRebasing || isUpdatingBaseBranch || !currentBaseBranch}\n title={currentBaseBranch ? `Merge current branch (${branch}) into target branch (${currentBaseBranch})` : 'Target branch unavailable for this session'}\n >\n {isMerging ? <span className=\"loading loading-spinner loading-xs\"></span> : <GitPullRequestArrow className=\"w-3 h-3\" />}\n <span className={headerButtonLabelClass}>Merge</span>\n </button>\n <div className=\"h-4 w-[1px] bg-base-content/10 dark:bg-[#30363d]\"></div>\n <button\n className=\"btn btn-ghost btn-error btn-xs h-6 min-h-6 rounded-none rounded-r border-none px-2 hover:border-transparent hover:bg-error/20 dark:text-red-300\"\n onClick={handleCleanup}\n disabled={isMerging || isRebasing || !worktree}\n title=\"Clean up and exit\"\n >\n <Trash2 className=\"w-3 h-3\" />\n <span className={headerButtonLabelClass}>Delete</span>\n </button>\n </div>\n\n <div className=\"flex items-center overflow-hidden rounded border border-base-content/20 bg-base-100 dark:border-[#30363d] dark:bg-[#0d1117]\">\n <button\n type=\"button\"\n className={`btn btn-ghost btn-xs h-6 min-h-6 rounded-none border-none px-2 hover:bg-base-content/10 dark:hover:bg-[#30363d]/60 ${isRepoViewActive ? 'bg-slate-100 text-slate-900 dark:bg-[#30363d] dark:text-slate-100' : 'text-slate-700 dark:text-slate-300'}`}\n onClick={handleRepoButtonClick}\n aria-pressed={isRepoViewActive}\n title={isRepoViewActive ? 'Show preview and terminal panel' : 'Show repository viewer'}\n >\n <GitBranch className=\"h-3 w-3\" />\n <span className={headerButtonLabelClass}>Repo</span>\n </button>\n </div>\n\n {currentBaseBranch && (\n <div className=\"flex items-center gap-2 text-xs opacity-80\" title={`Divergence against ${currentBaseBranch}`}>\n <span className=\"inline-flex items-center gap-1\">\n <ArrowUp className=\"w-3 h-3\" />\n {divergence.ahead}\n </span>\n <span className=\"inline-flex items-center gap-1\">\n <ArrowDown className=\"w-3 h-3\" />\n {divergence.behind}\n </span>\n </div>\n )}\n\n <div className=\"mx-2 hidden h-4 w-[1px] bg-base-content/20 dark:bg-[#30363d] min-[1200px]:block\"></div>\n\n <div className=\"hidden min-[1200px]:flex min-w-0 max-w-[280px] items-center gap-2\">\n <span className={`w-2 h-2 rounded-full ${feedback.includes('Error') || feedback.includes('failed') ? 'bg-error' : feedback.includes('started') || feedback.includes('Merged') || feedback.includes('Rebased') || feedback.includes('sent') ? 'bg-success' : 'bg-warning'}`}></span>\n <span className=\"truncate\" title={feedback}>{feedback}</span>\n </div>\n\n </div>\n </div>\n\n <div\n ref={splitContainerRef}\n className={`relative flex min-h-0 flex-1 overflow-x-hidden bg-[#f6f6f8] p-3 dark:bg-[#0d1117] ${isRightPanelCollapsed ? 'gap-0' : 'gap-3'}`}\n >\n <div\n className=\"agent-activity-panel flex h-full min-w-0 flex-col overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm transition-[width] duration-300 ease-in-out dark:border-[#30363d] dark:bg-[#161b22]\"\n style={{ width: isRightPanelCollapsed ? '100%' : `${agentPaneRatio * 100}%` }}\n >\n <div className=\"flex h-9 items-center justify-between gap-3 border-b border-slate-200 px-3 text-[11px] font-semibold text-slate-600 dark:border-[#30363d] dark:bg-[#161b22] dark:text-slate-400\">\n <span className=\"flex shrink-0 items-center gap-2 uppercase tracking-wide\">\n <span className=\"h-2 w-2 rounded-full bg-blue-500\"></span>\n Agent Activity\n </span>\n <div className=\"flex min-w-0 items-center justify-end gap-2 overflow-x-auto py-1 text-xs font-medium normal-case\">\n <div className=\"flex shrink-0 items-center overflow-hidden rounded border border-slate-200 bg-white dark:border-[#30363d] dark:bg-[#0d1117]\">\n <select\n className=\"select select-xs h-6 min-h-6 rounded-none border-none bg-slate-100 pr-7 text-slate-700 focus:outline-none dark:bg-[#161b22] dark:text-slate-300\"\n value={selectedIde}\n onChange={handleIdeChange}\n >\n {SUPPORTED_IDES.map(ide => (\n <option key={ide.id} value={ide.id}>{ide.name}</option>\n ))}\n </select>\n <div className=\"h-4 w-[1px] bg-slate-200 dark:bg-[#30363d]\"></div>\n <button\n className=\"btn btn-ghost btn-xs h-6 min-h-6 rounded-none border-none px-2 text-slate-700 hover:bg-slate-100 dark:text-slate-300 dark:hover:bg-[#30363d]/60\"\n onClick={handleOpenIde}\n title={`Open in ${SUPPORTED_IDES.find(i => i.id === selectedIde)?.name}`}\n aria-label=\"Open in IDE\"\n >\n <ExternalLink className=\"h-3 w-3\" />\n <span className=\"agent-activity-action-label\">Open in IDE</span>\n </button>\n </div>\n <div className=\"flex shrink-0 items-center overflow-hidden rounded border border-slate-200 bg-white dark:border-[#30363d] dark:bg-[#0d1117]\">\n <button\n className=\"btn btn-ghost btn-xs h-6 min-h-6 rounded-none border-none px-2 text-slate-700 hover:bg-slate-100 dark:text-slate-300 dark:hover:bg-[#30363d]/60\"\n onClick={() => setIsFileBrowserOpen(true)}\n disabled={isInsertingFilePaths}\n title=\"Browse files and insert absolute paths into the agent input\"\n aria-label=\"Add files\"\n >\n {isInsertingFilePaths ? <span className=\"loading loading-spinner loading-xs\"></span> : <FolderOpen className=\"h-3 w-3\" />}\n <span className=\"agent-activity-action-label\">Add Files</span>\n </button>\n </div>\n <div className=\"flex shrink-0 items-center overflow-hidden rounded border border-slate-200 bg-white dark:border-[#30363d] dark:bg-[#0d1117]\">\n <button\n className={`btn btn-ghost btn-xs h-6 min-h-6 w-7 rounded-none border-none p-0 text-slate-700 hover:bg-slate-100 dark:text-slate-300 dark:hover:bg-[#30363d]/60 ${terminalInteractionMode === 'select' ? 'text-warning' : ''}`}\n onClick={handleToggleTerminalInteractionMode}\n disabled={terminalPersistenceMode !== 'tmux' || isUpdatingTerminalInteractionMode}\n title={terminalPersistenceMode === 'tmux'\n ? (terminalInteractionMode === 'scroll'\n ? 'Switch to text select mode for easier copy'\n : 'Switch to scroll mode for wheel scrollback')\n : 'Mode toggle is available only in tmux persistence mode'}\n aria-label={terminalInteractionMode === 'scroll' ? 'Switch to text mode' : 'Switch to scroll mode'}\n >\n {isUpdatingTerminalInteractionMode ? (\n <span className=\"loading loading-spinner loading-xs\"></span>\n ) : (\n terminalInteractionMode === 'scroll'\n ? <ScrollText className=\"h-3.5 w-3.5\" />\n : <TextCursorInput className=\"h-3.5 w-3.5\" />\n )}\n </button>\n </div>\n </div>\n </div>\n <iframe\n ref={iframeRef}\n src={agentTerminalSrc}\n className={`h-full w-full border-none ${(isResizing || isSplitResizing) ? 'pointer-events-none' : ''}`}\n allow=\"clipboard-read; clipboard-write\"\n onLoad={handleIframeLoad}\n />\n </div>\n\n <div\n className={`relative h-full shrink-0 rounded transition-all duration-300 ease-in-out ${isRightPanelCollapsed\n ? 'w-0 cursor-default opacity-0 pointer-events-none'\n : 'w-2 cursor-col-resize bg-slate-200 opacity-100 hover:bg-primary/40 dark:bg-[#30363d] dark:hover:bg-primary/60'\n }`}\n onMouseDown={startSplitResize}\n role={isRightPanelCollapsed ? undefined : 'separator'}\n aria-orientation={isRightPanelCollapsed ? undefined : 'vertical'}\n aria-label={isRightPanelCollapsed ? undefined : 'Resize preview panel'}\n aria-hidden={isRightPanelCollapsed}\n title={isRightPanelCollapsed ? undefined : 'Drag to resize preview panel'}\n >\n {!isRightPanelCollapsed && (\n <div className=\"absolute left-1/2 top-1/2 h-12 w-[2px] -translate-x-1/2 -translate-y-1/2 rounded-full bg-slate-400 dark:bg-slate-500\" />\n )}\n </div>\n\n <div\n className={`relative h-full transition-[width,min-width,flex-basis] duration-300 ease-in-out ${isRightPanelCollapsed ? 'w-0 min-w-0 flex-none' : 'min-w-[360px] flex-1'}`}\n >\n <button\n className=\"btn btn-ghost btn-xs absolute left-0 top-3 z-20 h-7 w-7 min-h-7 -translate-x-1/2 rounded-full border border-slate-200 bg-white/95 p-0 text-slate-600 shadow-sm hover:bg-slate-100 dark:border-[#30363d] dark:bg-[#161b22]/95 dark:text-slate-300 dark:hover:bg-[#30363d]/80\"\n onClick={handleToggleRightPanelCollapse}\n type=\"button\"\n title={isRightPanelCollapsed ? 'Expand right panel' : 'Collapse right panel'}\n aria-label={isRightPanelCollapsed ? 'Expand right panel' : 'Collapse right panel'}\n aria-pressed={isRightPanelCollapsed}\n >\n {isRightPanelCollapsed ? <ChevronLeft className=\"h-4 w-4\" /> : <ChevronRight className=\"h-4 w-4\" />}\n </button>\n\n {!isRightPanelCollapsed && (\n <div className=\"absolute inset-y-0 left-0 flex h-full w-full flex-col overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm dark:border-[#30363d] dark:bg-[#161b22]\">\n {isRepoViewActive ? (\n <SessionRepoViewer\n repoPath={worktree || repo}\n branchHint={branch}\n baseBranchHint={currentBaseBranch || baseBranch}\n />\n ) : (\n <>\n <div className=\"min-h-0 flex flex-1 flex-col\">\n <form\n className=\"flex h-9 items-center gap-2 border-b border-slate-200 bg-white px-3 dark:border-[#30363d] dark:bg-[#161b22]\"\n onSubmit={handlePreviewSubmit}\n >\n <div className=\"mr-1 flex gap-1.5\">\n <span className=\"h-2.5 w-2.5 rounded-full bg-red-400\" />\n <span className=\"h-2.5 w-2.5 rounded-full bg-yellow-400\" />\n <span className=\"h-2.5 w-2.5 rounded-full bg-green-400\" />\n </div>\n <button\n className=\"btn btn-ghost btn-xs h-7 min-h-7 w-7 p-0 text-slate-500 hover:bg-slate-100 dark:text-slate-400 dark:hover:bg-[#30363d]/60\"\n type=\"button\"\n onClick={() => handlePreviewNavigate('back')}\n disabled={!previewUrl}\n title=\"Go back\"\n aria-label=\"Go back\"\n >\n <ArrowLeft className=\"h-3.5 w-3.5\" />\n </button>\n <button\n className=\"btn btn-ghost btn-xs h-7 min-h-7 w-7 p-0 text-slate-500 hover:bg-slate-100 dark:text-slate-400 dark:hover:bg-[#30363d]/60\"\n type=\"button\"\n onClick={() => handlePreviewNavigate('forward')}\n disabled={!previewUrl}\n title=\"Go forward\"\n aria-label=\"Go forward\"\n >\n <ArrowRight className=\"h-3.5 w-3.5\" />\n </button>\n <button\n className=\"btn btn-ghost btn-xs h-7 min-h-7 w-7 p-0 text-slate-500 hover:bg-slate-100 dark:text-slate-400 dark:hover:bg-[#30363d]/60\"\n type=\"button\"\n onClick={() => handlePreviewNavigate('reload')}\n disabled={!previewUrl}\n title=\"Reload preview\"\n aria-label=\"Reload preview\"\n >\n <RotateCw className=\"h-3.5 w-3.5\" />\n </button>\n <button\n className=\"btn btn-ghost btn-xs h-7 min-h-7 w-7 p-0 text-slate-500 hover:bg-slate-100 dark:text-slate-400 dark:hover:bg-[#30363d]/60\"\n type=\"button\"\n onClick={handleUnloadPreview}\n disabled={!previewUrl}\n title=\"Unload preview\"\n aria-label=\"Unload preview\"\n >\n <X className=\"h-3.5 w-3.5\" />\n </button>\n <input\n ref={previewAddressInputRef}\n type=\"text\"\n className=\"input input-xs h-7 min-h-7 w-full border-slate-200 bg-slate-100 font-mono text-slate-700 dark:border-[#30363d] dark:bg-[#0d1117] dark:text-slate-300 dark:placeholder:text-slate-500\"\n value={previewInputUrl}\n onChange={(event) => setPreviewInputUrl(event.target.value)}\n placeholder=\"http://127.0.0.1:3000\"\n spellCheck={false}\n />\n <button\n className={`btn btn-ghost btn-xs h-7 min-h-7 w-7 p-0 ${isPreviewPickerActive ? 'text-success' : 'text-slate-500 dark:text-slate-400'} hover:bg-slate-100 dark:hover:bg-[#30363d]/60`}\n type=\"button\"\n onClick={handleTogglePreviewPicker}\n disabled={!previewUrl || isResolvingElement}\n title={isPreviewPickerActive ? 'Disable picker' : 'Pick element from preview'}\n >\n {isResolvingElement ? (\n <span className=\"loading loading-spinner loading-xs w-3 h-3\"></span>\n ) : (\n <MousePointer2 className=\"h-3 w-3\" />\n )}\n </button>\n <button\n className=\"btn btn-ghost btn-xs h-7 min-h-7 w-7 p-0 text-slate-500 hover:bg-slate-100 dark:text-slate-400 dark:hover:bg-[#30363d]/60\"\n type=\"button\"\n onClick={handleOpenPreviewInNewTab}\n title=\"Open preview in new tab\"\n aria-label=\"Open preview in new tab\"\n >\n <ExternalLink className=\"h-3.5 w-3.5\" />\n </button>\n </form>\n <div className=\"min-h-0 flex-1 bg-slate-50 dark:bg-[#0d1117]\">\n {!isPreviewVisible ? (\n <div className=\"flex h-full flex-col items-center justify-center gap-3 px-6 text-center text-xs text-slate-500 dark:text-slate-400\">\n <p>Preview is hidden. Use the header Preview button to show it.</p>\n <button\n type=\"button\"\n className=\"btn btn-xs border-slate-200 bg-white text-slate-700 hover:bg-slate-50 dark:border-[#30363d] dark:bg-[#161b22] dark:text-slate-300 dark:hover:bg-[#30363d]/60\"\n onClick={() => setIsPreviewVisible(true)}\n >\n Show Preview\n </button>\n </div>\n ) : previewUrl ? (\n <iframe\n ref={previewIframeRef}\n src={previewUrl}\n className={`h-full w-full border-none ${(isResizing || isSplitResizing) ? 'pointer-events-none' : ''}`}\n title=\"Dev server preview\"\n onLoad={handlePreviewIframeLoad}\n sandbox=\"allow-forms allow-modals allow-pointer-lock allow-popups allow-same-origin allow-scripts allow-downloads\"\n />\n ) : (\n <div className=\"flex h-full items-center justify-center px-6 text-center text-xs text-slate-500 dark:text-slate-400\">\n Run the dev server, or enter a URL above to load a preview.\n </div>\n )}\n </div>\n\n {!isTerminalMinimized && (\n <div\n className=\"flex h-2 cursor-row-resize items-center justify-center border-y border-slate-200 bg-slate-100 dark:border-[#30363d] dark:bg-[#0d1117]\"\n onMouseDown={startResize}\n role=\"separator\"\n aria-orientation=\"horizontal\"\n aria-label=\"Resize build output panel\"\n title=\"Drag to resize build output panel\"\n >\n <Grip className=\"h-3 w-3 text-slate-400 dark:text-slate-500\" />\n </div>\n )}\n\n <div\n className={`${isTerminalMinimized ? 'h-9' : 'min-h-[160px]'} flex shrink-0 flex-col bg-slate-50 dark:bg-[#161b22]`}\n style={{ height: isTerminalMinimized ? TERMINAL_HEADER_HEIGHT : terminalSize.height }}\n >\n <div className=\"flex h-9 items-center justify-between border-t border-slate-200 px-3 text-xs font-semibold text-slate-700 dark:border-[#30363d] dark:text-slate-300\">\n <span className=\"flex items-center gap-2 uppercase tracking-wide\">\n <span className=\"h-2 w-2 rounded-full bg-amber-500\"></span>\n Terminal\n </span>\n <div className=\"flex items-center gap-2\">\n <button\n className=\"btn btn-ghost btn-xs h-6 min-h-6 border-none px-2 text-slate-700 hover:bg-slate-100 dark:text-slate-300 dark:hover:bg-[#30363d]/60\"\n onClick={handleStartDevServer}\n disabled={isDevButtonDisabled}\n title={devButtonTitle}\n type=\"button\"\n >\n {isStartingDevServer ? <span className=\"loading loading-spinner loading-xs\"></span> : <Play className=\"h-3 w-3\" />}\n <span className=\"hidden min-[1700px]:inline\">Dev</span>\n </button>\n <button\n className=\"btn btn-ghost btn-xs h-6 min-h-6 w-7 border-none p-0 text-slate-700 hover:bg-slate-100 dark:text-slate-300 dark:hover:bg-[#30363d]/60\"\n onClick={() => setIsTerminalMinimized((prev) => !prev)}\n title={isTerminalMinimized ? 'Expand terminal' : 'Collapse terminal'}\n aria-label={isTerminalMinimized ? 'Expand terminal' : 'Collapse terminal'}\n type=\"button\"\n >\n <ChevronDown className={`h-4 w-4 transition-transform ${isTerminalMinimized ? 'rotate-180' : ''}`} />\n </button>\n </div>\n </div>\n <div className={`${isTerminalMinimized ? 'h-0 overflow-hidden' : 'min-h-0 flex-1 overflow-hidden border-t border-slate-200 bg-white dark:border-[#30363d] dark:bg-[#0d1117]'}`}>\n <iframe\n ref={terminalRef}\n src={floatingTerminalSrc}\n className={`h-full w-full border-none ${(isResizing || isSplitResizing) ? 'pointer-events-none' : ''}`}\n allow=\"clipboard-read; clipboard-write\"\n onLoad={handleTerminalLoad}\n />\n </div>\n </div>\n </div>\n </>\n )}\n </div>\n )}\n </div>\n </div>\n\n {isFileBrowserOpen && (\n <SessionFileBrowser\n initialPath={lastFileBrowserPath}\n worktreePath={worktree}\n onPathChange={setLastFileBrowserPath}\n onConfirm={(paths) => {\n setIsFileBrowserOpen(false);\n void handleInsertFilePaths(paths);\n }}\n onCancel={() => setIsFileBrowserOpen(false)}\n />\n )}\n </div>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"40873d33d73dfed79b33eef8e4fc285f3bacd1c2c6\":\"consumeSessionLaunchContext\"},\"src/app/actions/session.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_3=/*#__PURE__*/createServerReference(\"40873d33d73dfed79b33eef8e4fc285f3bacd1c2c6\",callServer,void 0,findSourceMapURL,\"consumeSessionLaunchContext\");export{$$RSC_SERVER_ACTION_3 as consumeSessionLaunchContext};","/* __next_internal_action_entry_do_not_use__ [{\"4099ecafa3cbde3c39baecdacbcacab9ffe05762d3\":\"getSessionMetadata\"},\"src/app/actions/session.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_6=/*#__PURE__*/createServerReference(\"4099ecafa3cbde3c39baecdacbcacab9ffe05762d3\",callServer,void 0,findSourceMapURL,\"getSessionMetadata\");export{$$RSC_SERVER_ACTION_6 as getSessionMetadata};","/* __next_internal_action_entry_do_not_use__ [{\"402464c5c866ef8494d748952b4ba26f6692c7a923\":\"markSessionInitialized\"},\"src/app/actions/session.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_9=/*#__PURE__*/createServerReference(\"402464c5c866ef8494d748952b4ba26f6692c7a923\",callServer,void 0,findSourceMapURL,\"markSessionInitialized\");export{$$RSC_SERVER_ACTION_9 as markSessionInitialized};","/* __next_internal_action_entry_do_not_use__ [{\"7ffd1d7a123a75b75602aec263d51e6f4fb4f60132\":\"getSessionTerminalSources\"},\"src/app/actions/git.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_9=/*#__PURE__*/createServerReference(\"7ffd1d7a123a75b75602aec263d51e6f4fb4f60132\",callServer,void 0,findSourceMapURL,\"getSessionTerminalSources\");export{$$RSC_SERVER_ACTION_9 as getSessionTerminalSources};","/* __next_internal_action_entry_do_not_use__ [{\"400a2fbbbc97983cdf1e0b7ecb2333d6a9cd23cd2d\":\"getSessionDivergence\"},\"src/app/actions/session.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_15=/*#__PURE__*/createServerReference(\"400a2fbbbc97983cdf1e0b7ecb2333d6a9cd23cd2d\",callServer,void 0,findSourceMapURL,\"getSessionDivergence\");export{$$RSC_SERVER_ACTION_15 as getSessionDivergence};","export const normalizePreviewUrl = (rawValue: string): string | null => {\n const trimmed = rawValue.trim();\n if (!trimmed) return null;\n if (/^https?:\\/\\//i.test(trimmed)) return trimmed;\n if (/^[a-z][a-z0-9+.-]*:\\/\\//i.test(trimmed)) return null;\n if (/^(mailto|javascript|data|tel):/i.test(trimmed)) return null;\n\n const firstSegment = trimmed.split('/')[0] ?? '';\n const colonIndex = firstSegment.indexOf(':');\n if (colonIndex > 0 && !firstSegment.startsWith('[')) {\n const hostCandidate = firstSegment.slice(0, colonIndex).toLowerCase();\n const trailing = firstSegment.slice(colonIndex + 1);\n const isLikelyHostWithPort = hostCandidate.includes('.')\n || hostCandidate === 'localhost'\n || /^\\d{1,3}(?:\\.\\d{1,3}){3}$/.test(hostCandidate)\n || /^\\d+$/.test(trailing);\n if (!isLikelyHostWithPort) return null;\n }\n\n const hostPort = firstSegment.includes('@') ? firstSegment.slice(firstSegment.lastIndexOf('@') + 1) : firstSegment;\n const host = hostPort.startsWith('[')\n ? hostPort.slice(1, Math.max(1, hostPort.indexOf(']'))).toLowerCase()\n : hostPort.split(':')[0].toLowerCase();\n\n const protocol = host === 'localhost' || host === '127.0.0.1' || host === '::1'\n ? 'http'\n : 'https';\n return `${protocol}://${trimmed}`;\n};\n","export const quoteShellArg = (value: string): string => `'${value.replace(/'/g, \"'\\\\''\")}'`;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [['path', { d: 'm15 18-6-6 6-6', key: '1wnfg3' }]];\n\n/**\n * @component @name ChevronLeft\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMTUgMTgtNi02IDYtNiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/chevron-left\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ChevronLeft = createLucideIcon('chevron-left', __iconNode);\n\nexport default ChevronLeft;\n","export type TerminalSessionRole = 'agent' | 'terminal';\nexport type GitRemoteProvider = 'github' | 'gitlab';\nexport type TerminalSessionEnvironment = {\n name: string;\n value: string;\n};\ntype DetectGitRemoteProviderOptions = {\n gitlabHosts?: string[];\n};\n\nfunction sanitizeTmuxSessionName(value: string): string {\n const safe = value.trim().replace(/[^a-zA-Z0-9_-]/g, '-');\n return safe || 'session';\n}\n\nexport function getTmuxSessionName(sessionName: string, role: TerminalSessionRole): string {\n return `viba-${sanitizeTmuxSessionName(sessionName).slice(0, 40)}-${role}`;\n}\n\nfunction normalizeGitRemoteUrl(remoteUrl: string): string {\n const trimmed = remoteUrl.trim();\n if (!trimmed) return '';\n\n if (/^[a-z][a-z0-9+.-]*:\\/\\//i.test(trimmed)) {\n return trimmed;\n }\n\n const scpLikeMatch = trimmed.match(/^([^@]+@)?([^:]+):(.+)$/);\n if (!scpLikeMatch) {\n return '';\n }\n\n const userPart = scpLikeMatch[1] || '';\n const host = scpLikeMatch[2];\n const path = scpLikeMatch[3].replace(/^\\/+/, '');\n return `ssh://${userPart}${host}/${path}`;\n}\n\nexport function parseGitRemoteHost(remoteUrl: string): string | null {\n const normalized = normalizeGitRemoteUrl(remoteUrl);\n if (!normalized) return null;\n\n try {\n return new URL(normalized).hostname.toLowerCase();\n } catch {\n return null;\n }\n}\n\nfunction normalizeKnownHost(value: string): string | null {\n const trimmed = value.trim();\n if (!trimmed) return null;\n\n try {\n return new URL(trimmed).hostname.toLowerCase();\n } catch {\n // Fall through to parse as a bare host (optionally with port).\n }\n\n try {\n return new URL(`ssh://${trimmed}`).hostname.toLowerCase();\n } catch {\n return null;\n }\n}\n\nexport function detectGitRemoteProvider(\n remoteUrl: string,\n options?: DetectGitRemoteProviderOptions,\n): GitRemoteProvider | null {\n const host = parseGitRemoteHost(remoteUrl);\n if (!host) return null;\n\n if (host === 'github.com' || host.includes('github')) {\n return 'github';\n }\n\n if (host === 'gitlab.com' || host.includes('gitlab')) {\n return 'gitlab';\n }\n\n if (options?.gitlabHosts?.some((knownHost) => normalizeKnownHost(knownHost) === host)) {\n return 'gitlab';\n }\n\n return null;\n}\n\nexport function buildTtydTerminalSrc(\n sessionName: string,\n role: TerminalSessionRole,\n environment?: TerminalSessionEnvironment | TerminalSessionEnvironment[] | null,\n): string {\n const tmuxSession = getTmuxSessionName(sessionName, role);\n const params = new URLSearchParams();\n params.append('arg', 'new-session');\n const environments = Array.isArray(environment)\n ? environment\n : environment\n ? [environment]\n : [];\n\n for (const env of environments) {\n if (!env.value) continue;\n params.append('arg', '-e');\n params.append('arg', `${env.name}=${env.value}`);\n }\n params.append('arg', '-A');\n params.append('arg', '-s');\n params.append('arg', tmuxSession);\n return `/terminal?${params.toString()}`;\n}\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '12', cy: '5', r: '1', key: 'gxeob9' }],\n ['circle', { cx: '19', cy: '5', r: '1', key: 'w8mnmm' }],\n ['circle', { cx: '5', cy: '5', r: '1', key: 'lttvr7' }],\n ['circle', { cx: '12', cy: '12', r: '1', key: '41hilf' }],\n ['circle', { cx: '19', cy: '12', r: '1', key: '1wjl8i' }],\n ['circle', { cx: '5', cy: '12', r: '1', key: '1pcz8c' }],\n ['circle', { cx: '12', cy: '19', r: '1', key: 'lyex9k' }],\n ['circle', { cx: '19', cy: '19', r: '1', key: 'shf9b7' }],\n ['circle', { cx: '5', cy: '19', r: '1', key: 'bfqh0e' }],\n];\n\n/**\n * @component @name Grip\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjUiIHI9IjEiIC8+CiAgPGNpcmNsZSBjeD0iMTkiIGN5PSI1IiByPSIxIiAvPgogIDxjaXJjbGUgY3g9IjUiIGN5PSI1IiByPSIxIiAvPgogIDxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjEiIC8+CiAgPGNpcmNsZSBjeD0iMTkiIGN5PSIxMiIgcj0iMSIgLz4KICA8Y2lyY2xlIGN4PSI1IiBjeT0iMTIiIHI9IjEiIC8+CiAgPGNpcmNsZSBjeD0iMTIiIGN5PSIxOSIgcj0iMSIgLz4KICA8Y2lyY2xlIGN4PSIxOSIgY3k9IjE5IiByPSIxIiAvPgogIDxjaXJjbGUgY3g9IjUiIGN5PSIxOSIgcj0iMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/grip\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Grip = createLucideIcon('grip', __iconNode);\n\nexport default Grip;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8', key: 'v9h5vc' }],\n ['path', { d: 'M21 3v5h-5', key: '1q7to0' }],\n ['path', { d: 'M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16', key: '3uifl3' }],\n ['path', { d: 'M8 16H3v5', key: '1cv678' }],\n];\n\n/**\n * @component @name RefreshCw\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMyAxMmE5IDkgMCAwIDEgOS05IDkuNzUgOS43NSAwIDAgMSA2Ljc0IDIuNzRMMjEgOCIgLz4KICA8cGF0aCBkPSJNMjEgM3Y1aC01IiAvPgogIDxwYXRoIGQ9Ik0yMSAxMmE5IDkgMCAwIDEtOSA5IDkuNzUgOS43NSAwIDAgMS02Ljc0LTIuNzRMMyAxNiIgLz4KICA8cGF0aCBkPSJNOCAxNkgzdjUiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/refresh-cw\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst RefreshCw = createLucideIcon('refresh-cw', __iconNode);\n\nexport default RefreshCw;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 20h-1a2 2 0 0 1-2-2 2 2 0 0 1-2 2H6', key: '1528k5' }],\n ['path', { d: 'M13 8h7a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2h-7', key: '13ksps' }],\n ['path', { d: 'M5 16H4a2 2 0 0 1-2-2v-4a2 2 0 0 1 2-2h1', key: '1n9rhb' }],\n ['path', { d: 'M6 4h1a2 2 0 0 1 2 2 2 2 0 0 1 2-2h1', key: '1mj8rg' }],\n ['path', { d: 'M9 6v12', key: 'velyjx' }],\n];\n\n/**\n * @component @name TextCursorInput\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgMjBoLTFhMiAyIDAgMCAxLTItMiAyIDIgMCAwIDEtMiAySDYiIC8+CiAgPHBhdGggZD0iTTEzIDhoN2EyIDIgMCAwIDEgMiAydjRhMiAyIDAgMCAxLTIgMmgtNyIgLz4KICA8cGF0aCBkPSJNNSAxNkg0YTIgMiAwIDAgMS0yLTJ2LTRhMiAyIDAgMCAxIDItMmgxIiAvPgogIDxwYXRoIGQ9Ik02IDRoMWEyIDIgMCAwIDEgMiAyIDIgMiAwIDAgMSAyLTJoMSIgLz4KICA8cGF0aCBkPSJNOSA2djEyIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/text-cursor-input\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst TextCursorInput = createLucideIcon('text-cursor-input', __iconNode);\n\nexport default TextCursorInput;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8', key: '1p45f6' }],\n ['path', { d: 'M21 3v5h-5', key: '1q7to0' }],\n];\n\n/**\n * @component @name RotateCw\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjEgMTJhOSA5IDAgMSAxLTktOWMyLjUyIDAgNC45MyAxIDYuNzQgMi43NEwyMSA4IiAvPgogIDxwYXRoIGQ9Ik0yMSAzdjVoLTUiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/rotate-cw\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst RotateCw = createLucideIcon('rotate-cw', __iconNode);\n\nexport default RotateCw;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M5 12h14', key: '1ays0h' }],\n ['path', { d: 'm12 5 7 7-7 7', key: 'xquz4c' }],\n];\n\n/**\n * @component @name ArrowRight\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNSAxMmgxNCIgLz4KICA8cGF0aCBkPSJtMTIgNSA3IDctNyA3IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/arrow-right\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ArrowRight = createLucideIcon('arrow-right', __iconNode);\n\nexport default ArrowRight;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '5', cy: '6', r: '3', key: '1qnov2' }],\n ['path', { d: 'M5 9v12', key: 'ih889a' }],\n ['circle', { cx: '19', cy: '18', r: '3', key: '1qljk2' }],\n ['path', { d: 'm15 9-3-3 3-3', key: '1lwv8l' }],\n ['path', { d: 'M12 6h5a2 2 0 0 1 2 2v7', key: '1yj91y' }],\n];\n\n/**\n * @component @name GitPullRequestArrow\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSI1IiBjeT0iNiIgcj0iMyIgLz4KICA8cGF0aCBkPSJNNSA5djEyIiAvPgogIDxjaXJjbGUgY3g9IjE5IiBjeT0iMTgiIHI9IjMiIC8+CiAgPHBhdGggZD0ibTE1IDktMy0zIDMtMyIgLz4KICA8cGF0aCBkPSJNMTIgNmg1YTIgMiAwIDAgMSAyIDJ2NyIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/git-pull-request-arrow\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst GitPullRequestArrow = createLucideIcon('git-pull-request-arrow', __iconNode);\n\nexport default GitPullRequestArrow;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z',\n key: '10ikf1',\n },\n ],\n];\n\n/**\n * @component @name Play\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNSA1YTIgMiAwIDAgMSAzLjAwOC0xLjcyOGwxMS45OTcgNi45OThhMiAyIDAgMCAxIC4wMDMgMy40NThsLTEyIDdBMiAyIDAgMCAxIDUgMTl6IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/play\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Play = createLucideIcon('play', __iconNode);\n\nexport default Play;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M4.037 4.688a.495.495 0 0 1 .651-.651l16 6.5a.5.5 0 0 1-.063.947l-6.124 1.58a2 2 0 0 0-1.438 1.435l-1.579 6.126a.5.5 0 0 1-.947.063z',\n key: 'edeuup',\n },\n ],\n];\n\n/**\n * @component @name MousePointer2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNC4wMzcgNC42ODhhLjQ5NS40OTUgMCAwIDEgLjY1MS0uNjUxbDE2IDYuNWEuNS41IDAgMCAxLS4wNjMuOTQ3bC02LjEyNCAxLjU4YTIgMiAwIDAgMC0xLjQzOCAxLjQzNWwtMS41NzkgNi4xMjZhLjUuNSAwIDAgMS0uOTQ3LjA2M3oiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/mouse-pointer-2\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst MousePointer2 = createLucideIcon('mouse-pointer-2', __iconNode);\n\nexport default MousePointer2;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'm6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2',\n key: 'usdka0',\n },\n ],\n];\n\n/**\n * @component @name FolderOpen\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtNiAxNCAxLjUtMi45QTIgMiAwIDAgMSA5LjI0IDEwSDIwYTIgMiAwIDAgMSAxLjk0IDIuNWwtMS41NCA2YTIgMiAwIDAgMS0xLjk1IDEuNUg0YTIgMiAwIDAgMS0yLTJWNWEyIDIgMCAwIDEgMi0yaDMuOWEyIDIgMCAwIDEgMS42OS45bC44MSAxLjJhMiAyIDAgMCAwIDEuNjcuOUgxOGEyIDIgMCAwIDEgMiAydjIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/folder-open\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst FolderOpen = createLucideIcon('folder-open', __iconNode);\n\nexport default FolderOpen;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '18', cy: '18', r: '3', key: '1xkwt0' }],\n ['circle', { cx: '6', cy: '6', r: '3', key: '1lh9wr' }],\n ['path', { d: 'M6 21V9a9 9 0 0 0 9 9', key: '7kw0sc' }],\n];\n\n/**\n * @component @name GitMerge\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxOCIgY3k9IjE4IiByPSIzIiAvPgogIDxjaXJjbGUgY3g9IjYiIGN5PSI2IiByPSIzIiAvPgogIDxwYXRoIGQ9Ik02IDIxVjlhOSA5IDAgMCAwIDkgOSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/git-merge\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst GitMerge = createLucideIcon('git-merge', __iconNode);\n\nexport default GitMerge;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M15 12h-5', key: 'r7krc0' }],\n ['path', { d: 'M15 8h-5', key: '1khuty' }],\n ['path', { d: 'M19 17V5a2 2 0 0 0-2-2H4', key: 'zz82l3' }],\n [\n 'path',\n {\n d: 'M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3',\n key: '1ph1d7',\n },\n ],\n];\n\n/**\n * @component @name ScrollText\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTUgMTJoLTUiIC8+CiAgPHBhdGggZD0iTTE1IDhoLTUiIC8+CiAgPHBhdGggZD0iTTE5IDE3VjVhMiAyIDAgMCAwLTItMkg0IiAvPgogIDxwYXRoIGQ9Ik04IDIxaDEyYTIgMiAwIDAgMCAyLTJ2LTFhMSAxIDAgMCAwLTEtMUgxMWExIDEgMCAwIDAtMSAxdjFhMiAyIDAgMSAxLTQgMFY1YTIgMiAwIDEgMC00IDB2MmExIDEgMCAwIDAgMSAxaDMiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/scroll-text\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ScrollText = createLucideIcon('scroll-text', __iconNode);\n\nexport default ScrollText;\n","import { useCallback } from 'react';\nimport type { MutableRefObject } from 'react';\nimport { normalizePreviewUrl } from '@/lib/url';\n\nexport type TerminalWindow = Window & {\n term?: {\n paste: (text: string) => void;\n scrollToBottom?: () => void;\n attachCustomKeyEventHandler?: (customKeyEventHandler: (event: KeyboardEvent) => boolean) => void;\n customKeyEventHandler?: (event: KeyboardEvent) => boolean;\n buffer?: {\n active?: {\n baseY: number;\n cursorY: number;\n getLine?: (lineIndex: number) => { translateToString: (trimRight?: boolean) => string } | undefined;\n };\n };\n options: {\n linkHandler?: TerminalLinkHandler | null;\n theme?: Record<string, string>;\n [key: string]: unknown;\n };\n _core?: {\n _linkProviderService?: {\n linkProviders?: Map<number, TerminalLinkProvider>;\n };\n coreService?: {\n triggerDataEvent?: (data: string, wasUserInput?: boolean) => void;\n };\n };\n };\n};\n\nexport type TerminalLinkProvider = {\n _handler?: (event: MouseEvent | undefined, url: string) => void;\n provideLinks?: (line: number, callback: (links: TerminalLink[] | undefined) => void) => void;\n};\n\nexport type TerminalLink = {\n text: string;\n activate?: (event: MouseEvent | undefined, text: string) => void;\n [key: string]: unknown;\n};\n\nexport type TerminalLinkHandler = {\n allowNonHttpProtocols?: boolean;\n activate?: (event: MouseEvent | undefined, url: string, range?: unknown) => void;\n hover?: (event: MouseEvent | undefined, url: string, range?: unknown) => void;\n leave?: (event: MouseEvent | undefined, url: string, range?: unknown) => void;\n};\n\nexport type TerminalLinkHandlerOptions = {\n onLinkActivated?: () => void;\n directOpenBehavior?: TerminalLinkOpenBehavior;\n modifierOpenBehavior?: TerminalLinkOpenBehavior;\n};\n\ninterface UseTerminalLinkProps {\n onLoadPreview: (url: string, openPreview: boolean) => Promise<boolean>;\n}\n\nexport type TerminalLinkOpenBehavior = 'preview' | 'new_tab';\n\nexport function useTerminalLink({ onLoadPreview }: UseTerminalLinkProps) {\n const handleTerminalLinkOpen = useCallback((rawUrl: string, openBehavior: TerminalLinkOpenBehavior): boolean => {\n const normalized = normalizePreviewUrl(rawUrl);\n if (!normalized) return false;\n\n if (openBehavior === 'new_tab') {\n window.open(normalized, '_blank', 'noopener,noreferrer');\n return true;\n }\n\n void onLoadPreview(normalized, true);\n return true;\n }, [onLoadPreview]);\n\n const attachTerminalLinkHandler = useCallback((\n iframe: HTMLIFrameElement,\n cleanupRef: MutableRefObject<(() => void) | null>,\n options?: TerminalLinkHandlerOptions\n ) => {\n cleanupRef.current?.();\n const frameWindow = iframe.contentWindow as TerminalWindow | null;\n const terminal = frameWindow?.term;\n if (!frameWindow || !terminal) return;\n const notifyLinkActivated = options?.onLinkActivated;\n const directOpenBehavior = options?.directOpenBehavior ?? 'preview';\n const modifierOpenBehavior = options?.modifierOpenBehavior ?? 'new_tab';\n const resolveOpenBehavior = (openWithModifier: boolean): TerminalLinkOpenBehavior => (\n openWithModifier ? modifierOpenBehavior : directOpenBehavior\n );\n\n const restorers: Array<() => void> = [];\n\n const frameDocument = iframe.contentDocument;\n let lastModifierState = {\n metaKey: false,\n ctrlKey: false,\n at: 0,\n };\n\n if (frameDocument) {\n const recordModifierState = (event: MouseEvent) => {\n lastModifierState = {\n metaKey: event.metaKey,\n ctrlKey: event.ctrlKey,\n at: Date.now(),\n };\n };\n\n frameDocument.addEventListener('mousedown', recordModifierState, true);\n frameDocument.addEventListener('click', recordModifierState, true);\n restorers.push(() => {\n frameDocument.removeEventListener('mousedown', recordModifierState, true);\n frameDocument.removeEventListener('click', recordModifierState, true);\n });\n }\n\n const originalOpen = frameWindow.open.bind(frameWindow);\n const patchedOpen: Window['open'] = (...args) => {\n const openWithModifier = Date.now() - lastModifierState.at < 1000;\n const shouldTreatAsModifierOpen = openWithModifier && (lastModifierState.metaKey || lastModifierState.ctrlKey);\n const openBehavior = resolveOpenBehavior(shouldTreatAsModifierOpen);\n\n if (typeof args[0] === 'string' && args[0].trim()) {\n notifyLinkActivated?.();\n const handled = handleTerminalLinkOpen(args[0], openBehavior);\n if (handled) {\n return null;\n }\n return originalOpen(...args);\n }\n\n if (args.length === 0) {\n let fallbackWindow: Window | null = null;\n const syntheticWindow = {\n opener: null,\n location: {\n set href(url: string) {\n notifyLinkActivated?.();\n const handled = handleTerminalLinkOpen(url, openBehavior);\n\n if (!handled) {\n fallbackWindow = originalOpen();\n if (fallbackWindow) {\n try {\n fallbackWindow.opener = null;\n } catch {\n // Ignore opener assignment failures\n }\n fallbackWindow.location.href = url;\n }\n }\n },\n get href() {\n return '';\n },\n },\n } as unknown as Window;\n\n return syntheticWindow;\n }\n\n return originalOpen(...args);\n };\n\n frameWindow.open = patchedOpen;\n restorers.push(() => {\n frameWindow.open = originalOpen;\n });\n\n const providers = terminal._core?._linkProviderService?.linkProviders;\n\n if (providers instanceof Map) {\n for (const provider of providers.values()) {\n if (!provider || typeof provider !== 'object') continue;\n\n if (typeof provider._handler === 'function') {\n const originalHandler = provider._handler;\n provider._handler = (event: MouseEvent | undefined, url: string) => {\n notifyLinkActivated?.();\n const shouldTreatAsModifierOpen = Boolean(event?.metaKey || event?.ctrlKey);\n const handled = handleTerminalLinkOpen(url, resolveOpenBehavior(shouldTreatAsModifierOpen));\n if (!handled) {\n originalHandler(event, url);\n }\n };\n\n restorers.push(() => {\n provider._handler = originalHandler;\n });\n }\n\n if (typeof provider.provideLinks === 'function') {\n const originalProvideLinks = provider.provideLinks.bind(provider);\n provider.provideLinks = (line: number, callback: (links: TerminalLink[] | undefined) => void) => {\n originalProvideLinks(line, (links: TerminalLink[] | undefined) => {\n if (Array.isArray(links)) {\n for (const link of links) {\n if (!link || typeof link !== 'object') continue;\n if (typeof link.activate !== 'function') continue;\n\n const originalActivate = link.activate.bind(link);\n link.activate = (event: MouseEvent | undefined, text: string) => {\n notifyLinkActivated?.();\n const shouldTreatAsModifierOpen = Boolean(event?.metaKey || event?.ctrlKey);\n const handled = handleTerminalLinkOpen(text, resolveOpenBehavior(shouldTreatAsModifierOpen));\n if (!handled) {\n originalActivate(event, text);\n }\n };\n }\n }\n callback(links);\n });\n };\n\n restorers.push(() => {\n provider.provideLinks = originalProvideLinks;\n });\n }\n }\n }\n\n const existingLinkHandler = terminal.options.linkHandler;\n const nextLinkHandler: TerminalLinkHandler = {\n allowNonHttpProtocols: existingLinkHandler?.allowNonHttpProtocols ?? false,\n activate: (event, url, range) => {\n notifyLinkActivated?.();\n const shouldTreatAsModifierOpen = Boolean(event?.metaKey || event?.ctrlKey);\n const handled = handleTerminalLinkOpen(url, resolveOpenBehavior(shouldTreatAsModifierOpen));\n if (!handled) {\n existingLinkHandler?.activate?.(event, url, range);\n }\n },\n hover: (event, url, range) => {\n existingLinkHandler?.hover?.(event, url, range);\n },\n leave: (event, url, range) => {\n existingLinkHandler?.leave?.(event, url, range);\n },\n };\n\n terminal.options.linkHandler = nextLinkHandler;\n restorers.push(() => {\n terminal.options.linkHandler = existingLinkHandler ?? null;\n });\n\n cleanupRef.current = () => {\n for (const restore of restorers) {\n restore();\n }\n cleanupRef.current = null;\n };\n }, [handleTerminalLinkOpen]);\n\n return { handleTerminalLinkOpen, attachTerminalLinkHandler };\n}\n"],"names":[],"mappings":"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CAA,ACAA,CFAA,ACAA,ACAA,CDAA,ADAA,AEAA,CFAA,ACAA,ACAA,CFAA,AEAA,ADAA,CDAA,AEAA,ADAA,CAAA,ADAA,AEAA,CDAA,ACAA,AFAA,CEAA,ADAA,ADAA,CCAA,ADAA,AEAA,CDAA,ADAA,AEAA,CAAA,ADAA,ADAA,CEAA,AFAA,ACAA,CDAA,ACAA,ACAA,CDAA,ADAA,AEAA,CDAA,ACAA,AFAA,CEAA,ADAA,ADAA,CCAA,ACAA,AFAA,CCAA,ACAA,CAAA,ADAA,CAAA,ACAA,CDAA,ACAA,CDAA,ACAA,CDAA,ACAA,CDAA,ACAA,CAAA,ADAA,CAAA,ACAA,CDAA,ACAA,CAAA,ADAA,CCAA,ADAA,CCAA,ADAA,CCAA,ADAA,CAAA,ACAA,CAAA,ADAA,CAAA,ACAA,ClBQT,AkBRS,ADAA,CCAA,ADAA,CAAA,ACAA,CDAA,ACAA,CAAA,ADAA,AjBQT,CkBRS,ADAA,CCAA,ADAA,AjBQT,CkBRS,ADAA,CAAA,ACAA,AlBQT,CkBRS,ADAA,AjBQT,CAAA,AkBRS,ADAA,CCAA,ADAA,CCAA,ADAA,CAAA,ACAA,CDAA,ACAA,CAAA,ADAA,CCAA,ADAA,CjBST,AkBTS,ADAA,CAAA,ACAA,CDAA,ACAA,AlBST,CkBTS,ADAA,CjBST,AkBTS,ADAA,CjBST,AkBTS,ADAA,CAAA,ACAA,AlBST,CiBTS,ACAA,CAAA,ADAA,CCAA,ADAA,CCAA,ADAA,CAAA,ACAA,CAAA,ADAA,CAAA,ACAA,CDAA,ACAA,CDAA,ACAA,CAAA,CAAA,APcH,COdG,CAAA,APcH,CAAA,AOdG,CAAA,CPcS,AOdT,CAAA,CPcS,AOdT,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,APcS,COdT,CPcS,AOdT,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,mDPH6D,CCAN,ACAK,AFAC,CEAD,AFAC,EAAA,UAAe,yGAEd,CCAN,ADAM,CAAA,EAAA,QAAK,CAAU,CAAA,SAC3E,CAAA,ADAR,AE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","ignoreList":[18,20,21,22,23,24,25,26,27,28,29,30]}
1
+ {"version":3,"sources":["../../../../src/app/actions/data%3Aca55ce%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Ab289b3%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A974fa8%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Ad2ea99%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A228e8c%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Af9ae24%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Ae2728b%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A62fae6%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A1c3568%20%3Ctext/javascript%3E","../../../../src/components/SessionRepoViewer.tsx","../../../../src/app/actions/data%3Aa7af54%20%3Ctext/javascript%3E","../../../../src/components/SessionView.tsx","../../../../src/app/actions/data%3Ae78521%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A9e1a72%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A81fdf2%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A610aa9%20%3Ctext/javascript%3E","../../../../src/app/session/%5BsessionId%5D/SessionPageClient.tsx","../../../../src/lib/url.ts","../../../../src/lib/shell.ts","../../../../node_modules/lucide-react/src/icons/chevron-left.ts","../../../../src/lib/terminal-session.ts","../../../../node_modules/lucide-react/src/icons/refresh-cw.ts","../../../../node_modules/lucide-react/src/icons/text-cursor-input.ts","../../../../node_modules/lucide-react/src/icons/rotate-cw.ts","../../../../node_modules/lucide-react/src/icons/arrow-right.ts","../../../../node_modules/lucide-react/src/icons/git-pull-request-arrow.ts","../../../../node_modules/lucide-react/src/icons/scroll-text.ts","../../../../node_modules/lucide-react/src/icons/git-merge.ts","../../../../node_modules/lucide-react/src/icons/arrow-up.ts","../../../../node_modules/lucide-react/src/icons/arrow-down.ts","../../../../node_modules/lucide-react/src/icons/grip.ts","../../../../node_modules/lucide-react/src/icons/mouse-pointer-2.ts","../../../../node_modules/lucide-react/src/icons/folder-open.ts","../../../../node_modules/lucide-react/src/icons/play.ts","../../../../src/hooks/useTerminalLink.ts"],"sourcesContent":["/* __next_internal_action_entry_do_not_use__ [{\"40cc0c9501c6170b0db6952f9febac267c3e34dd90\":\"deleteSessionInBackground\"},\"src/app/actions/session.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_11=/*#__PURE__*/createServerReference(\"40cc0c9501c6170b0db6952f9febac267c3e34dd90\",callServer,void 0,findSourceMapURL,\"deleteSessionInBackground\");export{$$RSC_SERVER_ACTION_11 as deleteSessionInBackground};","/* __next_internal_action_entry_do_not_use__ [{\"40b027e897940edbfe8f521444197813cd46c8d2ad\":\"getSessionDivergence\"},\"src/app/actions/session.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_15=/*#__PURE__*/createServerReference(\"40b027e897940edbfe8f521444197813cd46c8d2ad\",callServer,void 0,findSourceMapURL,\"getSessionDivergence\");export{$$RSC_SERVER_ACTION_15 as getSessionDivergence};","/* __next_internal_action_entry_do_not_use__ [{\"40bc835a39bd70c384755edf6da4e0b64e7551740f\":\"listSessionBaseBranches\"},\"src/app/actions/session.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_16=/*#__PURE__*/createServerReference(\"40bc835a39bd70c384755edf6da4e0b64e7551740f\",callServer,void 0,findSourceMapURL,\"listSessionBaseBranches\");export{$$RSC_SERVER_ACTION_16 as listSessionBaseBranches};","/* __next_internal_action_entry_do_not_use__ [{\"40bd7ffa56008827861a32b7412dac761dbddce33c\":\"mergeSessionToBase\"},\"src/app/actions/session.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_12=/*#__PURE__*/createServerReference(\"40bd7ffa56008827861a32b7412dac761dbddce33c\",callServer,void 0,findSourceMapURL,\"mergeSessionToBase\");export{$$RSC_SERVER_ACTION_12 as mergeSessionToBase};","/* __next_internal_action_entry_do_not_use__ [{\"40a2d86eb857cb8f4d8f9518e6890005ac19946cb9\":\"rebaseSessionOntoBase\"},\"src/app/actions/session.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_13=/*#__PURE__*/createServerReference(\"40a2d86eb857cb8f4d8f9518e6890005ac19946cb9\",callServer,void 0,findSourceMapURL,\"rebaseSessionOntoBase\");export{$$RSC_SERVER_ACTION_13 as rebaseSessionOntoBase};","/* __next_internal_action_entry_do_not_use__ [{\"606a69b5ea407b6583d81313a6067ccb91cd35682e\":\"updateSessionBaseBranch\"},\"src/app/actions/session.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_18=/*#__PURE__*/createServerReference(\"606a69b5ea407b6583d81313a6067ccb91cd35682e\",callServer,void 0,findSourceMapURL,\"updateSessionBaseBranch\");export{$$RSC_SERVER_ACTION_18 as updateSessionBaseBranch};","/* __next_internal_action_entry_do_not_use__ [{\"604d59af663b043196561c3549dfc49a89a5b72f0a\":\"writeSessionPromptFile\"},\"src/app/actions/session.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_1=/*#__PURE__*/createServerReference(\"604d59af663b043196561c3549dfc49a89a5b72f0a\",callServer,void 0,findSourceMapURL,\"writeSessionPromptFile\");export{$$RSC_SERVER_ACTION_1 as writeSessionPromptFile};","/* __next_internal_action_entry_do_not_use__ [{\"7f0797df1c7c8122374299f1696673e8c3cce43084\":\"setTmuxSessionMouseMode\"},\"src/app/actions/git.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_11=/*#__PURE__*/createServerReference(\"7f0797df1c7c8122374299f1696673e8c3cce43084\",callServer,void 0,findSourceMapURL,\"setTmuxSessionMouseMode\");export{$$RSC_SERVER_ACTION_11 as setTmuxSessionMouseMode};","/* __next_internal_action_entry_do_not_use__ [{\"7f9ee0ea207374a1a3e0d4c314181b61c0979aa154\":\"setTmuxSessionStatusVisibility\"},\"src/app/actions/git.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_12=/*#__PURE__*/createServerReference(\"7f9ee0ea207374a1a3e0d4c314181b61c0979aa154\",callServer,void 0,findSourceMapURL,\"setTmuxSessionStatusVisibility\");export{$$RSC_SERVER_ACTION_12 as setTmuxSessionStatusVisibility};","'use client';\n\nimport { useMemo, useState } from 'react';\nimport { RefreshCw } from 'lucide-react';\nimport { useGitBranches, useGitLog, useGitMergeBase } from '@/hooks/use-git';\nimport { Commit } from '@/lib/types';\nimport { CommitChangesView } from './git/commit-changes-view';\n\nfunction formatCommitDate(value: string): string {\n const parsed = Date.parse(value);\n if (Number.isNaN(parsed)) return value;\n return new Date(parsed).toLocaleString();\n}\n\nfunction commitLabel(commit: Commit): string {\n return `${commit.hash} ${commit.message}`.trim();\n}\n\ntype SessionRepoViewerProps = {\n repoPath: string;\n branchHint?: string;\n baseBranchHint?: string;\n};\n\ntype CommitSelectionState =\n | { mode: 'auto'; hash: null }\n | { mode: 'manual'; hash: string }\n | { mode: 'unselected'; hash: null };\n\nexport function SessionRepoViewer({ repoPath, branchHint, baseBranchHint }: SessionRepoViewerProps) {\n const [selection, setSelection] = useState<CommitSelectionState>({ mode: 'auto', hash: null });\n const { data: branchData } = useGitBranches(repoPath);\n const {\n data: log,\n isLoading,\n isFetching,\n isError,\n error,\n refetch,\n } = useGitLog(repoPath, 200, { scope: 'current' });\n const allCommits = useMemo(() => log?.all ?? [], [log]);\n const currentBranch = branchData?.current?.trim() || branchHint?.trim() || 'unknown';\n const currentBranchRef = branchData?.current?.trim() || branchHint?.trim() || null;\n const baseBranchRef = baseBranchHint?.trim() || null;\n const { data: mergeBaseHash } = useGitMergeBase(repoPath, baseBranchRef, currentBranchRef);\n const commits = useMemo(() => {\n if (!mergeBaseHash) return allCommits;\n const normalizedMergeBase = mergeBaseHash.trim();\n if (!normalizedMergeBase) return allCommits;\n\n const branchPointIndex = allCommits.findIndex((commit) =>\n normalizedMergeBase.startsWith(commit.hash) || commit.hash.startsWith(normalizedMergeBase)\n );\n if (branchPointIndex < 0) return allCommits;\n return allCommits.slice(0, branchPointIndex + 1);\n }, [allCommits, mergeBaseHash]);\n const selectedCommitHash = useMemo(() => {\n if (commits.length === 0) return null;\n if (selection.mode === 'unselected') return null;\n if (selection.mode === 'manual' && commits.some((commit) => commit.hash === selection.hash)) {\n return selection.hash;\n }\n return commits[0].hash;\n }, [commits, selection]);\n\n const handleCommitClick = (commitHash: string) => {\n if (selectedCommitHash === commitHash) {\n setSelection({ mode: 'unselected', hash: null });\n return;\n }\n setSelection({ mode: 'manual', hash: commitHash });\n };\n\n return (\n <div className=\"flex h-full min-h-0 flex-col bg-slate-50 dark:bg-[#0d1117]\">\n <div className=\"flex min-h-0 flex-[2] flex-col border-b border-slate-200 dark:border-[#30363d]\">\n <div className=\"flex h-9 shrink-0 items-center justify-between border-b border-slate-200 px-3 text-[11px] font-semibold text-slate-600 dark:border-[#30363d] dark:bg-[#161b22] dark:text-slate-400\">\n <div className=\"flex min-w-0 items-center gap-2 uppercase tracking-wide\">\n <span className=\"h-2 w-2 shrink-0 rounded-full bg-emerald-500\"></span>\n <span className=\"truncate\">Repo Diff</span>\n <span className=\"truncate opacity-70 normal-case\" title={currentBranch}>\n {currentBranch}\n </span>\n </div>\n <span className=\"shrink-0 text-[10px] opacity-70\">\n {commits.length} commit{commits.length === 1 ? '' : 's'}\n </span>\n </div>\n <div className=\"min-h-0 flex-1\">\n <CommitChangesView\n repoPath={repoPath}\n commitHash={selectedCommitHash}\n showWorkingTreeWhenNoCommit\n fileListWidthClass=\"w-52\"\n />\n </div>\n </div>\n\n <div className=\"flex min-h-0 flex-1 flex-col\">\n <div className=\"flex h-9 shrink-0 items-center justify-between border-b border-slate-200 px-3 text-[11px] font-semibold text-slate-600 dark:border-[#30363d] dark:bg-[#161b22] dark:text-slate-400\">\n <span className=\"uppercase tracking-wide\">Commit History</span>\n <button\n type=\"button\"\n className=\"btn btn-ghost btn-xs h-6 min-h-6 w-7 border-none p-0 text-slate-600 hover:bg-slate-100 dark:text-slate-300 dark:hover:bg-[#30363d]/60\"\n onClick={() => void refetch()}\n title=\"Refresh commit history\"\n aria-label=\"Refresh commit history\"\n >\n <RefreshCw className={`h-3.5 w-3.5 ${isFetching ? 'animate-spin' : ''}`} />\n </button>\n </div>\n <div className=\"min-h-0 flex-1 overflow-y-auto\">\n {isLoading ? (\n <div className=\"flex h-full items-center justify-center text-xs text-slate-500 dark:text-slate-400\">\n <span className=\"loading loading-spinner loading-sm\"></span>\n </div>\n ) : isError ? (\n <div className=\"flex h-full items-center justify-center px-6 text-center text-xs text-red-500 dark:text-red-300\">\n {error instanceof Error ? error.message : 'Failed to load commit history'}\n </div>\n ) : commits.length === 0 ? (\n <div className=\"flex h-full items-center justify-center px-6 text-center text-xs text-slate-500 dark:text-slate-400\">\n No commits found on this branch.\n </div>\n ) : (\n <div className=\"divide-y divide-slate-200 dark:divide-[#30363d]\">\n {commits.map((commit) => {\n const isSelected = selectedCommitHash === commit.hash;\n return (\n <button\n key={commit.hash}\n type=\"button\"\n onClick={() => handleCommitClick(commit.hash)}\n className={`w-full px-3 py-2 text-left transition-colors ${isSelected\n ? 'bg-blue-100/80 dark:bg-[#1f2a3d]'\n : 'hover:bg-slate-100 dark:hover:bg-[#161b22]'\n }`}\n title={commitLabel(commit)}\n >\n <div className=\"flex items-center gap-2 text-[11px] font-mono text-slate-500 dark:text-slate-400\">\n <span className=\"rounded bg-slate-200 px-1.5 py-0.5 dark:bg-[#30363d]\">{commit.hash}</span>\n <span className=\"truncate\">{formatCommitDate(commit.date)}</span>\n </div>\n <div className=\"mt-1 truncate text-xs font-medium text-slate-800 dark:text-slate-100\">\n {commit.message || '(no subject)'}\n </div>\n <div className=\"truncate text-[11px] text-slate-500 dark:text-slate-400\">\n {commit.author_name}\n </div>\n </button>\n );\n })}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"70086e0eb5e603d60919247c8c66349492206bb0b3\":\"createSessionBaseBranch\"},\"src/app/actions/session.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_17=/*#__PURE__*/createServerReference(\"70086e0eb5e603d60919247c8c66349492206bb0b3\",callServer,void 0,findSourceMapURL,\"createSessionBaseBranch\");export{$$RSC_SERVER_ACTION_17 as createSessionBaseBranch};","'use client';\n\nimport React, { useRef, useState, useEffect, useCallback, useMemo } from 'react';\n// import { useRouter } from 'next/navigation';\nimport {\n createSessionBaseBranch,\n deleteSessionInBackground,\n getSessionDivergence,\n listSessionBaseBranches,\n mergeSessionToBase,\n rebaseSessionOntoBase,\n updateSessionBaseBranch,\n writeSessionPromptFile\n} from '@/app/actions/session';\nimport { setTmuxSessionMouseMode, setTmuxSessionStatusVisibility } from '@/app/actions/git';\nimport { getConfig, updateConfig } from '@/app/actions/config';\nimport { Trash2, ExternalLink, Play, GitMerge, GitPullRequestArrow, GitBranch, ArrowUp, ArrowDown, FolderOpen, ChevronLeft, ChevronRight, Grip, ChevronDown, Plus, MousePointer2, ArrowLeft, ArrowRight, RotateCw, ScrollText, TextCursorInput, X } from 'lucide-react';\nimport SessionFileBrowser from './SessionFileBrowser';\nimport { SessionRepoViewer } from './SessionRepoViewer';\nimport { getBaseName, isWindowsAbsolutePath } from '@/lib/path';\nimport { notifySessionsUpdated } from '@/lib/session-updates';\nimport { buildTtydTerminalSrc } from '@/lib/terminal-session';\nimport { normalizePreviewUrl } from '@/lib/url';\nimport { sanitizeBranchName } from '@/lib/utils';\nimport { useTerminalLink, type TerminalWindow } from '@/hooks/useTerminalLink';\nimport { quoteShellArg } from '@/lib/shell';\nimport {\n applyThemeToTerminalIframe,\n applyThemeToTerminalWindow,\n readThemeModeFromStorage,\n THEME_MODE_STORAGE_KEY,\n THEME_REFRESH_EVENT,\n} from '@/lib/ttyd-theme';\n\nconst SUPPORTED_IDES = [\n { id: 'vscode', name: 'VS Code', protocol: 'vscode' },\n { id: 'cursor', name: 'Cursor', protocol: 'cursor' },\n { id: 'windsurf', name: 'Windsurf', protocol: 'windsurf' },\n { id: 'antigravity', name: 'Antigravity', protocol: 'antigravity' },\n];\n\n\ntype CleanupPhase = 'idle' | 'error';\n\ntype PreviewNavigationAction = 'back' | 'forward' | 'reload';\ntype TerminalBootstrapSlot = 'agent' | 'terminal';\ntype TerminalBootstrapState = 'idle' | 'in_progress' | 'done';\ntype TerminalBootstrapRegistry = Record<string, TerminalBootstrapState>;\ntype TerminalInteractionMode = 'scroll' | 'select';\ntype TerminalOnWriteParsedDisposable = { dispose?: () => void };\ntype TerminalWithOnWriteParsed = NonNullable<TerminalWindow['term']> & {\n onWriteParsed?: (callback: () => void) => TerminalOnWriteParsedDisposable | void;\n};\ntype TerminalWithClearLineShortcutState = NonNullable<TerminalWindow['term']> & {\n __vibaClearLineShortcutInstalled?: boolean;\n};\n\nconst TERMINAL_SIZE_STORAGE_KEY = 'viba-terminal-size';\nconst SPLIT_RATIO_STORAGE_KEY = 'viba-agent-preview-split-ratio';\nconst RIGHT_PANEL_COLLAPSED_STORAGE_KEY = 'viba-right-panel-collapsed';\nconst DEFAULT_AGENT_PANE_RATIO = 0.5;\nconst TERMINAL_HEADER_HEIGHT = 36;\nconst TERMINAL_BOOTSTRAP_STORAGE_PREFIX = 'viba:terminal-bootstrap:';\nconst TERMINAL_BOOTSTRAP_RUNTIME_KEY = '__vibaTerminalBootstrapRegistry';\nconst SHELL_PROMPT_PATTERN = /(?:\\$|%|#|>) $/;\nconst CODEX_PLAIN_THEME_FLAG = '-c tui.theme=\"ansi\"';\nconst CODEX_MONOCHROME_ENV_PREFIX = 'NO_COLOR=1 CLICOLOR=0 CLICOLOR_FORCE=0 FORCE_COLOR=0 COLORTERM= TERM=xterm';\n\nconst PLAN_MODE_STARTUP_INSTRUCTION =\n 'Plan mode: inspect the relevant code first, present a concrete implementation plan, and wait for explicit user approval before any file edits or write commands.';\nconst AUTO_COMMIT_INSTRUCTION =\n 'After each round, if work is complete and files changed, commit all changes without confirmation. Use a commit message with a clear title and a detailed body explaining what changed and why. If GITHUB_TOKEN or GITLAB_TOKEN is set, push the current branch after committed rounds and create (or update) a pull/merge request with an appropriate title and description; include the pull/merge request link in the first push reply.';\nconst AGENT_BROWSER_SKILL_INSTRUCTION =\n 'For visual web tasks, use the `agent-browser` skill (https://skills.sh/vercel-labs/agent-browser/agent-browser).';\nconst SYSTEMATIC_DEBUGGING_SKILL_INSTRUCTION =\n 'For bugfix/debugging tasks, use the `systematic-debugging` skill (https://github.com/obra/superpowers).';\nconst VISUAL_EVIDENCE_INSTRUCTION =\n 'When working on a visual-related feature or bugfix in a web project, after coding is complete, use `agent-browser` or equivalent Chrome MCP tooling to load the relevant page, take screenshot(s), and include them as evidence in the pull/merge request.';\nconst NOTIFICATION_INSTRUCTION =\n 'When your task is completed or you need user attention (for plan approval, permissions, or blockers), send a notification to the matching Viba session.';\n\nconst clampAgentPaneRatio = (value: number): number => Math.max(0.2, Math.min(0.8, value));\n\ntype PreviewComponentStackEntry = {\n name?: unknown;\n source?: {\n fileName?: unknown;\n } | null;\n};\n\nconst normalizePickerSourceFileName = (value: string): string => {\n let normalized = value.trim();\n if (!normalized) return '';\n\n normalized = normalized.replace(/[#?].*$/, '');\n\n if (/^file:\\/\\//i.test(normalized)) {\n try {\n const asUrl = new URL(normalized);\n normalized = decodeURIComponent(asUrl.pathname);\n } catch {\n // Keep original value when URL parsing fails\n }\n } else if (/^https?:\\/\\//i.test(normalized)) {\n try {\n const asUrl = new URL(normalized);\n normalized = decodeURIComponent(asUrl.pathname);\n } catch {\n // Keep original value when URL parsing fails\n }\n }\n\n normalized = normalized\n .replace(/^webpack(?:-internal)?:\\/\\/\\/?/, '')\n .replace(/^rsc:\\/\\//, '')\n .replace(/^\\(.*?\\)\\//, '')\n .replace(/^\\/\\.\\//, '/')\n .replace(/^\\.\\//, '')\n .replace(/\\\\/g, '/');\n\n return normalized.trim();\n};\n\nconst joinPath = (base: string, relative: string): string => {\n const normalizedBase = base.replace(/\\\\/g, '/').replace(/\\/+$/, '');\n const normalizedRelative = relative.replace(/\\\\/g, '/').replace(/^\\/+/, '');\n return `${normalizedBase}/${normalizedRelative}`;\n};\n\nconst resolveComponentSourcePath = (rawSourceFileName: string, workspaceRoot: string): string | null => {\n const normalizedWorkspaceRoot = workspaceRoot.trim().replace(/\\\\/g, '/').replace(/\\/+$/, '');\n if (!normalizedWorkspaceRoot) return null;\n\n const normalizedSource = normalizePickerSourceFileName(rawSourceFileName);\n if (!normalizedSource) return null;\n\n if (normalizedSource.startsWith('/') || isWindowsAbsolutePath(normalizedSource)) {\n return normalizedSource;\n }\n\n const relativeCandidates = new Set<string>();\n relativeCandidates.add(normalizedSource.replace(/^\\.\\/+/, ''));\n\n const srcIndex = normalizedSource.indexOf('/src/');\n if (srcIndex >= 0) {\n relativeCandidates.add(normalizedSource.slice(srcIndex + 1));\n }\n\n if (normalizedSource.startsWith('src/')) {\n relativeCandidates.add(normalizedSource);\n }\n\n for (const relative of relativeCandidates) {\n if (!relative) continue;\n return joinPath(normalizedWorkspaceRoot, relative);\n }\n\n return null;\n};\n\nconst buildComponentReferenceText = (reactStack: unknown[], workspaceRoot: string): string | null => {\n for (const entry of reactStack) {\n if (!entry || typeof entry !== 'object') continue;\n\n const componentEntry = entry as PreviewComponentStackEntry;\n const componentName = typeof componentEntry.name === 'string' ? componentEntry.name.trim() : '';\n if (!componentName) continue;\n\n const sourceFileName = typeof componentEntry.source?.fileName === 'string'\n ? componentEntry.source.fileName.trim()\n : '';\n const sourcePath = sourceFileName ? resolveComponentSourcePath(sourceFileName, workspaceRoot) : null;\n\n if (sourcePath) {\n return `${componentName} (${sourcePath})`;\n }\n }\n\n return null;\n};\n\nconst normalizeComponentLookupName = (value: string): string => {\n const trimmed = value.trim();\n if (!trimmed) return '';\n\n const match = trimmed.match(/[A-Za-z_$][\\w$]*/);\n return match ? match[0] : '';\n};\n\nexport interface SessionViewProps {\n repo: string;\n worktree: string;\n branch: string;\n baseBranch?: string;\n sessionName: string;\n agent?: string;\n startupScript?: string;\n devServerScript?: string;\n initialMessage?: string;\n attachmentPaths?: string[];\n attachmentNames?: string[];\n title?: string;\n sessionMode?: 'fast' | 'plan';\n onExit: (force?: boolean) => void;\n isResume?: boolean;\n terminalPersistenceMode?: 'tmux' | 'shell';\n onSessionStart?: () => void;\n agentTerminalSrc?: string;\n floatingTerminalSrc?: string;\n}\n\nexport function SessionView({\n repo,\n worktree,\n branch,\n baseBranch,\n sessionName,\n agent,\n startupScript,\n devServerScript,\n initialMessage,\n attachmentPaths,\n attachmentNames,\n title,\n sessionMode = 'fast',\n onExit,\n isResume,\n terminalPersistenceMode = 'shell',\n onSessionStart,\n agentTerminalSrc: agentTerminalSrcOverride,\n floatingTerminalSrc: floatingTerminalSrcOverride,\n}: SessionViewProps) {\n const headerButtonLabelClass = 'hidden min-[1900px]:inline';\n\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const terminalRef = useRef<HTMLIFrameElement>(null);\n const terminalBootstrapRef = useRef<HTMLIFrameElement>(null);\n const previewIframeRef = useRef<HTMLIFrameElement>(null);\n const previewAddressInputRef = useRef<HTMLInputElement>(null);\n const splitContainerRef = useRef<HTMLDivElement>(null);\n const splitResizeRef = useRef({ startX: 0, startRatio: DEFAULT_AGENT_PANE_RATIO });\n const recentTerminalBlurRef = useRef<{ slot: TerminalBootstrapSlot; at: number } | null>(null);\n const agentFrameLinkCleanupRef = useRef<(() => void) | null>(null);\n const terminalFrameLinkCleanupRef = useRef<(() => void) | null>(null);\n const terminalProcessMonitorCleanupRef = useRef<(() => void) | null>(null);\n const terminalStartupScriptStateRef = useRef<{ injected: boolean; timer: number | null }>({\n injected: false,\n timer: null,\n });\n const agentTerminalSrc = useMemo(\n () => agentTerminalSrcOverride || buildTtydTerminalSrc(sessionName, 'agent'),\n [agentTerminalSrcOverride, sessionName],\n );\n const floatingTerminalSrc = useMemo(\n () => floatingTerminalSrcOverride || buildTtydTerminalSrc(sessionName, 'terminal'),\n [floatingTerminalSrcOverride, sessionName],\n );\n\n const terminalBootstrapStateRef = useRef<Record<TerminalBootstrapSlot, TerminalBootstrapState>>({\n agent: 'idle',\n terminal: 'idle',\n });\n const tmuxStatusAppliedRef = useRef<Record<TerminalBootstrapSlot, boolean>>({\n agent: false,\n terminal: false,\n });\n\n useEffect(() => {\n terminalBootstrapStateRef.current = {\n agent: 'idle',\n terminal: 'idle',\n };\n tmuxStatusAppliedRef.current = {\n agent: false,\n terminal: false,\n };\n if (terminalStartupScriptStateRef.current.timer !== null) {\n window.clearTimeout(terminalStartupScriptStateRef.current.timer);\n }\n terminalStartupScriptStateRef.current = {\n injected: false,\n timer: null,\n };\n }, [sessionName]);\n\n useEffect(() => {\n return () => {\n if (terminalStartupScriptStateRef.current.timer !== null) {\n window.clearTimeout(terminalStartupScriptStateRef.current.timer);\n terminalStartupScriptStateRef.current.timer = null;\n }\n };\n }, []);\n\n const getTerminalBootstrapKey = useCallback((slot: TerminalBootstrapSlot) => {\n return `${TERMINAL_BOOTSTRAP_STORAGE_PREFIX}${sessionName}:${slot}`;\n }, [sessionName]);\n\n const getRuntimeBootstrapKey = useCallback((slot: TerminalBootstrapSlot) => {\n return `${sessionName}:${slot}`;\n }, [sessionName]);\n\n const getRuntimeBootstrapRegistry = useCallback((): TerminalBootstrapRegistry | null => {\n if (typeof window === 'undefined') return null;\n const runtimeWindow = window as Window & {\n __vibaTerminalBootstrapRegistry?: TerminalBootstrapRegistry;\n };\n if (!runtimeWindow[TERMINAL_BOOTSTRAP_RUNTIME_KEY]) {\n runtimeWindow[TERMINAL_BOOTSTRAP_RUNTIME_KEY] = {};\n }\n return runtimeWindow[TERMINAL_BOOTSTRAP_RUNTIME_KEY] || null;\n }, []);\n\n const getRuntimeBootstrapState = useCallback((slot: TerminalBootstrapSlot): TerminalBootstrapState => {\n const registry = getRuntimeBootstrapRegistry();\n if (!registry) return 'idle';\n return registry[getRuntimeBootstrapKey(slot)] || 'idle';\n }, [getRuntimeBootstrapRegistry, getRuntimeBootstrapKey]);\n\n const setRuntimeBootstrapState = useCallback((slot: TerminalBootstrapSlot, state: TerminalBootstrapState): void => {\n const registry = getRuntimeBootstrapRegistry();\n if (!registry) return;\n registry[getRuntimeBootstrapKey(slot)] = state;\n }, [getRuntimeBootstrapRegistry, getRuntimeBootstrapKey]);\n\n const hasTerminalBootstrapped = useCallback((slot: TerminalBootstrapSlot): boolean => {\n if (terminalBootstrapStateRef.current[slot] === 'done') {\n return true;\n }\n if (getRuntimeBootstrapState(slot) === 'done') {\n return true;\n }\n try {\n return window.sessionStorage.getItem(getTerminalBootstrapKey(slot)) === '1';\n } catch {\n return false;\n }\n }, [getRuntimeBootstrapState, getTerminalBootstrapKey]);\n\n const beginTerminalBootstrap = useCallback((slot: TerminalBootstrapSlot): boolean => {\n const current = terminalBootstrapStateRef.current[slot];\n const runtimeState = getRuntimeBootstrapState(slot);\n if (current === 'done' || current === 'in_progress' || runtimeState === 'done' || runtimeState === 'in_progress') {\n return false;\n }\n terminalBootstrapStateRef.current[slot] = 'in_progress';\n setRuntimeBootstrapState(slot, 'in_progress');\n return true;\n }, [getRuntimeBootstrapState, setRuntimeBootstrapState]);\n\n const resetTerminalBootstrap = useCallback((slot: TerminalBootstrapSlot): void => {\n if (terminalBootstrapStateRef.current[slot] !== 'done') {\n terminalBootstrapStateRef.current[slot] = 'idle';\n }\n if (getRuntimeBootstrapState(slot) !== 'done') {\n setRuntimeBootstrapState(slot, 'idle');\n }\n }, [getRuntimeBootstrapState, setRuntimeBootstrapState]);\n\n const markTerminalBootstrapped = useCallback((slot: TerminalBootstrapSlot): void => {\n terminalBootstrapStateRef.current[slot] = 'done';\n setRuntimeBootstrapState(slot, 'done');\n try {\n window.sessionStorage.setItem(getTerminalBootstrapKey(slot), '1');\n } catch {\n // Ignore storage failures (private mode / disabled storage).\n }\n }, [getTerminalBootstrapKey, setRuntimeBootstrapState]);\n\n const isShellPromptReady = useCallback((term: TerminalWindow['term']): boolean => {\n const activeBuffer = term?.buffer?.active;\n if (!activeBuffer || typeof activeBuffer.getLine !== 'function') {\n // Fall back to ready when xterm internals are unavailable.\n return true;\n }\n\n const cursorLine = activeBuffer.baseY + activeBuffer.cursorY;\n for (let offset = 0; offset < 6; offset += 1) {\n const line = activeBuffer.getLine(cursorLine - offset);\n const text = line?.translateToString(true) ?? '';\n if (!text.trim()) continue;\n return SHELL_PROMPT_PATTERN.test(text);\n }\n return false;\n }, []);\n\n const stopTerminalProcessMonitor = useCallback(() => {\n if (terminalProcessMonitorCleanupRef.current) {\n terminalProcessMonitorCleanupRef.current();\n terminalProcessMonitorCleanupRef.current = null;\n }\n }, []);\n\n const startTerminalProcessMonitor = useCallback((\n iframe: HTMLIFrameElement,\n term: NonNullable<TerminalWindow['term']>\n ) => {\n stopTerminalProcessMonitor();\n\n let disposed = false;\n let writeDisposable: { dispose?: () => void } | null = null;\n let mutationObserver: MutationObserver | null = null;\n let intervalId: number | null = null;\n\n const updateProcessState = () => {\n if (disposed) return;\n const isRunning = !isShellPromptReady(term);\n setIsTerminalForegroundProcessRunning((current) => (current === isRunning ? current : isRunning));\n };\n\n updateProcessState();\n intervalId = window.setInterval(updateProcessState, 1000);\n\n try {\n const xterm = term as TerminalWithOnWriteParsed;\n if (typeof xterm.onWriteParsed === 'function') {\n writeDisposable = xterm.onWriteParsed(updateProcessState) || null;\n } else {\n const screen = iframe.contentDocument?.querySelector('.xterm-screen') || iframe.contentDocument?.body;\n if (screen) {\n mutationObserver = new MutationObserver(updateProcessState);\n mutationObserver.observe(screen, { childList: true, subtree: true, characterData: true });\n }\n }\n } catch (error) {\n console.error('Failed to setup terminal process monitor:', error);\n }\n\n terminalProcessMonitorCleanupRef.current = () => {\n disposed = true;\n if (intervalId !== null) {\n window.clearInterval(intervalId);\n intervalId = null;\n }\n if (writeDisposable && typeof writeDisposable.dispose === 'function') {\n writeDisposable.dispose();\n }\n mutationObserver?.disconnect();\n };\n }, [isShellPromptReady, stopTerminalProcessMonitor]);\n\n useEffect(() => {\n return () => {\n stopTerminalProcessMonitor();\n };\n }, [stopTerminalProcessMonitor]);\n\n useEffect(() => {\n setIsTerminalForegroundProcessRunning(false);\n stopTerminalProcessMonitor();\n }, [sessionName, stopTerminalProcessMonitor]);\n\n const injectTerminalStartupScript = useCallback((\n iframe: HTMLIFrameElement,\n win: TerminalWindow,\n term: NonNullable<TerminalWindow['term']>\n ): boolean => {\n if (isResume) return false;\n\n const script = startupScript?.trim();\n if (!script || terminalStartupScriptStateRef.current.injected) return false;\n\n const pressEnter = () => {\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) {\n textarea.dispatchEvent(new KeyboardEvent('keypress', {\n bubbles: true,\n cancelable: true,\n charCode: 13,\n keyCode: 13,\n key: 'Enter',\n view: win\n }));\n } else {\n term.paste('\\r');\n }\n };\n\n terminalStartupScriptStateRef.current.injected = true;\n if (terminalStartupScriptStateRef.current.timer !== null) {\n window.clearTimeout(terminalStartupScriptStateRef.current.timer);\n }\n terminalStartupScriptStateRef.current.timer = window.setTimeout(() => {\n terminalStartupScriptStateRef.current.timer = null;\n try {\n term.paste(script);\n pressEnter();\n } catch (error) {\n terminalStartupScriptStateRef.current.injected = false;\n console.error('Failed to inject startup script into terminal iframe:', error);\n }\n }, 500);\n\n return true;\n }, [isResume, startupScript]);\n\n useEffect(() => {\n if (isResume) return;\n if (!startupScript?.trim()) return;\n if (terminalStartupScriptStateRef.current.injected) return;\n\n let cancelled = false;\n\n const attemptInjection = (attempts = 0) => {\n if (cancelled || terminalStartupScriptStateRef.current.injected) return;\n if (attempts > 30) return;\n\n if (!hasTerminalBootstrapped('terminal')) {\n window.setTimeout(() => attemptInjection(attempts + 1), 200);\n return;\n }\n\n const iframe = terminalRef.current || terminalBootstrapRef.current;\n if (!iframe) return;\n\n try {\n const win = iframe.contentWindow as TerminalWindow | null;\n if (win?.term) {\n injectTerminalStartupScript(iframe, win, win.term);\n return;\n }\n } catch {\n // Ignore transient iframe access errors and retry.\n }\n\n window.setTimeout(() => attemptInjection(attempts + 1), 200);\n };\n\n attemptInjection();\n return () => {\n cancelled = true;\n };\n }, [hasTerminalBootstrapped, injectTerminalStartupScript, isResume, startupScript]);\n\n const [feedback, setFeedback] = useState<string>('Initializing...');\n const [cleanupPhase, setCleanupPhase] = useState<CleanupPhase>('idle');\n const [cleanupError, setCleanupError] = useState<string | null>(null);\n const [isStartingDevServer, setIsStartingDevServer] = useState(false);\n const [isTerminalForegroundProcessRunning, setIsTerminalForegroundProcessRunning] = useState(false);\n const [isMerging, setIsMerging] = useState(false);\n const [isRebasing, setIsRebasing] = useState(false);\n const [isFileBrowserOpen, setIsFileBrowserOpen] = useState(false);\n const [lastFileBrowserPath, setLastFileBrowserPath] = useState(worktree || repo);\n const [isInsertingFilePaths, setIsInsertingFilePaths] = useState(false);\n const [currentBaseBranch, setCurrentBaseBranch] = useState(baseBranch?.trim() || '');\n const [mainWorktreeBranch, setMainWorktreeBranch] = useState('');\n const [baseBranchOptions, setBaseBranchOptions] = useState<string[]>([]);\n const [isLoadingBaseBranches, setIsLoadingBaseBranches] = useState(false);\n const isLoadingBaseBranchesRef = useRef(false);\n const [isUpdatingBaseBranch, setIsUpdatingBaseBranch] = useState(false);\n const [isCreateBaseBranchDialogOpen, setIsCreateBaseBranchDialogOpen] = useState(false);\n const [newBaseBranchName, setNewBaseBranchName] = useState('');\n const [newBaseBranchFrom, setNewBaseBranchFrom] = useState('');\n const [isCreatingBaseBranch, setIsCreatingBaseBranch] = useState(false);\n const [divergence, setDivergence] = useState({ ahead: 0, behind: 0 });\n const [isPreviewVisible, setIsPreviewVisible] = useState(true);\n const [previewInputUrl, setPreviewInputUrl] = useState('');\n const [previewUrl, setPreviewUrl] = useState('');\n const [isPreviewPickerActive, setIsPreviewPickerActive] = useState(false);\n const [isResolvingElement, setIsResolvingElement] = useState(false);\n const [isRepoViewActive, setIsRepoViewActive] = useState(false);\n const [agentPaneRatio, setAgentPaneRatio] = useState(DEFAULT_AGENT_PANE_RATIO);\n const [isSplitResizing, setIsSplitResizing] = useState(false);\n const [isRightPanelCollapsed, setIsRightPanelCollapsed] = useState(true);\n\n const [isTerminalMinimized, setIsTerminalMinimized] = useState(false);\n\n const focusTerminalInputForSlot = useCallback((slot: TerminalBootstrapSlot): boolean => {\n const iframe = slot === 'agent' ? iframeRef.current : terminalRef.current;\n if (!iframe) return false;\n try {\n const frameWindow = iframe.contentWindow;\n const textarea = iframe.contentDocument?.querySelector('textarea.xterm-helper-textarea') as HTMLElement | null;\n frameWindow?.focus();\n if (!textarea || typeof textarea.focus !== 'function') return false;\n try {\n textarea.focus({ preventScroll: true });\n } catch {\n textarea.focus();\n }\n return true;\n } catch {\n return false;\n }\n }, []);\n\n const maybeRestoreRecentTerminalFocusAfterThemeChange = useCallback(() => {\n const recentBlur = recentTerminalBlurRef.current;\n if (!recentBlur) return;\n if (Date.now() - recentBlur.at > 1500) return;\n\n const preferredSlot = recentBlur.slot;\n window.setTimeout(() => {\n const restored = focusTerminalInputForSlot(preferredSlot);\n if (!restored) {\n focusTerminalInputForSlot(preferredSlot === 'agent' ? 'terminal' : 'agent');\n }\n recentTerminalBlurRef.current = null;\n }, 0);\n }, [focusTerminalInputForSlot]);\n\n const applyThemeToTerminalFrames = useCallback(() => {\n applyThemeToTerminalIframe(iframeRef.current);\n applyThemeToTerminalIframe(terminalRef.current);\n maybeRestoreRecentTerminalFocusAfterThemeChange();\n }, [maybeRestoreRecentTerminalFocusAfterThemeChange]);\n\n useEffect(() => {\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const applyTheme = () => {\n applyThemeToTerminalFrames();\n };\n const handleMediaChange = () => {\n if (readThemeModeFromStorage(window.localStorage) === 'auto') {\n applyTheme();\n }\n };\n const handleStorageChange = (event: StorageEvent) => {\n if (!event.key || event.key === THEME_MODE_STORAGE_KEY) {\n applyTheme();\n }\n };\n const handleThemeRefresh = () => {\n applyTheme();\n };\n\n applyTheme();\n window.addEventListener('storage', handleStorageChange);\n window.addEventListener(THEME_REFRESH_EVENT, handleThemeRefresh);\n\n if (typeof mediaQuery.addEventListener === 'function') {\n mediaQuery.addEventListener('change', handleMediaChange);\n } else {\n mediaQuery.addListener(handleMediaChange);\n }\n\n return () => {\n window.removeEventListener('storage', handleStorageChange);\n window.removeEventListener(THEME_REFRESH_EVENT, handleThemeRefresh);\n\n if (typeof mediaQuery.removeEventListener === 'function') {\n mediaQuery.removeEventListener('change', handleMediaChange);\n } else {\n mediaQuery.removeListener(handleMediaChange);\n }\n };\n }, [applyThemeToTerminalFrames]);\n\n // Terminal resize state\n const [terminalSize, setTerminalSize] = useState({ width: 460, height: 320 });\n const [isResizing, setIsResizing] = useState(false);\n const [isLoaded, setIsLoaded] = useState(false);\n const resizeRef = useRef({ startX: 0, startY: 0, startWidth: 0, startHeight: 0 });\n const [terminalInteractionMode, setTerminalInteractionMode] = useState<TerminalInteractionMode>('scroll');\n const [isUpdatingTerminalInteractionMode, setIsUpdatingTerminalInteractionMode] = useState(false);\n const terminalInteractionRequestIdRef = useRef(0);\n\n useEffect(() => {\n setLastFileBrowserPath(worktree || repo);\n }, [repo, worktree]);\n\n useEffect(() => {\n const saved = localStorage.getItem(TERMINAL_SIZE_STORAGE_KEY);\n if (saved) {\n try {\n setTerminalSize(JSON.parse(saved));\n } catch (e) {\n console.error('Failed to parse saved terminal size', e);\n }\n }\n\n const savedSplitRatio = localStorage.getItem(SPLIT_RATIO_STORAGE_KEY);\n if (savedSplitRatio) {\n const parsed = Number.parseFloat(savedSplitRatio);\n if (!Number.isNaN(parsed)) {\n setAgentPaneRatio(clampAgentPaneRatio(parsed));\n }\n }\n\n // Start with the right panel hidden on each session load.\n setIsRightPanelCollapsed(true);\n setIsLoaded(true);\n }, []);\n\n const startResize = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsResizing(true);\n resizeRef.current = {\n startX: e.clientX,\n startY: e.clientY,\n startWidth: terminalSize.width,\n startHeight: terminalSize.height\n };\n };\n\n useEffect(() => {\n if (!isResizing) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n const deltaX = resizeRef.current.startX - e.clientX; // Dragging left increases width\n const deltaY = resizeRef.current.startY - e.clientY; // Dragging up increases height\n\n setTerminalSize({\n width: Math.max(300, Math.min(window.innerWidth - 32, resizeRef.current.startWidth + deltaX)),\n height: Math.max(100, Math.min(window.innerHeight - 32, resizeRef.current.startHeight + deltaY))\n });\n };\n\n const handleMouseUp = () => {\n setIsResizing(false);\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [isResizing]);\n\n useEffect(() => {\n if (isLoaded && !isResizing) {\n localStorage.setItem(TERMINAL_SIZE_STORAGE_KEY, JSON.stringify(terminalSize));\n }\n }, [isLoaded, isResizing, terminalSize]);\n\n useEffect(() => {\n if (isLoaded && !isSplitResizing) {\n localStorage.setItem(SPLIT_RATIO_STORAGE_KEY, String(agentPaneRatio));\n }\n }, [agentPaneRatio, isLoaded, isSplitResizing]);\n\n useEffect(() => {\n if (!isLoaded) return;\n localStorage.setItem(RIGHT_PANEL_COLLAPSED_STORAGE_KEY, isRightPanelCollapsed ? '1' : '0');\n }, [isLoaded, isRightPanelCollapsed]);\n\n useEffect(() => {\n if (!isRightPanelCollapsed) return;\n setIsSplitResizing(false);\n }, [isRightPanelCollapsed]);\n\n const startSplitResize = (e: React.MouseEvent<HTMLDivElement>) => {\n if (isRightPanelCollapsed) return;\n e.preventDefault();\n setIsSplitResizing(true);\n splitResizeRef.current = {\n startX: e.clientX,\n startRatio: agentPaneRatio,\n };\n };\n\n const handleToggleRightPanelCollapse = useCallback(() => {\n setIsRightPanelCollapsed((previous) => !previous);\n }, []);\n\n const handleRepoButtonClick = useCallback(() => {\n if (isRightPanelCollapsed) {\n setIsRightPanelCollapsed(false);\n }\n setIsRepoViewActive((previous) => !previous);\n }, [isRightPanelCollapsed]);\n\n useEffect(() => {\n if (!isSplitResizing) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n const container = splitContainerRef.current;\n if (!container) return;\n\n const rect = container.getBoundingClientRect();\n if (rect.width <= 0) return;\n\n const delta = e.clientX - splitResizeRef.current.startX;\n const nextLeftWidth = splitResizeRef.current.startRatio * rect.width + delta;\n setAgentPaneRatio(clampAgentPaneRatio(nextLeftWidth / rect.width));\n };\n\n const handleMouseUp = () => {\n setIsSplitResizing(false);\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [isSplitResizing]);\n\n // Auto-scroll and focus terminal when restored from minimized state\n useEffect(() => {\n if (!isTerminalMinimized && terminalRef.current) {\n const iframe = terminalRef.current;\n // Small delay to allow layout to update and iframe to render\n setTimeout(() => {\n try {\n const win = iframe.contentWindow as TerminalWindow | null;\n if (win && win.term) {\n win.term.scrollToBottom?.();\n win.focus();\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) (textarea as HTMLElement).focus();\n }\n } catch (e) {\n console.error('Failed to focus/scroll terminal on restore:', e);\n }\n }, 100);\n }\n }, [isTerminalMinimized]);\n\n // IDE Selection\n const [selectedIde, setSelectedIde] = useState<string>('vscode');\n\n useEffect(() => {\n const trimmedTitle = title?.trim();\n if (trimmedTitle) {\n document.title = `${trimmedTitle} | Viba`;\n return () => {\n document.title = 'Viba';\n };\n }\n\n document.title = 'Viba';\n return undefined;\n }, [title]);\n\n useEffect(() => {\n const loadConfig = async () => {\n const config = await getConfig();\n if (config.selectedIde && SUPPORTED_IDES.some(ide => ide.id === config.selectedIde)) {\n setSelectedIde(config.selectedIde);\n }\n };\n loadConfig();\n }, []);\n\n useEffect(() => {\n setCurrentBaseBranch(baseBranch?.trim() || '');\n setBaseBranchOptions([]);\n }, [baseBranch, sessionName]);\n\n useEffect(() => {\n setTerminalInteractionMode('scroll');\n setIsUpdatingTerminalInteractionMode(false);\n terminalInteractionRequestIdRef.current += 1;\n }, [sessionName]);\n\n const handleIdeChange = async (e: React.ChangeEvent<HTMLSelectElement>) => {\n const value = e.target.value;\n setSelectedIde(value);\n await updateConfig({ selectedIde: value });\n };\n\n const handleOpenIde = () => {\n if (!worktree) return;\n const ide = SUPPORTED_IDES.find(i => i.id === selectedIde);\n if (!ide) return;\n\n const uri = `${ide.protocol}://file/${encodeURI(worktree)}`;\n window.open(uri, '_blank');\n };\n\n const applyTerminalInteractionMode = useCallback(async (\n mode: TerminalInteractionMode,\n options?: { silent?: boolean }\n ): Promise<boolean> => {\n if (terminalPersistenceMode !== 'tmux') return true;\n\n const requestId = ++terminalInteractionRequestIdRef.current;\n if (!options?.silent) {\n setIsUpdatingTerminalInteractionMode(true);\n }\n\n const mouseEnabled = mode === 'scroll';\n const [agentResult, terminalResult] = await Promise.all([\n setTmuxSessionMouseMode(sessionName, 'agent', mouseEnabled),\n setTmuxSessionMouseMode(sessionName, 'terminal', mouseEnabled),\n ]);\n\n if (requestId !== terminalInteractionRequestIdRef.current) {\n return false;\n }\n\n if (!options?.silent) {\n setIsUpdatingTerminalInteractionMode(false);\n }\n\n const failed = [agentResult, terminalResult].find((result) => !result.success);\n if (failed) {\n if (!options?.silent) {\n setFeedback(`Failed to switch to ${mode === 'scroll' ? 'scroll mode' : 'text select mode'}`);\n }\n return false;\n }\n\n if (!options?.silent) {\n setFeedback(mode === 'scroll' ? 'Terminal mode: Scroll' : 'Terminal mode: Text Select');\n }\n return true;\n }, [sessionName, terminalPersistenceMode]);\n\n const ensureTmuxStatusBarHidden = useCallback((slot: TerminalBootstrapSlot) => {\n if (terminalPersistenceMode !== 'tmux') return;\n if (tmuxStatusAppliedRef.current[slot]) return;\n\n void (async () => {\n const result = await setTmuxSessionStatusVisibility(sessionName, slot, false);\n if (result.success && result.applied) {\n tmuxStatusAppliedRef.current[slot] = true;\n } else if (!result.success) {\n console.error(`Failed to hide tmux status bar for ${slot}:`, result.error);\n }\n })();\n }, [sessionName, terminalPersistenceMode]);\n\n useEffect(() => {\n if (terminalPersistenceMode !== 'tmux') return;\n void applyTerminalInteractionMode('scroll', { silent: true });\n }, [applyTerminalInteractionMode, terminalPersistenceMode]);\n\n const handleToggleTerminalInteractionMode = useCallback(() => {\n if (terminalPersistenceMode !== 'tmux' || isUpdatingTerminalInteractionMode) return;\n\n const previousMode = terminalInteractionMode;\n const nextMode: TerminalInteractionMode = previousMode === 'scroll' ? 'select' : 'scroll';\n setTerminalInteractionMode(nextMode);\n\n void (async () => {\n const success = await applyTerminalInteractionMode(nextMode);\n if (!success) {\n setTerminalInteractionMode(previousMode);\n }\n })();\n }, [applyTerminalInteractionMode, isUpdatingTerminalInteractionMode, terminalInteractionMode, terminalPersistenceMode]);\n\n const handleNewAttempt = () => {\n if (!repo || !sessionName) return;\n const nextUrl = `/new?repo=${encodeURIComponent(repo)}&prefillFromSession=${encodeURIComponent(sessionName)}`;\n window.open(nextUrl, '_blank', 'noopener,noreferrer');\n };\n\n const runCleanup = async (requireConfirmation = true): Promise<boolean> => {\n if (!repo || !worktree || !branch) return false;\n if (requireConfirmation && !confirm('Are you sure you want to delete this session? This will remove the branch and worktree.')) return false;\n\n setCleanupError(null);\n setCleanupPhase('idle');\n setFeedback('Purging session...');\n\n try {\n const result = await deleteSessionInBackground(sessionName);\n if (!result.success) {\n console.error('Cleanup failed:', result.error || 'Unknown error');\n setCleanupPhase('error');\n setCleanupError(result.error || 'Failed to delete session');\n return false;\n }\n\n notifySessionsUpdated();\n } catch (error) {\n console.error('Cleanup request failed:', error);\n setCleanupPhase('error');\n setCleanupError(error instanceof Error ? error.message : 'Unknown error');\n return false;\n }\n\n // Use forced navigation here because App Router transitions can be\n // interrupted by iframe/server-action teardown in production builds.\n onExit(true);\n return true;\n };\n\n const handleCleanup = async () => {\n await runCleanup(true);\n };\n\n const pasteIntoAgentIframe = useCallback((text: string): Promise<boolean> => {\n return new Promise((resolve) => {\n const iframe = iframeRef.current;\n if (!iframe) {\n resolve(false);\n return;\n }\n\n const checkAndPaste = (attempts = 0) => {\n if (attempts > 30) {\n resolve(false);\n return;\n }\n\n try {\n const win = iframe.contentWindow as TerminalWindow | null;\n if (!win || !win.term) {\n setTimeout(() => checkAndPaste(attempts + 1), 300);\n return;\n }\n\n win.term.paste(text);\n\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) {\n (textarea as HTMLElement).focus();\n }\n win.focus();\n resolve(true);\n } catch (e) {\n console.error('Failed to paste into agent iframe:', e);\n setTimeout(() => checkAndPaste(attempts + 1), 300);\n }\n };\n\n checkAndPaste();\n });\n }, []);\n\n const handleInsertFilePaths = useCallback(async (paths: string[]) => {\n if (paths.length === 0) return;\n\n setIsInsertingFilePaths(true);\n const textToInsert = `${paths.join(' ')} `;\n const inserted = await pasteIntoAgentIframe(textToInsert);\n setFeedback(\n inserted\n ? `Inserted ${paths.length} file path${paths.length === 1 ? '' : 's'} into agent input`\n : 'Failed to insert file paths into agent input'\n );\n setIsInsertingFilePaths(false);\n }, [pasteIntoAgentIframe]);\n\n const resolveComponentSourcePathByNames = useCallback(async (componentNames: string[]): Promise<{ resolvedName: string; sourcePath: string } | null> => {\n const normalizedNames = componentNames.map(normalizeComponentLookupName).filter(Boolean);\n if (normalizedNames.length === 0) return null;\n\n const roots = Array.from(\n new Set(\n [repo, worktree]\n .map((root) => (root || '').trim())\n .filter(Boolean)\n )\n );\n if (roots.length === 0) return null;\n\n for (const workspaceRoot of roots) {\n try {\n const response = await fetch('/api/component-source/resolve', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n componentNames: normalizedNames,\n workspaceRoot,\n }),\n });\n\n const payload = await response.json().catch(() => null) as { resolvedName?: string; sourcePath?: string; error?: string } | null;\n if (!response.ok) {\n console.warn('Component source resolve miss', {\n componentNames: normalizedNames,\n workspaceRoot,\n error: payload?.error || response.statusText,\n });\n continue;\n }\n\n const sourcePath = typeof payload?.sourcePath === 'string' ? payload.sourcePath.trim() : '';\n const resolvedName = typeof payload?.resolvedName === 'string' ? payload.resolvedName.trim() : '';\n\n if (sourcePath && resolvedName) return { sourcePath, resolvedName };\n } catch (error) {\n console.error('Failed to resolve component source path:', error);\n }\n }\n\n return null;\n }, [repo, worktree]);\n\n const loadBaseBranchOptions = useCallback(async () => {\n if (!sessionName) return;\n if (isLoadingBaseBranchesRef.current) return;\n\n isLoadingBaseBranchesRef.current = true;\n setIsLoadingBaseBranches(true);\n\n try {\n const result = await listSessionBaseBranches(sessionName);\n if (result.success) {\n setBaseBranchOptions(result.branches ?? []);\n setCurrentBaseBranch(result.baseBranch?.trim() || '');\n setMainWorktreeBranch(result.mainWorktreeBranch?.trim() || '');\n } else if (result.error) {\n setFeedback(`Failed to load branches: ${result.error}`);\n }\n } catch (e) {\n console.error('Failed to load base branches:', e);\n } finally {\n isLoadingBaseBranchesRef.current = false;\n setIsLoadingBaseBranches(false);\n }\n }, [sessionName]);\n\n useEffect(() => {\n if (!sessionName) return;\n void loadBaseBranchOptions();\n }, [loadBaseBranchOptions, sessionName]);\n\n const loadSessionDivergence = useCallback(async () => {\n if (!sessionName) return;\n\n try {\n const result = await getSessionDivergence(sessionName);\n if (result.success && typeof result.ahead === 'number' && typeof result.behind === 'number') {\n setDivergence({ ahead: result.ahead, behind: result.behind });\n }\n } catch (e) {\n console.error('Failed to load branch divergence:', e);\n }\n }, [sessionName]);\n\n useEffect(() => {\n if (!sessionName || !currentBaseBranch) {\n setDivergence({ ahead: 0, behind: 0 });\n return;\n }\n\n void loadSessionDivergence();\n const timer = window.setInterval(() => {\n void loadSessionDivergence();\n }, 60000);\n\n return () => window.clearInterval(timer);\n }, [currentBaseBranch, loadSessionDivergence, sessionName]);\n\n const handleBaseBranchChange = async (e: React.ChangeEvent<HTMLSelectElement>) => {\n if (!sessionName) return;\n\n const nextBaseBranch = e.target.value.trim();\n if (!nextBaseBranch || nextBaseBranch === currentBaseBranch) return;\n\n setIsUpdatingBaseBranch(true);\n setFeedback(`Updating base branch to ${nextBaseBranch}...`);\n\n try {\n const result = await updateSessionBaseBranch(sessionName, nextBaseBranch);\n if (result.success && result.baseBranch) {\n setCurrentBaseBranch(result.baseBranch);\n setFeedback(`Base branch updated to ${result.baseBranch}`);\n await loadBaseBranchOptions();\n await loadSessionDivergence();\n } else {\n setFeedback(`Failed to update base branch: ${result.error}`);\n }\n } catch (error) {\n console.error('Failed to update base branch:', error);\n setFeedback('Failed to update base branch');\n } finally {\n setIsUpdatingBaseBranch(false);\n }\n };\n\n const runMerge = async (): Promise<boolean> => {\n if (!sessionName) return false;\n if (!currentBaseBranch) return false;\n\n setIsMerging(true);\n setFeedback('Merging session branch...');\n\n try {\n const result = await mergeSessionToBase(sessionName);\n if (result.success) {\n setFeedback(`Merged ${result.branchName} into ${result.baseBranch}`);\n void loadSessionDivergence();\n return true;\n } else {\n setFeedback(`Merge failed: ${result.error}`);\n return false;\n }\n } catch (e) {\n console.error('Merge request failed:', e);\n setFeedback('Merge failed');\n return false;\n } finally {\n setIsMerging(false);\n }\n };\n\n const handleMerge = async () => {\n await runMerge();\n };\n\n const [isRebaseDropdownOpen, setIsRebaseDropdownOpen] = useState(false);\n const rebaseDropdownRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (rebaseDropdownRef.current && !rebaseDropdownRef.current.contains(event.target as Node)) {\n setIsRebaseDropdownOpen(false);\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n const handleRebaseSelect = async (targetBranch: string) => {\n setIsRebaseDropdownOpen(false);\n if (!sessionName) return;\n\n const isNewBranch = targetBranch !== currentBaseBranch;\n\n setIsRebasing(true);\n setFeedback(isNewBranch ? `Updating base to ${targetBranch} and rebasing...` : 'Rebasing session branch...');\n\n try {\n if (isNewBranch) {\n const updateResult = await updateSessionBaseBranch(sessionName, targetBranch);\n if (!updateResult.success) {\n setFeedback(`Failed to update base branch: ${updateResult.error}`);\n setIsRebasing(false);\n return;\n }\n setCurrentBaseBranch(updateResult.baseBranch!);\n await loadBaseBranchOptions();\n }\n\n const result = await rebaseSessionOntoBase(sessionName);\n if (result.success) {\n setFeedback(`Rebased ${result.branchName} onto ${result.baseBranch}`);\n void loadSessionDivergence();\n } else {\n setFeedback(`Rebase failed: ${result.error}`);\n }\n } catch (e) {\n console.error('Rebase request failed:', e);\n setFeedback('Rebase failed');\n } finally {\n setIsRebasing(false);\n }\n };\n\n const handleRebase = () => {\n setIsRebaseDropdownOpen(!isRebaseDropdownOpen);\n };\n\n const createBranchFromOptions = useMemo(() => {\n const candidates = [\n mainWorktreeBranch,\n currentBaseBranch,\n ...baseBranchOptions,\n ]\n .map((value) => value.trim())\n .filter(Boolean);\n\n return Array.from(new Set(candidates)).sort((a, b) => a.localeCompare(b));\n }, [baseBranchOptions, currentBaseBranch, mainWorktreeBranch]);\n\n const closeCreateBaseBranchDialog = useCallback(() => {\n if (isCreatingBaseBranch) return;\n setIsCreateBaseBranchDialogOpen(false);\n setNewBaseBranchName('');\n setNewBaseBranchFrom('');\n }, [isCreatingBaseBranch]);\n\n const openCreateBaseBranchDialog = useCallback(() => {\n const defaultFromBranch = mainWorktreeBranch.trim()\n || currentBaseBranch.trim()\n || createBranchFromOptions[0]\n || '';\n setIsRebaseDropdownOpen(false);\n setNewBaseBranchName('');\n setNewBaseBranchFrom(defaultFromBranch);\n setIsCreateBaseBranchDialogOpen(true);\n }, [createBranchFromOptions, currentBaseBranch, mainWorktreeBranch]);\n\n const handleCreateBaseBranch = useCallback(async () => {\n if (!sessionName) return;\n\n const targetBranchName = newBaseBranchName.trim();\n const sourceBranchName = newBaseBranchFrom.trim();\n if (!targetBranchName || !sourceBranchName) return;\n\n setIsCreatingBaseBranch(true);\n setFeedback(`Creating branch ${targetBranchName} from ${sourceBranchName}...`);\n\n try {\n const result = await createSessionBaseBranch(sessionName, targetBranchName, sourceBranchName);\n if (result.success && result.branchName && result.fromBranch) {\n setFeedback(`Created branch ${result.branchName} from ${result.fromBranch}`);\n setIsCreateBaseBranchDialogOpen(false);\n setNewBaseBranchName('');\n setNewBaseBranchFrom('');\n await loadBaseBranchOptions();\n } else {\n setFeedback(`Failed to create branch: ${result.error}`);\n }\n } catch (error) {\n console.error('Failed to create base branch:', error);\n setFeedback('Failed to create branch');\n } finally {\n setIsCreatingBaseBranch(false);\n }\n }, [loadBaseBranchOptions, newBaseBranchFrom, newBaseBranchName, sessionName]);\n\n const loadPreviewViaProxy = useCallback(async (rawUrl: string, openPreview: boolean): Promise<boolean> => {\n const normalized = normalizePreviewUrl(rawUrl);\n if (!normalized) {\n setFeedback('Please enter a preview URL');\n return false;\n }\n\n setPreviewInputUrl(normalized);\n setIsPreviewPickerActive(false);\n setFeedback(`Loading preview: ${normalized}`);\n\n try {\n const response = await fetch('/api/preview-proxy/start', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n target: normalized,\n }),\n });\n\n const payload = await response.json().catch(() => null) as { error?: string; proxyUrl?: string } | null;\n if (!response.ok || !payload?.proxyUrl) {\n throw new Error(payload?.error || 'Failed to start preview proxy');\n }\n\n setPreviewUrl(payload.proxyUrl);\n if (openPreview) {\n setIsPreviewVisible(true);\n }\n setFeedback(`Loaded preview: ${normalized}`);\n return true;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to load preview';\n console.error('Failed to load preview via proxy:', error);\n setFeedback(`Failed to load preview: ${message}`);\n return false;\n }\n }, []);\n\n const handleTogglePreviewPicker = useCallback(() => {\n if (!previewUrl) {\n setFeedback('Load a preview before picking elements');\n return;\n }\n\n const previewWindow = previewIframeRef.current?.contentWindow;\n if (!previewWindow) {\n setFeedback('Preview is not ready yet');\n return;\n }\n\n const nextState = !isPreviewPickerActive;\n previewWindow.postMessage({\n type: 'viba:preview-picker-toggle',\n active: nextState,\n }, '*');\n\n setIsPreviewPickerActive(nextState);\n setFeedback(nextState ? 'Picker enabled: click an element in the preview' : 'Picker disabled');\n }, [isPreviewPickerActive, previewUrl]);\n\n const postPreviewControlMessage = useCallback((payload: { action?: PreviewNavigationAction; type: string }) => {\n const previewWindow = previewIframeRef.current?.contentWindow;\n if (!previewWindow) {\n setFeedback('Preview is not ready yet');\n return false;\n }\n\n previewWindow.postMessage(payload, '*');\n return true;\n }, []);\n\n const handlePreviewNavigate = useCallback((action: PreviewNavigationAction) => {\n if (!previewUrl) {\n setFeedback('Load a preview before using navigation controls');\n return;\n }\n\n if (!postPreviewControlMessage({ type: 'viba:preview-navigation', action })) {\n return;\n }\n\n if (action === 'reload') {\n setFeedback('Reloading preview...');\n }\n }, [postPreviewControlMessage, previewUrl]);\n\n const handleUnloadPreview = useCallback(() => {\n if (!previewUrl) {\n setFeedback('Preview is already unloaded');\n return;\n }\n\n setPreviewUrl('');\n setIsPreviewPickerActive(false);\n setFeedback('Preview unloaded');\n }, [previewUrl]);\n\n const handlePreviewIframeLoad = useCallback(() => {\n postPreviewControlMessage({ type: 'viba:preview-location-request' });\n }, [postPreviewControlMessage]);\n\n const { attachTerminalLinkHandler } = useTerminalLink({\n onLoadPreview: loadPreviewViaProxy\n });\n\n useEffect(() => {\n if (!isPreviewVisible) return;\n if (previewInputUrl.trim()) return;\n\n const timer = window.setTimeout(() => {\n previewAddressInputRef.current?.focus();\n }, 0);\n\n return () => {\n window.clearTimeout(timer);\n };\n }, [isPreviewVisible, previewInputUrl]);\n\n useEffect(() => {\n const handlePreviewMessage = (event: MessageEvent) => {\n if (!previewIframeRef.current || event.source !== previewIframeRef.current.contentWindow) return;\n\n const payload = event.data as {\n active?: boolean;\n element?: unknown;\n type?: string;\n url?: unknown;\n } | null;\n if (!payload || typeof payload !== 'object') return;\n\n if (payload.type === 'viba:preview-picker-state') {\n setIsPreviewPickerActive(Boolean(payload.active));\n return;\n }\n\n if (payload.type === 'viba:preview-picker-ready') {\n const previewWindow = previewIframeRef.current?.contentWindow;\n if (previewWindow) {\n previewWindow.postMessage({ type: 'viba:preview-location-request' }, '*');\n }\n return;\n }\n\n if (payload.type === 'viba:preview-link-open') {\n if (typeof payload.url === 'string' && payload.url.trim().length > 0) {\n window.open(payload.url, '_blank', 'noopener,noreferrer');\n }\n return;\n }\n\n if (payload.type === 'viba:preview-location-change') {\n if (typeof payload.url === 'string' && payload.url.trim().length > 0) {\n setPreviewInputUrl(payload.url);\n }\n return;\n }\n\n if (payload.type === 'viba:preview-element-selected') {\n const selectedElement = (payload.element && typeof payload.element === 'object')\n ? payload.element as { reactComponentStack?: unknown[]; selector?: string | null }\n : null;\n const reactStack = Array.isArray(selectedElement?.reactComponentStack)\n ? selectedElement.reactComponentStack\n : [];\n const componentReference = buildComponentReferenceText(reactStack, worktree || repo);\n const firstReactComponent = reactStack[0] && typeof reactStack[0] === 'object'\n ? (reactStack[0] as { name?: unknown }).name\n : undefined;\n const fallbackName = typeof firstReactComponent === 'string' && firstReactComponent.trim().length > 0\n ? firstReactComponent.trim()\n : '';\n const builtInComponents = new Set([\n 'Suspense', 'ErrorBoundary', 'Router', 'AppRouter', 'LayoutRouter',\n 'RenderFromTemplateContext', 'ScrollAndFocusHandler', 'InnerLayoutRouter',\n 'RedirectErrorBoundary', 'NotFoundBoundary', 'LoadingBoundary',\n 'ReactDevOverlay', 'HotReload', 'AppContainer', 'Route', 'Link', 'Image',\n 'OuterLayoutRouter', 'Head', 'StringRefs', 'Fragment', 'Profiler',\n 'StrictMode', 'SuspenseList', 'Script', 'Page', '__next_root_layout_boundary__'\n ]);\n\n const stackComponentNames = Array.from(\n new Set(\n reactStack\n .map((entry) => {\n if (!entry || typeof entry !== 'object') return '';\n const name = (entry as { name?: unknown }).name;\n return typeof name === 'string' ? name.trim() : '';\n })\n .filter((name) => {\n if (!name) return false;\n if (builtInComponents.has(name)) return false;\n if (name.startsWith('styled.') || name.startsWith('Styled(')) return false;\n return true;\n })\n )\n );\n\n console.log('Filtered stack component names:', stackComponentNames);\n\n const identifier = componentReference\n || fallbackName\n || (typeof selectedElement?.selector === 'string' ? selectedElement.selector : '');\n\n console.log('Preview selected element:', selectedElement);\n console.log('Preview selected reactComponentStack:', reactStack);\n console.log('Preview selected identifier:', identifier);\n setIsPreviewPickerActive(false);\n\n if (!identifier) {\n setFeedback('Element selected. No identifier was resolved.');\n return;\n }\n\n void (async () => {\n let finalIdentifier = componentReference || '';\n\n if (!finalIdentifier && stackComponentNames.length > 0) {\n setIsResolvingElement(true);\n try {\n const result = await resolveComponentSourcePathByNames(stackComponentNames);\n if (result?.resolvedName && result?.sourcePath) {\n finalIdentifier = `${result.resolvedName} (${result.sourcePath})`;\n }\n } finally {\n setIsResolvingElement(false);\n }\n }\n\n if (!finalIdentifier) {\n if (stackComponentNames.length > 0) {\n setFeedback('Element selected, but source file path could not be resolved for the component');\n return;\n }\n finalIdentifier = identifier;\n }\n\n console.log('Final resolved component identifier:', finalIdentifier);\n\n const inserted = await pasteIntoAgentIframe(`${finalIdentifier} `);\n setFeedback(\n inserted\n ? `Element identifier sent to agent: ${finalIdentifier}`\n : 'Element selected, but failed to send identifier to agent input'\n );\n })();\n }\n };\n\n window.addEventListener('message', handlePreviewMessage);\n return () => {\n window.removeEventListener('message', handlePreviewMessage);\n };\n }, [pasteIntoAgentIframe, repo, resolveComponentSourcePathByNames, worktree]);\n\n useEffect(() => {\n setIsPreviewPickerActive(false);\n }, [previewUrl]);\n\n const handlePreviewSubmit = (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n void loadPreviewViaProxy(previewInputUrl, true);\n };\n\n const handleOpenPreviewInNewTab = useCallback(() => {\n const preferredTarget = previewInputUrl.trim() || previewUrl;\n const normalizedTarget = normalizePreviewUrl(preferredTarget);\n\n if (!normalizedTarget) {\n setFeedback('Please enter a preview URL');\n return;\n }\n\n window.open(normalizedTarget, '_blank', 'noopener,noreferrer');\n setFeedback(`Opened preview in new tab: ${normalizedTarget}`);\n }, [previewInputUrl, previewUrl]);\n\n const handleStartDevServer = () => {\n const script = devServerScript?.trim();\n if (!script || !terminalRef.current || isTerminalForegroundProcessRunning) return;\n\n // Auto-show terminal if minimized\n setIsTerminalMinimized(false);\n\n const iframe = terminalRef.current;\n setIsStartingDevServer(true);\n setFeedback('Starting dev server...');\n\n const checkAndInject = (attempts = 0) => {\n if (attempts > 30) {\n setFeedback('Failed to start dev server: terminal is not ready');\n setIsStartingDevServer(false);\n return;\n }\n\n try {\n const win = iframe.contentWindow as TerminalWindow | null;\n if (win && win.term) {\n win.term.paste(script);\n\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) {\n textarea.dispatchEvent(new KeyboardEvent('keypress', {\n bubbles: true,\n cancelable: true,\n charCode: 13,\n keyCode: 13,\n key: 'Enter',\n view: win\n }));\n } else {\n win.term.paste('\\r');\n }\n\n win.focus();\n if (textarea) (textarea as HTMLElement).focus();\n\n setFeedback('Dev server start command sent');\n setIsStartingDevServer(false);\n } else {\n setTimeout(() => checkAndInject(attempts + 1), 300);\n }\n } catch (e) {\n console.error('Dev server injection error', e);\n setFeedback('Failed to start dev server');\n setIsStartingDevServer(false);\n }\n };\n\n checkAndInject();\n };\n\n const handleIframeLoad = () => {\n if (!iframeRef.current) return;\n const iframe = iframeRef.current;\n\n // Safety check for Same-Origin to avoid errors if proxy isn't working\n try {\n // Just accessing contentWindow to see if it throws\n const _ = iframe.contentWindow;\n } catch (e) {\n setFeedback(\"Error: Cross-Origin access blocked. Ensure proxy is working.\");\n return;\n }\n\n if (iframe.contentWindow) {\n // Attempt to nullify the internal ttyd handler\n iframe.contentWindow.onbeforeunload = null;\n\n // Or add a high-priority listener that stops the popup\n iframe.contentWindow.addEventListener('beforeunload', (event) => {\n event.stopImmediatePropagation();\n }, true);\n }\n\n setFeedback('Connecting to terminal...');\n\n const checkAndInject = (attempts = 0) => {\n if (attempts > 30) {\n setFeedback('Timeout waiting for terminal to be ready');\n return;\n }\n\n try {\n const win = iframe.contentWindow as TerminalWindow | null;\n if (win && win.term) {\n ensureTmuxStatusBarHidden('agent');\n const term = win.term;\n attachTerminalLinkHandler(iframe, agentFrameLinkCleanupRef, {\n directOpenBehavior: 'new_tab',\n modifierOpenBehavior: 'new_tab',\n });\n\n // Clear current input line on Cmd+Backspace/Cmd+Delete.\n const terminalWithShortcutState = term as TerminalWithClearLineShortcutState;\n if (!terminalWithShortcutState.__vibaClearLineShortcutInstalled && typeof term.attachCustomKeyEventHandler === 'function') {\n const existingCustomKeyEventHandler = term.customKeyEventHandler;\n term.attachCustomKeyEventHandler((event: KeyboardEvent) => {\n if (event.type === 'keydown' && event.metaKey && (event.key === 'Backspace' || event.key === 'Delete')) {\n const coreService = term._core?.coreService;\n if (coreService && typeof coreService.triggerDataEvent === 'function') {\n coreService.triggerDataEvent('\\x15', true);\n } else {\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) {\n textarea.dispatchEvent(new KeyboardEvent('keydown', {\n bubbles: true,\n cancelable: true,\n key: 'u',\n keyCode: 85,\n ctrlKey: true,\n view: win\n }));\n } else {\n term.paste('\\x15');\n }\n }\n return false;\n }\n\n if (typeof existingCustomKeyEventHandler === 'function') {\n try {\n return existingCustomKeyEventHandler.call(term, event) !== false;\n } catch (error) {\n console.error('Existing terminal key handler failed:', error);\n }\n }\n return true;\n });\n terminalWithShortcutState.__vibaClearLineShortcutInstalled = true;\n }\n\n // Ensure terminal palette stays in sync with app/OS theme.\n applyThemeToTerminalWindow(win);\n\n const alreadyBootstrapped = hasTerminalBootstrapped('agent');\n const shouldSkipResumeInjection = Boolean(isResume) && terminalPersistenceMode === 'tmux';\n if (alreadyBootstrapped || shouldSkipResumeInjection) {\n if (shouldSkipResumeInjection && !alreadyBootstrapped) {\n markTerminalBootstrapped('agent');\n setFeedback('Attached to persisted terminal');\n } else {\n setFeedback('Reconnected to terminal');\n }\n win.focus();\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) (textarea as HTMLElement).focus();\n return;\n }\n\n if (!isShellPromptReady(term) && attempts < 10) {\n setTimeout(() => checkAndInject(attempts + 1), 200);\n return;\n }\n\n if (!beginTerminalBootstrap('agent')) {\n setFeedback('Reconnected to terminal');\n win.focus();\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) (textarea as HTMLElement).focus();\n return;\n }\n\n // Attempt injection\n\n // User instructions:\n // 1. paste cd command\n // 2. dispatch keypress 13\n\n const targetPath = worktree || repo; // Fallback to repo if no worktree\n const cmd = `cd ${quoteShellArg(targetPath)}`;\n // Send cd command\n term.paste(cmd);\n\n // Helper to press enter\n const pressEnter = () => {\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) {\n textarea.dispatchEvent(new KeyboardEvent('keypress', {\n bubbles: true,\n cancelable: true,\n charCode: 13,\n keyCode: 13,\n key: 'Enter',\n view: win\n }));\n } else {\n term.paste('\\r');\n }\n };\n\n pressEnter();\n markTerminalBootstrapped('agent');\n\n // Inject agent command if present\n if (agent) {\n const startAgentProcess = async () => {\n let agentCmd = '';\n const withCodexMonochromeEnv = (command: string): string => {\n return `${CODEX_MONOCHROME_ENV_PREFIX} ${command}`;\n };\n const withCodexApiKeyLogin = (command: string): string => {\n return `if [ -n \"$OPENAI_API_KEY\" ]; then printenv OPENAI_API_KEY | codex login --with-api-key || exit 1; fi; ${command}`;\n };\n\n if (isResume) {\n const resumeCmd = withCodexMonochromeEnv(`codex resume --last ${CODEX_PLAIN_THEME_FLAG} --sandbox danger-full-access --ask-for-approval on-request --search`);\n agentCmd = withCodexApiKeyLogin(resumeCmd);\n } else {\n const trimmedInitialMessage = initialMessage?.trim() || '';\n const taskContent = trimmedInitialMessage;\n const normalizedAttachmentPaths = (\n attachmentPaths && attachmentPaths.length > 0\n ? attachmentPaths\n : (attachmentNames || [])\n .map((name) => `${worktree || repo}-attachments/${name}`)\n )\n .map((entry) => entry.trim())\n .filter(Boolean);\n const resolvedAttachmentPaths = Array.from(new Set(normalizedAttachmentPaths));\n const taskSections: string[] = [];\n if (taskContent) taskSections.push(taskContent);\n if (resolvedAttachmentPaths.length > 0) {\n taskSections.push([\n 'Attachments:',\n ...resolvedAttachmentPaths.map((attachmentPath) => `- ${attachmentPath}`),\n ].join('\\n'));\n }\n const fullTaskContent = taskSections.join('\\n\\n');\n let safeMessage = '';\n\n // Send startup prompt when user provided a task or attachments.\n if (fullTaskContent) {\n const instructionLines: string[] = [];\n if (sessionMode === 'plan') {\n instructionLines.push(PLAN_MODE_STARTUP_INSTRUCTION);\n }\n instructionLines.push(AUTO_COMMIT_INSTRUCTION);\n instructionLines.push(AGENT_BROWSER_SKILL_INSTRUCTION);\n instructionLines.push(SYSTEMATIC_DEBUGGING_SKILL_INSTRUCTION);\n instructionLines.push(VISUAL_EVIDENCE_INSTRUCTION);\n instructionLines.push(NOTIFICATION_INSTRUCTION);\n const notificationApiUrl = `${window.location.origin}/api/notifications`;\n instructionLines.push(\n `Notification API endpoint: ${notificationApiUrl} (POST JSON with sessionId, title, and description).`\n );\n instructionLines.push(\n `Notification payload template: {\"sessionId\":\"${sessionName}\",\"title\":\"<short title>\",\"description\":\"<clear detail about completion or required attention>\"}.`\n );\n\n const fullMessage = [\n '# Instructions',\n '',\n instructionLines.map((line) => `- ${line}`).join('\\n'),\n '',\n '# Task',\n '',\n fullTaskContent,\n ].join('\\n');\n\n try {\n const result = await writeSessionPromptFile(sessionName, fullMessage);\n if (result.success && result.filePath) {\n safeMessage = ` \"$(cat ${quoteShellArg(result.filePath)})\"`;\n } else {\n console.error('Failed to write prompt file, falling back to inline prompt', result.error);\n safeMessage = ` ${quoteShellArg(fullMessage)}`;\n }\n } catch (err) {\n console.error('Exception writing prompt file', err);\n safeMessage = ` ${quoteShellArg(fullMessage)}`;\n }\n }\n\n const startCmd = withCodexMonochromeEnv(`codex ${CODEX_PLAIN_THEME_FLAG} --sandbox danger-full-access --ask-for-approval on-request --search${safeMessage}`);\n agentCmd = withCodexApiKeyLogin(startCmd);\n }\n\n if (agentCmd) {\n term.paste(agentCmd);\n pressEnter();\n setFeedback(isResume ? 'Resumed session with codex' : 'Session started with codex');\n\n if (!isResume && onSessionStart) {\n onSessionStart();\n }\n }\n };\n\n setTimeout(() => startAgentProcess(), 500); // Wait a bit for cd to finish\n } else {\n setFeedback(`Session started ${worktree ? '(Worktree)' : ''}`);\n if (!isResume && onSessionStart) {\n onSessionStart();\n }\n }\n\n // Focus the iframe\n win.focus();\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) (textarea as HTMLElement).focus();\n\n } else {\n // Not ready yet\n setTimeout(() => checkAndInject(attempts + 1), 500);\n }\n } catch (e) {\n resetTerminalBootstrap('agent');\n console.error(\"Access error during injection:\", e);\n setFeedback('Error accessing terminal: ' + String(e));\n }\n };\n\n // Small delay to allow scripts to run\n setTimeout(() => checkAndInject(), 1000);\n };\n\n const handleTerminalLoad = (iframeFromEvent?: HTMLIFrameElement | null) => {\n const iframe = iframeFromEvent || terminalRef.current || terminalBootstrapRef.current;\n if (!iframe) return;\n stopTerminalProcessMonitor();\n setIsTerminalForegroundProcessRunning(false);\n\n // Safety check\n try {\n const _ = iframe.contentWindow;\n } catch (e) {\n console.error(\"Secondary terminal: Cross-Origin access blocked.\");\n return;\n }\n\n if (iframe.contentWindow) {\n // Attempt to nullify the internal ttyd handler\n iframe.contentWindow.onbeforeunload = null;\n\n // Or add a high-priority listener that stops the popup\n iframe.contentWindow.addEventListener('beforeunload', (event) => {\n event.stopImmediatePropagation();\n }, true);\n }\n\n const checkAndInject = (attempts = 0) => {\n if (attempts > 30) {\n return;\n }\n\n try {\n const win = iframe.contentWindow as TerminalWindow | null;\n if (win && win.term) {\n ensureTmuxStatusBarHidden('terminal');\n const term = win.term;\n attachTerminalLinkHandler(iframe, terminalFrameLinkCleanupRef, {\n onLinkActivated: () => setIsTerminalMinimized(true),\n directOpenBehavior: 'preview',\n modifierOpenBehavior: 'new_tab',\n });\n\n // Ensure terminal palette stays in sync with app/OS theme.\n applyThemeToTerminalWindow(win);\n\n startTerminalProcessMonitor(iframe, term);\n\n // Enable auto-scroll to bottom on output\n try {\n const xterm = term as TerminalWithOnWriteParsed;\n const scrollHandler = () => {\n const activeBuffer = xterm.buffer?.active as ({ baseY?: number; viewportY?: number } | undefined);\n const baseY = typeof activeBuffer?.baseY === 'number' ? activeBuffer.baseY : 0;\n const viewportY = typeof activeBuffer?.viewportY === 'number' ? activeBuffer.viewportY : baseY;\n\n // Only scroll if we are close to the bottom to allow reviewing history\n if (activeBuffer && (baseY - viewportY < 10)) {\n xterm.scrollToBottom?.();\n } else {\n // Fallback if buffer access fails or simple mode\n xterm.scrollToBottom?.();\n }\n };\n\n if (typeof xterm.onWriteParsed === 'function') {\n xterm.onWriteParsed(scrollHandler);\n } else {\n // Fallback for older xterm or different setups\n const screen = iframe.contentDocument?.querySelector('.xterm-screen') || iframe.contentDocument?.body;\n if (screen) {\n const observer = new MutationObserver(scrollHandler);\n observer.observe(screen, { childList: true, subtree: true, characterData: true });\n }\n }\n } catch (e) {\n console.error('Failed to setup auto-scroll:', e);\n }\n\n const alreadyBootstrapped = hasTerminalBootstrapped('terminal');\n const shouldSkipResumeInjection = Boolean(isResume) && terminalPersistenceMode === 'tmux';\n if (alreadyBootstrapped || shouldSkipResumeInjection) {\n if (shouldSkipResumeInjection && !alreadyBootstrapped) {\n markTerminalBootstrapped('terminal');\n }\n if (alreadyBootstrapped) {\n injectTerminalStartupScript(iframe, win, term);\n }\n win.focus();\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) (textarea as HTMLElement).focus();\n return;\n }\n\n if (!isShellPromptReady(term) && attempts < 10) {\n setTimeout(() => checkAndInject(attempts + 1), 200);\n return;\n }\n\n if (!beginTerminalBootstrap('terminal')) {\n win.focus();\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) (textarea as HTMLElement).focus();\n return;\n }\n\n const targetPath = worktree || repo;\n const cmd = `cd ${quoteShellArg(targetPath)}`;\n term.paste(cmd);\n\n const pressEnter = () => {\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) {\n textarea.dispatchEvent(new KeyboardEvent('keypress', {\n bubbles: true,\n cancelable: true,\n charCode: 13,\n keyCode: 13,\n key: 'Enter',\n view: win\n }));\n } else {\n term.paste('\\r');\n }\n };\n pressEnter();\n markTerminalBootstrapped('terminal');\n injectTerminalStartupScript(iframe, win, term);\n\n // Focus\n win.focus();\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) (textarea as HTMLElement).focus();\n } else {\n setTimeout(() => checkAndInject(attempts + 1), 500);\n }\n } catch (e) {\n setIsTerminalForegroundProcessRunning(false);\n resetTerminalBootstrap('terminal');\n console.error(\"Secondary terminal injection error\", e);\n }\n };\n\n setTimeout(() => checkAndInject(), 1000);\n };\n\n if (!repo) return <div className=\"p-4 text-error dark:bg-[#0d1117] dark:text-red-300\">No repository specified</div>;\n\n if (cleanupPhase === 'error') {\n return (\n <div className=\"flex h-screen w-full items-center justify-center bg-[#f6f6f8] dark:bg-[#0d1117]\">\n <div className=\"card w-96 border border-slate-200 bg-white shadow-xl dark:border-[#30363d] dark:bg-[#161b22]\">\n <div className=\"card-body items-center text-center\">\n <h2 className=\"card-title text-error dark:text-red-300\">Cleanup failed</h2>\n <p className=\"text-slate-700 dark:text-slate-300\">{cleanupError || 'An unknown error occurred while cleaning up this session.'}</p>\n <div className=\"card-actions justify-end\">\n <button className=\"btn btn-primary\" onClick={() => onExit()}>Back to Home</button>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n const selectableBaseBranches = Array.from(new Set([\n ...(currentBaseBranch ? [currentBaseBranch] : []),\n ...baseBranchOptions\n ])).filter((branchOption) => branchOption !== branch || branchOption === currentBaseBranch);\n const hasDevServerScript = Boolean(devServerScript?.trim());\n const isDevButtonDisabled = !hasDevServerScript || isStartingDevServer || isTerminalForegroundProcessRunning;\n const devButtonTitle = !hasDevServerScript\n ? 'Set a dev server script to enable this button'\n : isTerminalForegroundProcessRunning\n ? 'A process is already running in the terminal'\n : 'Run dev server script in terminal';\n\n return (\n <div className={`flex h-screen w-full flex-col overflow-hidden bg-[#f6f6f8] dark:bg-[#0d1117] ${(isResizing || isSplitResizing) ? 'select-none' : ''}`}>\n {isRightPanelCollapsed && (\n <iframe\n ref={terminalBootstrapRef}\n src={floatingTerminalSrc}\n className=\"pointer-events-none absolute left-0 top-0 h-0 w-0 border-none opacity-0\"\n allow=\"clipboard-read; clipboard-write\"\n onLoad={(event) => handleTerminalLoad(event.currentTarget)}\n aria-hidden=\"true\"\n tabIndex={-1}\n />\n )}\n {(isResizing || isSplitResizing) && (\n <div className={`fixed inset-0 z-[9999] ${isResizing ? 'cursor-row-resize' : 'cursor-col-resize'}`} />\n )}\n <div className=\"z-20 flex items-center justify-between border-b border-slate-200 bg-white px-4 py-2 text-xs font-mono shadow-sm dark:border-[#30363d] dark:bg-[#161b22] dark:text-slate-300\">\n <div className=\"flex items-center gap-4\">\n <button\n className=\"btn btn-ghost btn-xs h-6 min-h-6 px-1 text-slate-600 hover:bg-base-content/10 dark:text-slate-300 dark:hover:bg-[#30363d]/60\"\n onClick={() => onExit()}\n title=\"Back to Home\"\n >\n <ChevronLeft className=\"w-4 h-4\" />\n </button>\n <div className=\"flex flex-col\">\n <div className=\"flex items-center gap-2\">\n <span className=\"opacity-50\">Repo:</span>\n <span className=\"font-bold\">{getBaseName(repo)}</span>\n </div>\n {sessionName && (\n <div className=\"hidden min-[1200px]:flex min-w-0 items-center gap-2 text-[10px] opacity-70\">\n <span>Session:</span>\n <span className=\"truncate max-w-[220px]\" title={sessionName}>{sessionName}</span>\n </div>\n )}\n </div>\n </div>\n\n <div className=\"flex items-center gap-4\">\n <div className=\"flex items-center overflow-hidden rounded border border-base-content/20 bg-base-100 dark:border-[#30363d] dark:bg-[#0d1117]\">\n <button\n className=\"btn btn-ghost btn-xs h-6 min-h-6 rounded-none border-none px-2 text-slate-700 hover:bg-base-content/10 dark:text-slate-300 dark:hover:bg-[#30363d]/60\"\n onClick={handleNewAttempt}\n title=\"Start a new attempt in a new tab with this session context\"\n >\n <Plus className=\"w-3 h-3\" />\n <span className={headerButtonLabelClass}>New Attempt</span>\n </button>\n </div>\n\n <div className=\"relative flex items-center rounded border border-base-content/20 bg-base-100 dark:border-[#30363d] dark:bg-[#0d1117]\" ref={rebaseDropdownRef}>\n <div className=\"relative\">\n <button\n className=\"btn btn-ghost btn-xs h-6 min-h-6 rounded-none rounded-l border-none px-2 text-slate-700 hover:bg-base-content/10 dark:text-slate-300 dark:hover:bg-[#30363d]/60\"\n onClick={handleRebase}\n disabled={isRebasing || isMerging || isUpdatingBaseBranch}\n title=\"Select base branch and rebase\"\n >\n {isRebasing ? <span className=\"loading loading-spinner loading-xs\"></span> : <GitMerge className=\"w-3 h-3\" />}\n <span className={headerButtonLabelClass}>Rebase</span>\n <ChevronDown className=\"w-3 h-3 opacity-50 ml-0.5\" />\n </button>\n {isRebaseDropdownOpen && (\n <div className=\"dropdown-content absolute left-0 top-full z-50 mt-1 flex max-h-80 w-64 flex-col overflow-hidden rounded-box border border-base-content/20 bg-base-200 p-0 shadow-xl dark:border-[#30363d] dark:bg-[#161b22] dark:text-slate-300\">\n <div className=\"flex shrink-0 items-center justify-between border-b border-base-content/10 bg-base-200 px-4 py-2 text-[10px] font-bold uppercase tracking-wider opacity-50 dark:border-[#30363d] dark:bg-[#161b22]\">\n <span>Select Base Branch</span>\n {(isLoadingBaseBranches || isUpdatingBaseBranch) && <span className=\"loading loading-spinner loading-xs\"></span>}\n </div>\n <ul className=\"menu custom-scrollbar w-full flex-nowrap overflow-y-auto overflow-x-hidden p-0\">\n {selectableBaseBranches.length > 0 ? (\n selectableBaseBranches.map((branchOption) => (\n <li key={branchOption}>\n <button\n onClick={() => handleRebaseSelect(branchOption)}\n className={`flex max-w-full items-center justify-between truncate rounded-none py-2 text-xs hover:bg-base-content/10 dark:hover:bg-[#30363d]/60 ${branchOption === currentBaseBranch ? 'active font-bold' : ''}`}\n title={branchOption}\n >\n <span className=\"truncate\">{branchOption}</span>\n {branchOption === currentBaseBranch && <span className=\"opacity-70 text-[10px] ml-2 shrink-0\">(Current)</span>}\n </button>\n </li>\n ))\n ) : (\n <li className=\"text-xs px-4 py-2 opacity-50 italic text-center\">No other branches found</li>\n )}\n <div className=\"divider my-1 opacity-50 dark:before:bg-[#30363d] dark:after:bg-[#30363d]\"></div>\n <li>\n <button onClick={openCreateBaseBranchDialog} className=\"text-[10px] justify-center opacity-70 hover:opacity-100\">\n Create New Branch...\n </button>\n </li>\n <li>\n <button onClick={() => void loadBaseBranchOptions()} className=\"text-[10px] justify-center opacity-70 hover:opacity-100\">\n Refresh Branches\n </button>\n </li>\n </ul>\n </div>\n )}\n </div>\n <div className=\"h-4 w-[1px] bg-base-content/10 dark:bg-[#30363d]\"></div>\n <button\n className=\"btn btn-ghost btn-xs btn-success h-6 min-h-6 rounded-none border-none px-2 hover:border-transparent hover:bg-success/20 dark:text-emerald-300\"\n onClick={handleMerge}\n disabled={isMerging || isRebasing || isUpdatingBaseBranch || !currentBaseBranch}\n title={currentBaseBranch ? `Merge current branch (${branch}) into target branch (${currentBaseBranch})` : 'Target branch unavailable for this session'}\n >\n {isMerging ? <span className=\"loading loading-spinner loading-xs\"></span> : <GitPullRequestArrow className=\"w-3 h-3\" />}\n <span className={headerButtonLabelClass}>Merge</span>\n </button>\n <div className=\"h-4 w-[1px] bg-base-content/10 dark:bg-[#30363d]\"></div>\n <button\n className=\"btn btn-ghost btn-error btn-xs h-6 min-h-6 rounded-none rounded-r border-none px-2 hover:border-transparent hover:bg-error/20 dark:text-red-300\"\n onClick={handleCleanup}\n disabled={isMerging || isRebasing || !worktree}\n title=\"Clean up and exit\"\n >\n <Trash2 className=\"w-3 h-3\" />\n <span className={headerButtonLabelClass}>Delete</span>\n </button>\n </div>\n\n <div className=\"flex items-center overflow-hidden rounded border border-base-content/20 bg-base-100 dark:border-[#30363d] dark:bg-[#0d1117]\">\n <button\n type=\"button\"\n className={`btn btn-ghost btn-xs h-6 min-h-6 rounded-none border-none px-2 hover:bg-base-content/10 dark:hover:bg-[#30363d]/60 ${isRepoViewActive ? 'bg-slate-100 text-slate-900 dark:bg-[#30363d] dark:text-slate-100' : 'text-slate-700 dark:text-slate-300'}`}\n onClick={handleRepoButtonClick}\n aria-pressed={isRepoViewActive}\n title={isRepoViewActive ? 'Show preview and terminal panel' : 'Show repository viewer'}\n >\n <GitBranch className=\"h-3 w-3\" />\n <span className={headerButtonLabelClass}>Repo</span>\n </button>\n </div>\n\n {currentBaseBranch && (\n <div className=\"flex items-center gap-2 text-xs opacity-80\" title={`Divergence against ${currentBaseBranch}`}>\n <span className=\"inline-flex items-center gap-1\">\n <ArrowUp className=\"w-3 h-3\" />\n {divergence.ahead}\n </span>\n <span className=\"inline-flex items-center gap-1\">\n <ArrowDown className=\"w-3 h-3\" />\n {divergence.behind}\n </span>\n </div>\n )}\n\n <div className=\"mx-2 hidden h-4 w-[1px] bg-base-content/20 dark:bg-[#30363d] min-[1200px]:block\"></div>\n\n <div className=\"hidden min-[1200px]:flex min-w-0 max-w-[280px] items-center gap-2\">\n <span className={`w-2 h-2 rounded-full ${feedback.includes('Error') || feedback.includes('failed') ? 'bg-error' : feedback.includes('started') || feedback.includes('Merged') || feedback.includes('Rebased') || feedback.includes('sent') ? 'bg-success' : 'bg-warning'}`}></span>\n <span className=\"truncate\" title={feedback}>{feedback}</span>\n </div>\n\n </div>\n </div>\n\n {isCreateBaseBranchDialogOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box max-w-lg\">\n <h3 className=\"font-bold text-lg\">Create New Branch</h3>\n <p className=\"py-2 text-sm opacity-70\">\n Create a new branch and refresh the branch list for merge/rebase actions.\n </p>\n\n <div className=\"space-y-4 pt-2\">\n <div className=\"form-control\">\n <label className=\"label\">\n <span className=\"label-text\">Branch Name</span>\n </label>\n <input\n type=\"text\"\n className=\"input input-bordered w-full\"\n value={newBaseBranchName}\n onChange={(e) => setNewBaseBranchName(sanitizeBranchName(e.target.value))}\n placeholder=\"feature/my-new-branch\"\n disabled={isCreatingBaseBranch}\n autoFocus\n onKeyDown={(e) => {\n if (e.key === 'Enter' && newBaseBranchName.trim() && newBaseBranchFrom.trim() && !isCreatingBaseBranch) {\n e.preventDefault();\n void handleCreateBaseBranch();\n }\n }}\n />\n </div>\n\n <div className=\"form-control\">\n <label className=\"label\">\n <span className=\"label-text\">Base Branch</span>\n </label>\n <select\n className=\"select select-bordered w-full\"\n value={newBaseBranchFrom}\n onChange={(e) => setNewBaseBranchFrom(e.target.value)}\n disabled={isCreatingBaseBranch || createBranchFromOptions.length === 0}\n >\n {createBranchFromOptions.map((branchOption) => (\n <option key={branchOption} value={branchOption}>\n {branchOption}\n {branchOption === mainWorktreeBranch ? ' (Checked Out)' : ''}\n </option>\n ))}\n </select>\n </div>\n </div>\n\n <div className=\"modal-action\">\n <button className=\"btn\" onClick={closeCreateBaseBranchDialog} disabled={isCreatingBaseBranch}>Cancel</button>\n <button\n className=\"btn btn-primary\"\n onClick={() => void handleCreateBaseBranch()}\n disabled={!newBaseBranchName.trim() || !newBaseBranchFrom.trim() || isCreatingBaseBranch}\n >\n {isCreatingBaseBranch && <span className=\"loading loading-spinner loading-xs\"></span>}\n Create Branch\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button onClick={closeCreateBaseBranchDialog}>close</button>\n </form>\n </dialog>\n )}\n\n <div\n ref={splitContainerRef}\n className={`relative flex min-h-0 flex-1 overflow-x-hidden bg-[#f6f6f8] p-3 dark:bg-[#0d1117] ${isRightPanelCollapsed ? 'gap-0' : 'gap-3'}`}\n >\n <div\n className=\"agent-activity-panel flex h-full min-w-0 flex-col overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm transition-[width] duration-300 ease-in-out dark:border-[#30363d] dark:bg-[#161b22]\"\n style={{ width: isRightPanelCollapsed ? '100%' : `${agentPaneRatio * 100}%` }}\n >\n <div className=\"flex h-9 items-center justify-between gap-3 border-b border-slate-200 px-3 text-[11px] font-semibold text-slate-600 dark:border-[#30363d] dark:bg-[#161b22] dark:text-slate-400\">\n <span className=\"flex shrink-0 items-center gap-2 uppercase tracking-wide\">\n <span className=\"h-2 w-2 rounded-full bg-blue-500\"></span>\n Agent Activity\n </span>\n <div className=\"flex min-w-0 items-center justify-end gap-2 overflow-x-auto py-1 text-xs font-medium normal-case\">\n <div className=\"flex shrink-0 items-center overflow-hidden rounded border border-slate-200 bg-white dark:border-[#30363d] dark:bg-[#0d1117]\">\n <select\n className=\"select select-xs h-6 min-h-6 rounded-none border-none bg-slate-100 pr-7 text-slate-700 focus:outline-none dark:bg-[#161b22] dark:text-slate-300\"\n value={selectedIde}\n onChange={handleIdeChange}\n >\n {SUPPORTED_IDES.map(ide => (\n <option key={ide.id} value={ide.id}>{ide.name}</option>\n ))}\n </select>\n <div className=\"h-4 w-[1px] bg-slate-200 dark:bg-[#30363d]\"></div>\n <button\n className=\"btn btn-ghost btn-xs h-6 min-h-6 rounded-none border-none px-2 text-slate-700 hover:bg-slate-100 dark:text-slate-300 dark:hover:bg-[#30363d]/60\"\n onClick={handleOpenIde}\n title={`Open in ${SUPPORTED_IDES.find(i => i.id === selectedIde)?.name}`}\n aria-label=\"Open in IDE\"\n >\n <ExternalLink className=\"h-3 w-3\" />\n <span className=\"agent-activity-action-label\">Open in IDE</span>\n </button>\n </div>\n <div className=\"flex shrink-0 items-center overflow-hidden rounded border border-slate-200 bg-white dark:border-[#30363d] dark:bg-[#0d1117]\">\n <button\n className=\"btn btn-ghost btn-xs h-6 min-h-6 rounded-none border-none px-2 text-slate-700 hover:bg-slate-100 dark:text-slate-300 dark:hover:bg-[#30363d]/60\"\n onClick={() => setIsFileBrowserOpen(true)}\n disabled={isInsertingFilePaths}\n title=\"Browse files and insert absolute paths into the agent input\"\n aria-label=\"Add files\"\n >\n {isInsertingFilePaths ? <span className=\"loading loading-spinner loading-xs\"></span> : <FolderOpen className=\"h-3 w-3\" />}\n <span className=\"agent-activity-action-label\">Add Files</span>\n </button>\n </div>\n <div className=\"flex shrink-0 items-center overflow-hidden rounded border border-slate-200 bg-white dark:border-[#30363d] dark:bg-[#0d1117]\">\n <button\n className={`btn btn-ghost btn-xs h-6 min-h-6 w-7 rounded-none border-none p-0 text-slate-700 hover:bg-slate-100 dark:text-slate-300 dark:hover:bg-[#30363d]/60 ${terminalInteractionMode === 'select' ? 'text-warning' : ''}`}\n onClick={handleToggleTerminalInteractionMode}\n disabled={terminalPersistenceMode !== 'tmux' || isUpdatingTerminalInteractionMode}\n title={terminalPersistenceMode === 'tmux'\n ? (terminalInteractionMode === 'scroll'\n ? 'Switch to text select mode for easier copy'\n : 'Switch to scroll mode for wheel scrollback')\n : 'Mode toggle is available only in tmux persistence mode'}\n aria-label={terminalInteractionMode === 'scroll' ? 'Switch to text mode' : 'Switch to scroll mode'}\n >\n {isUpdatingTerminalInteractionMode ? (\n <span className=\"loading loading-spinner loading-xs\"></span>\n ) : (\n terminalInteractionMode === 'scroll'\n ? <ScrollText className=\"h-3.5 w-3.5\" />\n : <TextCursorInput className=\"h-3.5 w-3.5\" />\n )}\n </button>\n </div>\n </div>\n </div>\n <iframe\n ref={iframeRef}\n src={agentTerminalSrc}\n className={`h-full w-full border-none ${(isResizing || isSplitResizing) ? 'pointer-events-none' : ''}`}\n allow=\"clipboard-read; clipboard-write\"\n onFocus={() => {\n recentTerminalBlurRef.current = null;\n }}\n onBlur={() => {\n recentTerminalBlurRef.current = { slot: 'agent', at: Date.now() };\n }}\n onLoad={handleIframeLoad}\n />\n </div>\n\n <div\n className={`relative h-full shrink-0 rounded transition-all duration-300 ease-in-out ${isRightPanelCollapsed\n ? 'w-0 cursor-default opacity-0 pointer-events-none'\n : 'w-2 cursor-col-resize bg-slate-200 opacity-100 hover:bg-primary/40 dark:bg-[#30363d] dark:hover:bg-primary/60'\n }`}\n onMouseDown={startSplitResize}\n role={isRightPanelCollapsed ? undefined : 'separator'}\n aria-orientation={isRightPanelCollapsed ? undefined : 'vertical'}\n aria-label={isRightPanelCollapsed ? undefined : 'Resize preview panel'}\n aria-hidden={isRightPanelCollapsed}\n title={isRightPanelCollapsed ? undefined : 'Drag to resize preview panel'}\n >\n {!isRightPanelCollapsed && (\n <div className=\"absolute left-1/2 top-1/2 h-12 w-[2px] -translate-x-1/2 -translate-y-1/2 rounded-full bg-slate-400 dark:bg-slate-500\" />\n )}\n </div>\n\n <div\n className={`relative h-full transition-[width,min-width,flex-basis] duration-300 ease-in-out ${isRightPanelCollapsed ? 'w-0 min-w-0 flex-none' : 'min-w-[360px] flex-1'}`}\n >\n <button\n className=\"btn btn-ghost btn-xs absolute left-0 top-3 z-20 h-7 w-7 min-h-7 -translate-x-1/2 rounded-full border border-slate-200 bg-white/95 p-0 text-slate-600 shadow-sm hover:bg-slate-100 dark:border-[#30363d] dark:bg-[#161b22]/95 dark:text-slate-300 dark:hover:bg-[#30363d]/80\"\n onClick={handleToggleRightPanelCollapse}\n type=\"button\"\n title={isRightPanelCollapsed ? 'Expand right panel' : 'Collapse right panel'}\n aria-label={isRightPanelCollapsed ? 'Expand right panel' : 'Collapse right panel'}\n aria-pressed={isRightPanelCollapsed}\n >\n {isRightPanelCollapsed ? <ChevronLeft className=\"h-4 w-4\" /> : <ChevronRight className=\"h-4 w-4\" />}\n </button>\n\n {!isRightPanelCollapsed && (\n <div className=\"absolute inset-y-0 left-0 flex h-full w-full flex-col overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm dark:border-[#30363d] dark:bg-[#161b22]\">\n {isRepoViewActive ? (\n <SessionRepoViewer\n repoPath={worktree || repo}\n branchHint={branch}\n baseBranchHint={currentBaseBranch || baseBranch}\n />\n ) : (\n <>\n <div className=\"min-h-0 flex flex-1 flex-col\">\n <form\n className=\"flex h-9 items-center gap-2 border-b border-slate-200 bg-white px-3 dark:border-[#30363d] dark:bg-[#161b22]\"\n onSubmit={handlePreviewSubmit}\n >\n <div className=\"mr-1 flex gap-1.5\">\n <span className=\"h-2.5 w-2.5 rounded-full bg-red-400\" />\n <span className=\"h-2.5 w-2.5 rounded-full bg-yellow-400\" />\n <span className=\"h-2.5 w-2.5 rounded-full bg-green-400\" />\n </div>\n <button\n className=\"btn btn-ghost btn-xs h-7 min-h-7 w-7 p-0 text-slate-500 hover:bg-slate-100 dark:text-slate-400 dark:hover:bg-[#30363d]/60\"\n type=\"button\"\n onClick={() => handlePreviewNavigate('back')}\n disabled={!previewUrl}\n title=\"Go back\"\n aria-label=\"Go back\"\n >\n <ArrowLeft className=\"h-3.5 w-3.5\" />\n </button>\n <button\n className=\"btn btn-ghost btn-xs h-7 min-h-7 w-7 p-0 text-slate-500 hover:bg-slate-100 dark:text-slate-400 dark:hover:bg-[#30363d]/60\"\n type=\"button\"\n onClick={() => handlePreviewNavigate('forward')}\n disabled={!previewUrl}\n title=\"Go forward\"\n aria-label=\"Go forward\"\n >\n <ArrowRight className=\"h-3.5 w-3.5\" />\n </button>\n <button\n className=\"btn btn-ghost btn-xs h-7 min-h-7 w-7 p-0 text-slate-500 hover:bg-slate-100 dark:text-slate-400 dark:hover:bg-[#30363d]/60\"\n type=\"button\"\n onClick={() => handlePreviewNavigate('reload')}\n disabled={!previewUrl}\n title=\"Reload preview\"\n aria-label=\"Reload preview\"\n >\n <RotateCw className=\"h-3.5 w-3.5\" />\n </button>\n <button\n className=\"btn btn-ghost btn-xs h-7 min-h-7 w-7 p-0 text-slate-500 hover:bg-slate-100 dark:text-slate-400 dark:hover:bg-[#30363d]/60\"\n type=\"button\"\n onClick={handleUnloadPreview}\n disabled={!previewUrl}\n title=\"Unload preview\"\n aria-label=\"Unload preview\"\n >\n <X className=\"h-3.5 w-3.5\" />\n </button>\n <input\n ref={previewAddressInputRef}\n type=\"text\"\n className=\"input input-xs h-7 min-h-7 w-full border-slate-200 bg-slate-100 font-mono text-slate-700 dark:border-[#30363d] dark:bg-[#0d1117] dark:text-slate-300 dark:placeholder:text-slate-500\"\n value={previewInputUrl}\n onChange={(event) => setPreviewInputUrl(event.target.value)}\n placeholder=\"http://127.0.0.1:3000\"\n spellCheck={false}\n />\n <button\n className={`btn btn-ghost btn-xs h-7 min-h-7 w-7 p-0 ${isPreviewPickerActive ? 'text-success' : 'text-slate-500 dark:text-slate-400'} hover:bg-slate-100 dark:hover:bg-[#30363d]/60`}\n type=\"button\"\n onClick={handleTogglePreviewPicker}\n disabled={!previewUrl || isResolvingElement}\n title={isPreviewPickerActive ? 'Disable picker' : 'Pick element from preview'}\n >\n {isResolvingElement ? (\n <span className=\"loading loading-spinner loading-xs w-3 h-3\"></span>\n ) : (\n <MousePointer2 className=\"h-3 w-3\" />\n )}\n </button>\n <button\n className=\"btn btn-ghost btn-xs h-7 min-h-7 w-7 p-0 text-slate-500 hover:bg-slate-100 dark:text-slate-400 dark:hover:bg-[#30363d]/60\"\n type=\"button\"\n onClick={handleOpenPreviewInNewTab}\n title=\"Open preview in new tab\"\n aria-label=\"Open preview in new tab\"\n >\n <ExternalLink className=\"h-3.5 w-3.5\" />\n </button>\n </form>\n <div className=\"min-h-0 flex-1 bg-slate-50 dark:bg-[#0d1117]\">\n {!isPreviewVisible ? (\n <div className=\"flex h-full flex-col items-center justify-center gap-3 px-6 text-center text-xs text-slate-500 dark:text-slate-400\">\n <p>Preview is hidden. Use the header Preview button to show it.</p>\n <button\n type=\"button\"\n className=\"btn btn-xs border-slate-200 bg-white text-slate-700 hover:bg-slate-50 dark:border-[#30363d] dark:bg-[#161b22] dark:text-slate-300 dark:hover:bg-[#30363d]/60\"\n onClick={() => setIsPreviewVisible(true)}\n >\n Show Preview\n </button>\n </div>\n ) : previewUrl ? (\n <iframe\n ref={previewIframeRef}\n src={previewUrl}\n className={`h-full w-full border-none ${(isResizing || isSplitResizing) ? 'pointer-events-none' : ''}`}\n title=\"Dev server preview\"\n onLoad={handlePreviewIframeLoad}\n sandbox=\"allow-forms allow-modals allow-pointer-lock allow-popups allow-same-origin allow-scripts allow-downloads\"\n />\n ) : (\n <div className=\"flex h-full items-center justify-center px-6 text-center text-xs text-slate-500 dark:text-slate-400\">\n Run the dev server, or enter a URL above to load a preview.\n </div>\n )}\n </div>\n\n {!isTerminalMinimized && (\n <div\n className=\"flex h-2 cursor-row-resize items-center justify-center border-y border-slate-200 bg-slate-100 dark:border-[#30363d] dark:bg-[#0d1117]\"\n onMouseDown={startResize}\n role=\"separator\"\n aria-orientation=\"horizontal\"\n aria-label=\"Resize build output panel\"\n title=\"Drag to resize build output panel\"\n >\n <Grip className=\"h-3 w-3 text-slate-400 dark:text-slate-500\" />\n </div>\n )}\n\n <div\n className={`${isTerminalMinimized ? 'h-9' : 'min-h-[160px]'} flex shrink-0 flex-col bg-slate-50 dark:bg-[#161b22]`}\n style={{ height: isTerminalMinimized ? TERMINAL_HEADER_HEIGHT : terminalSize.height }}\n >\n <div className=\"flex h-9 items-center justify-between border-t border-slate-200 px-3 text-xs font-semibold text-slate-700 dark:border-[#30363d] dark:text-slate-300\">\n <span className=\"flex items-center gap-2 uppercase tracking-wide\">\n <span className=\"h-2 w-2 rounded-full bg-amber-500\"></span>\n Terminal\n </span>\n <div className=\"flex items-center gap-2\">\n <button\n className=\"btn btn-ghost btn-xs h-6 min-h-6 border-none px-2 text-slate-700 hover:bg-slate-100 dark:text-slate-300 dark:hover:bg-[#30363d]/60\"\n onClick={handleStartDevServer}\n disabled={isDevButtonDisabled}\n title={devButtonTitle}\n type=\"button\"\n >\n {isStartingDevServer ? <span className=\"loading loading-spinner loading-xs\"></span> : <Play className=\"h-3 w-3\" />}\n <span className=\"hidden min-[1700px]:inline\">Dev</span>\n </button>\n <button\n className=\"btn btn-ghost btn-xs h-6 min-h-6 w-7 border-none p-0 text-slate-700 hover:bg-slate-100 dark:text-slate-300 dark:hover:bg-[#30363d]/60\"\n onClick={() => setIsTerminalMinimized((prev) => !prev)}\n title={isTerminalMinimized ? 'Expand terminal' : 'Collapse terminal'}\n aria-label={isTerminalMinimized ? 'Expand terminal' : 'Collapse terminal'}\n type=\"button\"\n >\n <ChevronDown className={`h-4 w-4 transition-transform ${isTerminalMinimized ? 'rotate-180' : ''}`} />\n </button>\n </div>\n </div>\n <div className={`${isTerminalMinimized ? 'h-0 overflow-hidden' : 'min-h-0 flex-1 overflow-hidden border-t border-slate-200 bg-white dark:border-[#30363d] dark:bg-[#0d1117]'}`}>\n <iframe\n ref={terminalRef}\n src={floatingTerminalSrc}\n className={`h-full w-full border-none ${(isResizing || isSplitResizing) ? 'pointer-events-none' : ''}`}\n allow=\"clipboard-read; clipboard-write\"\n onFocus={() => {\n recentTerminalBlurRef.current = null;\n }}\n onBlur={() => {\n recentTerminalBlurRef.current = { slot: 'terminal', at: Date.now() };\n }}\n onLoad={(event) => handleTerminalLoad(event.currentTarget)}\n />\n </div>\n </div>\n </div>\n </>\n )}\n </div>\n )}\n </div>\n </div>\n\n {isFileBrowserOpen && (\n <SessionFileBrowser\n initialPath={lastFileBrowserPath}\n worktreePath={worktree}\n onPathChange={setLastFileBrowserPath}\n onConfirm={(paths) => {\n setIsFileBrowserOpen(false);\n void handleInsertFilePaths(paths);\n }}\n onCancel={() => setIsFileBrowserOpen(false)}\n />\n )}\n </div>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"40aa1407e97e0b6accc10a1819da858f4641caf735\":\"consumeSessionLaunchContext\"},\"src/app/actions/session.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_3=/*#__PURE__*/createServerReference(\"40aa1407e97e0b6accc10a1819da858f4641caf735\",callServer,void 0,findSourceMapURL,\"consumeSessionLaunchContext\");export{$$RSC_SERVER_ACTION_3 as consumeSessionLaunchContext};","/* __next_internal_action_entry_do_not_use__ [{\"402437c9bb2a362204223d0e63a2fdf49af650dd29\":\"getSessionMetadata\"},\"src/app/actions/session.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_6=/*#__PURE__*/createServerReference(\"402437c9bb2a362204223d0e63a2fdf49af650dd29\",callServer,void 0,findSourceMapURL,\"getSessionMetadata\");export{$$RSC_SERVER_ACTION_6 as getSessionMetadata};","/* __next_internal_action_entry_do_not_use__ [{\"40c7524cf76f116b7f2d7c01bd283c61a1e9900028\":\"markSessionInitialized\"},\"src/app/actions/session.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_9=/*#__PURE__*/createServerReference(\"40c7524cf76f116b7f2d7c01bd283c61a1e9900028\",callServer,void 0,findSourceMapURL,\"markSessionInitialized\");export{$$RSC_SERVER_ACTION_9 as markSessionInitialized};","/* __next_internal_action_entry_do_not_use__ [{\"7f66cbfa733565789c3f02c78dd4f795d85a6f2741\":\"getSessionTerminalSources\"},\"src/app/actions/git.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_9=/*#__PURE__*/createServerReference(\"7f66cbfa733565789c3f02c78dd4f795d85a6f2741\",callServer,void 0,findSourceMapURL,\"getSessionTerminalSources\");export{$$RSC_SERVER_ACTION_9 as getSessionTerminalSources};","'use client';\n\nimport { useCallback, useEffect, useState } from 'react';\nimport { useRouter, useParams } from 'next/navigation';\nimport { SessionView } from '@/components/SessionView';\nimport { consumeSessionLaunchContext, getSessionMetadata, SessionMetadata, markSessionInitialized } from '@/app/actions/session';\nimport { getSessionTerminalSources, startTtydProcess } from '@/app/actions/git';\n\ntype SessionNotificationPayload = {\n type: 'session-notification';\n sessionId: string;\n title: string;\n description: string;\n timestamp: string;\n};\n\nexport default function SessionPage() {\n const params = useParams<{ sessionId: string }>();\n const sessionIdParam = params.sessionId;\n const sessionId = Array.isArray(sessionIdParam) ? sessionIdParam[0] : sessionIdParam;\n const router = useRouter();\n\n const [metadata, setMetadata] = useState<SessionMetadata | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [terminalSources, setTerminalSources] = useState<{\n agentTerminalSrc: string;\n floatingTerminalSrc: string;\n } | null>(null);\n\n // Startup params — only populated on first open (initialized === false)\n const [initialMessage, setInitialMessage] = useState<string | undefined>(undefined);\n const [startupScript, setStartupScript] = useState<string | undefined>(undefined);\n const [contextTitle, setContextTitle] = useState<string | undefined>(undefined);\n const [contextAgentProvider, setContextAgentProvider] = useState<string | undefined>(undefined);\n const [contextSessionMode, setContextSessionMode] = useState<'fast' | 'plan' | undefined>(undefined);\n const [contextAttachmentPaths, setContextAttachmentPaths] = useState<string[]>([]);\n\n // True = send --resume to agent; False = send fresh start params\n const [isResume, setIsResume] = useState<boolean>(true);\n const [terminalPersistenceMode, setTerminalPersistenceMode] = useState<'tmux' | 'shell'>('shell');\n\n const handleOpenSessionNotification = useCallback(() => {\n if (!sessionId) return;\n\n window.focus();\n const targetPath = `/session/${sessionId}`;\n if (window.location.pathname !== targetPath) {\n router.push(targetPath);\n }\n }, [router, sessionId]);\n\n useEffect(() => {\n document.documentElement.classList.add('session-page');\n return () => {\n document.documentElement.classList.remove('session-page');\n };\n }, []);\n\n useEffect(() => {\n if (!sessionId) return;\n\n let cancelled = false;\n let socket: WebSocket | null = null;\n let reconnectTimer: number | null = null;\n let reconnectAttempt = 0;\n let browserNotification: Notification | null = null;\n\n const clearReconnectTimer = () => {\n if (reconnectTimer === null) return;\n window.clearTimeout(reconnectTimer);\n reconnectTimer = null;\n };\n\n const scheduleReconnect = () => {\n if (cancelled) return;\n const delay = Math.min(10000, 1000 * (2 ** reconnectAttempt));\n reconnectAttempt += 1;\n reconnectTimer = window.setTimeout(() => {\n reconnectTimer = null;\n void connect();\n }, delay);\n };\n\n const showBrowserNotification = async (payload: SessionNotificationPayload) => {\n if (!('Notification' in window)) return;\n\n let permission = Notification.permission;\n if (permission === 'default') {\n permission = await Notification.requestPermission();\n }\n if (permission !== 'granted') return;\n\n if (browserNotification) {\n browserNotification.close();\n }\n\n browserNotification = new Notification(payload.title, {\n body: payload.description,\n tag: `viba-session-notification-${payload.sessionId}`,\n });\n browserNotification.onclick = (event) => {\n event.preventDefault();\n handleOpenSessionNotification();\n browserNotification?.close();\n };\n };\n\n const handleIncomingNotification = (payload: SessionNotificationPayload) => {\n void showBrowserNotification(payload);\n };\n\n const connect = async () => {\n try {\n const response = await fetch(\n `/api/notifications/socket?sessionId=${encodeURIComponent(sessionId)}`,\n { cache: 'no-store' }\n );\n if (!response.ok) {\n throw new Error('Failed to initialize notification socket');\n }\n\n const data = await response.json() as { wsUrl?: string };\n if (!data.wsUrl) {\n throw new Error('Notification socket URL missing');\n }\n\n if (cancelled) return;\n\n socket = new WebSocket(data.wsUrl);\n socket.onopen = () => {\n reconnectAttempt = 0;\n clearReconnectTimer();\n };\n socket.onerror = () => {\n socket?.close();\n };\n socket.onclose = () => {\n if (cancelled) return;\n scheduleReconnect();\n };\n socket.onmessage = (event) => {\n try {\n const payload = JSON.parse(event.data as string) as Partial<SessionNotificationPayload>;\n if (\n payload.type !== 'session-notification' ||\n payload.sessionId !== sessionId ||\n typeof payload.title !== 'string' ||\n !payload.title.trim() ||\n typeof payload.description !== 'string' ||\n !payload.description.trim() ||\n typeof payload.timestamp !== 'string'\n ) {\n return;\n }\n\n handleIncomingNotification(payload as SessionNotificationPayload);\n } catch {\n // Ignore malformed notification messages.\n }\n };\n } catch {\n scheduleReconnect();\n }\n };\n\n void connect();\n\n return () => {\n cancelled = true;\n clearReconnectTimer();\n socket?.close();\n browserNotification?.close();\n };\n }, [handleOpenSessionNotification, sessionId]);\n\n useEffect(() => {\n if (!sessionId) return;\n\n const loadSession = async () => {\n try {\n setTerminalSources(null);\n\n // Ensure ttyd is running\n const ttydResult = await startTtydProcess();\n if (!ttydResult.success) {\n setError('Failed to start terminal service');\n setLoading(false);\n return;\n }\n setTerminalPersistenceMode(ttydResult.persistenceMode === 'tmux' ? 'tmux' : 'shell');\n\n const data = await getSessionMetadata(sessionId);\n if (!data) {\n setError('Session not found');\n setLoading(false);\n return;\n }\n\n setMetadata(data);\n const resolvedTerminalSources = await getSessionTerminalSources(\n data.sessionName,\n data.repoPath,\n data.agent,\n );\n setTerminalSources(resolvedTerminalSources);\n\n // Determine fresh start vs resume purely from the initialized flag:\n // - initialized === false → first open, send startup params\n // - initialized === true → already started before, resume\n // - initialized === undefined → legacy session (no flag), treat as resume\n const isFirstOpen = data.initialized === false;\n\n if (isFirstOpen) {\n // Consume the launch context (startup params) written by GitRepoSelector\n const contextResult = await consumeSessionLaunchContext(sessionId);\n if (contextResult.success && contextResult.context) {\n const ctx = contextResult.context;\n setInitialMessage(ctx.initialMessage);\n setStartupScript(ctx.startupScript);\n setContextTitle(ctx.title);\n setContextAgentProvider(ctx.agentProvider);\n setContextSessionMode(ctx.sessionMode);\n const launchAttachmentPaths = (ctx.attachmentPaths || [])\n .map((entry) => entry.trim())\n .filter(Boolean);\n const resolvedAttachmentPaths = launchAttachmentPaths.length > 0\n ? Array.from(new Set(launchAttachmentPaths))\n : Array.from(\n new Set(\n (ctx.attachmentNames || [])\n .map((name) => name.trim())\n .filter(Boolean)\n .map((name) => `${data.worktreePath}-attachments/${name}`)\n )\n );\n setContextAttachmentPaths(resolvedAttachmentPaths);\n }\n // Whether or not we got context, this is a fresh start\n setIsResume(false);\n } else {\n // Already initialized (or legacy) — resume\n setIsResume(true);\n }\n\n setLoading(false);\n } catch (e) {\n console.error('Failed to load session:', e);\n setError('Failed to load session');\n setLoading(false);\n }\n };\n\n loadSession();\n }, [sessionId]);\n\n const handleExit = (force?: boolean) => {\n if (force) {\n // Force a full page navigation — used after cleanup where\n // router.push can get stuck due to iframe teardown state\n window.location.href = '/';\n } else {\n router.push('/');\n }\n };\n\n // Called by SessionView once the agent command has been sent for the first time\n const handleSessionStart = async () => {\n if (sessionId) {\n await markSessionInitialized(sessionId);\n }\n };\n\n if (loading) {\n return (\n <div className=\"flex h-screen w-full items-center justify-center bg-[#f6f6f8] dark:bg-[#0d1117]\">\n <div className=\"flex flex-col items-center gap-4\">\n <span className=\"loading loading-spinner loading-lg text-primary\"></span>\n <p className=\"opacity-60 dark:text-slate-400\">Loading session...</p>\n </div>\n </div>\n );\n }\n\n if (error || !metadata) {\n return (\n <div className=\"flex h-screen w-full items-center justify-center bg-[#f6f6f8] dark:bg-[#0d1117]\">\n <div className=\"card w-96 border border-slate-200 bg-white shadow-xl dark:border-[#30363d] dark:bg-[#161b22]\">\n <div className=\"card-body items-center text-center\">\n <h2 className=\"card-title text-error dark:text-red-300\">Error</h2>\n <p className=\"text-slate-700 dark:text-slate-300\">{error || 'Session not found'}</p>\n <div className=\"card-actions justify-end\">\n <button className=\"btn btn-primary\" onClick={() => handleExit()}>Back to Home</button>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n if (!terminalSources) {\n return (\n <div className=\"flex h-screen w-full items-center justify-center bg-[#f6f6f8] dark:bg-[#0d1117]\">\n <div className=\"flex flex-col items-center gap-4\">\n <span className=\"loading loading-spinner loading-lg text-primary\"></span>\n <p className=\"opacity-60 dark:text-slate-400\">Initializing terminals...</p>\n </div>\n </div>\n );\n }\n\n return (\n <SessionView\n repo={metadata.repoPath}\n worktree={metadata.worktreePath}\n branch={metadata.branchName}\n baseBranch={metadata.baseBranch}\n sessionName={metadata.sessionName}\n agent={contextAgentProvider || metadata.agent}\n startupScript={startupScript}\n devServerScript={metadata.devServerScript}\n initialMessage={initialMessage}\n attachmentPaths={contextAttachmentPaths}\n title={contextTitle || metadata.title}\n sessionMode={contextSessionMode}\n onExit={handleExit}\n isResume={isResume}\n terminalPersistenceMode={terminalPersistenceMode}\n onSessionStart={handleSessionStart}\n agentTerminalSrc={terminalSources.agentTerminalSrc}\n floatingTerminalSrc={terminalSources.floatingTerminalSrc}\n />\n );\n}\n","export const normalizePreviewUrl = (rawValue: string): string | null => {\n const trimmed = rawValue.trim();\n if (!trimmed) return null;\n if (/^https?:\\/\\//i.test(trimmed)) return trimmed;\n if (/^[a-z][a-z0-9+.-]*:\\/\\//i.test(trimmed)) return null;\n if (/^(mailto|javascript|data|tel):/i.test(trimmed)) return null;\n\n const firstSegment = trimmed.split('/')[0] ?? '';\n const colonIndex = firstSegment.indexOf(':');\n if (colonIndex > 0 && !firstSegment.startsWith('[')) {\n const hostCandidate = firstSegment.slice(0, colonIndex).toLowerCase();\n const trailing = firstSegment.slice(colonIndex + 1);\n const isLikelyHostWithPort = hostCandidate.includes('.')\n || hostCandidate === 'localhost'\n || /^\\d{1,3}(?:\\.\\d{1,3}){3}$/.test(hostCandidate)\n || /^\\d+$/.test(trailing);\n if (!isLikelyHostWithPort) return null;\n }\n\n const hostPort = firstSegment.includes('@') ? firstSegment.slice(firstSegment.lastIndexOf('@') + 1) : firstSegment;\n const host = hostPort.startsWith('[')\n ? hostPort.slice(1, Math.max(1, hostPort.indexOf(']'))).toLowerCase()\n : hostPort.split(':')[0].toLowerCase();\n\n const protocol = host === 'localhost' || host === '127.0.0.1' || host === '::1'\n ? 'http'\n : 'https';\n return `${protocol}://${trimmed}`;\n};\n","export const quoteShellArg = (value: string): string => `'${value.replace(/'/g, \"'\\\\''\")}'`;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [['path', { d: 'm15 18-6-6 6-6', key: '1wnfg3' }]];\n\n/**\n * @component @name ChevronLeft\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMTUgMTgtNi02IDYtNiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/chevron-left\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ChevronLeft = createLucideIcon('chevron-left', __iconNode);\n\nexport default ChevronLeft;\n","export type TerminalSessionRole = 'agent' | 'terminal';\nexport type GitRemoteProvider = 'github' | 'gitlab';\nexport type TerminalSessionEnvironment = {\n name: string;\n value: string;\n};\ntype DetectGitRemoteProviderOptions = {\n gitlabHosts?: string[];\n};\n\nfunction sanitizeTmuxSessionName(value: string): string {\n const safe = value.trim().replace(/[^a-zA-Z0-9_-]/g, '-');\n return safe || 'session';\n}\n\nexport function getTmuxSessionName(sessionName: string, role: TerminalSessionRole): string {\n return `viba-${sanitizeTmuxSessionName(sessionName).slice(0, 40)}-${role}`;\n}\n\nfunction normalizeGitRemoteUrl(remoteUrl: string): string {\n const trimmed = remoteUrl.trim();\n if (!trimmed) return '';\n\n if (/^[a-z][a-z0-9+.-]*:\\/\\//i.test(trimmed)) {\n return trimmed;\n }\n\n const scpLikeMatch = trimmed.match(/^([^@]+@)?([^:]+):(.+)$/);\n if (!scpLikeMatch) {\n return '';\n }\n\n const userPart = scpLikeMatch[1] || '';\n const host = scpLikeMatch[2];\n const path = scpLikeMatch[3].replace(/^\\/+/, '');\n return `ssh://${userPart}${host}/${path}`;\n}\n\nexport function parseGitRemoteHost(remoteUrl: string): string | null {\n const normalized = normalizeGitRemoteUrl(remoteUrl);\n if (!normalized) return null;\n\n try {\n return new URL(normalized).hostname.toLowerCase();\n } catch {\n return null;\n }\n}\n\nfunction normalizeKnownHost(value: string): string | null {\n const trimmed = value.trim();\n if (!trimmed) return null;\n\n try {\n return new URL(trimmed).hostname.toLowerCase();\n } catch {\n // Fall through to parse as a bare host (optionally with port).\n }\n\n try {\n return new URL(`ssh://${trimmed}`).hostname.toLowerCase();\n } catch {\n return null;\n }\n}\n\nexport function detectGitRemoteProvider(\n remoteUrl: string,\n options?: DetectGitRemoteProviderOptions,\n): GitRemoteProvider | null {\n const host = parseGitRemoteHost(remoteUrl);\n if (!host) return null;\n\n if (host === 'github.com' || host.includes('github')) {\n return 'github';\n }\n\n if (host === 'gitlab.com' || host.includes('gitlab')) {\n return 'gitlab';\n }\n\n if (options?.gitlabHosts?.some((knownHost) => normalizeKnownHost(knownHost) === host)) {\n return 'gitlab';\n }\n\n return null;\n}\n\nexport function buildTtydTerminalSrc(\n sessionName: string,\n role: TerminalSessionRole,\n environment?: TerminalSessionEnvironment | TerminalSessionEnvironment[] | null,\n): string {\n const tmuxSession = getTmuxSessionName(sessionName, role);\n const params = new URLSearchParams();\n params.append('arg', 'new-session');\n const environments = Array.isArray(environment)\n ? environment\n : environment\n ? [environment]\n : [];\n\n for (const env of environments) {\n if (!env.value) continue;\n params.append('arg', '-e');\n params.append('arg', `${env.name}=${env.value}`);\n }\n params.append('arg', '-A');\n params.append('arg', '-s');\n params.append('arg', tmuxSession);\n return `/terminal?${params.toString()}`;\n}\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8', key: 'v9h5vc' }],\n ['path', { d: 'M21 3v5h-5', key: '1q7to0' }],\n ['path', { d: 'M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16', key: '3uifl3' }],\n ['path', { d: 'M8 16H3v5', key: '1cv678' }],\n];\n\n/**\n * @component @name RefreshCw\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMyAxMmE5IDkgMCAwIDEgOS05IDkuNzUgOS43NSAwIDAgMSA2Ljc0IDIuNzRMMjEgOCIgLz4KICA8cGF0aCBkPSJNMjEgM3Y1aC01IiAvPgogIDxwYXRoIGQ9Ik0yMSAxMmE5IDkgMCAwIDEtOSA5IDkuNzUgOS43NSAwIDAgMS02Ljc0LTIuNzRMMyAxNiIgLz4KICA8cGF0aCBkPSJNOCAxNkgzdjUiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/refresh-cw\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst RefreshCw = createLucideIcon('refresh-cw', __iconNode);\n\nexport default RefreshCw;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 20h-1a2 2 0 0 1-2-2 2 2 0 0 1-2 2H6', key: '1528k5' }],\n ['path', { d: 'M13 8h7a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2h-7', key: '13ksps' }],\n ['path', { d: 'M5 16H4a2 2 0 0 1-2-2v-4a2 2 0 0 1 2-2h1', key: '1n9rhb' }],\n ['path', { d: 'M6 4h1a2 2 0 0 1 2 2 2 2 0 0 1 2-2h1', key: '1mj8rg' }],\n ['path', { d: 'M9 6v12', key: 'velyjx' }],\n];\n\n/**\n * @component @name TextCursorInput\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgMjBoLTFhMiAyIDAgMCAxLTItMiAyIDIgMCAwIDEtMiAySDYiIC8+CiAgPHBhdGggZD0iTTEzIDhoN2EyIDIgMCAwIDEgMiAydjRhMiAyIDAgMCAxLTIgMmgtNyIgLz4KICA8cGF0aCBkPSJNNSAxNkg0YTIgMiAwIDAgMS0yLTJ2LTRhMiAyIDAgMCAxIDItMmgxIiAvPgogIDxwYXRoIGQ9Ik02IDRoMWEyIDIgMCAwIDEgMiAyIDIgMiAwIDAgMSAyLTJoMSIgLz4KICA8cGF0aCBkPSJNOSA2djEyIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/text-cursor-input\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst TextCursorInput = createLucideIcon('text-cursor-input', __iconNode);\n\nexport default TextCursorInput;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8', key: '1p45f6' }],\n ['path', { d: 'M21 3v5h-5', key: '1q7to0' }],\n];\n\n/**\n * @component @name RotateCw\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjEgMTJhOSA5IDAgMSAxLTktOWMyLjUyIDAgNC45MyAxIDYuNzQgMi43NEwyMSA4IiAvPgogIDxwYXRoIGQ9Ik0yMSAzdjVoLTUiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/rotate-cw\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst RotateCw = createLucideIcon('rotate-cw', __iconNode);\n\nexport default RotateCw;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M5 12h14', key: '1ays0h' }],\n ['path', { d: 'm12 5 7 7-7 7', key: 'xquz4c' }],\n];\n\n/**\n * @component @name ArrowRight\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNSAxMmgxNCIgLz4KICA8cGF0aCBkPSJtMTIgNSA3IDctNyA3IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/arrow-right\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ArrowRight = createLucideIcon('arrow-right', __iconNode);\n\nexport default ArrowRight;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '5', cy: '6', r: '3', key: '1qnov2' }],\n ['path', { d: 'M5 9v12', key: 'ih889a' }],\n ['circle', { cx: '19', cy: '18', r: '3', key: '1qljk2' }],\n ['path', { d: 'm15 9-3-3 3-3', key: '1lwv8l' }],\n ['path', { d: 'M12 6h5a2 2 0 0 1 2 2v7', key: '1yj91y' }],\n];\n\n/**\n * @component @name GitPullRequestArrow\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSI1IiBjeT0iNiIgcj0iMyIgLz4KICA8cGF0aCBkPSJNNSA5djEyIiAvPgogIDxjaXJjbGUgY3g9IjE5IiBjeT0iMTgiIHI9IjMiIC8+CiAgPHBhdGggZD0ibTE1IDktMy0zIDMtMyIgLz4KICA8cGF0aCBkPSJNMTIgNmg1YTIgMiAwIDAgMSAyIDJ2NyIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/git-pull-request-arrow\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst GitPullRequestArrow = createLucideIcon('git-pull-request-arrow', __iconNode);\n\nexport default GitPullRequestArrow;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M15 12h-5', key: 'r7krc0' }],\n ['path', { d: 'M15 8h-5', key: '1khuty' }],\n ['path', { d: 'M19 17V5a2 2 0 0 0-2-2H4', key: 'zz82l3' }],\n [\n 'path',\n {\n d: 'M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3',\n key: '1ph1d7',\n },\n ],\n];\n\n/**\n * @component @name ScrollText\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTUgMTJoLTUiIC8+CiAgPHBhdGggZD0iTTE1IDhoLTUiIC8+CiAgPHBhdGggZD0iTTE5IDE3VjVhMiAyIDAgMCAwLTItMkg0IiAvPgogIDxwYXRoIGQ9Ik04IDIxaDEyYTIgMiAwIDAgMCAyLTJ2LTFhMSAxIDAgMCAwLTEtMUgxMWExIDEgMCAwIDAtMSAxdjFhMiAyIDAgMSAxLTQgMFY1YTIgMiAwIDEgMC00IDB2MmExIDEgMCAwIDAgMSAxaDMiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/scroll-text\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ScrollText = createLucideIcon('scroll-text', __iconNode);\n\nexport default ScrollText;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '18', cy: '18', r: '3', key: '1xkwt0' }],\n ['circle', { cx: '6', cy: '6', r: '3', key: '1lh9wr' }],\n ['path', { d: 'M6 21V9a9 9 0 0 0 9 9', key: '7kw0sc' }],\n];\n\n/**\n * @component @name GitMerge\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxOCIgY3k9IjE4IiByPSIzIiAvPgogIDxjaXJjbGUgY3g9IjYiIGN5PSI2IiByPSIzIiAvPgogIDxwYXRoIGQ9Ik02IDIxVjlhOSA5IDAgMCAwIDkgOSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/git-merge\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst GitMerge = createLucideIcon('git-merge', __iconNode);\n\nexport default GitMerge;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'm5 12 7-7 7 7', key: 'hav0vg' }],\n ['path', { d: 'M12 19V5', key: 'x0mq9r' }],\n];\n\n/**\n * @component @name ArrowUp\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtNSAxMiA3LTcgNyA3IiAvPgogIDxwYXRoIGQ9Ik0xMiAxOVY1IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/arrow-up\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ArrowUp = createLucideIcon('arrow-up', __iconNode);\n\nexport default ArrowUp;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 5v14', key: 's699le' }],\n ['path', { d: 'm19 12-7 7-7-7', key: '1idqje' }],\n];\n\n/**\n * @component @name ArrowDown\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgNXYxNCIgLz4KICA8cGF0aCBkPSJtMTkgMTItNyA3LTctNyIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/arrow-down\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ArrowDown = createLucideIcon('arrow-down', __iconNode);\n\nexport default ArrowDown;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '12', cy: '5', r: '1', key: 'gxeob9' }],\n ['circle', { cx: '19', cy: '5', r: '1', key: 'w8mnmm' }],\n ['circle', { cx: '5', cy: '5', r: '1', key: 'lttvr7' }],\n ['circle', { cx: '12', cy: '12', r: '1', key: '41hilf' }],\n ['circle', { cx: '19', cy: '12', r: '1', key: '1wjl8i' }],\n ['circle', { cx: '5', cy: '12', r: '1', key: '1pcz8c' }],\n ['circle', { cx: '12', cy: '19', r: '1', key: 'lyex9k' }],\n ['circle', { cx: '19', cy: '19', r: '1', key: 'shf9b7' }],\n ['circle', { cx: '5', cy: '19', r: '1', key: 'bfqh0e' }],\n];\n\n/**\n * @component @name Grip\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjUiIHI9IjEiIC8+CiAgPGNpcmNsZSBjeD0iMTkiIGN5PSI1IiByPSIxIiAvPgogIDxjaXJjbGUgY3g9IjUiIGN5PSI1IiByPSIxIiAvPgogIDxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjEiIC8+CiAgPGNpcmNsZSBjeD0iMTkiIGN5PSIxMiIgcj0iMSIgLz4KICA8Y2lyY2xlIGN4PSI1IiBjeT0iMTIiIHI9IjEiIC8+CiAgPGNpcmNsZSBjeD0iMTIiIGN5PSIxOSIgcj0iMSIgLz4KICA8Y2lyY2xlIGN4PSIxOSIgY3k9IjE5IiByPSIxIiAvPgogIDxjaXJjbGUgY3g9IjUiIGN5PSIxOSIgcj0iMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/grip\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Grip = createLucideIcon('grip', __iconNode);\n\nexport default Grip;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M4.037 4.688a.495.495 0 0 1 .651-.651l16 6.5a.5.5 0 0 1-.063.947l-6.124 1.58a2 2 0 0 0-1.438 1.435l-1.579 6.126a.5.5 0 0 1-.947.063z',\n key: 'edeuup',\n },\n ],\n];\n\n/**\n * @component @name MousePointer2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNC4wMzcgNC42ODhhLjQ5NS40OTUgMCAwIDEgLjY1MS0uNjUxbDE2IDYuNWEuNS41IDAgMCAxLS4wNjMuOTQ3bC02LjEyNCAxLjU4YTIgMiAwIDAgMC0xLjQzOCAxLjQzNWwtMS41NzkgNi4xMjZhLjUuNSAwIDAgMS0uOTQ3LjA2M3oiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/mouse-pointer-2\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst MousePointer2 = createLucideIcon('mouse-pointer-2', __iconNode);\n\nexport default MousePointer2;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'm6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2',\n key: 'usdka0',\n },\n ],\n];\n\n/**\n * @component @name FolderOpen\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtNiAxNCAxLjUtMi45QTIgMiAwIDAgMSA5LjI0IDEwSDIwYTIgMiAwIDAgMSAxLjk0IDIuNWwtMS41NCA2YTIgMiAwIDAgMS0xLjk1IDEuNUg0YTIgMiAwIDAgMS0yLTJWNWEyIDIgMCAwIDEgMi0yaDMuOWEyIDIgMCAwIDEgMS42OS45bC44MSAxLjJhMiAyIDAgMCAwIDEuNjcuOUgxOGEyIDIgMCAwIDEgMiAydjIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/folder-open\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst FolderOpen = createLucideIcon('folder-open', __iconNode);\n\nexport default FolderOpen;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z',\n key: '10ikf1',\n },\n ],\n];\n\n/**\n * @component @name Play\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNSA1YTIgMiAwIDAgMSAzLjAwOC0xLjcyOGwxMS45OTcgNi45OThhMiAyIDAgMCAxIC4wMDMgMy40NThsLTEyIDdBMiAyIDAgMCAxIDUgMTl6IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/play\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Play = createLucideIcon('play', __iconNode);\n\nexport default Play;\n","import { useCallback } from 'react';\nimport type { MutableRefObject } from 'react';\nimport { normalizePreviewUrl } from '@/lib/url';\n\nexport type TerminalWindow = Window & {\n term?: {\n paste: (text: string) => void;\n scrollToBottom?: () => void;\n attachCustomKeyEventHandler?: (customKeyEventHandler: (event: KeyboardEvent) => boolean) => void;\n customKeyEventHandler?: (event: KeyboardEvent) => boolean;\n buffer?: {\n active?: {\n baseY: number;\n cursorY: number;\n getLine?: (lineIndex: number) => { translateToString: (trimRight?: boolean) => string } | undefined;\n };\n };\n options: {\n linkHandler?: TerminalLinkHandler | null;\n theme?: Record<string, string>;\n [key: string]: unknown;\n };\n _core?: {\n _linkProviderService?: {\n linkProviders?: Map<number, TerminalLinkProvider>;\n };\n coreService?: {\n triggerDataEvent?: (data: string, wasUserInput?: boolean) => void;\n };\n };\n };\n};\n\nexport type TerminalLinkProvider = {\n _handler?: (event: MouseEvent | undefined, url: string) => void;\n provideLinks?: (line: number, callback: (links: TerminalLink[] | undefined) => void) => void;\n};\n\nexport type TerminalLink = {\n text: string;\n activate?: (event: MouseEvent | undefined, text: string) => void;\n [key: string]: unknown;\n};\n\nexport type TerminalLinkHandler = {\n allowNonHttpProtocols?: boolean;\n activate?: (event: MouseEvent | undefined, url: string, range?: unknown) => void;\n hover?: (event: MouseEvent | undefined, url: string, range?: unknown) => void;\n leave?: (event: MouseEvent | undefined, url: string, range?: unknown) => void;\n};\n\nexport type TerminalLinkHandlerOptions = {\n onLinkActivated?: () => void;\n directOpenBehavior?: TerminalLinkOpenBehavior;\n modifierOpenBehavior?: TerminalLinkOpenBehavior;\n};\n\ninterface UseTerminalLinkProps {\n onLoadPreview: (url: string, openPreview: boolean) => Promise<boolean>;\n}\n\nexport type TerminalLinkOpenBehavior = 'preview' | 'new_tab';\n\nexport function useTerminalLink({ onLoadPreview }: UseTerminalLinkProps) {\n const handleTerminalLinkOpen = useCallback((rawUrl: string, openBehavior: TerminalLinkOpenBehavior): boolean => {\n const normalized = normalizePreviewUrl(rawUrl);\n if (!normalized) return false;\n\n if (openBehavior === 'new_tab') {\n window.open(normalized, '_blank', 'noopener,noreferrer');\n return true;\n }\n\n void onLoadPreview(normalized, true);\n return true;\n }, [onLoadPreview]);\n\n const attachTerminalLinkHandler = useCallback((\n iframe: HTMLIFrameElement,\n cleanupRef: MutableRefObject<(() => void) | null>,\n options?: TerminalLinkHandlerOptions\n ) => {\n cleanupRef.current?.();\n const frameWindow = iframe.contentWindow as TerminalWindow | null;\n const terminal = frameWindow?.term;\n if (!frameWindow || !terminal) return;\n const notifyLinkActivated = options?.onLinkActivated;\n const directOpenBehavior = options?.directOpenBehavior ?? 'preview';\n const modifierOpenBehavior = options?.modifierOpenBehavior ?? 'new_tab';\n const resolveOpenBehavior = (openWithModifier: boolean): TerminalLinkOpenBehavior => (\n openWithModifier ? modifierOpenBehavior : directOpenBehavior\n );\n\n const restorers: Array<() => void> = [];\n\n const frameDocument = iframe.contentDocument;\n let lastModifierState = {\n metaKey: false,\n ctrlKey: false,\n at: 0,\n };\n\n if (frameDocument) {\n const recordModifierState = (event: MouseEvent) => {\n lastModifierState = {\n metaKey: event.metaKey,\n ctrlKey: event.ctrlKey,\n at: Date.now(),\n };\n };\n\n frameDocument.addEventListener('mousedown', recordModifierState, true);\n frameDocument.addEventListener('click', recordModifierState, true);\n restorers.push(() => {\n frameDocument.removeEventListener('mousedown', recordModifierState, true);\n frameDocument.removeEventListener('click', recordModifierState, true);\n });\n }\n\n const originalOpen = frameWindow.open.bind(frameWindow);\n const patchedOpen: Window['open'] = (...args) => {\n const openWithModifier = Date.now() - lastModifierState.at < 1000;\n const shouldTreatAsModifierOpen = openWithModifier && (lastModifierState.metaKey || lastModifierState.ctrlKey);\n const openBehavior = resolveOpenBehavior(shouldTreatAsModifierOpen);\n\n if (typeof args[0] === 'string' && args[0].trim()) {\n notifyLinkActivated?.();\n const handled = handleTerminalLinkOpen(args[0], openBehavior);\n if (handled) {\n return null;\n }\n return originalOpen(...args);\n }\n\n if (args.length === 0) {\n let fallbackWindow: Window | null = null;\n const syntheticWindow = {\n opener: null,\n location: {\n set href(url: string) {\n notifyLinkActivated?.();\n const handled = handleTerminalLinkOpen(url, openBehavior);\n\n if (!handled) {\n fallbackWindow = originalOpen();\n if (fallbackWindow) {\n try {\n fallbackWindow.opener = null;\n } catch {\n // Ignore opener assignment failures\n }\n fallbackWindow.location.href = url;\n }\n }\n },\n get href() {\n return '';\n },\n },\n } as unknown as Window;\n\n return syntheticWindow;\n }\n\n return originalOpen(...args);\n };\n\n frameWindow.open = patchedOpen;\n restorers.push(() => {\n frameWindow.open = originalOpen;\n });\n\n const providers = terminal._core?._linkProviderService?.linkProviders;\n\n if (providers instanceof Map) {\n for (const provider of providers.values()) {\n if (!provider || typeof provider !== 'object') continue;\n\n if (typeof provider._handler === 'function') {\n const originalHandler = provider._handler;\n provider._handler = (event: MouseEvent | undefined, url: string) => {\n notifyLinkActivated?.();\n const shouldTreatAsModifierOpen = Boolean(event?.metaKey || event?.ctrlKey);\n const handled = handleTerminalLinkOpen(url, resolveOpenBehavior(shouldTreatAsModifierOpen));\n if (!handled) {\n originalHandler(event, url);\n }\n };\n\n restorers.push(() => {\n provider._handler = originalHandler;\n });\n }\n\n if (typeof provider.provideLinks === 'function') {\n const originalProvideLinks = provider.provideLinks.bind(provider);\n provider.provideLinks = (line: number, callback: (links: TerminalLink[] | undefined) => void) => {\n originalProvideLinks(line, (links: TerminalLink[] | undefined) => {\n if (Array.isArray(links)) {\n for (const link of links) {\n if (!link || typeof link !== 'object') continue;\n if (typeof link.activate !== 'function') continue;\n\n const originalActivate = link.activate.bind(link);\n link.activate = (event: MouseEvent | undefined, text: string) => {\n notifyLinkActivated?.();\n const shouldTreatAsModifierOpen = Boolean(event?.metaKey || event?.ctrlKey);\n const handled = handleTerminalLinkOpen(text, resolveOpenBehavior(shouldTreatAsModifierOpen));\n if (!handled) {\n originalActivate(event, text);\n }\n };\n }\n }\n callback(links);\n });\n };\n\n restorers.push(() => {\n provider.provideLinks = originalProvideLinks;\n });\n }\n }\n }\n\n const existingLinkHandler = terminal.options.linkHandler;\n const nextLinkHandler: TerminalLinkHandler = {\n allowNonHttpProtocols: existingLinkHandler?.allowNonHttpProtocols ?? false,\n activate: (event, url, range) => {\n notifyLinkActivated?.();\n const shouldTreatAsModifierOpen = Boolean(event?.metaKey || event?.ctrlKey);\n const handled = handleTerminalLinkOpen(url, resolveOpenBehavior(shouldTreatAsModifierOpen));\n if (!handled) {\n existingLinkHandler?.activate?.(event, url, range);\n }\n },\n hover: (event, url, range) => {\n existingLinkHandler?.hover?.(event, url, range);\n },\n leave: (event, url, range) => {\n existingLinkHandler?.leave?.(event, url, range);\n },\n };\n\n terminal.options.linkHandler = nextLinkHandler;\n restorers.push(() => {\n terminal.options.linkHandler = existingLinkHandler ?? null;\n });\n\n cleanupRef.current = () => {\n for (const restore of restorers) {\n restore();\n }\n cleanupRef.current = null;\n };\n }, [handleTerminalLinkOpen]);\n\n return { handleTerminalLinkOpen, attachTerminalLinkHandler };\n}\n"],"names":[],"mappings":"wDgBEA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,ONH0L,EAAA,EAAA,CAAA,CAAA,MAAsG,IAAM,EAAoC,CAAA,EAAA,EAAA,kBAAb,GAAkC,AAArB,EAAsB,MAAxB,uCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,2BVAxI,EAAoC,CAAA,EAAA,EAAA,kBAAb,GAAa,AAAqB,EAAC,MAAxB,uCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,6BCA/I,EAAoC,CAAA,EAAA,EAAA,kBAAb,GAAa,AAAqB,EAAC,MAAxB,uCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,wBCAvI,EAAoC,CAAA,EAAA,EAAA,kBAAb,GAAa,AAAqB,EAAC,MAAxB,uCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,2BCA/I,EAAoC,CAAA,EAAA,EAAA,kBAAb,GAAa,AAAqB,EAAC,MAAxB,uCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,sBCAvI,EAAoC,CAAA,EAAA,EAAA,kBAAb,GAAkC,AAArB,EAAsB,MAAxB,uCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,yBCAxI,EAAoC,CAAA,EAAA,EAAA,kBAAb,GAAa,AAAqB,EAAC,MAAxB,uCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,2BCA3I,EAAmC,CAAA,EAAA,EAAA,iBAAb,IAAa,AAAqB,EAAC,KAAxB,wCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,0BCA5I,EAAoC,CAAA,EAAA,EAAA,mBAAb,EAAa,AAAqB,EAAC,OAAxB,sCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,2BCAnI,EAAoC,CAAA,EAAA,EAAA,mBAAb,EAAa,AAAqB,EAAC,OAAxB,sCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,kCGenb,IAAA,EAAA,EAAA,CAAA,CAAA,OAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAAA,EAAA,EAAA,CAAA,CAAA,gDsBQsC,iINJJ,6KFEN,EAAiB,CCZpC,AIAkC,ARYF,AGAI,CAAA,AKZF,AJAlC,AJYgC,0PXNzC,IAAA,EAAA,EAAA,CAAA,CAAA,wPqBQoC,+PbrBC,QAAS,CAAA,AAAE,EAAG,iBAAkB,CAAA,CAAA,CAAA,CAAA,AAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,ERarF,IAAA,EAAA,EAAA,CAAA,CAAA,OmBUA,IAAM,EAAA,CAAA,EAAO,CAAA,CAAA,CAAA,MAAA,EAAiB,CAAA,OAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,8FApBjC,GAAA,0IAGF,CAAA,iEACyB,CJA7B,ADYmB,AHAJ,AQZc,GAAK,IAAA,WACzC,CAAC,SAAU,CJAF,AIAE,AAAE,CJAJ,CIAI,AJAJ,CAAA,AIAI,AJAJ,KIAc,CAAA,CAAA,CAAI,IAAA,CAAA,AAAM,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,AAAK,GAAA,CAAA,AAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,YAC3C,CGYF,AHZE,AEYT,CAAA,AFZS,AGYF,CHZE,AEYT,ACAO,8BHZkC,CEYI,AFZM,EACzD,CJDI,CfIJ,IAAA,EAAA,EAAA,CAAA,CAAA,MAAA,EAAA,EAAA,CAAA,CAAA,iNAAA,IAAA,EAAA,EAAA,CAAA,CAAA,6QeWA,EAAA,CAAA,EAAmB,CAAA,CAAA,CAAA,MAAA,EAAiB,eAAe,CAAA,CAAA,CAAA,CAAA,uIAjB1C,6GACH,GAAA,CAAK,CAAA,AIAR,SJCC,iBJUoB,EAAiB,+IAjBmB,CAAA,CAAA,CAAA,CAAA,AAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,SAChE,CDAA,AMAA,ADAA,ADAR,AKAA,ARAQ,AAAE,EAAA,yDAA8D,CDAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,0DCCL,CUA9D,ADAA,AEAA,CDAA,ADAA,AEAA,CAAA,AFAA,ACAA,CCAA,AFAA,ACAA,CCAA,AFAA,ACAA,CCAA,AFAA,ACAA,CCAA,AFAA,ACAA,CDAA,AEAA,ADAA,CDAA,AEAA,ADAA,CAAA,ADAA,AEAA,CAAA,ADAA,ADAA,CAAA,AEAA,ADAA,CAAA,ADAA,AEAA,CDAA,ACAA,AFAA,CAAA,AEAA,ADAA,CCAA,AFAA,ACAA,CCAA,AFAA,ACAA,CDAA,AEAA,ADAA,CAAA,ADAA,AEAA,CAAA,AFAA,ACAA,CCAA,ADAA,ADAA,CCAA,ADAA,CAAA,ACAA,CDAA,ACAA,CDAA,ACAA,CDAA,ACAA,CDAA,ACAA,CDAA,ACAA,CDAA,ACAA,CAAA,ADAA,CAAA,ACAA,CAAA,ADAA,CAAA,ACAA,CAAA,ADAA,CCAA,ADAA,CCAA,ADAA,CCAA,ADAA,CAAA,ACAA,CDAA,ACAA,ArBST,CoBTS,ACAA,CDAA,ACAA,CDAA,ACAA,CAAA,ADAA,ApBST,CqBTS,ADAA,CAAA,ACAA,ArBST,CqBTS,ADAA,CAAA,ACAA,ArBST,CqBTS,ADAA,ApBST,CqBTS,ADAA,ApBST,CqBTS,ADAA,CCAA,ADAA,CAAA,ACAA,CDAA,ACAA,CDAA,ACAA,CAAA,ADAA,CCAA,ADAA,ApBUT,CqBVS,ADAA,CCAA,ADAA,ApBUT,CqBVS,ADAA,CCAA,ADAA,ApBUT,CqBVS,ADAA,ApBUT,CqBVS,ADAA,ApBUT,CoBVS,ACAA,CAAA,ADAA,CCAA,ADAA,CAAA,ACAA,CAAA,ADAA,CCAA,ADAA,CCAA,ADAA,CCAA,ADAA,CAAA,ACAA,CAAA,CAAA,AXcH,CWdG,CAAA,AXcH,CWdG,AXcH,CWdG,CAAA,AXcS,CWdT,CXcS,AWdT,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,AXcS,CWdT,CAAA,AXc0B,CWd1B,AXc0B,CWd1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,mDXH6D,CCAN,ACAK,AFAC,CEAD,AFAC,EAAK,CAAA,AEAD,CAAA,AFAC,CAAA,AEAD,CAAA,AFAC,CAAA,AEAD,CAAA,AFAC,CAAA,GAAU,yBACvD,CMAF,ACAA,ACAZ,ARAc,AEAA,ACAd,ACAW,ACAC,AJAZ,GDAc,4EACyC,CCAN,ADAM,CAAA,EAAA,QAAK,CAAU,CAAA,CACpF,CAAC,CIAA,AIYH,ANAA,ACAA,AQbI,ACAA,AZCD,ACAA,AMYH,AGbI,CEAA,ALaJ,ALAA,ACAA,ACZG,AHAA,AOYH,AEbI,AVCD,AWDC,KXCO,CAAA,AIAA,AQAF,AFAA,ACAA,AVAE,AQAR,kBTA+B,aZHlC,IAAA,EAAA,EAAA,CAAA,CAAA,OAEA,EAAA,EAAA,CAAA,CAAA,OAuBO,SAAS,EAAkB,UAAE,CAAQ,CAAE,YAAU,gBAAE,CAAc,CAA0B,EAChG,GAAM,CAAC,EAAW,EAAa,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAuB,CAAE,KAAM,OAAQ,KAAM,IAAK,GACtF,CAAE,KAAM,CAAU,CAAE,CAAG,CAAA,EAAA,EAAA,cAAA,AAAc,EAAC,GACtC,CACJ,KAAM,CAAG,WACT,CAAS,YACT,CAAU,CACV,SAAO,OACP,CAAK,SACL,CAAO,CACR,CAAG,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,EAAU,IAAK,CAAE,MAAO,SAAU,GAC1C,EAAa,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,IAAM,GAAK,KAAO,EAAE,CAAE,CAAC,EAAI,EAChD,EAAgB,GAAY,SAAS,QAAU,GAAY,QAAU,UACrE,EAAmB,GAAY,SAAS,QAAU,GAAY,QAAU,KACxE,EAAgB,GAAgB,QAAU,KAC1C,CAAE,KAAM,CAAa,CAAE,CAAG,CAAA,EAAA,EAAA,eAAA,AAAe,EAAC,EAAU,EAAe,GACnE,EAAU,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,KACtB,GAAI,CAAC,EAAe,OAAO,EAC3B,IAAM,EAAsB,EAAc,IAAI,GAC9C,GAAI,CAAC,EAAqB,OAAO,EAEjC,IAAM,EAAmB,EAAW,SAAS,CAAC,AAAC,GAC7C,EAAoB,UAAU,CAAC,EAAO,IAAI,GAAK,EAAO,IAAI,CAAC,UAAU,CAAC,WAExE,AAAI,EAAmB,EAAU,CAAP,CACnB,EAAW,KAAK,CAAC,EAAG,EAAmB,EAChD,EAAG,CAAC,EAAY,EAAc,EACxB,EAAqB,CAAA,EAAA,EAAA,OAAO,AAAP,EAAQ,IACV,AAAvB,GAA0B,CAAtB,EAAQ,MAAM,EACK,cAAc,CAAjC,EAAU,IAAI,AAA0B,CADX,KAE7B,AAAmB,aAAT,IAAI,EAAiB,EAAQ,IAAI,CAAC,AAAC,GAAW,EAAO,IAAI,GAAK,EAAU,IAAI,EACjF,CADoF,CAC1E,IAAI,CAEhB,CAAO,CAAC,EAAE,CAAC,IAAI,CACrB,CAAC,EAAS,EAAU,EAUvB,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,uEACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,2FACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,+LACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oEACb,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,iDAChB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,oBAAW,cAC3B,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,kCAAkC,MAAO,WACtD,OAGL,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,4CACb,EAAQ,MAAM,CAAC,UAA2B,IAAnB,EAAQ,MAAM,CAAS,GAAK,UAGxD,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,0BACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,iBAAiB,CAAA,CAChB,SAAU,EACV,WAAY,EACZ,2BAA2B,CAAA,CAAA,EAC3B,mBAAmB,cAKzB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,yCACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,+LACb,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,mCAA0B,mBAC1C,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,UAAU,wIACV,QAAS,IAAM,KAAK,IACpB,MAAM,yBACN,aAAW,kCAEX,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAU,UAAW,CAAC,YAAY,EAAE,EAAa,eAAiB,GAAA,CAAI,QAG3E,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,0CACZ,EACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,8FACb,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,yCAEhB,EACF,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,2GACZ,aAAiB,MAAQ,EAAM,OAAO,CAAG,kCAEvB,IAAnB,EAAQ,MAAM,CAChB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,+GAAsG,qCAIrH,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,2DACZ,EAAQ,GAAG,CAAC,AAAC,QAtHF,EAuHV,GAvHuB,CAC/B,EAsHc,EAAa,IAAuB,EAAO,IAAI,CACrD,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAEC,KAAK,SACL,QAAS,IAAM,KAnEN,CACzB,CAAI,OAkE6C,EAAO,IAAI,EAjE1D,EAAa,CAAE,KADU,AACJ,YADgB,CACF,KAAM,IAAK,GAGhD,EAAa,CAAE,KAAM,SAAU,KAAM,CAAW,IA+DhC,UAAW,CAAC,6CAA6C,EAAE,EACvD,mCACA,6CAAA,CACA,CACJ,MA1HX,CA0HkB,AA1HlB,EAAG,AA0H2B,EA1HpB,IAAI,CAAC,CAAC,EAAE,EAAO,OAAO,CAAA,CAAE,CAAC,IAAI,aA4H5B,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,6FACb,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,gEAAwD,EAAO,IAAI,GACnF,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,oBAnIhC,CAmI4C,MAnIrC,KAAK,CAAC,EADF,KAAK,EACM,GADD,CAAC,EAoIuC,EAAO,IAAI,GAnI3C,EAC1B,IAAI,KAAK,GAAQ,cAAc,QAoIpB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,gFACZ,EAAO,OAAO,EAAI,iBAErB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,mEACZ,EAAO,WAAW,KAjBhB,EAAO,IAAI,CAqBtB,YAOd,CE3IA,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OSoEO,SAAS,EACd,CAAmB,CACnB,CAAyB,CACzB,CAA8E,UAE9E,IAAM,GA9E2B,EA8EM,EA9Ee,EA8EF,EA9E2B,AACxE,CAAC,EA6EY,AA9EgC,GACvC,EAAE,CAAwB,AAL1B,AACN,EADY,IAAI,GAAG,OAAO,CAAC,kBAAmB,MACtC,SAAA,EAIqC,KAAK,CAAC,EAAG,IAAI,CAAC,EAAE,EAAA,CAAM,EA8EpE,EAAS,IAAI,gBAQnB,IAAK,IAAM,KAPX,EAAO,AAOW,MAPL,CAAC,MAAO,AAOW,eANX,MAAM,OAAO,CAAC,GAC/B,EACA,EACE,CAAC,EAAY,CACb,EAAE,EAGD,EAAI,KAAK,EAAE,CAChB,EAAO,MAAM,CAAC,MAAO,MACrB,EAAO,MAAM,CAAC,MAAO,CAAA,EAAG,EAAI,IAAI,CAAC,CAAC,EAAE,EAAI,KAAK,CAAA,CAAE,GAKjD,OAHA,EAAO,MAAM,CAAC,MAAO,MACrB,EAAO,MAAM,CAAC,MAAO,MACrB,EAAO,MAAM,CAAC,MAAO,GACd,CAAC,UAAU,EAAE,EAAO,QAAQ,GAAA,CAAI,AACzC,CH/GO,IAAM,EAAsB,AAAC,IAChC,IAAM,EAAU,EAAS,IAAI,GAC7B,GAAI,CAAC,EAAS,OAAO,KACrB,GAAI,gBAAgB,IAAI,CAAC,GAAU,OAAO,EAC1C,GAAI,2BAA2B,IAAI,CAAC,IAChC,kCAAkC,IAAI,CAAC,GADG,OAAO,AACA,KAErD,EAF4D,EAEtD,EAAe,EAAQ,KAAK,CAAC,IAAI,CAAC,EAAE,EAAI,GACxC,EAAa,EAAa,OAAO,CAAC,KACxC,GAAI,EAAa,GAAK,CAAC,EAAa,UAAU,CAAC,KAAM,CACjD,IAAM,EAAgB,EAAa,KAAK,CAAC,EAAG,GAAY,WAAW,GAC7D,EAAW,EAAa,KAAK,CAAC,EAAa,GAKjD,GAAI,CAAC,CAJwB,EAAc,QAAQ,CAAC,MAC3B,cAAlB,GACA,4BAA4B,IAAI,CAAC,IACjC,QAAQ,IAAI,CAAC,EAAA,EACO,OAAO,IACtC,CAEA,IAAM,EAAW,EAAa,QAAQ,CAAC,KAAO,EAAa,KAAK,CAAC,EAAa,WAAW,CAAC,KAAO,GAAK,EAChG,EAAO,EAAS,UAAU,CAAC,KAC3B,EAAS,KAAK,CAAC,EAAG,KAAK,GAAG,CAAC,EAAG,EAAS,OAAO,CAAC,OAAO,WAAW,GACjE,EAAS,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,GAKxC,MAAO,CAAA,EAAG,AAHgB,cAAT,GAAiC,cAAT,GAAiC,QAAT,EAC3D,OACA,QACa,GAAG,EAAE,EAAA,CAAS,AACrC,ENLA,IAAA,EAAA,EAAA,CAAA,CAAA,OOvBO,IAAM,EAAgB,AAAC,GAA0B,CAAC,CAAC,EAAE,EAAM,OAAO,CAAC,KAAM,SAAS,CAAC,CAAC,CP0B3F,IAAA,EAAA,EAAA,CAAA,CAAA,OAQA,IAAM,EAAiB,CACnB,CAAE,GAAI,SAAU,KAAM,UAAW,SAAU,QAAS,EACpD,CAAE,GAAI,SAAU,KAAM,SAAU,SAAU,QAAS,EACnD,CAAE,GAAI,WAAY,KAAM,WAAY,SAAU,UAAW,EACzD,CAAE,GAAI,cAAe,KAAM,cAAe,SAAU,aAAc,EACrE,CAkBK,EAA4B,qBAC5B,EAA0B,iCAM1B,GAAuB,iBACvB,GAAyB,sBAgBzB,GAAuB,AAAD,GAA2B,KAAK,GAAG,CAAC,GAAK,KAAK,GAAG,CAAC,GAAK,IA0C7E,GAAW,CAAC,EAAc,KAC5B,IAAM,EAAiB,EAAK,OAAO,CAAC,MAAO,KAAK,OAAO,CAAC,OAAQ,IAC1D,EAAqB,EAAS,OAAO,CAAC,MAAO,KAAK,OAAO,CAAC,OAAQ,IACxE,MAAO,CAAA,EAAG,EAAe,CAAC,EAAE,EAAA,CAAoB,AACpD,EAEM,GAA6B,CAAC,EAA2B,KAC3D,IAAM,EAA0B,EAAc,IAAI,GAAG,OAAO,CAAC,MAAO,KAAK,OAAO,CAAC,OAAQ,IACzF,GAAI,CAAC,EAAyB,OAAO,KAErC,IAAM,EAAmB,CA3CS,AAAC,IACnC,IAAI,EAAa,EAAM,IAAI,GAC3B,GAAI,CAAC,EAAY,MAAO,GAIxB,GAFA,EAAa,EAAW,OAAO,CAAC,UAAW,IAEvC,cAAc,IAAI,CAAC,GACnB,GAAI,CACA,IAAM,EAFsB,AAEd,IAAI,IAAI,GACtB,EAAa,mBAAmB,EAAM,QAAQ,CAClD,CAAE,KAAM,CAER,MACG,GAAI,gBAAgB,IAAI,CAAC,GAC5B,GAAI,CACA,IAAM,EAF+B,AAEvB,IAAI,IAAI,GACtB,EAAa,mBAAmB,EAAM,QAAQ,CAClD,CAAE,KAAM,CAER,CAWJ,MAAO,CARP,EAAa,EACR,OAAO,CAAC,iCAAkC,IAC1C,OAAO,CAAC,YAAa,IACrB,OAAO,CAAC,aAAc,IACtB,OAAO,CAAC,UAAW,KACnB,OAAO,CAAC,QAAS,IACjB,OAAO,CAAC,MAAO,IAAA,EAEF,IAAI,GAC1B,EAY2D,GACvD,GAAI,CAAC,EAAkB,OAAO,KAE9B,GAAI,EAAiB,UAAU,CAAC,MAAQ,CAAA,EAAA,EAAA,qBAAA,AAAqB,EAAC,GAC1D,OAAO,EAGX,IAAM,EAAqB,CAJsD,GAIlD,IAC/B,EAAmB,GAAG,CAAC,EAAiB,OAAO,CAAC,SAAU,KAE1D,IAAM,EAAW,EAAiB,OAAO,CAAC,SAS1C,IAAK,IAAM,KARP,GAAY,GACZ,AADe,EACI,GAAG,CAAC,EAAiB,KAAK,CAAC,EAAW,IAGzD,EAAiB,UAAU,CAAC,SAAS,AACrC,EAAmB,GAAG,CAAC,GAGJ,GACnB,GAAK,CAAD,CACJ,OAAO,CADQ,EACC,CAFuB,CAEE,GAG7C,OAAO,IACX,EAuBM,GAA+B,AAAC,IAClC,IAAM,EAAU,EAAM,IAAI,GAC1B,GAAI,CAAC,EAAS,MAAO,GAErB,IAAM,EAAQ,EAAQ,KAAK,CAAC,oBAC5B,OAAO,EAAQ,CAAK,CAAC,EAAE,CAAG,EAC9B,EAwBO,SAAS,GAAY,MACxB,CAAI,UACJ,CAAQ,QACR,CAAM,YACN,CAAU,aACV,CAAW,OACX,CAAK,eACL,CAAa,iBACb,EAAe,gBACf,EAAc,CACd,kBAAe,CACf,kBAAe,OACf,EAAK,aACL,GAAc,MAAM,QACpB,EAAM,UACN,EAAQ,yBACR,GAA0B,OAAO,gBACjC,EAAc,CACd,iBAAkB,EAAwB,CAC1C,oBAAqB,EAA2B,CACjC,EACf,IAAM,GAAyB,6BAEzB,GAAY,CAAA,EAAA,EAAA,MAAA,AAAM,EAAoB,MACtC,GAAc,CAAA,EAAA,EAAA,MAAA,AAAM,EAAoB,MACxC,GAAuB,CAAA,EAAA,EAAA,MAAA,AAAM,EAAoB,MACjD,GAAmB,CAAA,EAAA,EAAA,MAAA,AAAM,EAAoB,MAC7C,GAAyB,CAAA,EAAA,EAAA,MAAA,AAAM,EAAmB,MAClD,GAAoB,CAAA,EAAA,EAAA,MAAA,AAAM,EAAiB,MAC3C,GAAiB,CAAA,EAAA,EAAA,MAAA,AAAM,EAAC,CAAE,OAAQ,EAAG,YAAY,CAAyB,GAC1E,GAAwB,CAAA,EAAA,EAAA,MAAA,AAAM,EAAqD,MACnF,GAA2B,CAAA,EAAA,EAAA,MAAA,AAAM,EAAsB,MACvD,GAA8B,CAAA,EAAA,EAAA,MAAA,AAAM,EAAsB,MAC1D,GAAmC,CAAA,EAAA,EAAA,MAAA,AAAM,EAAsB,MAC/D,GAAgC,CAAA,EAAA,EAAA,MAAA,AAAM,EAA8C,CACtF,UAAU,EACV,MAAO,IACX,GACM,GAAmB,CAAA,EAAA,EAAA,OAAA,AAAO,EAC5B,IAAM,IAA4B,EAAqB,EAAa,SACpE,CAAC,GAA0B,EAAY,EAErC,GAAsB,CAAA,EAAA,EAAA,OAAA,AAAO,EAC/B,IAAM,IAA+B,EAAqB,EAAa,YACvE,CAAC,GAA6B,EAAY,EAGxC,GAA4B,CAAA,EAAA,EAAA,MAAM,AAAN,EAA8D,CAC5F,MAAO,OACP,SAAU,MACd,GACM,GAAuB,CAAA,EAAA,EAAA,MAAA,AAAM,EAAyC,CACxE,OAAO,EACP,UAAU,CACd,GAEA,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACN,GAA0B,OAAO,CAAG,CAChC,MAAO,OACP,SAAU,MACd,EACA,GAAqB,OAAO,CAAG,CAC3B,OAAO,EACP,UAAU,CACd,EACoD,MAAM,CAAtD,GAA8B,OAAO,CAAC,KAAK,EAC3C,OAAO,YAAY,CAAC,GAA8B,OAAO,CAAC,KAAK,EAEnE,GAA8B,OAAO,CAAG,CACpC,SAAU,GACV,MAAO,IACX,CACJ,EAAG,CAAC,EAAY,EAEhB,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,IACC,KACiD,MAAM,CAAtD,GAA8B,OAAO,CAAC,KAAK,GAC3C,OAAO,YAAY,CAAC,GAA8B,OAAO,CAAC,KAAK,EAC/D,GAA8B,OAAO,CAAC,KAAK,CAAG,KAEtD,EACD,EAAE,EAEL,IAAM,GAA0B,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,AAAC,GAClC,GAAG,wBAAoC,KAAe,GAAM,CACpE,CAAC,EAD0D,AAC9C,CAD+C,CAGzD,GAAyB,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,AAAC,GACjC,CAAA,EAAG,EAAY,CAAC,EAAE,EAAA,CAAM,CAChC,CAAC,EAAY,EAEV,GAA8B,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,IACF,KAQ3C,EAAE,EAEC,GAA2B,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,AAAC,IAC1C,IAAM,EAAW,YACjB,AAAK,GACE,CADH,AACW,CAAC,GAAuB,EADxB,CAC8B,EAAI,IAD3B,EAE1B,EAAG,CAAC,GAA6B,GAAuB,EAElD,GAA2B,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,CAAC,EAA6B,KACvE,IAAM,EAAW,KACZ,GACL,EAAQ,CAAC,GAAuB,CADjB,EACuB,CAAG,CAAA,CAC7C,EAAG,CAAC,GAA6B,GAAuB,EAElD,GAA0B,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,AAAC,IACzC,GAAgD,QAAQ,CAApD,GAA0B,OAAO,CAAC,EAAK,EAGJ,QAAQ,CAA3C,GAAyB,GAFzB,OAAO,EAKX,GAAI,CACA,MAAwE,MAAjE,OAAO,cAAc,CAAC,OAAO,CAAC,GAAwB,GACjE,CAAE,KAAM,CACJ,MAAO,EACX,CACJ,EAAG,CAAC,GAA0B,GAAwB,EAEhD,GAAyB,CAAA,EAAA,EAAA,WAAW,AAAX,EAAY,AAAC,IACxC,IAAM,EAAU,GAA0B,OAAO,CAAC,EAAK,CACjD,EAAe,GAAyB,SAC9C,AAAgB,SAAZ,GAAkC,gBAAZ,GAA8C,SAAjB,GAA4C,eAAe,CAAhC,IAGlF,GAA0B,OAAO,CAAC,EAAK,CAAG,cAC1C,GAAyB,EAAM,gBACxB,EACX,EAAG,CAAC,GAA0B,GAAyB,EAEjD,GAAyB,CAAA,EAAA,EAAA,WAAA,AAAW,EAAE,AAAD,IACS,QAAQ,CAApD,GAA0B,OAAO,CAAC,EAAK,GACvC,GAA0B,OAAO,CAAC,EAAK,CAAG,MAAA,EAEP,QAAQ,CAA3C,GAAyB,IACzB,GAAyB,EAAM,OAEvC,EAAG,CAAC,GAA0B,GAAyB,EAEjD,GAA2B,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,AAAC,IAC1C,GAA0B,OAAO,CAAC,EAAK,CAAG,OAC1C,GAAyB,EAAM,QAC/B,GAAI,CACA,OAAO,cAAc,CAAC,OAAO,CAAC,GAAwB,GAAO,IACjE,CAAE,KAAM,CAER,CACJ,EAAG,CAAC,GAAyB,GAAyB,EAEhD,GAAqB,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,AAAC,IACpC,IAAM,EAAe,GAAM,QAAQ,OACnC,GAAI,CAAC,GAAgD,YAAhC,AAA4C,OAArC,EAAa,OAAO,CAE5C,OAAO,EAGX,IAAM,EAAa,EAAa,KAAK,CAAG,EAAa,OAAO,CAC5D,IAAK,IAAI,EAAS,EAAG,EAAS,EAAG,GAAU,EAAG,CAC1C,IAAM,EAAO,EAAa,OAAO,CAAC,EAAa,GACzC,EAAO,GAAM,mBAAkB,IAAS,GAC9C,GAAK,CAAD,CAAM,IAAI,GACd,CADkB,MACX,GAAqB,IAAI,CAAC,EACrC,CACA,OAAO,CACX,EAAG,EAAE,EAEC,GAA6B,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,KACvC,GAAiC,OAAO,EAAE,CAC1C,GAAiC,OAAO,GACxC,GAAiC,OAAO,CAAG,KAEnD,EAAG,EAAE,EAEC,GAA8B,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,CAC5C,EACA,KAEA,KAEA,IAAI,GAAW,EACX,EAAmD,KACnD,EAA4C,KAC5C,EAA4B,KAE1B,EAAqB,KACvB,GAAI,EAAU,OACd,IAAM,EAAY,CAAC,GAAmB,GACtC,GAAsC,AAAC,GAAa,IAAY,EAAY,EAAU,EAC1F,EAEA,IACA,EAAa,OAAO,WAAW,CAAC,EAAoB,KAEpD,GAAI,CAEA,GAAmC,YAA/B,AAA2C,OAApC,EAAM,aAAa,CAC1B,EAFU,AAEQ,EAAM,aAAa,CAAC,IAAuB,SAC1D,CACH,IAAM,EAAS,EAAO,eAAe,EAAE,cAAc,kBAAoB,EAAO,eAAe,EAAE,KAC7F,GACA,AACA,GADmB,EADX,EACe,iBAAiB,EAAA,EACvB,OAAO,CAAC,EAAQ,CAAE,WAAW,EAAM,SAAS,EAAM,eAAe,CAAK,EAE/F,CACJ,CAAE,MAAO,EAAO,CACZ,QAAQ,KAAK,CAAC,4CAA6C,EAC/D,CAEA,GAAiC,OAAO,CAAG,KACvC,EAAW,GACQ,MAAM,CAArB,IACA,OAAO,aAAa,CAAC,GACrB,EAAa,MAEb,GAAmB,AAAmC,YAAY,OAAxC,EAAgB,OAAO,EACjD,EAAgB,OAAO,GAE3B,GAAkB,YACtB,CACJ,EAAG,CAAC,GAAoB,GAA2B,EAEnD,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,IACC,KACH,IACJ,EACD,CAAC,GAA2B,EAE/B,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACN,IAAsC,GACtC,IACJ,EAAG,CAAC,EAAa,GAA2B,EAE5C,IAAM,GAA8B,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,CAC5C,EACA,EACA,KAEA,GAAI,GAAU,OAAO,EAErB,IAAM,EAAS,GAAe,aAC9B,CAAI,CAAC,IAAU,GAA8B,OAAO,CAAC,QAAQ,EAAE,CAkB/D,GAA8B,GAlBwC,IAkBjC,CAAC,QAAQ,EAAG,EACG,MAAM,CAAtD,GAA8B,OAAO,CAAC,KAAK,EAC3C,OAAO,YAAY,CAAC,GAA8B,OAAO,CAAC,KAAK,EAEnE,GAA8B,OAAO,CAAC,KAAK,CAAG,OAAO,UAAU,CAAC,KAC5D,GAA8B,OAAO,CAAC,KAAK,CAAG,KAC9C,GAAI,OACA,EAAK,KAAK,CAAC,IAtBT,EAAW,EAAO,eAAe,EAAE,cAAc,mCAEnD,EAAS,aAAa,CAAC,IAAI,cAAc,WAAY,CACjD,SAAS,EACT,YAAY,EACZ,SAAU,GACV,QAAS,GACT,IAAK,QACL,KAAM,CACV,IAEA,EAAK,KAAK,CAAC,KAaf,CAAE,MAAO,EAAO,CACZ,GAA8B,OAAO,CAAC,QAAQ,EAAG,EACjD,QAAQ,KAAK,CAAC,wDAAyD,EAC3E,CACJ,EAAG,MAEI,EACX,EAAG,CAAC,GAAU,EAAc,EAE5B,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACN,GAAI,IACA,CAAC,GAAe,QAChB,AADwB,GACM,OAAO,CAAC,QAAQ,CAFpC,CAEsC,MAEpD,IAAI,GAAY,EAEV,EAAmB,CAAC,EAAW,CAAC,IAClC,GAAI,GAAa,GAA8B,OAAO,CAAC,QAAQ,EAC3D,EAAW,GADkD,CAC9C,MAEnB,GAAI,CAAC,GAAwB,YAAa,YACtC,OAAO,UAAU,CAAC,IAAM,EAAiB,EAAW,GAAI,KAI5D,IAAM,EAAS,GAAY,OAAO,EAAI,GAAqB,OAAO,CAClE,GAAK,CAAD,EAEJ,GAAI,CACA,CAHS,GAGH,EAAM,EAAO,aAAa,CAChC,GAAI,GAAK,KAAM,YACX,GAA4B,EAAQ,EAAK,EAAI,IAAI,CAGzD,CAAE,KAAM,CAER,CAEA,OAAO,UAAU,CAAC,IAAM,EAAiB,EAAW,GAAI,KAC5D,EAGA,OADA,IACO,KACH,GAAY,CAChB,CACJ,EAAG,CAAC,GAAyB,GAA6B,GAAU,EAAc,EAElF,GAAM,CAAC,GAAU,GAAY,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,mBAC3C,CAAC,GAAc,GAAgB,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,EAAuB,QACzD,CAAC,GAAc,GAAgB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAgB,MAC1D,CAAC,GAAqB,GAAuB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACzD,CAAC,GAAoC,GAAsC,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IACvF,CAAC,GAAW,GAAa,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACrC,CAAC,GAAY,GAAc,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IACvC,CAAC,GAAmB,GAAqB,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,GAAS,GACrD,CAAC,GAAqB,GAAuB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,GAAY,GACrE,CAAC,GAAsB,GAAwB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAC3D,CAAC,GAAmB,GAAqB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,GAAY,QAAU,IAC3E,CAAC,GAAoB,GAAsB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IACvD,CAAC,GAAmB,GAAqB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAW,EAAE,EACjE,CAAC,GAAuB,GAAyB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAC7D,GAA2B,CAAA,EAAA,EAAA,MAAA,AAAM,GAAC,GAClC,CAAC,GAAsB,GAAwB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAC3D,CAAC,GAA8B,GAAgC,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAC3E,CAAC,GAAmB,GAAqB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IACrD,CAAC,GAAmB,GAAqB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IACrD,CAAC,GAAsB,GAAwB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAC3D,CAAC,GAAY,GAAc,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,CAAE,MAAO,EAAG,OAAQ,CAAE,GAC7D,CAAC,GAAkB,GAAoB,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,GAAS,GACnD,CAAC,GAAiB,GAAmB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IACjD,CAAC,GAAY,GAAc,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IACvC,CAAC,GAAuB,GAAyB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAC7D,CAAC,GAAoB,GAAsB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACvD,CAAC,GAAkB,GAAoB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IACnD,CAAC,GAAgB,GAAkB,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,EAAS,AArfxB,IAsfvB,CAAC,GAAiB,GAAmB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACjD,CAAC,GAAuB,GAAyB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAE7D,CAAC,GAAqB,GAAuB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAEzD,GAA4B,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,AAAC,IAC3C,IAAM,EAAS,AAAS,YAAU,GAAU,OAAO,CAAG,GAAY,OAAO,CACzE,GAAI,CAAC,EAAQ,OAAO,EACpB,GAAI,CACA,IAAM,EAAc,EAAO,aAAa,CAClC,EAAW,EAAO,eAAe,EAAE,cAAc,kCAEvD,GADA,GAAa,QACT,CAAC,GAAsC,YAA1B,OAAO,EAAS,KAAK,CAAiB,OAAO,EAC9D,GAAI,CACA,EAAS,KAAK,CAAC,CAAE,eAAe,CAAK,EACzC,CAAE,KAAM,CACJ,EAAS,KAAK,EAClB,CACA,MAAO,EACX,CAAE,KAAM,CACJ,OAAO,CACX,CACJ,EAAG,EAAE,EAEC,GAAkD,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,KAChE,IAAM,EAAa,GAAsB,OAAO,CAChD,GAAI,CAAC,GACD,KAAK,GAAG,GAAK,EAAW,EAAE,CAAG,KADhB,CACsB,MAEvC,IAAM,EAAgB,EAAW,IAAI,CACrC,OAAO,UAAU,CAAC,KACG,AACb,CAAC,EADsC,IAEvC,GAA4C,CADjC,SACe,EAA4B,WAAa,SAEvE,GAAsB,OAAO,CAAG,IACpC,EAAG,EACP,EAAG,CAAC,GAA0B,EAExB,GAA6B,CAAA,EAAA,EAAA,WAAW,AAAX,EAAY,KAC3C,CAAA,EAAA,EAAA,0BAAA,AAA0B,EAAC,GAAU,OAAO,EAC5C,CAAA,EAAA,EAAA,0BAAA,AAA0B,EAAC,GAAY,OAAO,EAC9C,IACJ,EAAG,CAAC,GAAgD,EAEpD,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACN,IAAM,EAAa,OAAO,UAAU,CAAC,gCAC/B,EAAa,KACf,IACJ,EACM,EAAoB,KACgC,QAAQ,CAA1D,CAAA,EAAA,EAAA,wBAAA,AAAwB,EAAC,OAAO,YAAY,GAC5C,GAER,EACM,EAAsB,AAAC,IACrB,AAAC,EAAM,GAAG,EAAI,EAAM,GAAG,GAAK,EAAA,sBAAsB,EAAE,AACpD,GAER,EACM,EAAqB,KACvB,GACJ,EAYA,OAVA,IACA,OAAO,gBAAgB,CAAC,UAAW,GACnC,OAAO,gBAAgB,CAAC,EAAA,mBAAmB,CAAE,GAEF,YAAvC,AAAmD,OAA5C,EAAW,gBAAgB,CAClC,EAAW,gBAAgB,CAAC,SAAU,GAEtC,EAAW,WAAW,CAAC,GAGpB,KACH,OAAO,mBAAmB,CAAC,UAAW,GACtC,OAAO,mBAAmB,CAAC,EAAA,mBAAmB,CAAE,GAEF,YAA1C,AAAsD,OAA/C,EAAW,mBAAmB,CACrC,EAAW,mBAAmB,CAAC,SAAU,GAEzC,EAAW,cAAc,CAAC,EAElC,CACJ,EAAG,CAAC,GAA2B,EAG/B,GAAM,CAAC,GAAc,GAAgB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,CAAE,MAAO,IAAK,OAAQ,GAAI,GACrE,CAAC,GAAY,GAAc,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACvC,CAAC,GAAU,GAAY,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,GAAS,GACnC,GAAY,CAAA,EAAA,EAAA,MAAA,AAAM,EAAC,CAAE,OAAQ,EAAG,OAAQ,EAAG,WAAY,EAAG,YAAa,CAAE,GACzE,CAAC,GAAyB,GAA2B,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAA0B,UAC1F,CAAC,GAAmC,GAAqC,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACrF,GAAkC,CAAA,EAAA,EAAA,MAAA,AAAM,EAAC,GAE/C,CAAA,EAAA,EAAA,SAAS,AAAT,EAAU,KACN,GAAuB,GAAY,EACvC,EAAG,CAAC,EAAM,EAAS,EAEnB,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACN,IAAM,EAAQ,aAAa,OAAO,CAAC,GACnC,GAAI,EACA,GAAI,CACA,CAFG,EAEa,KAAK,KAAK,CAAC,GAC/B,CAAE,MAAO,EAAG,CACR,QAAQ,KAAK,CAAC,sCAAuC,EACzD,CAGJ,IAAM,EAAkB,aAAa,OAAO,CAAC,GAC7C,GAAI,EAAiB,CACjB,IAAM,EAAS,OAAO,UAAU,CAAC,EAC7B,CAAC,OAAO,KAAK,CAAC,IACd,GAAkB,EADK,CACe,GAE9C,CAGA,GAAyB,IACzB,IAAY,EAChB,EAAG,EAAE,EAcL,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACN,GAAI,CAAC,GAAY,OAEjB,IAAM,EAAkB,AAAC,IACrB,IAAM,EAAS,GAAU,OAAO,CAAC,MAAM,CAAG,EAAE,OAAO,CAC7C,CAD+C,CACtC,GAAU,OAAO,CAAC,MAAM,CAAG,EAAE,OAAO,CAEnD,CAFqD,EAErC,AAHqE,CAIjF,MAAO,KAAK,GAAG,CAAC,IAAK,KAAK,GAAG,CAAC,AAHkD,OAG3C,UAAU,CAAG,GAAI,GAAU,OAAO,CAAC,UAAU,CAAG,IACrF,OAAQ,KAAK,GAAG,CAAC,IAAK,KAAK,GAAG,CAAC,OAAO,WAAW,CAAG,GAAI,GAAU,OAAO,CAAC,WAAW,CAAG,GAC5F,EACJ,EAEM,EAAgB,KAClB,IAAc,EAClB,EAIA,OAFA,OAAO,gBAAgB,CAAC,YAAa,GACrC,OAAO,gBAAgB,CAAC,UAAW,GAC5B,KACH,OAAO,mBAAmB,CAAC,YAAa,GACxC,OAAO,mBAAmB,CAAC,UAAW,EAC1C,CACJ,EAAG,CAAC,GAAW,EAEf,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACF,IAAY,CAAC,IACb,QADyB,KACZ,OAAO,CAAC,EAA2B,KAAK,SAAS,CAAC,IAEvE,EAAG,CAAC,GAAU,GAAY,GAAa,EAEvC,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACF,IAAY,CAAC,IACb,aAD8B,AACjB,OAAO,CAAC,EAAyB,OAAO,IAE7D,EAAG,CAAC,GAAgB,GAAU,GAAgB,EAE9C,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACD,IACL,MADe,OACF,OAAO,CAAC,AApqBa,6BAoqBsB,GAAwB,IAAM,IAC1F,EAAG,CAAC,GAAU,GAAsB,EAEpC,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACD,IACL,IAAmB,EACvB,EAAG,CAAC,GAAsB,EAY1B,IAAM,CAd0B,EAcO,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,KAC/C,GAAyB,AAAC,GAAa,CAAC,EAC5C,EAAG,EAAE,EAEC,GAAwB,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,KAClC,IACA,IAAyB,GAE7B,GAAqB,AAAD,GAAc,CAAC,EACvC,EAAG,CAAC,AAJ2B,GAIL,EAE1B,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACN,GAAI,CAAC,GAAiB,OAEtB,IAAM,EAAkB,AAAC,IACrB,IAAM,EAAY,GAAkB,OAAO,CAC3C,GAAI,CAAC,EAAW,OAEhB,IAAM,EAAO,EAAU,qBAAqB,GAC5C,GAAI,EAAK,KAAK,EAAI,EAAG,OAErB,IAAM,EAAQ,EAAE,OAAO,CAAG,GAAe,OAAO,CAAC,MAAM,CAEvD,GAAkB,GAAoB,CADhB,GAAe,OAAO,CAAC,UAAU,CAAG,EAAK,KAAK,CAAG,CAAA,EACjB,EAAK,KAAK,EACpE,EAEM,EAAgB,KAClB,IAAmB,EACvB,EAIA,OAFA,OAAO,gBAAgB,CAAC,YAAa,GACrC,OAAO,gBAAgB,CAAC,UAAW,GAC5B,KACH,OAAO,mBAAmB,CAAC,YAAa,GACxC,OAAO,mBAAmB,CAAC,UAAW,EAC1C,CACJ,EAAG,CAAC,GAAgB,EAGpB,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACN,GAAI,CAAC,IAAuB,GAAY,OAAO,CAAE,CAC7C,IAAM,EAAS,GAAY,OAAO,CAElC,WAAW,KACP,GAAI,CACA,IAAM,EAAM,EAAO,aAAa,CAChC,GAAI,GAAO,EAAI,IAAI,CAAE,CACjB,EAAI,IAAI,CAAC,cAAc,KACvB,EAAI,KAAK,GACT,IAAM,EAAW,EAAO,eAAe,EAAE,cAAc,kCACnD,GAAW,EAAyB,KAAK,EACjD,CACJ,CAAE,MAAO,EAAG,CACR,QAAQ,KAAK,CAAC,8CAA+C,EACjE,CACJ,EAAG,IACP,CACJ,EAAG,CAAC,GAAoB,EAGxB,GAAM,CAAC,GAAa,GAAe,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,UAEvD,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACN,IAAM,EAAe,IAAO,OAC5B,GAAI,EAEA,OADA,KADc,IACL,KAAK,CAAG,CAAA,EAAG,EAAa,OAAO,CAAC,CAClC,KACH,SAAS,KAAK,CAAG,MACrB,EAGJ,SAAS,KAAK,CAAG,MAErB,EAAG,CAAC,GAAM,EAEV,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KAON,CANmB,UACf,IAAM,EAAS,MAAM,CAAA,EAAA,EAAA,SAAA,AAAS,IAC1B,EAAO,WAAW,EAAI,EAAe,IAAI,CAAC,GAAO,EAAI,EAAE,GAAK,EAAO,WAAW,GAC9E,AADiF,GAClE,EAAO,WAAW,EAEzC,GAEJ,EAAG,EAAE,EAEL,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACN,GAAqB,GAAY,QAAU,IAC3C,GAAqB,EAAE,CAC3B,EAAG,CAAC,EAAY,EAAY,EAE5B,CAAA,EAAA,EAAA,SAAS,AAAT,EAAU,KACN,GAA2B,UAC3B,IAAqC,GACrC,GAAgC,OAAO,EAAI,CAC/C,EAAG,CAAC,EAAY,EAEhB,IAAM,GAAkB,MAAO,IAC3B,IAAM,EAAQ,EAAE,MAAM,CAAC,KAAK,CAC5B,GAAe,GACf,MAAM,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,CAAE,YAAa,CAAM,EAC5C,EAWM,GAA+B,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,MAC7C,EACA,KAEA,GAAgC,SAA5B,GAAoC,OAAO,EAE/C,IAAM,EAAY,EAAE,GAAgC,OAAO,AACvD,CAAC,GAAS,QAAQ,AAClB,IAAqC,GAGzC,IAAM,EAAe,AAAS,aACxB,CAAC,EAAa,EAAe,CAAG,MAAM,QAAQ,GAAG,CAAC,CACpD,EAAwB,EAAa,QAAS,GAC9C,EAAwB,EAAa,WAAY,GACpD,SAED,AAAI,IAAc,GAAgC,OAAO,EAAE,EAIvD,AAAC,GAAS,QACV,AADkB,IACmB,GAG1B,CAAC,EAAa,EAAe,CAAC,IAAI,CAAC,AAAC,GAAW,CAAC,EAAO,OAAO,IAErE,AAAC,GAAS,QAAQ,AAClB,GAAY,CAAC,oBAAoB,EAAW,WAAT,EAAoB,cAAgB,mBAAA,CAAoB,GAExF,IAGP,AAAC,GAAS,QAAQ,AAClB,GAAY,AAAS,aAAW,wBAA0B,+BAEvD,GACX,EAAG,CAAC,EAAa,GAAwB,EAEnC,GAA4B,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,AAAC,IAC3C,AAAgC,QAAQ,CAApC,IACA,GAAqB,OAAO,CAAC,EAAK,EAAE,AAEnC,CAAC,UACF,IAAM,EAAS,MAAM,EAA+B,EAAa,GAAM,GACnE,EAAO,OAAO,EAAI,EAAO,OAAO,CAChC,CADkC,EACb,OAAO,CAAC,EAAK,EAAG,EAC9B,AAAC,EAAO,OAAO,EAAE,AACxB,QAAQ,KAAK,CAAC,CAAC,mCAAmC,EAAE,EAAK,CAAC,CAAC,CAAE,EAAO,KAAK,EAEjF,CAAC,EACL,EAAG,CAAC,EAAa,GAAwB,EAEzC,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KAC0B,QAAQ,CAApC,IACC,GAA6B,SAAU,CAAE,QAAQ,CAAK,EAC/D,EAAG,CAAC,GAA8B,GAAwB,EAE1D,IAAM,GAAsC,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,KACpD,GAAI,AAA4B,aAAU,GAAmC,OAG7E,IAAM,EAAoC,AAAiB,cAAW,SAAW,SACjF,GAA2B,GAEtB,CAAC,UACc,AACZ,CAAC,KADiB,GAA6B,CACrC,GACV,GAPa,IASrB,CAAC,EACL,EAAG,CAAC,GAA8B,GAAmC,GAAyB,GAAwB,EAQhH,AAXiC,GAWpB,MAAO,GAAsB,CAAI,IAChD,GAAI,CAAC,GAAQ,CAAC,GAAY,CAAC,GACvB,GAAuB,CAAC,QAAQ,2FADD,CAC6F,MADtF,CAC6F,CAEvI,GAAgB,MAChB,GAAgB,QAChB,GAAY,sBAEZ,GAAI,CACA,IAAM,EAAS,MAAM,EAA0B,GAC/C,GAAI,CAAC,EAAO,OAAO,CAIf,CAJiB,MACjB,QAAQ,KAAK,CAAC,kBAAmB,EAAO,KAAK,EAAI,iBACjD,GAAgB,SAChB,GAAgB,EAAO,KAAK,EAAI,6BACzB,EAGX,CAAA,EAAA,EAAA,qBAAA,AAAqB,GACzB,CAAE,MAAO,EAAO,CAIZ,OAHA,QAAQ,KAAK,CAAC,0BAA2B,GACzC,GAAgB,SAChB,GAAgB,aAAiB,MAAQ,EAAM,OAAO,CAAG,kBAClD,CACX,CAKA,OADA,IAAO,IACA,CACX,EAEM,GAAgB,UAClB,MAAM,IAAW,EACrB,EAEM,GAAuB,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,AAAC,GAC/B,IAAI,QAAQ,AAAC,IAChB,IAAM,EAAS,GAAU,OAAO,CAChC,GAAI,CAAC,EAAQ,YACT,GAAQ,GAIZ,IAAM,EAAgB,CAAC,EAAW,CAAC,IAC/B,GAAI,EAAW,GAAI,YACf,GAAQ,GAIZ,GAAI,CACA,IAAM,EAAM,EAAO,aAAa,CAChC,GAAI,CAAC,GAAO,CAAC,EAAI,IAAI,CAAE,YACnB,WAAW,IAAM,EAAc,EAAW,GAAI,KAIlD,EAAI,IAAI,CAAC,KAAK,CAAC,GAEf,IAAM,EAAW,EAAO,eAAe,EAAE,cAAc,kCACnD,GACC,EAAyB,KADhB,AACqB,GAEnC,EAAI,KAAK,GACT,GAAQ,EACZ,CAAE,MAAO,EAAG,CACR,QAAQ,KAAK,CAAC,qCAAsC,GACpD,WAAW,IAAM,EAAc,EAAW,GAAI,IAClD,CACJ,EAEA,GACJ,GACD,EAAE,EAEC,GAAwB,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,MAAO,IAC7C,GAAqB,IAAjB,EAAM,MAAM,CAAQ,OAExB,IAAwB,GACxB,IAAM,EAAe,CAAA,EAAG,EAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAE1C,GADiB,AAEb,MAFmB,GAAqB,GAGlC,CAAC,SAAS,EAAE,EAAM,MAAM,CAAC,UAAU,EAAmB,IAAjB,EAAM,MAAM,CAAS,GAAK,IAAI,iBAAiB,CAAC,CACrF,gDAEV,IAAwB,EAC5B,EAAG,CAAC,GAAqB,EAEnB,GAAoC,CAAA,EAAA,EAAA,WAAW,AAAX,EAAY,MAAO,IACzD,IAAM,EAAkB,EAAe,GAAG,CAAC,IAA8B,MAAM,CAAC,SAChF,GAA+B,IAA3B,EAAgB,MAAM,CAAQ,OAAO,KAEzC,IAAM,EAAQ,MAAM,IAAI,CACpB,IAAI,IACA,CAAC,EAAM,EAAS,CACX,GAAG,CAAC,AAAC,GAAS,CAAC,GAAQ,EAAA,CAAE,CAAE,IAAI,IAC/B,MAAM,CAAC,WAGpB,GAAI,AAAiB,MAAX,MAAM,CAAQ,OAAO,KAE/B,IAAK,IAAM,KAAiB,EACxB,GAAI,CAD2B,AAE3B,IAAM,EAAW,MAAM,MAAM,gCAAiC,CAC1D,OAAQ,OACR,QAAS,CACL,eAAgB,kBACpB,EACA,KAAM,KAAK,SAAS,CAAC,CACjB,eAAgB,gBAChB,CACJ,EACJ,GAEM,EAAU,MAAM,EAAS,IAAI,GAAG,KAAK,CAAC,IAAM,MAClD,GAAI,CAAC,EAAS,EAAE,CAAE,CACd,QAAQ,IAAI,CAAC,gCAAiC,CAC1C,eAAgB,gBAChB,EACA,MAAO,GAAS,OAAS,EAAS,UAAU,AAChD,GACA,QACJ,CAEA,IAAM,EAA4C,UAA/B,OAAO,GAAS,WAA0B,EAAQ,UAAU,CAAC,IAAI,GAAK,GACnF,EAAgD,UAAjC,OAAO,GAAS,aAA4B,EAAQ,YAAY,CAAC,IAAI,GAAK,GAE/F,GAAI,GAAc,EAAc,MAAO,YAAE,eAAY,CAAa,CACtE,CAAE,MAAO,EAAO,CACZ,QAAQ,KAAK,CAAC,2CAA4C,EAC9D,CAGJ,OAAO,IACX,EAAG,CAAC,EAAM,EAAS,EAEb,GAAwB,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,UACtC,GAAK,CAAD,GACA,GAAyB,MADX,CACkB,EAAE,AAEtC,GAAyB,OAAO,EAAG,EACnC,IAAyB,GAEzB,GAAI,CACA,IAAM,EAAS,MAAM,EAAwB,GACzC,EAAO,OAAO,EAAE,AAChB,GAAqB,EAAO,QAAQ,EAAI,EAAE,EAC1C,GAAqB,EAAO,UAAU,EAAE,QAAU,IAClD,GAAsB,EAAO,kBAAkB,EAAE,QAAU,KACpD,EAAO,KAAK,EAAE,AACrB,GAAY,CAAC,yBAAyB,EAAE,EAAO,KAAK,CAAA,CAAE,CAE9D,CAAE,MAAO,EAAG,CACR,QAAQ,KAAK,CAAC,gCAAiC,EACnD,QAAU,CACN,GAAyB,OAAO,EAAG,EACnC,IAAyB,EAC7B,EACJ,EAAG,CAAC,EAAY,EAEhB,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACD,GACA,IACT,EAAG,CAAC,GAFkB,AAEK,EAAY,EAEvC,IAAM,GAAwB,CAAA,EAAA,EAAA,WAAW,AAAX,EAAY,UACtC,GAAK,CAAD,CAEJ,GAAI,CACA,IAAM,EAAS,CAHD,KAGO,EAAqB,GACtC,EAAO,OAAO,EAAI,AAAwB,iBAAjB,EAAO,KAAK,EAA0C,UAAzB,AAAmC,OAA5B,EAAO,MAAM,EAC1E,GAAc,CAAE,MAAO,EAAO,KAAK,CAAE,OAAQ,EAAO,MAAM,AAAC,EAEnE,CAAE,MAAO,EAAG,CACR,QAAQ,KAAK,CAAC,oCAAqC,EACvD,CACJ,EAAG,CAAC,EAAY,EAEhB,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACN,GAAI,CAAC,GAAe,CAAC,GAAmB,YACpC,GAAc,CAAE,MAAO,EAAG,OAAQ,CAAE,GAInC,KACL,IAAM,EAAQ,OAAO,WAAW,CAAC,KACxB,IACT,EAAG,KAEH,MAAO,IAAM,OAAO,aAAa,CAAC,EACtC,EAAG,CAAC,GAAmB,GAAuB,EAAY,EA6B1D,IAAM,GAAW,UACb,GAAI,CAAC,GACD,CAAC,GADa,OAAO,EAGzB,IAAa,GAFW,AAGxB,GAAY,IAHmB,yBAK/B,GAAI,CACA,IAAM,EAAS,MAAM,EAAmB,GACxC,GAAI,EAAO,OAAO,CAGd,CAHgB,MAChB,GAAY,CAAC,OAAO,EAAE,EAAO,UAAU,CAAC,MAAM,EAAE,EAAO,UAAU,CAAA,CAAE,EAC9D,MACE,EAGP,OADA,GAAY,CAAC,cAAc,EAAE,EAAO,KAAK,CAAA,CAAE,GACpC,CAEf,CAAE,MAAO,EAAG,CAGR,OAFA,QAAQ,KAAK,CAAC,wBAAyB,GACvC,GAAY,iBACL,CACX,QAAU,CACN,IAAa,EACjB,CACJ,EAEM,GAAc,UAChB,MAAM,IACV,EAEM,CAAC,GAAsB,GAAwB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAC3D,GAAoB,CAAA,EAAA,EAAA,MAAM,AAAN,EAAuB,MAEjD,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACN,IAAM,EAAqB,AAAC,IACpB,GAAkB,OAAO,EAAI,CAAC,GAAkB,OAAO,CAAC,QAAQ,CAAC,EAAM,MAAM,GAAW,AACxF,IAAwB,EAEhC,EAEA,OADA,SAAS,gBAAgB,CAAC,YAAa,GAChC,IAAM,SAAS,mBAAmB,CAAC,YAAa,EAC3D,EAAG,EAAE,EAEL,IAAM,GAAqB,MAAO,IAE9B,GADA,IAAwB,GACpB,CAAC,EAAa,OAElB,IAAM,EAAc,IAAiB,GAErC,IAAc,GACd,GAAY,EAAc,CAAC,iBAAiB,EAAE,EAAa,gBAAgB,CAAC,CAAG,8BAE/E,GAAI,CACA,GAAI,EAAa,CACb,IAAM,EAAe,MAAM,EAAwB,EAAa,GAChE,GAAI,CAAC,EAAa,OAAO,CAAE,CACvB,GAAY,CAAC,8BAA8B,EAAE,EAAa,KAAK,CAAA,CAAE,EACjE,IAAc,GACd,MACJ,CACA,GAAqB,EAAa,UAAU,EAC5C,MAAM,IACV,CAEA,IAAM,EAAS,MAAM,EAAsB,GACvC,EAAO,OAAO,EACd,AADgB,GACJ,CAAC,QAAQ,EAAE,EAAO,UAAU,CAAC,MAAM,EAAE,EAAO,UAAU,CAAA,CAAE,EAC/D,MAEL,GAAY,CAAC,eAAe,EAAE,EAAO,KAAK,CAAA,CAAE,CAEpD,CAAE,MAAO,EAAG,CACR,QAAQ,KAAK,CAAC,yBAA0B,GACxC,GAAY,gBAChB,QAAU,CACN,IAAc,EAClB,CACJ,EAMM,GAA0B,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,IAS7B,MAAM,IAAI,CAAC,IAAI,IAAI,AARP,CACf,GACA,MACG,GACN,CACI,GAAG,CAAE,AAAD,GAAW,EAAM,IAAI,IACzB,MAAM,CAAC,WAE2B,IAAI,CAAC,CAAC,EAAG,IAAM,EAAE,aAAa,CAAC,IACvE,CAAC,GAAmB,GAAmB,GAAmB,EAEvD,GAA8B,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,KACxC,KACJ,IAAgC,GAChC,GAAqB,IACrB,GAAqB,AAHK,IAI9B,EAAG,CAAC,GAAqB,EAEnB,GAA6B,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,KAC3C,IAAM,EAAoB,GAAmB,IAAI,IAC1C,GAAkB,IAAI,IACtB,EAAuB,CAAC,EAAE,EAC1B,GACP,GAAwB,IACxB,GAAqB,IACrB,GAAqB,GACrB,IAAgC,EACpC,EAAG,CAAC,GAAyB,GAAmB,GAAmB,EAE7D,GAAyB,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,UACvC,GAAI,CAAC,EAAa,OAElB,IAAM,EAAmB,GAAkB,IAAI,GACzC,EAAmB,GAAkB,IAAI,GAC/C,GAAI,AAAC,GAAqB,GAE1B,IAAwB,GACxB,GAAY,CAAC,GAHY,CAAmB,YAGf,EAAE,EAAiB,MAAM,EAAE,EAAiB,GAAG,CAAC,EAE7E,GAAI,CACA,IAAM,EAAS,MAAM,EAAwB,EAAa,EAAkB,GACxE,EAAO,OAAO,EAAI,EAAO,UAAU,EAAI,EAAO,UAAU,EAAE,AAC1D,GAAY,CAAC,eAAe,EAAE,EAAO,UAAU,CAAC,MAAM,EAAE,EAAO,UAAU,CAAA,CAAE,EAC3E,IAAgC,GAChC,GAAqB,IACrB,GAAqB,IACrB,MAAM,MAEN,GAAY,CAAC,yBAAyB,EAAE,EAAO,KAAK,CAAA,CAAE,CAE9D,CAAE,MAAO,EAAO,CACZ,QAAQ,KAAK,CAAC,gCAAiC,GAC/C,GAAY,0BAChB,QAAU,CACN,IAAwB,EAC5B,EACJ,EAAG,CAAC,GAAuB,GAAmB,GAAmB,EAAY,EAEvE,GAAsB,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,MAAO,EAAgB,KAC3D,IAAM,EAAa,EAAoB,GACvC,GAAI,CAAC,EAED,OADA,GADa,AACD,+BACL,EAGX,GAAmB,GACnB,IAAyB,GACzB,GAAY,CAAC,iBAAiB,EAAE,EAAA,CAAY,EAE5C,GAAI,CACA,IAAM,EAAW,MAAM,MAAM,2BAA4B,CACrD,OAAQ,OACR,QAAS,CACL,eAAgB,kBACpB,EACA,KAAM,KAAK,SAAS,CAAC,CACjB,OAAQ,CACZ,EACJ,GAEM,EAAU,MAAM,EAAS,IAAI,GAAG,KAAK,CAAC,IAAM,MAClD,GAAI,CAAC,EAAS,EAAE,EAAI,CAAC,GAAS,SAC1B,CADoC,KAC9B,AAAI,MAAM,GAAS,OAAS,iCAQtC,OALA,GAAc,EAAQ,QAAQ,EAC1B,GACA,IAAoB,GAExB,GAAY,AAHK,CAGJ,gBAAgB,EAAE,EAAA,CAAY,GACpC,CACX,CAAE,MAAO,EAAO,CACZ,IAAM,EAAU,aAAiB,MAAQ,EAAM,OAAO,CAAG,yBAGzD,OAFA,QAAQ,KAAK,CAAC,oCAAqC,GACnD,GAAY,CAAC,wBAAwB,EAAE,EAAA,CAAS,GACzC,CACX,CACJ,EAAG,EAAE,EAEC,GAA4B,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,KAC1C,GAAI,CAAC,GAAY,YACb,GAAY,0CAIhB,IAAM,EAAgB,GAAiB,OAAO,EAAE,cAChD,GAAI,CAAC,EAAe,YAChB,GAAY,4BAIhB,IAAM,EAAY,CAAC,GACnB,EAAc,WAAW,CAAC,CACtB,KAAM,6BACN,OAAQ,CACZ,EAAG,KAEH,GAAyB,GACzB,GAAY,EAAY,kDAAoD,kBAChF,EAAG,CAAC,GAAuB,GAAW,EAEhC,GAA4B,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,AAAC,IAC3C,IAAM,EAAgB,GAAiB,OAAO,EAAE,qBAChD,AAAK,GAKL,CALI,CAKU,UALM,CAKK,CAAC,EAAS,MAC5B,IALH,GAAY,4BACL,GAKf,EAAG,EAAE,EAEC,GAAwB,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,AAAC,IACvC,AAAK,GAKA,CALD,EAK2B,CAAE,KALhB,AAKsB,iCAA2B,CAAO,IAAI,AAI9D,UAAU,CAArB,GACA,GAAY,wBATZ,GAAY,kDAWpB,EAAG,CAAC,GAA2B,GAAW,EAEpC,GAAsB,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,KACpC,AAAK,IAAD,AAKJ,GAAc,IACd,CANiB,GAMQ,GACzB,GAAY,qBANR,GAAY,8BAOpB,EAAG,CAAC,GAAW,EAET,GAA0B,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,KACxC,GAA0B,CAAE,KAAM,+BAAgC,EACtE,EAAG,CAAC,GAA0B,EAExB,CAAE,4BAAyB,CAAE,CuBj0ChC,AvBi0CmC,SuBj0C1B,AAAgB,CAAE,eAAa,CAAwB,EACnE,IAAM,EAAyB,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,CAAC,EAAgB,KACxD,IAAM,EAAa,EAAoB,SACvC,CAAI,CAAC,IAED,AAAiB,QAFJ,GAEe,GAC5B,CAHoB,MAGb,IAAI,CAAC,EAAY,SAAU,uBAIjC,EAAc,GAAY,IACxB,EACX,EAAG,CAAC,EAAc,EAEZ,EAA4B,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,CAC1C,EACA,EACA,KAEA,EAAW,OAAO,KAClB,IAAM,EAAc,EAAO,aAAa,CAClC,EAAW,GAAa,KAC9B,GAAI,CAAC,GAAe,CAAC,EAAU,OAC/B,IAAM,EAAsB,GAAS,gBAC/B,EAAqB,GAAS,oBAAsB,UACpD,EAAuB,GAAS,sBAAwB,UACxD,EAAsB,AAAC,GACzB,EAAmB,EAAuB,EAGxC,EAA+B,EAAE,CAEjC,EAAgB,EAAO,eAAe,CACxC,EAAoB,CACpB,SAAS,EACT,SAAS,EACT,GAAI,CACR,EAEA,GAAI,EAAe,CACf,IAAM,EAAsB,AAAC,IACzB,EAAoB,CAChB,QAAS,EAAM,OAAO,CACtB,QAAS,EAAM,OAAO,CACtB,GAAI,KAAK,GAAG,EAChB,CACJ,EAEA,EAAc,gBAAgB,CAAC,YAAa,GAAqB,GACjE,EAAc,gBAAgB,CAAC,QAAS,EAAqB,IAC7D,EAAU,IAAI,CAAC,KACX,EAAc,mBAAmB,CAAC,YAAa,GAAqB,GACpE,EAAc,mBAAmB,CAAC,QAAS,GAAqB,EACpE,EACJ,CAEA,IAAM,EAAe,EAAY,IAAI,CAAC,IAAI,CAAC,GAgD3C,EAAY,IAAI,CA/CoB,CAAC,CA+ClB,EA/CqB,KAGpC,IAAM,EAAe,EAFI,AACS,KADJ,GAAG,GAAK,EAAkB,EAAE,CAAG,EAEpB,EADa,EAAC,EAAkB,OAAO,EAAI,EAAkB,OAAA,AAAO,GAG7G,GAAuB,UAAnB,OAAO,CAAI,CAAC,EAAE,EAAiB,CAAI,CAAC,EAAE,CAAC,IAAI,IAAI,KAG/C,CAFA,GAEI,GADY,EAAuB,CAAI,CAAC,EAAE,AACjC,CADmC,IAErC,KAEJ,KAAgB,GAG3B,GAAoB,IAAhB,EAAK,MAAM,CAAQ,CACnB,IAAI,EAAgC,KA0BpC,MAzBwB,CACpB,AAwBG,OAxBK,KACR,SAAU,CACN,IAAI,KAAK,IAAa,CAIlB,GAHA,MAGI,CAFY,AAEX,EAFkC,IAAK,GAE9B,EACV,EAAiB,GAAA,EACG,CAChB,GAAI,CACA,EAAe,MAAM,CAAG,IAC5B,CAAE,KAAM,CAER,CACA,EAAe,QAAQ,CAAC,IAAI,CAAG,GACnC,CAER,EACA,IAAI,MAAO,CACP,MAAO,EACX,CACJ,CACJ,CAGJ,CAEA,OAAO,KAAgB,EAC3B,EAGA,EAAU,IAAI,CAAC,KACX,EAAY,IAAI,CAAG,CACvB,GAEA,IAAM,EAAY,EAAS,KAAK,EAAE,sBAAsB,cAExD,GAAI,aAAqB,KAAK,AAC1B,IAAK,IAAM,KAAY,EAAU,MAAM,GAAI,AACvC,GAAI,AAAC,GAAgC,UAAU,AAA9B,OAAO,GAExB,GAAiC,YAA7B,OAAO,EAAS,QAAQ,CAAiB,CACzC,IAAM,EAAkB,EAAS,QAAQ,AACzC,GAAS,QAAQ,CAAG,CAAC,EAA+B,KAChD,MAGI,AADY,CACX,CADkC,EAAK,GADV,EAAQ,CAE5B,EAFmC,SAAW,GAAO,AACH,OADG,KAG/D,EAAgB,EAAO,EAE/B,EAEA,EAAU,IAAI,CAAC,KACX,EAAS,QAAQ,CAAG,CACxB,EACJ,CAEA,GAAqC,YAAjC,OAAO,EAAS,YAAY,CAAiB,CAC7C,IAAM,EAAuB,EAAS,YAAY,CAAC,IAAI,CAAC,GACxD,EAAS,YAAY,CAAG,CAAC,EAAc,KACnC,EAAqB,EAAM,AAAC,IACxB,GAAI,MAAM,OAAO,CAAC,GACd,IAAK,CADiB,GACX,KAAQ,EAAO,CACtB,GAAI,CAAC,GAAwB,UAAhB,OAAO,GACS,YAAY,AAArC,OAAO,EAAK,QAAQ,CADe,SAGvC,IAAM,EAAmB,EAAK,QAAQ,CAAC,IAAI,CAAC,GAC5C,EAAK,QAAQ,CAAG,CAAC,EAA+B,KAC5C,MAEgB,AACZ,CAAC,CADkC,EAAM,GADX,EAAQ,CAE5B,EAFmC,SAAW,GAAO,AACF,OADE,KAG/D,EAAiB,EAAO,EAEhC,CACJ,CAEJ,EAAS,EACb,EACJ,EAEA,EAAU,IAAI,CAAC,KACX,EAAS,YAAY,CAAG,CAC5B,EACJ,EACJ,CAGJ,IAAM,EAAsB,EAAS,OAAO,CAAC,WAAW,CAClD,EAAuC,CACzC,sBAAuB,GAAqB,wBAAyB,EACrE,SAAU,CAAC,EAAO,EAAK,KACnB,MAEgB,AACZ,CAAC,CADkC,EAAK,GADV,EAAQ,CAE5B,EAFmC,SAAW,GAAO,AACH,OADG,KAG/D,GAAqB,WAAW,EAAO,EAAK,EAEpD,EACA,MAAO,CAAC,EAAO,EAAK,KAChB,GAAqB,QAAQ,EAAO,EAAK,EAC7C,EACA,MAAO,CAAC,EAAO,EAAK,KAChB,GAAqB,QAAQ,EAAO,EAAK,EAC7C,CACJ,EAEA,EAAS,OAAO,CAAC,WAAW,CAAG,EAC/B,EAAU,IAAI,CAAC,KACX,EAAS,OAAO,CAAC,WAAW,CAAG,GAAuB,IAC1D,GAEA,EAAW,OAAO,CAAG,KACjB,IAAK,IAAM,KAAW,EAClB,IAEJ,EAAW,EAHsB,KAGf,CAAG,IACzB,CACJ,EAAG,CAAC,EAAuB,EAE3B,MAAO,CAAE,mDAAwB,CAA0B,CAC/D,EvB8nC0D,CAClD,cAAe,EACnB,GAEA,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACN,GAAI,CAAC,IACD,GAAgB,IAAI,GADD,CACK,MAE5B,IAAM,EAAQ,OAAO,UAAU,CAAC,KAC5B,GAAuB,OAAO,EAAE,OACpC,EAAG,GAEH,MAAO,KACH,OAAO,YAAY,CAAC,EACxB,CACJ,EAAG,CAAC,GAAkB,GAAgB,EAEtC,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACN,IAAM,EAAuB,AAAC,IAC1B,GAAI,CAAC,GAAiB,OAAO,EAAI,EAAM,MAAM,GAAK,GAAiB,OAAO,CAAC,aAAa,CAAE,OAE1F,IAAM,EAAU,EAAM,IAAI,CAM1B,GAAK,AAAD,GAA+B,UAAnB,AAA6B,OAAtB,GAEvB,GAAqB,8BAAjB,EAAQ,IAAI,CAAkC,YAC9C,IAAyB,CAAQ,EAAQ,MAAM,EAInD,GAAqB,8BAAjB,EAAQ,IAAI,CAAkC,CAC9C,IAAM,EAAgB,GAAiB,OAAO,EAAE,cAC5C,GACA,EAAc,UADC,CACU,CAAC,CAAE,KAAM,+BAAgC,EAAG,KAEzE,MACJ,CAEA,GAAqB,2BAAjB,EAAQ,IAAI,CAA+B,CACvC,AAAuB,iBAAhB,EAAQ,GAAG,EAAiB,EAAQ,GAAG,CAAC,IAAI,GAAG,MAAM,CAAG,GAAG,AAClE,OAAO,IAAI,CAAC,EAAQ,GAAG,CAAE,SAAU,uBAEvC,MACJ,CAEA,GAAqB,iCAAjB,EAAQ,IAAI,CAAqC,CACtB,UAAvB,OAAO,EAAQ,GAAG,EAAiB,EAAQ,GAAG,CAAC,IAAI,GAAG,MAAM,CAAG,GAAG,AAClE,GAAmB,EAAQ,GAAG,EAElC,MACJ,CAEA,GAAqB,kCAAjB,EAAQ,IAAI,CAAsC,CAClD,IAAM,EAAkB,EAAS,OAAO,EAA+B,UAA3B,OAAO,EAAQ,OAAO,CAC5D,EAAQ,OAAO,CACf,KACA,EAAa,MAAM,OAAO,CAAC,GAAiB,qBAC5C,EAAgB,mBAAmB,CACnC,EAAE,CACF,EAAqB,CA/xCP,CAAC,EAAuB,KACxD,IAAK,IAAM,KAAS,EAAY,CAC5B,GAAI,CAAC,GAA0B,UAAjB,OAAO,EAAoB,SAGzC,IAAM,EAA+C,UAA/B,OAAO,EAAe,IAAI,CAAgB,EAAe,IAAI,CAAC,IAAI,GAAK,GAC7F,GAAI,CAAC,EAAe,SAEpB,IAAM,EAA4D,UAA3C,OAJA,AAIO,EAAe,MAAM,EAAE,SAC/C,EAAe,MAAM,CAAC,QAAQ,CAAC,IAAI,GACnC,GACA,EAAa,EAAiB,GAA2B,EAAgB,GAAiB,KAEhG,GAAI,EACA,MAAO,CAAA,EAAG,CADE,CACY,EAAE,EAAE,EAAW,CAAC,CAAC,AAEjD,CAEA,OAAO,IACX,GA4wCuE,EAAY,GAAY,GACzE,EAAsB,CAAU,CAAC,EAAE,EAA6B,UAAzB,OAAO,CAAU,CAAC,EAAE,CAC1D,CAAU,CAAC,EAAE,CAAwB,IAAI,MAC1C,EACA,EAA8C,UAA/B,OAAO,GAAoC,EAAoB,IAAI,GAAG,MAAM,CAAG,EAC9F,EAAoB,IAAI,GACxB,GACA,EAAoB,IAAI,IAAI,CAC9B,WAAY,gBAAiB,SAAU,YAAa,eACpD,4BAA6B,wBAAyB,oBACtD,wBAAyB,mBAAoB,kBAC7C,kBAAmB,YAAa,eAAgB,QAAS,OAAQ,QACjE,oBAAqB,OAAQ,aAAc,WAAY,WACvD,aAAc,eAAgB,SAAU,OAAQ,gCACnD,EAEK,EAAsB,MAAM,IAAI,CAClC,IAAI,IACA,EACK,GAAG,CAAC,AAAC,IACF,GAAI,CAAC,GAA0B,UAAjB,OAAO,EAAoB,MAAO,GAChD,IAAM,EAAQ,EAA6B,IAAI,CAC/C,MAAuB,UAAhB,OAAO,EAAoB,EAAK,IAAI,GAAK,EACpD,GACC,MAAM,CAAC,AAAC,KACD,CAAC,GACD,EAAkB,CADX,EACc,CAAC,IADR,AAEd,EAAK,CADwB,OAAO,EACrB,CAAC,YAAc,EAAK,UAAU,CAAC,YAAY,GAM9E,IANqF,IAM7E,GAAG,CAAC,kCAAmC,GAE/C,IAAM,EAAa,GACZ,GACC,CAAqC,YAAtC,KAAQ,GAAiB,SAAwB,EAAgB,QAAQ,CAAG,EAAA,CAAE,CAOrF,GALA,QAAQ,GAAG,CAAC,4BAA6B,GACzC,QAAQ,GAAG,CAAC,wCAAyC,GACrD,QAAQ,GAAG,CAAC,+BAAgC,GAC5C,IAAyB,GAErB,CAAC,EAAY,YACb,GAAY,iDAIX,CAAC,UACF,IAAI,EAAkB,GAAsB,GAE5C,GAAI,CAAC,GAAmB,EAAoB,MAAM,CAAG,EAAG,CACpD,IAAsB,GACtB,GAAI,CACA,IAAM,EAAS,MAAM,GAAkC,GACnD,GAAQ,cAAgB,GAAQ,YAAY,CAC5C,EAAkB,CAAA,EAAG,EAAO,YAAY,CAAC,EAAE,EAAE,EAAO,UAAU,CAAC,CAAC,CAAC,CAEzE,QAAU,CACN,IAAsB,EAC1B,CACJ,CAEA,GAAI,CAAC,EAAiB,CAClB,GAAI,EAAoB,MAAM,CAAG,EAAG,OAChC,GAAY,kFAGhB,EAAkB,CACtB,CAEA,QAAQ,GAAG,CAAC,uCAAwC,GAGpD,GADiB,AAEb,MAFmB,GAAqB,CAAA,EAAG,EAAgB,CAAC,CAAC,EAGvD,CAAC,kCAAkC,EAAE,EAAA,CAAiB,CACtD,kEAEd,CAAC,EACL,EACJ,EAGA,OADA,OAAO,gBAAgB,CAAC,UAAW,GAC5B,KACH,OAAO,mBAAmB,CAAC,UAAW,EAC1C,CACJ,EAAG,CAAC,GAAsB,EAAM,GAAmC,EAAS,EAE5E,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACN,IAAyB,EAC7B,EAAG,CAAC,GAAW,EAOf,IAAM,GAA4B,CAAA,EAAA,EAAA,WAAW,AAAX,EAAY,KAE1C,IAAM,EAAmB,EADD,GAAgB,IAAI,IAAM,GAGlD,CAAK,GAFwC,AAEzC,AAKJ,OAAO,IAAI,CAAC,EAAkB,CALP,QAKiB,uBACxC,GAAY,CAAC,2BAA2B,EAAE,EAAA,CAAkB,GALxD,GAAY,6BAMpB,EAAG,CAAC,GAAiB,GAAW,EAkU1B,GAAqB,AAAC,IACxB,IAAM,EAAS,GAAmB,GAAY,OAAO,EAAI,GAAqB,OAAO,CACrF,GAAI,CAAC,EAAQ,OACb,KACA,IAAsC,GAGtC,GAAI,CACU,EAAO,aAAa,AAClC,CAAE,MAAO,EAAG,CACR,QAAQ,KAAK,CAAC,oDACd,MACJ,CAEI,EAAO,aAAa,EAAE,CAEtB,EAAO,aAAa,CAAC,cAAc,CAAG,KAGtC,EAAO,aAAa,CAAC,gBAAgB,CAAC,eAAgB,AAAC,IACnD,EAAM,wBAAwB,EAClC,GAAG,IAGP,IAAM,EAAiB,CAAC,EAAW,CAAC,IAChC,KAAI,EAAW,EAAA,EAIf,CAJmB,EAIf,CACA,IAAM,EAAM,EAAO,aAAa,CAChC,GAAI,GAAO,EAAI,IAAI,CAAE,KA6EP,EA5EV,GAA0B,YAC1B,IAAM,EAAO,EAAI,IAAI,CACrB,GAA0B,EAAQ,GAA6B,CAC3D,gBAAiB,IAAM,IAAuB,GAC9C,mBAAoB,UACpB,qBAAsB,SAC1B,GAGA,CAAA,EAAA,EAAA,0BAAA,AAA0B,EAAC,GAE3B,GAA4B,EAAQ,GAGpC,GAAI,CAEA,IAAM,EAAgB,KAClB,IAAM,EAAe,EAAM,MAAM,EAAE,OAC7B,EAAuC,UAA/B,OAAO,GAAc,MAAqB,EAAa,KAAK,CAAG,EACxB,UAAnC,OAAO,GAAc,WAAyB,EAAa,SAAS,CAIlF,EAJqF,AAI/E,cAAc,IAK5B,EAEA,GAAI,AAA+B,YAAY,OAApC,AAfG,EAeG,aAAa,CAC1B,EAAM,aAAa,CAAC,OACjB,CAEH,IAAM,EAAS,EAAO,eAAe,EAAE,cAAc,kBAAoB,EAAO,eAAe,EAAE,KAC7F,GACiB,AACjB,IADqB,CADb,gBAC8B,GAC7B,OAAO,CAAC,EAAQ,CAAE,WAAW,EAAM,SAAS,EAAM,eAAe,CAAK,EAEvF,CACJ,CAAE,MAAO,EAAG,CACR,QAAQ,KAAK,CAAC,+BAAgC,EAClD,CAEA,IAAM,EAAsB,GAAwB,YAC9C,GAA4B,CAAQ,IAAyC,SAA5B,GACvD,GAAI,GAAuB,EAA2B,CAC9C,GAA6B,CAAC,GAC9B,GAAyB,YAEzB,GAHmD,AAInD,GAA4B,EAAQ,EAAK,GAE7C,EAAI,KAAK,CAHgB,EAIzB,IAAM,EAAW,EAAO,eAAe,EAAE,cAAc,kCACnD,GAAW,EAAyB,KAAK,GAC7C,MACJ,CAEA,GAAI,CAAC,GAAmB,IAAS,EAAW,GAAI,YAC5C,WAAW,IAAM,EAAe,EAAW,GAAI,KAInD,GAAI,CAAC,GAAuB,YAAa,CACrC,EAAI,KAAK,GACT,IAAM,EAAW,EAAO,eAAe,EAAE,cAAc,kCACnD,GAAW,EAAyB,KAAK,GAC7C,MACJ,CAEA,IAAM,EAAa,GAAY,EACzB,EAAM,CAAC,GAAG,EAAE,EAAc,GAAA,CAAa,CAC7C,EAAK,KAAK,CAAC,MAGU,EAAO,eAAe,EAAE,cAAc,mCAEnD,EAAS,aAAa,CAAC,IAAI,cAAc,WAAY,CACjD,SAAS,EACT,YAAY,EACZ,SAAU,GACV,QAAS,GACT,IAAK,QACL,KAAM,CACV,IAEA,EAAK,KAAK,CAAC,MAInB,GAAyB,YACzB,GAA4B,EAAQ,EAAK,GAGzC,EAAI,KAAK,GACT,IAAM,EAAW,EAAO,eAAe,EAAE,cAAc,iCACnD,IAAW,EAAyB,KAAK,EACjD,MACI,CADG,UACQ,IAAM,EAAe,EAAW,GAAI,IAEvD,CAAE,MAAO,EAAG,CACR,IAAsC,GACtC,GAAuB,YACvB,QAAQ,KAAK,CAAC,qCAAsC,EACxD,CACJ,EAEA,WAAW,IAAM,IAAkB,IACvC,EAEA,GAAI,CAAC,EAAM,MAAO,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,8DAAqD,4BAEtF,GAAqB,SAAS,CAA1B,GACA,MACI,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,2FACX,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,wGACX,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,+CACX,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,mDAA0C,mBACxD,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,8CAAsC,IAAgB,8DACnE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oCACX,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,UAAU,kBAAkB,QAAS,IAAM,cAAU,0BAQrF,IAAM,GAAyB,MAAM,IAAI,CAAC,IAAI,IAAI,IAC1C,GAAoB,CAAC,GAAkB,CAAG,EAAE,IAC7C,GACN,GAAG,MAAM,CAAE,AAAD,GAAkB,IAAiB,GAAU,IAAiB,IACnE,IAAqB,CAAQ,IAAiB,OAQpD,MACI,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAW,CAAC,6EAA6E,EAAG,IAAc,GAAmB,cAAgB,GAAA,CAAI,WACjJ,IACG,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACG,IAAK,GACL,IAAK,GACL,UAAU,0EACV,MAAM,kCACN,OAAQ,AAAC,GAAU,GAAmB,EAAM,aAAa,EACzD,cAAY,OACZ,SAAU,CAAC,IAGlB,CAAC,IAAc,EAAA,CAAe,EAC3B,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAW,CAAC,uBAAuB,EAAE,GAAa,oBAAsB,oBAAA,CAAqB,GAEtG,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,wLACX,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oCACX,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACG,UAAU,+HACV,QAAS,IAAM,KACf,MAAM,wBAEN,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAY,UAAU,cAE3B,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,0BACX,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oCACX,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,sBAAa,UAC7B,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAa,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,QAE5C,GACG,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,uFACX,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAK,aACN,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,yBAAyB,MAAO,WAAc,aAM9E,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oCACX,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,uIACX,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACG,UAAU,wJACV,QA9pCC,CA8pCQ,IA7pC7B,GAAI,CAAC,GAAQ,CAAC,EAAa,OAC3B,IAAM,EAAU,CAAC,UAAU,EAAE,mBAAmB,GAAM,oBAAoB,EAAE,mBAAmB,GAAA,CAAc,CAC7G,OAAO,IAAI,CAAC,EAAS,SAAU,sBACnC,EA2pCwB,MAAM,uEAEN,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,IAAI,CAAA,CAAC,UAAU,YAChB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAW,YAAwB,qBAIjD,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,uHAAuH,IAAK,aACvI,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,qBACX,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACG,UAAU,kKACV,QA13BP,CA03BgB,IAz3BjC,GAAwB,CAAC,GAC7B,EAy3B4B,SAAU,IAAc,IAAa,GACrC,MAAM,0CAEL,GAAa,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,uCAA+C,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAS,UAAU,YACjG,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAW,YAAwB,WACzC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,WAAW,CAAA,CAAC,UAAU,iCAE1B,IACG,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,4OACX,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,+MACX,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAK,uBACL,CAAC,IAAyB,EAAA,CAAoB,EAAK,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,0CAExE,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,CAAG,UAAU,2FACT,GAAuB,MAAM,CAAG,EAC7B,GAAuB,GAAG,CAAC,AAAC,GACxB,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,UACG,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACG,QAAS,IAAM,GAAmB,GAClC,UAAW,CAAC,oIAAoI,EAAE,IAAiB,GAAoB,mBAAqB,GAAA,CAAI,CAChN,MAAO,YAEP,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,oBAAY,IAC3B,IAAiB,IAAqB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,gDAAuC,kBAP7F,IAYb,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,2DAAkD,4BAEpE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,6EACf,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,UACG,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,QAAS,GAA4B,UAAU,mEAA0D,2BAIrH,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,UACG,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,QAAS,IAAM,KAAK,KAAyB,UAAU,mEAA0D,gCAQ7I,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qDACf,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACG,UAAU,gJACV,QAAS,GACT,SAAU,IAAa,IAAc,IAAwB,CAAC,GAC9D,MAAO,GAAoB,CAAC,sBAAsB,EAAE,EAAO,sBAAsB,EAAE,GAAkB,CAAC,CAAC,CAAG,uDAEzG,GAAY,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,uCAA+C,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAoB,UAAU,YAC3G,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAW,YAAwB,aAE7C,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qDACf,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACG,UAAU,kJACV,QAAS,GACT,SAAU,IAAa,IAAc,CAAC,EACtC,MAAM,8BAEN,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,MAAM,CAAA,CAAC,UAAU,YAClB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAW,YAAwB,iBAIjD,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,uIACX,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACG,KAAK,SACL,UAAW,CAAC,mHAAmH,EAAE,GAAmB,oEAAsE,qCAAA,CAAsC,CAChQ,QAAS,GACT,eAAc,GACd,MAAO,GAAmB,kCAAoC,mCAE9D,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,SAAS,CAAA,CAAC,UAAU,YACrB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAW,YAAwB,cAIhD,IACG,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,6CAA6C,MAAO,CAAC,mBAAmB,EAAE,GAAA,CAAmB,WACxG,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,2CACZ,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAQ,UAAU,YAClB,GAAW,KAAK,IAErB,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,2CACZ,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAU,UAAU,YACpB,GAAW,MAAM,OAK9B,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAEf,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8EACX,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAW,CAAC,qBAAqB,EAAE,GAAS,QAAQ,CAAC,UAAY,GAAS,QAAQ,CAAC,UAAY,WAAa,GAAS,QAAQ,CAAC,YAAc,GAAS,QAAQ,CAAC,WAAa,GAAS,QAAQ,CAAC,YAAc,GAAS,QAAQ,CAAC,QAAU,aAAe,aAAA,CAAc,GAC1Q,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,WAAW,MAAO,YAAW,cAMxD,IACG,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAAO,UAAU,6BACd,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,+BACX,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,6BAAoB,sBAClC,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,mCAA0B,8EAIvC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,2BACX,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,yBACX,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,UAAU,iBACb,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,sBAAa,kBAEjC,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACG,KAAK,OACL,UAAU,8BACV,MAAO,GACP,SAAU,AAAC,GAAM,GAAqB,CAAA,EAAA,EAAA,kBAAA,AAAkB,EAAC,EAAE,MAAM,CAAC,KAAK,GACvE,YAAY,wBACZ,SAAU,GACV,SAAS,CAAA,CAAA,EACT,UAAW,AAAC,IACM,UAAV,EAAE,GAAG,EAAgB,GAAkB,IAAI,IAAM,GAAkB,IAAI,IAAM,CAAC,KAC9E,EAAE,cAAc,CADoF,EAE/F,KAEb,OAIR,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,yBACX,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,UAAU,iBACb,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,sBAAa,kBAEjC,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACG,UAAU,gCACV,MAAO,GACP,SAAU,AAAC,GAAM,GAAqB,EAAE,MAAM,CAAC,KAAK,EACpD,SAAU,IAA2D,IAAnC,GAAwB,MAAM,UAE/D,GAAwB,GAAG,CAAC,AAAC,GAC1B,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAA0B,MAAO,YAC7B,EACA,IAAiB,GAAqB,iBAAmB,KAFjD,YAS7B,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,yBACX,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,UAAU,MAAM,QAAS,GAA6B,SAAU,YAAsB,WAC9F,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACG,UAAU,kBACV,QAAS,IAAM,KAAK,KACpB,SAAU,CAAC,GAAkB,IAAI,IAAM,CAAC,GAAkB,IAAI,IAAM,aAEnE,IAAwB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,uCAA6C,yBAKlG,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,OAAO,SAAS,UAAU,0BAC5B,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,QAAS,YAA6B,eAK1D,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CACG,IAAK,GACL,UAAW,CAAC,kFAAkF,EAAE,GAAwB,QAAU,QAAA,CAAS,WAE3I,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CACG,UAAU,8MACV,MAAO,CAAE,MAAO,GAAwB,OAAS,CAAA,EAAoB,IAAjB,GAAqB,CAAC,CAAC,AAAC,YAE5E,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,4LACX,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,qEACZ,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qCAA0C,oBAG9D,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,6GACX,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,wIACX,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACG,UAAU,kJACV,MAAO,GACP,SAAU,YAET,EAAe,GAAG,CAAC,GAChB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAoB,MAAO,EAAI,EAAE,UAAG,EAAI,IAAI,EAAhC,EAAI,EAAE,KAG3B,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,+CACf,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACG,UAAU,kJACV,QAn8CV,CAm8CmB,IAl8CrC,GAAI,CAAC,EAAU,OACf,IAAM,EAAM,EAAe,IAAI,CAAC,GAAK,EAAE,EAAE,GAAK,IAC9C,GAAI,CAAC,EAAK,OAEV,IAAM,EAAM,CAAA,EAAG,EAAI,QAAQ,CAAC,QAAQ,EAAE,UAAU,GAAA,CAAW,CAC3D,OAAO,IAAI,CAAC,EAAK,SACrB,EA67CgC,MAAO,CAAC,QAAQ,EAAE,EAAe,IAAI,CAAC,GAAK,EAAE,EAAE,GAAK,KAAc,KAAA,CAAM,CACxE,aAAW,wBAEX,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,YAAY,CAAA,CAAC,UAAU,YACxB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,uCAA8B,sBAGtD,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,uIACX,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACG,UAAU,kJACV,QAAS,IAAM,GAAqB,IACpC,SAAU,GACV,MAAM,8DACN,aAAW,sBAEV,GAAuB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,uCAA+C,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAW,UAAU,YAC7G,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,uCAA8B,mBAGtD,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,uIACX,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACG,UAAW,CAAC,mJAAmJ,EAA8B,WAA5B,GAAuC,eAAiB,GAAA,CAAI,CAC7N,QAAS,GACT,SAAsC,SAA5B,IAAsC,GAChD,MAAmC,SAA5B,GAC4B,WAA5B,GACG,6CACA,6CACJ,yDACN,aAAwC,WAA5B,GAAuC,sBAAwB,iCAE1E,GACG,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,uCAEY,WAA5B,GACM,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAW,UAAU,gBACtB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAgB,UAAU,0BAMrD,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACG,IAAK,GACL,IAAK,GACL,UAAW,CAAC,0BAA0B,EAAE,IAAe,GAAmB,sBAAwB,GAAA,CAAI,CACtG,MAAM,kCACN,QAAS,KACL,GAAsB,OAAO,CAAG,IACpC,EACA,OAAQ,KACJ,GAAsB,OAAO,CAAG,CAAE,KAAM,QAAS,GAAI,KAAK,GAAG,EAAG,CACpE,EACA,OA1uBK,CA0uBG,IAzuBxB,GAAI,CAAC,GAAU,OAAO,CAAE,OACxB,IAAM,EAAS,GAAU,OAAO,CAGhC,GAAI,CAEU,EAAO,aAAa,AAClC,CAAE,MAAO,EAAG,CACR,GAAY,gEACZ,MACJ,CAEI,EAAO,aAAa,EAAE,CAEtB,EAAO,aAAa,CAAC,cAAc,CAAG,KAGtC,EAAO,aAAa,CAAC,gBAAgB,CAAC,eAAgB,AAAC,IACnD,EAAM,wBAAwB,EAClC,GAAG,IAGP,GAAY,6BAEZ,IAAM,EAAiB,CAAC,EAAW,CAAC,IAChC,GAAI,EAAW,GAAI,YACf,GAAY,4CAIhB,GAAI,CACA,IAAM,EAAM,EAAO,aAAa,CAChC,GAAI,GAAO,EAAI,IAAI,CAAE,CACjB,GAA0B,SAC1B,IAAM,EAAO,EAAI,IAAI,CAQrB,GAPA,GAA0B,EAAQ,GAA0B,CACxD,mBAAoB,UACpB,qBAAsB,SAC1B,GAII,CAD8B,AAC7B,EAA0B,gCAAgC,EAAI,AAA4C,mBAArC,EAAK,2BAA2B,CAAiB,CACvH,IAAM,EAAgC,EAAK,qBAAqB,CAChE,EAAK,2BAA2B,CAAC,AAAC,IAC9B,GAAmB,YAAf,EAAM,IAAI,EAAkB,EAAM,OAAO,GAAmB,CAAf,aAAC,EAAM,GAAG,EAAoB,AAAc,aAAR,GAAG,AAAK,CAAQ,CAAG,CACpG,IAAM,EAAc,EAAK,KAAK,EAAE,YAChC,GAAI,GAAuD,YAAxC,AAAoD,OAA7C,EAAY,gBAAgB,CAClD,EAAY,gBAAgB,CAAC,QAAQ,OAClC,CACH,IAAM,EAAW,EAAO,eAAe,EAAE,cAAc,kCACnD,EACA,EAAS,MADC,OACY,CAAC,IAAI,cAAc,UAAW,CAChD,SAAS,EACT,YAAY,EACZ,IAAK,IACL,QAAS,GACT,SAAS,EACT,KAAM,CACV,IAEA,EAAK,KAAK,CAAC,OAEnB,CACA,OAAO,CACX,CAEA,GAA6C,YAAzC,AAAqD,OAA9C,EACP,GAAI,CACA,OAA2D,IAApD,EAA8B,IAAI,CAAC,EAAM,EACpD,CAAE,MAAO,EAAO,CACZ,QAAQ,KAAK,CAAC,wCAAyC,EAC3D,CAEJ,OAAO,CACX,GACA,EAA0B,gCAAgC,EAAG,CACjE,CAGA,CAAA,EAAA,EAAA,0BAAA,AAA0B,EAAC,GAE3B,IAAM,EAAsB,GAAwB,SAC9C,GAA4B,CAAQ,IAAa,AAA4B,YACnF,GAAI,GAAuB,EAA2B,CAC9C,GAA6B,CAAC,GAC9B,GAAyB,SACzB,GAAY,GAFuC,gCAInD,GAAY,2BAEhB,EAAI,KAAK,GACT,IAAM,EAAW,EAAO,eAAe,EAAE,cAAc,kCACnD,GAAW,EAAyB,KAAK,GAC7C,MACJ,CAEA,GAAI,CAAC,GAAmB,IAAS,EAAW,GAAI,YAC5C,WAAW,IAAM,EAAe,EAAW,GAAI,KAInD,GAAI,CAAC,GAAuB,SAAU,CAClC,GAAY,2BACZ,EAAI,KAAK,GACT,IAAM,EAAW,EAAO,eAAe,EAAE,cAAc,kCACnD,GAAU,EAA0B,KAAK,GAC7C,MACJ,CAQA,IAAM,EAAa,GAAY,EACzB,EAAM,CAAC,CADwB,EACrB,EAAE,EAAc,GAAA,CAAa,CAE7C,EAAK,KAAK,CAAC,GAGX,IAAM,EAAa,KACf,CAPmE,GAO7D,EAAW,EAAO,eAAe,EAAE,cAAc,kCACnD,EACA,EAAS,MADC,OACY,CAAC,IAAI,cAAc,WAAY,CACjD,SAAS,EACT,YAAY,EACZ,SAAU,GACV,QAAS,GACT,IAAK,QACL,KAAM,CACV,IAEA,EAAK,KAAK,CAAC,KAEnB,EAMA,GAJA,IACA,GAAyB,SAGrB,EAAO,CACP,IAAM,EAAoB,UACtB,IAAI,EAAW,GACT,EAAyB,AAAC,GACrB,GAAG,4BAA4B,CAAC,8CAAE,GAAS,CAEhD,EAAuB,AAAC,GACnB,CAAC,sGAAsG,EAAE,EAAA,CAAS,CAG7H,GAAI,GAAU,CACV,IAAM,EAAY,EAAuB,CAAC,oBAAoB,EAAE,GAAuB,oEAAoE,CAAC,EAC5J,EAAW,EAAqB,EACpC,KAAO,CACH,IAAM,EAAwB,IAAgB,QAAU,GAElD,EAA4B,AAC9B,KAAmB,GAAgB,MAAM,CAAG,EACtC,GACA,CAAC,IAAmB,EAAA,AAAE,EACnB,GAAG,CAAC,AAAC,GAAS,CAAA,EAAG,GAAY,EAAK,aAAa,EAAE,EAAA,EAAM,CACpE,CACK,GAAG,CAAC,AAAC,GAAU,EAAM,IAAI,IACzB,MAAM,CAAC,SACN,EAA0B,MAAM,IAAI,CAAC,IAAI,IAAI,IAC7C,EAAyB,EAAE,AAC7B,IAAa,EAAa,IAAI,CAAC,AAXf,GAYhB,EAAwB,MAAM,CAAG,GAAG,AACpC,EAAa,IAAI,CAAC,CACd,kBACG,EAAwB,GAAG,CAAC,AAAC,GAAmB,CAAC,EAAE,EAAE,EAAA,CAAgB,EAC3E,CAAC,IAAI,CAAC,OAEX,IAAM,EAAkB,EAAa,IAAI,CAAC,QACtC,EAAc,GAGlB,GAAI,EAAiB,CACjB,IAAM,EAA6B,EAAE,CACjB,QAAQ,CAAxB,IACA,EAAiB,IAAI,CAxtDzD,AAwtD0D,oKAE1B,EAAiB,IAAI,CAxtDrD,AAwtDsD,6aACtB,EAAiB,IAAI,CAAC,AAvtDtD,oHAwtDgC,EAAiB,IAAI,CAttDrD,AAstDsD,2GACtB,EAAiB,IAAI,CArtDrD,AAqtDsD,8PACtB,EAAiB,IAAI,CAAC,AAptDtD,2JAqtDgC,IAAM,EAAqB,CAAA,EAAG,OAAO,QAAQ,CAAC,MAAM,CAAC,kBAAkB,CAAC,CACxE,EAAiB,IAAI,CACjB,CAAC,2BAA2B,EAAE,EAAmB,oDAAoD,CAAC,EAE1G,EAAiB,IAAI,CACjB,CAAC,6CAA6C,EAAE,EAAY,iGAAiG,CAAC,EAGlK,IAAM,sBAGF,EAAiB,GAAG,CAAC,AAAC,GAAS,CAAC,EAAE,EAAE,EAAA,CAAM,EAAE,IAAI,CAAC,mBAIjD,GAPgB,IAQnB,CAAC,IAAI,CAAC,CAEP,GAAI,CACA,IAAM,EAAS,MAAM,EAAuB,EAAa,GACrD,EAAO,OAAO,EAAI,EAAO,QAAQ,CACjC,CADmC,CACrB,CAAC,QAAQ,EAAE,EAAc,EAAO,QAAQ,EAAE,EAAE,CAAC,EAE3D,QAAQ,KAAK,CAAC,6DAA8D,EAAO,KAAK,EACxF,EAAc,CAAC,CAAC,EAAE,EAAc,GAAA,CAAc,CAEtD,CAAE,MAAO,EAAK,CACV,QAAQ,KAAK,CAAC,gCAAiC,GAC/C,EAAc,CAAC,CAAC,EAAE,EAAc,GAAA,CAAc,AAClD,CACJ,CAEA,IAAM,EAAW,EAAuB,CAAC,MAAM,EAAE,GAAuB,oEAAoE,EAAE,EAAA,CAAa,EAC3J,EAAW,EAAqB,EACpC,CAEI,IACA,EAAK,IADK,CACA,CAAC,GACX,IACA,GAAY,GAAW,6BAA+B,8BAElD,CAAC,IAAY,IACb,KAGZ,EAEA,KANyC,MAM9B,IAAM,IAAqB,IAC1C,EADgD,IAE5C,CADG,EACS,CAAC,gBAAgB,EAAE,EAAW,EAFgC,WAEjB,GAAA,CAAI,EACzD,CAAC,IAAY,IACb,KAKR,EAAI,KANiC,AAM5B,GACT,IAAM,EAAW,EAAO,eAAe,EAAE,cAAc,kCACnD,GAAW,EAAyB,KAAK,EAEjD,MAEI,CAFG,UAEQ,IAAM,EAAe,EAAW,GAAI,IAEvD,CAAE,MAAO,EAAG,CACR,GAAuB,SACvB,QAAQ,KAAK,CAAC,iCAAkC,GAChD,GAAY,6BAA+B,OAAO,GACtD,CACJ,EAGA,WAAW,IAAM,IAAkB,IACvC,OAueY,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CACG,UAAW,CAAC,yEAAyE,EAAE,GACjF,mDACA,gHAAA,CACA,CACN,YAlnDS,AAAC,CAknDG,GAjnDrB,KACJ,EAAE,cAAc,EADW,CAE3B,IAAmB,GACnB,GAAe,OAAO,CAAG,CACrB,OAAQ,EAAE,OAAO,CACjB,WAAY,EAChB,EACJ,EA2mDgB,KAAM,GAAwB,OAAY,YAC1C,mBAAkB,QAAwB,EAAY,WACtD,aAAY,QAAwB,EAAY,uBAChD,cAAa,GACb,MAAO,QAAwB,EAAY,wCAE1C,CAAC,IACE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,2HAIvB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CACG,UAAW,CAAC,iFAAiF,EAAE,GAAwB,wBAA0B,uBAAA,CAAwB,WAEzK,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACG,UAAU,8QACV,QAAS,GACT,KAAK,SACL,MAAO,GAAwB,qBAAuB,uBACtD,aAAY,GAAwB,qBAAuB,uBAC3D,eAAc,YAEb,GAAwB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAY,UAAU,YAAe,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,YAAY,CAAA,CAAC,UAAU,cAG1F,CAAC,IACE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,+KACV,GACG,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CACG,SAAU,GAAY,EACtB,WAAY,EACZ,eAAgB,IAAqB,IAGzC,CAAA,EAAA,EAAA,GAAA,EAAA,EAAA,QAAA,CAAA,UACI,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,yCACX,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CACG,UAAU,8GACV,SAn2BZ,AAAC,CAm2BqB,GAl2B9C,EAAM,cAAc,GACf,GAAoB,IAAiB,EAC9C,YAk2BoC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8BACX,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,wCAChB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,2CAChB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,6CAEpB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACG,UAAU,4HACV,KAAK,SACL,QAAS,IAAM,GAAsB,QACrC,SAAU,CAAC,GACX,MAAM,UACN,aAAW,mBAEX,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,SAAS,CAAA,CAAC,UAAU,kBAEzB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACG,UAAU,4HACV,KAAK,SACL,QAAS,IAAM,GAAsB,WACrC,SAAU,CAAC,GACX,MAAM,aACN,aAAW,sBAEX,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAW,UAAU,kBAE1B,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACG,UAAU,4HACV,KAAK,SACL,QAAS,IAAM,GAAsB,UACrC,SAAU,CAAC,GACX,MAAM,iBACN,aAAW,0BAEX,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAS,UAAU,kBAExB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACG,UAAU,4HACV,KAAK,SACL,QAAS,GACT,SAAU,CAAC,GACX,MAAM,iBACN,aAAW,0BAEX,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAC,CAAA,CAAC,UAAU,kBAEjB,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACG,IAAK,GACL,KAAK,OACL,UAAU,uLACV,MAAO,GACP,SAAU,AAAC,GAAU,GAAmB,EAAM,MAAM,CAAC,KAAK,EAC1D,YAAY,wBACZ,YAAY,IAEhB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACG,UAAW,CAAC,yCAAyC,EAAE,GAAwB,eAAiB,qCAAqC,8CAA8C,CAAC,CACpL,KAAK,SACL,QAAS,GACT,SAAU,CAAC,IAAc,GACzB,MAAO,GAAwB,iBAAmB,qCAEjD,GACG,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,+CAEhB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAc,UAAU,cAGjC,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACG,UAAU,4HACV,KAAK,SACL,QAAS,GACT,MAAM,0BACN,aAAW,mCAEX,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,YAAY,CAAA,CAAC,UAAU,qBAGhC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,wDACV,AAAC,GAWE,GACA,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACG,IAAK,GACL,IAAK,GACL,UAAW,CAAC,0BAA0B,EAAG,IAAc,GAAmB,sBAAwB,GAAA,CAAI,CACtG,MAAM,qBACN,OAAQ,GACR,QAAQ,6GAGZ,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,+GAAsG,gEApBrH,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,+HACX,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,UAAE,iEACH,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACG,KAAK,SACL,UAAU,+JACV,QAAS,IAAM,GAAoB,aACtC,sBAoBZ,CAAC,IACE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CACG,UAAU,wIACV,YAl0DpB,AAAC,CAk0DgC,GAj0DjD,EAAE,cAAc,GAChB,EAAE,eAAe,GACjB,IAAc,GACd,GAAU,OAAO,CAAG,CAChB,OAAQ,EAAE,OAAO,CACjB,OAAQ,EAAE,OAAO,CACjB,WAAY,GAAa,KAAK,CAC9B,YAAa,GAAa,MAAM,AACpC,CACJ,EAyzDwC,KAAK,YACL,mBAAiB,aACjB,aAAW,4BACX,MAAM,6CAEN,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAK,UAAU,iDAIxB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CACG,UAAW,CAAA,EAAG,GAAsB,MAAQ,gBAAgB,qDAAqD,CAAC,CAClH,MAAO,CAAE,OAAQ,GA77E1B,GA67EyE,GAAa,MAAM,AAAC,OAA7C,KAEvC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,gKACX,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,4DACZ,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,sCAA2C,cAG/D,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oCACX,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACG,UAAU,qIACV,QAr9BnB,CAq9B4B,IAp9BrD,IAAM,EAAS,IAAiB,OAChC,GAAI,CAAC,GAAU,CAAC,GAAY,OAAO,EAAI,GAAoC,OAG3E,IAAuB,GAEvB,IAAM,EAAS,GAAY,OAAO,CAClC,GAAuB,IACvB,GAAY,0BAEZ,IAAM,EAAiB,CAAC,EAAW,CAAC,IAChC,GAAI,EAAW,GAAI,CACf,GAAY,qDACZ,IAAuB,GACvB,MACJ,CAEA,GAAI,CACA,IAAM,EAAM,EAAO,aAAa,CAChC,GAAI,GAAO,EAAI,IAAI,CAAE,CACjB,EAAI,IAAI,CAAC,KAAK,CAAC,GAEf,IAAM,EAAW,EAAO,eAAe,EAAE,cAAc,kCACnD,EACA,EAAS,MADC,OACY,CAAC,IAAI,cAAc,WAAY,CACjD,SAAS,EACT,YAAY,EACZ,SAAU,GACV,QAAS,GACT,IAAK,QACL,KAAM,CACV,IAEA,EAAI,IAAI,CAAC,KAAK,CAAC,MAGnB,EAAI,KAAK,GACL,GAAU,EAA0B,KAAK,GAE7C,GAAY,iCACZ,IAAuB,EAC3B,MACI,CADG,UACQ,IAAM,EAAe,EAAW,GAAI,IAEvD,CAAE,MAAO,EAAG,CACR,QAAQ,KAAK,CAAC,6BAA8B,GAC5C,GAAY,8BACZ,IAAuB,EAC3B,CACJ,EAEA,GACJ,EAi6BgD,SAhfpB,CAgf8B,AAhf7B,IAAsB,IAAuB,GAif1B,MAhfxB,AAAD,CAgfgC,EA9ejD,GACI,+CACA,oCAHJ,gDAgf0C,KAAK,mBAEJ,GAAsB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,uCAA+C,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAK,UAAU,YACtG,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,sCAA6B,WAEjD,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACG,UAAU,wIACV,QAAS,IAAM,GAAwB,AAAD,GAAU,CAAC,GACjD,MAAO,GAAsB,kBAAoB,oBACjD,aAAY,GAAsB,kBAAoB,oBACtD,KAAK,kBAEL,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,WAAW,CAAA,CAAC,UAAW,CAAC,6BAA6B,EAAE,GAAsB,aAAe,GAAA,CAAI,WAI7G,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAW,CAAA,EAAG,GAAsB,sBAAwB,4GAAA,CAA6G,UAC1K,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACG,IAAK,GACL,IAAK,GACL,UAAW,CAAC,0BAA0B,EAAG,IAAc,GAAmB,sBAAwB,GAAA,CAAI,CACtG,MAAM,kCACN,QAAS,KACL,GAAsB,OAAO,CAAG,IACpC,EACA,OAAQ,KACJ,GAAsB,OAAO,CAAG,CAAE,KAAM,WAAY,GAAI,KAAK,GAAG,EAAG,CACvE,EACA,OAAQ,AAAC,GAAU,GAAmB,EAAM,aAAa,sBAY5F,IACG,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,OAAkB,CAAA,CACf,YAAa,GACb,aAAc,EACd,aAAc,GACd,UAAW,AAAC,IACR,IAAqB,GAChB,GAAsB,EAC/B,EACA,SAAU,IAAM,IAAqB,OAKzD,CC7jFoS,IAAM,GAAmC,CAAA,EAAA,EAAA,gBAAb,KAAa,AAAqB,EAAC,IAAxB,yCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,+BCAlJ,GAAmC,CAAA,EAAA,EAAA,gBAAb,KAAa,AAAqB,EAAC,IAAxB,yCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,sBCArI,GAAmC,CAAA,EAAA,EAAA,gBAAb,KAAa,AAAqB,EAAC,IAAxB,yCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,0BCA1I,GAAmC,CAAA,EAAA,EAAA,iBAAb,IAAkC,AAArB,EAAsB,KAAxB,wCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,6BCM7a,IAAA,GAAA,EAAA,CAAA,CAAA,OAUe,SAAS,KAEpB,IAAM,EAAiB,AADR,CAAA,EAAA,EAAA,SAAA,AAAS,IACM,SAAS,CACjC,EAAY,MAAM,OAAO,CAAC,GAAkB,CAAc,CAAC,EAAE,CAAG,EAChE,EAAS,CAAA,EAAA,EAAA,SAAA,AAAS,IAElB,CAAC,EAAU,EAAY,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAyB,MAC3D,CAAC,EAAS,EAAW,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACjC,CAAC,EAAO,EAAS,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAgB,MAC5C,CAAC,EAAiB,EAAmB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAG5C,MAGJ,CAAC,EAAgB,EAAkB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,OAAqB,GACnE,CAAC,EAAe,EAAiB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,OAAqB,GACjE,CAAC,EAAc,EAAgB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,OAAqB,GAC/D,CAAC,EAAsB,EAAwB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,OAAqB,GAC/E,CAAC,EAAoB,EAAsB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAA8B,QACpF,CAAC,EAAwB,EAA0B,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAW,EAAE,EAG3E,CAAC,EAAU,EAAY,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAU,GAC5C,CAAC,EAAyB,EAA2B,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAmB,SAEnF,EAAgC,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,KAC9C,GAAI,CAAC,EAAW,OAEhB,OAAO,KAAK,GACZ,IAAM,EAAa,CAAC,SAAS,EAAE,EAAA,CAAW,CACtC,OAAO,QAAQ,CAAC,QAAQ,GAAK,GAC7B,EAAO,IAAI,CAAC,EAEpB,AAHiD,EAG9C,CAAC,EAAQ,EAAU,EAEtB,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACN,SAAS,eAAe,CAAC,SAAS,CAAC,GAAG,CAAC,gBAChC,KACH,SAAS,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,eAC9C,GACD,EAAE,EAEL,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACN,GAAI,CAAC,EAAW,OAEhB,IAAI,GAAY,EACZ,EAA2B,KAC3B,EAAgC,KAChC,EAAmB,EACnB,EAA2C,KAEzC,EAAsB,KACD,MAAM,CAAzB,IACJ,OAAO,YAAY,CAAC,GACpB,EAAiB,KACrB,EAEM,EAAoB,KACtB,GAAI,EAAW,OACf,IAAM,EAAQ,KAAK,GAAG,CAAC,IAAO,IAAQ,GAAK,GAC3C,GAAoB,EACpB,EAAiB,OAAO,UAAU,CAAC,KAC/B,EAAiB,KACZ,GACT,EAAG,EACP,EAEM,EAA0B,MAAO,IACnC,GAAI,CAAC,CAAC,iBAAkB,MAAA,CAAM,CAAG,OAEjC,IAAI,EAAa,aAAa,UAAU,AACpC,AAAe,WAAW,KAC1B,GAAa,MAAM,aAAa,iBAAiB,EAAA,EAElC,WAAW,CAA1B,IAEA,GACA,EAAoB,KAAK,GAO7B,CAJA,EAAsB,IAAI,CAJD,YAIc,EAAQ,KAAK,CAAE,CAClD,KAAM,EAAQ,WAAW,CACzB,IAAK,CAAC,0BAA0B,EAAE,EAAQ,SAAS,CAAA,CAAE,AACzD,EAAA,EACoB,OAAO,CAAG,AAAC,IAC3B,EAAM,cAAc,GACpB,IACA,GAAqB,OACzB,EACJ,EAMM,EAAU,UACZ,GAAI,CACA,IAAM,EAAW,MAAM,MACnB,CAAC,oCAAoC,EAAE,mBAAmB,GAAA,CAAY,CACtE,CAAE,MAAO,UAAW,GAExB,GAAI,CAAC,EAAS,EAAE,CACZ,CADc,KACR,AAAI,MAAM,4CAGpB,IAAM,EAAO,MAAM,EAAS,IAAI,GAChC,GAAI,CAAC,EAAK,KAAK,CACX,CADa,KACP,AAAI,MAAM,mCAGpB,GAAI,EAAW,MAGf,EADA,EAAS,IAAI,UAAU,EAAK,MAAK,EAC1B,MAAM,CAAG,KACZ,EAAmB,EACnB,GACJ,EACA,EAAO,OAAO,CAAG,KACb,GAAQ,OACZ,EACA,EAAO,OAAO,CAAG,KACT,GACJ,GACJ,EACA,EAAO,CAHY,QAGH,CAAG,AAAC,IAChB,GAAI,CACA,IAAM,EAAU,KAAK,KAAK,CAAC,EAAM,IAAI,EACrC,GACqB,yBAAjB,EAAQ,IAAI,EACZ,EAAQ,SAAS,GAAK,GACtB,AAAyB,iBAAlB,EAAQ,KAAK,EACpB,CAAC,EAAQ,KAAK,CAAC,IAAI,IACY,UAA/B,OAAO,EAAQ,WAAW,EAC1B,CAAC,EAAQ,WAAW,CAAC,IAAI,IACI,UAA7B,AACF,OADS,EAAQ,SAAS,CAExB,OA5CX,EA+CkC,EAC/B,CAAE,KAAM,CAER,CACJ,CACJ,CAAE,KAAM,CACJ,GACJ,CACJ,AAvDiC,EA2DjC,OAFK,IAEE,KACH,EAAY,GACZ,IACA,GAAQ,QACR,GAAqB,OACzB,CACJ,EAAG,CAAC,EAA+B,EAAU,EAE7C,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACN,AAAK,GAEe,AA0EpB,CA5EI,OAAY,GAGZ,GAAI,CACA,EAAmB,MAGnB,IAAM,EAAa,MAAM,CAAA,EAAA,GAAA,gBAAA,AAAgB,IACzC,GAAI,CAAC,EAAW,OAAO,CAAE,CACrB,EAAS,oCACT,GAAW,GACX,MACJ,CACA,EAA0D,AAA/B,WAAW,eAAe,CAAc,OAAS,SAE5E,IAAM,EAAO,MAAM,GAAmB,GACtC,GAAI,CAAC,EAAM,CACP,EAAS,qBACT,GAAW,GACX,MACJ,CAEA,EAAY,GACZ,IAAM,EAA0B,MAAM,GAClC,EAAK,WAAW,CAChB,EAAK,QAAQ,CACb,EAAK,KAAK,EAUd,GARA,CAQI,CARe,IAMsB,IAArB,EAAK,WAAW,CAEnB,CAEb,IAAM,EAAgB,MAAM,GAA4B,GACxD,GAAI,EAAc,OAAO,EAAI,EAAc,OAAO,CAAE,CAChD,IAAM,EAAM,EAAc,OAAO,CACjC,EAAkB,EAAI,cAAc,EACpC,EAAiB,EAAI,aAAa,EAClC,EAAgB,EAAI,KAAK,EACzB,EAAwB,EAAI,aAAa,EACzC,EAAsB,EAAI,WAAW,EACrC,IAAM,EAAwB,CAAC,EAAI,eAAe,EAAI,EAAA,AAAE,EACnD,GAAG,CAAC,AAAC,GAAU,EAAM,IAAI,IACzB,MAAM,CAAC,SACN,EAA0B,EAAsB,MAAM,CAAG,EACzD,MAAM,IAAI,CAAC,IAAI,IAAI,IACnB,MAAM,IAAI,CACR,IAAI,IACA,CAAC,EAAI,eAAe,EAAI,EAAA,AAAE,EACrB,GAAG,CAAC,AAAC,GAAS,EAAK,IAAI,IACvB,MAAM,CAAC,SACP,GAAG,CAAC,AAAC,GAAS,CAAA,EAAG,EAAK,YAAY,CAAC,aAAa,EAAE,EAAA,CAAM,IAGzE,EAA0B,EAC9B,CAEA,GAAY,EAChB,MAEI,CAFG,EAES,GAGhB,GAAW,EACf,CAAE,MAAO,EAAG,CACR,QAAQ,KAAK,CAAC,0BAA2B,GACzC,EAAS,0BACT,GAAW,EACf,EACJ,GAGJ,EAAG,CAAC,EAAU,EAEd,IAAM,EAAa,AAAC,IACZ,EAGA,KAHO,EAGA,QAAQ,CAAC,IAAI,CAAG,IAEvB,EAAO,IAAI,CAAC,IAEpB,EAGM,EAAqB,UACnB,GACA,MAAM,EADK,CACkB,EAErC,SAEA,AAAI,EAEI,CAAA,EAAA,EAAA,EAFK,CAEL,EAAC,MAAA,CAAI,UAAU,2FACX,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,6CACX,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,oDAChB,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,0CAAiC,4BAM1D,GAAS,CAAC,EAEN,CAAA,EAAA,EAAA,GAFgB,AAEhB,EAAC,MAAA,CAAI,UAAU,2FACX,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,wGACX,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,+CACX,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,mDAA0C,UACxD,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,8CAAsC,GAAS,sBAC5D,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oCACX,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,UAAU,kBAAkB,QAAS,IAAM,aAAc,0BAQpF,EAYD,CAAA,EAAA,EAAA,GAAA,EAAC,GAAA,CACG,CAbc,IAaR,EAAS,QAAQ,CACvB,SAAU,EAAS,YAAY,CAC/B,OAAQ,EAAS,UAAU,CAC3B,WAAY,EAAS,UAAU,CAC/B,YAAa,EAAS,WAAW,CACjC,MAAO,GAAwB,EAAS,KAAK,CAC7C,cAAe,EACf,gBAAiB,EAAS,eAAe,CACzC,eAAgB,EAChB,gBAAiB,EACjB,MAAO,GAAgB,EAAS,KAAK,CACrC,YAAa,EACb,OAAQ,EACR,SAAU,EACV,wBAAyB,EACzB,eAAgB,EAChB,iBAAkB,EAAgB,gBAAgB,CAClD,oBAAqB,EAAgB,mBAAmB,GA5BxD,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,2FACX,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,6CACX,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,oDAChB,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,0CAAiC,kCA4BlE","ignoreList":[19,21,22,23,24,25,26,27,28,29,30,31,32,33]}