viba-cli 0.37.0 → 0.39.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 (531) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +18 -0
  3. package/.next/build-manifest.json +7 -6
  4. package/.next/fallback-build-manifest.json +2 -2
  5. package/.next/prerender-manifest.json +123 -3
  6. package/.next/routes-manifest.json +108 -0
  7. package/.next/server/app/_global-error/page/build-manifest.json +5 -4
  8. package/.next/server/app/_global-error/page.js +1 -1
  9. package/.next/server/app/_global-error/page.js.nft.json +1 -1
  10. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  11. package/.next/server/app/_global-error.html +2 -2
  12. package/.next/server/app/_global-error.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  14. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  15. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  16. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  17. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  18. package/.next/server/app/_not-found/page/build-manifest.json +5 -4
  19. package/.next/server/app/_not-found/page.js +2 -2
  20. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  21. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  22. package/.next/server/app/_not-found.html +2 -2
  23. package/.next/server/app/_not-found.rsc +18 -16
  24. package/.next/server/app/_not-found.segments/_full.segment.rsc +18 -16
  25. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  26. package/.next/server/app/_not-found.segments/_index.segment.rsc +6 -4
  27. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  28. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  29. package/.next/server/app/_not-found.segments/_tree.segment.rsc +3 -2
  30. package/.next/server/app/api/component-source/resolve/route.js +1 -1
  31. package/.next/server/app/api/component-source/resolve/route.js.nft.json +1 -1
  32. package/.next/server/app/api/credentials/github/repos/route/app-paths-manifest.json +3 -0
  33. package/.next/server/app/api/credentials/github/repos/route/build-manifest.json +11 -0
  34. package/.next/server/app/api/credentials/github/repos/route/server-reference-manifest.json +4 -0
  35. package/.next/server/app/api/credentials/github/repos/route.js +8 -0
  36. package/.next/server/app/api/credentials/github/repos/route.js.map +5 -0
  37. package/.next/server/app/api/credentials/github/repos/route.js.nft.json +1 -0
  38. package/.next/server/app/api/credentials/github/repos/route_client-reference-manifest.js +2 -0
  39. package/.next/server/app/api/credentials/route/app-paths-manifest.json +3 -0
  40. package/.next/server/app/api/credentials/route/build-manifest.json +11 -0
  41. package/.next/server/app/api/credentials/route/server-reference-manifest.json +4 -0
  42. package/.next/server/app/api/credentials/route.js +8 -0
  43. package/.next/server/app/api/credentials/route.js.map +5 -0
  44. package/.next/server/app/api/credentials/route.js.nft.json +1 -0
  45. package/.next/server/app/api/credentials/route_client-reference-manifest.js +2 -0
  46. package/.next/server/app/api/custom-scripts/route/app-paths-manifest.json +3 -0
  47. package/.next/server/app/api/custom-scripts/route/build-manifest.json +11 -0
  48. package/.next/server/app/api/custom-scripts/route/server-reference-manifest.json +4 -0
  49. package/.next/server/app/api/custom-scripts/route.js +10 -0
  50. package/.next/server/app/api/custom-scripts/route.js.map +5 -0
  51. package/.next/server/app/api/custom-scripts/route.js.nft.json +1 -0
  52. package/.next/server/app/api/custom-scripts/route_client-reference-manifest.js +2 -0
  53. package/.next/server/app/api/file-thumbnail/route.js +1 -1
  54. package/.next/server/app/api/file-thumbnail/route.js.nft.json +1 -1
  55. package/.next/server/app/api/fs/open/route/app-paths-manifest.json +3 -0
  56. package/.next/server/app/api/fs/open/route/build-manifest.json +11 -0
  57. package/.next/server/app/api/fs/open/route/server-reference-manifest.json +4 -0
  58. package/.next/server/app/api/fs/open/route.js +8 -0
  59. package/.next/server/app/api/fs/open/route.js.map +5 -0
  60. package/.next/server/app/api/fs/open/route.js.nft.json +1 -0
  61. package/.next/server/app/api/fs/open/route_client-reference-manifest.js +2 -0
  62. package/.next/server/app/api/fs/open-terminal/route/app-paths-manifest.json +3 -0
  63. package/.next/server/app/api/fs/open-terminal/route/build-manifest.json +11 -0
  64. package/.next/server/app/api/fs/open-terminal/route/server-reference-manifest.json +4 -0
  65. package/.next/server/app/api/fs/open-terminal/route.js +8 -0
  66. package/.next/server/app/api/fs/open-terminal/route.js.map +5 -0
  67. package/.next/server/app/api/fs/open-terminal/route.js.nft.json +1 -0
  68. package/.next/server/app/api/fs/open-terminal/route_client-reference-manifest.js +2 -0
  69. package/.next/server/app/api/git/action/route/app-paths-manifest.json +3 -0
  70. package/.next/server/app/api/git/action/route/build-manifest.json +11 -0
  71. package/.next/server/app/api/git/action/route/server-reference-manifest.json +4 -0
  72. package/.next/server/app/api/git/action/route.js +10 -0
  73. package/.next/server/app/api/git/action/route.js.map +5 -0
  74. package/.next/server/app/api/git/action/route.js.nft.json +1 -0
  75. package/.next/server/app/api/git/action/route_client-reference-manifest.js +2 -0
  76. package/.next/server/app/api/git/branches/route/app-paths-manifest.json +3 -0
  77. package/.next/server/app/api/git/branches/route/build-manifest.json +11 -0
  78. package/.next/server/app/api/git/branches/route/server-reference-manifest.json +4 -0
  79. package/.next/server/app/api/git/branches/route.js +10 -0
  80. package/.next/server/app/api/git/branches/route.js.map +5 -0
  81. package/.next/server/app/api/git/branches/route.js.nft.json +1 -0
  82. package/.next/server/app/api/git/branches/route_client-reference-manifest.js +2 -0
  83. package/.next/server/app/api/git/diff/route/app-paths-manifest.json +3 -0
  84. package/.next/server/app/api/git/diff/route/build-manifest.json +11 -0
  85. package/.next/server/app/api/git/diff/route/server-reference-manifest.json +4 -0
  86. package/.next/server/app/api/git/diff/route.js +9 -0
  87. package/.next/server/app/api/git/diff/route.js.map +5 -0
  88. package/.next/server/app/api/git/diff/route.js.nft.json +1 -0
  89. package/.next/server/app/api/git/diff/route_client-reference-manifest.js +2 -0
  90. package/.next/server/app/api/git/log/route/app-paths-manifest.json +3 -0
  91. package/.next/server/app/api/git/log/route/build-manifest.json +11 -0
  92. package/.next/server/app/api/git/log/route/server-reference-manifest.json +4 -0
  93. package/.next/server/app/api/git/log/route.js +10 -0
  94. package/.next/server/app/api/git/log/route.js.map +5 -0
  95. package/.next/server/app/api/git/log/route.js.nft.json +1 -0
  96. package/.next/server/app/api/git/log/route_client-reference-manifest.js +2 -0
  97. package/.next/server/app/api/git/status/route/app-paths-manifest.json +3 -0
  98. package/.next/server/app/api/git/status/route/build-manifest.json +11 -0
  99. package/.next/server/app/api/git/status/route/server-reference-manifest.json +4 -0
  100. package/.next/server/app/api/git/status/route.js +10 -0
  101. package/.next/server/app/api/git/status/route.js.map +5 -0
  102. package/.next/server/app/api/git/status/route.js.nft.json +1 -0
  103. package/.next/server/app/api/git/status/route_client-reference-manifest.js +2 -0
  104. package/.next/server/app/api/preview-proxy/start/route.js +2 -2
  105. package/.next/server/app/api/preview-proxy/start/route.js.nft.json +1 -1
  106. package/.next/server/app/api/repos/clone/route/app-paths-manifest.json +3 -0
  107. package/.next/server/app/api/repos/clone/route/build-manifest.json +11 -0
  108. package/.next/server/app/api/repos/clone/route/server-reference-manifest.json +4 -0
  109. package/.next/server/app/api/repos/clone/route.js +9 -0
  110. package/.next/server/app/api/repos/clone/route.js.map +5 -0
  111. package/.next/server/app/api/repos/clone/route.js.nft.json +1 -0
  112. package/.next/server/app/api/repos/clone/route_client-reference-manifest.js +2 -0
  113. package/.next/server/app/api/repos/route/app-paths-manifest.json +3 -0
  114. package/.next/server/app/api/repos/route/build-manifest.json +11 -0
  115. package/.next/server/app/api/repos/route/server-reference-manifest.json +4 -0
  116. package/.next/server/app/api/repos/route.js +9 -0
  117. package/.next/server/app/api/repos/route.js.map +5 -0
  118. package/.next/server/app/api/repos/route.js.nft.json +1 -0
  119. package/.next/server/app/api/repos/route_client-reference-manifest.js +2 -0
  120. package/.next/server/app/api/settings/route/app-paths-manifest.json +3 -0
  121. package/.next/server/app/api/settings/route/build-manifest.json +11 -0
  122. package/.next/server/app/api/settings/route/server-reference-manifest.json +4 -0
  123. package/.next/server/app/api/settings/route.js +8 -0
  124. package/.next/server/app/api/settings/route.js.map +5 -0
  125. package/.next/server/app/api/settings/route.js.nft.json +1 -0
  126. package/.next/server/app/api/settings/route_client-reference-manifest.js +2 -0
  127. package/.next/server/app/credentials/page/build-manifest.json +5 -4
  128. package/.next/server/app/credentials/page/server-reference-manifest.json +7 -7
  129. package/.next/server/app/credentials/page.js +4 -3
  130. package/.next/server/app/credentials/page.js.nft.json +1 -1
  131. package/.next/server/app/credentials/page_client-reference-manifest.js +1 -1
  132. package/.next/server/app/credentials.html +2 -2
  133. package/.next/server/app/credentials.rsc +22 -20
  134. package/.next/server/app/credentials.segments/_full.segment.rsc +22 -20
  135. package/.next/server/app/credentials.segments/_head.segment.rsc +1 -1
  136. package/.next/server/app/credentials.segments/_index.segment.rsc +6 -4
  137. package/.next/server/app/credentials.segments/_tree.segment.rsc +3 -2
  138. package/.next/server/app/credentials.segments/credentials/__PAGE__.segment.rsc +3 -3
  139. package/.next/server/app/credentials.segments/credentials.segment.rsc +1 -1
  140. package/.next/server/app/git/changes/page/app-paths-manifest.json +3 -0
  141. package/.next/server/app/git/changes/page/build-manifest.json +18 -0
  142. package/.next/server/app/git/changes/page/next-font-manifest.json +11 -0
  143. package/.next/server/app/git/changes/page/react-loadable-manifest.json +1 -0
  144. package/.next/server/app/git/changes/page/server-reference-manifest.json +4 -0
  145. package/.next/server/app/git/changes/page.js +18 -0
  146. package/.next/server/app/git/changes/page.js.map +5 -0
  147. package/.next/server/app/git/changes/page.js.nft.json +1 -0
  148. package/.next/server/app/git/changes/page_client-reference-manifest.js +2 -0
  149. package/.next/server/app/git/changes.html +54 -0
  150. package/.next/server/app/git/changes.meta +16 -0
  151. package/.next/server/app/git/changes.rsc +83 -0
  152. package/.next/server/app/git/changes.segments/_full.segment.rsc +83 -0
  153. package/.next/server/app/git/changes.segments/_head.segment.rsc +6 -0
  154. package/.next/server/app/git/changes.segments/_index.segment.rsc +61 -0
  155. package/.next/server/app/git/changes.segments/_tree.segment.rsc +7 -0
  156. package/.next/server/app/git/changes.segments/git/changes/__PAGE__.segment.rsc +10 -0
  157. package/.next/server/app/git/changes.segments/git/changes.segment.rsc +4 -0
  158. package/.next/server/app/git/changes.segments/git.segment.rsc +7 -0
  159. package/.next/server/app/git/custom-scripts/page/app-paths-manifest.json +3 -0
  160. package/.next/server/app/git/custom-scripts/page/build-manifest.json +18 -0
  161. package/.next/server/app/git/custom-scripts/page/next-font-manifest.json +11 -0
  162. package/.next/server/app/git/custom-scripts/page/react-loadable-manifest.json +1 -0
  163. package/.next/server/app/git/custom-scripts/page/server-reference-manifest.json +4 -0
  164. package/.next/server/app/git/custom-scripts/page.js +18 -0
  165. package/.next/server/app/git/custom-scripts/page.js.map +5 -0
  166. package/.next/server/app/git/custom-scripts/page.js.nft.json +1 -0
  167. package/.next/server/app/git/custom-scripts/page_client-reference-manifest.js +2 -0
  168. package/.next/server/app/git/custom-scripts.html +54 -0
  169. package/.next/server/app/git/custom-scripts.meta +16 -0
  170. package/.next/server/app/git/custom-scripts.rsc +82 -0
  171. package/.next/server/app/git/custom-scripts.segments/_full.segment.rsc +82 -0
  172. package/.next/server/app/git/custom-scripts.segments/_head.segment.rsc +6 -0
  173. package/.next/server/app/git/custom-scripts.segments/_index.segment.rsc +61 -0
  174. package/.next/server/app/git/custom-scripts.segments/_tree.segment.rsc +6 -0
  175. package/.next/server/app/git/custom-scripts.segments/git/custom-scripts/__PAGE__.segment.rsc +9 -0
  176. package/.next/server/app/git/custom-scripts.segments/git/custom-scripts.segment.rsc +4 -0
  177. package/.next/server/app/git/custom-scripts.segments/git.segment.rsc +7 -0
  178. package/.next/server/app/git/history/page/app-paths-manifest.json +3 -0
  179. package/.next/server/app/git/history/page/build-manifest.json +18 -0
  180. package/.next/server/app/git/history/page/next-font-manifest.json +11 -0
  181. package/.next/server/app/git/history/page/react-loadable-manifest.json +1 -0
  182. package/.next/server/app/git/history/page/server-reference-manifest.json +4 -0
  183. package/.next/server/app/git/history/page.js +18 -0
  184. package/.next/server/app/git/history/page.js.map +5 -0
  185. package/.next/server/app/git/history/page.js.nft.json +1 -0
  186. package/.next/server/app/git/history/page_client-reference-manifest.js +2 -0
  187. package/.next/server/app/git/history.html +54 -0
  188. package/.next/server/app/git/history.meta +16 -0
  189. package/.next/server/app/git/history.rsc +83 -0
  190. package/.next/server/app/git/history.segments/_full.segment.rsc +83 -0
  191. package/.next/server/app/git/history.segments/_head.segment.rsc +6 -0
  192. package/.next/server/app/git/history.segments/_index.segment.rsc +61 -0
  193. package/.next/server/app/git/history.segments/_tree.segment.rsc +7 -0
  194. package/.next/server/app/git/history.segments/git/history/__PAGE__.segment.rsc +10 -0
  195. package/.next/server/app/git/history.segments/git/history.segment.rsc +4 -0
  196. package/.next/server/app/git/history.segments/git.segment.rsc +7 -0
  197. package/.next/server/app/git/page/app-paths-manifest.json +3 -0
  198. package/.next/server/app/git/page/build-manifest.json +18 -0
  199. package/.next/server/app/git/page/next-font-manifest.json +11 -0
  200. package/.next/server/app/git/page/react-loadable-manifest.json +1 -0
  201. package/.next/server/app/git/page/server-reference-manifest.json +4 -0
  202. package/.next/server/app/git/page.js +18 -0
  203. package/.next/server/app/git/page.js.map +5 -0
  204. package/.next/server/app/git/page.js.nft.json +1 -0
  205. package/.next/server/app/git/page_client-reference-manifest.js +2 -0
  206. package/.next/server/app/git/stashes/page/app-paths-manifest.json +3 -0
  207. package/.next/server/app/git/stashes/page/build-manifest.json +18 -0
  208. package/.next/server/app/git/stashes/page/next-font-manifest.json +11 -0
  209. package/.next/server/app/git/stashes/page/react-loadable-manifest.json +1 -0
  210. package/.next/server/app/git/stashes/page/server-reference-manifest.json +4 -0
  211. package/.next/server/app/git/stashes/page.js +18 -0
  212. package/.next/server/app/git/stashes/page.js.map +5 -0
  213. package/.next/server/app/git/stashes/page.js.nft.json +1 -0
  214. package/.next/server/app/git/stashes/page_client-reference-manifest.js +2 -0
  215. package/.next/server/app/git/stashes.html +54 -0
  216. package/.next/server/app/git/stashes.meta +16 -0
  217. package/.next/server/app/git/stashes.rsc +83 -0
  218. package/.next/server/app/git/stashes.segments/_full.segment.rsc +83 -0
  219. package/.next/server/app/git/stashes.segments/_head.segment.rsc +6 -0
  220. package/.next/server/app/git/stashes.segments/_index.segment.rsc +61 -0
  221. package/.next/server/app/git/stashes.segments/_tree.segment.rsc +7 -0
  222. package/.next/server/app/git/stashes.segments/git/stashes/__PAGE__.segment.rsc +10 -0
  223. package/.next/server/app/git/stashes.segments/git/stashes.segment.rsc +4 -0
  224. package/.next/server/app/git/stashes.segments/git.segment.rsc +7 -0
  225. package/.next/server/app/git.html +54 -0
  226. package/.next/server/app/git.meta +15 -0
  227. package/.next/server/app/git.rsc +82 -0
  228. package/.next/server/app/git.segments/_full.segment.rsc +82 -0
  229. package/.next/server/app/git.segments/_head.segment.rsc +6 -0
  230. package/.next/server/app/git.segments/_index.segment.rsc +61 -0
  231. package/.next/server/app/git.segments/_tree.segment.rsc +7 -0
  232. package/.next/server/app/git.segments/git/__PAGE__.segment.rsc +10 -0
  233. package/.next/server/app/git.segments/git.segment.rsc +7 -0
  234. package/.next/server/app/index.html +2 -2
  235. package/.next/server/app/index.rsc +21 -19
  236. package/.next/server/app/index.segments/__PAGE__.segment.rsc +3 -3
  237. package/.next/server/app/index.segments/_full.segment.rsc +21 -19
  238. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  239. package/.next/server/app/index.segments/_index.segment.rsc +6 -4
  240. package/.next/server/app/index.segments/_tree.segment.rsc +3 -2
  241. package/.next/server/app/new/page/build-manifest.json +5 -4
  242. package/.next/server/app/new/page/server-reference-manifest.json +29 -29
  243. package/.next/server/app/new/page.js +5 -5
  244. package/.next/server/app/new/page.js.nft.json +1 -1
  245. package/.next/server/app/new/page_client-reference-manifest.js +1 -1
  246. package/.next/server/app/page/build-manifest.json +5 -4
  247. package/.next/server/app/page/server-reference-manifest.json +29 -29
  248. package/.next/server/app/page.js +5 -5
  249. package/.next/server/app/page.js.nft.json +1 -1
  250. package/.next/server/app/page_client-reference-manifest.js +1 -1
  251. package/.next/server/app/session/[sessionId]/page/build-manifest.json +5 -4
  252. package/.next/server/app/session/[sessionId]/page/server-reference-manifest.json +19 -19
  253. package/.next/server/app/session/[sessionId]/page.js +4 -4
  254. package/.next/server/app/session/[sessionId]/page.js.nft.json +1 -1
  255. package/.next/server/app/session/[sessionId]/page_client-reference-manifest.js +1 -1
  256. package/.next/server/app-paths-manifest.json +18 -0
  257. package/.next/server/chunks/[externals]__7ece43c5._.js +3 -0
  258. package/.next/server/chunks/[externals]_keytar_23140f5c._.js +3 -0
  259. package/.next/server/chunks/[root-of-the-server]__01a6baa7._.js +3 -0
  260. package/.next/server/chunks/[root-of-the-server]__01a6baa7._.js.map +1 -0
  261. package/.next/server/chunks/[root-of-the-server]__187f37c1._.js +3 -0
  262. package/.next/server/chunks/[root-of-the-server]__187f37c1._.js.map +1 -0
  263. package/.next/server/chunks/[root-of-the-server]__1bf60374._.js +3 -0
  264. package/.next/server/chunks/[root-of-the-server]__1bf60374._.js.map +1 -0
  265. package/.next/server/chunks/[root-of-the-server]__2dcb1454._.js +3 -0
  266. package/.next/server/chunks/[root-of-the-server]__2dcb1454._.js.map +1 -0
  267. package/.next/server/chunks/[root-of-the-server]__3ffc9919._.js +3 -0
  268. package/.next/server/chunks/[root-of-the-server]__3ffc9919._.js.map +1 -0
  269. package/.next/server/chunks/[root-of-the-server]__462092c0._.js +5 -0
  270. package/.next/server/chunks/[root-of-the-server]__462092c0._.js.map +1 -0
  271. package/.next/server/chunks/[root-of-the-server]__597e4f2f._.js +3 -0
  272. package/.next/server/chunks/[root-of-the-server]__597e4f2f._.js.map +1 -0
  273. package/.next/server/chunks/[root-of-the-server]__7324fe0b._.js +3 -0
  274. package/.next/server/chunks/[root-of-the-server]__7324fe0b._.js.map +1 -0
  275. package/.next/server/chunks/[root-of-the-server]__7f2f8f49._.js +3 -0
  276. package/.next/server/chunks/[root-of-the-server]__7f2f8f49._.js.map +1 -0
  277. package/.next/server/chunks/[root-of-the-server]__85af257a._.js +3 -0
  278. package/.next/server/chunks/[root-of-the-server]__85af257a._.js.map +1 -0
  279. package/.next/server/chunks/[root-of-the-server]__8de57231._.js +3 -0
  280. package/.next/server/chunks/[root-of-the-server]__8de57231._.js.map +1 -0
  281. package/.next/server/chunks/[root-of-the-server]__9af2c9bf._.js +3 -0
  282. package/.next/server/chunks/[root-of-the-server]__9af2c9bf._.js.map +1 -0
  283. package/.next/server/chunks/[root-of-the-server]__a0cc36ad._.js +3 -0
  284. package/.next/server/chunks/[root-of-the-server]__a0cc36ad._.js.map +1 -0
  285. package/.next/server/chunks/[root-of-the-server]__afea2116._.js +3 -0
  286. package/.next/server/chunks/[root-of-the-server]__afea2116._.js.map +1 -0
  287. package/.next/server/chunks/[root-of-the-server]__b17e6c62._.js +7 -0
  288. package/.next/server/chunks/[root-of-the-server]__b17e6c62._.js.map +1 -0
  289. package/.next/server/chunks/[root-of-the-server]__c2ff0bd8._.js +3 -0
  290. package/.next/server/chunks/[root-of-the-server]__c2ff0bd8._.js.map +1 -0
  291. package/.next/server/chunks/[root-of-the-server]__ceda8fbc._.js +3 -0
  292. package/.next/server/chunks/[root-of-the-server]__ceda8fbc._.js.map +1 -0
  293. package/.next/server/chunks/[root-of-the-server]__e1b60268._.js +519 -0
  294. package/.next/server/chunks/[root-of-the-server]__e1b60268._.js.map +1 -0
  295. package/.next/server/chunks/{[root-of-the-server]__ed7be8e0._.js → [root-of-the-server]__e993c1a5._.js} +2 -2
  296. package/.next/server/chunks/_next-internal_server_app_api_credentials_github_repos_route_actions_29e1f39a.js +3 -0
  297. package/.next/server/chunks/_next-internal_server_app_api_credentials_github_repos_route_actions_29e1f39a.js.map +1 -0
  298. package/.next/server/chunks/_next-internal_server_app_api_credentials_route_actions_ec24437f.js +3 -0
  299. package/.next/server/chunks/_next-internal_server_app_api_credentials_route_actions_ec24437f.js.map +1 -0
  300. package/.next/server/chunks/_next-internal_server_app_api_custom-scripts_route_actions_895ba0fd.js +3 -0
  301. package/.next/server/chunks/_next-internal_server_app_api_custom-scripts_route_actions_895ba0fd.js.map +1 -0
  302. package/.next/server/chunks/_next-internal_server_app_api_fs_open-terminal_route_actions_e2201c01.js +3 -0
  303. package/.next/server/chunks/_next-internal_server_app_api_fs_open-terminal_route_actions_e2201c01.js.map +1 -0
  304. package/.next/server/chunks/_next-internal_server_app_api_fs_open_route_actions_140e2d00.js +3 -0
  305. package/.next/server/chunks/_next-internal_server_app_api_fs_open_route_actions_140e2d00.js.map +1 -0
  306. package/.next/server/chunks/_next-internal_server_app_api_git_action_route_actions_696a03a1.js +3 -0
  307. package/.next/server/chunks/_next-internal_server_app_api_git_action_route_actions_696a03a1.js.map +1 -0
  308. package/.next/server/chunks/_next-internal_server_app_api_git_branches_route_actions_716a58c0.js +3 -0
  309. package/.next/server/chunks/_next-internal_server_app_api_git_branches_route_actions_716a58c0.js.map +1 -0
  310. package/.next/server/chunks/_next-internal_server_app_api_git_diff_route_actions_7bd2d341.js +3 -0
  311. package/.next/server/chunks/_next-internal_server_app_api_git_diff_route_actions_7bd2d341.js.map +1 -0
  312. package/.next/server/chunks/_next-internal_server_app_api_git_log_route_actions_1660bf04.js +3 -0
  313. package/.next/server/chunks/_next-internal_server_app_api_git_log_route_actions_1660bf04.js.map +1 -0
  314. package/.next/server/chunks/_next-internal_server_app_api_git_status_route_actions_71f3da53.js +3 -0
  315. package/.next/server/chunks/_next-internal_server_app_api_git_status_route_actions_71f3da53.js.map +1 -0
  316. package/.next/server/chunks/_next-internal_server_app_api_repos_clone_route_actions_ef268146.js +3 -0
  317. package/.next/server/chunks/_next-internal_server_app_api_repos_clone_route_actions_ef268146.js.map +1 -0
  318. package/.next/server/chunks/_next-internal_server_app_api_repos_route_actions_cd76e461.js +3 -0
  319. package/.next/server/chunks/_next-internal_server_app_api_repos_route_actions_cd76e461.js.map +1 -0
  320. package/.next/server/chunks/_next-internal_server_app_api_settings_route_actions_a476013b.js +3 -0
  321. package/.next/server/chunks/_next-internal_server_app_api_settings_route_actions_a476013b.js.map +1 -0
  322. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0002606b.js +3 -0
  323. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0002606b.js.map +1 -0
  324. package/.next/server/chunks/node_modules_zod_v4_classic_external_fa90cebf.js +39 -0
  325. package/.next/server/chunks/node_modules_zod_v4_classic_external_fa90cebf.js.map +1 -0
  326. package/.next/server/chunks/ssr/[root-of-the-server]__05b3451a._.js +3 -0
  327. package/.next/server/chunks/ssr/[root-of-the-server]__05b3451a._.js.map +1 -0
  328. package/.next/server/chunks/ssr/{[root-of-the-server]__59834c63._.js → [root-of-the-server]__05e6fb4c._.js} +3 -3
  329. package/.next/server/chunks/ssr/[root-of-the-server]__05e6fb4c._.js.map +1 -0
  330. package/.next/server/chunks/ssr/{[root-of-the-server]__4c388861._.js → [root-of-the-server]__2798aa4d._.js} +3 -3
  331. package/.next/server/chunks/ssr/{[root-of-the-server]__4c388861._.js.map → [root-of-the-server]__2798aa4d._.js.map} +1 -1
  332. package/.next/server/chunks/ssr/[root-of-the-server]__2c252246._.js +3 -0
  333. package/.next/server/chunks/ssr/[root-of-the-server]__2c252246._.js.map +1 -0
  334. package/.next/server/chunks/ssr/[root-of-the-server]__3cd44871._.js +3 -0
  335. package/.next/server/chunks/ssr/[root-of-the-server]__3cd44871._.js.map +1 -0
  336. package/.next/server/chunks/ssr/[root-of-the-server]__46af1502._.js +3 -0
  337. package/.next/server/chunks/ssr/[root-of-the-server]__46af1502._.js.map +1 -0
  338. package/.next/server/chunks/ssr/[root-of-the-server]__52b5581b._.js +3 -0
  339. package/.next/server/chunks/ssr/[root-of-the-server]__52b5581b._.js.map +1 -0
  340. package/.next/server/chunks/ssr/[root-of-the-server]__5be652da._.js +3 -0
  341. package/.next/server/chunks/ssr/{[root-of-the-server]__9f8d4cf6._.js.map → [root-of-the-server]__5be652da._.js.map} +1 -1
  342. package/.next/server/chunks/ssr/[root-of-the-server]__5e499636._.js +3 -0
  343. package/.next/server/chunks/ssr/[root-of-the-server]__5e499636._.js.map +1 -0
  344. package/.next/server/chunks/ssr/[root-of-the-server]__6afa74ac._.js +3 -0
  345. package/.next/server/chunks/ssr/[root-of-the-server]__6afa74ac._.js.map +1 -0
  346. package/.next/server/chunks/ssr/[root-of-the-server]__79a7a15d._.js +3 -0
  347. package/.next/server/chunks/ssr/[root-of-the-server]__79a7a15d._.js.map +1 -0
  348. package/.next/server/chunks/ssr/[root-of-the-server]__96a8b4aa._.js +3 -0
  349. package/.next/server/chunks/ssr/{[root-of-the-server]__012c2bdd._.js.map → [root-of-the-server]__96a8b4aa._.js.map} +1 -1
  350. package/.next/server/chunks/ssr/[root-of-the-server]__9a619a34._.js +56 -0
  351. package/.next/server/chunks/ssr/[root-of-the-server]__9a619a34._.js.map +1 -0
  352. package/.next/server/chunks/ssr/[root-of-the-server]__ab761bdf._.js +3 -0
  353. package/.next/server/chunks/ssr/[root-of-the-server]__ab761bdf._.js.map +1 -0
  354. package/.next/server/chunks/ssr/[root-of-the-server]__b77b4157._.js +3 -0
  355. package/.next/server/chunks/ssr/[root-of-the-server]__b77b4157._.js.map +1 -0
  356. package/.next/server/chunks/ssr/[root-of-the-server]__d45abc45._.js +3 -0
  357. package/.next/server/chunks/ssr/[root-of-the-server]__d45abc45._.js.map +1 -0
  358. package/.next/server/chunks/ssr/[root-of-the-server]__e86a1b81._.js +3 -0
  359. package/.next/server/chunks/ssr/{[root-of-the-server]__7cd07782._.js.map → [root-of-the-server]__e86a1b81._.js.map} +1 -1
  360. package/.next/server/chunks/ssr/[root-of-the-server]__e8b7f48a._.js +3 -0
  361. package/.next/server/chunks/ssr/[root-of-the-server]__e8b7f48a._.js.map +1 -0
  362. package/.next/server/chunks/ssr/_439918bb._.js +3 -0
  363. package/.next/server/chunks/ssr/_439918bb._.js.map +1 -0
  364. package/.next/server/chunks/ssr/{[root-of-the-server]__0522f852._.js → _476e86d1._.js} +3 -3
  365. package/.next/server/chunks/ssr/_476e86d1._.js.map +1 -0
  366. package/.next/server/chunks/ssr/_4a66db4a._.js +3 -0
  367. package/.next/server/chunks/ssr/_4a66db4a._.js.map +1 -0
  368. package/.next/server/chunks/ssr/_4d07d45e._.js +3 -0
  369. package/.next/server/chunks/ssr/_4d07d45e._.js.map +1 -0
  370. package/.next/server/chunks/ssr/_5147763c._.js +3 -0
  371. package/.next/server/chunks/ssr/_5147763c._.js.map +1 -0
  372. package/.next/server/chunks/ssr/_57f63a65._.js +3 -0
  373. package/.next/server/chunks/ssr/_57f63a65._.js.map +1 -0
  374. package/.next/server/chunks/ssr/_707e5fab._.js +3 -0
  375. package/.next/server/chunks/ssr/{[root-of-the-server]__9201693f._.js.map → _707e5fab._.js.map} +1 -1
  376. package/.next/server/chunks/ssr/_85a742de._.js +4 -0
  377. package/.next/server/chunks/ssr/_85a742de._.js.map +1 -0
  378. package/.next/server/chunks/ssr/_8d41d1fd._.js +3 -0
  379. package/.next/server/chunks/ssr/_8d41d1fd._.js.map +1 -0
  380. package/.next/server/chunks/ssr/_9493de08._.js +3 -0
  381. package/.next/server/chunks/ssr/{[root-of-the-server]__352d2b3c._.js.map → _9493de08._.js.map} +1 -1
  382. package/.next/server/chunks/ssr/_9769f5e5._.js +4 -0
  383. package/.next/server/chunks/ssr/_9769f5e5._.js.map +1 -0
  384. package/.next/server/chunks/ssr/_9a7bd3c8._.js +3 -0
  385. package/.next/server/chunks/ssr/_9a7bd3c8._.js.map +1 -0
  386. package/.next/server/chunks/ssr/_a7a8132a._.js +4 -0
  387. package/.next/server/chunks/ssr/_a7a8132a._.js.map +1 -0
  388. package/.next/server/chunks/ssr/_df00ee4d._.js +4 -0
  389. package/.next/server/chunks/ssr/_df00ee4d._.js.map +1 -0
  390. package/.next/server/chunks/ssr/_fc027e1f._.js +4 -0
  391. package/.next/server/chunks/ssr/_fc027e1f._.js.map +1 -0
  392. package/.next/server/chunks/ssr/_next-internal_server_app_git_changes_page_actions_6b75ad0c.js +3 -0
  393. package/.next/server/chunks/ssr/_next-internal_server_app_git_changes_page_actions_6b75ad0c.js.map +1 -0
  394. package/.next/server/chunks/ssr/_next-internal_server_app_git_custom-scripts_page_actions_c3e2453e.js +3 -0
  395. package/.next/server/chunks/ssr/_next-internal_server_app_git_custom-scripts_page_actions_c3e2453e.js.map +1 -0
  396. package/.next/server/chunks/ssr/_next-internal_server_app_git_history_page_actions_9e9b26bc.js +3 -0
  397. package/.next/server/chunks/ssr/_next-internal_server_app_git_history_page_actions_9e9b26bc.js.map +1 -0
  398. package/.next/server/chunks/ssr/_next-internal_server_app_git_page_actions_511f286b.js +3 -0
  399. package/.next/server/chunks/ssr/_next-internal_server_app_git_page_actions_511f286b.js.map +1 -0
  400. package/.next/server/chunks/ssr/_next-internal_server_app_git_stashes_page_actions_44843274.js +3 -0
  401. package/.next/server/chunks/ssr/_next-internal_server_app_git_stashes_page_actions_44843274.js.map +1 -0
  402. package/.next/server/chunks/ssr/node_modules_3e692bb2._.js +5 -0
  403. package/.next/server/chunks/ssr/node_modules_3e692bb2._.js.map +1 -0
  404. package/.next/server/chunks/ssr/node_modules_50fa454f._.js +5 -0
  405. package/.next/server/chunks/ssr/node_modules_50fa454f._.js.map +1 -0
  406. package/.next/server/chunks/ssr/node_modules_8e38eac2._.js +5 -0
  407. package/.next/server/chunks/ssr/node_modules_8e38eac2._.js.map +1 -0
  408. package/.next/server/chunks/ssr/node_modules_bf7b09f8._.js +5 -0
  409. package/.next/server/chunks/ssr/node_modules_bf7b09f8._.js.map +1 -0
  410. package/.next/server/chunks/ssr/{node_modules_5999d873._.js → node_modules_cf1f3d2c._.js} +2 -4
  411. package/.next/server/chunks/ssr/node_modules_cf1f3d2c._.js.map +1 -0
  412. package/.next/server/chunks/ssr/node_modules_next_dist_0ff44e32._.js +3 -0
  413. package/.next/server/chunks/ssr/node_modules_next_dist_0ff44e32._.js.map +1 -0
  414. package/.next/server/chunks/ssr/node_modules_next_dist_f6fd30d1._.js +3 -0
  415. package/.next/server/chunks/ssr/node_modules_next_dist_f6fd30d1._.js.map +1 -0
  416. package/.next/server/chunks/ssr/src_408d74ba._.js +3 -0
  417. package/.next/server/chunks/ssr/src_408d74ba._.js.map +1 -0
  418. package/.next/server/chunks/ssr/src_49325427._.js +3 -0
  419. package/.next/server/chunks/ssr/src_49325427._.js.map +1 -0
  420. package/.next/server/chunks/ssr/src_91238eaa._.js +3 -0
  421. package/.next/server/chunks/ssr/src_91238eaa._.js.map +1 -0
  422. package/.next/server/chunks/ssr/src_9994126b._.js +3 -0
  423. package/.next/server/chunks/ssr/src_9994126b._.js.map +1 -0
  424. package/.next/server/chunks/ssr/src_app_credentials_page_tsx_63d8d34a._.js +1 -1
  425. package/.next/server/chunks/ssr/src_app_credentials_page_tsx_63d8d34a._.js.map +1 -1
  426. package/.next/server/chunks/ssr/src_app_git_changes_page_tsx_f6dc28dc._.js +5 -0
  427. package/.next/server/chunks/ssr/src_app_git_changes_page_tsx_f6dc28dc._.js.map +1 -0
  428. package/.next/server/chunks/ssr/src_app_providers_tsx_2ae5be81._.js +3 -0
  429. package/.next/server/chunks/ssr/src_app_providers_tsx_2ae5be81._.js.map +1 -0
  430. package/.next/server/chunks/ssr/src_app_session_[sessionId]_SessionPageClient_tsx_dab490d7._.js +1 -1
  431. package/.next/server/chunks/ssr/src_app_session_[sessionId]_SessionPageClient_tsx_dab490d7._.js.map +1 -1
  432. package/.next/server/chunks/ssr/src_components_GitRepoSelector_tsx_05c81afa._.js +3 -3
  433. package/.next/server/chunks/ssr/src_components_GitRepoSelector_tsx_05c81afa._.js.map +1 -1
  434. package/.next/server/chunks/ssr/src_components_git_029e6e6f._.js +3 -0
  435. package/.next/server/chunks/ssr/src_components_git_029e6e6f._.js.map +1 -0
  436. package/.next/server/chunks/ssr/src_components_git_grouped-diff-viewer_tsx_41b8ab60._.js +20 -0
  437. package/.next/server/chunks/ssr/src_components_git_grouped-diff-viewer_tsx_41b8ab60._.js.map +1 -0
  438. package/.next/server/chunks/ssr/src_components_git_history-view_tsx_fd62126a._.js +10 -0
  439. package/.next/server/chunks/ssr/src_components_git_history-view_tsx_fd62126a._.js.map +1 -0
  440. package/.next/server/chunks/ssr/src_db5b513b._.js +3 -0
  441. package/.next/server/chunks/ssr/src_db5b513b._.js.map +1 -0
  442. package/.next/server/functions-config-manifest.json +3 -0
  443. package/.next/server/middleware-build-manifest.js +5 -4
  444. package/.next/server/next-font-manifest.js +1 -1
  445. package/.next/server/next-font-manifest.json +20 -0
  446. package/.next/server/pages/404.html +2 -2
  447. package/.next/server/pages/500.html +2 -2
  448. package/.next/server/server-reference-manifest.js +1 -1
  449. package/.next/server/server-reference-manifest.json +48 -48
  450. package/.next/static/chunks/068649e8eb29b8d9.js +2 -0
  451. package/.next/static/chunks/0ce2e7006253186a.js +9 -0
  452. package/.next/static/chunks/0f9834bd2f6f4c6e.js +3 -0
  453. package/.next/static/chunks/1958a10518af04a4.js +1 -0
  454. package/.next/static/chunks/3205a3bbc11c3146.css +1 -0
  455. package/.next/static/chunks/369aa92811a706db.js +3 -0
  456. package/.next/static/chunks/4aab1f3ea2ed1aef.js +1 -0
  457. package/.next/static/chunks/4cabe8a0df24e6d1.js +1 -0
  458. package/.next/static/chunks/5d6988fe9dd191e1.js +1 -0
  459. package/.next/static/chunks/5e0dada5236f9065.js +8 -0
  460. package/.next/static/chunks/73b3e447914a757b.js +1 -0
  461. package/.next/static/chunks/73c13373731456db.js +1 -0
  462. package/.next/static/chunks/76c064224d953678.js +4 -0
  463. package/.next/static/chunks/977137e155012c13.js +1 -0
  464. package/.next/static/chunks/b18cc1247b979318.js +1 -0
  465. package/.next/static/chunks/b4077ef0304a2ff4.js +18 -0
  466. package/.next/static/chunks/b926978a88c43bac.js +3 -0
  467. package/.next/static/chunks/c1a983df0a5e5f3a.css +1 -0
  468. package/.next/static/chunks/c7c82526da1ea165.js +1 -0
  469. package/.next/static/chunks/d09578ecf3b80b9d.js +3 -0
  470. package/.next/static/chunks/d85a06040ea88b62.js +1 -0
  471. package/.next/static/chunks/f7914ab5db08b8dd.js +3 -0
  472. package/.next/static/chunks/fa9e48c3aa7e4365.js +1 -0
  473. package/.next/static/chunks/turbopack-e9cbd31f7b697763.js +4 -0
  474. package/package.json +4 -1
  475. package/.next/server/chunks/[externals]__6f5f63a1._.js +0 -3
  476. package/.next/server/chunks/[externals]__ad3eabe7._.js +0 -3
  477. package/.next/server/chunks/[root-of-the-server]__1368fab8._.js +0 -519
  478. package/.next/server/chunks/[root-of-the-server]__1368fab8._.js.map +0 -1
  479. package/.next/server/chunks/ssr/[root-of-the-server]__012c2bdd._.js +0 -3
  480. package/.next/server/chunks/ssr/[root-of-the-server]__03608b11._.js +0 -3
  481. package/.next/server/chunks/ssr/[root-of-the-server]__03608b11._.js.map +0 -1
  482. package/.next/server/chunks/ssr/[root-of-the-server]__0522f852._.js.map +0 -1
  483. package/.next/server/chunks/ssr/[root-of-the-server]__11fa4345._.js +0 -56
  484. package/.next/server/chunks/ssr/[root-of-the-server]__11fa4345._.js.map +0 -1
  485. package/.next/server/chunks/ssr/[root-of-the-server]__352d2b3c._.js +0 -3
  486. package/.next/server/chunks/ssr/[root-of-the-server]__59834c63._.js.map +0 -1
  487. package/.next/server/chunks/ssr/[root-of-the-server]__5afb130a._.js +0 -3
  488. package/.next/server/chunks/ssr/[root-of-the-server]__5afb130a._.js.map +0 -1
  489. package/.next/server/chunks/ssr/[root-of-the-server]__7cd07782._.js +0 -3
  490. package/.next/server/chunks/ssr/[root-of-the-server]__90f3f366._.js +0 -3
  491. package/.next/server/chunks/ssr/[root-of-the-server]__90f3f366._.js.map +0 -1
  492. package/.next/server/chunks/ssr/[root-of-the-server]__9201693f._.js +0 -3
  493. package/.next/server/chunks/ssr/[root-of-the-server]__9f8d4cf6._.js +0 -3
  494. package/.next/server/chunks/ssr/[root-of-the-server]__addaed13._.js +0 -3
  495. package/.next/server/chunks/ssr/[root-of-the-server]__addaed13._.js.map +0 -1
  496. package/.next/server/chunks/ssr/[root-of-the-server]__ebb382fb._.js +0 -3
  497. package/.next/server/chunks/ssr/[root-of-the-server]__ebb382fb._.js.map +0 -1
  498. package/.next/server/chunks/ssr/[root-of-the-server]__f493cc72._.js +0 -3
  499. package/.next/server/chunks/ssr/[root-of-the-server]__f493cc72._.js.map +0 -1
  500. package/.next/server/chunks/ssr/[root-of-the-server]__f56dd853._.js +0 -3
  501. package/.next/server/chunks/ssr/[root-of-the-server]__f56dd853._.js.map +0 -1
  502. package/.next/server/chunks/ssr/[root-of-the-server]__ff79e2be._.js +0 -3
  503. package/.next/server/chunks/ssr/[root-of-the-server]__ff79e2be._.js.map +0 -1
  504. package/.next/server/chunks/ssr/_7ce14682._.js +0 -3
  505. package/.next/server/chunks/ssr/_7ce14682._.js.map +0 -1
  506. package/.next/server/chunks/ssr/_c4899d4c._.js +0 -3
  507. package/.next/server/chunks/ssr/_c4899d4c._.js.map +0 -1
  508. package/.next/server/chunks/ssr/node_modules_04e0be7d._.js +0 -8
  509. package/.next/server/chunks/ssr/node_modules_04e0be7d._.js.map +0 -1
  510. package/.next/server/chunks/ssr/node_modules_358ee037._.js +0 -8
  511. package/.next/server/chunks/ssr/node_modules_358ee037._.js.map +0 -1
  512. package/.next/server/chunks/ssr/node_modules_5999d873._.js.map +0 -1
  513. package/.next/server/chunks/ssr/node_modules_a8dcdfed._.js +0 -8
  514. package/.next/server/chunks/ssr/node_modules_a8dcdfed._.js.map +0 -1
  515. package/.next/static/chunks/0b5678df432c3623.js +0 -4
  516. package/.next/static/chunks/0dfa5be743492ce2.js +0 -2
  517. package/.next/static/chunks/1084ea77114042eb.css +0 -1
  518. package/.next/static/chunks/2f4149693b1e0875.js +0 -3
  519. package/.next/static/chunks/3856bc9dcb46c1fd.js +0 -3
  520. package/.next/static/chunks/a4f4322edc25e6b4.js +0 -3
  521. package/.next/static/chunks/a5ee8f49aed07f5b.js +0 -9
  522. package/.next/static/chunks/b77fa77a013ad38a.js +0 -1
  523. package/.next/static/chunks/cfb8404eba3fd259.js +0 -1
  524. package/.next/static/chunks/f10df459d17d0aff.js +0 -3
  525. package/.next/static/chunks/turbopack-18722873613a4289.js +0 -4
  526. /package/.next/server/chunks/{[externals]__6f5f63a1._.js.map → [externals]__7ece43c5._.js.map} +0 -0
  527. /package/.next/server/chunks/{[externals]__ad3eabe7._.js.map → [externals]_keytar_23140f5c._.js.map} +0 -0
  528. /package/.next/server/chunks/{[root-of-the-server]__ed7be8e0._.js.map → [root-of-the-server]__e993c1a5._.js.map} +0 -0
  529. /package/.next/static/{qoMjwwKLHSCKURVHnc41W → gMV0bFe8zKqVaStUpkI04}/_buildManifest.js +0 -0
  530. /package/.next/static/{qoMjwwKLHSCKURVHnc41W → gMV0bFe8zKqVaStUpkI04}/_clientMiddlewareManifest.json +0 -0
  531. /package/.next/static/{qoMjwwKLHSCKURVHnc41W → gMV0bFe8zKqVaStUpkI04}/_ssgManifest.js +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/hooks/use-workspace-title.ts","../../../../src/app/git/stashes/page.tsx"],"sourcesContent":["'use client';\n\nimport { useEffect } from 'react';\nimport { useRepository } from './use-git';\nimport { getRepoFolderName, getRepositoryDisplayName } from '@/lib/utils';\n\n/**\n * Updates the document title with the repo name and page name.\n * @param repoPath - The full path to the repository (e.g., \"C:\\\\Users\\\\user\\\\projects\\\\repo\" or \"/Users/user/projects/repo\")\n * @param pageName - The name of the current page (e.g., \"History\", \"Changes\", \"Stashes\", \"Settings\")\n */\nexport function useWorkspaceTitle(repoPath: string | null, pageName: string) {\n const repository = useRepository(repoPath);\n\n useEffect(() => {\n const repoName = repoPath\n ? repository\n ? getRepositoryDisplayName(repository)\n : getRepoFolderName(repoPath)\n : 'Workspace';\n document.title = `${repoName} | ${pageName}`;\n }, [repoPath, repository, pageName]);\n}\n","'use client';\n\nimport { useSearchParams } from 'next/navigation';\nimport { Suspense, useState } from 'react';\nimport { useWorkspaceTitle } from '@/hooks/use-workspace-title';\nimport { useGitStashes, useGitAction, useStashFiles, useStashFileDiff } from '@/hooks/use-git';\nimport { cn, getChangedLineCountFromDiff, isFileBinary, isImageFile } from '@/lib/utils';\nimport { useTheme } from 'next-themes';\nimport { GroupedDiffViewer } from '@/components/git/grouped-diff-viewer';\nimport { ImageDiffView } from '@/components/git/image-diff-view';\n\nfunction StashDiffView({ repoPath, stashIndex, filePath }: { repoPath: string; stashIndex: number; filePath: string }) {\n const { data, isLoading } = useStashFileDiff(repoPath, stashIndex, filePath);\n const { resolvedTheme } = useTheme();\n const storageKey = 'git-web:diff-view-split';\n\n const [splitView, setSplitView] = useState(() => {\n if (typeof window === 'undefined') return true;\n try {\n const stored = localStorage.getItem(storageKey);\n return stored !== null ? JSON.parse(stored) : true;\n } catch {\n return true;\n }\n });\n\n const [renderAnyway, setRenderAnyway] = useState(false);\n\n if (isLoading) {\n return <div className=\"flex items-center justify-center p-8 h-full\"><span className=\"loading loading-spinner text-base-content/50\"></span></div>;\n }\n\n if (!data) {\n return (\n <div className=\"flex items-center justify-center h-full opacity-50\">\n No diff available\n </div>\n );\n }\n\n if (isImageFile(filePath)) {\n return (\n <div className=\"flex flex-col h-full bg-white dark:bg-slate-900\">\n <div className=\"flex items-center justify-between px-4 h-[57px] border-b border-slate-200 dark:border-slate-800 shrink-0 bg-white dark:bg-slate-900\">\n <span className=\"text-sm font-mono truncate max-w-[70%]\" title={filePath}>{filePath}</span>\n </div>\n <div className=\"flex-1 overflow-auto\">\n <ImageDiffView filePath={filePath} imageDiff={data.imageDiff} />\n </div>\n </div>\n );\n }\n\n const isBinary = isFileBinary(filePath, data.left, data.right);\n\n if (isBinary) {\n return (\n <div className=\"flex flex-col h-full bg-white dark:bg-slate-900\">\n <div className=\"flex items-center justify-between px-4 h-[57px] border-b border-slate-200 dark:border-slate-800 shrink-0 bg-white dark:bg-slate-900\">\n <span className=\"text-sm font-mono truncate max-w-[70%]\" title={filePath}>{filePath}</span>\n </div>\n <div className=\"flex-1 flex items-center justify-center opacity-50\">\n Binary file - diff not available\n </div>\n </div>\n );\n }\n\n // Large file protection\n const MAX_DIFF_SIZE = 100 * 1024; // 100KB\n const MAX_DIFF_LINES = 3000;\n\n const diffContent = data.diff || '';\n const contentSize = diffContent.length;\n const lineCount = getChangedLineCountFromDiff(diffContent);\n\n const isLargeDiff = (contentSize > MAX_DIFF_SIZE || lineCount > MAX_DIFF_LINES);\n\n return (\n <div className=\"flex flex-col h-full bg-white dark:bg-slate-900\">\n <div className=\"flex items-center justify-between px-4 h-[57px] border-b border-slate-200 dark:border-slate-800 shrink-0 bg-white dark:bg-slate-900\">\n <span className=\"text-sm font-mono truncate max-w-[70%]\" title={filePath}>{filePath}</span>\n <div className=\"flex items-center gap-2\">\n <label htmlFor=\"split-view-stash\" className=\"text-[10px] uppercase tracking-wider font-bold cursor-pointer opacity-70\">Split View</label>\n <input\n type=\"checkbox\"\n id=\"split-view-stash\"\n checked={splitView}\n onChange={(e) => {\n setSplitView(e.target.checked);\n try {\n localStorage.setItem(storageKey, JSON.stringify(e.target.checked));\n } catch { }\n }}\n className=\"toggle toggle-xs toggle-primary\"\n />\n </div>\n </div>\n <div className=\"flex-1 overflow-auto diff-viewer-wrapper\">\n {isLargeDiff && !renderAnyway ? (\n <div className=\"flex flex-col items-center justify-center h-full gap-4 text-center p-4\">\n <i className=\"iconoir-warning-triangle text-[32px] text-warning\" aria-hidden=\"true\" />\n <div className=\"space-y-2\">\n <h3 className=\"font-bold text-lg\">Large Diff Detected</h3>\n <p className=\"opacity-70\">\n This diff is large ({Math.round(contentSize / 1024)}KB, ~{lineCount} changed lines) and may freeze your browser if rendered.\n </p>\n </div>\n <button className=\"btn btn-outline\" onClick={() => setRenderAnyway(true)}>\n Show Diff Anyway\n </button>\n </div>\n ) : (\n <GroupedDiffViewer\n oldValue={data.left || ''}\n newValue={data.right || ''}\n splitView={splitView}\n useDarkTheme={resolvedTheme === 'dark'}\n />\n )}\n </div>\n </div>\n );\n}\n\nfunction StashesContent() {\n const searchParams = useSearchParams();\n const repoPath = searchParams.get('path');\n const { data: stashes, isLoading, isError, error, refetch } = useGitStashes(repoPath);\n const action = useGitAction();\n const [selectedStashIndex, setSelectedStashIndex] = useState<number | null>(null);\n const [selectedFile, setSelectedFile] = useState<string | null>(null);\n const [expandedStashes, setExpandedStashes] = useState<Set<number>>(new Set());\n\n const { data: stashFiles, isLoading: filesLoading } = useStashFiles(repoPath, selectedStashIndex);\n\n useWorkspaceTitle(repoPath, 'Stashes');\n\n if (!repoPath) {\n return <div className=\"p-8\">No repository path specified.</div>;\n }\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center h-64\">\n <span className=\"loading loading-spinner text-base-content/50\"></span>\n </div>\n );\n }\n\n if (isError) {\n return (\n <div className=\"flex items-center justify-center h-64 flex-col gap-4\">\n <p className=\"text-error font-medium\">Error Loading Stashes</p>\n <p className=\"text-sm opacity-70\">{(error as Error)?.message || 'An unknown error occurred'}</p>\n <button onClick={() => refetch()} className=\"btn btn-outline btn-sm\">\n <i className=\"iconoir-refresh-circle text-[16px] mr-1\" aria-hidden=\"true\" />\n Try Again\n </button>\n </div>\n );\n }\n\n const handleApply = async (index: number) => {\n await action.mutateAsync({ repoPath, action: 'stash-apply', data: { index } });\n refetch();\n };\n\n const handlePop = async (index: number) => {\n await action.mutateAsync({ repoPath, action: 'stash-pop', data: { index } });\n setSelectedStashIndex(null);\n setSelectedFile(null);\n refetch();\n };\n\n const handleDrop = async (index: number) => {\n await action.mutateAsync({ repoPath, action: 'stash-drop', data: { index } });\n if (selectedStashIndex === index) {\n setSelectedStashIndex(null);\n setSelectedFile(null);\n }\n refetch();\n };\n\n const toggleStashExpanded = (index: number) => {\n const newExpanded = new Set(expandedStashes);\n if (newExpanded.has(index)) {\n newExpanded.delete(index);\n } else {\n newExpanded.add(index);\n }\n setExpandedStashes(newExpanded);\n setSelectedStashIndex(index);\n setSelectedFile(null);\n };\n\n const formatDate = (dateString: string) => {\n try {\n const date = new Date(dateString);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMs / 3600000);\n const diffDays = Math.floor(diffMs / 86400000);\n\n if (diffMins < 1) return 'just now';\n if (diffMins < 60) return `${diffMins} minute${diffMins === 1 ? '' : 's'} ago`;\n if (diffHours < 24) return `${diffHours} hour${diffHours === 1 ? '' : 's'} ago`;\n if (diffDays < 30) return `${diffDays} day${diffDays === 1 ? '' : 's'} ago`;\n return date.toLocaleDateString();\n } catch {\n return dateString;\n }\n };\n\n const getStatusColor = (status: string) => {\n switch (status) {\n case 'A': return 'text-success';\n case 'D': return 'text-error';\n case 'M': return 'text-warning';\n default: return 'opacity-50';\n }\n };\n\n const getStatusLabel = (status: string) => {\n switch (status) {\n case 'A': return 'Added';\n case 'D': return 'Deleted';\n case 'M': return 'Modified';\n default: return status;\n }\n };\n\n const headerActionButtonClass =\n \"flex h-8 items-center gap-1.5 rounded-md border border-slate-200 bg-white px-3 text-sm font-medium text-slate-600 transition-colors hover:bg-slate-50 hover:text-slate-900 disabled:cursor-not-allowed disabled:opacity-50 dark:border-slate-700 dark:bg-slate-900 dark:text-slate-300 dark:hover:bg-slate-800 dark:hover:text-slate-100\";\n\n return (\n <div className=\"flex h-full overflow-hidden\">\n <div className=\"flex flex-1 min-w-0 flex-col gap-2 overflow-hidden\">\n <div className=\"flex min-h-[57px] shrink-0 items-center justify-between gap-2 rounded-xl border border-slate-200 bg-white px-4 py-2 dark:border-slate-800 dark:bg-slate-900\">\n <h1 className=\"font-bold text-lg text-slate-900 dark:text-slate-100\">Stashes</h1>\n <button className={headerActionButtonClass} onClick={() => refetch()} disabled={action.isPending} title=\"Refresh stashes\">\n {action.isPending ? <span className=\"loading loading-spinner loading-xs\"></span> : <i className=\"iconoir-refresh-circle text-[16px]\" aria-hidden=\"true\" />}\n Refresh\n </button>\n </div>\n\n <div className=\"flex flex-1 overflow-hidden rounded-xl border border-slate-200 bg-white dark:border-slate-800 dark:bg-slate-900\">\n {/* Left Panel: Stash List */}\n <div className=\"w-64 border-r border-slate-200 dark:border-slate-800 flex flex-col bg-slate-50/70 dark:bg-slate-900/70\">\n <div className=\"flex-1 overflow-y-auto overflow-x-hidden\">\n {!stashes || stashes.length === 0 ? (\n <div className=\"flex-1 flex flex-col items-center justify-center opacity-50 h-64\">\n <div className=\"p-8 rounded-full bg-slate-100 dark:bg-slate-800/60 mb-4 text-4xl\">\n 📦\n </div>\n <p className=\"text-sm font-bold\">No stashes</p>\n <p className=\"text-xs mt-1\">Stash changes from the Changes page</p>\n </div>\n ) : (\n <div className=\"p-2\">\n {stashes.map((stash) => {\n const isExpanded = expandedStashes.has(stash.index);\n const isSelected = selectedStashIndex === stash.index;\n\n return (\n <div key={stash.hash} className=\"mb-1\">\n <div\n className={cn(\n \"p-2 rounded-md cursor-pointer transition-colors\",\n isSelected ? \"bg-slate-100 dark:bg-slate-800/70\" : \"hover:bg-slate-100 dark:hover:bg-slate-800/60\"\n )}\n onClick={() => toggleStashExpanded(stash.index)}\n >\n <div className=\"flex flex-col gap-1\">\n {/* Row 1: ID and Buttons */}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <div className=\"opacity-50 text-[10px]\">\n {isExpanded ? '▼' : '▶'}\n </div>\n <span className=\"text-[10px] font-mono bg-slate-200 dark:bg-slate-800 px-1 py-0.5 rounded opacity-70\">\n stash@{'{' + stash.index + '}'}\n </span>\n </div>\n <div className=\"flex items-center gap-1 shrink-0\">\n <div className=\"tooltip tooltip-left before:whitespace-normal before:max-w-[120px]\" data-tip=\"Apply stash (keep)\">\n <button\n className=\"btn btn-ghost btn-xs btn-square\"\n onClick={(e) => { e.stopPropagation(); handleApply(stash.index); }}\n disabled={action.isPending}\n >\n <i className=\"iconoir-play text-[16px]\" aria-hidden=\"true\" />\n </button>\n </div>\n <div className=\"tooltip tooltip-left before:whitespace-normal before:max-w-[120px]\" data-tip=\"Pop stash (apply and delete)\">\n <button\n className=\"btn btn-ghost btn-xs btn-square\"\n onClick={(e) => { e.stopPropagation(); handlePop(stash.index); }}\n disabled={action.isPending}\n >\n <i className=\"iconoir-u-turn-arrow-left text-[16px]\" aria-hidden=\"true\" />\n </button>\n </div>\n <div className=\"tooltip tooltip-left before:whitespace-normal before:max-w-[120px]\" data-tip=\"Delete stash\">\n <button\n className=\"btn btn-ghost btn-xs btn-square text-error hover:bg-error/10\"\n onClick={(e) => { e.stopPropagation(); handleDrop(stash.index); }}\n disabled={action.isPending}\n >\n <i className=\"iconoir-trash text-[16px]\" aria-hidden=\"true\" />\n </button>\n </div>\n </div>\n </div>\n\n {/* Row 2: Message */}\n <div className=\"tooltip tooltip-bottom before:whitespace-normal before:max-w-[200px] w-full block text-left\" data-tip={stash.message}>\n <p className=\"text-xs font-bold truncate opacity-90 w-full\">\n {stash.message}\n </p>\n </div>\n\n {/* Row 3: Metadata */}\n <div className=\"text-[10px] opacity-50\">\n {formatDate(stash.date)}\n </div>\n </div>\n </div>\n\n {/* Files list when expanded */}\n {isExpanded && isSelected && (\n <div className=\"ml-6 mt-1 space-y-0.5\">\n {filesLoading ? (\n <div className=\"flex items-center gap-2 px-2 py-1 text-xs opacity-50\">\n <span className=\"loading loading-spinner loading-xs\"></span>\n Loading files...\n </div>\n ) : stashFiles && stashFiles.length > 0 ? (\n stashFiles.map((file) => (\n <div\n key={file.path}\n className={cn(\n \"flex items-center gap-2 px-2 py-1 rounded cursor-pointer transition-colors text-xs\",\n selectedFile === file.path ? \"bg-primary/10 text-primary font-bold\" : \"hover:bg-slate-100 dark:hover:bg-slate-800/60\"\n )}\n onClick={(e) => { e.stopPropagation(); setSelectedFile(file.path); }}\n >\n <i className=\"iconoir-page text-[14px] opacity-50\" aria-hidden=\"true\" />\n <span className=\"font-mono truncate flex-1\" title={file.path}>{file.path}</span>\n <span className={cn(\"text-[10px] uppercase font-bold\", getStatusColor(file.status))} title={getStatusLabel(file.status)}>\n {file.status}\n </span>\n </div>\n ))\n ) : (\n <div className=\"px-2 py-1 text-xs opacity-50 italic\">\n No files in stash\n </div>\n )}\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n\n {/* Right Panel: Diff View */}\n <div className=\"flex-1 flex flex-col bg-white dark:bg-slate-900 overflow-hidden\">\n {selectedStashIndex !== null && selectedFile ? (\n <StashDiffView\n key={`${selectedStashIndex}:${selectedFile}`}\n repoPath={repoPath}\n stashIndex={selectedStashIndex}\n filePath={selectedFile}\n />\n ) : (\n <div className=\"flex-1 flex flex-col items-center justify-center opacity-50\">\n <div className=\"p-8 rounded-full bg-slate-100 dark:bg-slate-800/60 mb-4 text-4xl\">\n 📦\n </div>\n <p className=\"text-sm font-bold\">\n {selectedStashIndex !== null ? 'Select a file to view changes' : 'Select a stash to view files'}\n </p>\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nexport default function WorkspaceStashesPage() {\n return (\n <Suspense fallback={<div className=\"flex items-center justify-center h-full\"><span className=\"loading loading-spinner\"></span></div>}>\n <StashesContent />\n </Suspense>\n );\n}\n"],"names":[],"mappings":"uCAEA,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAOO,SAAS,EAAkB,CAAuB,CAAE,CAAgB,EACvE,IAAM,EAAa,CAAA,EAAA,EAAA,aAAA,AAAa,EAAC,GAEjC,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACN,IAAM,EAAW,EACX,EACI,CAAA,EAAA,EAAA,wBAAwB,AAAxB,EAAyB,GACzB,CAAA,EAAA,EAAA,iBAAA,AAAiB,EAAC,GACtB,YACN,SAAS,KAAK,CAAG,CAAA,EAAG,EAAS,GAAG,EAAE,EAAA,CACtC,AADgD,EAC7C,CAAC,EAAU,EAAY,EAAS,CACvC,2ECpBA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAEA,SAAS,EAAc,UAAE,CAAQ,CAAE,YAAU,UAAE,CAAQ,CAA8D,EACjH,GAAM,CAAE,MAAI,WAAE,CAAS,CAAE,CAAG,CAAA,EAAA,EAAA,gBAAA,AAAgB,EAAC,EAAU,EAAY,GAC7D,eAAE,CAAa,CAAE,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,IAG5B,CAAC,EAAW,EAAa,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,KACG,GASxC,CAAC,EAAc,EAAgB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAEjD,GAAI,EACA,MAAO,CAAA,EAAA,AADI,EACJ,GAAA,EAAC,MAAA,CAAI,UAAU,uDAA8C,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,mDAGxF,GAAI,CAAC,EACD,IADO,EAEH,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,8DAAqD,sBAM5E,GAAI,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,GACZ,MACI,CAAA,CAFmB,CAEnB,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,4DACX,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,+IACX,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,yCAAyC,MAAO,WAAW,MAE/E,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,gCACX,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,aAAa,CAAA,CAAC,SAAU,EAAU,UAAW,EAAK,SAAS,QAQ5E,GAFiB,CAEb,AAFa,EAAA,EAAA,MAEH,MAFG,AAAY,EAAC,EAAU,EAAK,IAAI,CAAE,EAAK,KAAK,EAGzD,MACI,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,4DACX,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,+IACX,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,yCAAyC,MAAO,WAAW,MAE/E,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,8DAAqD,wCAWhF,IAAM,EAAc,EAAK,IAAI,EAAI,GAC3B,EAAc,EAAY,MAAM,CAChC,EAAY,CAAA,EAAA,EAAA,2BAAA,AAA2B,EAAC,GAExC,EAAe,EAPC,MAAM,EAOwB,EAN7B,EAMY,AAPD,EASlC,MAFgE,AAG5D,AAVsC,CAUtC,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,4DACX,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,gJACX,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,yCAAyC,MAAO,WAAW,IAC3E,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oCACX,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,QAAQ,mBAAmB,UAAU,oFAA2E,eACvH,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACG,KAAK,WACL,GAAG,mBACH,QAAS,EACT,SAAU,AAAC,IACP,EAAa,EAAE,MAAM,CAAC,OAAO,EAC7B,GAAI,CACA,aAAa,OAAO,CAAC,AA7E9B,0BA6E0C,KAAK,SAAS,CAAC,EAAE,MAAM,CAAC,OAAO,EACpE,CAAE,KAAM,CAAE,CACd,EACA,UAAU,0CAItB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oDACV,GAAe,CAAC,EACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,mFACX,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,oDAAoD,cAAY,SAC7E,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sBACX,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,6BAAoB,wBAClC,CAAA,EAAA,EAAA,IAAA,EAAC,IAAA,CAAE,UAAU,uBAAa,uBACD,KAAK,KAAK,CAAC,EAAc,MAAM,QAAM,EAAU,iEAG5E,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,UAAU,kBAAkB,QAAS,IAAM,GAAgB,YAAO,wBAK9E,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,iBAAiB,CAAA,CACd,SAAU,EAAK,IAAI,EAAI,GACvB,SAAU,EAAK,KAAK,EAAI,GACxB,UAAW,EACX,aAAgC,SAAlB,QAMtC,CAEA,SAAS,IAEL,IAAM,EADe,AACJ,CADI,EAAA,EAAA,eAAA,AAAe,IACN,GAAG,CAAC,QAC5B,CAAE,KAAM,CAAO,WAAE,CAAS,SAAE,CAAO,OAAE,CAAK,SAAE,CAAO,CAAE,CAAG,CAAA,EAAA,EAAA,aAAa,AAAb,EAAc,GACtE,EAAS,CAAA,EAAA,EAAA,YAAA,AAAY,IACrB,CAAC,EAAoB,EAAsB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAgB,MACtE,CAAC,EAAc,EAAgB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAgB,MAC1D,CAAC,EAAiB,EAAmB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAc,IAAI,KAElE,CAAE,KAAM,CAAU,CAAE,UAAW,CAAY,CAAE,CAAG,CAAA,EAAA,EAAA,aAAA,AAAa,EAAC,EAAU,GAI9E,GAFA,CAAA,EAAA,EAAA,iBAAA,AAAiB,EAAC,EAAU,WAExB,CAAC,EACD,MAAO,CAAA,CADI,CACJ,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,eAAM,kCAGhC,GAAI,EACA,MACI,CAAA,EAFO,AAEP,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,iDACX,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,mDAK5B,GAAI,EACA,MACI,CAFK,AAEL,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,iEACX,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,kCAAyB,0BACtC,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,8BAAuB,GAAiB,SAAW,8BAChE,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAAO,QAAS,IAAM,IAAW,UAAU,mCACxC,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,0CAA0C,cAAY,SAAS,kBAO5F,IAAM,EAAc,MAAO,IACvB,MAAM,EAAO,WAAW,CAAC,UAAE,EAAU,OAAQ,cAAe,KAAM,OAAE,CAAM,CAAE,GAC5E,GACJ,EAEM,EAAY,MAAO,IACrB,MAAM,EAAO,WAAW,CAAC,UAAE,EAAU,OAAQ,YAAa,KAAM,OAAE,CAAM,CAAE,GAC1E,EAAsB,MACtB,EAAgB,MAChB,GACJ,EAEM,EAAa,MAAO,IACtB,MAAM,EAAO,WAAW,CAAC,UAAE,EAAU,OAAQ,aAAc,KAAM,OAAE,CAAM,CAAE,GACvE,IAAuB,IACvB,EAAsB,CADQ,KAE9B,EAAgB,OAEpB,GACJ,EAsDA,MACI,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,uCACX,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,+DACX,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,wKACX,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,gEAAuD,YACrE,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAAO,UAPpB,CAO+B,0UAAyB,QAAS,IAAM,IAAW,SAAU,EAAO,SAAS,CAAE,MAAM,4BACnG,EAAO,SAAS,CAAG,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,uCAA+C,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,qCAAqC,cAAY,SAAU,gBAKnK,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,4HAEX,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,kHACX,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oDAClB,AAAC,GAA8B,IAAnB,EAAQ,MAAM,CASvB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,eACV,EAAQ,GAAG,CAAC,AAAC,IACV,IAAM,EAAa,EAAgB,GAAG,CAAC,EAAM,KAAK,EAC5C,EAAa,IAAuB,EAAM,KAAK,CAErD,MACI,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAqB,UAAU,iBAC5B,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CACG,UAAW,CAAA,EAAA,EAAA,EAAA,AAAE,EACT,kDACA,EAAa,oCAAsC,iDAEvD,QAAS,IAAM,oBAxF1B,EAwF8C,EAAM,KAAK,MAtF9E,CADE,EAAc,IAAI,IAAI,IACZ,GAAG,CAAC,GAChB,EAAY,GADY,GACN,CAAC,GAEnB,EAAY,GAAG,CAAC,GAEpB,EAAmB,GACnB,EAAsB,GACtB,EAAgB,iBAiFoB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,gCAEX,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8CACX,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oCACX,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,kCACV,EAAa,IAAM,MAExB,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,gGAAsF,SAC3F,IAAM,EAAM,KAAK,CAAG,UAGnC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,6CACX,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qEAAqE,WAAS,8BACzF,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACG,UAAU,kCACV,QAAS,AAAC,IAAQ,EAAE,eAAe,GAAI,EAAY,EAAM,KAAK,CAAG,EACjE,SAAU,EAAO,SAAS,UAE1B,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,2BAA2B,cAAY,aAG5D,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qEAAqE,WAAS,wCACzF,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACG,UAAU,kCACV,QAAS,AAAC,IAAQ,EAAE,eAAe,GAAI,EAAU,EAAM,KAAK,CAAG,EAC/D,SAAU,EAAO,SAAS,UAE1B,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,wCAAwC,cAAY,aAGzE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qEAAqE,WAAS,wBACzF,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACG,UAAU,+DACV,QAAS,AAAC,IAAQ,EAAE,eAAe,GAAI,EAAW,EAAM,KAAK,CAAG,EAChE,SAAU,EAAO,SAAS,UAE1B,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,4BAA4B,cAAY,mBAOrE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,8FAA8F,WAAU,EAAM,OAAO,UAChI,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,wDACR,EAAM,OAAO,KAKtB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,kCACV,CAjI9B,AAAC,IAChB,GAAI,CACA,IAAM,EAAO,IAAI,KAAK,GAEhB,EADM,AACG,IADC,OACG,OAAO,GAAK,EAAK,OAAO,GACrC,EAAW,KAAK,KAAK,CAAC,EAAS,KAC/B,EAAY,KAAK,KAAK,CAAC,EAAS,MAChC,EAAW,KAAK,KAAK,CAAC,EAAS,OAErC,GAAI,EAAW,EAAG,MAAO,WACzB,GAAI,EAAW,GAAI,MAAO,CAAA,EAAG,EAAS,OAAO,EAAe,IAAb,EAAiB,GAAK,IAAI,IAAI,CAAC,CAC9E,GAAI,EAAY,GAAI,MAAO,CAAA,EAAG,EAAU,KAAK,EAAE,AAAc,MAAI,GAAK,IAAI,IAAI,CAAC,CAC/E,GAAI,EAAW,GAAI,MAAO,CAAA,EAAG,EAAS,IAAI,EAAe,IAAb,EAAiB,GAAK,IAAI,IAAI,CAAC,CAC3E,OAAO,EAAK,kBAAkB,EAClC,CAAE,KAAM,CACJ,OAAO,CACX,EACJ,EAgH4D,EAAM,IAAI,SAMjC,GAAc,GACX,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,iCACV,EACG,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,iEACX,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,uCAA4C,sBAGhE,GAAc,EAAW,MAAM,CAAG,EAClC,EAAW,GAAG,CAAC,AAAC,GACZ,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAEG,UAAW,CAAA,EAAA,EAAA,EAAA,AAAE,EACT,qFACA,IAAiB,EAAK,IAAI,CAAG,uCAAyC,iDAE1E,QAAS,AAAC,IAAQ,EAAE,eAAe,GAAI,EAAgB,EAAK,IAAI,CAAG,YAEnE,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,sCAAsC,cAAY,SAC/D,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,4BAA4B,MAAO,EAAK,IAAI,UAAG,EAAK,IAAI,GACxE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAW,CAAA,EAAA,EAAA,EAAA,AAAE,EAAC,kCAAmC,CAvIxF,AAAC,IACpB,OAAQ,GACJ,IAAK,IAAK,MAAO,cACjB,KAAK,IAAK,MAAO,YACjB,KAAK,IAAK,MAAO,cACjB,SAAS,MAAO,YACpB,EACJ,EAgI8H,EAAK,MAAM,GAAI,MAAO,CA9H7H,AAAC,IACpB,OAAQ,GACJ,IAAK,IAAK,MAAO,OACjB,KAAK,IAAK,MAAO,SACjB,KAAK,IAAK,MAAO,UACjB,SAAS,OAAO,CACpB,CACJ,GAuHmK,EAAK,MAAM,WACjH,EAAK,MAAM,KAVX,EAAK,IAAI,GAetB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,+CAAsC,0BA1F3D,EAAM,IAAI,CAkG5B,KAhHJ,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,6EACX,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,4EAAmE,OAGlF,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,6BAAoB,eACjC,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,wBAAe,+CAkHpC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,2EACa,OAAvB,GAA+B,EAC5B,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAEG,SAAU,EACV,WAAY,EACZ,SAAU,GAHL,CAAA,EAAG,EAAmB,CAAC,EAAE,EAAA,CAAc,EAMhD,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,wEACX,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,4EAAmE,OAGlF,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,6BACe,OAAvB,EAA8B,gCAAkC,6CASrG,CAEe,SAAS,IACpB,MACI,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,QAAQ,CAAA,CAAC,SAAU,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,mDAA0C,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,uCACzF,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAA,IAGb"}
@@ -1,3 +1,3 @@
1
- module.exports=[12465,a=>{"use strict";var b=a.i(87924),c=a.i(78014),d=a.i(78159),e=a.i(5050);let f=(0,e.createServerReference)("401ccdad137644781bb0cc644754cd1e07cc30c07a",e.callServer,void 0,e.findSourceMapURL,"removeAgentApiCredential"),g=(0,e.createServerReference)("40788d8f719ddaee4adf946788d566d092caf643c4",e.callServer,void 0,e.findSourceMapURL,"removeCredential"),h=(0,e.createServerReference)("70121d2a500dd68bf95288b8f4c731abd8738af90a",e.callServer,void 0,e.findSourceMapURL,"saveAgentApiCredential"),i=(0,e.createServerReference)("40b8f9d3358929e5e27e89239b78cbf430ebe36152",e.callServer,void 0,e.findSourceMapURL,"saveGitHubCredential"),j=(0,e.createServerReference)("606b0008567600dac7b5d52fc52279f3d249969a79",e.callServer,void 0,e.findSourceMapURL,"saveGitLabCredential");var k=a.i(50522),l=a.i(37047),m=a.i(81560),n=a.i(71987),o=a.i(50944),p=a.i(72131);let q="https://gitlab.com",r={github:"https://www.google.com/s2/favicons?domain=github.com&sz=64",gitlab:"https://www.google.com/s2/favicons?domain=gitlab.com&sz=64"},s={codex:"Codex CLI"},t={codex:"sk-..."},u={codex:"https://proxy.example.com/v1"},v=["codex"];function w(a){return"github"===a?"GitHub":"GitLab"}function x({type:a}){return(0,b.jsx)(n.default,{src:r[a],alt:`${w(a)} icon`,width:20,height:20,className:"h-5 w-5 rounded-sm",unoptimized:!0})}function y(){let a=(0,o.useRouter)(),[e,n]=(0,p.useState)([]),[r,y]=(0,p.useState)([]),[z,A]=(0,p.useState)(!0),[B,C]=(0,p.useState)(""),[D,E]=(0,p.useState)(""),[F,G]=(0,p.useState)(q),[H,I]=(0,p.useState)({codex:""}),[J,K]=(0,p.useState)({codex:""}),[L,M]=(0,p.useState)(null),[N,O]=(0,p.useState)(null),[P,Q]=(0,p.useState)(null),[R,S]=(0,p.useState)(null),[T,U]=(0,p.useState)(null),V=(0,p.useMemo)(()=>e.filter(a=>"github"===a.type),[e]),W=(0,p.useMemo)(()=>e.filter(a=>"gitlab"===a.type),[e]),X=(0,p.useMemo)(()=>new Map(r.map(a=>[a.agent,a])),[r]),Y=async()=>{let[a,b]=await Promise.all([(0,d.listCredentials)(),(0,c.listAgentApiCredentials)()]);if(!a.success){U({tone:"error",text:a.error}),A(!1);return}if(!b.success){U({tone:"error",text:b.error}),A(!1);return}n(a.credentials),y(b.credentials),K(a=>{let c={...a};for(let a of v)c[a]=b.credentials.find(b=>b.agent===a)?.apiProxy||"";return c}),A(!1)};(0,p.useEffect)(()=>{let a=!0;return(async()=>{let[b,e]=await Promise.all([(0,d.listCredentials)(),(0,c.listAgentApiCredentials)()]);if(a){if(!b.success){U({tone:"error",text:b.error}),A(!1);return}if(!e.success){U({tone:"error",text:e.error}),A(!1);return}n(b.credentials),y(e.credentials),K(a=>{let b={...a};for(let a of v)b[a]=e.credentials.find(b=>b.agent===a)?.apiProxy||"";return b}),A(!1)}})(),()=>{a=!1}},[]);let Z=async()=>{U(null),M("github");let a=await i(B);if(!a.success){U({tone:"error",text:a.error}),M(null);return}C(""),U({tone:"success",text:"GitHub credential added."}),await Y(),M(null)},$=async()=>{U(null),M("gitlab");let a=await j(F,D);if(!a.success){U({tone:"error",text:a.error}),M(null);return}E(""),U({tone:"success",text:"GitLab credential added."}),await Y(),M(null)},_=async a=>{U(null),O(a);let b=await h(a,H[a],J[a]);if(!b.success){U({tone:"error",text:b.error}),O(null);return}I(b=>({...b,[a]:""})),K(c=>({...c,[a]:b.credential.apiProxy||""})),U({tone:"success",text:`${s[a]} credential saved.`}),await Y(),O(null)},aa=async a=>{let b=w(a.type);if(!confirm(`Delete this ${b} credential for ${"gitlab"===a.type?`${a.username} @ ${a.serverUrl}`:a.username}?`))return;U(null),Q(a.id);let c=await g(a.id);if(!c.success){U({tone:"error",text:c.error}),Q(null);return}U({tone:"success",text:`${b} credential deleted.`}),await Y(),Q(null)},ab=async a=>{if(!confirm(`Delete the saved ${s[a]} API credential?`))return;U(null),S(a);let b=await f(a);if(!b.success){U({tone:"error",text:b.error}),S(null);return}I(b=>({...b,[a]:""})),K(b=>({...b,[a]:""})),U({tone:"success",text:`${s[a]} credential deleted.`}),await Y(),S(null)},ac="overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm dark:border-slate-700/50 dark:bg-slate-800 dark:shadow-[0_12px_30px_-18px_rgba(2,6,23,0.9)]",ad="flex flex-col gap-3 border-b border-slate-200 bg-white px-6 py-5 md:flex-row md:items-center md:justify-between dark:border-slate-700/50 dark:bg-slate-800",ae="block w-full rounded-lg border border-slate-200 bg-slate-50 px-3 py-2.5 text-sm text-slate-900 placeholder-slate-400 transition-all focus:border-primary focus:outline-none focus:ring-2 focus:ring-primary/20 disabled:cursor-not-allowed disabled:opacity-60 dark:border-slate-700 dark:bg-slate-900/50 dark:text-white dark:placeholder-slate-500 dark:focus:border-primary/50 dark:focus:bg-slate-900",af="inline-flex items-center justify-center gap-2 rounded-lg bg-primary px-4 py-2 text-sm font-medium text-white shadow-lg shadow-blue-900/20 transition-colors hover:bg-blue-700 disabled:cursor-not-allowed disabled:opacity-60",ag="inline-flex items-center justify-center gap-2 rounded-lg border border-slate-200 bg-white px-4 py-2 text-sm font-medium text-slate-700 shadow-sm transition-colors hover:bg-slate-50 disabled:cursor-not-allowed disabled:opacity-60 dark:border-slate-600 dark:bg-slate-800 dark:text-slate-200 dark:hover:bg-slate-700",ah="inline-flex h-8 w-8 items-center justify-center rounded-lg text-slate-400 transition-all hover:bg-red-50 hover:text-red-500 dark:text-slate-400 dark:hover:bg-red-900/30 dark:hover:text-red-400";return(0,b.jsx)("main",{className:"min-h-screen bg-[#f6f6f8] px-4 py-8 md:px-8 md:py-12 dark:bg-[#0f1117]",children:(0,b.jsxs)("div",{className:"mx-auto w-full max-w-4xl space-y-8",children:[(0,b.jsxs)("div",{className:"mb-8",children:[(0,b.jsxs)("div",{className:"mb-2 flex items-center gap-4",children:[(0,b.jsx)("button",{type:"button",className:"flex h-10 w-10 items-center justify-center rounded-lg text-slate-500 transition-colors hover:bg-white hover:text-slate-900 dark:text-slate-400 dark:hover:bg-slate-800 dark:hover:text-white",onClick:()=>a.push("/"),"aria-label":"Back to home",children:(0,b.jsx)(k.ChevronRight,{className:"h-6 w-6 rotate-180"})}),(0,b.jsx)("h1",{className:"text-3xl font-black tracking-[-0.02em] text-slate-900 md:text-4xl dark:text-white",children:"Credential Management"})]}),(0,b.jsx)("p",{className:"ml-14 text-sm text-slate-500 md:text-base dark:text-slate-400",children:"Manage your API keys and access tokens for third-party services safely."})]}),T&&(0,b.jsx)("div",{className:`rounded-lg border px-4 py-3 text-sm ${"error"===T.tone?"border-red-200 bg-red-50 text-red-700 dark:border-red-500/40 dark:bg-red-900/30 dark:text-red-200":"border-emerald-200 bg-emerald-50 text-emerald-700 dark:border-emerald-500/40 dark:bg-emerald-900/30 dark:text-emerald-200"}`,children:T.text}),z?(0,b.jsx)("div",{className:`${ac} p-10`,children:(0,b.jsxs)("div",{className:"flex flex-col items-center gap-3",children:[(0,b.jsx)("span",{className:"loading loading-spinner loading-md text-primary"}),(0,b.jsx)("p",{className:"text-sm text-slate-500 dark:text-slate-400",children:"Loading credentials..."})]})}):(0,b.jsxs)("div",{className:"space-y-6",children:[(0,b.jsxs)("section",{className:ac,children:[(0,b.jsxs)("div",{className:ad,children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h2",{className:"text-lg font-bold text-slate-900 dark:text-white",children:"GitHub Credentials"}),(0,b.jsx)("p",{className:"mt-1 text-sm text-slate-500 dark:text-slate-400",children:"Access private repositories and Gists."})]}),(0,b.jsxs)("button",{className:af,onClick:()=>void Z(),disabled:"github"===L,children:["github"===L?(0,b.jsx)("span",{className:"loading loading-spinner loading-xs"}):(0,b.jsx)(l.KeyRound,{className:"h-4 w-4"}),"Add Token"]})]}),(0,b.jsxs)("div",{className:"border-b border-slate-100 bg-slate-50/40 px-6 py-4 dark:border-slate-700/50 dark:bg-slate-900/35",children:[(0,b.jsx)("label",{className:"mb-2 block text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400",children:"Personal Access Token"}),(0,b.jsx)("input",{type:"password",className:ae,placeholder:"ghp_xxx",value:B,onChange:a=>C(a.target.value),disabled:"github"===L})]}),0===V.length?(0,b.jsx)("div",{className:"px-6 py-6 text-sm text-slate-500 dark:text-slate-400",children:"No GitHub credentials saved."}):(0,b.jsx)("div",{className:"divide-y divide-slate-100 dark:divide-slate-700/50",children:V.map(a=>(0,b.jsxs)("div",{className:"group flex items-center justify-between gap-4 px-6 py-5 transition-colors hover:bg-slate-50 dark:hover:bg-slate-800/50",children:[(0,b.jsxs)("div",{className:"flex min-w-0 items-center gap-4",children:[(0,b.jsx)("div",{className:"flex h-10 w-10 items-center justify-center rounded-lg bg-slate-100 dark:bg-slate-700/60",children:(0,b.jsx)(x,{type:"github"})}),(0,b.jsxs)("div",{className:"min-w-0",children:[(0,b.jsx)("div",{className:"truncate text-sm font-semibold text-slate-900 dark:text-white",children:a.username}),(0,b.jsxs)("div",{className:"mt-0.5 text-xs text-slate-500 dark:text-slate-400",children:["Updated ",new Date(a.updatedAt).toLocaleString()]})]})]}),(0,b.jsx)("button",{className:`${ah} opacity-0 group-hover:opacity-100 disabled:opacity-40`,onClick:()=>void aa(a),disabled:P===a.id,title:"Delete",children:P===a.id?(0,b.jsx)("span",{className:"loading loading-spinner loading-xs"}):(0,b.jsx)(m.Trash2,{className:"h-4 w-4"})})]},a.id))})]}),(0,b.jsxs)("section",{className:ac,children:[(0,b.jsxs)("div",{className:ad,children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h2",{className:"text-lg font-bold text-slate-900 dark:text-white",children:"GitLab Credentials"}),(0,b.jsx)("p",{className:"mt-1 text-sm text-slate-500 dark:text-slate-400",children:"Connect to self-hosted or cloud GitLab instances."})]}),(0,b.jsxs)("button",{className:ag,onClick:()=>void $(),disabled:"gitlab"===L,children:["gitlab"===L?(0,b.jsx)("span",{className:"loading loading-spinner loading-xs"}):(0,b.jsx)(l.KeyRound,{className:"h-4 w-4"}),"Add Instance"]})]}),(0,b.jsxs)("div",{className:"space-y-4 border-b border-slate-100 bg-slate-50/40 px-6 py-4 dark:border-slate-700/50 dark:bg-slate-900/35",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"mb-2 block text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400",children:"Server URL"}),(0,b.jsx)("input",{type:"url",className:ae,placeholder:q,value:F,onChange:a=>G(a.target.value),disabled:"gitlab"===L})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"mb-2 block text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400",children:"Personal Access Token"}),(0,b.jsx)("input",{type:"password",className:ae,placeholder:"glpat-xxx",value:D,onChange:a=>E(a.target.value),disabled:"gitlab"===L})]})]}),0===W.length?(0,b.jsx)("div",{className:"px-6 py-6 text-sm text-slate-500 dark:text-slate-400",children:"No GitLab credentials saved."}):(0,b.jsx)("div",{className:"divide-y divide-slate-100 dark:divide-slate-700/50",children:W.map(a=>(0,b.jsxs)("div",{className:"group flex items-center justify-between gap-4 px-6 py-5 transition-colors hover:bg-slate-50 dark:hover:bg-slate-800/50",children:[(0,b.jsxs)("div",{className:"flex min-w-0 items-center gap-4",children:[(0,b.jsx)("div",{className:"flex h-10 w-10 items-center justify-center rounded-lg bg-orange-50 dark:border dark:border-orange-500/20 dark:bg-orange-500/10",children:(0,b.jsx)(x,{type:"gitlab"})}),(0,b.jsxs)("div",{className:"min-w-0",children:[(0,b.jsx)("div",{className:"truncate text-sm font-semibold text-slate-900 dark:text-white",children:a.username}),(0,b.jsx)("div",{className:"truncate text-xs text-slate-500 dark:text-slate-400",children:a.serverUrl}),(0,b.jsxs)("div",{className:"mt-0.5 text-xs text-slate-500 dark:text-slate-400",children:["Updated ",new Date(a.updatedAt).toLocaleString()]})]})]}),(0,b.jsx)("button",{className:`${ah} opacity-0 group-hover:opacity-100 disabled:opacity-40`,onClick:()=>void aa(a),disabled:P===a.id,title:"Delete",children:P===a.id?(0,b.jsx)("span",{className:"loading loading-spinner loading-xs"}):(0,b.jsx)(m.Trash2,{className:"h-4 w-4"})})]},a.id))})]}),v.map(a=>{let c=X.get(a),d=N===a,e=R===a;return(0,b.jsxs)("section",{className:ac,children:[(0,b.jsxs)("div",{className:ad,children:[(0,b.jsxs)("div",{className:"flex items-center gap-3",children:[(0,b.jsx)("div",{className:"rounded-lg bg-emerald-100 p-1.5 text-emerald-600 dark:border dark:border-emerald-500/20 dark:bg-emerald-500/10 dark:text-emerald-400",children:(0,b.jsx)(l.KeyRound,{className:"h-5 w-5"})}),(0,b.jsxs)("div",{children:[(0,b.jsxs)("h2",{className:"text-lg font-bold text-slate-900 dark:text-white",children:[s[a]," Configuration"]}),(0,b.jsx)("p",{className:"text-sm text-slate-500 dark:text-slate-400",children:"Configure access for LLM capabilities."})]})]}),(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[c&&(0,b.jsxs)("button",{className:ag,onClick:()=>void ab(a),disabled:d||e,children:[e?(0,b.jsx)("span",{className:"loading loading-spinner loading-xs"}):(0,b.jsx)(m.Trash2,{className:"h-4 w-4"}),"Remove"]}),(0,b.jsxs)("button",{className:af,onClick:()=>void _(a),disabled:d||e,children:[d?(0,b.jsx)("span",{className:"loading loading-spinner loading-xs"}):(0,b.jsx)(l.KeyRound,{className:"h-4 w-4"}),c?"Save Changes":"Save"]})]})]}),(0,b.jsxs)("div",{className:"space-y-6 p-6",children:[(0,b.jsxs)("div",{className:"max-w-2xl space-y-4",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"mb-2 block text-sm font-medium text-slate-700 dark:text-slate-300",children:"API Key"}),(0,b.jsx)("input",{type:"password",className:ae,placeholder:t[a],value:H[a],onChange:b=>I(c=>({...c,[a]:b.target.value})),disabled:d||e}),(0,b.jsx)("p",{className:"mt-1 text-xs text-slate-500 dark:text-slate-400",children:"Your API key is stored locally and never shared."})]}),(0,b.jsxs)("div",{children:[(0,b.jsxs)("label",{className:"mb-2 block text-sm font-medium text-slate-700 dark:text-slate-300",children:["API Proxy ",(0,b.jsx)("span",{className:"font-normal text-slate-400 dark:text-slate-500",children:"(Optional)"})]}),(0,b.jsx)("input",{type:"url",className:ae,placeholder:u[a],value:J[a],onChange:b=>K(c=>({...c,[a]:b.target.value})),disabled:d||e}),(0,b.jsx)("p",{className:"mt-1 text-xs text-slate-500 dark:text-slate-400",children:"Override this when using a proxy or a compatible endpoint."})]})]}),(0,b.jsx)("div",{className:"rounded-lg border border-slate-200 bg-slate-50 p-3 text-xs text-slate-600 dark:border-slate-700 dark:bg-slate-900/40 dark:text-slate-300",children:c?(0,b.jsxs)("div",{className:"space-y-1",children:[(0,b.jsx)("div",{children:"API key configured."}),(0,b.jsxs)("div",{children:["Updated ",new Date(c.updatedAt).toLocaleString()]}),(0,b.jsxs)("div",{children:["Proxy ",c.apiProxy?c.apiProxy:"not set"]})]}):(0,b.jsx)("div",{children:"No API credential saved."})})]})]},a)}),(0,b.jsx)("div",{className:"pb-2 pt-4 text-center text-xs text-slate-400 dark:text-slate-500",children:"Credentials are encrypted at rest using your system keychain."})]})]})})}a.s(["default",()=>y],12465)}];
1
+ module.exports=[12465,a=>{"use strict";var b=a.i(87924),c=a.i(31028),d=a.i(11916),e=a.i(5050);let f=(0,e.createServerReference)("40011c9b66bdc21f5472590decf1be3cc9562cd1c5",e.callServer,void 0,e.findSourceMapURL,"removeAgentApiCredential"),g=(0,e.createServerReference)("4091a8490f9bd089a13eb2593806dc5116ab4cd96f",e.callServer,void 0,e.findSourceMapURL,"removeCredential"),h=(0,e.createServerReference)("702c26c6b9bfd4c586d26c0ecfa3f8f7b5f4fe8e0e",e.callServer,void 0,e.findSourceMapURL,"saveAgentApiCredential"),i=(0,e.createServerReference)("4051c0a28158f8a13e906979f4ce747a6742aec465",e.callServer,void 0,e.findSourceMapURL,"saveGitHubCredential"),j=(0,e.createServerReference)("60a5c56e15d312abf810cd94da5c0d1ee2319b6d57",e.callServer,void 0,e.findSourceMapURL,"saveGitLabCredential");var k=a.i(50522),l=a.i(37047),m=a.i(81560),n=a.i(71987),o=a.i(50944),p=a.i(72131);let q="https://gitlab.com",r={github:"https://www.google.com/s2/favicons?domain=github.com&sz=64",gitlab:"https://www.google.com/s2/favicons?domain=gitlab.com&sz=64"},s={codex:"Codex CLI"},t={codex:"sk-..."},u={codex:"https://proxy.example.com/v1"},v=["codex"];function w(a){return"github"===a?"GitHub":"GitLab"}function x({type:a}){return(0,b.jsx)(n.default,{src:r[a],alt:`${w(a)} icon`,width:20,height:20,className:"h-5 w-5 rounded-sm",unoptimized:!0})}function y(){let a=(0,o.useRouter)(),[e,n]=(0,p.useState)([]),[r,y]=(0,p.useState)([]),[z,A]=(0,p.useState)(!0),[B,C]=(0,p.useState)(""),[D,E]=(0,p.useState)(""),[F,G]=(0,p.useState)(q),[H,I]=(0,p.useState)({codex:""}),[J,K]=(0,p.useState)({codex:""}),[L,M]=(0,p.useState)(null),[N,O]=(0,p.useState)(null),[P,Q]=(0,p.useState)(null),[R,S]=(0,p.useState)(null),[T,U]=(0,p.useState)(null),V=(0,p.useMemo)(()=>e.filter(a=>"github"===a.type),[e]),W=(0,p.useMemo)(()=>e.filter(a=>"gitlab"===a.type),[e]),X=(0,p.useMemo)(()=>new Map(r.map(a=>[a.agent,a])),[r]),Y=async()=>{let[a,b]=await Promise.all([(0,d.listCredentials)(),(0,c.listAgentApiCredentials)()]);if(!a.success){U({tone:"error",text:a.error}),A(!1);return}if(!b.success){U({tone:"error",text:b.error}),A(!1);return}n(a.credentials),y(b.credentials),K(a=>{let c={...a};for(let a of v)c[a]=b.credentials.find(b=>b.agent===a)?.apiProxy||"";return c}),A(!1)};(0,p.useEffect)(()=>{let a=!0;return(async()=>{let[b,e]=await Promise.all([(0,d.listCredentials)(),(0,c.listAgentApiCredentials)()]);if(a){if(!b.success){U({tone:"error",text:b.error}),A(!1);return}if(!e.success){U({tone:"error",text:e.error}),A(!1);return}n(b.credentials),y(e.credentials),K(a=>{let b={...a};for(let a of v)b[a]=e.credentials.find(b=>b.agent===a)?.apiProxy||"";return b}),A(!1)}})(),()=>{a=!1}},[]);let Z=async()=>{U(null),M("github");let a=await i(B);if(!a.success){U({tone:"error",text:a.error}),M(null);return}C(""),U({tone:"success",text:"GitHub credential added."}),await Y(),M(null)},$=async()=>{U(null),M("gitlab");let a=await j(F,D);if(!a.success){U({tone:"error",text:a.error}),M(null);return}E(""),U({tone:"success",text:"GitLab credential added."}),await Y(),M(null)},_=async a=>{U(null),O(a);let b=await h(a,H[a],J[a]);if(!b.success){U({tone:"error",text:b.error}),O(null);return}I(b=>({...b,[a]:""})),K(c=>({...c,[a]:b.credential.apiProxy||""})),U({tone:"success",text:`${s[a]} credential saved.`}),await Y(),O(null)},aa=async a=>{let b=w(a.type);if(!confirm(`Delete this ${b} credential for ${"gitlab"===a.type?`${a.username} @ ${a.serverUrl}`:a.username}?`))return;U(null),Q(a.id);let c=await g(a.id);if(!c.success){U({tone:"error",text:c.error}),Q(null);return}U({tone:"success",text:`${b} credential deleted.`}),await Y(),Q(null)},ab=async a=>{if(!confirm(`Delete the saved ${s[a]} API credential?`))return;U(null),S(a);let b=await f(a);if(!b.success){U({tone:"error",text:b.error}),S(null);return}I(b=>({...b,[a]:""})),K(b=>({...b,[a]:""})),U({tone:"success",text:`${s[a]} credential deleted.`}),await Y(),S(null)},ac="overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm dark:border-slate-700/50 dark:bg-slate-800 dark:shadow-[0_12px_30px_-18px_rgba(2,6,23,0.9)]",ad="flex flex-col gap-3 border-b border-slate-200 bg-white px-6 py-5 md:flex-row md:items-center md:justify-between dark:border-slate-700/50 dark:bg-slate-800",ae="block w-full rounded-lg border border-slate-200 bg-slate-50 px-3 py-2.5 text-sm text-slate-900 placeholder-slate-400 transition-all focus:border-primary focus:outline-none focus:ring-2 focus:ring-primary/20 disabled:cursor-not-allowed disabled:opacity-60 dark:border-slate-700 dark:bg-slate-900/50 dark:text-white dark:placeholder-slate-500 dark:focus:border-primary/50 dark:focus:bg-slate-900",af="inline-flex items-center justify-center gap-2 rounded-lg bg-primary px-4 py-2 text-sm font-medium text-white shadow-lg shadow-blue-900/20 transition-colors hover:bg-blue-700 disabled:cursor-not-allowed disabled:opacity-60",ag="inline-flex items-center justify-center gap-2 rounded-lg border border-slate-200 bg-white px-4 py-2 text-sm font-medium text-slate-700 shadow-sm transition-colors hover:bg-slate-50 disabled:cursor-not-allowed disabled:opacity-60 dark:border-slate-600 dark:bg-slate-800 dark:text-slate-200 dark:hover:bg-slate-700",ah="inline-flex h-8 w-8 items-center justify-center rounded-lg text-slate-400 transition-all hover:bg-red-50 hover:text-red-500 dark:text-slate-400 dark:hover:bg-red-900/30 dark:hover:text-red-400";return(0,b.jsx)("main",{className:"min-h-screen bg-[#f6f6f8] px-4 py-8 md:px-8 md:py-12 dark:bg-[#0f1117]",children:(0,b.jsxs)("div",{className:"mx-auto w-full max-w-4xl space-y-8",children:[(0,b.jsxs)("div",{className:"mb-8",children:[(0,b.jsxs)("div",{className:"mb-2 flex items-center gap-4",children:[(0,b.jsx)("button",{type:"button",className:"flex h-10 w-10 items-center justify-center rounded-lg text-slate-500 transition-colors hover:bg-white hover:text-slate-900 dark:text-slate-400 dark:hover:bg-slate-800 dark:hover:text-white",onClick:()=>a.push("/"),"aria-label":"Back to home",children:(0,b.jsx)(k.ChevronRight,{className:"h-6 w-6 rotate-180"})}),(0,b.jsx)("h1",{className:"text-3xl font-black tracking-[-0.02em] text-slate-900 md:text-4xl dark:text-white",children:"Credential Management"})]}),(0,b.jsx)("p",{className:"ml-14 text-sm text-slate-500 md:text-base dark:text-slate-400",children:"Manage your API keys and access tokens for third-party services safely."})]}),T&&(0,b.jsx)("div",{className:`rounded-lg border px-4 py-3 text-sm ${"error"===T.tone?"border-red-200 bg-red-50 text-red-700 dark:border-red-500/40 dark:bg-red-900/30 dark:text-red-200":"border-emerald-200 bg-emerald-50 text-emerald-700 dark:border-emerald-500/40 dark:bg-emerald-900/30 dark:text-emerald-200"}`,children:T.text}),z?(0,b.jsx)("div",{className:`${ac} p-10`,children:(0,b.jsxs)("div",{className:"flex flex-col items-center gap-3",children:[(0,b.jsx)("span",{className:"loading loading-spinner loading-md text-primary"}),(0,b.jsx)("p",{className:"text-sm text-slate-500 dark:text-slate-400",children:"Loading credentials..."})]})}):(0,b.jsxs)("div",{className:"space-y-6",children:[(0,b.jsxs)("section",{className:ac,children:[(0,b.jsxs)("div",{className:ad,children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h2",{className:"text-lg font-bold text-slate-900 dark:text-white",children:"GitHub Credentials"}),(0,b.jsx)("p",{className:"mt-1 text-sm text-slate-500 dark:text-slate-400",children:"Access private repositories and Gists."})]}),(0,b.jsxs)("button",{className:af,onClick:()=>void Z(),disabled:"github"===L,children:["github"===L?(0,b.jsx)("span",{className:"loading loading-spinner loading-xs"}):(0,b.jsx)(l.KeyRound,{className:"h-4 w-4"}),"Add Token"]})]}),(0,b.jsxs)("div",{className:"border-b border-slate-100 bg-slate-50/40 px-6 py-4 dark:border-slate-700/50 dark:bg-slate-900/35",children:[(0,b.jsx)("label",{className:"mb-2 block text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400",children:"Personal Access Token"}),(0,b.jsx)("input",{type:"password",className:ae,placeholder:"ghp_xxx",value:B,onChange:a=>C(a.target.value),disabled:"github"===L})]}),0===V.length?(0,b.jsx)("div",{className:"px-6 py-6 text-sm text-slate-500 dark:text-slate-400",children:"No GitHub credentials saved."}):(0,b.jsx)("div",{className:"divide-y divide-slate-100 dark:divide-slate-700/50",children:V.map(a=>(0,b.jsxs)("div",{className:"group flex items-center justify-between gap-4 px-6 py-5 transition-colors hover:bg-slate-50 dark:hover:bg-slate-800/50",children:[(0,b.jsxs)("div",{className:"flex min-w-0 items-center gap-4",children:[(0,b.jsx)("div",{className:"flex h-10 w-10 items-center justify-center rounded-lg bg-slate-100 dark:bg-slate-700/60",children:(0,b.jsx)(x,{type:"github"})}),(0,b.jsxs)("div",{className:"min-w-0",children:[(0,b.jsx)("div",{className:"truncate text-sm font-semibold text-slate-900 dark:text-white",children:a.username}),(0,b.jsxs)("div",{className:"mt-0.5 text-xs text-slate-500 dark:text-slate-400",children:["Updated ",new Date(a.updatedAt).toLocaleString()]})]})]}),(0,b.jsx)("button",{className:`${ah} opacity-0 group-hover:opacity-100 disabled:opacity-40`,onClick:()=>void aa(a),disabled:P===a.id,title:"Delete",children:P===a.id?(0,b.jsx)("span",{className:"loading loading-spinner loading-xs"}):(0,b.jsx)(m.Trash2,{className:"h-4 w-4"})})]},a.id))})]}),(0,b.jsxs)("section",{className:ac,children:[(0,b.jsxs)("div",{className:ad,children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h2",{className:"text-lg font-bold text-slate-900 dark:text-white",children:"GitLab Credentials"}),(0,b.jsx)("p",{className:"mt-1 text-sm text-slate-500 dark:text-slate-400",children:"Connect to self-hosted or cloud GitLab instances."})]}),(0,b.jsxs)("button",{className:ag,onClick:()=>void $(),disabled:"gitlab"===L,children:["gitlab"===L?(0,b.jsx)("span",{className:"loading loading-spinner loading-xs"}):(0,b.jsx)(l.KeyRound,{className:"h-4 w-4"}),"Add Instance"]})]}),(0,b.jsxs)("div",{className:"space-y-4 border-b border-slate-100 bg-slate-50/40 px-6 py-4 dark:border-slate-700/50 dark:bg-slate-900/35",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"mb-2 block text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400",children:"Server URL"}),(0,b.jsx)("input",{type:"url",className:ae,placeholder:q,value:F,onChange:a=>G(a.target.value),disabled:"gitlab"===L})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"mb-2 block text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400",children:"Personal Access Token"}),(0,b.jsx)("input",{type:"password",className:ae,placeholder:"glpat-xxx",value:D,onChange:a=>E(a.target.value),disabled:"gitlab"===L})]})]}),0===W.length?(0,b.jsx)("div",{className:"px-6 py-6 text-sm text-slate-500 dark:text-slate-400",children:"No GitLab credentials saved."}):(0,b.jsx)("div",{className:"divide-y divide-slate-100 dark:divide-slate-700/50",children:W.map(a=>(0,b.jsxs)("div",{className:"group flex items-center justify-between gap-4 px-6 py-5 transition-colors hover:bg-slate-50 dark:hover:bg-slate-800/50",children:[(0,b.jsxs)("div",{className:"flex min-w-0 items-center gap-4",children:[(0,b.jsx)("div",{className:"flex h-10 w-10 items-center justify-center rounded-lg bg-orange-50 dark:border dark:border-orange-500/20 dark:bg-orange-500/10",children:(0,b.jsx)(x,{type:"gitlab"})}),(0,b.jsxs)("div",{className:"min-w-0",children:[(0,b.jsx)("div",{className:"truncate text-sm font-semibold text-slate-900 dark:text-white",children:a.username}),(0,b.jsx)("div",{className:"truncate text-xs text-slate-500 dark:text-slate-400",children:a.serverUrl}),(0,b.jsxs)("div",{className:"mt-0.5 text-xs text-slate-500 dark:text-slate-400",children:["Updated ",new Date(a.updatedAt).toLocaleString()]})]})]}),(0,b.jsx)("button",{className:`${ah} opacity-0 group-hover:opacity-100 disabled:opacity-40`,onClick:()=>void aa(a),disabled:P===a.id,title:"Delete",children:P===a.id?(0,b.jsx)("span",{className:"loading loading-spinner loading-xs"}):(0,b.jsx)(m.Trash2,{className:"h-4 w-4"})})]},a.id))})]}),v.map(a=>{let c=X.get(a),d=N===a,e=R===a;return(0,b.jsxs)("section",{className:ac,children:[(0,b.jsxs)("div",{className:ad,children:[(0,b.jsxs)("div",{className:"flex items-center gap-3",children:[(0,b.jsx)("div",{className:"rounded-lg bg-emerald-100 p-1.5 text-emerald-600 dark:border dark:border-emerald-500/20 dark:bg-emerald-500/10 dark:text-emerald-400",children:(0,b.jsx)(l.KeyRound,{className:"h-5 w-5"})}),(0,b.jsxs)("div",{children:[(0,b.jsxs)("h2",{className:"text-lg font-bold text-slate-900 dark:text-white",children:[s[a]," Configuration"]}),(0,b.jsx)("p",{className:"text-sm text-slate-500 dark:text-slate-400",children:"Configure access for LLM capabilities."})]})]}),(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[c&&(0,b.jsxs)("button",{className:ag,onClick:()=>void ab(a),disabled:d||e,children:[e?(0,b.jsx)("span",{className:"loading loading-spinner loading-xs"}):(0,b.jsx)(m.Trash2,{className:"h-4 w-4"}),"Remove"]}),(0,b.jsxs)("button",{className:af,onClick:()=>void _(a),disabled:d||e,children:[d?(0,b.jsx)("span",{className:"loading loading-spinner loading-xs"}):(0,b.jsx)(l.KeyRound,{className:"h-4 w-4"}),c?"Save Changes":"Save"]})]})]}),(0,b.jsxs)("div",{className:"space-y-6 p-6",children:[(0,b.jsxs)("div",{className:"max-w-2xl space-y-4",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"mb-2 block text-sm font-medium text-slate-700 dark:text-slate-300",children:"API Key"}),(0,b.jsx)("input",{type:"password",className:ae,placeholder:t[a],value:H[a],onChange:b=>I(c=>({...c,[a]:b.target.value})),disabled:d||e}),(0,b.jsx)("p",{className:"mt-1 text-xs text-slate-500 dark:text-slate-400",children:"Your API key is stored locally and never shared."})]}),(0,b.jsxs)("div",{children:[(0,b.jsxs)("label",{className:"mb-2 block text-sm font-medium text-slate-700 dark:text-slate-300",children:["API Proxy ",(0,b.jsx)("span",{className:"font-normal text-slate-400 dark:text-slate-500",children:"(Optional)"})]}),(0,b.jsx)("input",{type:"url",className:ae,placeholder:u[a],value:J[a],onChange:b=>K(c=>({...c,[a]:b.target.value})),disabled:d||e}),(0,b.jsx)("p",{className:"mt-1 text-xs text-slate-500 dark:text-slate-400",children:"Override this when using a proxy or a compatible endpoint."})]})]}),(0,b.jsx)("div",{className:"rounded-lg border border-slate-200 bg-slate-50 p-3 text-xs text-slate-600 dark:border-slate-700 dark:bg-slate-900/40 dark:text-slate-300",children:c?(0,b.jsxs)("div",{className:"space-y-1",children:[(0,b.jsx)("div",{children:"API key configured."}),(0,b.jsxs)("div",{children:["Updated ",new Date(c.updatedAt).toLocaleString()]}),(0,b.jsxs)("div",{children:["Proxy ",c.apiProxy?c.apiProxy:"not set"]})]}):(0,b.jsx)("div",{children:"No API credential saved."})})]})]},a)}),(0,b.jsx)("div",{className:"pb-2 pt-4 text-center text-xs text-slate-400 dark:text-slate-500",children:"Credentials are encrypted at rest using your system keychain."})]})]})})}a.s(["default",()=>y],12465)}];
2
2
 
3
3
  //# sourceMappingURL=src_app_credentials_page_tsx_63d8d34a._.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/app/credentials/page.tsx","../../../../src/app/actions/data%3A10cc75%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A6f20bb%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A512afd%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A2a8dcf%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A808270%20%3Ctext/javascript%3E"],"sourcesContent":["'use client';\n\nimport {\n listAgentApiCredentials,\n listCredentials,\n removeAgentApiCredential,\n removeCredential,\n saveAgentApiCredential,\n saveGitHubCredential,\n saveGitLabCredential,\n} from '@/app/actions/credentials';\nimport type {\n AgentApiCredential,\n AgentApiCredentialAgent,\n} from '@/lib/agent-api-credentials';\nimport type { Credential, CredentialType, GitLabCredential } from '@/lib/credentials';\nimport { ChevronRight, KeyRound, Trash2 } from 'lucide-react';\nimport Image from 'next/image';\nimport { useRouter } from 'next/navigation';\nimport { useEffect, useMemo, useState } from 'react';\n\nconst DEFAULT_GITLAB_SERVER_URL = 'https://gitlab.com';\nconst PROVIDER_ICON_URLS = {\n github: 'https://www.google.com/s2/favicons?domain=github.com&sz=64',\n gitlab: 'https://www.google.com/s2/favicons?domain=gitlab.com&sz=64',\n} as const;\nconst AGENT_API_LABELS: Record<AgentApiCredentialAgent, string> = {\n codex: 'Codex CLI',\n};\nconst AGENT_API_KEY_PLACEHOLDERS: Record<AgentApiCredentialAgent, string> = {\n codex: 'sk-...',\n};\nconst AGENT_API_PROXY_PLACEHOLDERS: Record<AgentApiCredentialAgent, string> = {\n codex: 'https://proxy.example.com/v1',\n};\nconst AGENT_API_ORDER: AgentApiCredentialAgent[] = ['codex'];\n\ntype FlashMessage = {\n tone: 'success' | 'error';\n text: string;\n} | null;\n\nfunction formatCredentialSubtitle(credential: Credential): string {\n if (credential.type === 'gitlab') {\n return `${credential.username} @ ${credential.serverUrl}`;\n }\n return credential.username;\n}\n\nfunction formatProviderLabel(type: CredentialType): string {\n return type === 'github' ? 'GitHub' : 'GitLab';\n}\n\nfunction ProviderIcon({ type }: { type: CredentialType }) {\n return (\n <Image\n src={PROVIDER_ICON_URLS[type]}\n alt={`${formatProviderLabel(type)} icon`}\n width={20}\n height={20}\n className=\"h-5 w-5 rounded-sm\"\n unoptimized\n />\n );\n}\n\nexport default function CredentialsPage() {\n const router = useRouter();\n\n const [credentials, setCredentials] = useState<Credential[]>([]);\n const [agentApiCredentials, setAgentApiCredentials] = useState<AgentApiCredential[]>([]);\n const [loading, setLoading] = useState(true);\n\n const [githubToken, setGitHubToken] = useState('');\n const [gitlabToken, setGitLabToken] = useState('');\n const [gitlabServerUrl, setGitLabServerUrl] = useState(DEFAULT_GITLAB_SERVER_URL);\n const [agentApiKeyInputs, setAgentApiKeyInputs] = useState<Record<AgentApiCredentialAgent, string>>({\n codex: '',\n });\n const [agentApiProxyInputs, setAgentApiProxyInputs] = useState<Record<AgentApiCredentialAgent, string>>({\n codex: '',\n });\n\n const [savingType, setSavingType] = useState<CredentialType | null>(null);\n const [savingAgent, setSavingAgent] = useState<AgentApiCredentialAgent | null>(null);\n const [deletingId, setDeletingId] = useState<string | null>(null);\n const [deletingAgent, setDeletingAgent] = useState<AgentApiCredentialAgent | null>(null);\n const [flashMessage, setFlashMessage] = useState<FlashMessage>(null);\n\n const githubCredentials = useMemo(\n () => credentials.filter((credential) => credential.type === 'github'),\n [credentials],\n );\n\n const gitlabCredentials = useMemo(\n () => credentials.filter((credential) => credential.type === 'gitlab') as GitLabCredential[],\n [credentials],\n );\n\n const agentApiCredentialMap = useMemo(() => {\n return new Map(agentApiCredentials.map((credential) => [credential.agent, credential]));\n }, [agentApiCredentials]);\n\n const reloadCredentials = async () => {\n const [gitResult, agentResult] = await Promise.all([\n listCredentials(),\n listAgentApiCredentials(),\n ]);\n\n if (!gitResult.success) {\n setFlashMessage({ tone: 'error', text: gitResult.error });\n setLoading(false);\n return;\n }\n\n if (!agentResult.success) {\n setFlashMessage({ tone: 'error', text: agentResult.error });\n setLoading(false);\n return;\n }\n\n setCredentials(gitResult.credentials);\n setAgentApiCredentials(agentResult.credentials);\n setAgentApiProxyInputs((previous) => {\n const next = { ...previous };\n for (const agent of AGENT_API_ORDER) {\n next[agent] = agentResult.credentials.find((credential) => credential.agent === agent)?.apiProxy || '';\n }\n return next;\n });\n setLoading(false);\n };\n\n useEffect(() => {\n let isActive = true;\n\n void (async () => {\n const [gitResult, agentResult] = await Promise.all([\n listCredentials(),\n listAgentApiCredentials(),\n ]);\n if (!isActive) return;\n\n if (!gitResult.success) {\n setFlashMessage({ tone: 'error', text: gitResult.error });\n setLoading(false);\n return;\n }\n\n if (!agentResult.success) {\n setFlashMessage({ tone: 'error', text: agentResult.error });\n setLoading(false);\n return;\n }\n\n setCredentials(gitResult.credentials);\n setAgentApiCredentials(agentResult.credentials);\n setAgentApiProxyInputs((previous) => {\n const next = { ...previous };\n for (const agent of AGENT_API_ORDER) {\n next[agent] = agentResult.credentials.find((credential) => credential.agent === agent)?.apiProxy || '';\n }\n return next;\n });\n setLoading(false);\n })();\n\n return () => {\n isActive = false;\n };\n }, []);\n\n const handleSaveGitHub = async () => {\n setFlashMessage(null);\n setSavingType('github');\n\n const result = await saveGitHubCredential(githubToken);\n if (!result.success) {\n setFlashMessage({ tone: 'error', text: result.error });\n setSavingType(null);\n return;\n }\n\n setGitHubToken('');\n setFlashMessage({ tone: 'success', text: 'GitHub credential added.' });\n await reloadCredentials();\n setSavingType(null);\n };\n\n const handleSaveGitLab = async () => {\n setFlashMessage(null);\n setSavingType('gitlab');\n\n const result = await saveGitLabCredential(gitlabServerUrl, gitlabToken);\n if (!result.success) {\n setFlashMessage({ tone: 'error', text: result.error });\n setSavingType(null);\n return;\n }\n\n setGitLabToken('');\n setFlashMessage({ tone: 'success', text: 'GitLab credential added.' });\n await reloadCredentials();\n setSavingType(null);\n };\n\n const handleSaveAgentApi = async (agent: AgentApiCredentialAgent) => {\n setFlashMessage(null);\n setSavingAgent(agent);\n\n const result = await saveAgentApiCredential(\n agent,\n agentApiKeyInputs[agent],\n agentApiProxyInputs[agent],\n );\n if (!result.success) {\n setFlashMessage({ tone: 'error', text: result.error });\n setSavingAgent(null);\n return;\n }\n\n setAgentApiKeyInputs((previous) => ({ ...previous, [agent]: '' }));\n setAgentApiProxyInputs((previous) => ({ ...previous, [agent]: result.credential.apiProxy || '' }));\n setFlashMessage({ tone: 'success', text: `${AGENT_API_LABELS[agent]} credential saved.` });\n await reloadCredentials();\n setSavingAgent(null);\n };\n\n const handleDelete = async (credential: Credential) => {\n const providerLabel = formatProviderLabel(credential.type);\n const confirmed = confirm(`Delete this ${providerLabel} credential for ${formatCredentialSubtitle(credential)}?`);\n if (!confirmed) return;\n\n setFlashMessage(null);\n setDeletingId(credential.id);\n\n const result = await removeCredential(credential.id);\n if (!result.success) {\n setFlashMessage({ tone: 'error', text: result.error });\n setDeletingId(null);\n return;\n }\n\n setFlashMessage({ tone: 'success', text: `${providerLabel} credential deleted.` });\n await reloadCredentials();\n setDeletingId(null);\n };\n\n const handleDeleteAgentApi = async (agent: AgentApiCredentialAgent) => {\n const confirmed = confirm(`Delete the saved ${AGENT_API_LABELS[agent]} API credential?`);\n if (!confirmed) return;\n\n setFlashMessage(null);\n setDeletingAgent(agent);\n\n const result = await removeAgentApiCredential(agent);\n if (!result.success) {\n setFlashMessage({ tone: 'error', text: result.error });\n setDeletingAgent(null);\n return;\n }\n\n setAgentApiKeyInputs((previous) => ({ ...previous, [agent]: '' }));\n setAgentApiProxyInputs((previous) => ({ ...previous, [agent]: '' }));\n setFlashMessage({ tone: 'success', text: `${AGENT_API_LABELS[agent]} credential deleted.` });\n await reloadCredentials();\n setDeletingAgent(null);\n };\n\n const panelClass = 'overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm dark:border-slate-700/50 dark:bg-slate-800 dark:shadow-[0_12px_30px_-18px_rgba(2,6,23,0.9)]';\n const sectionHeaderClass = 'flex flex-col gap-3 border-b border-slate-200 bg-white px-6 py-5 md:flex-row md:items-center md:justify-between dark:border-slate-700/50 dark:bg-slate-800';\n const inputClass = 'block w-full rounded-lg border border-slate-200 bg-slate-50 px-3 py-2.5 text-sm text-slate-900 placeholder-slate-400 transition-all focus:border-primary focus:outline-none focus:ring-2 focus:ring-primary/20 disabled:cursor-not-allowed disabled:opacity-60 dark:border-slate-700 dark:bg-slate-900/50 dark:text-white dark:placeholder-slate-500 dark:focus:border-primary/50 dark:focus:bg-slate-900';\n const primaryButtonClass = 'inline-flex items-center justify-center gap-2 rounded-lg bg-primary px-4 py-2 text-sm font-medium text-white shadow-lg shadow-blue-900/20 transition-colors hover:bg-blue-700 disabled:cursor-not-allowed disabled:opacity-60';\n const secondaryButtonClass = 'inline-flex items-center justify-center gap-2 rounded-lg border border-slate-200 bg-white px-4 py-2 text-sm font-medium text-slate-700 shadow-sm transition-colors hover:bg-slate-50 disabled:cursor-not-allowed disabled:opacity-60 dark:border-slate-600 dark:bg-slate-800 dark:text-slate-200 dark:hover:bg-slate-700';\n const rowActionButtonClass = 'inline-flex h-8 w-8 items-center justify-center rounded-lg text-slate-400 transition-all hover:bg-red-50 hover:text-red-500 dark:text-slate-400 dark:hover:bg-red-900/30 dark:hover:text-red-400';\n\n return (\n <main className=\"min-h-screen bg-[#f6f6f8] px-4 py-8 md:px-8 md:py-12 dark:bg-[#0f1117]\">\n <div className=\"mx-auto w-full max-w-4xl space-y-8\">\n <div className=\"mb-8\">\n <div className=\"mb-2 flex items-center gap-4\">\n <button\n type=\"button\"\n className=\"flex h-10 w-10 items-center justify-center rounded-lg text-slate-500 transition-colors hover:bg-white hover:text-slate-900 dark:text-slate-400 dark:hover:bg-slate-800 dark:hover:text-white\"\n onClick={() => router.push('/')}\n aria-label=\"Back to home\"\n >\n <ChevronRight className=\"h-6 w-6 rotate-180\" />\n </button>\n <h1 className=\"text-3xl font-black tracking-[-0.02em] text-slate-900 md:text-4xl dark:text-white\">Credential Management</h1>\n </div>\n <p className=\"ml-14 text-sm text-slate-500 md:text-base dark:text-slate-400\">\n Manage your API keys and access tokens for third-party services safely.\n </p>\n </div>\n\n {flashMessage && (\n <div\n className={`rounded-lg border px-4 py-3 text-sm ${\n flashMessage.tone === 'error'\n ? 'border-red-200 bg-red-50 text-red-700 dark:border-red-500/40 dark:bg-red-900/30 dark:text-red-200'\n : 'border-emerald-200 bg-emerald-50 text-emerald-700 dark:border-emerald-500/40 dark:bg-emerald-900/30 dark:text-emerald-200'\n }`}\n >\n {flashMessage.text}\n </div>\n )}\n\n {loading ? (\n <div className={`${panelClass} p-10`}>\n <div className=\"flex flex-col items-center gap-3\">\n <span className=\"loading loading-spinner loading-md text-primary\"></span>\n <p className=\"text-sm text-slate-500 dark:text-slate-400\">Loading credentials...</p>\n </div>\n </div>\n ) : (\n <div className=\"space-y-6\">\n <section className={panelClass}>\n <div className={sectionHeaderClass}>\n <div>\n <h2 className=\"text-lg font-bold text-slate-900 dark:text-white\">GitHub Credentials</h2>\n <p className=\"mt-1 text-sm text-slate-500 dark:text-slate-400\">Access private repositories and Gists.</p>\n </div>\n <button\n className={primaryButtonClass}\n onClick={() => void handleSaveGitHub()}\n disabled={savingType === 'github'}\n >\n {savingType === 'github' ? <span className=\"loading loading-spinner loading-xs\"></span> : <KeyRound className=\"h-4 w-4\" />}\n Add Token\n </button>\n </div>\n\n <div className=\"border-b border-slate-100 bg-slate-50/40 px-6 py-4 dark:border-slate-700/50 dark:bg-slate-900/35\">\n <label className=\"mb-2 block text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400\">\n Personal Access Token\n </label>\n <input\n type=\"password\"\n className={inputClass}\n placeholder=\"ghp_xxx\"\n value={githubToken}\n onChange={(event) => setGitHubToken(event.target.value)}\n disabled={savingType === 'github'}\n />\n </div>\n\n {githubCredentials.length === 0 ? (\n <div className=\"px-6 py-6 text-sm text-slate-500 dark:text-slate-400\">No GitHub credentials saved.</div>\n ) : (\n <div className=\"divide-y divide-slate-100 dark:divide-slate-700/50\">\n {githubCredentials.map((credential) => (\n <div\n key={credential.id}\n className=\"group flex items-center justify-between gap-4 px-6 py-5 transition-colors hover:bg-slate-50 dark:hover:bg-slate-800/50\"\n >\n <div className=\"flex min-w-0 items-center gap-4\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-slate-100 dark:bg-slate-700/60\">\n <ProviderIcon type=\"github\" />\n </div>\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-semibold text-slate-900 dark:text-white\">{credential.username}</div>\n <div className=\"mt-0.5 text-xs text-slate-500 dark:text-slate-400\">\n Updated {new Date(credential.updatedAt).toLocaleString()}\n </div>\n </div>\n </div>\n <button\n className={`${rowActionButtonClass} opacity-0 group-hover:opacity-100 disabled:opacity-40`}\n onClick={() => void handleDelete(credential)}\n disabled={deletingId === credential.id}\n title=\"Delete\"\n >\n {deletingId === credential.id ? <span className=\"loading loading-spinner loading-xs\"></span> : <Trash2 className=\"h-4 w-4\" />}\n </button>\n </div>\n ))}\n </div>\n )}\n </section>\n\n <section className={panelClass}>\n <div className={sectionHeaderClass}>\n <div>\n <h2 className=\"text-lg font-bold text-slate-900 dark:text-white\">GitLab Credentials</h2>\n <p className=\"mt-1 text-sm text-slate-500 dark:text-slate-400\">Connect to self-hosted or cloud GitLab instances.</p>\n </div>\n <button\n className={secondaryButtonClass}\n onClick={() => void handleSaveGitLab()}\n disabled={savingType === 'gitlab'}\n >\n {savingType === 'gitlab' ? <span className=\"loading loading-spinner loading-xs\"></span> : <KeyRound className=\"h-4 w-4\" />}\n Add Instance\n </button>\n </div>\n\n <div className=\"space-y-4 border-b border-slate-100 bg-slate-50/40 px-6 py-4 dark:border-slate-700/50 dark:bg-slate-900/35\">\n <div>\n <label className=\"mb-2 block text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400\">\n Server URL\n </label>\n <input\n type=\"url\"\n className={inputClass}\n placeholder={DEFAULT_GITLAB_SERVER_URL}\n value={gitlabServerUrl}\n onChange={(event) => setGitLabServerUrl(event.target.value)}\n disabled={savingType === 'gitlab'}\n />\n </div>\n <div>\n <label className=\"mb-2 block text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400\">\n Personal Access Token\n </label>\n <input\n type=\"password\"\n className={inputClass}\n placeholder=\"glpat-xxx\"\n value={gitlabToken}\n onChange={(event) => setGitLabToken(event.target.value)}\n disabled={savingType === 'gitlab'}\n />\n </div>\n </div>\n\n {gitlabCredentials.length === 0 ? (\n <div className=\"px-6 py-6 text-sm text-slate-500 dark:text-slate-400\">No GitLab credentials saved.</div>\n ) : (\n <div className=\"divide-y divide-slate-100 dark:divide-slate-700/50\">\n {gitlabCredentials.map((credential) => (\n <div\n key={credential.id}\n className=\"group flex items-center justify-between gap-4 px-6 py-5 transition-colors hover:bg-slate-50 dark:hover:bg-slate-800/50\"\n >\n <div className=\"flex min-w-0 items-center gap-4\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-orange-50 dark:border dark:border-orange-500/20 dark:bg-orange-500/10\">\n <ProviderIcon type=\"gitlab\" />\n </div>\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-semibold text-slate-900 dark:text-white\">{credential.username}</div>\n <div className=\"truncate text-xs text-slate-500 dark:text-slate-400\">{credential.serverUrl}</div>\n <div className=\"mt-0.5 text-xs text-slate-500 dark:text-slate-400\">\n Updated {new Date(credential.updatedAt).toLocaleString()}\n </div>\n </div>\n </div>\n <button\n className={`${rowActionButtonClass} opacity-0 group-hover:opacity-100 disabled:opacity-40`}\n onClick={() => void handleDelete(credential)}\n disabled={deletingId === credential.id}\n title=\"Delete\"\n >\n {deletingId === credential.id ? <span className=\"loading loading-spinner loading-xs\"></span> : <Trash2 className=\"h-4 w-4\" />}\n </button>\n </div>\n ))}\n </div>\n )}\n </section>\n\n {AGENT_API_ORDER.map((agent) => {\n const configuredCredential = agentApiCredentialMap.get(agent);\n const isSaving = savingAgent === agent;\n const isDeleting = deletingAgent === agent;\n\n return (\n <section key={agent} className={panelClass}>\n <div className={sectionHeaderClass}>\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-emerald-100 p-1.5 text-emerald-600 dark:border dark:border-emerald-500/20 dark:bg-emerald-500/10 dark:text-emerald-400\">\n <KeyRound className=\"h-5 w-5\" />\n </div>\n <div>\n <h2 className=\"text-lg font-bold text-slate-900 dark:text-white\">{AGENT_API_LABELS[agent]} Configuration</h2>\n <p className=\"text-sm text-slate-500 dark:text-slate-400\">Configure access for LLM capabilities.</p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n {configuredCredential && (\n <button\n className={secondaryButtonClass}\n onClick={() => void handleDeleteAgentApi(agent)}\n disabled={isSaving || isDeleting}\n >\n {isDeleting ? <span className=\"loading loading-spinner loading-xs\"></span> : <Trash2 className=\"h-4 w-4\" />}\n Remove\n </button>\n )}\n <button\n className={primaryButtonClass}\n onClick={() => void handleSaveAgentApi(agent)}\n disabled={isSaving || isDeleting}\n >\n {isSaving ? <span className=\"loading loading-spinner loading-xs\"></span> : <KeyRound className=\"h-4 w-4\" />}\n {configuredCredential ? 'Save Changes' : 'Save'}\n </button>\n </div>\n </div>\n\n <div className=\"space-y-6 p-6\">\n <div className=\"max-w-2xl space-y-4\">\n <div>\n <label className=\"mb-2 block text-sm font-medium text-slate-700 dark:text-slate-300\">API Key</label>\n <input\n type=\"password\"\n className={inputClass}\n placeholder={AGENT_API_KEY_PLACEHOLDERS[agent]}\n value={agentApiKeyInputs[agent]}\n onChange={(event) =>\n setAgentApiKeyInputs((previous) => ({ ...previous, [agent]: event.target.value }))\n }\n disabled={isSaving || isDeleting}\n />\n <p className=\"mt-1 text-xs text-slate-500 dark:text-slate-400\">\n Your API key is stored locally and never shared.\n </p>\n </div>\n\n <div>\n <label className=\"mb-2 block text-sm font-medium text-slate-700 dark:text-slate-300\">\n API Proxy <span className=\"font-normal text-slate-400 dark:text-slate-500\">(Optional)</span>\n </label>\n <input\n type=\"url\"\n className={inputClass}\n placeholder={AGENT_API_PROXY_PLACEHOLDERS[agent]}\n value={agentApiProxyInputs[agent]}\n onChange={(event) =>\n setAgentApiProxyInputs((previous) => ({ ...previous, [agent]: event.target.value }))\n }\n disabled={isSaving || isDeleting}\n />\n <p className=\"mt-1 text-xs text-slate-500 dark:text-slate-400\">\n Override this when using a proxy or a compatible endpoint.\n </p>\n </div>\n </div>\n\n <div className=\"rounded-lg border border-slate-200 bg-slate-50 p-3 text-xs text-slate-600 dark:border-slate-700 dark:bg-slate-900/40 dark:text-slate-300\">\n {configuredCredential ? (\n <div className=\"space-y-1\">\n <div>API key configured.</div>\n <div>Updated {new Date(configuredCredential.updatedAt).toLocaleString()}</div>\n <div>Proxy {configuredCredential.apiProxy ? configuredCredential.apiProxy : 'not set'}</div>\n </div>\n ) : (\n <div>No API credential saved.</div>\n )}\n </div>\n </div>\n </section>\n );\n })}\n\n <div className=\"pb-2 pt-4 text-center text-xs text-slate-400 dark:text-slate-500\">\n Credentials are encrypted at rest using your system keychain.\n </div>\n </div>\n )}\n </div>\n </main>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"401ccdad137644781bb0cc644754cd1e07cc30c07a\":\"removeAgentApiCredential\"},\"src/app/actions/credentials.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_6=/*#__PURE__*/createServerReference(\"401ccdad137644781bb0cc644754cd1e07cc30c07a\",callServer,void 0,findSourceMapURL,\"removeAgentApiCredential\");export{$$RSC_SERVER_ACTION_6 as removeAgentApiCredential};","/* __next_internal_action_entry_do_not_use__ [{\"40788d8f719ddaee4adf946788d566d092caf643c4\":\"removeCredential\"},\"src/app/actions/credentials.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_5=/*#__PURE__*/createServerReference(\"40788d8f719ddaee4adf946788d566d092caf643c4\",callServer,void 0,findSourceMapURL,\"removeCredential\");export{$$RSC_SERVER_ACTION_5 as removeCredential};","/* __next_internal_action_entry_do_not_use__ [{\"70121d2a500dd68bf95288b8f4c731abd8738af90a\":\"saveAgentApiCredential\"},\"src/app/actions/credentials.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_4=/*#__PURE__*/createServerReference(\"70121d2a500dd68bf95288b8f4c731abd8738af90a\",callServer,void 0,findSourceMapURL,\"saveAgentApiCredential\");export{$$RSC_SERVER_ACTION_4 as saveAgentApiCredential};","/* __next_internal_action_entry_do_not_use__ [{\"40b8f9d3358929e5e27e89239b78cbf430ebe36152\":\"saveGitHubCredential\"},\"src/app/actions/credentials.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_1=/*#__PURE__*/createServerReference(\"40b8f9d3358929e5e27e89239b78cbf430ebe36152\",callServer,void 0,findSourceMapURL,\"saveGitHubCredential\");export{$$RSC_SERVER_ACTION_1 as saveGitHubCredential};","/* __next_internal_action_entry_do_not_use__ [{\"606b0008567600dac7b5d52fc52279f3d249969a79\":\"saveGitLabCredential\"},\"src/app/actions/credentials.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_2=/*#__PURE__*/createServerReference(\"606b0008567600dac7b5d52fc52279f3d249969a79\",callServer,void 0,findSourceMapURL,\"saveGitLabCredential\");export{$$RSC_SERVER_ACTION_2 as saveGitLabCredential};"],"names":[],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/app/credentials/page.tsx","../../../../src/app/actions/data%3A18df35%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Aa29f01%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Aac2dca%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Ab4ac6f%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A84d306%20%3Ctext/javascript%3E"],"sourcesContent":["'use client';\n\nimport {\n listAgentApiCredentials,\n listCredentials,\n removeAgentApiCredential,\n removeCredential,\n saveAgentApiCredential,\n saveGitHubCredential,\n saveGitLabCredential,\n} from '@/app/actions/credentials';\nimport type {\n AgentApiCredential,\n AgentApiCredentialAgent,\n} from '@/lib/agent-api-credentials';\nimport type { Credential, CredentialType, GitLabCredential } from '@/lib/credentials';\nimport { ChevronRight, KeyRound, Trash2 } from 'lucide-react';\nimport Image from 'next/image';\nimport { useRouter } from 'next/navigation';\nimport { useEffect, useMemo, useState } from 'react';\n\nconst DEFAULT_GITLAB_SERVER_URL = 'https://gitlab.com';\nconst PROVIDER_ICON_URLS = {\n github: 'https://www.google.com/s2/favicons?domain=github.com&sz=64',\n gitlab: 'https://www.google.com/s2/favicons?domain=gitlab.com&sz=64',\n} as const;\nconst AGENT_API_LABELS: Record<AgentApiCredentialAgent, string> = {\n codex: 'Codex CLI',\n};\nconst AGENT_API_KEY_PLACEHOLDERS: Record<AgentApiCredentialAgent, string> = {\n codex: 'sk-...',\n};\nconst AGENT_API_PROXY_PLACEHOLDERS: Record<AgentApiCredentialAgent, string> = {\n codex: 'https://proxy.example.com/v1',\n};\nconst AGENT_API_ORDER: AgentApiCredentialAgent[] = ['codex'];\n\ntype FlashMessage = {\n tone: 'success' | 'error';\n text: string;\n} | null;\n\nfunction formatCredentialSubtitle(credential: Credential): string {\n if (credential.type === 'gitlab') {\n return `${credential.username} @ ${credential.serverUrl}`;\n }\n return credential.username;\n}\n\nfunction formatProviderLabel(type: CredentialType): string {\n return type === 'github' ? 'GitHub' : 'GitLab';\n}\n\nfunction ProviderIcon({ type }: { type: CredentialType }) {\n return (\n <Image\n src={PROVIDER_ICON_URLS[type]}\n alt={`${formatProviderLabel(type)} icon`}\n width={20}\n height={20}\n className=\"h-5 w-5 rounded-sm\"\n unoptimized\n />\n );\n}\n\nexport default function CredentialsPage() {\n const router = useRouter();\n\n const [credentials, setCredentials] = useState<Credential[]>([]);\n const [agentApiCredentials, setAgentApiCredentials] = useState<AgentApiCredential[]>([]);\n const [loading, setLoading] = useState(true);\n\n const [githubToken, setGitHubToken] = useState('');\n const [gitlabToken, setGitLabToken] = useState('');\n const [gitlabServerUrl, setGitLabServerUrl] = useState(DEFAULT_GITLAB_SERVER_URL);\n const [agentApiKeyInputs, setAgentApiKeyInputs] = useState<Record<AgentApiCredentialAgent, string>>({\n codex: '',\n });\n const [agentApiProxyInputs, setAgentApiProxyInputs] = useState<Record<AgentApiCredentialAgent, string>>({\n codex: '',\n });\n\n const [savingType, setSavingType] = useState<CredentialType | null>(null);\n const [savingAgent, setSavingAgent] = useState<AgentApiCredentialAgent | null>(null);\n const [deletingId, setDeletingId] = useState<string | null>(null);\n const [deletingAgent, setDeletingAgent] = useState<AgentApiCredentialAgent | null>(null);\n const [flashMessage, setFlashMessage] = useState<FlashMessage>(null);\n\n const githubCredentials = useMemo(\n () => credentials.filter((credential) => credential.type === 'github'),\n [credentials],\n );\n\n const gitlabCredentials = useMemo(\n () => credentials.filter((credential) => credential.type === 'gitlab') as GitLabCredential[],\n [credentials],\n );\n\n const agentApiCredentialMap = useMemo(() => {\n return new Map(agentApiCredentials.map((credential) => [credential.agent, credential]));\n }, [agentApiCredentials]);\n\n const reloadCredentials = async () => {\n const [gitResult, agentResult] = await Promise.all([\n listCredentials(),\n listAgentApiCredentials(),\n ]);\n\n if (!gitResult.success) {\n setFlashMessage({ tone: 'error', text: gitResult.error });\n setLoading(false);\n return;\n }\n\n if (!agentResult.success) {\n setFlashMessage({ tone: 'error', text: agentResult.error });\n setLoading(false);\n return;\n }\n\n setCredentials(gitResult.credentials);\n setAgentApiCredentials(agentResult.credentials);\n setAgentApiProxyInputs((previous) => {\n const next = { ...previous };\n for (const agent of AGENT_API_ORDER) {\n next[agent] = agentResult.credentials.find((credential) => credential.agent === agent)?.apiProxy || '';\n }\n return next;\n });\n setLoading(false);\n };\n\n useEffect(() => {\n let isActive = true;\n\n void (async () => {\n const [gitResult, agentResult] = await Promise.all([\n listCredentials(),\n listAgentApiCredentials(),\n ]);\n if (!isActive) return;\n\n if (!gitResult.success) {\n setFlashMessage({ tone: 'error', text: gitResult.error });\n setLoading(false);\n return;\n }\n\n if (!agentResult.success) {\n setFlashMessage({ tone: 'error', text: agentResult.error });\n setLoading(false);\n return;\n }\n\n setCredentials(gitResult.credentials);\n setAgentApiCredentials(agentResult.credentials);\n setAgentApiProxyInputs((previous) => {\n const next = { ...previous };\n for (const agent of AGENT_API_ORDER) {\n next[agent] = agentResult.credentials.find((credential) => credential.agent === agent)?.apiProxy || '';\n }\n return next;\n });\n setLoading(false);\n })();\n\n return () => {\n isActive = false;\n };\n }, []);\n\n const handleSaveGitHub = async () => {\n setFlashMessage(null);\n setSavingType('github');\n\n const result = await saveGitHubCredential(githubToken);\n if (!result.success) {\n setFlashMessage({ tone: 'error', text: result.error });\n setSavingType(null);\n return;\n }\n\n setGitHubToken('');\n setFlashMessage({ tone: 'success', text: 'GitHub credential added.' });\n await reloadCredentials();\n setSavingType(null);\n };\n\n const handleSaveGitLab = async () => {\n setFlashMessage(null);\n setSavingType('gitlab');\n\n const result = await saveGitLabCredential(gitlabServerUrl, gitlabToken);\n if (!result.success) {\n setFlashMessage({ tone: 'error', text: result.error });\n setSavingType(null);\n return;\n }\n\n setGitLabToken('');\n setFlashMessage({ tone: 'success', text: 'GitLab credential added.' });\n await reloadCredentials();\n setSavingType(null);\n };\n\n const handleSaveAgentApi = async (agent: AgentApiCredentialAgent) => {\n setFlashMessage(null);\n setSavingAgent(agent);\n\n const result = await saveAgentApiCredential(\n agent,\n agentApiKeyInputs[agent],\n agentApiProxyInputs[agent],\n );\n if (!result.success) {\n setFlashMessage({ tone: 'error', text: result.error });\n setSavingAgent(null);\n return;\n }\n\n setAgentApiKeyInputs((previous) => ({ ...previous, [agent]: '' }));\n setAgentApiProxyInputs((previous) => ({ ...previous, [agent]: result.credential.apiProxy || '' }));\n setFlashMessage({ tone: 'success', text: `${AGENT_API_LABELS[agent]} credential saved.` });\n await reloadCredentials();\n setSavingAgent(null);\n };\n\n const handleDelete = async (credential: Credential) => {\n const providerLabel = formatProviderLabel(credential.type);\n const confirmed = confirm(`Delete this ${providerLabel} credential for ${formatCredentialSubtitle(credential)}?`);\n if (!confirmed) return;\n\n setFlashMessage(null);\n setDeletingId(credential.id);\n\n const result = await removeCredential(credential.id);\n if (!result.success) {\n setFlashMessage({ tone: 'error', text: result.error });\n setDeletingId(null);\n return;\n }\n\n setFlashMessage({ tone: 'success', text: `${providerLabel} credential deleted.` });\n await reloadCredentials();\n setDeletingId(null);\n };\n\n const handleDeleteAgentApi = async (agent: AgentApiCredentialAgent) => {\n const confirmed = confirm(`Delete the saved ${AGENT_API_LABELS[agent]} API credential?`);\n if (!confirmed) return;\n\n setFlashMessage(null);\n setDeletingAgent(agent);\n\n const result = await removeAgentApiCredential(agent);\n if (!result.success) {\n setFlashMessage({ tone: 'error', text: result.error });\n setDeletingAgent(null);\n return;\n }\n\n setAgentApiKeyInputs((previous) => ({ ...previous, [agent]: '' }));\n setAgentApiProxyInputs((previous) => ({ ...previous, [agent]: '' }));\n setFlashMessage({ tone: 'success', text: `${AGENT_API_LABELS[agent]} credential deleted.` });\n await reloadCredentials();\n setDeletingAgent(null);\n };\n\n const panelClass = 'overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm dark:border-slate-700/50 dark:bg-slate-800 dark:shadow-[0_12px_30px_-18px_rgba(2,6,23,0.9)]';\n const sectionHeaderClass = 'flex flex-col gap-3 border-b border-slate-200 bg-white px-6 py-5 md:flex-row md:items-center md:justify-between dark:border-slate-700/50 dark:bg-slate-800';\n const inputClass = 'block w-full rounded-lg border border-slate-200 bg-slate-50 px-3 py-2.5 text-sm text-slate-900 placeholder-slate-400 transition-all focus:border-primary focus:outline-none focus:ring-2 focus:ring-primary/20 disabled:cursor-not-allowed disabled:opacity-60 dark:border-slate-700 dark:bg-slate-900/50 dark:text-white dark:placeholder-slate-500 dark:focus:border-primary/50 dark:focus:bg-slate-900';\n const primaryButtonClass = 'inline-flex items-center justify-center gap-2 rounded-lg bg-primary px-4 py-2 text-sm font-medium text-white shadow-lg shadow-blue-900/20 transition-colors hover:bg-blue-700 disabled:cursor-not-allowed disabled:opacity-60';\n const secondaryButtonClass = 'inline-flex items-center justify-center gap-2 rounded-lg border border-slate-200 bg-white px-4 py-2 text-sm font-medium text-slate-700 shadow-sm transition-colors hover:bg-slate-50 disabled:cursor-not-allowed disabled:opacity-60 dark:border-slate-600 dark:bg-slate-800 dark:text-slate-200 dark:hover:bg-slate-700';\n const rowActionButtonClass = 'inline-flex h-8 w-8 items-center justify-center rounded-lg text-slate-400 transition-all hover:bg-red-50 hover:text-red-500 dark:text-slate-400 dark:hover:bg-red-900/30 dark:hover:text-red-400';\n\n return (\n <main className=\"min-h-screen bg-[#f6f6f8] px-4 py-8 md:px-8 md:py-12 dark:bg-[#0f1117]\">\n <div className=\"mx-auto w-full max-w-4xl space-y-8\">\n <div className=\"mb-8\">\n <div className=\"mb-2 flex items-center gap-4\">\n <button\n type=\"button\"\n className=\"flex h-10 w-10 items-center justify-center rounded-lg text-slate-500 transition-colors hover:bg-white hover:text-slate-900 dark:text-slate-400 dark:hover:bg-slate-800 dark:hover:text-white\"\n onClick={() => router.push('/')}\n aria-label=\"Back to home\"\n >\n <ChevronRight className=\"h-6 w-6 rotate-180\" />\n </button>\n <h1 className=\"text-3xl font-black tracking-[-0.02em] text-slate-900 md:text-4xl dark:text-white\">Credential Management</h1>\n </div>\n <p className=\"ml-14 text-sm text-slate-500 md:text-base dark:text-slate-400\">\n Manage your API keys and access tokens for third-party services safely.\n </p>\n </div>\n\n {flashMessage && (\n <div\n className={`rounded-lg border px-4 py-3 text-sm ${\n flashMessage.tone === 'error'\n ? 'border-red-200 bg-red-50 text-red-700 dark:border-red-500/40 dark:bg-red-900/30 dark:text-red-200'\n : 'border-emerald-200 bg-emerald-50 text-emerald-700 dark:border-emerald-500/40 dark:bg-emerald-900/30 dark:text-emerald-200'\n }`}\n >\n {flashMessage.text}\n </div>\n )}\n\n {loading ? (\n <div className={`${panelClass} p-10`}>\n <div className=\"flex flex-col items-center gap-3\">\n <span className=\"loading loading-spinner loading-md text-primary\"></span>\n <p className=\"text-sm text-slate-500 dark:text-slate-400\">Loading credentials...</p>\n </div>\n </div>\n ) : (\n <div className=\"space-y-6\">\n <section className={panelClass}>\n <div className={sectionHeaderClass}>\n <div>\n <h2 className=\"text-lg font-bold text-slate-900 dark:text-white\">GitHub Credentials</h2>\n <p className=\"mt-1 text-sm text-slate-500 dark:text-slate-400\">Access private repositories and Gists.</p>\n </div>\n <button\n className={primaryButtonClass}\n onClick={() => void handleSaveGitHub()}\n disabled={savingType === 'github'}\n >\n {savingType === 'github' ? <span className=\"loading loading-spinner loading-xs\"></span> : <KeyRound className=\"h-4 w-4\" />}\n Add Token\n </button>\n </div>\n\n <div className=\"border-b border-slate-100 bg-slate-50/40 px-6 py-4 dark:border-slate-700/50 dark:bg-slate-900/35\">\n <label className=\"mb-2 block text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400\">\n Personal Access Token\n </label>\n <input\n type=\"password\"\n className={inputClass}\n placeholder=\"ghp_xxx\"\n value={githubToken}\n onChange={(event) => setGitHubToken(event.target.value)}\n disabled={savingType === 'github'}\n />\n </div>\n\n {githubCredentials.length === 0 ? (\n <div className=\"px-6 py-6 text-sm text-slate-500 dark:text-slate-400\">No GitHub credentials saved.</div>\n ) : (\n <div className=\"divide-y divide-slate-100 dark:divide-slate-700/50\">\n {githubCredentials.map((credential) => (\n <div\n key={credential.id}\n className=\"group flex items-center justify-between gap-4 px-6 py-5 transition-colors hover:bg-slate-50 dark:hover:bg-slate-800/50\"\n >\n <div className=\"flex min-w-0 items-center gap-4\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-slate-100 dark:bg-slate-700/60\">\n <ProviderIcon type=\"github\" />\n </div>\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-semibold text-slate-900 dark:text-white\">{credential.username}</div>\n <div className=\"mt-0.5 text-xs text-slate-500 dark:text-slate-400\">\n Updated {new Date(credential.updatedAt).toLocaleString()}\n </div>\n </div>\n </div>\n <button\n className={`${rowActionButtonClass} opacity-0 group-hover:opacity-100 disabled:opacity-40`}\n onClick={() => void handleDelete(credential)}\n disabled={deletingId === credential.id}\n title=\"Delete\"\n >\n {deletingId === credential.id ? <span className=\"loading loading-spinner loading-xs\"></span> : <Trash2 className=\"h-4 w-4\" />}\n </button>\n </div>\n ))}\n </div>\n )}\n </section>\n\n <section className={panelClass}>\n <div className={sectionHeaderClass}>\n <div>\n <h2 className=\"text-lg font-bold text-slate-900 dark:text-white\">GitLab Credentials</h2>\n <p className=\"mt-1 text-sm text-slate-500 dark:text-slate-400\">Connect to self-hosted or cloud GitLab instances.</p>\n </div>\n <button\n className={secondaryButtonClass}\n onClick={() => void handleSaveGitLab()}\n disabled={savingType === 'gitlab'}\n >\n {savingType === 'gitlab' ? <span className=\"loading loading-spinner loading-xs\"></span> : <KeyRound className=\"h-4 w-4\" />}\n Add Instance\n </button>\n </div>\n\n <div className=\"space-y-4 border-b border-slate-100 bg-slate-50/40 px-6 py-4 dark:border-slate-700/50 dark:bg-slate-900/35\">\n <div>\n <label className=\"mb-2 block text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400\">\n Server URL\n </label>\n <input\n type=\"url\"\n className={inputClass}\n placeholder={DEFAULT_GITLAB_SERVER_URL}\n value={gitlabServerUrl}\n onChange={(event) => setGitLabServerUrl(event.target.value)}\n disabled={savingType === 'gitlab'}\n />\n </div>\n <div>\n <label className=\"mb-2 block text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400\">\n Personal Access Token\n </label>\n <input\n type=\"password\"\n className={inputClass}\n placeholder=\"glpat-xxx\"\n value={gitlabToken}\n onChange={(event) => setGitLabToken(event.target.value)}\n disabled={savingType === 'gitlab'}\n />\n </div>\n </div>\n\n {gitlabCredentials.length === 0 ? (\n <div className=\"px-6 py-6 text-sm text-slate-500 dark:text-slate-400\">No GitLab credentials saved.</div>\n ) : (\n <div className=\"divide-y divide-slate-100 dark:divide-slate-700/50\">\n {gitlabCredentials.map((credential) => (\n <div\n key={credential.id}\n className=\"group flex items-center justify-between gap-4 px-6 py-5 transition-colors hover:bg-slate-50 dark:hover:bg-slate-800/50\"\n >\n <div className=\"flex min-w-0 items-center gap-4\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-orange-50 dark:border dark:border-orange-500/20 dark:bg-orange-500/10\">\n <ProviderIcon type=\"gitlab\" />\n </div>\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-semibold text-slate-900 dark:text-white\">{credential.username}</div>\n <div className=\"truncate text-xs text-slate-500 dark:text-slate-400\">{credential.serverUrl}</div>\n <div className=\"mt-0.5 text-xs text-slate-500 dark:text-slate-400\">\n Updated {new Date(credential.updatedAt).toLocaleString()}\n </div>\n </div>\n </div>\n <button\n className={`${rowActionButtonClass} opacity-0 group-hover:opacity-100 disabled:opacity-40`}\n onClick={() => void handleDelete(credential)}\n disabled={deletingId === credential.id}\n title=\"Delete\"\n >\n {deletingId === credential.id ? <span className=\"loading loading-spinner loading-xs\"></span> : <Trash2 className=\"h-4 w-4\" />}\n </button>\n </div>\n ))}\n </div>\n )}\n </section>\n\n {AGENT_API_ORDER.map((agent) => {\n const configuredCredential = agentApiCredentialMap.get(agent);\n const isSaving = savingAgent === agent;\n const isDeleting = deletingAgent === agent;\n\n return (\n <section key={agent} className={panelClass}>\n <div className={sectionHeaderClass}>\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-emerald-100 p-1.5 text-emerald-600 dark:border dark:border-emerald-500/20 dark:bg-emerald-500/10 dark:text-emerald-400\">\n <KeyRound className=\"h-5 w-5\" />\n </div>\n <div>\n <h2 className=\"text-lg font-bold text-slate-900 dark:text-white\">{AGENT_API_LABELS[agent]} Configuration</h2>\n <p className=\"text-sm text-slate-500 dark:text-slate-400\">Configure access for LLM capabilities.</p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n {configuredCredential && (\n <button\n className={secondaryButtonClass}\n onClick={() => void handleDeleteAgentApi(agent)}\n disabled={isSaving || isDeleting}\n >\n {isDeleting ? <span className=\"loading loading-spinner loading-xs\"></span> : <Trash2 className=\"h-4 w-4\" />}\n Remove\n </button>\n )}\n <button\n className={primaryButtonClass}\n onClick={() => void handleSaveAgentApi(agent)}\n disabled={isSaving || isDeleting}\n >\n {isSaving ? <span className=\"loading loading-spinner loading-xs\"></span> : <KeyRound className=\"h-4 w-4\" />}\n {configuredCredential ? 'Save Changes' : 'Save'}\n </button>\n </div>\n </div>\n\n <div className=\"space-y-6 p-6\">\n <div className=\"max-w-2xl space-y-4\">\n <div>\n <label className=\"mb-2 block text-sm font-medium text-slate-700 dark:text-slate-300\">API Key</label>\n <input\n type=\"password\"\n className={inputClass}\n placeholder={AGENT_API_KEY_PLACEHOLDERS[agent]}\n value={agentApiKeyInputs[agent]}\n onChange={(event) =>\n setAgentApiKeyInputs((previous) => ({ ...previous, [agent]: event.target.value }))\n }\n disabled={isSaving || isDeleting}\n />\n <p className=\"mt-1 text-xs text-slate-500 dark:text-slate-400\">\n Your API key is stored locally and never shared.\n </p>\n </div>\n\n <div>\n <label className=\"mb-2 block text-sm font-medium text-slate-700 dark:text-slate-300\">\n API Proxy <span className=\"font-normal text-slate-400 dark:text-slate-500\">(Optional)</span>\n </label>\n <input\n type=\"url\"\n className={inputClass}\n placeholder={AGENT_API_PROXY_PLACEHOLDERS[agent]}\n value={agentApiProxyInputs[agent]}\n onChange={(event) =>\n setAgentApiProxyInputs((previous) => ({ ...previous, [agent]: event.target.value }))\n }\n disabled={isSaving || isDeleting}\n />\n <p className=\"mt-1 text-xs text-slate-500 dark:text-slate-400\">\n Override this when using a proxy or a compatible endpoint.\n </p>\n </div>\n </div>\n\n <div className=\"rounded-lg border border-slate-200 bg-slate-50 p-3 text-xs text-slate-600 dark:border-slate-700 dark:bg-slate-900/40 dark:text-slate-300\">\n {configuredCredential ? (\n <div className=\"space-y-1\">\n <div>API key configured.</div>\n <div>Updated {new Date(configuredCredential.updatedAt).toLocaleString()}</div>\n <div>Proxy {configuredCredential.apiProxy ? configuredCredential.apiProxy : 'not set'}</div>\n </div>\n ) : (\n <div>No API credential saved.</div>\n )}\n </div>\n </div>\n </section>\n );\n })}\n\n <div className=\"pb-2 pt-4 text-center text-xs text-slate-400 dark:text-slate-500\">\n Credentials are encrypted at rest using your system keychain.\n </div>\n </div>\n )}\n </div>\n </main>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"40011c9b66bdc21f5472590decf1be3cc9562cd1c5\":\"removeAgentApiCredential\"},\"src/app/actions/credentials.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_6=/*#__PURE__*/createServerReference(\"40011c9b66bdc21f5472590decf1be3cc9562cd1c5\",callServer,void 0,findSourceMapURL,\"removeAgentApiCredential\");export{$$RSC_SERVER_ACTION_6 as removeAgentApiCredential};","/* __next_internal_action_entry_do_not_use__ [{\"4091a8490f9bd089a13eb2593806dc5116ab4cd96f\":\"removeCredential\"},\"src/app/actions/credentials.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_5=/*#__PURE__*/createServerReference(\"4091a8490f9bd089a13eb2593806dc5116ab4cd96f\",callServer,void 0,findSourceMapURL,\"removeCredential\");export{$$RSC_SERVER_ACTION_5 as removeCredential};","/* __next_internal_action_entry_do_not_use__ [{\"702c26c6b9bfd4c586d26c0ecfa3f8f7b5f4fe8e0e\":\"saveAgentApiCredential\"},\"src/app/actions/credentials.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_4=/*#__PURE__*/createServerReference(\"702c26c6b9bfd4c586d26c0ecfa3f8f7b5f4fe8e0e\",callServer,void 0,findSourceMapURL,\"saveAgentApiCredential\");export{$$RSC_SERVER_ACTION_4 as saveAgentApiCredential};","/* __next_internal_action_entry_do_not_use__ [{\"4051c0a28158f8a13e906979f4ce747a6742aec465\":\"saveGitHubCredential\"},\"src/app/actions/credentials.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_1=/*#__PURE__*/createServerReference(\"4051c0a28158f8a13e906979f4ce747a6742aec465\",callServer,void 0,findSourceMapURL,\"saveGitHubCredential\");export{$$RSC_SERVER_ACTION_1 as saveGitHubCredential};","/* __next_internal_action_entry_do_not_use__ [{\"60a5c56e15d312abf810cd94da5c0d1ee2319b6d57\":\"saveGitLabCredential\"},\"src/app/actions/credentials.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_2=/*#__PURE__*/createServerReference(\"60a5c56e15d312abf810cd94da5c0d1ee2319b6d57\",callServer,void 0,findSourceMapURL,\"saveGitLabCredential\");export{$$RSC_SERVER_ACTION_2 as saveGitLabCredential};"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ module.exports=[85106,a=>{"use strict";var b=a.i(87924),c=a.i(50944),d=a.i(65975),e=a.i(72131),f=a.i(68114),g=a.i(3688),h=a.i(96415);let i=[];function j(a,b){let c=a.trim(),d=b.replace(/\r\n/g,"\n");return d.trim()?`${c}
2
+
3
+ ${d}`:c}function k(a){let b={name:"",path:"",children:new Map};for(let c of a){let a=c.split("/").filter(Boolean),d=b,e="";for(let b=0;b<a.length;b++){let f=a[b];e=e?`${e}/${f}`:f,d.children.has(f)||d.children.set(f,{name:f,path:e,children:new Map}),d=d.children.get(f),b===a.length-1&&(d.filePath=c)}}return b}function l(a){let b=[];return Array.from(a.children.values()).forEach(a=>{a.children.size>0&&(b.push(a.path),b.push(...l(a)))}),b}function m(a){let b=a.split("/").filter(Boolean),c=[];for(let a=1;a<b.length;a++)c.push(b.slice(0,a).join("/"));return c}function n({node:a,selectedFile:c,expandedFolders:d,onToggleFolder:e,onSelectFile:g,onActionFile:h,actionType:i,actionPending:j,depth:k=0}){let l=Array.from(a.children.values()).sort((a,b)=>{let c=a.children.size>0,d=b.children.size>0;return c&&!d?-1:!c&&d?1:a.name.localeCompare(b.name)});return(0,b.jsx)(b.Fragment,{children:l.map(a=>{if(a.children.size>0){let f=d.has(a.path);return(0,b.jsxs)("div",{children:[(0,b.jsxs)("div",{className:"flex items-center gap-1 px-2 py-1.5 text-xs rounded cursor-pointer text-slate-600 dark:text-slate-400 hover:bg-slate-100 dark:hover:bg-slate-800/70 transition-colors",style:{paddingLeft:`${12*k+8}px`},onClick:()=>e(a.path),title:a.path,children:[(0,b.jsx)("span",{className:"text-[10px] opacity-70",children:f?"▼":"▶"}),(0,b.jsx)("i",{className:"iconoir-folder text-[14px] opacity-70","aria-hidden":"true"}),(0,b.jsx)("span",{className:"truncate flex-1",children:a.name})]}),f&&(0,b.jsx)(n,{node:a,selectedFile:c,expandedFolders:d,onToggleFolder:e,onSelectFile:g,onActionFile:h,actionType:i,actionPending:j,depth:k+1})]},a.path)}let l=a.filePath;return l?(0,b.jsxs)("div",{className:(0,f.cn)("flex items-center justify-between gap-2 px-2 py-1.5 rounded-md cursor-pointer group hover:bg-slate-100 dark:hover:bg-slate-800/70 transition-colors text-sm",c===l&&"bg-slate-100 dark:bg-slate-800/70 font-medium text-primary"),style:{paddingLeft:`${12*k+8}px`},onClick:()=>g(l),title:l,children:[(0,b.jsxs)("div",{className:"flex items-center gap-2 min-w-0 flex-1",children:[(0,b.jsx)("i",{className:"iconoir-page text-[14px] opacity-70 shrink-0","aria-hidden":"true"}),(0,b.jsx)("span",{className:"truncate flex-1 font-mono text-xs",children:a.name})]}),(0,b.jsx)("button",{className:(0,f.cn)("btn btn-ghost btn-xs btn-square opacity-0 group-hover:opacity-100 transition-opacity","stage"===i?"text-success hover:bg-success/10":"text-error hover:bg-error/10"),onClick:a=>{a.stopPropagation(),h(l)},disabled:j,children:(0,b.jsx)("i",{className:(0,f.cn)("text-[14px]","stage"===i?"iconoir-plus-circle":"iconoir-minus-circle"),"aria-hidden":"true"})})]},l):null})})}function o({repoPath:a}){let{data:c,isLoading:o,isError:p,error:q,refetch:r}=(0,d.useGitStatus)(a),{data:s}=(0,d.useGitBranches)(a),t=(0,d.useGitAction)(),[u,v]=(0,e.useState)(""),[w,x]=(0,e.useState)(""),[y,z]=(0,e.useState)(null),[A,B]=(0,e.useState)(!1),[C,D]=(0,e.useState)(""),[E,F]=(0,e.useState)(!1),[G,H]=(0,e.useState)(!1),[I,J]=(0,e.useState)("main"),[K,L]=(0,e.useState)(new Set),[M,N]=(0,e.useState)(new Set),[O,P]=(0,e.useState)(250),[Q,R]=(0,e.useState)(!1),S=(0,e.useRef)(null);(0,e.useEffect)(()=>{let a=a=>{if(!Q||!S.current)return;let b=S.current.startY-a.clientY;P(Math.max(150,Math.min(800,S.current.startHeight+b)))},b=()=>{R(!1),S.current=null,document.body.style.cursor="default",document.body.style.userSelect="auto"};return Q&&(window.addEventListener("mousemove",a),window.addEventListener("mouseup",b),document.body.style.cursor="ns-resize",document.body.style.userSelect="none"),()=>{window.removeEventListener("mousemove",a),window.removeEventListener("mouseup",b),document.body.style.cursor="default",document.body.style.userSelect="auto"}},[Q]);let T=c?.files??i,U=!!s&&0===s.branches.length,{staged:V,changes:W}=(0,e.useMemo)(()=>{let a=[],b=[];return T.forEach(c=>{" "!==c.index&&"?"!==c.index&&a.push(c.path),(" "!==c.working_dir||"?"===c.index)&&b.push(c.path)}),{staged:a,changes:b}},[T]),X=(0,e.useMemo)(()=>k(W),[W]),Y=(0,e.useMemo)(()=>k(V),[V]),Z=(0,e.useMemo)(()=>l(X),[X]),$=(0,e.useMemo)(()=>l(Y),[Y]),_=(0,e.useMemo)(()=>{let a=new Set;return Z.forEach(b=>{K.has(b)||a.add(b)}),y&&m(y).forEach(b=>a.add(b)),a},[Z,K,y]),aa=(0,e.useMemo)(()=>{let a=new Set;return $.forEach(b=>{M.has(b)||a.add(b)}),y&&m(y).forEach(b=>a.add(b)),a},[$,M,y]),ab=(0,e.useCallback)(a=>{L(b=>{let c=new Set(b);return c.has(a)?c.delete(a):c.add(a),c})},[]),ac=(0,e.useCallback)(a=>{N(b=>{let c=new Set(b);return c.has(a)?c.delete(a):c.add(a),c})},[]),ad=async b=>{await t.mutateAsync({repoPath:a,action:"stage",data:{files:[b]}})},ae=async b=>{await t.mutateAsync({repoPath:a,action:"unstage",data:{files:[b]}})},af=async()=>{await t.mutateAsync({repoPath:a,action:"stage",data:{files:["."]}})},ag=async()=>{await t.mutateAsync({repoPath:a,action:"unstage",data:{files:V}})},ah=async()=>{await t.mutateAsync({repoPath:a,action:"stash",data:{message:C||void 0}}),B(!1),D(""),z(null)},ai=async()=>{await t.mutateAsync({repoPath:a,action:"discard",data:{includeUntracked:!0}}),F(!1),z(null)},aj=async()=>{let b=u.trim();if(b){if(U)return void H(!0);await t.mutateAsync({repoPath:a,action:"commit",data:{message:j(b,w)}}),v(""),x(""),z(null)}},ak=async()=>{let b=u.trim(),c=I.trim();b&&c&&(await t.mutateAsync({repoPath:a,action:"commit",data:{message:j(b,w),initialBranch:c}}),v(""),x(""),z(null),H(!1))};(0,h.useEscapeDismiss)(A,()=>B(!1),()=>{t.isPending||ah()}),(0,h.useEscapeDismiss)(E,()=>F(!1),()=>{t.isPending||ai()}),(0,h.useEscapeDismiss)(G,()=>H(!1),()=>{!t.isPending&&I.trim()&&ak()});let al=a=>{(a.metaKey||a.ctrlKey)&&"Enter"===a.key&&(a.preventDefault(),V.length>0&&u.trim()&&!t.isPending&&aj())};return o?(0,b.jsx)("div",{className:"flex items-center justify-center h-64",children:(0,b.jsx)("span",{className:"loading loading-spinner text-base-content/50"})}):p?(0,b.jsxs)("div",{className:"flex items-center justify-center h-64 flex-col gap-4",children:[(0,b.jsx)("p",{className:"text-error font-bold",children:"Error Loading Status"}),(0,b.jsx)("p",{className:"text-sm opacity-70",children:q?.message||"An unknown error occurred"}),(0,b.jsxs)("button",{onClick:()=>r(),className:"btn btn-outline btn-sm",children:[(0,b.jsx)("i",{className:"iconoir-refresh-circle text-[16px] mr-1","aria-hidden":"true"}),"Try Again"]})]}):c?(0,b.jsxs)("div",{className:"flex h-full overflow-hidden",children:[(0,b.jsxs)("div",{className:"flex flex-1 min-w-0 flex-col gap-2 overflow-hidden",children:[(0,b.jsxs)("div",{className:"flex min-h-[57px] shrink-0 items-center justify-between gap-2 rounded-xl border border-slate-200 bg-white px-4 py-2 dark:border-slate-800 dark:bg-slate-900",children:[(0,b.jsx)("h1",{className:"font-bold text-lg text-slate-900 dark:text-slate-100",children:"Changes"}),(0,b.jsxs)("button",{className:"flex h-8 items-center gap-1.5 rounded-md border border-slate-200 bg-white px-3 text-sm font-medium text-slate-600 transition-colors hover:bg-slate-50 hover:text-slate-900 disabled:cursor-not-allowed disabled:opacity-50 dark:border-slate-700 dark:bg-slate-900 dark:text-slate-300 dark:hover:bg-slate-800 dark:hover:text-slate-100",onClick:()=>r(),disabled:t.isPending,title:"Refresh status",children:[t.isPending?(0,b.jsx)("span",{className:"loading loading-spinner loading-xs"}):(0,b.jsx)("i",{className:"iconoir-refresh-circle text-[16px]","aria-hidden":"true"}),"Refresh"]})]}),(0,b.jsxs)("div",{className:"flex flex-1 overflow-hidden rounded-xl border border-slate-200 bg-white dark:border-slate-800 dark:bg-slate-900",children:[(0,b.jsx)("div",{className:"w-64 border-r border-slate-200 dark:border-slate-800 flex flex-col bg-slate-50/70 dark:bg-slate-900/70",children:(0,b.jsxs)("div",{className:"flex-1 overflow-y-auto",children:[(0,b.jsxs)("div",{className:"p-2",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between px-2 py-2 mb-1",children:[(0,b.jsxs)("h3",{className:"text-xs font-bold uppercase tracking-wider opacity-70",children:["Changes (",W.length,")"]}),(0,b.jsxs)("div",{className:"flex items-center gap-0.5",children:[0===W.length&&V.length>0?(0,b.jsx)("button",{className:"btn btn-ghost btn-xs btn-square",onClick:ag,title:"Unstage All",children:(0,b.jsx)("i",{className:"iconoir-arrow-up text-[16px]","aria-hidden":"true"})}):(0,b.jsx)("button",{className:"btn btn-ghost btn-xs btn-square",onClick:af,disabled:0===W.length,title:"Stage All",children:(0,b.jsx)("i",{className:"iconoir-arrow-down text-[16px]","aria-hidden":"true"})}),(0,b.jsx)("button",{className:"btn btn-ghost btn-xs btn-square",onClick:()=>B(!0),disabled:0===W.length&&0===V.length,title:"Stash",children:(0,b.jsx)("i",{className:"iconoir-download-square text-[16px]","aria-hidden":"true"})}),(0,b.jsx)("button",{className:"btn btn-ghost btn-xs btn-square text-error hover:bg-error/10",onClick:()=>F(!0),disabled:0===W.length,title:"Discard All",children:(0,b.jsx)("i",{className:"iconoir-trash text-[16px]","aria-hidden":"true"})})]})]}),(0,b.jsxs)("div",{className:"space-y-0.5",children:[0===W.length&&(0,b.jsx)("p",{className:"px-2 py-2 text-xs opacity-50 italic",children:"No changes"}),W.length>0&&(0,b.jsx)(n,{node:X,selectedFile:y,expandedFolders:_,onToggleFolder:ab,onSelectFile:z,onActionFile:ad,actionType:"stage",actionPending:t.isPending})]})]}),(0,b.jsx)("div",{className:"h-px bg-slate-200 dark:bg-slate-800 mx-4 my-2"}),(0,b.jsxs)("div",{className:"p-2",children:[(0,b.jsx)("div",{className:"flex items-center justify-between px-2 py-2 mb-1",children:(0,b.jsxs)("h3",{className:"text-xs font-bold uppercase tracking-wider opacity-70",children:["Staged (",V.length,")"]})}),(0,b.jsxs)("div",{className:"space-y-0.5",children:[0===V.length&&(0,b.jsx)("p",{className:"px-2 py-2 text-xs opacity-50 italic",children:"No staged changes"}),V.length>0&&(0,b.jsx)(n,{node:Y,selectedFile:y,expandedFolders:aa,onToggleFolder:ac,onSelectFile:z,onActionFile:ae,actionType:"unstage",actionPending:t.isPending})]})]})]})}),(0,b.jsxs)("div",{className:"flex-1 flex flex-col bg-white dark:bg-slate-900 overflow-hidden",children:[(0,b.jsx)("div",{className:"flex-1 overflow-hidden flex flex-col min-h-0",children:y?(0,b.jsx)("div",{className:"h-full flex flex-col",children:(0,b.jsx)(g.DiffView,{repoPath:a,filePath:y})}):(0,b.jsxs)("div",{className:"flex-1 flex flex-col items-center justify-center opacity-50",children:[(0,b.jsx)("div",{className:"p-8 rounded-full bg-slate-100 dark:bg-slate-800/60 mb-4 text-4xl",children:(0,b.jsx)("i",{className:"iconoir-refresh-circle text-[32px]","aria-hidden":"true"})}),(0,b.jsx)("p",{className:"text-sm font-bold",children:"Select a file to view changes"})]})}),(0,b.jsx)("div",{className:"h-1.5 cursor-ns-resize flex items-center justify-center hover:bg-slate-100 dark:hover:bg-slate-800/60 transition-colors group shrink-0 border-t border-slate-200 dark:border-slate-800",onMouseDown:a=>{a.preventDefault(),R(!0),S.current={startY:a.clientY,startHeight:O}},children:(0,b.jsx)("div",{className:"w-8 h-1 rounded-full bg-base-300 group-hover:bg-base-content/20 transition-colors"})}),(0,b.jsx)("div",{className:"flex flex-col border-t border-slate-200 dark:border-slate-800 bg-white dark:bg-slate-900 shrink-0",style:{height:O},children:(0,b.jsxs)("div",{className:"flex-1 p-4 overflow-y-auto",children:[(0,b.jsx)("input",{type:"text",placeholder:"Commit subject...",value:u,onChange:a=>v(a.target.value),onKeyDown:al,className:"input input-bordered w-full text-sm mb-2 font-sans"}),(0,b.jsx)("textarea",{placeholder:"Commit message body (optional)...",value:w,onChange:a=>x(a.target.value),onKeyDown:al,className:"textarea textarea-bordered w-full text-sm resize-none mb-3 font-sans flex-1",style:{minHeight:"80px",height:"calc(100% - 90px)"}}),(0,b.jsxs)("button",{className:"btn btn-primary w-full btn-sm",onClick:aj,disabled:0===V.length||!u.trim()||t.isPending,children:[t.isPending?(0,b.jsx)("span",{className:"loading loading-spinner loading-xs mr-2"}):(0,b.jsx)("span",{className:"mr-2",children:"✅"}),"Commit Changes"]})]})})]})]})]}),A&&(0,b.jsxs)("dialog",{className:"modal modal-open",children:[(0,b.jsxs)("div",{className:"modal-box",children:[(0,b.jsx)("h3",{className:"font-bold text-lg",children:"Stash Changes"}),(0,b.jsx)("p",{className:"py-4 opacity-70",children:"Save your local modifications to a new stash entry."}),(0,b.jsx)("div",{className:"py-2",children:(0,b.jsx)("input",{type:"text",placeholder:"Stash message (optional)",value:C,onChange:a=>D(a.target.value),autoFocus:!0,onKeyDown:a=>{"Enter"===a.key&&(a.preventDefault(),ah())},className:"input input-bordered w-full"})}),(0,b.jsxs)("div",{className:"modal-action",children:[(0,b.jsx)("button",{className:"btn",onClick:()=>B(!1),children:"Cancel"}),(0,b.jsxs)("button",{className:"btn btn-primary",onClick:ah,disabled:t.isPending,children:[t.isPending&&(0,b.jsx)("span",{className:"loading loading-spinner loading-xs"}),"Stash"]})]})]}),(0,b.jsx)("form",{method:"dialog",className:"modal-backdrop",children:(0,b.jsx)("button",{onClick:()=>B(!1),children:"close"})})]}),E&&(0,b.jsxs)("dialog",{className:"modal modal-open",children:[(0,b.jsxs)("div",{className:"modal-box",children:[(0,b.jsx)("h3",{className:"font-bold text-lg",children:"Discard Changes"}),(0,b.jsx)("p",{className:"py-4",children:"Are you sure you want to discard all unstaged changes and new files? This action cannot be undone."}),(0,b.jsxs)("div",{className:"modal-action",children:[(0,b.jsx)("button",{className:"btn",onClick:()=>F(!1),children:"Cancel"}),(0,b.jsxs)("button",{className:"btn btn-error",onClick:ai,disabled:t.isPending,children:[t.isPending&&(0,b.jsx)("span",{className:"loading loading-spinner loading-xs"}),"Discard"]})]})]}),(0,b.jsx)("form",{method:"dialog",className:"modal-backdrop",children:(0,b.jsx)("button",{onClick:()=>F(!1),children:"close"})})]}),G&&(0,b.jsxs)("dialog",{className:"modal modal-open",children:[(0,b.jsxs)("div",{className:"modal-box",children:[(0,b.jsx)("h3",{className:"font-bold text-lg",children:"First Commit Branch"}),(0,b.jsx)("p",{className:"py-4 opacity-70",children:"This repository has no commits yet. Choose the branch name for the first commit."}),(0,b.jsx)("div",{className:"py-2",children:(0,b.jsx)("input",{type:"text",placeholder:"Branch name",value:I,onChange:a=>J((0,f.sanitizeBranchName)(a.target.value)),autoFocus:!0,onKeyDown:a=>{"Enter"===a.key&&(a.preventDefault(),ak())},className:"input input-bordered w-full"})}),(0,b.jsxs)("div",{className:"modal-action",children:[(0,b.jsx)("button",{className:"btn",onClick:()=>H(!1),children:"Cancel"}),(0,b.jsxs)("button",{className:"btn btn-primary",onClick:ak,disabled:!I.trim()||t.isPending,children:[t.isPending&&(0,b.jsx)("span",{className:"loading loading-spinner loading-xs"}),"Commit to Branch"]})]})]}),(0,b.jsx)("form",{method:"dialog",className:"modal-backdrop",children:(0,b.jsx)("button",{onClick:()=>H(!1),children:"close"})})]})]}):(0,b.jsx)("div",{className:"flex items-center justify-center h-64 opacity-70",children:"No status data available"})}var p=a.i(14539);function q(){let a=(0,c.useSearchParams)().get("path");return((0,p.useWorkspaceTitle)(a,"Changes"),a)?(0,b.jsx)(o,{repoPath:a}):(0,b.jsx)("div",{className:"p-8",children:"No repository path specified."})}function r(){return(0,b.jsx)(e.Suspense,{fallback:(0,b.jsx)("div",{className:"flex items-center justify-center h-full",children:(0,b.jsx)("span",{className:"loading loading-spinner"})}),children:(0,b.jsx)(q,{})})}a.s(["default",()=>r],85106)}];
4
+
5
+ //# sourceMappingURL=src_app_git_changes_page_tsx_f6dc28dc._.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/app/git/changes/page.tsx","../../../../src/components/git/status-view.tsx"],"sourcesContent":["'use client';\n\nimport { useSearchParams } from 'next/navigation';\nimport { StatusView } from '@/components/git/status-view';\nimport { Suspense } from 'react';\nimport { useWorkspaceTitle } from '@/hooks/use-workspace-title';\n\nfunction WorkspaceChangesContent() {\n const searchParams = useSearchParams();\n const repoPath = searchParams.get('path');\n\n useWorkspaceTitle(repoPath, 'Changes');\n\n if (!repoPath) {\n return <div className=\"p-8\">No repository path specified.</div>;\n }\n\n return <StatusView repoPath={repoPath} />;\n}\n\nexport default function WorkspaceChangesPage() {\n return (\n <Suspense fallback={<div className=\"flex items-center justify-center h-full\"><span className=\"loading loading-spinner\"></span></div>}>\n <WorkspaceChangesContent />\n </Suspense>\n );\n}\n","'use client';\n\nimport { useGitStatus, useGitAction, useGitBranches } from '@/hooks/use-git';\nimport { useCallback, useMemo, useState, useEffect, useRef } from 'react';\nimport { cn, sanitizeBranchName } from '@/lib/utils';\nimport { DiffView } from './diff-view';\nimport { useEscapeDismiss } from '@/hooks/use-escape-dismiss';\n\nconst EMPTY_FILES: Array<{ path: string; index: string; working_dir: string }> = [];\n\nfunction buildCommitMessage(subject: string, body: string): string {\n const trimmedSubject = subject.trim();\n const normalizedBody = body.replace(/\\r\\n/g, '\\n');\n return normalizedBody.trim() ? `${trimmedSubject}\\n\\n${normalizedBody}` : trimmedSubject;\n}\n\ninterface StatusFileTreeNode {\n name: string;\n path: string;\n filePath?: string;\n children: Map<string, StatusFileTreeNode>;\n}\n\nfunction buildStatusFileTree(paths: string[]): StatusFileTreeNode {\n const root: StatusFileTreeNode = {\n name: '',\n path: '',\n children: new Map(),\n };\n\n for (const filePath of paths) {\n const parts = filePath.split('/').filter(Boolean);\n let current = root;\n let currentPath = '';\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n currentPath = currentPath ? `${currentPath}/${part}` : part;\n\n if (!current.children.has(part)) {\n current.children.set(part, {\n name: part,\n path: currentPath,\n children: new Map(),\n });\n }\n\n current = current.children.get(part)!;\n\n if (i === parts.length - 1) {\n current.filePath = filePath;\n }\n }\n }\n\n return root;\n}\n\nfunction collectFolderPaths(node: StatusFileTreeNode): string[] {\n const paths: string[] = [];\n const children = Array.from(node.children.values());\n\n children.forEach((child) => {\n if (child.children.size > 0) {\n paths.push(child.path);\n paths.push(...collectFolderPaths(child));\n }\n });\n\n return paths;\n}\n\nfunction getParentPaths(filePath: string): string[] {\n const parts = filePath.split('/').filter(Boolean);\n const parentPaths: string[] = [];\n\n for (let i = 1; i < parts.length; i++) {\n parentPaths.push(parts.slice(0, i).join('/'));\n }\n\n return parentPaths;\n}\n\nfunction StatusFileTreeItem({\n node,\n selectedFile,\n expandedFolders,\n onToggleFolder,\n onSelectFile,\n onActionFile,\n actionType,\n actionPending,\n depth = 0,\n}: {\n node: StatusFileTreeNode;\n selectedFile: string | null;\n expandedFolders: Set<string>;\n onToggleFolder: (path: string) => void;\n onSelectFile: (path: string) => void;\n onActionFile: (path: string) => Promise<void>;\n actionType: 'stage' | 'unstage';\n actionPending: boolean;\n depth?: number;\n}) {\n const children = Array.from(node.children.values()).sort((a, b) => {\n const aIsFolder = a.children.size > 0;\n const bIsFolder = b.children.size > 0;\n\n if (aIsFolder && !bIsFolder) return -1;\n if (!aIsFolder && bIsFolder) return 1;\n return a.name.localeCompare(b.name);\n });\n\n return (\n <>\n {children.map((child) => {\n const isFolder = child.children.size > 0;\n\n if (isFolder) {\n const isExpanded = expandedFolders.has(child.path);\n\n return (\n <div key={child.path}>\n <div\n className=\"flex items-center gap-1 px-2 py-1.5 text-xs rounded cursor-pointer text-slate-600 dark:text-slate-400 hover:bg-slate-100 dark:hover:bg-slate-800/70 transition-colors\"\n style={{ paddingLeft: `${depth * 12 + 8}px` }}\n onClick={() => onToggleFolder(child.path)}\n title={child.path}\n >\n <span className=\"text-[10px] opacity-70\">{isExpanded ? '▼' : '▶'}</span>\n <i className=\"iconoir-folder text-[14px] opacity-70\" aria-hidden=\"true\" />\n <span className=\"truncate flex-1\">{child.name}</span>\n </div>\n {isExpanded && (\n <StatusFileTreeItem\n node={child}\n selectedFile={selectedFile}\n expandedFolders={expandedFolders}\n onToggleFolder={onToggleFolder}\n onSelectFile={onSelectFile}\n onActionFile={onActionFile}\n actionType={actionType}\n actionPending={actionPending}\n depth={depth + 1}\n />\n )}\n </div>\n );\n }\n\n const filePath = child.filePath;\n if (!filePath) return null;\n\n return (\n <div\n key={filePath}\n className={cn(\n 'flex items-center justify-between gap-2 px-2 py-1.5 rounded-md cursor-pointer group hover:bg-slate-100 dark:hover:bg-slate-800/70 transition-colors text-sm',\n selectedFile === filePath && 'bg-slate-100 dark:bg-slate-800/70 font-medium text-primary'\n )}\n style={{ paddingLeft: `${depth * 12 + 8}px` }}\n onClick={() => onSelectFile(filePath)}\n title={filePath}\n >\n <div className=\"flex items-center gap-2 min-w-0 flex-1\">\n <i className=\"iconoir-page text-[14px] opacity-70 shrink-0\" aria-hidden=\"true\" />\n <span className=\"truncate flex-1 font-mono text-xs\">{child.name}</span>\n </div>\n <button\n className={cn(\n 'btn btn-ghost btn-xs btn-square opacity-0 group-hover:opacity-100 transition-opacity',\n actionType === 'stage'\n ? 'text-success hover:bg-success/10'\n : 'text-error hover:bg-error/10'\n )}\n onClick={(e) => {\n e.stopPropagation();\n void onActionFile(filePath);\n }}\n disabled={actionPending}\n >\n <i\n className={cn(\n 'text-[14px]',\n actionType === 'stage' ? 'iconoir-plus-circle' : 'iconoir-minus-circle'\n )}\n aria-hidden=\"true\"\n />\n </button>\n </div>\n );\n })}\n </>\n );\n}\n\nexport function StatusView({ repoPath }: { repoPath: string }) {\n const { data: status, isLoading, isError, error, refetch } = useGitStatus(repoPath);\n const { data: branches } = useGitBranches(repoPath);\n const action = useGitAction();\n const [subject, setSubject] = useState('');\n const [body, setBody] = useState('');\n const [selectedFile, setSelectedFile] = useState<string | null>(null);\n const [stashDialogOpen, setStashDialogOpen] = useState(false);\n const [stashMessage, setStashMessage] = useState('');\n const [discardDialogOpen, setDiscardDialogOpen] = useState(false);\n const [firstCommitDialogOpen, setFirstCommitDialogOpen] = useState(false);\n const [initialBranchName, setInitialBranchName] = useState('main');\n const [collapsedChangeFolders, setCollapsedChangeFolders] = useState<Set<string>>(new Set());\n const [collapsedStagedFolders, setCollapsedStagedFolders] = useState<Set<string>>(new Set());\n \n // Resize logic for commit box\n const [commitBoxHeight, setCommitBoxHeight] = useState(250);\n const [isResizing, setIsResizing] = useState(false);\n const resizeRef = useRef<{ startY: number; startHeight: number } | null>(null);\n\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n if (!isResizing || !resizeRef.current) return;\n const delta = resizeRef.current.startY - e.clientY;\n const newHeight = Math.max(150, Math.min(800, resizeRef.current.startHeight + delta));\n setCommitBoxHeight(newHeight);\n };\n\n const handleMouseUp = () => {\n setIsResizing(false);\n resizeRef.current = null;\n document.body.style.cursor = 'default';\n document.body.style.userSelect = 'auto';\n };\n\n if (isResizing) {\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n document.body.style.cursor = 'ns-resize';\n document.body.style.userSelect = 'none';\n }\n\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n document.body.style.cursor = 'default';\n document.body.style.userSelect = 'auto';\n };\n }, [isResizing]);\n\n const handleResizeStart = (e: React.MouseEvent) => {\n e.preventDefault();\n setIsResizing(true);\n resizeRef.current = { startY: e.clientY, startHeight: commitBoxHeight };\n };\n\n const files = status?.files ?? EMPTY_FILES;\n const isFirstCommit = !!branches && branches.branches.length === 0;\n\n // Group files\n const { staged, changes } = useMemo(() => {\n const stagedFiles: string[] = [];\n const changedFiles: string[] = [];\n\n files.forEach((file) => {\n if (file.index !== ' ' && file.index !== '?') {\n stagedFiles.push(file.path);\n }\n if (file.working_dir !== ' ' || file.index === '?') {\n changedFiles.push(file.path);\n }\n });\n\n return {\n staged: stagedFiles,\n changes: changedFiles,\n };\n }, [files]);\n\n const changesTree = useMemo(() => buildStatusFileTree(changes), [changes]);\n const stagedTree = useMemo(() => buildStatusFileTree(staged), [staged]);\n const allChangeFolderPaths = useMemo(() => collectFolderPaths(changesTree), [changesTree]);\n const allStagedFolderPaths = useMemo(() => collectFolderPaths(stagedTree), [stagedTree]);\n\n const expandedChangeFolders = useMemo(() => {\n const expanded = new Set<string>();\n\n allChangeFolderPaths.forEach((path) => {\n if (!collapsedChangeFolders.has(path)) {\n expanded.add(path);\n }\n });\n\n if (selectedFile) {\n getParentPaths(selectedFile).forEach((path) => expanded.add(path));\n }\n\n return expanded;\n }, [allChangeFolderPaths, collapsedChangeFolders, selectedFile]);\n\n const expandedStagedFolders = useMemo(() => {\n const expanded = new Set<string>();\n\n allStagedFolderPaths.forEach((path) => {\n if (!collapsedStagedFolders.has(path)) {\n expanded.add(path);\n }\n });\n\n if (selectedFile) {\n getParentPaths(selectedFile).forEach((path) => expanded.add(path));\n }\n\n return expanded;\n }, [allStagedFolderPaths, collapsedStagedFolders, selectedFile]);\n\n const handleToggleChangeFolder = useCallback((path: string) => {\n setCollapsedChangeFolders((prev) => {\n const next = new Set(prev);\n if (next.has(path)) {\n next.delete(path);\n } else {\n next.add(path);\n }\n return next;\n });\n }, []);\n\n const handleToggleStagedFolder = useCallback((path: string) => {\n setCollapsedStagedFolders((prev) => {\n const next = new Set(prev);\n if (next.has(path)) {\n next.delete(path);\n } else {\n next.add(path);\n }\n return next;\n });\n }, []);\n\n const handleStage = async (file: string) => {\n await action.mutateAsync({ repoPath, action: 'stage', data: { files: [file] } });\n };\n\n const handleUnstage = async (file: string) => {\n await action.mutateAsync({ repoPath, action: 'unstage', data: { files: [file] } });\n };\n\n const handleStageAll = async () => {\n await action.mutateAsync({ repoPath, action: 'stage', data: { files: ['.'] } });\n }\n\n const handleUnstageAll = async () => {\n await action.mutateAsync({ repoPath, action: 'unstage', data: { files: staged } });\n }\n\n const handleStash = async () => {\n await action.mutateAsync({ repoPath, action: 'stash', data: { message: stashMessage || undefined } });\n setStashDialogOpen(false);\n setStashMessage('');\n setSelectedFile(null);\n }\n\n const handleDiscard = async () => {\n await action.mutateAsync({ repoPath, action: 'discard', data: { includeUntracked: true } });\n setDiscardDialogOpen(false);\n setSelectedFile(null);\n }\n\n const handleCommit = async () => {\n const trimmedSubject = subject.trim();\n if (!trimmedSubject) return;\n\n if (isFirstCommit) {\n setFirstCommitDialogOpen(true);\n return;\n }\n\n await action.mutateAsync({\n repoPath,\n action: 'commit',\n data: { message: buildCommitMessage(trimmedSubject, body) },\n });\n setSubject('');\n setBody('');\n setSelectedFile(null);\n };\n\n const handleFirstCommitConfirm = async () => {\n const trimmedSubject = subject.trim();\n const trimmedBranchName = initialBranchName.trim();\n if (!trimmedSubject || !trimmedBranchName) return;\n\n await action.mutateAsync({\n repoPath,\n action: 'commit',\n data: {\n message: buildCommitMessage(trimmedSubject, body),\n initialBranch: trimmedBranchName,\n },\n });\n\n setSubject('');\n setBody('');\n setSelectedFile(null);\n setFirstCommitDialogOpen(false);\n };\n\n useEscapeDismiss(stashDialogOpen, () => setStashDialogOpen(false), () => {\n if (action.isPending) {\n return;\n }\n void handleStash();\n });\n useEscapeDismiss(discardDialogOpen, () => setDiscardDialogOpen(false), () => {\n if (action.isPending) {\n return;\n }\n void handleDiscard();\n });\n useEscapeDismiss(firstCommitDialogOpen, () => setFirstCommitDialogOpen(false), () => {\n if (action.isPending || !initialBranchName.trim()) {\n return;\n }\n void handleFirstCommitConfirm();\n });\n\n const handleCommitShortcut = (e: React.KeyboardEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') {\n e.preventDefault();\n if (staged.length > 0 && subject.trim() && !action.isPending) {\n handleCommit();\n }\n }\n };\n\n if (isLoading) {\n return <div className=\"flex items-center justify-center h-64\"><span className=\"loading loading-spinner text-base-content/50\"></span></div>;\n }\n\n if (isError) {\n return (\n <div className=\"flex items-center justify-center h-64 flex-col gap-4\">\n <p className=\"text-error font-bold\">Error Loading Status</p>\n <p className=\"text-sm opacity-70\">{(error as Error)?.message || 'An unknown error occurred'}</p>\n <button onClick={() => refetch()} className=\"btn btn-outline btn-sm\">\n <i className=\"iconoir-refresh-circle text-[16px] mr-1\" aria-hidden=\"true\" />\n Try Again\n </button>\n </div>\n );\n }\n\n if (!status) return <div className=\"flex items-center justify-center h-64 opacity-70\">No status data available</div>;\n\n const headerActionButtonClass =\n \"flex h-8 items-center gap-1.5 rounded-md border border-slate-200 bg-white px-3 text-sm font-medium text-slate-600 transition-colors hover:bg-slate-50 hover:text-slate-900 disabled:cursor-not-allowed disabled:opacity-50 dark:border-slate-700 dark:bg-slate-900 dark:text-slate-300 dark:hover:bg-slate-800 dark:hover:text-slate-100\";\n\n return (\n <div className=\"flex h-full overflow-hidden\">\n <div className=\"flex flex-1 min-w-0 flex-col gap-2 overflow-hidden\">\n <div className=\"flex min-h-[57px] shrink-0 items-center justify-between gap-2 rounded-xl border border-slate-200 bg-white px-4 py-2 dark:border-slate-800 dark:bg-slate-900\">\n <h1 className=\"font-bold text-lg text-slate-900 dark:text-slate-100\">Changes</h1>\n <button className={headerActionButtonClass} onClick={() => refetch()} disabled={action.isPending} title=\"Refresh status\">\n {action.isPending ? <span className=\"loading loading-spinner loading-xs\"></span> : <i className=\"iconoir-refresh-circle text-[16px]\" aria-hidden=\"true\" />}\n Refresh\n </button>\n </div>\n\n <div className=\"flex flex-1 overflow-hidden rounded-xl border border-slate-200 bg-white dark:border-slate-800 dark:bg-slate-900\">\n {/* Left Panel: File List */}\n <div className=\"w-64 border-r border-slate-200 dark:border-slate-800 flex flex-col bg-slate-50/70 dark:bg-slate-900/70\">\n <div className=\"flex-1 overflow-y-auto\">\n {/* Unstaged Changes */}\n <div className=\"p-2\">\n <div className=\"flex items-center justify-between px-2 py-2 mb-1\">\n <h3 className=\"text-xs font-bold uppercase tracking-wider opacity-70\">Changes ({changes.length})</h3>\n <div className=\"flex items-center gap-0.5\">\n {changes.length === 0 && staged.length > 0 ? (\n <button className=\"btn btn-ghost btn-xs btn-square\" onClick={handleUnstageAll} title=\"Unstage All\">\n <i className=\"iconoir-arrow-up text-[16px]\" aria-hidden=\"true\" />\n </button>\n ) : (\n <button className=\"btn btn-ghost btn-xs btn-square\" onClick={handleStageAll} disabled={changes.length === 0} title=\"Stage All\">\n <i className=\"iconoir-arrow-down text-[16px]\" aria-hidden=\"true\" />\n </button>\n )}\n <button className=\"btn btn-ghost btn-xs btn-square\" onClick={() => setStashDialogOpen(true)} disabled={changes.length === 0 && staged.length === 0} title=\"Stash\">\n <i className=\"iconoir-download-square text-[16px]\" aria-hidden=\"true\" />\n </button>\n <button className=\"btn btn-ghost btn-xs btn-square text-error hover:bg-error/10\" onClick={() => setDiscardDialogOpen(true)} disabled={changes.length === 0} title=\"Discard All\">\n <i className=\"iconoir-trash text-[16px]\" aria-hidden=\"true\" />\n </button>\n </div>\n </div>\n <div className=\"space-y-0.5\">\n {changes.length === 0 && <p className=\"px-2 py-2 text-xs opacity-50 italic\">No changes</p>}\n {changes.length > 0 && (\n <StatusFileTreeItem\n node={changesTree}\n selectedFile={selectedFile}\n expandedFolders={expandedChangeFolders}\n onToggleFolder={handleToggleChangeFolder}\n onSelectFile={setSelectedFile}\n onActionFile={handleStage}\n actionType=\"stage\"\n actionPending={action.isPending}\n />\n )}\n </div>\n </div>\n\n <div className=\"h-px bg-slate-200 dark:bg-slate-800 mx-4 my-2\" />\n\n {/* Staged Changes */}\n <div className=\"p-2\">\n <div className=\"flex items-center justify-between px-2 py-2 mb-1\">\n <h3 className=\"text-xs font-bold uppercase tracking-wider opacity-70\">Staged ({staged.length})</h3>\n </div>\n <div className=\"space-y-0.5\">\n {staged.length === 0 && <p className=\"px-2 py-2 text-xs opacity-50 italic\">No staged changes</p>}\n {staged.length > 0 && (\n <StatusFileTreeItem\n node={stagedTree}\n selectedFile={selectedFile}\n expandedFolders={expandedStagedFolders}\n onToggleFolder={handleToggleStagedFolder}\n onSelectFile={setSelectedFile}\n onActionFile={handleUnstage}\n actionType=\"unstage\"\n actionPending={action.isPending}\n />\n )}\n </div>\n </div>\n </div>\n </div>\n\n {/* Right Panel: Diff View & Commit Box */}\n <div className=\"flex-1 flex flex-col bg-white dark:bg-slate-900 overflow-hidden\">\n {/* Diff View Area */}\n <div className=\"flex-1 overflow-hidden flex flex-col min-h-0\">\n {selectedFile ? (\n <div className=\"h-full flex flex-col\">\n <DiffView repoPath={repoPath} filePath={selectedFile} />\n </div>\n ) : (\n <div className=\"flex-1 flex flex-col items-center justify-center opacity-50\">\n <div className=\"p-8 rounded-full bg-slate-100 dark:bg-slate-800/60 mb-4 text-4xl\">\n <i className=\"iconoir-refresh-circle text-[32px]\" aria-hidden=\"true\" />\n </div>\n <p className=\"text-sm font-bold\">Select a file to view changes</p>\n </div>\n )}\n </div>\n\n {/* Resize Handle */}\n <div\n className=\"h-1.5 cursor-ns-resize flex items-center justify-center hover:bg-slate-100 dark:hover:bg-slate-800/60 transition-colors group shrink-0 border-t border-slate-200 dark:border-slate-800\"\n onMouseDown={handleResizeStart}\n >\n <div className=\"w-8 h-1 rounded-full bg-base-300 group-hover:bg-base-content/20 transition-colors\" />\n </div>\n\n {/* Commit Box */}\n <div\n className=\"flex flex-col border-t border-slate-200 dark:border-slate-800 bg-white dark:bg-slate-900 shrink-0\"\n style={{ height: commitBoxHeight }}\n >\n <div className=\"flex-1 p-4 overflow-y-auto\">\n <input\n type=\"text\"\n placeholder=\"Commit subject...\"\n value={subject}\n onChange={e => setSubject(e.target.value)}\n onKeyDown={handleCommitShortcut}\n className=\"input input-bordered w-full text-sm mb-2 font-sans\"\n />\n <textarea\n placeholder=\"Commit message body (optional)...\"\n value={body}\n onChange={e => setBody(e.target.value)}\n onKeyDown={handleCommitShortcut}\n className=\"textarea textarea-bordered w-full text-sm resize-none mb-3 font-sans flex-1\"\n style={{ minHeight: '80px', height: 'calc(100% - 90px)' }}\n />\n <button className=\"btn btn-primary w-full btn-sm\" onClick={handleCommit} disabled={staged.length === 0 || !subject.trim() || action.isPending}>\n {action.isPending ? <span className=\"loading loading-spinner loading-xs mr-2\"></span> : <span className=\"mr-2\">✅</span>}\n Commit Changes\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* Stash Dialog */}\n {stashDialogOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">Stash Changes</h3>\n <p className=\"py-4 opacity-70\">Save your local modifications to a new stash entry.</p>\n <div className=\"py-2\">\n <input\n type=\"text\"\n placeholder=\"Stash message (optional)\"\n value={stashMessage}\n onChange={(e) => setStashMessage(e.target.value)}\n autoFocus\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleStash();\n }\n }}\n className=\"input input-bordered w-full\"\n />\n </div>\n <div className=\"modal-action\">\n <button className=\"btn\" onClick={() => setStashDialogOpen(false)}>Cancel</button>\n <button className=\"btn btn-primary\" onClick={handleStash} disabled={action.isPending}>\n {action.isPending && <span className=\"loading loading-spinner loading-xs\"></span>}\n Stash\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button onClick={() => setStashDialogOpen(false)}>close</button>\n </form>\n </dialog>\n )}\n\n {/* Discard Dialog */}\n {discardDialogOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">Discard Changes</h3>\n <p className=\"py-4\">\n Are you sure you want to discard all unstaged changes and new files? This action cannot be undone.\n </p>\n <div className=\"modal-action\">\n <button className=\"btn\" onClick={() => setDiscardDialogOpen(false)}>Cancel</button>\n <button className=\"btn btn-error\" onClick={handleDiscard} disabled={action.isPending}>\n {action.isPending && <span className=\"loading loading-spinner loading-xs\"></span>}\n Discard\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button onClick={() => setDiscardDialogOpen(false)}>close</button>\n </form>\n </dialog>\n )}\n\n {firstCommitDialogOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">First Commit Branch</h3>\n <p className=\"py-4 opacity-70\">\n This repository has no commits yet. Choose the branch name for the first commit.\n </p>\n <div className=\"py-2\">\n <input\n type=\"text\"\n placeholder=\"Branch name\"\n value={initialBranchName}\n onChange={(e) => setInitialBranchName(sanitizeBranchName(e.target.value))}\n autoFocus\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleFirstCommitConfirm();\n }\n }}\n className=\"input input-bordered w-full\"\n />\n </div>\n <div className=\"modal-action\">\n <button className=\"btn\" onClick={() => setFirstCommitDialogOpen(false)}>\n Cancel\n </button>\n <button className=\"btn btn-primary\" onClick={handleFirstCommitConfirm} disabled={!initialBranchName.trim() || action.isPending}>\n {action.isPending && <span className=\"loading loading-spinner loading-xs\"></span>}\n Commit to Branch\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button onClick={() => setFirstCommitDialogOpen(false)}>close</button>\n </form>\n </dialog>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":"wDAEA,EAAA,EAAA,CAAA,CAAA,OCAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,MACA,EAAA,EAAA,CAAA,CAAA,OAEA,IAAM,EAA2E,EAAE,CAEnF,SAAS,EAAmB,CAAe,CAAE,CAAY,EACrD,IAAM,EAAiB,EAAQ,IAAI,GAC7B,EAAiB,EAAK,OAAO,CAAC,QAAS,MAC7C,OAAO,EAAe,IAAI,GAAK,CAAA,EAAG,eAAe;AAAA;AAAI,EAAE,EAAA,CAAgB,CAAG,CAC9E,CASA,SAAS,EAAoB,CAAe,EACxC,IAAM,EAA2B,CAC7B,KAAM,GACN,KAAM,GACN,SAAU,IAAI,GAClB,EAEA,IAAK,IAAM,KAAY,EAAO,CAC1B,IAAM,EAAQ,EAAS,KAAK,CAAC,KAAK,MAAM,CAAC,SACrC,EAAU,EACV,EAAc,GAElB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,MAAM,CAAE,IAAK,CACnC,IAAM,EAAO,CAAK,CAAC,EAAE,CACrB,EAAc,EAAc,CAAA,EAAG,EAAY,CAAC,EAAE,EAAA,CAAM,CAAG,EAEnD,AAAC,EAAQ,QAAQ,CAAC,GAAG,CAAC,IACtB,EAAQ,CADqB,OACb,CAAC,GAAG,CAAC,EAAM,CACvB,KAAM,EACN,KAAM,EACN,SAAU,IAAI,GAClB,GAGJ,EAAU,EAAQ,QAAQ,CAAC,GAAG,CAAC,GAE3B,IAAM,EAAM,MAAM,CAAG,GAAG,CACxB,EAAQ,QAAQ,CAAG,CAAA,CAE3B,CACJ,CAEA,OAAO,CACX,CAEA,SAAS,EAAmB,CAAwB,EAChD,IAAM,EAAkB,EAAE,CAU1B,OAPA,AAFiB,MAAM,IAAI,CAAC,EAAK,QAAQ,CAAC,MAAM,IAEvC,OAAO,CAAC,AAAC,IACV,EAAM,QAAQ,CAAC,IAAI,CAAG,GAAG,CACzB,EAAM,IAAI,CAAC,EAAM,IAAI,EACrB,EAAM,IAAI,IAAI,EAAmB,IAEzC,GAEO,CACX,CAEA,SAAS,EAAe,CAAgB,EACpC,IAAM,EAAQ,EAAS,KAAK,CAAC,KAAK,MAAM,CAAC,SACnC,EAAwB,EAAE,CAEhC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,MAAM,CAAE,IAAK,AACnC,EAAY,IAAI,CAAC,EAAM,KAAK,CAAC,EAAG,GAAG,IAAI,CAAC,MAG5C,OAAO,CACX,CAEA,SAAS,EAAmB,MACxB,CAAI,cACJ,CAAY,iBACZ,CAAe,CACf,gBAAc,cACd,CAAY,cACZ,CAAY,YACZ,CAAU,eACV,CAAa,OACb,EAAQ,CAAC,CAWZ,EACG,IAAM,EAAW,MAAM,IAAI,CAAC,EAAK,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,EAAG,KACzD,IAAM,EAAY,EAAE,QAAQ,CAAC,IAAI,CAAG,EAC9B,EAAY,EAAE,QAAQ,CAAC,IAAI,CAAG,SAEpC,AAAI,GAAa,CAAC,EAAkB,CAAC,EACjC,CAAC,GAAa,EAAkB,AADP,EAEtB,EAAE,IAAI,CAAC,AADe,aACF,CAAC,EAAE,IAAI,CACtC,GAEA,MACI,CAAA,EAAA,EAAA,GAAA,EAAA,EAAA,QAAA,CAAA,UACK,EAAS,GAAG,CAAC,AAAC,IAGX,GAFiB,CAEb,CAFmB,QAAQ,CAAC,IAAI,CAAG,EAEzB,CACV,IAAM,EAAa,EAAgB,GAAG,CAAC,EAAM,IAAI,EAEjD,MACI,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACG,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CACG,UAAU,wKACV,MAAO,CAAE,YAAa,CAAA,EAAW,GAAR,EAAa,EAAE,EAAE,CAAC,AAAC,EAC5C,QAAS,IAAM,EAAe,EAAM,IAAI,EACxC,MAAO,EAAM,IAAI,WAEjB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,kCAA0B,EAAa,IAAM,MAC7D,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,wCAAwC,cAAY,SACjE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,2BAAmB,EAAM,IAAI,MAEhD,GACG,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CACG,KAAM,EACN,aAAc,EACd,gBAAiB,EACjB,eAAgB,EAChB,aAAc,EACd,aAAc,EACd,WAAY,EACZ,cAAe,EACf,MAAO,EAAQ,MArBjB,EAAM,IAAI,CA0B5B,CAEA,IAAM,EAAW,EAAM,QAAQ,QAC/B,AAAK,EAGD,CAAA,CAHA,CAGA,EAAA,GAHW,CAGX,EAAC,MAAA,CAEG,UAAW,CAAA,EAAA,EAAA,EAAA,AAAE,EACT,8JACA,IAAiB,GAAY,8DAEjC,MAAO,CAAE,YAAa,CAAA,EAAW,GAAR,EAAa,EAAE,EAAE,CAAC,AAAC,EAC5C,QAAS,IAAM,EAAa,GAC5B,MAAO,YAEP,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,mDACX,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,+CAA+C,cAAY,SACxE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,6CAAqC,EAAM,IAAI,MAEnE,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACG,UAAW,CAAA,EAAA,EAAA,EAAA,AAAE,EACT,uFACe,UAAf,EACM,mCACA,gCAEV,QAAS,AAAC,IACN,EAAE,eAAe,GACZ,EAAa,EACtB,EACA,SAAU,WAEV,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CACG,UAAW,CAAA,EAAA,EAAA,EAAA,AAAE,EACT,cACe,UAAf,EAAyB,sBAAwB,wBAErD,cAAY,aA/Bf,GAJS,IAwC1B,IAGZ,CAEO,SAAS,EAAW,UAAE,CAAQ,CAAwB,EACzD,GAAM,CAAE,KAAM,CAAM,WAAE,CAAS,SAAE,CAAO,OAAE,CAAK,SAAE,CAAO,CAAE,CAAG,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,GACpE,CAAE,KAAM,CAAQ,CAAE,CAAG,CAAA,EAAA,EAAA,cAAA,AAAc,EAAC,GACpC,EAAS,CAAA,EAAA,EAAA,YAAA,AAAY,IACrB,CAAC,EAAS,EAAW,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IACjC,CAAC,EAAM,EAAQ,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IAC3B,CAAC,EAAc,EAAgB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAgB,MAC1D,CAAC,EAAiB,EAAmB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACjD,CAAC,EAAc,EAAgB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IAC3C,CAAC,EAAmB,EAAqB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACrD,CAAC,EAAuB,EAAyB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAC7D,CAAC,EAAmB,EAAqB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,QACrD,CAAC,EAAwB,EAA0B,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAc,IAAI,KAChF,CAAC,EAAwB,EAA0B,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,EAAsB,IAAI,KAGhF,CAAC,EAAiB,EAAmB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,KACjD,CAAC,EAAY,EAAc,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACvC,EAAY,CAAA,EAAA,EAAA,MAAA,AAAM,EAAiD,MAEzE,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACN,IAAM,EAAkB,AAAC,IACrB,GAAI,CAAC,GAAc,CAAC,EAAU,OAAO,CAAE,OACvC,IAAM,EAAQ,EAAU,OAAO,CAAC,MAAM,CAAG,EAAE,OAAO,CAElD,EADkB,KAAK,GAAG,CAAC,IAAK,IACb,CADkB,GAAG,CAAC,IAAK,EAAU,OAAO,CAAC,WAAW,CAAG,IAElF,EAEM,EAAgB,KAClB,GAAc,GACd,EAAU,OAAO,CAAG,KACpB,SAAS,IAAI,CAAC,KAAK,CAAC,MAAM,CAAG,UAC7B,SAAS,IAAI,CAAC,KAAK,CAAC,UAAU,CAAG,MACrC,EASA,OAPI,IACA,OAAO,CADK,eACW,CAAC,YAAa,GACrC,OAAO,gBAAgB,CAAC,UAAW,GACnC,SAAS,IAAI,CAAC,KAAK,CAAC,MAAM,CAAG,YAC7B,SAAS,IAAI,CAAC,KAAK,CAAC,UAAU,CAAG,QAG9B,KACH,OAAO,mBAAmB,CAAC,YAAa,GACxC,OAAO,mBAAmB,CAAC,UAAW,GACtC,SAAS,IAAI,CAAC,KAAK,CAAC,MAAM,CAAG,UAC7B,SAAS,IAAI,CAAC,KAAK,CAAC,UAAU,CAAG,MACrC,CACJ,EAAG,CAAC,EAAW,EAQf,IAAM,EAAQ,GAAQ,OAAS,EACzB,EAAgB,CAAC,CAAC,GAAyC,IAA7B,EAAS,QAAQ,CAAC,MAAM,CAGtD,QAAE,CAAM,SAAE,CAAO,CAAE,CAAG,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,KAChC,IAAM,EAAwB,EAAE,CAC1B,EAAyB,EAAE,CAWjC,OATA,EAAM,OAAO,CAAE,AAAD,IACS,MAAf,EAAK,KAAK,EAA2B,KAAK,CAApB,EAAK,KAAK,EAChC,EAAY,IAAI,CAAC,EAAK,IAAI,GAEL,MAArB,EAAK,WAAW,EAA2B,AAAf,QAAK,KAAU,AAAL,GAAU,AAChD,EAAa,IAAI,CAAC,EAAK,IAAI,CAEnC,GAEO,CACH,OAAQ,EACR,QAAS,CACb,CACJ,EAAG,CAAC,EAAM,EAEJ,EAAc,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,IAAM,EAAoB,GAAU,CAAC,EAAQ,EACnE,EAAa,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,IAAM,EAAoB,GAAS,CAAC,EAAO,EAChE,EAAuB,CAAA,EAAA,EAAA,OAAO,AAAP,EAAQ,IAAM,EAAmB,GAAc,CAAC,EAAY,EACnF,EAAuB,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,IAAM,EAAmB,GAAa,CAAC,EAAW,EAEjF,EAAwB,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,KAClC,IAAM,EAAW,IAAI,IAYrB,OAVA,EAAqB,OAAO,CAAC,AAAC,IACtB,AAAC,EAAuB,GAAG,CAAC,IAC5B,EAAS,CAD0B,EACvB,CAAC,EAErB,GAEI,GACA,EAAe,GAAc,MADf,CACsB,CAAC,AAAC,GAAS,EAAS,GAAG,CAAC,IAGzD,CACX,EAAG,CAAC,EAAsB,EAAwB,EAAa,EAEzD,GAAwB,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,KAClC,IAAM,EAAW,IAAI,IAYrB,OAVA,EAAqB,OAAO,CAAE,AAAD,IACrB,AAAC,EAAuB,GAAG,CAAC,IAC5B,EAAS,CAD0B,EACvB,CAAC,EAErB,GAEI,GACA,EAAe,GAAc,MADf,CACsB,CAAE,AAAD,GAAU,EAAS,GAAG,CAAC,IAGzD,CACX,EAAG,CAAC,EAAsB,EAAwB,EAAa,EAEzD,GAA2B,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,AAAC,IAC1C,EAA0B,AAAC,IACvB,IAAM,EAAO,IAAI,IAAI,GAMrB,OALI,EAAK,GAAG,CAAC,GACT,EAAK,EADW,IACL,CAAC,GAEZ,EAAK,GAAG,CAAC,GAEN,CACX,EACJ,EAAG,EAAE,EAEC,GAA2B,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,AAAC,IAC1C,EAA0B,AAAC,IACvB,IAAM,EAAO,IAAI,IAAI,GAMrB,OALI,EAAK,GAAG,CAAC,GACT,EAAK,EADW,IACL,CAAC,GAEZ,EAAK,GAAG,CAAC,GAEN,CACX,EACJ,EAAG,EAAE,EAEC,GAAc,MAAO,IACvB,MAAM,EAAO,WAAW,CAAC,UAAE,EAAU,OAAQ,QAAS,KAAM,CAAE,MAAO,CAAC,EAAM,AAAD,CAAG,EAClF,EAEM,GAAgB,MAAO,IACzB,MAAM,EAAO,WAAW,CAAC,UAAE,EAAU,OAAQ,UAAW,KAAM,CAAE,MAAO,CAAC,EAAK,AAAC,CAAE,EACpF,EAEM,GAAiB,UACnB,MAAM,EAAO,WAAW,CAAC,UAAE,EAAU,OAAQ,QAAS,KAAM,CAAE,MAAO,CAAC,IAAI,AAAC,CAAE,EACjF,EAEM,GAAmB,UACrB,MAAM,EAAO,WAAW,CAAC,UAAE,EAAU,OAAQ,UAAW,KAAM,CAAE,MAAO,CAAO,CAAE,EACpF,EAEM,GAAc,UAChB,MAAM,EAAO,WAAW,CAAC,UAAE,EAAU,OAAQ,QAAS,KAAM,CAAE,QAAS,QAAgB,CAAU,CAAE,GACnG,GAAmB,GACnB,EAAgB,IAChB,EAAgB,KACpB,EAEM,GAAgB,UAClB,MAAM,EAAO,WAAW,CAAC,UAAE,EAAU,OAAQ,UAAW,KAAM,CAAE,kBAAkB,CAAK,CAAE,GACzF,GAAqB,GACrB,EAAgB,KACpB,EAEM,GAAe,UACjB,IAAM,EAAiB,EAAQ,IAAI,GACnC,GAAK,CAAD,EAEJ,GAAI,EAAe,QAFE,IAGjB,GAAyB,EAI7B,OAAM,EAAO,WAAW,CAAC,UACrB,EACA,OAAQ,SACR,KAAM,CAAE,QAAS,EAAmB,EAAgB,EAAM,CAC9D,GACA,EAAW,IACX,EAAQ,IACR,EAAgB,MACpB,EAEM,GAA2B,UAC7B,IAAM,EAAiB,EAAQ,IAAI,GAC7B,EAAoB,EAAkB,IAAI,GAC3C,GAAmB,IAExB,MAAM,EAAO,GAFU,IAAoB,IAEnB,CAAC,UACrB,EACA,OAAQ,SACR,KAAM,CACF,QAAS,EAAmB,EAAgB,GAC5C,cAAe,CACnB,CACJ,GAEA,EAAW,IACX,EAAQ,IACR,EAAgB,MAChB,GAAyB,GAC7B,EAEA,CAAA,EAAA,EAAA,gBAAA,AAAgB,EAAC,EAAiB,IAAM,GAAmB,GAAQ,KAC3D,EAAO,SAAS,EAAE,AAGjB,IACT,GACA,CAAA,EAAA,EAAA,gBAAgB,AAAhB,EAAiB,EAAmB,IAAM,GAAqB,GAAQ,KAC/D,EAAO,SAAS,EAAE,AAGjB,IACT,GACA,CAAA,EAAA,EAAA,gBAAA,AAAgB,EAAC,EAAuB,IAAM,GAAyB,GAAQ,MACvE,EAAO,SAAS,EAAK,EAAD,AAAmB,IAAI,IAAI,AAG9C,IACT,GAEA,IAAM,GAAuB,AAAC,IACrB,GAAE,OAAO,EAAI,EAAE,OAAA,AAAO,GAAe,SAAS,CAAnB,EAAE,GAAG,GACjC,EAAE,cAAc,GACZ,EAAO,MAAM,CAAG,GAAK,EAAQ,IAAI,IAAM,CAAC,EAAO,SAAS,EACxD,AAD0D,KAItE,SAEA,AAAI,EACO,CAAA,EAAA,EAAA,GAAA,CADI,CACH,MAAA,CAAI,UAAU,iDAAwC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,mDAG9E,EAEI,CAAA,EAAA,EAAA,EAFK,EAEL,EAAC,MAAA,CAAI,UAAU,iEACX,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,gCAAuB,yBACpC,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,8BAAuB,GAAiB,SAAW,8BAChE,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAAO,QAAS,IAAM,IAAW,UAAU,mCACxC,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,0CAA0C,cAAY,SAAS,kBAOvF,EAMD,CAAA,EAAA,EAAA,CANS,GAMT,EAAC,MAAA,CAAI,UAAU,wCACX,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,+DACX,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,wKACX,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,gEAAuD,YACrE,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAAO,UAPpB,CAO+B,0UAAyB,QAAS,IAAM,IAAW,SAAU,EAAO,SAAS,CAAE,MAAM,2BACnG,EAAO,SAAS,CAAG,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,uCAA+C,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,qCAAqC,cAAY,SAAU,gBAKnK,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,4HAEX,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,kHACX,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,mCAEX,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,gBACX,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,6DACX,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,CAAG,UAAU,kEAAwD,YAAU,EAAQ,MAAM,CAAC,OAC/F,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sCACS,IAAnB,EAAQ,MAAM,EAAU,EAAO,MAAM,CAAG,EACrC,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,UAAU,kCAAkC,QAAS,GAAkB,MAAM,uBACjF,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,+BAA+B,cAAY,WAG5D,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,UAAU,kCAAkC,QAAS,GAAgB,SAA6B,IAAnB,EAAQ,MAAM,CAAQ,MAAM,qBAC/G,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,iCAAiC,cAAY,WAGlE,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,UAAU,kCAAkC,QAAS,IAAM,GAAmB,GAAO,SAA6B,IAAnB,EAAQ,MAAM,EAA4B,IAAlB,EAAO,MAAM,CAAQ,MAAM,iBACtJ,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,sCAAsC,cAAY,WAEnE,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,UAAU,+DAA+D,QAAS,IAAM,GAAqB,GAAO,SAAU,AAAmB,MAAX,MAAM,CAAQ,MAAM,uBAC9J,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,4BAA4B,cAAY,iBAIjE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,wBACV,AAAmB,MAAX,MAAM,EAAU,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,+CAAsC,eAC3E,EAAQ,MAAM,CAAG,GACd,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CACG,KAAM,EACN,aAAc,EACd,gBAAiB,EACjB,eAAgB,GAChB,aAAc,EACd,aAAc,GACd,WAAW,QACX,cAAe,EAAO,SAAS,SAM/C,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,kDAGf,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,gBACX,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,4DACX,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,CAAG,UAAU,kEAAwD,WAAS,EAAO,MAAM,CAAC,SAEjG,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,wBACQ,IAAlB,EAAO,MAAM,EAAU,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,+CAAsC,sBAC1E,EAAO,MAAM,CAAG,GACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CACG,KAAM,EACN,aAAc,EACd,gBAAiB,GACjB,eAAgB,GAChB,aAAc,EACd,aAAc,GACd,WAAW,UACX,cAAe,EAAO,SAAS,cASvD,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,4EAEX,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,wDACV,EACG,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,gCACX,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,QAAQ,CAAA,CAAC,SAAU,EAAU,SAAU,MAG5C,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,wEACX,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,4EACX,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,qCAAqC,cAAY,WAElE,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,6BAAoB,uCAM7C,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CACG,UAAU,yLACV,YArTE,AAAC,CAqTU,GApTjC,EAAE,cAAc,GAChB,GAAc,GACd,EAAU,OAAO,CAAG,CAAE,OAAQ,EAAE,OAAO,CAAE,YAAa,CAAgB,CAC1E,WAmTwB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,wFAInB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CACG,UAAU,oGACV,MAAO,CAAE,OAAQ,CAAgB,WAEjC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,uCACX,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACG,KAAK,OACL,YAAY,oBACZ,MAAO,EACP,SAAU,GAAK,EAAW,EAAE,MAAM,CAAC,KAAK,EACxC,UAAW,GACX,UAAU,uDAEd,CAAA,EAAA,EAAA,GAAA,EAAC,WAAA,CACG,YAAY,oCACZ,MAAO,EACP,SAAU,GAAK,EAAQ,EAAE,MAAM,CAAC,KAAK,EACrC,UAAW,GACX,UAAU,8EACV,MAAO,CAAE,UAAW,OAAQ,OAAQ,mBAAoB,IAE5D,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAAO,UAAU,gCAAgC,QAAS,GAAc,SAA4B,IAAlB,EAAO,MAAM,EAAU,CAAC,EAAQ,IAAI,IAAM,EAAO,SAAS,WACxI,EAAO,SAAS,CAAG,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,4CAAoD,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,gBAAO,MAAS,kCAU/I,GACG,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAAO,UAAU,6BACd,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sBACX,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,6BAAoB,kBAClC,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,2BAAkB,wDAC/B,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,gBACX,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACG,KAAK,OACL,YAAY,2BACZ,MAAO,EACP,SAAU,AAAC,GAAM,EAAgB,EAAE,MAAM,CAAC,KAAK,EAC/C,SAAS,CAAA,CAAA,EACT,UAAW,AAAC,IACM,SAAS,CAAnB,EAAE,GAAG,GACL,EAAE,cAAc,GAChB,KAER,EACA,UAAU,kCAGlB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,yBACX,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,UAAU,MAAM,QAAS,IAAM,GAAmB,YAAQ,WAClE,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAAO,UAAU,kBAAkB,QAAS,GAAa,SAAU,EAAO,SAAS,WAC/E,EAAO,SAAS,EAAI,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,uCAA6C,iBAK9F,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,OAAO,SAAS,UAAU,0BAC5B,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,QAAS,IAAM,GAAmB,YAAQ,eAM7D,GACG,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAAO,UAAU,6BACd,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sBACX,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,6BAAoB,oBAClC,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,gBAAO,uGAGpB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,yBACX,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,UAAU,MAAM,QAAS,IAAM,GAAqB,YAAQ,WACpE,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAAO,UAAU,gBAAgB,QAAS,GAAe,SAAU,EAAO,SAAS,WAC/E,EAAO,SAAS,EAAI,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,uCAA6C,mBAK9F,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,OAAO,SAAS,UAAU,0BAC5B,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,QAAS,IAAM,GAAqB,YAAQ,eAK/D,GACG,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAAO,UAAU,6BACd,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sBACX,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,6BAAoB,wBAClC,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,2BAAkB,qFAG/B,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,gBACX,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACG,KAAK,OACL,YAAY,cACZ,MAAO,EACP,SAAU,AAAC,GAAM,EAAqB,CAAA,EAAA,EAAA,kBAAA,AAAkB,EAAC,EAAE,MAAM,CAAC,KAAK,GACvE,SAAS,CAAA,CAAA,EACT,UAAW,AAAC,IACM,SAAS,CAAnB,EAAE,GAAG,GACL,EAAE,cAAc,GAChB,KAER,EACA,UAAU,kCAGlB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,yBACX,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,UAAU,MAAM,QAAS,IAAM,GAAyB,YAAQ,WAGxE,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAAO,UAAU,kBAAkB,QAAS,GAA0B,SAAU,CAAC,EAAkB,IAAI,IAAM,EAAO,SAAS,WACzH,EAAO,SAAS,EAAI,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,uCAA6C,4BAK9F,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,OAAO,SAAS,UAAU,0BAC5B,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,QAAS,IAAM,EAAyB,aAAQ,kBA3OxD,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,4DAAmD,4BAiP1F,CD7qBA,IAAA,EAAA,EAAA,CAAA,CAAA,OAEA,SAAS,IAEP,IAAM,EADe,AACJ,CADI,EAAA,EAAA,eAAA,AAAe,IACN,GAAG,CAAC,cAIlC,CAFA,CAAA,EAEI,AAFJ,EAAA,iBAAiB,AAAjB,EAAkB,EAAU,WAEvB,GAIE,CAAA,EAAA,EAAA,EAJQ,CAIR,EAAC,EAAA,CAAW,SAAU,IAHpB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,eAAM,iCAIhC,CAEe,SAAS,IACtB,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,QAAQ,CAAA,CAAC,SAAU,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,mDAA0C,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,uCAC3F,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAA,IAGP"}