vibesurf 0.1.21__py3-none-any.whl → 0.2.6__py3-none-any.whl

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.

Potentially problematic release.


This version of vibesurf might be problematic. Click here for more details.

Files changed (2868) hide show
  1. vibe_surf/_version.py +2 -2
  2. vibe_surf/agents/browser_use_agent.py +16 -354
  3. vibe_surf/agents/prompts/vibe_surf_prompt.py +45 -0
  4. vibe_surf/agents/report_writer_agent.py +71 -21
  5. vibe_surf/agents/vibe_surf_agent.py +234 -111
  6. vibe_surf/agents/views.py +6 -15
  7. vibe_surf/backend/api/agent.py +38 -0
  8. vibe_surf/backend/api/composio.py +1047 -0
  9. vibe_surf/backend/api/config.py +3 -1
  10. vibe_surf/backend/api/schedule.py +331 -0
  11. vibe_surf/backend/api/task.py +2 -2
  12. vibe_surf/backend/api/vibesurf.py +449 -0
  13. vibe_surf/backend/database/migrations/v005_add_composio_integration.sql +33 -0
  14. vibe_surf/backend/database/migrations/v006_add_credentials_table.sql +26 -0
  15. vibe_surf/backend/database/migrations/v007_add_schedule_table.sql +29 -0
  16. vibe_surf/backend/database/models.py +86 -1
  17. vibe_surf/backend/database/queries.py +567 -4
  18. vibe_surf/backend/frontend/assets/MCPLangflow-Bzb6g6Zx.png +0 -0
  19. vibe_surf/backend/frontend/assets/SlackIcon-DH9MFXnM.js +1 -0
  20. vibe_surf/backend/frontend/assets/Wikipedia-MKjlsFhR.js +1 -0
  21. vibe_surf/backend/frontend/assets/Wolfram-DZjh94KW.js +1 -0
  22. vibe_surf/backend/frontend/assets/__vite-browser-external-BIHI7g3E.js +1 -0
  23. vibe_surf/backend/frontend/assets/a-arrow-down-M5pMOHfz.js +6 -0
  24. vibe_surf/backend/frontend/assets/a-arrow-up-Bhux1P9g.js +6 -0
  25. vibe_surf/backend/frontend/assets/a-large-small-CxpoIZ2k.js +6 -0
  26. vibe_surf/backend/frontend/assets/accessibility-DIOswxup.js +6 -0
  27. vibe_surf/backend/frontend/assets/activity-Cgoj6BfB.js +6 -0
  28. vibe_surf/backend/frontend/assets/air-vent-BRuCRSP-.js +6 -0
  29. vibe_surf/backend/frontend/assets/airplay-D6ddOHpT.js +6 -0
  30. vibe_surf/backend/frontend/assets/alarm-clock-BswE0svo.js +6 -0
  31. vibe_surf/backend/frontend/assets/alarm-clock-check-CMKnL746.js +6 -0
  32. vibe_surf/backend/frontend/assets/alarm-clock-minus-Cmry03T1.js +6 -0
  33. vibe_surf/backend/frontend/assets/alarm-clock-off-ByCGR7KD.js +6 -0
  34. vibe_surf/backend/frontend/assets/alarm-clock-plus-D80NSz4S.js +6 -0
  35. vibe_surf/backend/frontend/assets/alarm-smoke-DyUVOJUh.js +6 -0
  36. vibe_surf/backend/frontend/assets/album-CGIJADgR.js +6 -0
  37. vibe_surf/backend/frontend/assets/align-center-Cb9nxg1u.js +6 -0
  38. vibe_surf/backend/frontend/assets/align-center-horizontal-DunWyH8w.js +6 -0
  39. vibe_surf/backend/frontend/assets/align-center-vertical-COWbwf4r.js +6 -0
  40. vibe_surf/backend/frontend/assets/align-end-horizontal-BXGWZnJg.js +6 -0
  41. vibe_surf/backend/frontend/assets/align-end-vertical-DsDprlL7.js +6 -0
  42. vibe_surf/backend/frontend/assets/align-horizontal-distribute-center-fSZ29QkE.js +6 -0
  43. vibe_surf/backend/frontend/assets/align-horizontal-distribute-end-C3BFRnLg.js +6 -0
  44. vibe_surf/backend/frontend/assets/align-horizontal-distribute-start-DqYzU1-w.js +6 -0
  45. vibe_surf/backend/frontend/assets/align-horizontal-justify-center-2iNXkDKh.js +6 -0
  46. vibe_surf/backend/frontend/assets/align-horizontal-justify-end-COPIkT0U.js +6 -0
  47. vibe_surf/backend/frontend/assets/align-horizontal-justify-start-DoS3Jrzb.js +6 -0
  48. vibe_surf/backend/frontend/assets/align-horizontal-space-around-k9yEGjMh.js +6 -0
  49. vibe_surf/backend/frontend/assets/align-horizontal-space-between-C6RzmtkD.js +6 -0
  50. vibe_surf/backend/frontend/assets/align-justify-BvD3xtAK.js +6 -0
  51. vibe_surf/backend/frontend/assets/align-left-BP84nxXJ.js +6 -0
  52. vibe_surf/backend/frontend/assets/align-right-6z3k9YVj.js +6 -0
  53. vibe_surf/backend/frontend/assets/align-start-horizontal-DRihqJTg.js +6 -0
  54. vibe_surf/backend/frontend/assets/align-start-vertical-Bs-ISVmy.js +6 -0
  55. vibe_surf/backend/frontend/assets/align-vertical-distribute-center-CU82VWLq.js +6 -0
  56. vibe_surf/backend/frontend/assets/align-vertical-distribute-end-IrubG5LP.js +6 -0
  57. vibe_surf/backend/frontend/assets/align-vertical-distribute-start-BgBu3t8X.js +6 -0
  58. vibe_surf/backend/frontend/assets/align-vertical-justify-center-e7psKZ4D.js +6 -0
  59. vibe_surf/backend/frontend/assets/align-vertical-justify-end-CncIBU5b.js +6 -0
  60. vibe_surf/backend/frontend/assets/align-vertical-justify-start-21_MQReA.js +6 -0
  61. vibe_surf/backend/frontend/assets/align-vertical-space-around-NJNn7zPP.js +6 -0
  62. vibe_surf/backend/frontend/assets/align-vertical-space-between-LYs4c5i9.js +6 -0
  63. vibe_surf/backend/frontend/assets/ambulance-jMfwSVYH.js +6 -0
  64. vibe_surf/backend/frontend/assets/ampersand-B1-1HYj1.js +6 -0
  65. vibe_surf/backend/frontend/assets/ampersands-DVVxe50v.js +6 -0
  66. vibe_surf/backend/frontend/assets/amphora-B12bYdql.js +6 -0
  67. vibe_surf/backend/frontend/assets/anchor-C_JuZyO5.js +6 -0
  68. vibe_surf/backend/frontend/assets/angry-KqzvbAxB.js +6 -0
  69. vibe_surf/backend/frontend/assets/annoyed-CZXUdq0q.js +6 -0
  70. vibe_surf/backend/frontend/assets/antenna-CFlKnuEE.js +6 -0
  71. vibe_surf/backend/frontend/assets/anvil-ObmOBzcW.js +6 -0
  72. vibe_surf/backend/frontend/assets/aperture-CU6mXxj8.js +6 -0
  73. vibe_surf/backend/frontend/assets/apify_white-uCJdZkTU.png +0 -0
  74. vibe_surf/backend/frontend/assets/app-window-D5iSiHiS.js +6 -0
  75. vibe_surf/backend/frontend/assets/app-window-mac-QOaPWoGX.js +6 -0
  76. vibe_surf/backend/frontend/assets/apple-D7ZsI-et.js +6 -0
  77. vibe_surf/backend/frontend/assets/archive-FLn_d8Ny.js +6 -0
  78. vibe_surf/backend/frontend/assets/archive-restore-C668KwvC.js +6 -0
  79. vibe_surf/backend/frontend/assets/archive-x-DJJed9T2.js +6 -0
  80. vibe_surf/backend/frontend/assets/armchair-DfXLs0Nj.js +6 -0
  81. vibe_surf/backend/frontend/assets/arrow-big-down-DU2dtkeu.js +6 -0
  82. vibe_surf/backend/frontend/assets/arrow-big-down-dash-CzsIOlhF.js +6 -0
  83. vibe_surf/backend/frontend/assets/arrow-big-left-CCeUj8q9.js +6 -0
  84. vibe_surf/backend/frontend/assets/arrow-big-left-dash-CFpRtORj.js +6 -0
  85. vibe_surf/backend/frontend/assets/arrow-big-right-C1QE56k7.js +6 -0
  86. vibe_surf/backend/frontend/assets/arrow-big-right-dash-D6H2wruv.js +6 -0
  87. vibe_surf/backend/frontend/assets/arrow-big-up-0f0CsejQ.js +6 -0
  88. vibe_surf/backend/frontend/assets/arrow-big-up-dash-Dz-Sbw66.js +6 -0
  89. vibe_surf/backend/frontend/assets/arrow-down-0-1-B1PGN6BJ.js +6 -0
  90. vibe_surf/backend/frontend/assets/arrow-down-1-0-Bcl1KrrL.js +6 -0
  91. vibe_surf/backend/frontend/assets/arrow-down-DZKzcieL.js +6 -0
  92. vibe_surf/backend/frontend/assets/arrow-down-a-z-DurN_xiR.js +6 -0
  93. vibe_surf/backend/frontend/assets/arrow-down-from-line-D2i9DDA0.js +6 -0
  94. vibe_surf/backend/frontend/assets/arrow-down-left-Pid0zUYj.js +6 -0
  95. vibe_surf/backend/frontend/assets/arrow-down-narrow-wide-DtnDCgZY.js +6 -0
  96. vibe_surf/backend/frontend/assets/arrow-down-right-BgepY9bM.js +6 -0
  97. vibe_surf/backend/frontend/assets/arrow-down-to-dot-C5rQ12yn.js +6 -0
  98. vibe_surf/backend/frontend/assets/arrow-down-to-line-DovZ64L0.js +6 -0
  99. vibe_surf/backend/frontend/assets/arrow-down-up-D5-v7CDC.js +6 -0
  100. vibe_surf/backend/frontend/assets/arrow-down-wide-narrow-CGAsRLvP.js +6 -0
  101. vibe_surf/backend/frontend/assets/arrow-down-z-a-DOGHwUgR.js +6 -0
  102. vibe_surf/backend/frontend/assets/arrow-left-from-line-DwY8iDxY.js +6 -0
  103. vibe_surf/backend/frontend/assets/arrow-left-hKr3yGVm.js +6 -0
  104. vibe_surf/backend/frontend/assets/arrow-left-right-Be5fvvG0.js +6 -0
  105. vibe_surf/backend/frontend/assets/arrow-left-to-line-DKHIypu3.js +6 -0
  106. vibe_surf/backend/frontend/assets/arrow-right-BaRZuB8W.js +6 -0
  107. vibe_surf/backend/frontend/assets/arrow-right-from-line-D3jqt4-q.js +6 -0
  108. vibe_surf/backend/frontend/assets/arrow-right-left-BKRuMAR-.js +6 -0
  109. vibe_surf/backend/frontend/assets/arrow-right-to-line-rtWVy_CC.js +6 -0
  110. vibe_surf/backend/frontend/assets/arrow-up-0-1-yF8Nt_KM.js +6 -0
  111. vibe_surf/backend/frontend/assets/arrow-up-1-0-WRlLFmSw.js +6 -0
  112. vibe_surf/backend/frontend/assets/arrow-up-BKnAmgTC.js +6 -0
  113. vibe_surf/backend/frontend/assets/arrow-up-a-z-COXfk41y.js +6 -0
  114. vibe_surf/backend/frontend/assets/arrow-up-down-Dtw4v35K.js +6 -0
  115. vibe_surf/backend/frontend/assets/arrow-up-from-dot-B1XSjc2P.js +6 -0
  116. vibe_surf/backend/frontend/assets/arrow-up-from-line-C-lHvDpd.js +6 -0
  117. vibe_surf/backend/frontend/assets/arrow-up-left-CYojov8T.js +6 -0
  118. vibe_surf/backend/frontend/assets/arrow-up-narrow-wide-B54CYEHs.js +6 -0
  119. vibe_surf/backend/frontend/assets/arrow-up-right-Bdo9Z-7A.js +6 -0
  120. vibe_surf/backend/frontend/assets/arrow-up-to-line-DS_I-9Vp.js +6 -0
  121. vibe_surf/backend/frontend/assets/arrow-up-wide-narrow-B3GeXj9O.js +6 -0
  122. vibe_surf/backend/frontend/assets/arrow-up-z-a-CdyZuD75.js +6 -0
  123. vibe_surf/backend/frontend/assets/arrows-up-from-line-0sYhsLRw.js +6 -0
  124. vibe_surf/backend/frontend/assets/asterisk-CQWlVYDB.js +6 -0
  125. vibe_surf/backend/frontend/assets/at-sign-Dug8NlWL.js +6 -0
  126. vibe_surf/backend/frontend/assets/atom-Cx1vCOFb.js +6 -0
  127. vibe_surf/backend/frontend/assets/audio-lines-Cimsj6_f.js +6 -0
  128. vibe_surf/backend/frontend/assets/audio-waveform-BxCl1LyQ.js +6 -0
  129. vibe_surf/backend/frontend/assets/award-dRU3xhJ7.js +6 -0
  130. vibe_surf/backend/frontend/assets/axe-B8CCMGTD.js +6 -0
  131. vibe_surf/backend/frontend/assets/axis-3d-D2ZIjjx3.js +6 -0
  132. vibe_surf/backend/frontend/assets/baby-DWh5CwfC.js +6 -0
  133. vibe_surf/backend/frontend/assets/backpack-D9rjYWvf.js +6 -0
  134. vibe_surf/backend/frontend/assets/badge-C0r2CPAV.js +6 -0
  135. vibe_surf/backend/frontend/assets/badge-alert-Do89zN-s.js +6 -0
  136. vibe_surf/backend/frontend/assets/badge-cent-Dmv_cqc-.js +6 -0
  137. vibe_surf/backend/frontend/assets/badge-check--_Rese0X.js +6 -0
  138. vibe_surf/backend/frontend/assets/badge-dollar-sign-BHnNL8ma.js +6 -0
  139. vibe_surf/backend/frontend/assets/badge-euro-CKNQv-oO.js +6 -0
  140. vibe_surf/backend/frontend/assets/badge-help-BlZAHEa-.js +6 -0
  141. vibe_surf/backend/frontend/assets/badge-indian-rupee-BNIUcLaI.js +6 -0
  142. vibe_surf/backend/frontend/assets/badge-info-CrX5KTPR.js +6 -0
  143. vibe_surf/backend/frontend/assets/badge-japanese-yen-0mdbiK5f.js +6 -0
  144. vibe_surf/backend/frontend/assets/badge-minus-BX_scLIK.js +6 -0
  145. vibe_surf/backend/frontend/assets/badge-percent-BSJP3Okj.js +6 -0
  146. vibe_surf/backend/frontend/assets/badge-plus-DhlqCq3Z.js +6 -0
  147. vibe_surf/backend/frontend/assets/badge-pound-sterling-QpnkBN56.js +6 -0
  148. vibe_surf/backend/frontend/assets/badge-russian-ruble-L30Ncxnh.js +6 -0
  149. vibe_surf/backend/frontend/assets/badge-swiss-franc-BQrLli-C.js +6 -0
  150. vibe_surf/backend/frontend/assets/badge-x-DDXVSWE5.js +6 -0
  151. vibe_surf/backend/frontend/assets/baggage-claim-Nd9Qw4rX.js +6 -0
  152. vibe_surf/backend/frontend/assets/ban-fSKv80ss.js +6 -0
  153. vibe_surf/backend/frontend/assets/banana-DTClkW0x.js +6 -0
  154. vibe_surf/backend/frontend/assets/bandage-DLyvBCvf.js +6 -0
  155. vibe_surf/backend/frontend/assets/banknote-ArlwGdT1.js +6 -0
  156. vibe_surf/backend/frontend/assets/banknote-arrow-down-Dx9vP7KP.js +6 -0
  157. vibe_surf/backend/frontend/assets/banknote-arrow-up-CZNOWrKW.js +6 -0
  158. vibe_surf/backend/frontend/assets/banknote-x-y8ot0KXI.js +6 -0
  159. vibe_surf/backend/frontend/assets/barcode-U3mgwXvC.js +6 -0
  160. vibe_surf/backend/frontend/assets/baseline-Bb17nsNt.js +6 -0
  161. vibe_surf/backend/frontend/assets/bath-Fu-10Xqv.js +6 -0
  162. vibe_surf/backend/frontend/assets/battery-D2ng6PHz.js +6 -0
  163. vibe_surf/backend/frontend/assets/battery-charging-BBA_U97U.js +6 -0
  164. vibe_surf/backend/frontend/assets/battery-full-D74R09iv.js +6 -0
  165. vibe_surf/backend/frontend/assets/battery-low-BMeJBmJp.js +6 -0
  166. vibe_surf/backend/frontend/assets/battery-medium-clKHZw71.js +6 -0
  167. vibe_surf/backend/frontend/assets/battery-plus-DxtzU1bB.js +6 -0
  168. vibe_surf/backend/frontend/assets/battery-warning-1NEZ4eCa.js +6 -0
  169. vibe_surf/backend/frontend/assets/beaker-Br0pnmtw.js +6 -0
  170. vibe_surf/backend/frontend/assets/bean-B04lfjZo.js +6 -0
  171. vibe_surf/backend/frontend/assets/bean-off-C6H6plJJ.js +6 -0
  172. vibe_surf/backend/frontend/assets/bed-B7xWDlGQ.js +6 -0
  173. vibe_surf/backend/frontend/assets/bed-double-We8EVOE6.js +6 -0
  174. vibe_surf/backend/frontend/assets/bed-single-C-tVm75i.js +6 -0
  175. vibe_surf/backend/frontend/assets/beef-BzzCqLUx.js +6 -0
  176. vibe_surf/backend/frontend/assets/beer-B1aIU5Wp.js +6 -0
  177. vibe_surf/backend/frontend/assets/beer-off-T9p0sUQ_.js +6 -0
  178. vibe_surf/backend/frontend/assets/bell-BiEY08q7.js +6 -0
  179. vibe_surf/backend/frontend/assets/bell-dot-D6ZHJmF9.js +6 -0
  180. vibe_surf/backend/frontend/assets/bell-electric-BjP0O4kE.js +6 -0
  181. vibe_surf/backend/frontend/assets/bell-minus-Cw2KMMsV.js +6 -0
  182. vibe_surf/backend/frontend/assets/bell-off-JUGEvepv.js +6 -0
  183. vibe_surf/backend/frontend/assets/bell-plus-BtwPCtO5.js +6 -0
  184. vibe_surf/backend/frontend/assets/bell-ring-B_RAFBbK.js +6 -0
  185. vibe_surf/backend/frontend/assets/between-horizontal-end-DG9RojRP.js +6 -0
  186. vibe_surf/backend/frontend/assets/between-horizontal-start-BNuWKIUb.js +6 -0
  187. vibe_surf/backend/frontend/assets/between-vertical-end-CUvl7S4G.js +6 -0
  188. vibe_surf/backend/frontend/assets/between-vertical-start-tYvnZE7k.js +6 -0
  189. vibe_surf/backend/frontend/assets/biceps-flexed-D2zMmbhv.js +6 -0
  190. vibe_surf/backend/frontend/assets/bike-DPdpsZIt.js +6 -0
  191. vibe_surf/backend/frontend/assets/binary-DnnraEVk.js +6 -0
  192. vibe_surf/backend/frontend/assets/binoculars-BXc-CFA4.js +6 -0
  193. vibe_surf/backend/frontend/assets/biohazard-D-6PF7OA.js +6 -0
  194. vibe_surf/backend/frontend/assets/bird-CYNkrqM5.js +6 -0
  195. vibe_surf/backend/frontend/assets/bitcoin-DG6PDKEk.js +6 -0
  196. vibe_surf/backend/frontend/assets/blend-COR-wQIS.js +6 -0
  197. vibe_surf/backend/frontend/assets/blinds-_pD0AjwU.js +6 -0
  198. vibe_surf/backend/frontend/assets/blocks-C0goFnXe.js +6 -0
  199. vibe_surf/backend/frontend/assets/bluetooth-BFH9HCot.js +6 -0
  200. vibe_surf/backend/frontend/assets/bluetooth-connected-C9JKQLmC.js +6 -0
  201. vibe_surf/backend/frontend/assets/bluetooth-off-ka-F7ZnG.js +6 -0
  202. vibe_surf/backend/frontend/assets/bluetooth-searching-BdyfX9rD.js +6 -0
  203. vibe_surf/backend/frontend/assets/bold-CZSxbQF9.js +6 -0
  204. vibe_surf/backend/frontend/assets/bolt-BjrrPChn.js +6 -0
  205. vibe_surf/backend/frontend/assets/bomb-CMlcm4r9.js +6 -0
  206. vibe_surf/backend/frontend/assets/bone-qWIxHNfL.js +6 -0
  207. vibe_surf/backend/frontend/assets/book-BfRvOdc3.js +6 -0
  208. vibe_surf/backend/frontend/assets/book-a-CpoCb7Zv.js +6 -0
  209. vibe_surf/backend/frontend/assets/book-audio-cBKWAq-p.js +6 -0
  210. vibe_surf/backend/frontend/assets/book-check-CqwOgoOp.js +6 -0
  211. vibe_surf/backend/frontend/assets/book-copy-ORHl4yqI.js +6 -0
  212. vibe_surf/backend/frontend/assets/book-dashed-BrJdSa-D.js +6 -0
  213. vibe_surf/backend/frontend/assets/book-down-Bj4JV-P-.js +6 -0
  214. vibe_surf/backend/frontend/assets/book-headphones-BYuIU1gj.js +6 -0
  215. vibe_surf/backend/frontend/assets/book-heart-DCUxVJaU.js +6 -0
  216. vibe_surf/backend/frontend/assets/book-image-BPpCKv6n.js +6 -0
  217. vibe_surf/backend/frontend/assets/book-key-Ca_EtM6h.js +6 -0
  218. vibe_surf/backend/frontend/assets/book-lock-Bldzz1aF.js +6 -0
  219. vibe_surf/backend/frontend/assets/book-marked-BCleXwJ3.js +6 -0
  220. vibe_surf/backend/frontend/assets/book-minus-XoJOGZOx.js +6 -0
  221. vibe_surf/backend/frontend/assets/book-open-DUlI5XCY.js +6 -0
  222. vibe_surf/backend/frontend/assets/book-open-check-BEksHFoQ.js +6 -0
  223. vibe_surf/backend/frontend/assets/book-open-text-CiKyiRt-.js +6 -0
  224. vibe_surf/backend/frontend/assets/book-plus-DuUfSKu2.js +6 -0
  225. vibe_surf/backend/frontend/assets/book-text-TTfLk4-M.js +6 -0
  226. vibe_surf/backend/frontend/assets/book-type-CMV326FZ.js +6 -0
  227. vibe_surf/backend/frontend/assets/book-up-2-CGiuKI0n.js +6 -0
  228. vibe_surf/backend/frontend/assets/book-up-d2hb8aDq.js +6 -0
  229. vibe_surf/backend/frontend/assets/book-user-BsZySUGG.js +6 -0
  230. vibe_surf/backend/frontend/assets/book-x-CoSA25As.js +6 -0
  231. vibe_surf/backend/frontend/assets/bookmark-CVx8aFGk.js +6 -0
  232. vibe_surf/backend/frontend/assets/bookmark-check-Zh_1fqo_.js +6 -0
  233. vibe_surf/backend/frontend/assets/bookmark-minus---KmRSON.js +6 -0
  234. vibe_surf/backend/frontend/assets/bookmark-plus-ZY-aQ6r5.js +6 -0
  235. vibe_surf/backend/frontend/assets/bookmark-x-DnEKBdZC.js +6 -0
  236. vibe_surf/backend/frontend/assets/boom-box-D5cJf4pI.js +6 -0
  237. vibe_surf/backend/frontend/assets/bot-BbS7VJ5s.js +6 -0
  238. vibe_surf/backend/frontend/assets/bot-message-square-Bm4hBAbI.js +6 -0
  239. vibe_surf/backend/frontend/assets/bot-off-CFjG1wx4.js +6 -0
  240. vibe_surf/backend/frontend/assets/bow-arrow-Bupk8VJM.js +6 -0
  241. vibe_surf/backend/frontend/assets/box-CyVAC5Vv.js +6 -0
  242. vibe_surf/backend/frontend/assets/boxes-B3xCa_UA.js +6 -0
  243. vibe_surf/backend/frontend/assets/braces-QLXt2h0B.js +6 -0
  244. vibe_surf/backend/frontend/assets/brackets-CEy7gs9d.js +6 -0
  245. vibe_surf/backend/frontend/assets/brain-circuit-WmeDjyy5.js +6 -0
  246. vibe_surf/backend/frontend/assets/brain-cog-DKDdpxNn.js +6 -0
  247. vibe_surf/backend/frontend/assets/brain-ziGJYeS1.js +6 -0
  248. vibe_surf/backend/frontend/assets/brick-wall-DXer5s5J.js +6 -0
  249. vibe_surf/backend/frontend/assets/brick-wall-fire-CfXr8Krv.js +6 -0
  250. vibe_surf/backend/frontend/assets/briefcase-C2YbssAg.js +6 -0
  251. vibe_surf/backend/frontend/assets/briefcase-business-CJCpJSkU.js +6 -0
  252. vibe_surf/backend/frontend/assets/briefcase-conveyor-belt-B0jqiIT4.js +6 -0
  253. vibe_surf/backend/frontend/assets/briefcase-medical-BBH0C6ZQ.js +6 -0
  254. vibe_surf/backend/frontend/assets/bring-to-front-ywT72zy-.js +6 -0
  255. vibe_surf/backend/frontend/assets/brush-_uc9w_j1.js +6 -0
  256. vibe_surf/backend/frontend/assets/bubbles-ggRrvDQI.js +6 -0
  257. vibe_surf/backend/frontend/assets/bug-6l9frAXO.js +6 -0
  258. vibe_surf/backend/frontend/assets/bug-off-BmK1mJ7T.js +6 -0
  259. vibe_surf/backend/frontend/assets/bug-play-DbXJeqOa.js +6 -0
  260. vibe_surf/backend/frontend/assets/building-2-Cf9gYIvy.js +6 -0
  261. vibe_surf/backend/frontend/assets/building-D9eMVeBu.js +6 -0
  262. vibe_surf/backend/frontend/assets/bus-COrhWbdv.js +6 -0
  263. vibe_surf/backend/frontend/assets/bus-front-Csav5OG_.js +6 -0
  264. vibe_surf/backend/frontend/assets/cable-BPG7O6tf.js +6 -0
  265. vibe_surf/backend/frontend/assets/cable-car-ChPtZlze.js +6 -0
  266. vibe_surf/backend/frontend/assets/cake-DnmMZhI2.js +6 -0
  267. vibe_surf/backend/frontend/assets/cake-slice-Clc5mDPW.js +6 -0
  268. vibe_surf/backend/frontend/assets/calculator-C77I3XPN.js +6 -0
  269. vibe_surf/backend/frontend/assets/calendar-1-BMs-t7Zd.js +6 -0
  270. vibe_surf/backend/frontend/assets/calendar-DuLRS-6L.js +6 -0
  271. vibe_surf/backend/frontend/assets/calendar-arrow-down-DoVsOnV0.js +6 -0
  272. vibe_surf/backend/frontend/assets/calendar-arrow-up-Ca_1_rkT.js +6 -0
  273. vibe_surf/backend/frontend/assets/calendar-check-2-0JmvXRsb.js +6 -0
  274. vibe_surf/backend/frontend/assets/calendar-check-DtTDIbPE.js +6 -0
  275. vibe_surf/backend/frontend/assets/calendar-clock-39XA2NxZ.js +6 -0
  276. vibe_surf/backend/frontend/assets/calendar-cog-B3elAX8P.js +6 -0
  277. vibe_surf/backend/frontend/assets/calendar-days-B_4sd_nS.js +6 -0
  278. vibe_surf/backend/frontend/assets/calendar-fold-1GZdJiY5.js +6 -0
  279. vibe_surf/backend/frontend/assets/calendar-heart-C20Gu6Pq.js +6 -0
  280. vibe_surf/backend/frontend/assets/calendar-minus-2-C2uYA9Xy.js +6 -0
  281. vibe_surf/backend/frontend/assets/calendar-minus-Bf9ZhUgX.js +6 -0
  282. vibe_surf/backend/frontend/assets/calendar-off-oqUiDnlM.js +6 -0
  283. vibe_surf/backend/frontend/assets/calendar-plus-2-D5AF7K6Z.js +6 -0
  284. vibe_surf/backend/frontend/assets/calendar-plus-DFRLvp48.js +6 -0
  285. vibe_surf/backend/frontend/assets/calendar-range-BtbX_u86.js +6 -0
  286. vibe_surf/backend/frontend/assets/calendar-search-DKFr3oFg.js +6 -0
  287. vibe_surf/backend/frontend/assets/calendar-sync-J6s1mjVg.js +6 -0
  288. vibe_surf/backend/frontend/assets/calendar-x-16dHXmS-.js +6 -0
  289. vibe_surf/backend/frontend/assets/calendar-x-2-DASXeIpI.js +6 -0
  290. vibe_surf/backend/frontend/assets/camera-C73rx5T7.js +6 -0
  291. vibe_surf/backend/frontend/assets/camera-off-lYXrg8Ab.js +6 -0
  292. vibe_surf/backend/frontend/assets/candy-DHin-JSi.js +6 -0
  293. vibe_surf/backend/frontend/assets/candy-cane-BrFztxP3.js +6 -0
  294. vibe_surf/backend/frontend/assets/candy-off-C6p9RmsL.js +6 -0
  295. vibe_surf/backend/frontend/assets/cannabis-BIomtlTh.js +6 -0
  296. vibe_surf/backend/frontend/assets/captions-CU9AD1HN.js +6 -0
  297. vibe_surf/backend/frontend/assets/captions-off-BQabz_7T.js +6 -0
  298. vibe_surf/backend/frontend/assets/car-CIepr4l8.js +6 -0
  299. vibe_surf/backend/frontend/assets/car-front-BvC3NXIU.js +6 -0
  300. vibe_surf/backend/frontend/assets/car-taxi-front-D6kk_vUY.js +6 -0
  301. vibe_surf/backend/frontend/assets/caravan-B4YvOfvY.js +6 -0
  302. vibe_surf/backend/frontend/assets/carrot-DScNmGFZ.js +6 -0
  303. vibe_surf/backend/frontend/assets/case-lower-iW8MijQ2.js +6 -0
  304. vibe_surf/backend/frontend/assets/case-sensitive-DggKI0Fh.js +6 -0
  305. vibe_surf/backend/frontend/assets/case-upper-BC22BC0q.js +6 -0
  306. vibe_surf/backend/frontend/assets/cassette-tape-PMwALept.js +6 -0
  307. vibe_surf/backend/frontend/assets/cast-Kq2v55CB.js +6 -0
  308. vibe_surf/backend/frontend/assets/castle-DJzhSlL6.js +6 -0
  309. vibe_surf/backend/frontend/assets/cat-Cszwi-0j.js +6 -0
  310. vibe_surf/backend/frontend/assets/cctv-4zeLHFGP.js +6 -0
  311. vibe_surf/backend/frontend/assets/chart-area-JyFaZNpl.js +6 -0
  312. vibe_surf/backend/frontend/assets/chart-bar-Bcnue-Eu.js +6 -0
  313. vibe_surf/backend/frontend/assets/chart-bar-big-dJ6tM8UP.js +6 -0
  314. vibe_surf/backend/frontend/assets/chart-bar-decreasing-jviD9Nka.js +6 -0
  315. vibe_surf/backend/frontend/assets/chart-bar-increasing-BcpuBWlQ.js +6 -0
  316. vibe_surf/backend/frontend/assets/chart-bar-stacked-DLxMM-a6.js +6 -0
  317. vibe_surf/backend/frontend/assets/chart-candlestick-BK5WOKib.js +6 -0
  318. vibe_surf/backend/frontend/assets/chart-column-BjT_DIge.js +6 -0
  319. vibe_surf/backend/frontend/assets/chart-column-big-BoOEhNxT.js +6 -0
  320. vibe_surf/backend/frontend/assets/chart-column-decreasing-B3PEhFWj.js +6 -0
  321. vibe_surf/backend/frontend/assets/chart-column-increasing-KTAFoIBT.js +6 -0
  322. vibe_surf/backend/frontend/assets/chart-column-stacked-Drci0FWY.js +6 -0
  323. vibe_surf/backend/frontend/assets/chart-gantt-CxLhKfws.js +6 -0
  324. vibe_surf/backend/frontend/assets/chart-line-Deh3i4SN.js +6 -0
  325. vibe_surf/backend/frontend/assets/chart-network-1nLETKIo.js +6 -0
  326. vibe_surf/backend/frontend/assets/chart-no-axes-column-BBUb9OL4.js +6 -0
  327. vibe_surf/backend/frontend/assets/chart-no-axes-column-decreasing-BNGTEmAA.js +6 -0
  328. vibe_surf/backend/frontend/assets/chart-no-axes-column-increasing-DYl5MpQr.js +6 -0
  329. vibe_surf/backend/frontend/assets/chart-no-axes-combined-Bwo9fVPi.js +6 -0
  330. vibe_surf/backend/frontend/assets/chart-no-axes-gantt-CIpwp7-G.js +6 -0
  331. vibe_surf/backend/frontend/assets/chart-pie-Brn9eScK.js +6 -0
  332. vibe_surf/backend/frontend/assets/chart-scatter-BFmfnF4I.js +6 -0
  333. vibe_surf/backend/frontend/assets/chart-spline-iPy-W03i.js +6 -0
  334. vibe_surf/backend/frontend/assets/check-check-CQEfDsmx.js +6 -0
  335. vibe_surf/backend/frontend/assets/chef-hat-DdOkr4i8.js +6 -0
  336. vibe_surf/backend/frontend/assets/cherry-XkD_QiBI.js +6 -0
  337. vibe_surf/backend/frontend/assets/chevron-first-muFwJevA.js +6 -0
  338. vibe_surf/backend/frontend/assets/chevron-last-Bn079TLv.js +6 -0
  339. vibe_surf/backend/frontend/assets/chevron-left-BhWYBFsk.js +6 -0
  340. vibe_surf/backend/frontend/assets/chevron-right-zm672Mdr.js +6 -0
  341. vibe_surf/backend/frontend/assets/chevrons-down-T3mOFRB2.js +6 -0
  342. vibe_surf/backend/frontend/assets/chevrons-down-up-BfWmsaYK.js +6 -0
  343. vibe_surf/backend/frontend/assets/chevrons-left-BLFCiP6g.js +6 -0
  344. vibe_surf/backend/frontend/assets/chevrons-left-right-Cgp4lAQF.js +6 -0
  345. vibe_surf/backend/frontend/assets/chevrons-left-right-ellipsis-BZSVxQ-x.js +6 -0
  346. vibe_surf/backend/frontend/assets/chevrons-right-DMKOjes0.js +6 -0
  347. vibe_surf/backend/frontend/assets/chevrons-right-left-Clwbiy09.js +6 -0
  348. vibe_surf/backend/frontend/assets/chevrons-up-CdrwLxmN.js +6 -0
  349. vibe_surf/backend/frontend/assets/chrome-46ygw5lK.js +6 -0
  350. vibe_surf/backend/frontend/assets/church-DQW3bkcl.js +6 -0
  351. vibe_surf/backend/frontend/assets/cigarette-CTvLdOLV.js +6 -0
  352. vibe_surf/backend/frontend/assets/cigarette-off-D0kR9lro.js +6 -0
  353. vibe_surf/backend/frontend/assets/circle-alert-QG2k6eWP.js +6 -0
  354. vibe_surf/backend/frontend/assets/circle-arrow-down-BHFs0Q9-.js +6 -0
  355. vibe_surf/backend/frontend/assets/circle-arrow-left-DQWeTJLw.js +6 -0
  356. vibe_surf/backend/frontend/assets/circle-arrow-out-down-left-B_oYI2Rn.js +6 -0
  357. vibe_surf/backend/frontend/assets/circle-arrow-out-down-right-BL4vxEs9.js +6 -0
  358. vibe_surf/backend/frontend/assets/circle-arrow-out-up-left-CFi1FNF-.js +6 -0
  359. vibe_surf/backend/frontend/assets/circle-arrow-out-up-right-CmMWk14E.js +6 -0
  360. vibe_surf/backend/frontend/assets/circle-arrow-right-dhHL8jIm.js +6 -0
  361. vibe_surf/backend/frontend/assets/circle-arrow-up-B8XWR9s_.js +6 -0
  362. vibe_surf/backend/frontend/assets/circle-check-CRm9QkNA.js +6 -0
  363. vibe_surf/backend/frontend/assets/circle-check-big-CPPNLArI.js +6 -0
  364. vibe_surf/backend/frontend/assets/circle-chevron-down-Cs4S5V03.js +6 -0
  365. vibe_surf/backend/frontend/assets/circle-chevron-left-V81BDvwB.js +6 -0
  366. vibe_surf/backend/frontend/assets/circle-chevron-right-CRa7Bkcz.js +6 -0
  367. vibe_surf/backend/frontend/assets/circle-chevron-up-FDxLxvSd.js +6 -0
  368. vibe_surf/backend/frontend/assets/circle-dashed-DD55_roy.js +6 -0
  369. vibe_surf/backend/frontend/assets/circle-divide-DKpocsWo.js +6 -0
  370. vibe_surf/backend/frontend/assets/circle-dollar-sign-p7_bVi5m.js +6 -0
  371. vibe_surf/backend/frontend/assets/circle-dot-Be13EypY.js +6 -0
  372. vibe_surf/backend/frontend/assets/circle-dot-dashed-KuVNkxEv.js +6 -0
  373. vibe_surf/backend/frontend/assets/circle-ellipsis-BSLpVL-C.js +6 -0
  374. vibe_surf/backend/frontend/assets/circle-equal-_Mfed9km.js +6 -0
  375. vibe_surf/backend/frontend/assets/circle-fading-arrow-up-D_E3BIXf.js +6 -0
  376. vibe_surf/backend/frontend/assets/circle-fading-plus-5ZA5Je_2.js +6 -0
  377. vibe_surf/backend/frontend/assets/circle-gauge-b41i9Azv.js +6 -0
  378. vibe_surf/backend/frontend/assets/circle-help-BOLgIUsf.js +6 -0
  379. vibe_surf/backend/frontend/assets/circle-minus-C41JxC_E.js +6 -0
  380. vibe_surf/backend/frontend/assets/circle-off-yuGaN1EU.js +6 -0
  381. vibe_surf/backend/frontend/assets/circle-parking-B-DnXhcd.js +6 -0
  382. vibe_surf/backend/frontend/assets/circle-parking-off-DsCM2b8j.js +6 -0
  383. vibe_surf/backend/frontend/assets/circle-pause-Dqufdu9m.js +6 -0
  384. vibe_surf/backend/frontend/assets/circle-percent-Dp8UwPQq.js +6 -0
  385. vibe_surf/backend/frontend/assets/circle-play-N8vi1Pcd.js +6 -0
  386. vibe_surf/backend/frontend/assets/circle-plus-wD1VqIgT.js +6 -0
  387. vibe_surf/backend/frontend/assets/circle-power-DBZAmaYW.js +6 -0
  388. vibe_surf/backend/frontend/assets/circle-slash-2-hdq8_Fp6.js +6 -0
  389. vibe_surf/backend/frontend/assets/circle-slash-CSrHLLP2.js +6 -0
  390. vibe_surf/backend/frontend/assets/circle-small-BQ6lrOIo.js +6 -0
  391. vibe_surf/backend/frontend/assets/circle-stop-xgLQ9Loi.js +6 -0
  392. vibe_surf/backend/frontend/assets/circle-user-CzvrnVH9.js +6 -0
  393. vibe_surf/backend/frontend/assets/circle-user-round-0JhYfAcs.js +6 -0
  394. vibe_surf/backend/frontend/assets/circuit-board-DpN-UUwV.js +6 -0
  395. vibe_surf/backend/frontend/assets/citrus-BGWHfGg3.js +6 -0
  396. vibe_surf/backend/frontend/assets/clapperboard-9m-99Aof.js +6 -0
  397. vibe_surf/backend/frontend/assets/clipboard-C-MVPhAy.js +6 -0
  398. vibe_surf/backend/frontend/assets/clipboard-check-Bonb2WoP.js +6 -0
  399. vibe_surf/backend/frontend/assets/clipboard-copy-CmRHdw5h.js +6 -0
  400. vibe_surf/backend/frontend/assets/clipboard-list-DEof2iPM.js +6 -0
  401. vibe_surf/backend/frontend/assets/clipboard-minus-DN2QuVOG.js +6 -0
  402. vibe_surf/backend/frontend/assets/clipboard-paste-B20nudiB.js +6 -0
  403. vibe_surf/backend/frontend/assets/clipboard-pen-BZJamOnq.js +6 -0
  404. vibe_surf/backend/frontend/assets/clipboard-pen-line-DScYxgpw.js +6 -0
  405. vibe_surf/backend/frontend/assets/clipboard-plus-DJb4TcvR.js +6 -0
  406. vibe_surf/backend/frontend/assets/clipboard-type-DaibEn_w.js +6 -0
  407. vibe_surf/backend/frontend/assets/clipboard-x-CebR2xkR.js +6 -0
  408. vibe_surf/backend/frontend/assets/clock-1-Cz0OEQH3.js +6 -0
  409. vibe_surf/backend/frontend/assets/clock-10-BMLTtzHQ.js +6 -0
  410. vibe_surf/backend/frontend/assets/clock-11-CZ6m52x1.js +6 -0
  411. vibe_surf/backend/frontend/assets/clock-12-BXZWDgbr.js +6 -0
  412. vibe_surf/backend/frontend/assets/clock-2-ElC7DzP5.js +6 -0
  413. vibe_surf/backend/frontend/assets/clock-3-DN86BONK.js +6 -0
  414. vibe_surf/backend/frontend/assets/clock-4-CV9eUVD9.js +6 -0
  415. vibe_surf/backend/frontend/assets/clock-5-DgMTU8BD.js +6 -0
  416. vibe_surf/backend/frontend/assets/clock-6-_RjAiNVz.js +6 -0
  417. vibe_surf/backend/frontend/assets/clock-7-DsWDnhwN.js +6 -0
  418. vibe_surf/backend/frontend/assets/clock-8-CY-eCfWq.js +6 -0
  419. vibe_surf/backend/frontend/assets/clock-9-D4aWNYpk.js +6 -0
  420. vibe_surf/backend/frontend/assets/clock-UtAbEQE0.js +6 -0
  421. vibe_surf/backend/frontend/assets/clock-alert-gi6h-zRT.js +6 -0
  422. vibe_surf/backend/frontend/assets/clock-arrow-down-CC9Qp0ac.js +6 -0
  423. vibe_surf/backend/frontend/assets/clock-arrow-up-Cjt2qN9V.js +6 -0
  424. vibe_surf/backend/frontend/assets/clock-fading-BJp0FFxY.js +6 -0
  425. vibe_surf/backend/frontend/assets/cloud-TYaHXSiL.js +6 -0
  426. vibe_surf/backend/frontend/assets/cloud-alert-Dp4WVua8.js +6 -0
  427. vibe_surf/backend/frontend/assets/cloud-cog-Dlyn4rqA.js +6 -0
  428. vibe_surf/backend/frontend/assets/cloud-download-DH8UN3eX.js +6 -0
  429. vibe_surf/backend/frontend/assets/cloud-drizzle-s8348ic3.js +6 -0
  430. vibe_surf/backend/frontend/assets/cloud-fog-DHRDnzsg.js +6 -0
  431. vibe_surf/backend/frontend/assets/cloud-hail-D7nJGZgB.js +6 -0
  432. vibe_surf/backend/frontend/assets/cloud-lightning-CscbfdPI.js +6 -0
  433. vibe_surf/backend/frontend/assets/cloud-moon-C6897Z5z.js +6 -0
  434. vibe_surf/backend/frontend/assets/cloud-moon-rain-B6pK_auO.js +6 -0
  435. vibe_surf/backend/frontend/assets/cloud-off-1kN_AD0k.js +6 -0
  436. vibe_surf/backend/frontend/assets/cloud-rain-Dj6B4fBD.js +6 -0
  437. vibe_surf/backend/frontend/assets/cloud-rain-wind-BJrdBUd4.js +6 -0
  438. vibe_surf/backend/frontend/assets/cloud-snow-LK6lpCkZ.js +6 -0
  439. vibe_surf/backend/frontend/assets/cloud-sun-CRH8EQEJ.js +6 -0
  440. vibe_surf/backend/frontend/assets/cloud-sun-rain-7IssqnpA.js +6 -0
  441. vibe_surf/backend/frontend/assets/cloud-upload-tI3Dz1zd.js +6 -0
  442. vibe_surf/backend/frontend/assets/cloudy-okUc5uOM.js +6 -0
  443. vibe_surf/backend/frontend/assets/clover-O6CtUOhV.js +6 -0
  444. vibe_surf/backend/frontend/assets/club-SnWEwVMR.js +6 -0
  445. vibe_surf/backend/frontend/assets/code-xml-CYTnIdXN.js +6 -0
  446. vibe_surf/backend/frontend/assets/codepen-UxBTFH8q.js +6 -0
  447. vibe_surf/backend/frontend/assets/codesandbox-CSRpmotF.js +6 -0
  448. vibe_surf/backend/frontend/assets/coffee-BTr4K8Gn.js +6 -0
  449. vibe_surf/backend/frontend/assets/cog-C7RMqAcW.js +6 -0
  450. vibe_surf/backend/frontend/assets/coins-D7gWOtE7.js +6 -0
  451. vibe_surf/backend/frontend/assets/columns-2-WBM3YpNL.js +6 -0
  452. vibe_surf/backend/frontend/assets/columns-3-DyAMu-k8.js +6 -0
  453. vibe_surf/backend/frontend/assets/columns-3-cog-zfUPAOg0.js +6 -0
  454. vibe_surf/backend/frontend/assets/columns-4-Qz-B3Dvq.js +6 -0
  455. vibe_surf/backend/frontend/assets/combine-CLZvnf8j.js +6 -0
  456. vibe_surf/backend/frontend/assets/command-D8ymLYGG.js +6 -0
  457. vibe_surf/backend/frontend/assets/compass-DGYgNSVa.js +6 -0
  458. vibe_surf/backend/frontend/assets/component-CwL9ER1Q.js +6 -0
  459. vibe_surf/backend/frontend/assets/computer-QNTojt_5.js +6 -0
  460. vibe_surf/backend/frontend/assets/concierge-bell-C7jm8QJd.js +6 -0
  461. vibe_surf/backend/frontend/assets/cone-C9TQbkDB.js +6 -0
  462. vibe_surf/backend/frontend/assets/construction-CSyYpaz5.js +6 -0
  463. vibe_surf/backend/frontend/assets/contact-CFldvJVP.js +6 -0
  464. vibe_surf/backend/frontend/assets/contact-round-DA1kjclM.js +6 -0
  465. vibe_surf/backend/frontend/assets/container-BfGJKo0o.js +6 -0
  466. vibe_surf/backend/frontend/assets/contrast-DmYhTvN3.js +6 -0
  467. vibe_surf/backend/frontend/assets/cookie-Cw70purP.js +6 -0
  468. vibe_surf/backend/frontend/assets/cooking-pot-WzjjWZaR.js +6 -0
  469. vibe_surf/backend/frontend/assets/copy-BPjnY3ea.js +6 -0
  470. vibe_surf/backend/frontend/assets/copy-check-B6hqPf9B.js +6 -0
  471. vibe_surf/backend/frontend/assets/copy-minus-DMGhawAT.js +6 -0
  472. vibe_surf/backend/frontend/assets/copy-plus-DcW4_i4R.js +6 -0
  473. vibe_surf/backend/frontend/assets/copy-slash-Cn_xel6o.js +6 -0
  474. vibe_surf/backend/frontend/assets/copy-x-Dmf3jckJ.js +6 -0
  475. vibe_surf/backend/frontend/assets/copyleft-CJDbqV_Y.js +6 -0
  476. vibe_surf/backend/frontend/assets/copyright-Buw-D4Xa.js +6 -0
  477. vibe_surf/backend/frontend/assets/corner-down-left-BhPTW3SL.js +6 -0
  478. vibe_surf/backend/frontend/assets/corner-down-right-B_Md48mW.js +6 -0
  479. vibe_surf/backend/frontend/assets/corner-left-down-DDc0LvYT.js +6 -0
  480. vibe_surf/backend/frontend/assets/corner-left-up-C_EIQYvd.js +6 -0
  481. vibe_surf/backend/frontend/assets/corner-right-down-Bipz7-p6.js +6 -0
  482. vibe_surf/backend/frontend/assets/corner-right-up-euSAC3Mi.js +6 -0
  483. vibe_surf/backend/frontend/assets/corner-up-left-CRvdJT3E.js +6 -0
  484. vibe_surf/backend/frontend/assets/corner-up-right-CCK7dhVV.js +6 -0
  485. vibe_surf/backend/frontend/assets/cpu-DB-52VKi.js +6 -0
  486. vibe_surf/backend/frontend/assets/creative-commons-CXWueat0.js +6 -0
  487. vibe_surf/backend/frontend/assets/credit-card-CR5swmPL.js +6 -0
  488. vibe_surf/backend/frontend/assets/croissant-ClZbIF3L.js +6 -0
  489. vibe_surf/backend/frontend/assets/crop-DSXkvq6D.js +6 -0
  490. vibe_surf/backend/frontend/assets/cross-CkHV6YOi.js +6 -0
  491. vibe_surf/backend/frontend/assets/crosshair-C3tcoYxo.js +6 -0
  492. vibe_surf/backend/frontend/assets/crown-0LB9DCRa.js +6 -0
  493. vibe_surf/backend/frontend/assets/cuboid-CidkVtLJ.js +6 -0
  494. vibe_surf/backend/frontend/assets/cup-soda-DG_5s6Ma.js +6 -0
  495. vibe_surf/backend/frontend/assets/currency-AEQeyk_J.js +6 -0
  496. vibe_surf/backend/frontend/assets/cylinder-Da7lV5Pc.js +6 -0
  497. vibe_surf/backend/frontend/assets/dam-BIFS7P89.js +6 -0
  498. vibe_surf/backend/frontend/assets/database-Dx9euHTJ.js +6 -0
  499. vibe_surf/backend/frontend/assets/database-backup-Bbbt7mXt.js +6 -0
  500. vibe_surf/backend/frontend/assets/database-zap-CJC7IfdF.js +6 -0
  501. vibe_surf/backend/frontend/assets/decimals-arrow-left-BrRd8_vb.js +6 -0
  502. vibe_surf/backend/frontend/assets/decimals-arrow-right-Cglo48c9.js +6 -0
  503. vibe_surf/backend/frontend/assets/delete-C9qTL0sD.js +6 -0
  504. vibe_surf/backend/frontend/assets/dessert-7PTt5JJ0.js +6 -0
  505. vibe_surf/backend/frontend/assets/diameter-oheO2UGD.js +6 -0
  506. vibe_surf/backend/frontend/assets/diamond-DhBpDMNy.js +6 -0
  507. vibe_surf/backend/frontend/assets/diamond-minus-BqTULDvb.js +6 -0
  508. vibe_surf/backend/frontend/assets/diamond-percent-D1Ck8xGc.js +6 -0
  509. vibe_surf/backend/frontend/assets/diamond-plus-DfSf7Xoq.js +6 -0
  510. vibe_surf/backend/frontend/assets/dice-1-CIRG2xPK.js +6 -0
  511. vibe_surf/backend/frontend/assets/dice-2-r7s36USZ.js +6 -0
  512. vibe_surf/backend/frontend/assets/dice-3-Cl7FLe3x.js +6 -0
  513. vibe_surf/backend/frontend/assets/dice-4-D-yJWiku.js +6 -0
  514. vibe_surf/backend/frontend/assets/dice-5-Ci09NYyS.js +6 -0
  515. vibe_surf/backend/frontend/assets/dice-6-CC2FLvLo.js +6 -0
  516. vibe_surf/backend/frontend/assets/dices-CmB6hNUU.js +6 -0
  517. vibe_surf/backend/frontend/assets/diff-oCWjvY-c.js +6 -0
  518. vibe_surf/backend/frontend/assets/disc-2-DpUl7fl6.js +6 -0
  519. vibe_surf/backend/frontend/assets/disc-3-BugUAszu.js +6 -0
  520. vibe_surf/backend/frontend/assets/disc-DUbtGdHe.js +6 -0
  521. vibe_surf/backend/frontend/assets/disc-album-CXJRMctz.js +6 -0
  522. vibe_surf/backend/frontend/assets/divide-CY1K-HT7.js +6 -0
  523. vibe_surf/backend/frontend/assets/dna-CeE8ObeE.js +6 -0
  524. vibe_surf/backend/frontend/assets/dna-off-BviJKT3C.js +6 -0
  525. vibe_surf/backend/frontend/assets/dock-eIe8zGWk.js +6 -0
  526. vibe_surf/backend/frontend/assets/dog-CSlDDqxp.js +6 -0
  527. vibe_surf/backend/frontend/assets/dollar-sign-5U68U397.js +6 -0
  528. vibe_surf/backend/frontend/assets/donut-BeawTrlI.js +6 -0
  529. vibe_surf/backend/frontend/assets/door-closed-CwY8Mg15.js +6 -0
  530. vibe_surf/backend/frontend/assets/door-open-DFgi7N5B.js +6 -0
  531. vibe_surf/backend/frontend/assets/dot-fPF_etdO.js +6 -0
  532. vibe_surf/backend/frontend/assets/download-gSwRRqnX.js +6 -0
  533. vibe_surf/backend/frontend/assets/drafting-compass-Dj_7EFRc.js +6 -0
  534. vibe_surf/backend/frontend/assets/drama-BlDJuZEs.js +6 -0
  535. vibe_surf/backend/frontend/assets/dribbble-C0k3dpAi.js +6 -0
  536. vibe_surf/backend/frontend/assets/drill-COJcLBB4.js +6 -0
  537. vibe_surf/backend/frontend/assets/droplet-5wuLGLgZ.js +6 -0
  538. vibe_surf/backend/frontend/assets/droplet-off-Bra_6Oh9.js +6 -0
  539. vibe_surf/backend/frontend/assets/droplets-BE8PR1pM.js +6 -0
  540. vibe_surf/backend/frontend/assets/drum-DnJ1RUvq.js +6 -0
  541. vibe_surf/backend/frontend/assets/drumstick-JGiBDDwZ.js +6 -0
  542. vibe_surf/backend/frontend/assets/dumbbell-BEtc4tyd.js +6 -0
  543. vibe_surf/backend/frontend/assets/ear-DAqeJjkr.js +6 -0
  544. vibe_surf/backend/frontend/assets/ear-off-BA7gp4ie.js +6 -0
  545. vibe_surf/backend/frontend/assets/earth-CUlUl7Bp.js +6 -0
  546. vibe_surf/backend/frontend/assets/earth-lock-sl59Ywm7.js +6 -0
  547. vibe_surf/backend/frontend/assets/eclipse-DY7fC5N3.js +6 -0
  548. vibe_surf/backend/frontend/assets/egg-DxfY2UB8.js +6 -0
  549. vibe_surf/backend/frontend/assets/egg-fried-D2Eo3APu.js +6 -0
  550. vibe_surf/backend/frontend/assets/egg-off-DqYobjwG.js +6 -0
  551. vibe_surf/backend/frontend/assets/ellipsis-DgOuKLdR.js +6 -0
  552. vibe_surf/backend/frontend/assets/ellipsis-vertical--sr8F_UD.js +6 -0
  553. vibe_surf/backend/frontend/assets/equal-DS1qMZhi.js +6 -0
  554. vibe_surf/backend/frontend/assets/equal-approximately-mgMMBVF_.js +6 -0
  555. vibe_surf/backend/frontend/assets/equal-not-1Alw8lqE.js +6 -0
  556. vibe_surf/backend/frontend/assets/eraser-IStMo8nh.js +6 -0
  557. vibe_surf/backend/frontend/assets/ethernet-port-B6SRY0d8.js +6 -0
  558. vibe_surf/backend/frontend/assets/euro-S1kGUYTE.js +6 -0
  559. vibe_surf/backend/frontend/assets/expand-Cj8IQccm.js +6 -0
  560. vibe_surf/backend/frontend/assets/eye-DrnoCeKD.js +6 -0
  561. vibe_surf/backend/frontend/assets/eye-closed-B0cNIHJN.js +6 -0
  562. vibe_surf/backend/frontend/assets/eye-off-DIIh42Ws.js +6 -0
  563. vibe_surf/backend/frontend/assets/facebook-Df9Fpfnn.js +6 -0
  564. vibe_surf/backend/frontend/assets/factory-BLKvR2Z1.js +6 -0
  565. vibe_surf/backend/frontend/assets/fan-C-xRuGdo.js +6 -0
  566. vibe_surf/backend/frontend/assets/fast-forward-Bae5V83y.js +6 -0
  567. vibe_surf/backend/frontend/assets/feather-DTPfgED2.js +6 -0
  568. vibe_surf/backend/frontend/assets/fence-Mr7VQ0O9.js +6 -0
  569. vibe_surf/backend/frontend/assets/ferris-wheel-D82pDMqi.js +6 -0
  570. vibe_surf/backend/frontend/assets/figma-DBFJo9L2.js +6 -0
  571. vibe_surf/backend/frontend/assets/file-DvuZsaUg.js +6 -0
  572. vibe_surf/backend/frontend/assets/file-archive-DRtB2ivb.js +6 -0
  573. vibe_surf/backend/frontend/assets/file-audio-2-JE5iEkL9.js +6 -0
  574. vibe_surf/backend/frontend/assets/file-audio-C4RwC1BT.js +6 -0
  575. vibe_surf/backend/frontend/assets/file-axis-3d-DQSHzEo4.js +6 -0
  576. vibe_surf/backend/frontend/assets/file-badge-2-P__XKUXn.js +6 -0
  577. vibe_surf/backend/frontend/assets/file-badge-CejYglxU.js +6 -0
  578. vibe_surf/backend/frontend/assets/file-box-CgFMY7Rp.js +6 -0
  579. vibe_surf/backend/frontend/assets/file-chart-column-Bq5PyMwY.js +6 -0
  580. vibe_surf/backend/frontend/assets/file-chart-column-increasing-t_d1wCSV.js +6 -0
  581. vibe_surf/backend/frontend/assets/file-chart-line-Df6iedBR.js +6 -0
  582. vibe_surf/backend/frontend/assets/file-chart-pie-YH23adPM.js +6 -0
  583. vibe_surf/backend/frontend/assets/file-check-2-CKcRkU0L.js +6 -0
  584. vibe_surf/backend/frontend/assets/file-check-BYZznME9.js +6 -0
  585. vibe_surf/backend/frontend/assets/file-clock-8rD4-Bqt.js +6 -0
  586. vibe_surf/backend/frontend/assets/file-code-2-BjV8KhR4.js +6 -0
  587. vibe_surf/backend/frontend/assets/file-code-CXS3YUpM.js +6 -0
  588. vibe_surf/backend/frontend/assets/file-cog-GKLng0Qf.js +6 -0
  589. vibe_surf/backend/frontend/assets/file-diff-B_7HXPkJ.js +6 -0
  590. vibe_surf/backend/frontend/assets/file-digit-AtVulYi7.js +6 -0
  591. vibe_surf/backend/frontend/assets/file-down-CJIG5dHj.js +6 -0
  592. vibe_surf/backend/frontend/assets/file-heart-B8jWzdG5.js +6 -0
  593. vibe_surf/backend/frontend/assets/file-image-CXtDt3N3.js +6 -0
  594. vibe_surf/backend/frontend/assets/file-input-B-0mgcKT.js +6 -0
  595. vibe_surf/backend/frontend/assets/file-json-2-DQHJM93o.js +6 -0
  596. vibe_surf/backend/frontend/assets/file-json-BmrGDLh2.js +6 -0
  597. vibe_surf/backend/frontend/assets/file-key-2-DnpQ1dTj.js +6 -0
  598. vibe_surf/backend/frontend/assets/file-key-D3lJXveQ.js +6 -0
  599. vibe_surf/backend/frontend/assets/file-lock-2-DWdLzoF7.js +6 -0
  600. vibe_surf/backend/frontend/assets/file-lock-ZMZB3U4I.js +6 -0
  601. vibe_surf/backend/frontend/assets/file-minus-2-CsTsio0s.js +6 -0
  602. vibe_surf/backend/frontend/assets/file-minus-CtfRmVme.js +6 -0
  603. vibe_surf/backend/frontend/assets/file-music-DHhVu2aK.js +6 -0
  604. vibe_surf/backend/frontend/assets/file-output-CjQ-FMg0.js +6 -0
  605. vibe_surf/backend/frontend/assets/file-pen-C9S_u4U9.js +6 -0
  606. vibe_surf/backend/frontend/assets/file-pen-line-niZF4quE.js +6 -0
  607. vibe_surf/backend/frontend/assets/file-plus-2-DzIiS2EM.js +6 -0
  608. vibe_surf/backend/frontend/assets/file-plus-Bloe0E45.js +6 -0
  609. vibe_surf/backend/frontend/assets/file-question-BBTjP9h0.js +6 -0
  610. vibe_surf/backend/frontend/assets/file-scan-B3Bn2EZN.js +6 -0
  611. vibe_surf/backend/frontend/assets/file-search-2-DnC8d9OD.js +6 -0
  612. vibe_surf/backend/frontend/assets/file-search-DzPGZllw.js +6 -0
  613. vibe_surf/backend/frontend/assets/file-sliders-BHYXa9jQ.js +6 -0
  614. vibe_surf/backend/frontend/assets/file-spreadsheet-DvjPpK9G.js +6 -0
  615. vibe_surf/backend/frontend/assets/file-stack-yJR4id_3.js +6 -0
  616. vibe_surf/backend/frontend/assets/file-symlink-BWQBdrEp.js +6 -0
  617. vibe_surf/backend/frontend/assets/file-terminal-CvhcKgiv.js +6 -0
  618. vibe_surf/backend/frontend/assets/file-text-tuxzZhRs.js +6 -0
  619. vibe_surf/backend/frontend/assets/file-type-2-Dgantaer.js +6 -0
  620. vibe_surf/backend/frontend/assets/file-type-DfZBPqmH.js +6 -0
  621. vibe_surf/backend/frontend/assets/file-up-GXfnonbH.js +6 -0
  622. vibe_surf/backend/frontend/assets/file-user-N7Fan7ao.js +6 -0
  623. vibe_surf/backend/frontend/assets/file-video-2-B4JBmAcG.js +6 -0
  624. vibe_surf/backend/frontend/assets/file-video-Fsp8g5kU.js +6 -0
  625. vibe_surf/backend/frontend/assets/file-volume-2-Cg1A9z8S.js +6 -0
  626. vibe_surf/backend/frontend/assets/file-volume-xzVZMKW0.js +6 -0
  627. vibe_surf/backend/frontend/assets/file-warning-CS2F3Xr2.js +6 -0
  628. vibe_surf/backend/frontend/assets/file-x-2-BNUgAQH8.js +6 -0
  629. vibe_surf/backend/frontend/assets/file-x-DTK5Zfd-.js +6 -0
  630. vibe_surf/backend/frontend/assets/files-CNx4yvup.js +6 -0
  631. vibe_surf/backend/frontend/assets/film-Dec7cGCL.js +6 -0
  632. vibe_surf/backend/frontend/assets/fingerprint-B_IGMLcp.js +6 -0
  633. vibe_surf/backend/frontend/assets/fire-extinguisher-CjZilrfE.js +6 -0
  634. vibe_surf/backend/frontend/assets/fish-CXs3XpVQ.js +6 -0
  635. vibe_surf/backend/frontend/assets/fish-off-BfYutBG_.js +6 -0
  636. vibe_surf/backend/frontend/assets/fish-symbol-DFoA8GWJ.js +6 -0
  637. vibe_surf/backend/frontend/assets/flag-cx37QYSs.js +6 -0
  638. vibe_surf/backend/frontend/assets/flag-off-DyXYguA1.js +6 -0
  639. vibe_surf/backend/frontend/assets/flag-triangle-left-Dvsg9XUg.js +6 -0
  640. vibe_surf/backend/frontend/assets/flag-triangle-right-CluL18qS.js +6 -0
  641. vibe_surf/backend/frontend/assets/flame-DwjoBypP.js +6 -0
  642. vibe_surf/backend/frontend/assets/flame-kindling-DFbZUxx1.js +6 -0
  643. vibe_surf/backend/frontend/assets/flashlight-eSCrcAU_.js +6 -0
  644. vibe_surf/backend/frontend/assets/flashlight-off-C6ZnSGnv.js +6 -0
  645. vibe_surf/backend/frontend/assets/flask-conical-CqZXJFUg.js +6 -0
  646. vibe_surf/backend/frontend/assets/flask-conical-off-DLnkLxdX.js +6 -0
  647. vibe_surf/backend/frontend/assets/flask-round-Dukzlk12.js +6 -0
  648. vibe_surf/backend/frontend/assets/flip-horizontal-2-DPCHT9Se.js +6 -0
  649. vibe_surf/backend/frontend/assets/flip-horizontal-B27Zih29.js +6 -0
  650. vibe_surf/backend/frontend/assets/flip-vertical-2-BLZ7P_e7.js +6 -0
  651. vibe_surf/backend/frontend/assets/flip-vertical-BKIxHZUr.js +6 -0
  652. vibe_surf/backend/frontend/assets/flower-2-C3USolHO.js +6 -0
  653. vibe_surf/backend/frontend/assets/flower-MuZltbIo.js +6 -0
  654. vibe_surf/backend/frontend/assets/focus-42uZfpdQ.js +6 -0
  655. vibe_surf/backend/frontend/assets/fold-horizontal-Di0iHFys.js +6 -0
  656. vibe_surf/backend/frontend/assets/fold-vertical-DTaNfFgW.js +6 -0
  657. vibe_surf/backend/frontend/assets/folder-CZZJq_yO.js +6 -0
  658. vibe_surf/backend/frontend/assets/folder-archive-B9gmPXfh.js +6 -0
  659. vibe_surf/backend/frontend/assets/folder-check-D8RNiC0h.js +6 -0
  660. vibe_surf/backend/frontend/assets/folder-clock-xJeq54e5.js +6 -0
  661. vibe_surf/backend/frontend/assets/folder-closed-J_oj7irx.js +6 -0
  662. vibe_surf/backend/frontend/assets/folder-code-sdeNF88C.js +6 -0
  663. vibe_surf/backend/frontend/assets/folder-cog-DaxTyB8x.js +6 -0
  664. vibe_surf/backend/frontend/assets/folder-dot-CcddM8ht.js +6 -0
  665. vibe_surf/backend/frontend/assets/folder-down-B6ibnVRy.js +6 -0
  666. vibe_surf/backend/frontend/assets/folder-git-2-C1s592lv.js +6 -0
  667. vibe_surf/backend/frontend/assets/folder-git-DT6ZCpGc.js +6 -0
  668. vibe_surf/backend/frontend/assets/folder-heart-_fpvnFcA.js +6 -0
  669. vibe_surf/backend/frontend/assets/folder-input-OCjNnVk-.js +6 -0
  670. vibe_surf/backend/frontend/assets/folder-kanban-DgbGiYl_.js +6 -0
  671. vibe_surf/backend/frontend/assets/folder-key-6dl4vOVJ.js +6 -0
  672. vibe_surf/backend/frontend/assets/folder-lock-C0FPUNUM.js +6 -0
  673. vibe_surf/backend/frontend/assets/folder-minus-CnnUrRgx.js +6 -0
  674. vibe_surf/backend/frontend/assets/folder-open-B6qoyzo4.js +6 -0
  675. vibe_surf/backend/frontend/assets/folder-open-dot-vcn79EAq.js +6 -0
  676. vibe_surf/backend/frontend/assets/folder-output-aqyTbjq1.js +6 -0
  677. vibe_surf/backend/frontend/assets/folder-pen-DONbvY-M.js +6 -0
  678. vibe_surf/backend/frontend/assets/folder-plus-B1CMWyUH.js +6 -0
  679. vibe_surf/backend/frontend/assets/folder-root-CO03ueMD.js +6 -0
  680. vibe_surf/backend/frontend/assets/folder-search-2-vXSwPDsr.js +6 -0
  681. vibe_surf/backend/frontend/assets/folder-search-CqRRhEYi.js +6 -0
  682. vibe_surf/backend/frontend/assets/folder-symlink-CyG26ZIM.js +6 -0
  683. vibe_surf/backend/frontend/assets/folder-sync-D7kc3Qv9.js +6 -0
  684. vibe_surf/backend/frontend/assets/folder-tree-B_kJAFgg.js +6 -0
  685. vibe_surf/backend/frontend/assets/folder-up-CPWWXuBL.js +6 -0
  686. vibe_surf/backend/frontend/assets/folder-x-BgWBu65a.js +6 -0
  687. vibe_surf/backend/frontend/assets/folders-BqIxqB0_.js +6 -0
  688. vibe_surf/backend/frontend/assets/footprints-U_DOce2V.js +6 -0
  689. vibe_surf/backend/frontend/assets/forklift-HwzIz7aw.js +6 -0
  690. vibe_surf/backend/frontend/assets/forward-DjYLGiCR.js +6 -0
  691. vibe_surf/backend/frontend/assets/frame-poMkf2ta.js +6 -0
  692. vibe_surf/backend/frontend/assets/framer-DNQvf86-.js +6 -0
  693. vibe_surf/backend/frontend/assets/frown-BnHOvtLa.js +6 -0
  694. vibe_surf/backend/frontend/assets/fuel-Cm_lHCJg.js +6 -0
  695. vibe_surf/backend/frontend/assets/fullscreen-COEG0zVc.js +6 -0
  696. vibe_surf/backend/frontend/assets/funnel-BKREn55d.js +6 -0
  697. vibe_surf/backend/frontend/assets/funnel-plus-B1RbFoZ4.js +6 -0
  698. vibe_surf/backend/frontend/assets/funnel-x-z3lufNFJ.js +6 -0
  699. vibe_surf/backend/frontend/assets/gallery-horizontal-CZQKmb1v.js +6 -0
  700. vibe_surf/backend/frontend/assets/gallery-horizontal-end-rt0pNZmd.js +6 -0
  701. vibe_surf/backend/frontend/assets/gallery-thumbnails-BawPOO5E.js +6 -0
  702. vibe_surf/backend/frontend/assets/gallery-vertical-DHlqWz-O.js +6 -0
  703. vibe_surf/backend/frontend/assets/gallery-vertical-end-1UBU5tP0.js +6 -0
  704. vibe_surf/backend/frontend/assets/gamepad-2-CGlBaPJy.js +6 -0
  705. vibe_surf/backend/frontend/assets/gamepad-B7EN8TXy.js +6 -0
  706. vibe_surf/backend/frontend/assets/gauge-CkJyJpYu.js +6 -0
  707. vibe_surf/backend/frontend/assets/gavel-BXOFsfyc.js +6 -0
  708. vibe_surf/backend/frontend/assets/gem-DJaoJhpp.js +6 -0
  709. vibe_surf/backend/frontend/assets/ghost-5jDlD5mv.js +6 -0
  710. vibe_surf/backend/frontend/assets/gift-DTuN9n1d.js +6 -0
  711. vibe_surf/backend/frontend/assets/git-branch-CAxiUjEF.js +6 -0
  712. vibe_surf/backend/frontend/assets/git-branch-plus-BcouIUD3.js +6 -0
  713. vibe_surf/backend/frontend/assets/git-commit-horizontal-DqOnbX0A.js +6 -0
  714. vibe_surf/backend/frontend/assets/git-commit-vertical-DEAmtVm7.js +6 -0
  715. vibe_surf/backend/frontend/assets/git-compare-8F4A8hf8.js +6 -0
  716. vibe_surf/backend/frontend/assets/git-compare-arrows-BCgbMQBd.js +6 -0
  717. vibe_surf/backend/frontend/assets/git-fork-UmnYpjac.js +6 -0
  718. vibe_surf/backend/frontend/assets/git-graph-MIRVcG3s.js +6 -0
  719. vibe_surf/backend/frontend/assets/git-merge-1ccPZB0a.js +6 -0
  720. vibe_surf/backend/frontend/assets/git-pull-request-BAmJjoSf.js +6 -0
  721. vibe_surf/backend/frontend/assets/git-pull-request-arrow-hDbG9s0T.js +6 -0
  722. vibe_surf/backend/frontend/assets/git-pull-request-closed-DZVF4_75.js +6 -0
  723. vibe_surf/backend/frontend/assets/git-pull-request-create-B_ikGAua.js +6 -0
  724. vibe_surf/backend/frontend/assets/git-pull-request-create-arrow-OlDcvuiA.js +6 -0
  725. vibe_surf/backend/frontend/assets/git-pull-request-draft-CfvzgQz4.js +6 -0
  726. vibe_surf/backend/frontend/assets/github-DlTWmBTt.js +6 -0
  727. vibe_surf/backend/frontend/assets/gitlab-DquWeR50.js +6 -0
  728. vibe_surf/backend/frontend/assets/glass-water-yuqxiPgK.js +6 -0
  729. vibe_surf/backend/frontend/assets/glasses-DPTQtusr.js +6 -0
  730. vibe_surf/backend/frontend/assets/globe-D1X1kv-g.js +6 -0
  731. vibe_surf/backend/frontend/assets/globe-lock-miWknHfI.js +6 -0
  732. vibe_surf/backend/frontend/assets/goal-BY1nb-LN.js +6 -0
  733. vibe_surf/backend/frontend/assets/grab-CnmpLOMH.js +6 -0
  734. vibe_surf/backend/frontend/assets/graduation-cap-CcH89wnV.js +6 -0
  735. vibe_surf/backend/frontend/assets/grape-CIiMFgS_.js +6 -0
  736. vibe_surf/backend/frontend/assets/grid-2x2-DyXR6Owe.js +6 -0
  737. vibe_surf/backend/frontend/assets/grid-2x2-check-D2GIuWpl.js +6 -0
  738. vibe_surf/backend/frontend/assets/grid-2x2-plus-D89B7CNh.js +6 -0
  739. vibe_surf/backend/frontend/assets/grid-2x2-x-CMeekq27.js +6 -0
  740. vibe_surf/backend/frontend/assets/grid-3x3-qKjElxaz.js +6 -0
  741. vibe_surf/backend/frontend/assets/grip--SsS48b-.js +6 -0
  742. vibe_surf/backend/frontend/assets/grip-horizontal-DapWkFjo.js +6 -0
  743. vibe_surf/backend/frontend/assets/grip-vertical-vn3rXQIt.js +6 -0
  744. vibe_surf/backend/frontend/assets/group-XhzCMXdw.js +6 -0
  745. vibe_surf/backend/frontend/assets/guitar-But8OLt2.js +6 -0
  746. vibe_surf/backend/frontend/assets/ham-_9G65W_I.js +6 -0
  747. vibe_surf/backend/frontend/assets/hammer-C2AZqVnX.js +6 -0
  748. vibe_surf/backend/frontend/assets/hand-DXuxSiOo.js +6 -0
  749. vibe_surf/backend/frontend/assets/hand-coins-mma7__lh.js +6 -0
  750. vibe_surf/backend/frontend/assets/hand-heart-DNtq1bnS.js +6 -0
  751. vibe_surf/backend/frontend/assets/hand-helping-Cdw7lKNu.js +6 -0
  752. vibe_surf/backend/frontend/assets/hand-metal-CcoWdRUV.js +6 -0
  753. vibe_surf/backend/frontend/assets/hand-platter-DoQTVTFx.js +6 -0
  754. vibe_surf/backend/frontend/assets/handshake-CJyspjIU.js +6 -0
  755. vibe_surf/backend/frontend/assets/hard-drive-ZduQuJtY.js +6 -0
  756. vibe_surf/backend/frontend/assets/hard-drive-download-D_hUh11c.js +6 -0
  757. vibe_surf/backend/frontend/assets/hard-drive-upload-BBPLIyZo.js +6 -0
  758. vibe_surf/backend/frontend/assets/hard-hat-OlmGevRI.js +6 -0
  759. vibe_surf/backend/frontend/assets/hash-COjLjaYu.js +6 -0
  760. vibe_surf/backend/frontend/assets/haze-Vf7OsAWn.js +6 -0
  761. vibe_surf/backend/frontend/assets/hdmi-port-B3C9bYX1.js +6 -0
  762. vibe_surf/backend/frontend/assets/heading-1-Dyyb72R2.js +6 -0
  763. vibe_surf/backend/frontend/assets/heading-2-ClF7vOi5.js +6 -0
  764. vibe_surf/backend/frontend/assets/heading-3-DPRazJfc.js +6 -0
  765. vibe_surf/backend/frontend/assets/heading-4-3e6Zii5g.js +6 -0
  766. vibe_surf/backend/frontend/assets/heading-5-GEVsfo30.js +6 -0
  767. vibe_surf/backend/frontend/assets/heading-6-CtX8dWYy.js +6 -0
  768. vibe_surf/backend/frontend/assets/heading-C_c5dBtC.js +6 -0
  769. vibe_surf/backend/frontend/assets/headphone-off-VkuNIw42.js +6 -0
  770. vibe_surf/backend/frontend/assets/headphones-BdMKOmhg.js +6 -0
  771. vibe_surf/backend/frontend/assets/headset-CGOllUmf.js +6 -0
  772. vibe_surf/backend/frontend/assets/heart-J_dfRIZ7.js +6 -0
  773. vibe_surf/backend/frontend/assets/heart-crack-BDNXXAjd.js +6 -0
  774. vibe_surf/backend/frontend/assets/heart-handshake-BhQLIVaj.js +6 -0
  775. vibe_surf/backend/frontend/assets/heart-minus-Dgexi3zQ.js +6 -0
  776. vibe_surf/backend/frontend/assets/heart-off-DF68jDRm.js +6 -0
  777. vibe_surf/backend/frontend/assets/heart-plus-D3LX6R_l.js +6 -0
  778. vibe_surf/backend/frontend/assets/heart-pulse-DnwkpqSJ.js +6 -0
  779. vibe_surf/backend/frontend/assets/heater-Bilq_TPS.js +6 -0
  780. vibe_surf/backend/frontend/assets/hexagon-BEvfIIaV.js +6 -0
  781. vibe_surf/backend/frontend/assets/highlighter-CNa8UVQD.js +6 -0
  782. vibe_surf/backend/frontend/assets/history-BggOc8wP.js +6 -0
  783. vibe_surf/backend/frontend/assets/hop-BCUHAdeR.js +6 -0
  784. vibe_surf/backend/frontend/assets/hop-off-B5f9Fr80.js +6 -0
  785. vibe_surf/backend/frontend/assets/hospital-Dk0tqXu9.js +6 -0
  786. vibe_surf/backend/frontend/assets/hotel-CXl-yW7B.js +6 -0
  787. vibe_surf/backend/frontend/assets/hourglass-DSRXQwTc.js +6 -0
  788. vibe_surf/backend/frontend/assets/house-Bhp2WF4v.js +6 -0
  789. vibe_surf/backend/frontend/assets/house-plug-DXm5j2Xq.js +6 -0
  790. vibe_surf/backend/frontend/assets/house-plus-KMp_x4hA.js +6 -0
  791. vibe_surf/backend/frontend/assets/house-wifi-Ccrar5-8.js +6 -0
  792. vibe_surf/backend/frontend/assets/ice-cream-bowl-j3qet3-o.js +6 -0
  793. vibe_surf/backend/frontend/assets/ice-cream-cone-XtpMBOSu.js +6 -0
  794. vibe_surf/backend/frontend/assets/id-card-BqzQOrR_.js +6 -0
  795. vibe_surf/backend/frontend/assets/image-B3lEwdvu.js +6 -0
  796. vibe_surf/backend/frontend/assets/image-down-sVdzbwfm.js +6 -0
  797. vibe_surf/backend/frontend/assets/image-minus-BdddBiyu.js +6 -0
  798. vibe_surf/backend/frontend/assets/image-off-CCZ9kVWH.js +6 -0
  799. vibe_surf/backend/frontend/assets/image-play-LNuKchCO.js +6 -0
  800. vibe_surf/backend/frontend/assets/image-plus-B4GTKJ6Z.js +6 -0
  801. vibe_surf/backend/frontend/assets/image-up-BfxmsdpY.js +6 -0
  802. vibe_surf/backend/frontend/assets/image-upscale-CexWZ50d.js +6 -0
  803. vibe_surf/backend/frontend/assets/images-C8Wp1eOg.js +6 -0
  804. vibe_surf/backend/frontend/assets/import-ec27SWYy.js +6 -0
  805. vibe_surf/backend/frontend/assets/inbox-YvwvpFKi.js +6 -0
  806. vibe_surf/backend/frontend/assets/indent-decrease-Dp0BVsoQ.js +6 -0
  807. vibe_surf/backend/frontend/assets/indent-increase-D3BuYj2n.js +6 -0
  808. vibe_surf/backend/frontend/assets/index-2CcQW4OZ.js +13 -0
  809. vibe_surf/backend/frontend/assets/index-4vq5awkV.js +1 -0
  810. vibe_surf/backend/frontend/assets/index-5ZZlgfo-.js +1 -0
  811. vibe_surf/backend/frontend/assets/index-6dxAUV6Y.js +1 -0
  812. vibe_surf/backend/frontend/assets/index-AzcZQWVx.js +2723 -0
  813. vibe_surf/backend/frontend/assets/index-B-IDFsd0.js +1 -0
  814. vibe_surf/backend/frontend/assets/index-B-ohDVDe.js +1 -0
  815. vibe_surf/backend/frontend/assets/index-B1Q4y1qa.js +1 -0
  816. vibe_surf/backend/frontend/assets/index-B1SY6fah.js +1 -0
  817. vibe_surf/backend/frontend/assets/index-B2ljcLYu.js +1 -0
  818. vibe_surf/backend/frontend/assets/index-B4-H1yfm.js +108 -0
  819. vibe_surf/backend/frontend/assets/index-B6MKztQU.js +1 -0
  820. vibe_surf/backend/frontend/assets/index-B7i2Q-3O.js +1 -0
  821. vibe_surf/backend/frontend/assets/index-B9Wx-Ii0.js +1 -0
  822. vibe_surf/backend/frontend/assets/index-BFzpTaXY.js +1 -0
  823. vibe_surf/backend/frontend/assets/index-BIBNbmyC.js +1 -0
  824. vibe_surf/backend/frontend/assets/index-BL_hoToU.js +1 -0
  825. vibe_surf/backend/frontend/assets/index-BOeI-zQ9.js +1 -0
  826. vibe_surf/backend/frontend/assets/index-BPEpFAuc.js +1 -0
  827. vibe_surf/backend/frontend/assets/index-BQ1eB4fC.js +1 -0
  828. vibe_surf/backend/frontend/assets/index-BQ2H2d3f.js +1 -0
  829. vibe_surf/backend/frontend/assets/index-BR-8IPV4.js +205 -0
  830. vibe_surf/backend/frontend/assets/index-BV8ArFsA.js +1 -0
  831. vibe_surf/backend/frontend/assets/index-BWwASCq5.js +1 -0
  832. vibe_surf/backend/frontend/assets/index-BWwglY3I.js +1 -0
  833. vibe_surf/backend/frontend/assets/index-B_Qz_foX.js +1 -0
  834. vibe_surf/backend/frontend/assets/index-BaoW7GZH.js +1 -0
  835. vibe_surf/backend/frontend/assets/index-BcrHz-y8.js +1 -0
  836. vibe_surf/backend/frontend/assets/index-BdSzkc1f.js +20 -0
  837. vibe_surf/backend/frontend/assets/index-BeLkvqxv.js +1 -0
  838. vibe_surf/backend/frontend/assets/index-Beq_etUM.js +1 -0
  839. vibe_surf/backend/frontend/assets/index-BgzQso9y.js +1 -0
  840. vibe_surf/backend/frontend/assets/index-BiNrEY13.js +1 -0
  841. vibe_surf/backend/frontend/assets/index-Bja3ZEZo.js +1 -0
  842. vibe_surf/backend/frontend/assets/index-BmcD7XCM.js +1 -0
  843. vibe_surf/backend/frontend/assets/index-BmnwJzsA.js +1 -0
  844. vibe_surf/backend/frontend/assets/index-BssAenIo.js +1 -0
  845. vibe_surf/backend/frontend/assets/index-BvEZ1ywS.js +1 -0
  846. vibe_surf/backend/frontend/assets/index-BwO1owi8.js +1 -0
  847. vibe_surf/backend/frontend/assets/index-BwXsJbuu.js +21 -0
  848. vibe_surf/backend/frontend/assets/index-BwlG2DdK.js +1 -0
  849. vibe_surf/backend/frontend/assets/index-BzjC6B6I.js +1 -0
  850. vibe_surf/backend/frontend/assets/index-C0BOag_5.js +1 -0
  851. vibe_surf/backend/frontend/assets/index-C0EsaEHC.js +1 -0
  852. vibe_surf/backend/frontend/assets/index-C0IGIaTE.js +1 -0
  853. vibe_surf/backend/frontend/assets/index-C0IdY_9F.js +1 -0
  854. vibe_surf/backend/frontend/assets/index-C1DABLwl.js +1 -0
  855. vibe_surf/backend/frontend/assets/index-C1JE4AZB.js +1 -0
  856. vibe_surf/backend/frontend/assets/index-C1Rkl2Ur.js +1 -0
  857. vibe_surf/backend/frontend/assets/index-C2YWu5t8.js +1 -0
  858. vibe_surf/backend/frontend/assets/index-C2_4AcrM.js +1 -0
  859. vibe_surf/backend/frontend/assets/index-C48IE5LT.js +1 -0
  860. vibe_surf/backend/frontend/assets/index-C4JqQnzd.js +1 -0
  861. vibe_surf/backend/frontend/assets/index-C5QqjjEO.js +1 -0
  862. vibe_surf/backend/frontend/assets/index-C6ZyrgxW.js +1 -0
  863. vibe_surf/backend/frontend/assets/index-C9n9R8Ob.js +1 -0
  864. vibe_surf/backend/frontend/assets/index-CATPt8gz.js +1 -0
  865. vibe_surf/backend/frontend/assets/index-CAc6KlCl.js +1 -0
  866. vibe_surf/backend/frontend/assets/index-CAeE91z_.js +1 -0
  867. vibe_surf/backend/frontend/assets/index-CBLrD5S8.js +1 -0
  868. vibe_surf/backend/frontend/assets/index-CEx7_efn.js +1 -0
  869. vibe_surf/backend/frontend/assets/index-CGNwvjd6.js +1 -0
  870. vibe_surf/backend/frontend/assets/index-CJIkyYuu.js +1 -0
  871. vibe_surf/backend/frontend/assets/index-CL8YNknR.js +1 -0
  872. vibe_surf/backend/frontend/assets/index-CQ4c4zmh.js +1 -0
  873. vibe_surf/backend/frontend/assets/index-CSKpbeRU.js +1 -0
  874. vibe_surf/backend/frontend/assets/index-CTJUto70.js +1 -0
  875. vibe_surf/backend/frontend/assets/index-CUm8t_3-.js +1 -0
  876. vibe_surf/backend/frontend/assets/index-CWaG8YQf.js +1 -0
  877. vibe_surf/backend/frontend/assets/index-CWqCL2_S.js +1 -0
  878. vibe_surf/backend/frontend/assets/index-CZKjLvxC.js +1 -0
  879. vibe_surf/backend/frontend/assets/index-C_a_gjJ3.js +7382 -0
  880. vibe_surf/backend/frontend/assets/index-C_gjztJA.js +1 -0
  881. vibe_surf/backend/frontend/assets/index-Cd394DZ3.js +1 -0
  882. vibe_surf/backend/frontend/assets/index-Ch_ENQTO.js +1 -0
  883. vibe_surf/backend/frontend/assets/index-CjDauRtw.js +1 -0
  884. vibe_surf/backend/frontend/assets/index-Cjsyudia.js +1 -0
  885. vibe_surf/backend/frontend/assets/index-Ck0Rk7OE.js +1 -0
  886. vibe_surf/backend/frontend/assets/index-Ct1jT_zG.js +1 -0
  887. vibe_surf/backend/frontend/assets/index-CtZOHuJR.js +1 -0
  888. vibe_surf/backend/frontend/assets/index-CwylYZIy.js +1 -0
  889. vibe_surf/backend/frontend/assets/index-CxGAIJCD.js +1 -0
  890. vibe_surf/backend/frontend/assets/index-D-6VXnmQ.js +1 -0
  891. vibe_surf/backend/frontend/assets/index-D-_pq5D8.js +1 -0
  892. vibe_surf/backend/frontend/assets/index-D-oTsuqV.js +1 -0
  893. vibe_surf/backend/frontend/assets/index-D8iHrvl3.js +1 -0
  894. vibe_surf/backend/frontend/assets/index-DDYB0tod.js +1 -0
  895. vibe_surf/backend/frontend/assets/index-DDtHdtyM.js +1 -0
  896. vibe_surf/backend/frontend/assets/index-DH3R0iod.js +1 -0
  897. vibe_surf/backend/frontend/assets/index-DJAmqieX.js +1 -0
  898. vibe_surf/backend/frontend/assets/index-DJYhOcBD.js +1 -0
  899. vibe_surf/backend/frontend/assets/index-DQKxDe4Q.js +1 -0
  900. vibe_surf/backend/frontend/assets/index-DS9glxiF.js +1 -0
  901. vibe_surf/backend/frontend/assets/index-DUjF6qus.js +2 -0
  902. vibe_surf/backend/frontend/assets/index-DXYmUzC_.css +1 -0
  903. vibe_surf/backend/frontend/assets/index-D_wRbh5r.js +1 -0
  904. vibe_surf/backend/frontend/assets/index-Db4BfmcT.js +1 -0
  905. vibe_surf/backend/frontend/assets/index-DfZGZYcK.js +1 -0
  906. vibe_surf/backend/frontend/assets/index-DlDGYPf2.js +1 -0
  907. vibe_surf/backend/frontend/assets/index-DlFy5Gok.js +1 -0
  908. vibe_surf/backend/frontend/assets/index-DmVpDlko.js +1 -0
  909. vibe_surf/backend/frontend/assets/index-Dpc9wHta.js +1 -0
  910. vibe_surf/backend/frontend/assets/index-DvcAIETO.js +1 -0
  911. vibe_surf/backend/frontend/assets/index-Dwi-X1Od.js +1 -0
  912. vibe_surf/backend/frontend/assets/index-FMPFv3Wf.js +1 -0
  913. vibe_surf/backend/frontend/assets/index-H3Uskc2o.js +1 -0
  914. vibe_surf/backend/frontend/assets/index-JWfrTs_0.js +1 -0
  915. vibe_surf/backend/frontend/assets/index-LX3KOMfj.js +1 -0
  916. vibe_surf/backend/frontend/assets/index-LXWgTVf4.js +1 -0
  917. vibe_surf/backend/frontend/assets/index-WJ6PviAq.js +1 -0
  918. vibe_surf/backend/frontend/assets/index-WrqFIXAC.js +1 -0
  919. vibe_surf/backend/frontend/assets/index-Yoj1a8xs.js +1 -0
  920. vibe_surf/backend/frontend/assets/index-YxTPhodS.js +1 -0
  921. vibe_surf/backend/frontend/assets/index-_8LB3oNa.js +1 -0
  922. vibe_surf/backend/frontend/assets/index-bNhROe-x.js +1 -0
  923. vibe_surf/backend/frontend/assets/index-cQAtXO5d.js +1 -0
  924. vibe_surf/backend/frontend/assets/index-hIdlDvEv.js +1 -0
  925. vibe_surf/backend/frontend/assets/index-hxJwU1-s.js +1 -0
  926. vibe_surf/backend/frontend/assets/index-iA_X3O5r.js +1 -0
  927. vibe_surf/backend/frontend/assets/index-iW93REva.js +1 -0
  928. vibe_surf/backend/frontend/assets/index-k2RdCBHb.js +1 -0
  929. vibe_surf/backend/frontend/assets/index-kJKg9EzG.js +1 -0
  930. vibe_surf/backend/frontend/assets/index-mX6ATl2n.js +1 -0
  931. vibe_surf/backend/frontend/assets/index-muCxPdjC.js +1 -0
  932. vibe_surf/backend/frontend/assets/index-nd1f74Wi.js +1 -0
  933. vibe_surf/backend/frontend/assets/index-qGbEX4n3.js +1 -0
  934. vibe_surf/backend/frontend/assets/index-qOd-CLaR.js +1 -0
  935. vibe_surf/backend/frontend/assets/index-sguRseYw.js +1 -0
  936. vibe_surf/backend/frontend/assets/index-vd7ILFrg.js +1 -0
  937. vibe_surf/backend/frontend/assets/index-we6mCAhv.js +1 -0
  938. vibe_surf/backend/frontend/assets/index-x0VA7yzX.js +1 -0
  939. vibe_surf/backend/frontend/assets/index-yCVeNkNd.js +1 -0
  940. vibe_surf/backend/frontend/assets/indian-rupee-ClaZI0Dh.js +6 -0
  941. vibe_surf/backend/frontend/assets/infinity-LKjcIaZa.js +6 -0
  942. vibe_surf/backend/frontend/assets/info-DFBdB7_c.js +6 -0
  943. vibe_surf/backend/frontend/assets/inspection-panel-DGzE6245.js +6 -0
  944. vibe_surf/backend/frontend/assets/instagram-CJj5AWOV.js +6 -0
  945. vibe_surf/backend/frontend/assets/italic-CKFB3the.js +6 -0
  946. vibe_surf/backend/frontend/assets/iteration-ccw-YnfylsKm.js +6 -0
  947. vibe_surf/backend/frontend/assets/iteration-cw-DTHRwCcy.js +6 -0
  948. vibe_surf/backend/frontend/assets/japanese-yen-BG_Inyh_.js +6 -0
  949. vibe_surf/backend/frontend/assets/joystick-bJVSvZlL.js +6 -0
  950. vibe_surf/backend/frontend/assets/kanban-KP-K8pC9.js +6 -0
  951. vibe_surf/backend/frontend/assets/key-CNaiqe5q.js +6 -0
  952. vibe_surf/backend/frontend/assets/key-round-RTYFDTCa.js +6 -0
  953. vibe_surf/backend/frontend/assets/key-square-C7EKR-zE.js +6 -0
  954. vibe_surf/backend/frontend/assets/keyboard-DaM0Dl19.js +6 -0
  955. vibe_surf/backend/frontend/assets/keyboard-music-CzJZiHzS.js +6 -0
  956. vibe_surf/backend/frontend/assets/keyboard-off-C9Jl7GZs.js +6 -0
  957. vibe_surf/backend/frontend/assets/lamp-DK_3DJnO.js +6 -0
  958. vibe_surf/backend/frontend/assets/lamp-ceiling-B8sGjZ8c.js +6 -0
  959. vibe_surf/backend/frontend/assets/lamp-desk-CxWpiNas.js +6 -0
  960. vibe_surf/backend/frontend/assets/lamp-floor-EUFzRKf7.js +6 -0
  961. vibe_surf/backend/frontend/assets/lamp-wall-down-BV84JTWM.js +6 -0
  962. vibe_surf/backend/frontend/assets/lamp-wall-up-BqpaYZN9.js +6 -0
  963. vibe_surf/backend/frontend/assets/land-plot-Dly_Debw.js +6 -0
  964. vibe_surf/backend/frontend/assets/landmark-W6MewilS.js +6 -0
  965. vibe_surf/backend/frontend/assets/languages-BQghN4Gu.js +6 -0
  966. vibe_surf/backend/frontend/assets/laptop-BysYcdO1.js +6 -0
  967. vibe_surf/backend/frontend/assets/laptop-minimal-CUViKl_u.js +6 -0
  968. vibe_surf/backend/frontend/assets/laptop-minimal-check-BZNY8l54.js +6 -0
  969. vibe_surf/backend/frontend/assets/lasso-CBTyEbGH.js +6 -0
  970. vibe_surf/backend/frontend/assets/lasso-select-D9j71vtb.js +6 -0
  971. vibe_surf/backend/frontend/assets/laugh-fkxJEAC6.js +6 -0
  972. vibe_surf/backend/frontend/assets/layers-2-B3mnroGJ.js +6 -0
  973. vibe_surf/backend/frontend/assets/layers-CLO8Qj7V.js +6 -0
  974. vibe_surf/backend/frontend/assets/layout-dashboard-BCgC4-j3.js +6 -0
  975. vibe_surf/backend/frontend/assets/layout-grid-DQlh6Dv5.js +6 -0
  976. vibe_surf/backend/frontend/assets/layout-list-BK2Y57B-.js +6 -0
  977. vibe_surf/backend/frontend/assets/layout-panel-left-BzdjKizu.js +6 -0
  978. vibe_surf/backend/frontend/assets/layout-panel-top-CmMnqmez.js +6 -0
  979. vibe_surf/backend/frontend/assets/layout-template-DkuzhO5B.js +6 -0
  980. vibe_surf/backend/frontend/assets/lazyIconImports-Cbxc-ykm.js +2 -0
  981. vibe_surf/backend/frontend/assets/leaf-D1Z4WxA8.js +6 -0
  982. vibe_surf/backend/frontend/assets/leafy-green-C7IHTNVi.js +6 -0
  983. vibe_surf/backend/frontend/assets/lectern-BpswhiFV.js +6 -0
  984. vibe_surf/backend/frontend/assets/letter-text-B_mZgzJ7.js +6 -0
  985. vibe_surf/backend/frontend/assets/library-BEQ0EBja.js +6 -0
  986. vibe_surf/backend/frontend/assets/library-big-C32jLDwT.js +6 -0
  987. vibe_surf/backend/frontend/assets/life-buoy-AWdXr4CQ.js +6 -0
  988. vibe_surf/backend/frontend/assets/ligature-DRsGqV7j.js +6 -0
  989. vibe_surf/backend/frontend/assets/lightbulb-D3KZbCQp.js +6 -0
  990. vibe_surf/backend/frontend/assets/lightbulb-off-iSDmy8d6.js +6 -0
  991. vibe_surf/backend/frontend/assets/link-2-CCZYGxDI.js +6 -0
  992. vibe_surf/backend/frontend/assets/link-2-off-BWpEKUCS.js +6 -0
  993. vibe_surf/backend/frontend/assets/link-Diw-YZ8t.js +6 -0
  994. vibe_surf/backend/frontend/assets/linkedin-CExn9EK5.js +6 -0
  995. vibe_surf/backend/frontend/assets/list-CB9zDbEv.js +6 -0
  996. vibe_surf/backend/frontend/assets/list-check-CCdijvLD.js +6 -0
  997. vibe_surf/backend/frontend/assets/list-checks-B1EQ8oeV.js +6 -0
  998. vibe_surf/backend/frontend/assets/list-collapse-B_Nyhn3U.js +6 -0
  999. vibe_surf/backend/frontend/assets/list-end-BRGFPR4T.js +6 -0
  1000. vibe_surf/backend/frontend/assets/list-filter-DR4JqPVX.js +6 -0
  1001. vibe_surf/backend/frontend/assets/list-filter-plus-Q7j2JYzP.js +6 -0
  1002. vibe_surf/backend/frontend/assets/list-minus-DrLtfmEG.js +6 -0
  1003. vibe_surf/backend/frontend/assets/list-music-C6MOQHoL.js +6 -0
  1004. vibe_surf/backend/frontend/assets/list-ordered-Db8L0lqU.js +6 -0
  1005. vibe_surf/backend/frontend/assets/list-plus-C1dade1Z.js +6 -0
  1006. vibe_surf/backend/frontend/assets/list-restart-CyRkF6Xo.js +6 -0
  1007. vibe_surf/backend/frontend/assets/list-start-CAn16QHF.js +6 -0
  1008. vibe_surf/backend/frontend/assets/list-todo-giJ3EaBY.js +6 -0
  1009. vibe_surf/backend/frontend/assets/list-tree-ZTTp4tz8.js +6 -0
  1010. vibe_surf/backend/frontend/assets/list-video-SNqnTTmu.js +6 -0
  1011. vibe_surf/backend/frontend/assets/list-x-XeDairuR.js +6 -0
  1012. vibe_surf/backend/frontend/assets/loader-RYX0GikH.js +6 -0
  1013. vibe_surf/backend/frontend/assets/loader-circle-CjMVhyrE.js +6 -0
  1014. vibe_surf/backend/frontend/assets/loader-pinwheel-Dv08mzUX.js +6 -0
  1015. vibe_surf/backend/frontend/assets/locate-DcqAXVyu.js +6 -0
  1016. vibe_surf/backend/frontend/assets/locate-fixed-BgaqK3FM.js +6 -0
  1017. vibe_surf/backend/frontend/assets/locate-off-1UN8A6fK.js +6 -0
  1018. vibe_surf/backend/frontend/assets/location-edit-DFbMZW6i.js +6 -0
  1019. vibe_surf/backend/frontend/assets/lock-DWN4LH3Q.js +6 -0
  1020. vibe_surf/backend/frontend/assets/lock-keyhole-aeS26SmF.js +6 -0
  1021. vibe_surf/backend/frontend/assets/lock-keyhole-open-CoXzZLpr.js +6 -0
  1022. vibe_surf/backend/frontend/assets/lock-open-CBPubokC.js +6 -0
  1023. vibe_surf/backend/frontend/assets/log-in-BW8pmSIu.js +6 -0
  1024. vibe_surf/backend/frontend/assets/log-out-D-d0DczA.js +6 -0
  1025. vibe_surf/backend/frontend/assets/logo_dark-_nccwgMn.png +0 -0
  1026. vibe_surf/backend/frontend/assets/logo_light-DKZjS8CD.png +0 -0
  1027. vibe_surf/backend/frontend/assets/logs-AXuVwIE_.js +6 -0
  1028. vibe_surf/backend/frontend/assets/lollipop-CxugcHkj.js +6 -0
  1029. vibe_surf/backend/frontend/assets/luggage-CFtS088O.js +6 -0
  1030. vibe_surf/backend/frontend/assets/magnet-BpIqKX0D.js +6 -0
  1031. vibe_surf/backend/frontend/assets/mail-1Br8NAMK.js +6 -0
  1032. vibe_surf/backend/frontend/assets/mail-check-DFwD0fvI.js +6 -0
  1033. vibe_surf/backend/frontend/assets/mail-minus-B_KovqmT.js +6 -0
  1034. vibe_surf/backend/frontend/assets/mail-open-VEmMVybi.js +6 -0
  1035. vibe_surf/backend/frontend/assets/mail-plus-D-1Wacj7.js +6 -0
  1036. vibe_surf/backend/frontend/assets/mail-question-CJK96wre.js +6 -0
  1037. vibe_surf/backend/frontend/assets/mail-search-Du6F72Wj.js +6 -0
  1038. vibe_surf/backend/frontend/assets/mail-warning-BI87_kvG.js +6 -0
  1039. vibe_surf/backend/frontend/assets/mail-x-DU415vbZ.js +6 -0
  1040. vibe_surf/backend/frontend/assets/mailbox-CMHDAMVZ.js +6 -0
  1041. vibe_surf/backend/frontend/assets/mails-CUDj41Cn.js +6 -0
  1042. vibe_surf/backend/frontend/assets/map-D2I0g3OZ.js +6 -0
  1043. vibe_surf/backend/frontend/assets/map-pin-CiM6iB2r.js +6 -0
  1044. vibe_surf/backend/frontend/assets/map-pin-check-BQWCC6Uv.js +6 -0
  1045. vibe_surf/backend/frontend/assets/map-pin-check-inside-CVhhgPHY.js +6 -0
  1046. vibe_surf/backend/frontend/assets/map-pin-house-CXbXX8w-.js +6 -0
  1047. vibe_surf/backend/frontend/assets/map-pin-minus-D0dRHvgd.js +6 -0
  1048. vibe_surf/backend/frontend/assets/map-pin-minus-inside-DGpPZYAi.js +6 -0
  1049. vibe_surf/backend/frontend/assets/map-pin-off-EbFPnlZq.js +6 -0
  1050. vibe_surf/backend/frontend/assets/map-pin-plus-BLD0VcG5.js +6 -0
  1051. vibe_surf/backend/frontend/assets/map-pin-plus-inside-CapcP3Yk.js +6 -0
  1052. vibe_surf/backend/frontend/assets/map-pin-x-DrNWALEC.js +6 -0
  1053. vibe_surf/backend/frontend/assets/map-pin-x-inside-9DqM8z-J.js +6 -0
  1054. vibe_surf/backend/frontend/assets/map-pinned-DHMQpBhr.js +6 -0
  1055. vibe_surf/backend/frontend/assets/map-plus-CQm0KS9c.js +6 -0
  1056. vibe_surf/backend/frontend/assets/mars-CcweinsF.js +6 -0
  1057. vibe_surf/backend/frontend/assets/mars-stroke-OWTfhzV5.js +6 -0
  1058. vibe_surf/backend/frontend/assets/martini-DGORgxbx.js +6 -0
  1059. vibe_surf/backend/frontend/assets/maximize-2-CN4UuSQb.js +6 -0
  1060. vibe_surf/backend/frontend/assets/maximize-DOYuzVqB.js +6 -0
  1061. vibe_surf/backend/frontend/assets/medal-DZT2ADyJ.js +6 -0
  1062. vibe_surf/backend/frontend/assets/megaphone-DN4B6I5c.js +6 -0
  1063. vibe_surf/backend/frontend/assets/megaphone-off-DRAddUqF.js +6 -0
  1064. vibe_surf/backend/frontend/assets/meh-CTX3Y793.js +6 -0
  1065. vibe_surf/backend/frontend/assets/memory-stick-CSG08PuA.js +6 -0
  1066. vibe_surf/backend/frontend/assets/menu-BUvQ8bhy.js +6 -0
  1067. vibe_surf/backend/frontend/assets/merge-xkPPWyBJ.js +6 -0
  1068. vibe_surf/backend/frontend/assets/message-circle-BSqs77ZY.js +6 -0
  1069. vibe_surf/backend/frontend/assets/message-circle-code-EW46-KUX.js +6 -0
  1070. vibe_surf/backend/frontend/assets/message-circle-dashed-BOxWD8kE.js +6 -0
  1071. vibe_surf/backend/frontend/assets/message-circle-heart-CBhiUXeV.js +6 -0
  1072. vibe_surf/backend/frontend/assets/message-circle-more-DqfUhx6W.js +6 -0
  1073. vibe_surf/backend/frontend/assets/message-circle-off-DrsP7VV_.js +6 -0
  1074. vibe_surf/backend/frontend/assets/message-circle-plus-IixbN-s-.js +6 -0
  1075. vibe_surf/backend/frontend/assets/message-circle-question-DsMgtwwS.js +6 -0
  1076. vibe_surf/backend/frontend/assets/message-circle-reply-D_Eog9Yc.js +6 -0
  1077. vibe_surf/backend/frontend/assets/message-circle-warning-D656cL7l.js +6 -0
  1078. vibe_surf/backend/frontend/assets/message-circle-x-CXWR4BBb.js +6 -0
  1079. vibe_surf/backend/frontend/assets/message-square-DKWryKVG.js +6 -0
  1080. vibe_surf/backend/frontend/assets/message-square-code-0ANFU-JW.js +6 -0
  1081. vibe_surf/backend/frontend/assets/message-square-dashed-DaZwp2x1.js +6 -0
  1082. vibe_surf/backend/frontend/assets/message-square-diff-DpJLi_UX.js +6 -0
  1083. vibe_surf/backend/frontend/assets/message-square-dot-OcgwyxZC.js +6 -0
  1084. vibe_surf/backend/frontend/assets/message-square-heart-CKfZOSw8.js +6 -0
  1085. vibe_surf/backend/frontend/assets/message-square-lock-BnNy_yw5.js +6 -0
  1086. vibe_surf/backend/frontend/assets/message-square-more-D2WGFzms.js +6 -0
  1087. vibe_surf/backend/frontend/assets/message-square-off-DV5974j6.js +6 -0
  1088. vibe_surf/backend/frontend/assets/message-square-plus-7icA5g-P.js +6 -0
  1089. vibe_surf/backend/frontend/assets/message-square-quote-DdAvA-a_.js +6 -0
  1090. vibe_surf/backend/frontend/assets/message-square-reply-Cg9Dlls7.js +6 -0
  1091. vibe_surf/backend/frontend/assets/message-square-share-BptAhOEV.js +6 -0
  1092. vibe_surf/backend/frontend/assets/message-square-text-Cu-Ycwsi.js +6 -0
  1093. vibe_surf/backend/frontend/assets/message-square-warning-DxIzJ5bt.js +6 -0
  1094. vibe_surf/backend/frontend/assets/message-square-x-BF9akIp2.js +6 -0
  1095. vibe_surf/backend/frontend/assets/messages-square-AjrRNZXQ.js +6 -0
  1096. vibe_surf/backend/frontend/assets/mic-BXU1SRXR.js +6 -0
  1097. vibe_surf/backend/frontend/assets/mic-off-BUQ1-6-l.js +6 -0
  1098. vibe_surf/backend/frontend/assets/mic-vocal-CG4Yw8We.js +6 -0
  1099. vibe_surf/backend/frontend/assets/microchip-CodKB7m1.js +6 -0
  1100. vibe_surf/backend/frontend/assets/microscope-BY57GHi1.js +6 -0
  1101. vibe_surf/backend/frontend/assets/microwave-KuJ1X2CX.js +6 -0
  1102. vibe_surf/backend/frontend/assets/milestone-D_ToDu31.js +6 -0
  1103. vibe_surf/backend/frontend/assets/milk-C4Nq829F.js +6 -0
  1104. vibe_surf/backend/frontend/assets/milk-off-BPCtdIks.js +6 -0
  1105. vibe_surf/backend/frontend/assets/minimize-2-DeAs1S78.js +6 -0
  1106. vibe_surf/backend/frontend/assets/minimize-DKOGyuzf.js +6 -0
  1107. vibe_surf/backend/frontend/assets/monitor-Cjm4ELo4.js +6 -0
  1108. vibe_surf/backend/frontend/assets/monitor-check-CrckmDk_.js +6 -0
  1109. vibe_surf/backend/frontend/assets/monitor-cog-DIPYXk5z.js +6 -0
  1110. vibe_surf/backend/frontend/assets/monitor-dot-Cl_ZGBvp.js +6 -0
  1111. vibe_surf/backend/frontend/assets/monitor-down-DCSynbhm.js +6 -0
  1112. vibe_surf/backend/frontend/assets/monitor-off-Bxqkes47.js +6 -0
  1113. vibe_surf/backend/frontend/assets/monitor-pause-B2ogwlXq.js +6 -0
  1114. vibe_surf/backend/frontend/assets/monitor-play-w2CTvWQx.js +6 -0
  1115. vibe_surf/backend/frontend/assets/monitor-smartphone-DYQb-VQa.js +6 -0
  1116. vibe_surf/backend/frontend/assets/monitor-speaker-CruyWIOw.js +6 -0
  1117. vibe_surf/backend/frontend/assets/monitor-stop-D2cot7wP.js +6 -0
  1118. vibe_surf/backend/frontend/assets/monitor-up-Bo4VFUGK.js +6 -0
  1119. vibe_surf/backend/frontend/assets/monitor-x-yhFSw0Zo.js +6 -0
  1120. vibe_surf/backend/frontend/assets/moon-CZFTmFVS.js +6 -0
  1121. vibe_surf/backend/frontend/assets/moon-star-X8Pb6SAO.js +6 -0
  1122. vibe_surf/backend/frontend/assets/mountain-_tKRhauQ.js +6 -0
  1123. vibe_surf/backend/frontend/assets/mountain-snow-COLjUpoc.js +6 -0
  1124. vibe_surf/backend/frontend/assets/mouse-C62B_4i7.js +6 -0
  1125. vibe_surf/backend/frontend/assets/mouse-off-NO65wsqy.js +6 -0
  1126. vibe_surf/backend/frontend/assets/mouse-pointer-2-vvokJ-v-.js +6 -0
  1127. vibe_surf/backend/frontend/assets/mouse-pointer-IHoLB1Ii.js +6 -0
  1128. vibe_surf/backend/frontend/assets/mouse-pointer-ban-BGxlXS_f.js +6 -0
  1129. vibe_surf/backend/frontend/assets/mouse-pointer-click-C7N7cKxT.js +6 -0
  1130. vibe_surf/backend/frontend/assets/move-3d-CQO0qR5b.js +6 -0
  1131. vibe_surf/backend/frontend/assets/move-Bp3oIgRK.js +6 -0
  1132. vibe_surf/backend/frontend/assets/move-diagonal-2-CQ3Gqa4B.js +6 -0
  1133. vibe_surf/backend/frontend/assets/move-diagonal-BkUx0iYA.js +6 -0
  1134. vibe_surf/backend/frontend/assets/move-down-B4dxMy_p.js +6 -0
  1135. vibe_surf/backend/frontend/assets/move-down-left-NxvLep64.js +6 -0
  1136. vibe_surf/backend/frontend/assets/move-down-right-CxcsF1yI.js +6 -0
  1137. vibe_surf/backend/frontend/assets/move-horizontal-or6vuyOq.js +6 -0
  1138. vibe_surf/backend/frontend/assets/move-left-Tcae9tGG.js +6 -0
  1139. vibe_surf/backend/frontend/assets/move-right-jY3F431H.js +6 -0
  1140. vibe_surf/backend/frontend/assets/move-up-Dk8sPbRD.js +6 -0
  1141. vibe_surf/backend/frontend/assets/move-up-left-CD7NRvhF.js +6 -0
  1142. vibe_surf/backend/frontend/assets/move-up-right-BAOhHbBw.js +6 -0
  1143. vibe_surf/backend/frontend/assets/move-vertical-BxWj9bDO.js +6 -0
  1144. vibe_surf/backend/frontend/assets/music-2-DQL5lOH_.js +6 -0
  1145. vibe_surf/backend/frontend/assets/music-3-wkxjpooD.js +6 -0
  1146. vibe_surf/backend/frontend/assets/music-4-CgUN2PUO.js +6 -0
  1147. vibe_surf/backend/frontend/assets/music-YxXwq9fN.js +6 -0
  1148. vibe_surf/backend/frontend/assets/navigation-2-Ba4Z-jSq.js +6 -0
  1149. vibe_surf/backend/frontend/assets/navigation-2-off-C_LfeWvW.js +6 -0
  1150. vibe_surf/backend/frontend/assets/navigation-BEChOEsi.js +6 -0
  1151. vibe_surf/backend/frontend/assets/navigation-off-BehyOyE3.js +6 -0
  1152. vibe_surf/backend/frontend/assets/network-CwJLOq3T.js +6 -0
  1153. vibe_surf/backend/frontend/assets/newspaper-ELrHeGRI.js +6 -0
  1154. vibe_surf/backend/frontend/assets/nfc-B_3XFb34.js +6 -0
  1155. vibe_surf/backend/frontend/assets/non-binary-BsgU9v43.js +6 -0
  1156. vibe_surf/backend/frontend/assets/notebook-j-nq3SkT.js +6 -0
  1157. vibe_surf/backend/frontend/assets/notebook-pen-D9-IPVfi.js +6 -0
  1158. vibe_surf/backend/frontend/assets/notebook-tabs-B8RN5vFZ.js +6 -0
  1159. vibe_surf/backend/frontend/assets/notebook-text-9VvE4wV2.js +6 -0
  1160. vibe_surf/backend/frontend/assets/notepad-text-CtRuOWM5.js +6 -0
  1161. vibe_surf/backend/frontend/assets/notepad-text-dashed-BKDJS1oq.js +6 -0
  1162. vibe_surf/backend/frontend/assets/nut-MLKrgO4r.js +6 -0
  1163. vibe_surf/backend/frontend/assets/nut-off-CX5f1ggv.js +6 -0
  1164. vibe_surf/backend/frontend/assets/octagon-Dm5tdLTK.js +6 -0
  1165. vibe_surf/backend/frontend/assets/octagon-alert-THvRb-wV.js +6 -0
  1166. vibe_surf/backend/frontend/assets/octagon-minus-BIN-9swI.js +6 -0
  1167. vibe_surf/backend/frontend/assets/octagon-pause-BvRAlpaV.js +6 -0
  1168. vibe_surf/backend/frontend/assets/octagon-x-DeRG_Ls0.js +6 -0
  1169. vibe_surf/backend/frontend/assets/omega-CVAxeKBK.js +6 -0
  1170. vibe_surf/backend/frontend/assets/option-14pftykg.js +6 -0
  1171. vibe_surf/backend/frontend/assets/orbit-CfewrZaI.js +6 -0
  1172. vibe_surf/backend/frontend/assets/origami-BT1VriUJ.js +6 -0
  1173. vibe_surf/backend/frontend/assets/package-2-D11kpXq5.js +6 -0
  1174. vibe_surf/backend/frontend/assets/package-BegS59es.js +6 -0
  1175. vibe_surf/backend/frontend/assets/package-check-DOLq4x6S.js +6 -0
  1176. vibe_surf/backend/frontend/assets/package-minus-BFgP752B.js +6 -0
  1177. vibe_surf/backend/frontend/assets/package-open-D2nk_ytU.js +6 -0
  1178. vibe_surf/backend/frontend/assets/package-plus-Va8EoLSt.js +6 -0
  1179. vibe_surf/backend/frontend/assets/package-search-cGv3F3Yi.js +6 -0
  1180. vibe_surf/backend/frontend/assets/package-x-BFCKCrAT.js +6 -0
  1181. vibe_surf/backend/frontend/assets/paint-bucket-C1nh-Go_.js +6 -0
  1182. vibe_surf/backend/frontend/assets/paint-roller-C9vy4fuD.js +6 -0
  1183. vibe_surf/backend/frontend/assets/paintbrush-Bo4L8Hqc.js +6 -0
  1184. vibe_surf/backend/frontend/assets/paintbrush-vertical-DqUyy2UU.js +6 -0
  1185. vibe_surf/backend/frontend/assets/palette-DddGrkXJ.js +6 -0
  1186. vibe_surf/backend/frontend/assets/panel-bottom-DPSx8I79.js +6 -0
  1187. vibe_surf/backend/frontend/assets/panel-bottom-close-D0SBNVCx.js +6 -0
  1188. vibe_surf/backend/frontend/assets/panel-bottom-dashed-CR6jKyB5.js +6 -0
  1189. vibe_surf/backend/frontend/assets/panel-bottom-open-BA8uHJ1f.js +6 -0
  1190. vibe_surf/backend/frontend/assets/panel-left-close-HWzVGhEN.js +6 -0
  1191. vibe_surf/backend/frontend/assets/panel-left-dashed-C8CvEMus.js +6 -0
  1192. vibe_surf/backend/frontend/assets/panel-left-open-DZtgeJky.js +6 -0
  1193. vibe_surf/backend/frontend/assets/panel-right-BIGpcNCD.js +6 -0
  1194. vibe_surf/backend/frontend/assets/panel-right-close-D6I6nB-8.js +6 -0
  1195. vibe_surf/backend/frontend/assets/panel-right-dashed-Dt-tZyfJ.js +6 -0
  1196. vibe_surf/backend/frontend/assets/panel-right-open-Cso_cmr4.js +6 -0
  1197. vibe_surf/backend/frontend/assets/panel-top-DxQozLLO.js +6 -0
  1198. vibe_surf/backend/frontend/assets/panel-top-close-21p_Iy4Q.js +6 -0
  1199. vibe_surf/backend/frontend/assets/panel-top-dashed-BLLvCUcW.js +6 -0
  1200. vibe_surf/backend/frontend/assets/panel-top-open-DOpjqeXN.js +6 -0
  1201. vibe_surf/backend/frontend/assets/panels-left-bottom-Dgc_Zml-.js +6 -0
  1202. vibe_surf/backend/frontend/assets/panels-right-bottom-DBl33v5J.js +6 -0
  1203. vibe_surf/backend/frontend/assets/panels-top-left-Bh9Km2t_.js +6 -0
  1204. vibe_surf/backend/frontend/assets/paperclip-DwNdWjNs.js +6 -0
  1205. vibe_surf/backend/frontend/assets/parentheses-Bv3x0v0d.js +6 -0
  1206. vibe_surf/backend/frontend/assets/parking-meter-CaAUYem8.js +6 -0
  1207. vibe_surf/backend/frontend/assets/party-popper-o676ndwa.js +6 -0
  1208. vibe_surf/backend/frontend/assets/pause-DofdcFyf.js +6 -0
  1209. vibe_surf/backend/frontend/assets/paw-print-CsCZTGwP.js +6 -0
  1210. vibe_surf/backend/frontend/assets/pc-case-ChHKP8Bs.js +6 -0
  1211. vibe_surf/backend/frontend/assets/pen-BJrA5W2j.js +6 -0
  1212. vibe_surf/backend/frontend/assets/pen-line-Cn_-SNuM.js +6 -0
  1213. vibe_surf/backend/frontend/assets/pen-off-vpS9creP.js +6 -0
  1214. vibe_surf/backend/frontend/assets/pen-tool-BHi1klDG.js +6 -0
  1215. vibe_surf/backend/frontend/assets/pencil-Wem_VEVg.js +6 -0
  1216. vibe_surf/backend/frontend/assets/pencil-line-CpG7egII.js +6 -0
  1217. vibe_surf/backend/frontend/assets/pencil-off-DNbfjOTs.js +6 -0
  1218. vibe_surf/backend/frontend/assets/pencil-ruler-BQdaeQqI.js +6 -0
  1219. vibe_surf/backend/frontend/assets/pentagon-BNe4mDhm.js +6 -0
  1220. vibe_surf/backend/frontend/assets/percent-CDhexNCT.js +6 -0
  1221. vibe_surf/backend/frontend/assets/person-standing-DxYpZiGV.js +6 -0
  1222. vibe_surf/backend/frontend/assets/philippine-peso-B7FAFSBd.js +6 -0
  1223. vibe_surf/backend/frontend/assets/phone-CTiWkAUx.js +6 -0
  1224. vibe_surf/backend/frontend/assets/phone-call-CWavZZ8W.js +6 -0
  1225. vibe_surf/backend/frontend/assets/phone-forwarded-CLaEebEE.js +6 -0
  1226. vibe_surf/backend/frontend/assets/phone-incoming-Cv2OCBfT.js +6 -0
  1227. vibe_surf/backend/frontend/assets/phone-missed-DNNjfxVz.js +6 -0
  1228. vibe_surf/backend/frontend/assets/phone-off-ClVQWi0g.js +6 -0
  1229. vibe_surf/backend/frontend/assets/phone-outgoing-CY2TxKXl.js +6 -0
  1230. vibe_surf/backend/frontend/assets/pi-DNqBWxfj.js +6 -0
  1231. vibe_surf/backend/frontend/assets/piano-MiPm47Ma.js +6 -0
  1232. vibe_surf/backend/frontend/assets/pickaxe-YqkOBnCJ.js +6 -0
  1233. vibe_surf/backend/frontend/assets/picture-in-picture-2-BIKggEXM.js +6 -0
  1234. vibe_surf/backend/frontend/assets/picture-in-picture-QAMxgJMO.js +6 -0
  1235. vibe_surf/backend/frontend/assets/piggy-bank-DVE6nzj5.js +6 -0
  1236. vibe_surf/backend/frontend/assets/pilcrow-CIhZWZVN.js +6 -0
  1237. vibe_surf/backend/frontend/assets/pilcrow-left-Ca9XTMpA.js +6 -0
  1238. vibe_surf/backend/frontend/assets/pilcrow-right-CLd68jMN.js +6 -0
  1239. vibe_surf/backend/frontend/assets/pill-CBiMEkPj.js +6 -0
  1240. vibe_surf/backend/frontend/assets/pill-bottle-CJ3pejac.js +6 -0
  1241. vibe_surf/backend/frontend/assets/pin-Oo2Sku7X.js +6 -0
  1242. vibe_surf/backend/frontend/assets/pin-off-DG48ZMV_.js +6 -0
  1243. vibe_surf/backend/frontend/assets/pipette-BzvHUOUt.js +6 -0
  1244. vibe_surf/backend/frontend/assets/pizza-B5z39oy-.js +6 -0
  1245. vibe_surf/backend/frontend/assets/plane-eU326jPg.js +6 -0
  1246. vibe_surf/backend/frontend/assets/plane-landing-gxcqSKOA.js +6 -0
  1247. vibe_surf/backend/frontend/assets/plane-takeoff-CFmuOAfX.js +6 -0
  1248. vibe_surf/backend/frontend/assets/play-CaCbaWdR.js +6 -0
  1249. vibe_surf/backend/frontend/assets/plug-2-CaihODHc.js +6 -0
  1250. vibe_surf/backend/frontend/assets/plug-DrN0weqI.js +6 -0
  1251. vibe_surf/backend/frontend/assets/plug-zap-BT2sgwQy.js +6 -0
  1252. vibe_surf/backend/frontend/assets/pocket-DNEPJJmg.js +6 -0
  1253. vibe_surf/backend/frontend/assets/pocket-knife-1CI1aqMD.js +6 -0
  1254. vibe_surf/backend/frontend/assets/podcast-BsGsWn3h.js +6 -0
  1255. vibe_surf/backend/frontend/assets/pointer-B8T5gv-x.js +6 -0
  1256. vibe_surf/backend/frontend/assets/pointer-off-C2DXzg5S.js +6 -0
  1257. vibe_surf/backend/frontend/assets/popcorn-Bi10K8Em.js +6 -0
  1258. vibe_surf/backend/frontend/assets/popsicle-CxLa9bz8.js +6 -0
  1259. vibe_surf/backend/frontend/assets/pound-sterling-BFXPyyYU.js +6 -0
  1260. vibe_surf/backend/frontend/assets/power-BmqAlXVz.js +6 -0
  1261. vibe_surf/backend/frontend/assets/power-off-CT70n2O0.js +6 -0
  1262. vibe_surf/backend/frontend/assets/presentation-DVhaCvt0.js +6 -0
  1263. vibe_surf/backend/frontend/assets/printer-D7NgKQZm.js +6 -0
  1264. vibe_surf/backend/frontend/assets/printer-check-BYDiSYD3.js +6 -0
  1265. vibe_surf/backend/frontend/assets/projector-BFMEAUGw.js +6 -0
  1266. vibe_surf/backend/frontend/assets/proportions-CUypjhWs.js +6 -0
  1267. vibe_surf/backend/frontend/assets/puzzle-lPcRsrCP.js +6 -0
  1268. vibe_surf/backend/frontend/assets/pyramid-bX_YtvHu.js +6 -0
  1269. vibe_surf/backend/frontend/assets/qr-code-CMBq06CH.js +6 -0
  1270. vibe_surf/backend/frontend/assets/quote-BkFwr2wo.js +6 -0
  1271. vibe_surf/backend/frontend/assets/rabbit-CEyfAR1t.js +6 -0
  1272. vibe_surf/backend/frontend/assets/radar-bMcLs_bP.js +6 -0
  1273. vibe_surf/backend/frontend/assets/radiation-NMlxufHZ.js +6 -0
  1274. vibe_surf/backend/frontend/assets/radical-C3CE5pot.js +6 -0
  1275. vibe_surf/backend/frontend/assets/radio-DQMhSWLz.js +6 -0
  1276. vibe_surf/backend/frontend/assets/radio-receiver-Cwtiayz1.js +6 -0
  1277. vibe_surf/backend/frontend/assets/radio-tower-ngCBBDuR.js +6 -0
  1278. vibe_surf/backend/frontend/assets/radius-CB1vpl4-.js +6 -0
  1279. vibe_surf/backend/frontend/assets/rail-symbol-CWT8jn79.js +6 -0
  1280. vibe_surf/backend/frontend/assets/rainbow-eG2Z6xdv.js +6 -0
  1281. vibe_surf/backend/frontend/assets/rat-CjjmSgkE.js +6 -0
  1282. vibe_surf/backend/frontend/assets/ratio-Ck9TZd6C.js +6 -0
  1283. vibe_surf/backend/frontend/assets/receipt-QzIALZKN.js +6 -0
  1284. vibe_surf/backend/frontend/assets/receipt-cent-wAd12yx1.js +6 -0
  1285. vibe_surf/backend/frontend/assets/receipt-euro-BG_rS29_.js +6 -0
  1286. vibe_surf/backend/frontend/assets/receipt-indian-rupee-DlF7wlqh.js +6 -0
  1287. vibe_surf/backend/frontend/assets/receipt-japanese-yen-GDNnE_Bl.js +6 -0
  1288. vibe_surf/backend/frontend/assets/receipt-pound-sterling-CczRTrHu.js +6 -0
  1289. vibe_surf/backend/frontend/assets/receipt-russian-ruble-CP8qhoZV.js +6 -0
  1290. vibe_surf/backend/frontend/assets/receipt-swiss-franc-B1FjnBVT.js +6 -0
  1291. vibe_surf/backend/frontend/assets/receipt-text-Df0EAqK2.js +6 -0
  1292. vibe_surf/backend/frontend/assets/rectangle-ellipsis-BeZ5b8q2.js +6 -0
  1293. vibe_surf/backend/frontend/assets/rectangle-goggles-B0pWs5f6.js +6 -0
  1294. vibe_surf/backend/frontend/assets/rectangle-horizontal-5D8nW5zN.js +6 -0
  1295. vibe_surf/backend/frontend/assets/rectangle-vertical-D6iXTP5O.js +6 -0
  1296. vibe_surf/backend/frontend/assets/recycle-cePWNqck.js +6 -0
  1297. vibe_surf/backend/frontend/assets/redo-2-DflPUgVL.js +6 -0
  1298. vibe_surf/backend/frontend/assets/redo-C8hJqzAq.js +6 -0
  1299. vibe_surf/backend/frontend/assets/redo-dot-JyZC910i.js +6 -0
  1300. vibe_surf/backend/frontend/assets/refresh-ccw-QGOuU93p.js +6 -0
  1301. vibe_surf/backend/frontend/assets/refresh-ccw-dot-BVfOSZg8.js +6 -0
  1302. vibe_surf/backend/frontend/assets/refresh-cw-DttAl3PC.js +6 -0
  1303. vibe_surf/backend/frontend/assets/refresh-cw-off-1m7CD9nm.js +6 -0
  1304. vibe_surf/backend/frontend/assets/refrigerator-BGk6q_hL.js +6 -0
  1305. vibe_surf/backend/frontend/assets/regex-C-txrNUs.js +6 -0
  1306. vibe_surf/backend/frontend/assets/remove-formatting-CVxREpGZ.js +6 -0
  1307. vibe_surf/backend/frontend/assets/repeat-1-ChFj2WK-.js +6 -0
  1308. vibe_surf/backend/frontend/assets/repeat-2-ViBvoa4W.js +6 -0
  1309. vibe_surf/backend/frontend/assets/repeat-GoYG4svo.js +6 -0
  1310. vibe_surf/backend/frontend/assets/replace-GFcv_X_V.js +6 -0
  1311. vibe_surf/backend/frontend/assets/replace-all-zAC7UUp9.js +6 -0
  1312. vibe_surf/backend/frontend/assets/reply-C2IH8Yvz.js +6 -0
  1313. vibe_surf/backend/frontend/assets/reply-all-CXYDFlBb.js +6 -0
  1314. vibe_surf/backend/frontend/assets/rewind-Bmv_DtI_.js +6 -0
  1315. vibe_surf/backend/frontend/assets/ribbon-B4MeTNUc.js +6 -0
  1316. vibe_surf/backend/frontend/assets/robot-BsccFpqT.png +0 -0
  1317. vibe_surf/backend/frontend/assets/rocket-Ch2Sc43k.js +6 -0
  1318. vibe_surf/backend/frontend/assets/rocking-chair-Pcx0Ex8j.js +6 -0
  1319. vibe_surf/backend/frontend/assets/roller-coaster-DpdZyHU4.js +6 -0
  1320. vibe_surf/backend/frontend/assets/rotate-3d-CAlCCDrS.js +6 -0
  1321. vibe_surf/backend/frontend/assets/rotate-ccw-Dl5IeMD0.js +6 -0
  1322. vibe_surf/backend/frontend/assets/rotate-ccw-key-CbcFcY_X.js +6 -0
  1323. vibe_surf/backend/frontend/assets/rotate-ccw-square-B6dXtMGF.js +6 -0
  1324. vibe_surf/backend/frontend/assets/rotate-cw-D9QBD3w1.js +6 -0
  1325. vibe_surf/backend/frontend/assets/rotate-cw-square-BTb_LCYt.js +6 -0
  1326. vibe_surf/backend/frontend/assets/route-BY8OMdE6.js +6 -0
  1327. vibe_surf/backend/frontend/assets/route-off-DBPZSjij.js +6 -0
  1328. vibe_surf/backend/frontend/assets/router-Cj5pK344.js +6 -0
  1329. vibe_surf/backend/frontend/assets/rows-2-DQikFZXW.js +6 -0
  1330. vibe_surf/backend/frontend/assets/rows-3-CgpwLjBs.js +6 -0
  1331. vibe_surf/backend/frontend/assets/rows-4-DHLpJgeW.js +6 -0
  1332. vibe_surf/backend/frontend/assets/rss-B2J7l-Sb.js +6 -0
  1333. vibe_surf/backend/frontend/assets/ruler-D-fe4o6e.js +6 -0
  1334. vibe_surf/backend/frontend/assets/ruler-dimension-line-COrwkuXi.js +6 -0
  1335. vibe_surf/backend/frontend/assets/russian-ruble-Bk9zdT2J.js +6 -0
  1336. vibe_surf/backend/frontend/assets/sailboat-DMPxVbdm.js +6 -0
  1337. vibe_surf/backend/frontend/assets/salad-D20azVGZ.js +6 -0
  1338. vibe_surf/backend/frontend/assets/sandwich-Z_d-MQ5t.js +6 -0
  1339. vibe_surf/backend/frontend/assets/satellite-7zgZRaOF.js +6 -0
  1340. vibe_surf/backend/frontend/assets/satellite-dish-Cy6FmD_T.js +6 -0
  1341. vibe_surf/backend/frontend/assets/saudi-riyal-C9ZvxnL2.js +6 -0
  1342. vibe_surf/backend/frontend/assets/save-LkAkHS7W.js +6 -0
  1343. vibe_surf/backend/frontend/assets/save-all-D_-zYl71.js +6 -0
  1344. vibe_surf/backend/frontend/assets/save-off-B0KWQYIj.js +6 -0
  1345. vibe_surf/backend/frontend/assets/scale-3d-FnesJ3yp.js +6 -0
  1346. vibe_surf/backend/frontend/assets/scale-CfDNIDpX.js +6 -0
  1347. vibe_surf/backend/frontend/assets/scaling-D7_wGXPp.js +6 -0
  1348. vibe_surf/backend/frontend/assets/scan-CXtftKWt.js +6 -0
  1349. vibe_surf/backend/frontend/assets/scan-barcode-DMzKInA0.js +6 -0
  1350. vibe_surf/backend/frontend/assets/scan-eye-BNOyXXj8.js +6 -0
  1351. vibe_surf/backend/frontend/assets/scan-face-wv0t4zeq.js +6 -0
  1352. vibe_surf/backend/frontend/assets/scan-heart-BeBWR3xV.js +6 -0
  1353. vibe_surf/backend/frontend/assets/scan-line-CvQpOukb.js +6 -0
  1354. vibe_surf/backend/frontend/assets/scan-qr-code-BQ-Oqt9e.js +6 -0
  1355. vibe_surf/backend/frontend/assets/scan-search-DeDxyjP7.js +6 -0
  1356. vibe_surf/backend/frontend/assets/scan-text-Du5B26Lp.js +6 -0
  1357. vibe_surf/backend/frontend/assets/school-XPbcFxvs.js +6 -0
  1358. vibe_surf/backend/frontend/assets/scissors-C82MxyXF.js +6 -0
  1359. vibe_surf/backend/frontend/assets/scissors-line-dashed-BiIj8ZEF.js +6 -0
  1360. vibe_surf/backend/frontend/assets/screen-share-4rpy_bSP.js +6 -0
  1361. vibe_surf/backend/frontend/assets/screen-share-off-DisAsCVo.js +6 -0
  1362. vibe_surf/backend/frontend/assets/scroll-D3FgdMu9.js +6 -0
  1363. vibe_surf/backend/frontend/assets/scroll-text-BolUgv8k.js +6 -0
  1364. vibe_surf/backend/frontend/assets/search-check-BqDsbYzT.js +6 -0
  1365. vibe_surf/backend/frontend/assets/search-code-BAngOAWT.js +6 -0
  1366. vibe_surf/backend/frontend/assets/search-slash-DGpGjVDh.js +6 -0
  1367. vibe_surf/backend/frontend/assets/search-x-hbEhC-Ks.js +6 -0
  1368. vibe_surf/backend/frontend/assets/section-CZdebDRa.js +6 -0
  1369. vibe_surf/backend/frontend/assets/send-BY6RRvoS.js +6 -0
  1370. vibe_surf/backend/frontend/assets/send-horizontal-ByJf1GwO.js +6 -0
  1371. vibe_surf/backend/frontend/assets/send-to-back-CqeJ0x7-.js +6 -0
  1372. vibe_surf/backend/frontend/assets/separator-horizontal-CyHVE869.js +6 -0
  1373. vibe_surf/backend/frontend/assets/separator-vertical-CHEXvAuG.js +6 -0
  1374. vibe_surf/backend/frontend/assets/server-DPj6-qpq.js +6 -0
  1375. vibe_surf/backend/frontend/assets/server-cog-Dc-mlMR8.js +6 -0
  1376. vibe_surf/backend/frontend/assets/server-crash-CXsISMNW.js +6 -0
  1377. vibe_surf/backend/frontend/assets/server-off-Y_lfL7-w.js +6 -0
  1378. vibe_surf/backend/frontend/assets/settings-2-DZ9wvd5i.js +6 -0
  1379. vibe_surf/backend/frontend/assets/settings-DO_W46zj.js +6 -0
  1380. vibe_surf/backend/frontend/assets/shapes-CIsUods8.js +6 -0
  1381. vibe_surf/backend/frontend/assets/share-0y8A7A5E.js +6 -0
  1382. vibe_surf/backend/frontend/assets/share-2-TSy7pnEx.js +6 -0
  1383. vibe_surf/backend/frontend/assets/sheet-DagiH4ve.js +6 -0
  1384. vibe_surf/backend/frontend/assets/shell-4uq5QK2w.js +6 -0
  1385. vibe_surf/backend/frontend/assets/shield-DSmxKeAX.js +6 -0
  1386. vibe_surf/backend/frontend/assets/shield-alert-2BHG6ofb.js +6 -0
  1387. vibe_surf/backend/frontend/assets/shield-ban-BcQOFFCO.js +6 -0
  1388. vibe_surf/backend/frontend/assets/shield-check-IssT1y70.js +6 -0
  1389. vibe_surf/backend/frontend/assets/shield-ellipsis-B_k2GJZe.js +6 -0
  1390. vibe_surf/backend/frontend/assets/shield-half-Ce9mZY66.js +6 -0
  1391. vibe_surf/backend/frontend/assets/shield-minus-Cm9SRYz3.js +6 -0
  1392. vibe_surf/backend/frontend/assets/shield-off-Di-Txcsi.js +6 -0
  1393. vibe_surf/backend/frontend/assets/shield-plus-Cbd8tnos.js +6 -0
  1394. vibe_surf/backend/frontend/assets/shield-question-5hf3zAb8.js +6 -0
  1395. vibe_surf/backend/frontend/assets/shield-user-D2XuthCx.js +6 -0
  1396. vibe_surf/backend/frontend/assets/shield-x-BTJiGLGc.js +6 -0
  1397. vibe_surf/backend/frontend/assets/ship-DkhgC4pB.js +6 -0
  1398. vibe_surf/backend/frontend/assets/ship-wheel-C-7_Y35l.js +6 -0
  1399. vibe_surf/backend/frontend/assets/shirt-vuhl9SGI.js +6 -0
  1400. vibe_surf/backend/frontend/assets/shopping-bag-DvQ2pPfQ.js +6 -0
  1401. vibe_surf/backend/frontend/assets/shopping-basket-D9s56Xw7.js +6 -0
  1402. vibe_surf/backend/frontend/assets/shopping-cart-ZmbJuTVy.js +6 -0
  1403. vibe_surf/backend/frontend/assets/shovel-L2fbM_rD.js +6 -0
  1404. vibe_surf/backend/frontend/assets/shower-head-DE9aHmtW.js +6 -0
  1405. vibe_surf/backend/frontend/assets/shredder-DadDP-UJ.js +6 -0
  1406. vibe_surf/backend/frontend/assets/shrimp-DycqoQZ3.js +6 -0
  1407. vibe_surf/backend/frontend/assets/shrink-B8aylxOx.js +6 -0
  1408. vibe_surf/backend/frontend/assets/shrub-DF1hbXW3.js +6 -0
  1409. vibe_surf/backend/frontend/assets/shuffle-BuIBx3Jr.js +6 -0
  1410. vibe_surf/backend/frontend/assets/sigma-Do2EOGrK.js +6 -0
  1411. vibe_surf/backend/frontend/assets/signal-D4HUxctG.js +6 -0
  1412. vibe_surf/backend/frontend/assets/signal-high-D4XjnPRT.js +6 -0
  1413. vibe_surf/backend/frontend/assets/signal-low-CbpCiGEn.js +6 -0
  1414. vibe_surf/backend/frontend/assets/signal-medium-DenP3lw7.js +6 -0
  1415. vibe_surf/backend/frontend/assets/signal-zero-CHgcs844.js +6 -0
  1416. vibe_surf/backend/frontend/assets/signature-DK8I0wlU.js +6 -0
  1417. vibe_surf/backend/frontend/assets/signpost-1ES-i9fp.js +6 -0
  1418. vibe_surf/backend/frontend/assets/signpost-big-BSozSaes.js +6 -0
  1419. vibe_surf/backend/frontend/assets/siren-wlABVP_H.js +6 -0
  1420. vibe_surf/backend/frontend/assets/skip-back-Bu_s_NAd.js +6 -0
  1421. vibe_surf/backend/frontend/assets/skip-forward-B_5w_2GT.js +6 -0
  1422. vibe_surf/backend/frontend/assets/skull-BEu1YCxD.js +6 -0
  1423. vibe_surf/backend/frontend/assets/slack-D9649ln8.js +6 -0
  1424. vibe_surf/backend/frontend/assets/slash-DojcavQ9.js +6 -0
  1425. vibe_surf/backend/frontend/assets/slice-CRmKxhnX.js +6 -0
  1426. vibe_surf/backend/frontend/assets/sliders-horizontal-B5g_t8uv.js +6 -0
  1427. vibe_surf/backend/frontend/assets/sliders-vertical-CLBL1buf.js +6 -0
  1428. vibe_surf/backend/frontend/assets/smartphone-D-ep_7qQ.js +6 -0
  1429. vibe_surf/backend/frontend/assets/smartphone-charging-CRPRIfJL.js +6 -0
  1430. vibe_surf/backend/frontend/assets/smartphone-nfc-CmXWPjB7.js +6 -0
  1431. vibe_surf/backend/frontend/assets/smile-C8NQBJ3w.js +6 -0
  1432. vibe_surf/backend/frontend/assets/smile-plus-BXiCkryt.js +6 -0
  1433. vibe_surf/backend/frontend/assets/snail-C4InLnJK.js +6 -0
  1434. vibe_surf/backend/frontend/assets/snowflake-CkOWmqpH.js +6 -0
  1435. vibe_surf/backend/frontend/assets/sofa-C5SFUETc.js +6 -0
  1436. vibe_surf/backend/frontend/assets/soup-BPK9i9Mq.js +6 -0
  1437. vibe_surf/backend/frontend/assets/space-B_AibqtW.js +6 -0
  1438. vibe_surf/backend/frontend/assets/spade-DOYQwKmE.js +6 -0
  1439. vibe_surf/backend/frontend/assets/sparkle-Bgy0TYRq.js +6 -0
  1440. vibe_surf/backend/frontend/assets/sparkles-COXnCZbi.js +6 -0
  1441. vibe_surf/backend/frontend/assets/speaker-CaUol58E.js +6 -0
  1442. vibe_surf/backend/frontend/assets/speech-SU2fqOX1.js +6 -0
  1443. vibe_surf/backend/frontend/assets/spell-check-2-C0X3GG0W.js +6 -0
  1444. vibe_surf/backend/frontend/assets/spell-check-BwnI8rNb.js +6 -0
  1445. vibe_surf/backend/frontend/assets/spline-ByNmiFVd.js +6 -0
  1446. vibe_surf/backend/frontend/assets/spline-pointer-B6jrA3VA.js +6 -0
  1447. vibe_surf/backend/frontend/assets/split-uo1Igb0N.js +6 -0
  1448. vibe_surf/backend/frontend/assets/spray-can-D37CFDNB.js +6 -0
  1449. vibe_surf/backend/frontend/assets/sprout-B25Lx6nK.js +6 -0
  1450. vibe_surf/backend/frontend/assets/square-KfK1ngG3.js +6 -0
  1451. vibe_surf/backend/frontend/assets/square-activity-BGQluYc5.js +6 -0
  1452. vibe_surf/backend/frontend/assets/square-arrow-down-CqlT37VO.js +6 -0
  1453. vibe_surf/backend/frontend/assets/square-arrow-down-left-CR2Go22d.js +6 -0
  1454. vibe_surf/backend/frontend/assets/square-arrow-down-right-rGAHLIaS.js +6 -0
  1455. vibe_surf/backend/frontend/assets/square-arrow-left-CvWu8_9d.js +6 -0
  1456. vibe_surf/backend/frontend/assets/square-arrow-out-down-left-K0v7hlb0.js +6 -0
  1457. vibe_surf/backend/frontend/assets/square-arrow-out-down-right-f74Yq8Hb.js +6 -0
  1458. vibe_surf/backend/frontend/assets/square-arrow-out-up-left-CdBSNScA.js +6 -0
  1459. vibe_surf/backend/frontend/assets/square-arrow-out-up-right-8PNP-37C.js +6 -0
  1460. vibe_surf/backend/frontend/assets/square-arrow-right-DZ3-0COG.js +6 -0
  1461. vibe_surf/backend/frontend/assets/square-arrow-up-CefwAldY.js +6 -0
  1462. vibe_surf/backend/frontend/assets/square-arrow-up-left-Dt6pY6y2.js +6 -0
  1463. vibe_surf/backend/frontend/assets/square-arrow-up-right-C-bPYXZE.js +6 -0
  1464. vibe_surf/backend/frontend/assets/square-asterisk-BIEu0Wq-.js +6 -0
  1465. vibe_surf/backend/frontend/assets/square-bottom-dashed-scissors-DFln2i7A.js +6 -0
  1466. vibe_surf/backend/frontend/assets/square-chart-gantt-VCoGr7j5.js +6 -0
  1467. vibe_surf/backend/frontend/assets/square-check-big-DdTm65g2.js +6 -0
  1468. vibe_surf/backend/frontend/assets/square-check-tJdFPLB4.js +6 -0
  1469. vibe_surf/backend/frontend/assets/square-chevron-down-DV0aFQxC.js +6 -0
  1470. vibe_surf/backend/frontend/assets/square-chevron-left-CdGd5MQB.js +6 -0
  1471. vibe_surf/backend/frontend/assets/square-chevron-right-D_aqBwe_.js +6 -0
  1472. vibe_surf/backend/frontend/assets/square-chevron-up-DBzeLhdp.js +6 -0
  1473. vibe_surf/backend/frontend/assets/square-code-DtSsDKtH.js +6 -0
  1474. vibe_surf/backend/frontend/assets/square-dashed-DSG0Ash0.js +6 -0
  1475. vibe_surf/backend/frontend/assets/square-dashed-bottom-BrkR2d57.js +6 -0
  1476. vibe_surf/backend/frontend/assets/square-dashed-bottom-code-CMTH1TbL.js +6 -0
  1477. vibe_surf/backend/frontend/assets/square-dashed-kanban-961FMGlN.js +6 -0
  1478. vibe_surf/backend/frontend/assets/square-dashed-mouse-pointer-BWcK5KqH.js +6 -0
  1479. vibe_surf/backend/frontend/assets/square-divide-B8EfzsLW.js +6 -0
  1480. vibe_surf/backend/frontend/assets/square-dot-CFXkGNxl.js +6 -0
  1481. vibe_surf/backend/frontend/assets/square-equal-DNzUS5Xu.js +6 -0
  1482. vibe_surf/backend/frontend/assets/square-function-mVVWlGqH.js +6 -0
  1483. vibe_surf/backend/frontend/assets/square-kanban-gbxgvYAs.js +6 -0
  1484. vibe_surf/backend/frontend/assets/square-library-LB-mLfoV.js +6 -0
  1485. vibe_surf/backend/frontend/assets/square-m-DR4vWmvF.js +6 -0
  1486. vibe_surf/backend/frontend/assets/square-menu-wrD_3b1X.js +6 -0
  1487. vibe_surf/backend/frontend/assets/square-minus-C8LvWB0i.js +6 -0
  1488. vibe_surf/backend/frontend/assets/square-mouse-pointer-BWIOG0ej.js +6 -0
  1489. vibe_surf/backend/frontend/assets/square-parking-Cwf1smWS.js +6 -0
  1490. vibe_surf/backend/frontend/assets/square-parking-off-B7fLGIII.js +6 -0
  1491. vibe_surf/backend/frontend/assets/square-pen-D-KRx-pf.js +6 -0
  1492. vibe_surf/backend/frontend/assets/square-percent-DEPHZN1U.js +6 -0
  1493. vibe_surf/backend/frontend/assets/square-pi-D3ZoGA8y.js +6 -0
  1494. vibe_surf/backend/frontend/assets/square-pilcrow-CU7h7mYC.js +6 -0
  1495. vibe_surf/backend/frontend/assets/square-play-BJID6hok.js +6 -0
  1496. vibe_surf/backend/frontend/assets/square-plus-B_MofyMZ.js +6 -0
  1497. vibe_surf/backend/frontend/assets/square-power-CnNfm3SK.js +6 -0
  1498. vibe_surf/backend/frontend/assets/square-radical-Bb91fkyO.js +6 -0
  1499. vibe_surf/backend/frontend/assets/square-round-corner-DSNwBkrZ.js +6 -0
  1500. vibe_surf/backend/frontend/assets/square-scissors-Q-Hew_gd.js +6 -0
  1501. vibe_surf/backend/frontend/assets/square-sigma-Dvqecf-2.js +6 -0
  1502. vibe_surf/backend/frontend/assets/square-slash-TFALqbOX.js +6 -0
  1503. vibe_surf/backend/frontend/assets/square-split-horizontal-CbPy5mPi.js +6 -0
  1504. vibe_surf/backend/frontend/assets/square-split-vertical-CwEHVK6t.js +6 -0
  1505. vibe_surf/backend/frontend/assets/square-square-BgBRe8Sy.js +6 -0
  1506. vibe_surf/backend/frontend/assets/square-stack-CQOObCB-.js +6 -0
  1507. vibe_surf/backend/frontend/assets/square-terminal-DTCYsALs.js +6 -0
  1508. vibe_surf/backend/frontend/assets/square-user-BtoHpGAf.js +6 -0
  1509. vibe_surf/backend/frontend/assets/square-user-round-DYhk3lBR.js +6 -0
  1510. vibe_surf/backend/frontend/assets/square-x-BxVfvmxy.js +6 -0
  1511. vibe_surf/backend/frontend/assets/squares-exclude-xFnGRjrW.js +6 -0
  1512. vibe_surf/backend/frontend/assets/squares-intersect-CJ3onkar.js +6 -0
  1513. vibe_surf/backend/frontend/assets/squares-subtract-DHkmEhbq.js +6 -0
  1514. vibe_surf/backend/frontend/assets/squares-unite-VTPchsN_.js +6 -0
  1515. vibe_surf/backend/frontend/assets/squircle-BeRgB4CX.js +6 -0
  1516. vibe_surf/backend/frontend/assets/squirrel-CXpCofHU.js +6 -0
  1517. vibe_surf/backend/frontend/assets/stamp-CBKYJLk-.js +6 -0
  1518. vibe_surf/backend/frontend/assets/star-g394tQMa.js +6 -0
  1519. vibe_surf/backend/frontend/assets/star-half-DMNuOefd.js +6 -0
  1520. vibe_surf/backend/frontend/assets/star-off-D_I13W97.js +6 -0
  1521. vibe_surf/backend/frontend/assets/step-back-Ba3vvS1b.js +6 -0
  1522. vibe_surf/backend/frontend/assets/step-forward-tf6_dmSk.js +6 -0
  1523. vibe_surf/backend/frontend/assets/stethoscope-kEGj4Hk2.js +6 -0
  1524. vibe_surf/backend/frontend/assets/sticker-BMrXBzQi.js +6 -0
  1525. vibe_surf/backend/frontend/assets/sticky-note-B6_-_Vk7.js +6 -0
  1526. vibe_surf/backend/frontend/assets/store-ClCC8VsS.js +6 -0
  1527. vibe_surf/backend/frontend/assets/stretch-horizontal-Dfdn4d_v.js +6 -0
  1528. vibe_surf/backend/frontend/assets/stretch-vertical-G91F9Wl8.js +6 -0
  1529. vibe_surf/backend/frontend/assets/strikethrough-DQ1eMtzE.js +6 -0
  1530. vibe_surf/backend/frontend/assets/subscript-B1v5cruw.js +6 -0
  1531. vibe_surf/backend/frontend/assets/sun-Drd6gJu4.js +6 -0
  1532. vibe_surf/backend/frontend/assets/sun-dim-CSbGIP11.js +6 -0
  1533. vibe_surf/backend/frontend/assets/sun-medium-Cownz0gJ.js +6 -0
  1534. vibe_surf/backend/frontend/assets/sun-moon-BgCDmhlw.js +6 -0
  1535. vibe_surf/backend/frontend/assets/sun-snow-B0xowfvd.js +6 -0
  1536. vibe_surf/backend/frontend/assets/sunrise-DkTO7zEY.js +6 -0
  1537. vibe_surf/backend/frontend/assets/sunset-DkKYK75e.js +6 -0
  1538. vibe_surf/backend/frontend/assets/superscript-CBfgJuGP.js +6 -0
  1539. vibe_surf/backend/frontend/assets/swatch-book-DrsAphD2.js +6 -0
  1540. vibe_surf/backend/frontend/assets/swiss-franc-DAYyAzPc.js +6 -0
  1541. vibe_surf/backend/frontend/assets/switch-camera-C7hTq-mz.js +6 -0
  1542. vibe_surf/backend/frontend/assets/sword-BDecpboX.js +6 -0
  1543. vibe_surf/backend/frontend/assets/swords-BjWa4kCQ.js +6 -0
  1544. vibe_surf/backend/frontend/assets/syringe-ClPPE8yd.js +6 -0
  1545. vibe_surf/backend/frontend/assets/table-2-DIGnaXY7.js +6 -0
  1546. vibe_surf/backend/frontend/assets/table-CHxmnA-B.js +6 -0
  1547. vibe_surf/backend/frontend/assets/table-cells-merge-D1zNRVrG.js +6 -0
  1548. vibe_surf/backend/frontend/assets/table-cells-split-CdEYW1Su.js +6 -0
  1549. vibe_surf/backend/frontend/assets/table-columns-split-JoiaUKz3.js +6 -0
  1550. vibe_surf/backend/frontend/assets/table-of-contents-BSpkdcFt.js +6 -0
  1551. vibe_surf/backend/frontend/assets/table-properties-CmoYqW5E.js +6 -0
  1552. vibe_surf/backend/frontend/assets/table-rows-split-B-06ZKqE.js +6 -0
  1553. vibe_surf/backend/frontend/assets/tablet-YvP4PBQR.js +6 -0
  1554. vibe_surf/backend/frontend/assets/tablet-smartphone-BG7aS4OL.js +6 -0
  1555. vibe_surf/backend/frontend/assets/tablets-BVvSHnaS.js +6 -0
  1556. vibe_surf/backend/frontend/assets/tag-Bs9C2NWs.js +6 -0
  1557. vibe_surf/backend/frontend/assets/tags-DEvGZIIh.js +6 -0
  1558. vibe_surf/backend/frontend/assets/tally-1-BjNjbWUj.js +6 -0
  1559. vibe_surf/backend/frontend/assets/tally-2-Bd0nQcFC.js +6 -0
  1560. vibe_surf/backend/frontend/assets/tally-3-DHrPKvJg.js +6 -0
  1561. vibe_surf/backend/frontend/assets/tally-4-DAUwA2aR.js +6 -0
  1562. vibe_surf/backend/frontend/assets/tally-5-CgAN8Y91.js +6 -0
  1563. vibe_surf/backend/frontend/assets/tangent-CRznV78Q.js +6 -0
  1564. vibe_surf/backend/frontend/assets/target-Bj2MJlO6.js +6 -0
  1565. vibe_surf/backend/frontend/assets/telescope-CyRzgTg4.js +6 -0
  1566. vibe_surf/backend/frontend/assets/temp-pat-1-BDqu2wpz.png +0 -0
  1567. vibe_surf/backend/frontend/assets/temp-pat-2-C_RVvOE_.png +0 -0
  1568. vibe_surf/backend/frontend/assets/temp-pat-3-Ci-rp5-q.png +0 -0
  1569. vibe_surf/backend/frontend/assets/temp-pat-m-1-D-qJT-j4.png +0 -0
  1570. vibe_surf/backend/frontend/assets/temp-pat-m-2-BFhrICvh.png +0 -0
  1571. vibe_surf/backend/frontend/assets/temp-pat-m-3-BJIIbDxb.png +0 -0
  1572. vibe_surf/backend/frontend/assets/tent-D1boPMJ_.js +6 -0
  1573. vibe_surf/backend/frontend/assets/tent-tree-DlMlV5UT.js +6 -0
  1574. vibe_surf/backend/frontend/assets/terminal-ByKLrVXr.js +6 -0
  1575. vibe_surf/backend/frontend/assets/test-tube-DjNpqEvy.js +6 -0
  1576. vibe_surf/backend/frontend/assets/test-tube-diagonal-kvKWvVpD.js +6 -0
  1577. vibe_surf/backend/frontend/assets/test-tubes-BUVuvPYq.js +6 -0
  1578. vibe_surf/backend/frontend/assets/text-BaPUPrRB.js +6 -0
  1579. vibe_surf/backend/frontend/assets/text-cursor-DjiJAhIO.js +6 -0
  1580. vibe_surf/backend/frontend/assets/text-cursor-input-DmFbkVcG.js +6 -0
  1581. vibe_surf/backend/frontend/assets/text-quote-DbZhBhba.js +6 -0
  1582. vibe_surf/backend/frontend/assets/text-search-D81mgubi.js +6 -0
  1583. vibe_surf/backend/frontend/assets/text-select-BCYAwryE.js +6 -0
  1584. vibe_surf/backend/frontend/assets/theater-BF8yCQZ3.js +6 -0
  1585. vibe_surf/backend/frontend/assets/thermometer-Dz0qc69z.js +6 -0
  1586. vibe_surf/backend/frontend/assets/thermometer-snowflake-BZ8Fol5x.js +6 -0
  1587. vibe_surf/backend/frontend/assets/thermometer-sun-DgmdNSSx.js +6 -0
  1588. vibe_surf/backend/frontend/assets/thumbs-down-6gCm1bFP.js +6 -0
  1589. vibe_surf/backend/frontend/assets/thumbs-up-BpkAnOkj.js +6 -0
  1590. vibe_surf/backend/frontend/assets/ticket-CZ6VZCic.js +6 -0
  1591. vibe_surf/backend/frontend/assets/ticket-check-CwERJSTS.js +6 -0
  1592. vibe_surf/backend/frontend/assets/ticket-minus-CJ8o42r1.js +6 -0
  1593. vibe_surf/backend/frontend/assets/ticket-percent-D9mgrzai.js +6 -0
  1594. vibe_surf/backend/frontend/assets/ticket-plus-Bf_MplVa.js +6 -0
  1595. vibe_surf/backend/frontend/assets/ticket-slash-CNukz3dP.js +6 -0
  1596. vibe_surf/backend/frontend/assets/ticket-x-DAGtm4Nf.js +6 -0
  1597. vibe_surf/backend/frontend/assets/tickets-Dlm-Pd3N.js +6 -0
  1598. vibe_surf/backend/frontend/assets/tickets-plane-C4lmqLQq.js +6 -0
  1599. vibe_surf/backend/frontend/assets/timer-0lTpmgXp.js +6 -0
  1600. vibe_surf/backend/frontend/assets/timer-off-BGqRyv1S.js +6 -0
  1601. vibe_surf/backend/frontend/assets/timer-reset-DdhKPXcy.js +6 -0
  1602. vibe_surf/backend/frontend/assets/toggle-left-De2ASTKW.js +6 -0
  1603. vibe_surf/backend/frontend/assets/toggle-right-NfpJqTaq.js +6 -0
  1604. vibe_surf/backend/frontend/assets/toilet-DcJuMKzv.js +6 -0
  1605. vibe_surf/backend/frontend/assets/tornado-BannseS-.js +6 -0
  1606. vibe_surf/backend/frontend/assets/torus-CxsKBH8D.js +6 -0
  1607. vibe_surf/backend/frontend/assets/touchpad-ENZl5mwQ.js +6 -0
  1608. vibe_surf/backend/frontend/assets/touchpad-off-Bs9XazIZ.js +6 -0
  1609. vibe_surf/backend/frontend/assets/tower-control-DOH63Gyd.js +6 -0
  1610. vibe_surf/backend/frontend/assets/toy-brick-CK9szegV.js +6 -0
  1611. vibe_surf/backend/frontend/assets/tractor-C4edkneR.js +6 -0
  1612. vibe_surf/backend/frontend/assets/traffic-cone-B7xJNOdC.js +6 -0
  1613. vibe_surf/backend/frontend/assets/train-front-DPkfW4fH.js +6 -0
  1614. vibe_surf/backend/frontend/assets/train-front-tunnel-Dc6i8ZmW.js +6 -0
  1615. vibe_surf/backend/frontend/assets/train-track-DFRUcPF4.js +6 -0
  1616. vibe_surf/backend/frontend/assets/tram-front-DnSEWr26.js +6 -0
  1617. vibe_surf/backend/frontend/assets/transgender-CwbUC-T0.js +6 -0
  1618. vibe_surf/backend/frontend/assets/trash-DSMPsj08.js +6 -0
  1619. vibe_surf/backend/frontend/assets/tree-deciduous-CMyD2rgs.js +6 -0
  1620. vibe_surf/backend/frontend/assets/tree-palm-ClbWCueR.js +6 -0
  1621. vibe_surf/backend/frontend/assets/tree-pine-CxCMH7RZ.js +6 -0
  1622. vibe_surf/backend/frontend/assets/trees-DeERVvec.js +6 -0
  1623. vibe_surf/backend/frontend/assets/trello-DwQeyG2C.js +6 -0
  1624. vibe_surf/backend/frontend/assets/trending-down-CuQxq0A3.js +6 -0
  1625. vibe_surf/backend/frontend/assets/trending-up-BDSGIJWY.js +6 -0
  1626. vibe_surf/backend/frontend/assets/trending-up-down-CSb_7X-_.js +6 -0
  1627. vibe_surf/backend/frontend/assets/triangle-Cc8gzj2X.js +6 -0
  1628. vibe_surf/backend/frontend/assets/triangle-alert-CzfSlrIp.js +6 -0
  1629. vibe_surf/backend/frontend/assets/triangle-dashed-CSlIdQSl.js +6 -0
  1630. vibe_surf/backend/frontend/assets/triangle-right-BIlbKFDC.js +6 -0
  1631. vibe_surf/backend/frontend/assets/trophy-CIFZUGnX.js +6 -0
  1632. vibe_surf/backend/frontend/assets/truck-Id_mHUOq.js +6 -0
  1633. vibe_surf/backend/frontend/assets/truck-electric-WgMKZnOH.js +6 -0
  1634. vibe_surf/backend/frontend/assets/turtle-0ek05Orw.js +6 -0
  1635. vibe_surf/backend/frontend/assets/tv-DLVWDmzW.js +6 -0
  1636. vibe_surf/backend/frontend/assets/tv-minimal-E0w-pb-R.js +6 -0
  1637. vibe_surf/backend/frontend/assets/tv-minimal-play-C8eivgTI.js +6 -0
  1638. vibe_surf/backend/frontend/assets/twitch-D6updjnG.js +6 -0
  1639. vibe_surf/backend/frontend/assets/twitter-Der_Ih7y.js +6 -0
  1640. vibe_surf/backend/frontend/assets/type-BZeEwGKH.js +6 -0
  1641. vibe_surf/backend/frontend/assets/type-outline-WvuVShMD.js +6 -0
  1642. vibe_surf/backend/frontend/assets/umbrella-BFiE5bFk.js +6 -0
  1643. vibe_surf/backend/frontend/assets/umbrella-off-CQKtt_HS.js +6 -0
  1644. vibe_surf/backend/frontend/assets/underline-eH-gfEgl.js +6 -0
  1645. vibe_surf/backend/frontend/assets/undo-2-CGpVoxxS.js +6 -0
  1646. vibe_surf/backend/frontend/assets/undo-BAkkNYmN.js +6 -0
  1647. vibe_surf/backend/frontend/assets/undo-dot-fxz9ZoUf.js +6 -0
  1648. vibe_surf/backend/frontend/assets/unfold-horizontal-Bz6GASed.js +6 -0
  1649. vibe_surf/backend/frontend/assets/unfold-vertical-DVuawiHD.js +6 -0
  1650. vibe_surf/backend/frontend/assets/ungroup-DZlCBfu8.js +6 -0
  1651. vibe_surf/backend/frontend/assets/university-DQQJPlHM.js +6 -0
  1652. vibe_surf/backend/frontend/assets/unlink-2-Bbf62oJC.js +6 -0
  1653. vibe_surf/backend/frontend/assets/unlink-rRnEYNBH.js +6 -0
  1654. vibe_surf/backend/frontend/assets/unplug-BE6bAKlE.js +6 -0
  1655. vibe_surf/backend/frontend/assets/upload-DgbNBlk6.js +6 -0
  1656. vibe_surf/backend/frontend/assets/usb-BsbOhQkP.js +6 -0
  1657. vibe_surf/backend/frontend/assets/use-post-add-user-s3pEdarP.js +1 -0
  1658. vibe_surf/backend/frontend/assets/user-C7_N9vjw.js +6 -0
  1659. vibe_surf/backend/frontend/assets/user-check-D85AcwGt.js +6 -0
  1660. vibe_surf/backend/frontend/assets/user-cog-BUSZoKWO.js +6 -0
  1661. vibe_surf/backend/frontend/assets/user-lock-DrG5znDk.js +6 -0
  1662. vibe_surf/backend/frontend/assets/user-minus-CjVZSxhC.js +6 -0
  1663. vibe_surf/backend/frontend/assets/user-pen-BllWYNRg.js +6 -0
  1664. vibe_surf/backend/frontend/assets/user-plus-Ct840ALN.js +6 -0
  1665. vibe_surf/backend/frontend/assets/user-round-D6DnOG0E.js +6 -0
  1666. vibe_surf/backend/frontend/assets/user-round-check-Ci15Wbid.js +6 -0
  1667. vibe_surf/backend/frontend/assets/user-round-cog-SrRmnnrG.js +6 -0
  1668. vibe_surf/backend/frontend/assets/user-round-minus-CZKo0fkN.js +6 -0
  1669. vibe_surf/backend/frontend/assets/user-round-pen-DQ88K1gY.js +6 -0
  1670. vibe_surf/backend/frontend/assets/user-round-plus-BtBHwnQH.js +6 -0
  1671. vibe_surf/backend/frontend/assets/user-round-search-mZx8k3ks.js +6 -0
  1672. vibe_surf/backend/frontend/assets/user-round-x-4MvMTCpy.js +6 -0
  1673. vibe_surf/backend/frontend/assets/user-search-CkEhATdm.js +6 -0
  1674. vibe_surf/backend/frontend/assets/user-x-DufZCLiX.js +6 -0
  1675. vibe_surf/backend/frontend/assets/users-DgOAHdb7.js +6 -0
  1676. vibe_surf/backend/frontend/assets/users-round-Bj4Zqvjj.js +6 -0
  1677. vibe_surf/backend/frontend/assets/utensils-CcfYVeqi.js +6 -0
  1678. vibe_surf/backend/frontend/assets/utensils-crossed-Daq7-gMB.js +6 -0
  1679. vibe_surf/backend/frontend/assets/utility-pole-BRYxk_9o.js +6 -0
  1680. vibe_surf/backend/frontend/assets/vanilla-picker-B6E6ObS_.js +8 -0
  1681. vibe_surf/backend/frontend/assets/variable-CQb_DxMu.js +6 -0
  1682. vibe_surf/backend/frontend/assets/vault-D7etPPcB.js +6 -0
  1683. vibe_surf/backend/frontend/assets/vegan-DhjhKnZM.js +6 -0
  1684. vibe_surf/backend/frontend/assets/venetian-mask-DGDNvUAT.js +6 -0
  1685. vibe_surf/backend/frontend/assets/venus-and-mars-BEW94wvT.js +6 -0
  1686. vibe_surf/backend/frontend/assets/venus-u9B-gdcz.js +6 -0
  1687. vibe_surf/backend/frontend/assets/vibrate-off-GMm1P59r.js +6 -0
  1688. vibe_surf/backend/frontend/assets/vibrate-ztsKQUo9.js +6 -0
  1689. vibe_surf/backend/frontend/assets/video-BRU-KCdj.js +6 -0
  1690. vibe_surf/backend/frontend/assets/video-off-UBhDkXSa.js +6 -0
  1691. vibe_surf/backend/frontend/assets/videotape-BnpqC2PU.js +6 -0
  1692. vibe_surf/backend/frontend/assets/view-SPlXqa2E.js +6 -0
  1693. vibe_surf/backend/frontend/assets/voicemail-CslFUibB.js +6 -0
  1694. vibe_surf/backend/frontend/assets/volleyball-YmSfEYj0.js +6 -0
  1695. vibe_surf/backend/frontend/assets/volume-1-DzSvYJXy.js +6 -0
  1696. vibe_surf/backend/frontend/assets/volume-2-CKYHuo73.js +6 -0
  1697. vibe_surf/backend/frontend/assets/volume-D2WpTg4b.js +6 -0
  1698. vibe_surf/backend/frontend/assets/volume-off-CXmQvaUO.js +6 -0
  1699. vibe_surf/backend/frontend/assets/volume-x-Dl4xNI1D.js +6 -0
  1700. vibe_surf/backend/frontend/assets/vote-DVUnQCxF.js +6 -0
  1701. vibe_surf/backend/frontend/assets/wallet-D9F1dFbt.js +6 -0
  1702. vibe_surf/backend/frontend/assets/wallet-cards-DkIuM2Gu.js +6 -0
  1703. vibe_surf/backend/frontend/assets/wallet-minimal-CUUsXAfP.js +6 -0
  1704. vibe_surf/backend/frontend/assets/wallpaper-BHliG6AQ.js +6 -0
  1705. vibe_surf/backend/frontend/assets/wand-sparkles-BA8i-2_I.js +6 -0
  1706. vibe_surf/backend/frontend/assets/wand-u2EI2dL2.js +6 -0
  1707. vibe_surf/backend/frontend/assets/warehouse-CxDEgPyp.js +6 -0
  1708. vibe_surf/backend/frontend/assets/washing-machine-CYoqAbT7.js +6 -0
  1709. vibe_surf/backend/frontend/assets/watch-eNq5oUsh.js +6 -0
  1710. vibe_surf/backend/frontend/assets/waves-Bs6o5G71.js +6 -0
  1711. vibe_surf/backend/frontend/assets/waves-ladder-0t2iIHt8.js +6 -0
  1712. vibe_surf/backend/frontend/assets/waypoints-DyScJk3j.js +6 -0
  1713. vibe_surf/backend/frontend/assets/webcam-BFZUWYUw.js +6 -0
  1714. vibe_surf/backend/frontend/assets/webhook-CMDaI4yk.js +6 -0
  1715. vibe_surf/backend/frontend/assets/webhook-off-DQzE1oMX.js +6 -0
  1716. vibe_surf/backend/frontend/assets/weight-g0EeSmAx.js +6 -0
  1717. vibe_surf/backend/frontend/assets/wheat-hvVtAPlc.js +6 -0
  1718. vibe_surf/backend/frontend/assets/wheat-off-6d_oRYIW.js +6 -0
  1719. vibe_surf/backend/frontend/assets/whole-word-CMHbYgQ-.js +6 -0
  1720. vibe_surf/backend/frontend/assets/wifi-CRHAo2Lb.js +6 -0
  1721. vibe_surf/backend/frontend/assets/wifi-high-BTElqamm.js +6 -0
  1722. vibe_surf/backend/frontend/assets/wifi-low-BFBJvE2C.js +6 -0
  1723. vibe_surf/backend/frontend/assets/wifi-off-DL1S7f79.js +6 -0
  1724. vibe_surf/backend/frontend/assets/wifi-pen-FkLT18-y.js +6 -0
  1725. vibe_surf/backend/frontend/assets/wifi-zero-koQAfMYN.js +6 -0
  1726. vibe_surf/backend/frontend/assets/wind-CgQDM8yC.js +6 -0
  1727. vibe_surf/backend/frontend/assets/wind-arrow-down-ByQJVZNf.js +6 -0
  1728. vibe_surf/backend/frontend/assets/wine-kngKIYWK.js +6 -0
  1729. vibe_surf/backend/frontend/assets/wine-off-DaVVtkyG.js +6 -0
  1730. vibe_surf/backend/frontend/assets/workflow-BBHA5vqf.js +6 -0
  1731. vibe_surf/backend/frontend/assets/worm-D8rJAL-s.js +6 -0
  1732. vibe_surf/backend/frontend/assets/wrap-text-s4fkGxHY.js +6 -0
  1733. vibe_surf/backend/frontend/assets/wrench-CYzg6B-q.js +6 -0
  1734. vibe_surf/backend/frontend/assets/youtube-BIzMVpJA.js +6 -0
  1735. vibe_surf/backend/frontend/assets/zap-nyAdqt4o.js +6 -0
  1736. vibe_surf/backend/frontend/assets/zap-off-Aii1CEgj.js +6 -0
  1737. vibe_surf/backend/frontend/assets/zoom-in-BNWeSenu.js +6 -0
  1738. vibe_surf/backend/frontend/assets/zoom-out-Bd2vIq2c.js +6 -0
  1739. vibe_surf/backend/frontend/favicon.ico +0 -0
  1740. vibe_surf/backend/frontend/index.html +24 -0
  1741. vibe_surf/backend/frontend/manifest.json +31 -0
  1742. vibe_surf/backend/llm_config.py +43 -0
  1743. vibe_surf/backend/main.py +707 -130
  1744. vibe_surf/backend/shared_state.py +482 -26
  1745. vibe_surf/backend/utils/encryption.py +40 -4
  1746. vibe_surf/backend/utils/llm_factory.py +27 -2
  1747. vibe_surf/backend/utils/utils.py +42 -0
  1748. vibe_surf/browser/agen_browser_profile.py +5 -0
  1749. vibe_surf/browser/agent_browser_session.py +226 -119
  1750. vibe_surf/browser/browser_manager.py +5 -4
  1751. vibe_surf/browser/find_page_element.py +1100 -0
  1752. vibe_surf/browser/page_operations.py +222 -0
  1753. vibe_surf/browser/watchdogs/action_watchdog.py +1 -83
  1754. vibe_surf/browser/watchdogs/dom_watchdog.py +17 -5
  1755. vibe_surf/chrome_extension/background.js +96 -55
  1756. vibe_surf/chrome_extension/config.js +10 -1
  1757. vibe_surf/chrome_extension/manifest.json +15 -9
  1758. vibe_surf/chrome_extension/scripts/api-client.js +171 -11
  1759. vibe_surf/chrome_extension/scripts/file-manager.js +53 -12
  1760. vibe_surf/chrome_extension/scripts/main.js +46 -11
  1761. vibe_surf/chrome_extension/scripts/session-manager.js +30 -4
  1762. vibe_surf/chrome_extension/scripts/settings-general.js +513 -0
  1763. vibe_surf/chrome_extension/scripts/settings-integrations.js +998 -0
  1764. vibe_surf/chrome_extension/scripts/settings-manager.js +72 -1730
  1765. vibe_surf/chrome_extension/scripts/settings-profiles.js +1330 -0
  1766. vibe_surf/chrome_extension/scripts/settings-workflow.js +2911 -0
  1767. vibe_surf/chrome_extension/scripts/ui-manager.js +1354 -503
  1768. vibe_surf/chrome_extension/scripts/version.js +3 -0
  1769. vibe_surf/chrome_extension/sidepanel.html +711 -18
  1770. vibe_surf/chrome_extension/styles/components.css +146 -0
  1771. vibe_surf/chrome_extension/styles/input.css +115 -0
  1772. vibe_surf/chrome_extension/styles/layout.css +2 -0
  1773. vibe_surf/chrome_extension/styles/settings-integrations.css +945 -0
  1774. vibe_surf/chrome_extension/styles/settings-modal.css +7 -3
  1775. vibe_surf/chrome_extension/styles/settings-responsive.css +37 -5
  1776. vibe_surf/chrome_extension/styles/settings-workflow.css +2347 -0
  1777. vibe_surf/cli.py +154 -11
  1778. vibe_surf/langflow/__init__.py +0 -0
  1779. vibe_surf/langflow/__main__.py +954 -0
  1780. vibe_surf/langflow/alembic/README +1 -0
  1781. vibe_surf/langflow/alembic/env.py +124 -0
  1782. vibe_surf/langflow/alembic/script.py.mako +31 -0
  1783. vibe_surf/langflow/alembic/versions/006b3990db50_add_unique_constraints.py +66 -0
  1784. vibe_surf/langflow/alembic/versions/012fb73ac359_add_folder_table.py +82 -0
  1785. vibe_surf/langflow/alembic/versions/0882f9657f22_encrypt_existing_mcp_auth_settings_.py +122 -0
  1786. vibe_surf/langflow/alembic/versions/0ae3a2674f32_update_the_columns_that_need_to_change_.py +71 -0
  1787. vibe_surf/langflow/alembic/versions/0b8757876a7c_.py +32 -0
  1788. vibe_surf/langflow/alembic/versions/0d60fcbd4e8e_create_vertex_builds_table.py +51 -0
  1789. vibe_surf/langflow/alembic/versions/1a110b568907_replace_credential_table_with_variable.py +66 -0
  1790. vibe_surf/langflow/alembic/versions/1b8b740a6fa3_remove_fk_constraint_in_message_.py +337 -0
  1791. vibe_surf/langflow/alembic/versions/1c79524817ed_add_unique_constraints_per_user_in_.py +43 -0
  1792. vibe_surf/langflow/alembic/versions/1cb603706752_modify_uniqueness_constraint_on_file_.py +279 -0
  1793. vibe_surf/langflow/alembic/versions/1d90f8a0efe1_update_description_columns_type.py +71 -0
  1794. vibe_surf/langflow/alembic/versions/1eab2c3eb45e_event_error.py +53 -0
  1795. vibe_surf/langflow/alembic/versions/1ef9c4f3765d_.py +54 -0
  1796. vibe_surf/langflow/alembic/versions/1f4d6df60295_add_default_fields_column.py +43 -0
  1797. vibe_surf/langflow/alembic/versions/260dbcc8b680_adds_tables.py +151 -0
  1798. vibe_surf/langflow/alembic/versions/29fe8f1f806b_add_missing_index.py +44 -0
  1799. vibe_surf/langflow/alembic/versions/2ac71eb9c3ae_adds_credential_table.py +55 -0
  1800. vibe_surf/langflow/alembic/versions/3162e83e485f_add_auth_settings_to_folder_and_merge.py +58 -0
  1801. vibe_surf/langflow/alembic/versions/3bb0ddf32dfb_add_unique_constraints_per_user_in_flow_.py +55 -0
  1802. vibe_surf/langflow/alembic/versions/4e5980a44eaa_fix_date_times_again.py +124 -0
  1803. vibe_surf/langflow/alembic/versions/58b28437a398_modify_nullable.py +66 -0
  1804. vibe_surf/langflow/alembic/versions/5ace73a7f223_new_remove_table_upgrade_op.py +39 -0
  1805. vibe_surf/langflow/alembic/versions/631faacf5da2_add_webhook_columns.py +45 -0
  1806. vibe_surf/langflow/alembic/versions/63b9c451fd30_add_icon_and_icon_bg_color_to_flow.py +50 -0
  1807. vibe_surf/langflow/alembic/versions/66f72f04a1de_add_mcp_support_with_project_settings_.py +54 -0
  1808. vibe_surf/langflow/alembic/versions/67cc006d50bf_add_profile_image_column.py +57 -0
  1809. vibe_surf/langflow/alembic/versions/6e7b581b5648_fix_nullable.py +59 -0
  1810. vibe_surf/langflow/alembic/versions/7843803a87b5_store_updates.py +55 -0
  1811. vibe_surf/langflow/alembic/versions/79e675cb6752_change_datetime_type.py +124 -0
  1812. vibe_surf/langflow/alembic/versions/7d2162acc8b2_adds_updated_at_and_folder_cols.py +74 -0
  1813. vibe_surf/langflow/alembic/versions/90be8e2ed91e_create_transactions_table.py +51 -0
  1814. vibe_surf/langflow/alembic/versions/93e2705fa8d6_add_column_save_path_to_flow.py +43 -0
  1815. vibe_surf/langflow/alembic/versions/a72f5cf9c2f9_add_endpoint_name_col.py +52 -0
  1816. vibe_surf/langflow/alembic/versions/b2fa308044b5_add_unique_constraints.py +101 -0
  1817. vibe_surf/langflow/alembic/versions/bc2f01c40e4a_new_fixes.py +73 -0
  1818. vibe_surf/langflow/alembic/versions/c153816fd85f_set_name_and_value_to_not_nullable.py +52 -0
  1819. vibe_surf/langflow/alembic/versions/d066bfd22890_add_message_table.py +52 -0
  1820. vibe_surf/langflow/alembic/versions/d2d475a1f7c0_add_tags_column_to_flow.py +41 -0
  1821. vibe_surf/langflow/alembic/versions/d37bc4322900_drop_single_constraint_on_files_name_.py +169 -0
  1822. vibe_surf/langflow/alembic/versions/d3dbf656a499_add_gradient_column_in_flow.py +41 -0
  1823. vibe_surf/langflow/alembic/versions/d9a6ea21edcd_rename_default_folder.py +75 -0
  1824. vibe_surf/langflow/alembic/versions/dd9e0804ebd1_add_v2_file_table.py +49 -0
  1825. vibe_surf/langflow/alembic/versions/e3162c1804e6_add_persistent_locked_state.py +43 -0
  1826. vibe_surf/langflow/alembic/versions/e3bc869fa272_fix_nullable.py +68 -0
  1827. vibe_surf/langflow/alembic/versions/e56d87f8994a_add_optins_column_to_user.py +38 -0
  1828. vibe_surf/langflow/alembic/versions/e5a65ecff2cd_nullable_in_vertex_build.py +49 -0
  1829. vibe_surf/langflow/alembic/versions/eb5866d51fd2_change_columns_to_be_nullable.py +31 -0
  1830. vibe_surf/langflow/alembic/versions/eb5e72293a8e_add_error_and_edit_flags_to_message.py +49 -0
  1831. vibe_surf/langflow/alembic/versions/f3b2d1f1002d_add_column_access_type_to_flow.py +37 -0
  1832. vibe_surf/langflow/alembic/versions/f5ee9749d1a6_user_id_can_be_null_in_flow.py +42 -0
  1833. vibe_surf/langflow/alembic/versions/fd531f8868b1_fix_credential_table.py +60 -0
  1834. vibe_surf/langflow/alembic.ini +113 -0
  1835. vibe_surf/langflow/api/__init__.py +5 -0
  1836. vibe_surf/langflow/api/build.py +557 -0
  1837. vibe_surf/langflow/api/disconnect.py +31 -0
  1838. vibe_surf/langflow/api/health_check_router.py +65 -0
  1839. vibe_surf/langflow/api/limited_background_tasks.py +29 -0
  1840. vibe_surf/langflow/api/log_router.py +103 -0
  1841. vibe_surf/langflow/api/router.py +63 -0
  1842. vibe_surf/langflow/api/schemas.py +14 -0
  1843. vibe_surf/langflow/api/utils.py +381 -0
  1844. vibe_surf/langflow/api/v1/__init__.py +41 -0
  1845. vibe_surf/langflow/api/v1/api_key.py +88 -0
  1846. vibe_surf/langflow/api/v1/auth_helpers.py +75 -0
  1847. vibe_surf/langflow/api/v1/base.py +50 -0
  1848. vibe_surf/langflow/api/v1/callback.py +136 -0
  1849. vibe_surf/langflow/api/v1/chat.py +675 -0
  1850. vibe_surf/langflow/api/v1/endpoints.py +800 -0
  1851. vibe_surf/langflow/api/v1/files.py +193 -0
  1852. vibe_surf/langflow/api/v1/flows.py +579 -0
  1853. vibe_surf/langflow/api/v1/folders.py +95 -0
  1854. vibe_surf/langflow/api/v1/knowledge_bases.py +452 -0
  1855. vibe_surf/langflow/api/v1/login.py +166 -0
  1856. vibe_surf/langflow/api/v1/mcp.py +137 -0
  1857. vibe_surf/langflow/api/v1/mcp_projects.py +1230 -0
  1858. vibe_surf/langflow/api/v1/mcp_utils.py +348 -0
  1859. vibe_surf/langflow/api/v1/monitor.py +203 -0
  1860. vibe_surf/langflow/api/v1/openai_responses.py +561 -0
  1861. vibe_surf/langflow/api/v1/projects.py +447 -0
  1862. vibe_surf/langflow/api/v1/schemas.py +488 -0
  1863. vibe_surf/langflow/api/v1/starter_projects.py +17 -0
  1864. vibe_surf/langflow/api/v1/store.py +182 -0
  1865. vibe_surf/langflow/api/v1/users.py +146 -0
  1866. vibe_surf/langflow/api/v1/validate.py +48 -0
  1867. vibe_surf/langflow/api/v1/variable.py +106 -0
  1868. vibe_surf/langflow/api/v1/voice_mode.py +1375 -0
  1869. vibe_surf/langflow/api/v2/__init__.py +7 -0
  1870. vibe_surf/langflow/api/v2/files.py +532 -0
  1871. vibe_surf/langflow/api/v2/mcp.py +330 -0
  1872. vibe_surf/langflow/base/__init__.py +0 -0
  1873. vibe_surf/langflow/base/agents/__init__.py +0 -0
  1874. vibe_surf/langflow/base/agents/agent.py +267 -0
  1875. vibe_surf/langflow/base/agents/callback.py +130 -0
  1876. vibe_surf/langflow/base/agents/context.py +109 -0
  1877. vibe_surf/langflow/base/agents/crewai/__init__.py +0 -0
  1878. vibe_surf/langflow/base/agents/crewai/crew.py +231 -0
  1879. vibe_surf/langflow/base/agents/crewai/tasks.py +12 -0
  1880. vibe_surf/langflow/base/agents/default_prompts.py +23 -0
  1881. vibe_surf/langflow/base/agents/errors.py +15 -0
  1882. vibe_surf/langflow/base/agents/events.py +346 -0
  1883. vibe_surf/langflow/base/agents/utils.py +205 -0
  1884. vibe_surf/langflow/base/astra_assistants/__init__.py +0 -0
  1885. vibe_surf/langflow/base/astra_assistants/util.py +171 -0
  1886. vibe_surf/langflow/base/chains/__init__.py +0 -0
  1887. vibe_surf/langflow/base/chains/model.py +19 -0
  1888. vibe_surf/langflow/base/composio/__init__.py +0 -0
  1889. vibe_surf/langflow/base/composio/composio_base.py +1301 -0
  1890. vibe_surf/langflow/base/compressors/__init__.py +0 -0
  1891. vibe_surf/langflow/base/compressors/model.py +60 -0
  1892. vibe_surf/langflow/base/constants.py +46 -0
  1893. vibe_surf/langflow/base/curl/__init__.py +0 -0
  1894. vibe_surf/langflow/base/curl/parse.py +188 -0
  1895. vibe_surf/langflow/base/data/__init__.py +5 -0
  1896. vibe_surf/langflow/base/data/base_file.py +698 -0
  1897. vibe_surf/langflow/base/data/docling_utils.py +280 -0
  1898. vibe_surf/langflow/base/data/utils.py +198 -0
  1899. vibe_surf/langflow/base/document_transformers/__init__.py +0 -0
  1900. vibe_surf/langflow/base/document_transformers/model.py +43 -0
  1901. vibe_surf/langflow/base/embeddings/__init__.py +0 -0
  1902. vibe_surf/langflow/base/embeddings/aiml_embeddings.py +62 -0
  1903. vibe_surf/langflow/base/embeddings/model.py +26 -0
  1904. vibe_surf/langflow/base/flow_processing/__init__.py +0 -0
  1905. vibe_surf/langflow/base/flow_processing/utils.py +86 -0
  1906. vibe_surf/langflow/base/huggingface/__init__.py +0 -0
  1907. vibe_surf/langflow/base/huggingface/model_bridge.py +133 -0
  1908. vibe_surf/langflow/base/io/__init__.py +0 -0
  1909. vibe_surf/langflow/base/io/chat.py +20 -0
  1910. vibe_surf/langflow/base/io/text.py +22 -0
  1911. vibe_surf/langflow/base/knowledge_bases/__init__.py +0 -0
  1912. vibe_surf/langflow/base/knowledge_bases/knowledge_base_utils.py +137 -0
  1913. vibe_surf/langflow/base/langchain_utilities/__init__.py +0 -0
  1914. vibe_surf/langflow/base/langchain_utilities/model.py +35 -0
  1915. vibe_surf/langflow/base/langchain_utilities/spider_constants.py +1 -0
  1916. vibe_surf/langflow/base/langwatch/__init__.py +0 -0
  1917. vibe_surf/langflow/base/langwatch/utils.py +18 -0
  1918. vibe_surf/langflow/base/mcp/__init__.py +0 -0
  1919. vibe_surf/langflow/base/mcp/constants.py +2 -0
  1920. vibe_surf/langflow/base/mcp/util.py +1544 -0
  1921. vibe_surf/langflow/base/memory/__init__.py +0 -0
  1922. vibe_surf/langflow/base/memory/memory.py +49 -0
  1923. vibe_surf/langflow/base/memory/model.py +38 -0
  1924. vibe_surf/langflow/base/models/__init__.py +3 -0
  1925. vibe_surf/langflow/base/models/aiml_constants.py +51 -0
  1926. vibe_surf/langflow/base/models/anthropic_constants.py +49 -0
  1927. vibe_surf/langflow/base/models/aws_constants.py +151 -0
  1928. vibe_surf/langflow/base/models/chat_result.py +76 -0
  1929. vibe_surf/langflow/base/models/google_generative_ai_constants.py +70 -0
  1930. vibe_surf/langflow/base/models/groq_constants.py +134 -0
  1931. vibe_surf/langflow/base/models/model.py +375 -0
  1932. vibe_surf/langflow/base/models/model_input_constants.py +299 -0
  1933. vibe_surf/langflow/base/models/model_metadata.py +41 -0
  1934. vibe_surf/langflow/base/models/model_utils.py +8 -0
  1935. vibe_surf/langflow/base/models/novita_constants.py +35 -0
  1936. vibe_surf/langflow/base/models/ollama_constants.py +49 -0
  1937. vibe_surf/langflow/base/models/openai_constants.py +121 -0
  1938. vibe_surf/langflow/base/models/sambanova_constants.py +18 -0
  1939. vibe_surf/langflow/base/processing/__init__.py +0 -0
  1940. vibe_surf/langflow/base/prompts/__init__.py +0 -0
  1941. vibe_surf/langflow/base/prompts/api_utils.py +224 -0
  1942. vibe_surf/langflow/base/prompts/utils.py +61 -0
  1943. vibe_surf/langflow/base/textsplitters/__init__.py +0 -0
  1944. vibe_surf/langflow/base/textsplitters/model.py +28 -0
  1945. vibe_surf/langflow/base/tools/__init__.py +0 -0
  1946. vibe_surf/langflow/base/tools/base.py +26 -0
  1947. vibe_surf/langflow/base/tools/component_tool.py +324 -0
  1948. vibe_surf/langflow/base/tools/constants.py +49 -0
  1949. vibe_surf/langflow/base/tools/flow_tool.py +131 -0
  1950. vibe_surf/langflow/base/tools/run_flow.py +227 -0
  1951. vibe_surf/langflow/base/vectorstores/__init__.py +0 -0
  1952. vibe_surf/langflow/base/vectorstores/model.py +193 -0
  1953. vibe_surf/langflow/base/vectorstores/utils.py +22 -0
  1954. vibe_surf/langflow/base/vectorstores/vector_store_connection_decorator.py +52 -0
  1955. vibe_surf/langflow/cli/__init__.py +0 -0
  1956. vibe_surf/langflow/cli/progress.py +233 -0
  1957. vibe_surf/langflow/components/FAISS/__init__.py +34 -0
  1958. vibe_surf/langflow/components/FAISS/faiss.py +111 -0
  1959. vibe_surf/langflow/components/Notion/__init__.py +19 -0
  1960. vibe_surf/langflow/components/Notion/add_content_to_page.py +269 -0
  1961. vibe_surf/langflow/components/Notion/create_page.py +94 -0
  1962. vibe_surf/langflow/components/Notion/list_database_properties.py +68 -0
  1963. vibe_surf/langflow/components/Notion/list_pages.py +122 -0
  1964. vibe_surf/langflow/components/Notion/list_users.py +77 -0
  1965. vibe_surf/langflow/components/Notion/page_content_viewer.py +93 -0
  1966. vibe_surf/langflow/components/Notion/search.py +111 -0
  1967. vibe_surf/langflow/components/Notion/update_page_property.py +114 -0
  1968. vibe_surf/langflow/components/__init__.py +270 -0
  1969. vibe_surf/langflow/components/_importing.py +37 -0
  1970. vibe_surf/langflow/components/agentql/__init__.py +3 -0
  1971. vibe_surf/langflow/components/agentql/agentql_api.py +151 -0
  1972. vibe_surf/langflow/components/agents/__init__.py +4 -0
  1973. vibe_surf/langflow/components/agents/agent.py +608 -0
  1974. vibe_surf/langflow/components/agents/mcp_component.py +511 -0
  1975. vibe_surf/langflow/components/aiml/__init__.py +37 -0
  1976. vibe_surf/langflow/components/aiml/aiml.py +115 -0
  1977. vibe_surf/langflow/components/aiml/aiml_embeddings.py +37 -0
  1978. vibe_surf/langflow/components/amazon/__init__.py +36 -0
  1979. vibe_surf/langflow/components/amazon/amazon_bedrock_embedding.py +109 -0
  1980. vibe_surf/langflow/components/amazon/amazon_bedrock_model.py +124 -0
  1981. vibe_surf/langflow/components/amazon/s3_bucket_uploader.py +211 -0
  1982. vibe_surf/langflow/components/anthropic/__init__.py +34 -0
  1983. vibe_surf/langflow/components/anthropic/anthropic.py +187 -0
  1984. vibe_surf/langflow/components/apify/__init__.py +5 -0
  1985. vibe_surf/langflow/components/apify/apify_actor.py +325 -0
  1986. vibe_surf/langflow/components/arxiv/__init__.py +3 -0
  1987. vibe_surf/langflow/components/arxiv/arxiv.py +163 -0
  1988. vibe_surf/langflow/components/assemblyai/__init__.py +46 -0
  1989. vibe_surf/langflow/components/assemblyai/assemblyai_get_subtitles.py +83 -0
  1990. vibe_surf/langflow/components/assemblyai/assemblyai_lemur.py +183 -0
  1991. vibe_surf/langflow/components/assemblyai/assemblyai_list_transcripts.py +95 -0
  1992. vibe_surf/langflow/components/assemblyai/assemblyai_poll_transcript.py +72 -0
  1993. vibe_surf/langflow/components/assemblyai/assemblyai_start_transcript.py +188 -0
  1994. vibe_surf/langflow/components/azure/__init__.py +37 -0
  1995. vibe_surf/langflow/components/azure/azure_openai.py +95 -0
  1996. vibe_surf/langflow/components/azure/azure_openai_embeddings.py +83 -0
  1997. vibe_surf/langflow/components/baidu/__init__.py +32 -0
  1998. vibe_surf/langflow/components/baidu/baidu_qianfan_chat.py +113 -0
  1999. vibe_surf/langflow/components/bing/__init__.py +3 -0
  2000. vibe_surf/langflow/components/bing/bing_search_api.py +61 -0
  2001. vibe_surf/langflow/components/cassandra/__init__.py +40 -0
  2002. vibe_surf/langflow/components/cassandra/cassandra.py +264 -0
  2003. vibe_surf/langflow/components/cassandra/cassandra_chat.py +92 -0
  2004. vibe_surf/langflow/components/cassandra/cassandra_graph.py +238 -0
  2005. vibe_surf/langflow/components/chains/__init__.py +0 -0
  2006. vibe_surf/langflow/components/chroma/__init__.py +34 -0
  2007. vibe_surf/langflow/components/chroma/chroma.py +169 -0
  2008. vibe_surf/langflow/components/cleanlab/__init__.py +40 -0
  2009. vibe_surf/langflow/components/cleanlab/cleanlab_evaluator.py +157 -0
  2010. vibe_surf/langflow/components/cleanlab/cleanlab_rag_evaluator.py +254 -0
  2011. vibe_surf/langflow/components/cleanlab/cleanlab_remediator.py +131 -0
  2012. vibe_surf/langflow/components/clickhouse/__init__.py +34 -0
  2013. vibe_surf/langflow/components/clickhouse/clickhouse.py +135 -0
  2014. vibe_surf/langflow/components/cloudflare/__init__.py +32 -0
  2015. vibe_surf/langflow/components/cloudflare/cloudflare.py +81 -0
  2016. vibe_surf/langflow/components/cohere/__init__.py +40 -0
  2017. vibe_surf/langflow/components/cohere/cohere_embeddings.py +81 -0
  2018. vibe_surf/langflow/components/cohere/cohere_models.py +46 -0
  2019. vibe_surf/langflow/components/cohere/cohere_rerank.py +51 -0
  2020. vibe_surf/langflow/components/composio/__init__.py +73 -0
  2021. vibe_surf/langflow/components/composio/composio_api.py +279 -0
  2022. vibe_surf/langflow/components/composio/dropbox_compnent.py +11 -0
  2023. vibe_surf/langflow/components/composio/github_composio.py +11 -0
  2024. vibe_surf/langflow/components/composio/gmail_composio.py +38 -0
  2025. vibe_surf/langflow/components/composio/googlecalendar_composio.py +11 -0
  2026. vibe_surf/langflow/components/composio/googlemeet_composio.py +11 -0
  2027. vibe_surf/langflow/components/composio/googletasks_composio.py +8 -0
  2028. vibe_surf/langflow/components/composio/linear_composio.py +11 -0
  2029. vibe_surf/langflow/components/composio/outlook_composio.py +11 -0
  2030. vibe_surf/langflow/components/composio/reddit_composio.py +11 -0
  2031. vibe_surf/langflow/components/composio/slack_composio.py +11 -0
  2032. vibe_surf/langflow/components/composio/slackbot_composio.py +11 -0
  2033. vibe_surf/langflow/components/composio/supabase_composio.py +11 -0
  2034. vibe_surf/langflow/components/composio/todoist_composio.py +11 -0
  2035. vibe_surf/langflow/components/composio/youtube_composio.py +11 -0
  2036. vibe_surf/langflow/components/confluence/__init__.py +3 -0
  2037. vibe_surf/langflow/components/confluence/confluence.py +84 -0
  2038. vibe_surf/langflow/components/couchbase/__init__.py +34 -0
  2039. vibe_surf/langflow/components/couchbase/couchbase.py +102 -0
  2040. vibe_surf/langflow/components/crewai/__init__.py +49 -0
  2041. vibe_surf/langflow/components/crewai/crewai.py +108 -0
  2042. vibe_surf/langflow/components/crewai/hierarchical_crew.py +47 -0
  2043. vibe_surf/langflow/components/crewai/hierarchical_task.py +45 -0
  2044. vibe_surf/langflow/components/crewai/sequential_crew.py +53 -0
  2045. vibe_surf/langflow/components/crewai/sequential_task.py +74 -0
  2046. vibe_surf/langflow/components/crewai/sequential_task_agent.py +144 -0
  2047. vibe_surf/langflow/components/custom_component/__init__.py +34 -0
  2048. vibe_surf/langflow/components/custom_component/custom_component.py +31 -0
  2049. vibe_surf/langflow/components/data/__init__.py +25 -0
  2050. vibe_surf/langflow/components/data/api_request.py +555 -0
  2051. vibe_surf/langflow/components/data/csv_to_data.py +96 -0
  2052. vibe_surf/langflow/components/data/directory.py +113 -0
  2053. vibe_surf/langflow/components/data/file.py +632 -0
  2054. vibe_surf/langflow/components/data/json_to_data.py +99 -0
  2055. vibe_surf/langflow/components/data/news_search.py +164 -0
  2056. vibe_surf/langflow/components/data/rss.py +69 -0
  2057. vibe_surf/langflow/components/data/sql_executor.py +99 -0
  2058. vibe_surf/langflow/components/data/url.py +299 -0
  2059. vibe_surf/langflow/components/data/web_search.py +112 -0
  2060. vibe_surf/langflow/components/data/webhook.py +56 -0
  2061. vibe_surf/langflow/components/datastax/__init__.py +70 -0
  2062. vibe_surf/langflow/components/datastax/astra_assistant_manager.py +306 -0
  2063. vibe_surf/langflow/components/datastax/astra_db.py +68 -0
  2064. vibe_surf/langflow/components/datastax/astra_vectorize.py +122 -0
  2065. vibe_surf/langflow/components/datastax/astradb_cql.py +314 -0
  2066. vibe_surf/langflow/components/datastax/astradb_graph.py +326 -0
  2067. vibe_surf/langflow/components/datastax/astradb_tool.py +418 -0
  2068. vibe_surf/langflow/components/datastax/astradb_vectorstore.py +1292 -0
  2069. vibe_surf/langflow/components/datastax/create_assistant.py +58 -0
  2070. vibe_surf/langflow/components/datastax/create_thread.py +32 -0
  2071. vibe_surf/langflow/components/datastax/dotenv.py +35 -0
  2072. vibe_surf/langflow/components/datastax/get_assistant.py +37 -0
  2073. vibe_surf/langflow/components/datastax/getenvvar.py +30 -0
  2074. vibe_surf/langflow/components/datastax/graph_rag.py +141 -0
  2075. vibe_surf/langflow/components/datastax/hcd.py +314 -0
  2076. vibe_surf/langflow/components/datastax/list_assistants.py +25 -0
  2077. vibe_surf/langflow/components/datastax/run.py +89 -0
  2078. vibe_surf/langflow/components/deactivated/__init__.py +19 -0
  2079. vibe_surf/langflow/components/deactivated/amazon_kendra.py +66 -0
  2080. vibe_surf/langflow/components/deactivated/chat_litellm_model.py +158 -0
  2081. vibe_surf/langflow/components/deactivated/code_block_extractor.py +26 -0
  2082. vibe_surf/langflow/components/deactivated/documents_to_data.py +22 -0
  2083. vibe_surf/langflow/components/deactivated/embed.py +16 -0
  2084. vibe_surf/langflow/components/deactivated/extract_key_from_data.py +46 -0
  2085. vibe_surf/langflow/components/deactivated/json_document_builder.py +59 -0
  2086. vibe_surf/langflow/components/deactivated/list_flows.py +20 -0
  2087. vibe_surf/langflow/components/deactivated/merge_data.py +93 -0
  2088. vibe_surf/langflow/components/deactivated/message.py +37 -0
  2089. vibe_surf/langflow/components/deactivated/metal.py +54 -0
  2090. vibe_surf/langflow/components/deactivated/multi_query.py +59 -0
  2091. vibe_surf/langflow/components/deactivated/retriever.py +43 -0
  2092. vibe_surf/langflow/components/deactivated/selective_passthrough.py +77 -0
  2093. vibe_surf/langflow/components/deactivated/should_run_next.py +40 -0
  2094. vibe_surf/langflow/components/deactivated/split_text.py +63 -0
  2095. vibe_surf/langflow/components/deactivated/store_message.py +24 -0
  2096. vibe_surf/langflow/components/deactivated/sub_flow.py +124 -0
  2097. vibe_surf/langflow/components/deactivated/vectara_self_query.py +76 -0
  2098. vibe_surf/langflow/components/deactivated/vector_store.py +24 -0
  2099. vibe_surf/langflow/components/deepseek/__init__.py +34 -0
  2100. vibe_surf/langflow/components/deepseek/deepseek.py +136 -0
  2101. vibe_surf/langflow/components/docling/__init__.py +43 -0
  2102. vibe_surf/langflow/components/docling/chunk_docling_document.py +186 -0
  2103. vibe_surf/langflow/components/docling/docling_inline.py +249 -0
  2104. vibe_surf/langflow/components/docling/docling_remote.py +192 -0
  2105. vibe_surf/langflow/components/docling/export_docling_document.py +117 -0
  2106. vibe_surf/langflow/components/documentloaders/__init__.py +0 -0
  2107. vibe_surf/langflow/components/duckduckgo/__init__.py +3 -0
  2108. vibe_surf/langflow/components/duckduckgo/duck_duck_go_search_run.py +92 -0
  2109. vibe_surf/langflow/components/elastic/__init__.py +37 -0
  2110. vibe_surf/langflow/components/elastic/elasticsearch.py +267 -0
  2111. vibe_surf/langflow/components/elastic/opensearch.py +243 -0
  2112. vibe_surf/langflow/components/embeddings/__init__.py +37 -0
  2113. vibe_surf/langflow/components/embeddings/similarity.py +77 -0
  2114. vibe_surf/langflow/components/embeddings/text_embedder.py +65 -0
  2115. vibe_surf/langflow/components/exa/__init__.py +3 -0
  2116. vibe_surf/langflow/components/exa/exa_search.py +68 -0
  2117. vibe_surf/langflow/components/firecrawl/__init__.py +43 -0
  2118. vibe_surf/langflow/components/firecrawl/firecrawl_crawl_api.py +88 -0
  2119. vibe_surf/langflow/components/firecrawl/firecrawl_extract_api.py +136 -0
  2120. vibe_surf/langflow/components/firecrawl/firecrawl_map_api.py +89 -0
  2121. vibe_surf/langflow/components/firecrawl/firecrawl_scrape_api.py +73 -0
  2122. vibe_surf/langflow/components/git/__init__.py +4 -0
  2123. vibe_surf/langflow/components/git/git.py +262 -0
  2124. vibe_surf/langflow/components/git/gitextractor.py +196 -0
  2125. vibe_surf/langflow/components/glean/__init__.py +3 -0
  2126. vibe_surf/langflow/components/glean/glean_search_api.py +173 -0
  2127. vibe_surf/langflow/components/google/__init__.py +17 -0
  2128. vibe_surf/langflow/components/google/gmail.py +193 -0
  2129. vibe_surf/langflow/components/google/google_bq_sql_executor.py +157 -0
  2130. vibe_surf/langflow/components/google/google_drive.py +92 -0
  2131. vibe_surf/langflow/components/google/google_drive_search.py +152 -0
  2132. vibe_surf/langflow/components/google/google_generative_ai.py +147 -0
  2133. vibe_surf/langflow/components/google/google_generative_ai_embeddings.py +141 -0
  2134. vibe_surf/langflow/components/google/google_oauth_token.py +89 -0
  2135. vibe_surf/langflow/components/google/google_search_api_core.py +68 -0
  2136. vibe_surf/langflow/components/groq/__init__.py +34 -0
  2137. vibe_surf/langflow/components/groq/groq.py +140 -0
  2138. vibe_surf/langflow/components/helpers/__init__.py +52 -0
  2139. vibe_surf/langflow/components/helpers/calculator_core.py +89 -0
  2140. vibe_surf/langflow/components/helpers/create_list.py +40 -0
  2141. vibe_surf/langflow/components/helpers/current_date.py +42 -0
  2142. vibe_surf/langflow/components/helpers/id_generator.py +42 -0
  2143. vibe_surf/langflow/components/helpers/memory.py +253 -0
  2144. vibe_surf/langflow/components/helpers/output_parser.py +46 -0
  2145. vibe_surf/langflow/components/helpers/store_message.py +91 -0
  2146. vibe_surf/langflow/components/homeassistant/__init__.py +7 -0
  2147. vibe_surf/langflow/components/homeassistant/home_assistant_control.py +152 -0
  2148. vibe_surf/langflow/components/homeassistant/list_home_assistant_states.py +137 -0
  2149. vibe_surf/langflow/components/huggingface/__init__.py +37 -0
  2150. vibe_surf/langflow/components/huggingface/huggingface.py +199 -0
  2151. vibe_surf/langflow/components/huggingface/huggingface_inference_api.py +106 -0
  2152. vibe_surf/langflow/components/ibm/__init__.py +34 -0
  2153. vibe_surf/langflow/components/ibm/watsonx.py +203 -0
  2154. vibe_surf/langflow/components/ibm/watsonx_embeddings.py +135 -0
  2155. vibe_surf/langflow/components/icosacomputing/__init__.py +5 -0
  2156. vibe_surf/langflow/components/icosacomputing/combinatorial_reasoner.py +84 -0
  2157. vibe_surf/langflow/components/input_output/__init__.py +38 -0
  2158. vibe_surf/langflow/components/input_output/chat.py +99 -0
  2159. vibe_surf/langflow/components/input_output/chat_output.py +169 -0
  2160. vibe_surf/langflow/components/input_output/text.py +27 -0
  2161. vibe_surf/langflow/components/input_output/text_output.py +29 -0
  2162. vibe_surf/langflow/components/jigsawstack/__init__.py +23 -0
  2163. vibe_surf/langflow/components/jigsawstack/ai_scrape.py +126 -0
  2164. vibe_surf/langflow/components/jigsawstack/ai_web_search.py +136 -0
  2165. vibe_surf/langflow/components/jigsawstack/file_read.py +115 -0
  2166. vibe_surf/langflow/components/jigsawstack/file_upload.py +94 -0
  2167. vibe_surf/langflow/components/jigsawstack/image_generation.py +205 -0
  2168. vibe_surf/langflow/components/jigsawstack/nsfw.py +60 -0
  2169. vibe_surf/langflow/components/jigsawstack/object_detection.py +124 -0
  2170. vibe_surf/langflow/components/jigsawstack/sentiment.py +112 -0
  2171. vibe_surf/langflow/components/jigsawstack/text_to_sql.py +90 -0
  2172. vibe_surf/langflow/components/jigsawstack/text_translate.py +77 -0
  2173. vibe_surf/langflow/components/jigsawstack/vocr.py +107 -0
  2174. vibe_surf/langflow/components/knowledge_bases/__init__.py +34 -0
  2175. vibe_surf/langflow/components/knowledge_bases/ingestion.py +697 -0
  2176. vibe_surf/langflow/components/knowledge_bases/retrieval.py +264 -0
  2177. vibe_surf/langflow/components/langchain_utilities/__init__.py +109 -0
  2178. vibe_surf/langflow/components/langchain_utilities/character.py +53 -0
  2179. vibe_surf/langflow/components/langchain_utilities/conversation.py +52 -0
  2180. vibe_surf/langflow/components/langchain_utilities/csv_agent.py +107 -0
  2181. vibe_surf/langflow/components/langchain_utilities/fake_embeddings.py +26 -0
  2182. vibe_surf/langflow/components/langchain_utilities/html_link_extractor.py +35 -0
  2183. vibe_surf/langflow/components/langchain_utilities/json_agent.py +45 -0
  2184. vibe_surf/langflow/components/langchain_utilities/langchain_hub.py +126 -0
  2185. vibe_surf/langflow/components/langchain_utilities/language_recursive.py +49 -0
  2186. vibe_surf/langflow/components/langchain_utilities/language_semantic.py +138 -0
  2187. vibe_surf/langflow/components/langchain_utilities/llm_checker.py +39 -0
  2188. vibe_surf/langflow/components/langchain_utilities/llm_math.py +42 -0
  2189. vibe_surf/langflow/components/langchain_utilities/natural_language.py +61 -0
  2190. vibe_surf/langflow/components/langchain_utilities/openai_tools.py +53 -0
  2191. vibe_surf/langflow/components/langchain_utilities/openapi.py +48 -0
  2192. vibe_surf/langflow/components/langchain_utilities/recursive_character.py +60 -0
  2193. vibe_surf/langflow/components/langchain_utilities/retrieval_qa.py +83 -0
  2194. vibe_surf/langflow/components/langchain_utilities/runnable_executor.py +137 -0
  2195. vibe_surf/langflow/components/langchain_utilities/self_query.py +80 -0
  2196. vibe_surf/langflow/components/langchain_utilities/spider.py +142 -0
  2197. vibe_surf/langflow/components/langchain_utilities/sql.py +40 -0
  2198. vibe_surf/langflow/components/langchain_utilities/sql_database.py +35 -0
  2199. vibe_surf/langflow/components/langchain_utilities/sql_generator.py +78 -0
  2200. vibe_surf/langflow/components/langchain_utilities/tool_calling.py +59 -0
  2201. vibe_surf/langflow/components/langchain_utilities/vector_store_info.py +49 -0
  2202. vibe_surf/langflow/components/langchain_utilities/vector_store_router.py +33 -0
  2203. vibe_surf/langflow/components/langchain_utilities/xml_agent.py +71 -0
  2204. vibe_surf/langflow/components/langwatch/__init__.py +3 -0
  2205. vibe_surf/langflow/components/langwatch/langwatch.py +278 -0
  2206. vibe_surf/langflow/components/link_extractors/__init__.py +0 -0
  2207. vibe_surf/langflow/components/lmstudio/__init__.py +34 -0
  2208. vibe_surf/langflow/components/lmstudio/lmstudioembeddings.py +89 -0
  2209. vibe_surf/langflow/components/lmstudio/lmstudiomodel.py +129 -0
  2210. vibe_surf/langflow/components/logic/__init__.py +52 -0
  2211. vibe_surf/langflow/components/logic/conditional_router.py +208 -0
  2212. vibe_surf/langflow/components/logic/data_conditional_router.py +126 -0
  2213. vibe_surf/langflow/components/logic/flow_tool.py +111 -0
  2214. vibe_surf/langflow/components/logic/listen.py +29 -0
  2215. vibe_surf/langflow/components/logic/loop.py +125 -0
  2216. vibe_surf/langflow/components/logic/notify.py +88 -0
  2217. vibe_surf/langflow/components/logic/pass_message.py +36 -0
  2218. vibe_surf/langflow/components/logic/run_flow.py +71 -0
  2219. vibe_surf/langflow/components/logic/sub_flow.py +115 -0
  2220. vibe_surf/langflow/components/maritalk/__init__.py +32 -0
  2221. vibe_surf/langflow/components/maritalk/maritalk.py +52 -0
  2222. vibe_surf/langflow/components/mem0/__init__.py +3 -0
  2223. vibe_surf/langflow/components/mem0/mem0_chat_memory.py +136 -0
  2224. vibe_surf/langflow/components/milvus/__init__.py +34 -0
  2225. vibe_surf/langflow/components/milvus/milvus.py +115 -0
  2226. vibe_surf/langflow/components/mistral/__init__.py +37 -0
  2227. vibe_surf/langflow/components/mistral/mistral.py +114 -0
  2228. vibe_surf/langflow/components/mistral/mistral_embeddings.py +58 -0
  2229. vibe_surf/langflow/components/models/__init__.py +34 -0
  2230. vibe_surf/langflow/components/models/embedding_model.py +114 -0
  2231. vibe_surf/langflow/components/models/language_model.py +144 -0
  2232. vibe_surf/langflow/components/mongodb/__init__.py +34 -0
  2233. vibe_surf/langflow/components/mongodb/mongodb_atlas.py +213 -0
  2234. vibe_surf/langflow/components/needle/__init__.py +3 -0
  2235. vibe_surf/langflow/components/needle/needle.py +104 -0
  2236. vibe_surf/langflow/components/notdiamond/__init__.py +36 -0
  2237. vibe_surf/langflow/components/notdiamond/notdiamond.py +228 -0
  2238. vibe_surf/langflow/components/novita/__init__.py +32 -0
  2239. vibe_surf/langflow/components/novita/novita.py +130 -0
  2240. vibe_surf/langflow/components/nvidia/__init__.py +57 -0
  2241. vibe_surf/langflow/components/nvidia/nvidia.py +151 -0
  2242. vibe_surf/langflow/components/nvidia/nvidia_embedding.py +77 -0
  2243. vibe_surf/langflow/components/nvidia/nvidia_ingest.py +317 -0
  2244. vibe_surf/langflow/components/nvidia/nvidia_rerank.py +63 -0
  2245. vibe_surf/langflow/components/nvidia/system_assist.py +65 -0
  2246. vibe_surf/langflow/components/olivya/__init__.py +3 -0
  2247. vibe_surf/langflow/components/olivya/olivya.py +116 -0
  2248. vibe_surf/langflow/components/ollama/__init__.py +37 -0
  2249. vibe_surf/langflow/components/ollama/ollama.py +330 -0
  2250. vibe_surf/langflow/components/ollama/ollama_embeddings.py +106 -0
  2251. vibe_surf/langflow/components/openai/__init__.py +37 -0
  2252. vibe_surf/langflow/components/openai/openai.py +100 -0
  2253. vibe_surf/langflow/components/openai/openai_chat_model.py +158 -0
  2254. vibe_surf/langflow/components/openrouter/__init__.py +32 -0
  2255. vibe_surf/langflow/components/openrouter/openrouter.py +202 -0
  2256. vibe_surf/langflow/components/output_parsers/__init__.py +0 -0
  2257. vibe_surf/langflow/components/perplexity/__init__.py +34 -0
  2258. vibe_surf/langflow/components/perplexity/perplexity.py +75 -0
  2259. vibe_surf/langflow/components/pgvector/__init__.py +34 -0
  2260. vibe_surf/langflow/components/pgvector/pgvector.py +72 -0
  2261. vibe_surf/langflow/components/pinecone/__init__.py +34 -0
  2262. vibe_surf/langflow/components/pinecone/pinecone.py +134 -0
  2263. vibe_surf/langflow/components/processing/__init__.py +117 -0
  2264. vibe_surf/langflow/components/processing/alter_metadata.py +109 -0
  2265. vibe_surf/langflow/components/processing/batch_run.py +205 -0
  2266. vibe_surf/langflow/components/processing/combine_text.py +40 -0
  2267. vibe_surf/langflow/components/processing/converter.py +150 -0
  2268. vibe_surf/langflow/components/processing/create_data.py +111 -0
  2269. vibe_surf/langflow/components/processing/data_operations.py +438 -0
  2270. vibe_surf/langflow/components/processing/data_to_dataframe.py +71 -0
  2271. vibe_surf/langflow/components/processing/dataframe_operations.py +310 -0
  2272. vibe_surf/langflow/components/processing/extract_key.py +54 -0
  2273. vibe_surf/langflow/components/processing/filter_data.py +43 -0
  2274. vibe_surf/langflow/components/processing/filter_data_values.py +89 -0
  2275. vibe_surf/langflow/components/processing/json_cleaner.py +104 -0
  2276. vibe_surf/langflow/components/processing/lambda_filter.py +154 -0
  2277. vibe_surf/langflow/components/processing/llm_router.py +499 -0
  2278. vibe_surf/langflow/components/processing/merge_data.py +91 -0
  2279. vibe_surf/langflow/components/processing/message_to_data.py +37 -0
  2280. vibe_surf/langflow/components/processing/parse_data.py +71 -0
  2281. vibe_surf/langflow/components/processing/parse_dataframe.py +69 -0
  2282. vibe_surf/langflow/components/processing/parse_json_data.py +91 -0
  2283. vibe_surf/langflow/components/processing/parser.py +143 -0
  2284. vibe_surf/langflow/components/processing/prompt.py +67 -0
  2285. vibe_surf/langflow/components/processing/python_repl_core.py +98 -0
  2286. vibe_surf/langflow/components/processing/regex.py +83 -0
  2287. vibe_surf/langflow/components/processing/save_file.py +208 -0
  2288. vibe_surf/langflow/components/processing/select_data.py +49 -0
  2289. vibe_surf/langflow/components/processing/split_text.py +141 -0
  2290. vibe_surf/langflow/components/processing/structured_output.py +206 -0
  2291. vibe_surf/langflow/components/processing/update_data.py +161 -0
  2292. vibe_surf/langflow/components/qdrant/__init__.py +34 -0
  2293. vibe_surf/langflow/components/qdrant/qdrant.py +109 -0
  2294. vibe_surf/langflow/components/redis/__init__.py +37 -0
  2295. vibe_surf/langflow/components/redis/redis.py +89 -0
  2296. vibe_surf/langflow/components/redis/redis_chat.py +43 -0
  2297. vibe_surf/langflow/components/sambanova/__init__.py +32 -0
  2298. vibe_surf/langflow/components/sambanova/sambanova.py +84 -0
  2299. vibe_surf/langflow/components/scrapegraph/__init__.py +40 -0
  2300. vibe_surf/langflow/components/scrapegraph/scrapegraph_markdownify_api.py +64 -0
  2301. vibe_surf/langflow/components/scrapegraph/scrapegraph_search_api.py +64 -0
  2302. vibe_surf/langflow/components/scrapegraph/scrapegraph_smart_scraper_api.py +71 -0
  2303. vibe_surf/langflow/components/searchapi/__init__.py +36 -0
  2304. vibe_surf/langflow/components/searchapi/search.py +79 -0
  2305. vibe_surf/langflow/components/serpapi/__init__.py +3 -0
  2306. vibe_surf/langflow/components/serpapi/serp.py +115 -0
  2307. vibe_surf/langflow/components/serper/__init__.py +3 -0
  2308. vibe_surf/langflow/components/serper/google_serper_api_core.py +74 -0
  2309. vibe_surf/langflow/components/supabase/__init__.py +37 -0
  2310. vibe_surf/langflow/components/supabase/supabase.py +76 -0
  2311. vibe_surf/langflow/components/tavily/__init__.py +4 -0
  2312. vibe_surf/langflow/components/tavily/tavily_extract.py +117 -0
  2313. vibe_surf/langflow/components/tavily/tavily_search.py +212 -0
  2314. vibe_surf/langflow/components/textsplitters/__init__.py +0 -0
  2315. vibe_surf/langflow/components/toolkits/__init__.py +0 -0
  2316. vibe_surf/langflow/components/tools/__init__.py +66 -0
  2317. vibe_surf/langflow/components/tools/calculator.py +104 -0
  2318. vibe_surf/langflow/components/tools/python_code_structured_tool.py +328 -0
  2319. vibe_surf/langflow/components/tools/python_repl.py +98 -0
  2320. vibe_surf/langflow/components/tools/search_api.py +88 -0
  2321. vibe_surf/langflow/components/tools/searxng.py +145 -0
  2322. vibe_surf/langflow/components/tools/serp_api.py +120 -0
  2323. vibe_surf/langflow/components/tools/tavily_search_tool.py +345 -0
  2324. vibe_surf/langflow/components/tools/wikidata_api.py +103 -0
  2325. vibe_surf/langflow/components/tools/wikipedia_api.py +50 -0
  2326. vibe_surf/langflow/components/tools/yahoo_finance.py +125 -0
  2327. vibe_surf/langflow/components/twelvelabs/__init__.py +52 -0
  2328. vibe_surf/langflow/components/twelvelabs/convert_astra_results.py +84 -0
  2329. vibe_surf/langflow/components/twelvelabs/pegasus_index.py +311 -0
  2330. vibe_surf/langflow/components/twelvelabs/split_video.py +291 -0
  2331. vibe_surf/langflow/components/twelvelabs/text_embeddings.py +57 -0
  2332. vibe_surf/langflow/components/twelvelabs/twelvelabs_pegasus.py +408 -0
  2333. vibe_surf/langflow/components/twelvelabs/video_embeddings.py +100 -0
  2334. vibe_surf/langflow/components/twelvelabs/video_file.py +179 -0
  2335. vibe_surf/langflow/components/unstructured/__init__.py +3 -0
  2336. vibe_surf/langflow/components/unstructured/unstructured.py +121 -0
  2337. vibe_surf/langflow/components/upstash/__init__.py +34 -0
  2338. vibe_surf/langflow/components/upstash/upstash.py +124 -0
  2339. vibe_surf/langflow/components/vectara/__init__.py +37 -0
  2340. vibe_surf/langflow/components/vectara/vectara.py +97 -0
  2341. vibe_surf/langflow/components/vectara/vectara_rag.py +164 -0
  2342. vibe_surf/langflow/components/vectorstores/__init__.py +34 -0
  2343. vibe_surf/langflow/components/vectorstores/local_db.py +262 -0
  2344. vibe_surf/langflow/components/vertexai/__init__.py +37 -0
  2345. vibe_surf/langflow/components/vertexai/vertexai.py +71 -0
  2346. vibe_surf/langflow/components/vertexai/vertexai_embeddings.py +67 -0
  2347. vibe_surf/langflow/components/weaviate/__init__.py +34 -0
  2348. vibe_surf/langflow/components/weaviate/weaviate.py +89 -0
  2349. vibe_surf/langflow/components/wikipedia/__init__.py +4 -0
  2350. vibe_surf/langflow/components/wikipedia/wikidata.py +86 -0
  2351. vibe_surf/langflow/components/wikipedia/wikipedia.py +53 -0
  2352. vibe_surf/langflow/components/wolframalpha/__init__.py +3 -0
  2353. vibe_surf/langflow/components/wolframalpha/wolfram_alpha_api.py +54 -0
  2354. vibe_surf/langflow/components/xai/__init__.py +32 -0
  2355. vibe_surf/langflow/components/xai/xai.py +167 -0
  2356. vibe_surf/langflow/components/youtube/__init__.py +52 -0
  2357. vibe_surf/langflow/components/youtube/channel.py +227 -0
  2358. vibe_surf/langflow/components/youtube/comments.py +231 -0
  2359. vibe_surf/langflow/components/youtube/playlist.py +33 -0
  2360. vibe_surf/langflow/components/youtube/search.py +120 -0
  2361. vibe_surf/langflow/components/youtube/trending.py +285 -0
  2362. vibe_surf/langflow/components/youtube/video_details.py +263 -0
  2363. vibe_surf/langflow/components/youtube/youtube_transcripts.py +118 -0
  2364. vibe_surf/langflow/components/zep/__init__.py +3 -0
  2365. vibe_surf/langflow/components/zep/zep.py +45 -0
  2366. vibe_surf/langflow/core/__init__.py +0 -0
  2367. vibe_surf/langflow/core/celery_app.py +11 -0
  2368. vibe_surf/langflow/core/celeryconfig.py +18 -0
  2369. vibe_surf/langflow/custom/__init__.py +4 -0
  2370. vibe_surf/langflow/custom/attributes.py +87 -0
  2371. vibe_surf/langflow/custom/code_parser/__init__.py +3 -0
  2372. vibe_surf/langflow/custom/code_parser/code_parser.py +361 -0
  2373. vibe_surf/langflow/custom/custom_component/__init__.py +0 -0
  2374. vibe_surf/langflow/custom/custom_component/base_component.py +118 -0
  2375. vibe_surf/langflow/custom/custom_component/component.py +1742 -0
  2376. vibe_surf/langflow/custom/custom_component/component_with_cache.py +8 -0
  2377. vibe_surf/langflow/custom/custom_component/custom_component.py +552 -0
  2378. vibe_surf/langflow/custom/dependency_analyzer.py +165 -0
  2379. vibe_surf/langflow/custom/directory_reader/__init__.py +3 -0
  2380. vibe_surf/langflow/custom/directory_reader/directory_reader.py +359 -0
  2381. vibe_surf/langflow/custom/directory_reader/utils.py +171 -0
  2382. vibe_surf/langflow/custom/eval.py +12 -0
  2383. vibe_surf/langflow/custom/schema.py +32 -0
  2384. vibe_surf/langflow/custom/tree_visitor.py +21 -0
  2385. vibe_surf/langflow/custom/utils.py +868 -0
  2386. vibe_surf/langflow/events/__init__.py +0 -0
  2387. vibe_surf/langflow/events/event_manager.py +108 -0
  2388. vibe_surf/langflow/exceptions/__init__.py +0 -0
  2389. vibe_surf/langflow/exceptions/api.py +34 -0
  2390. vibe_surf/langflow/exceptions/component.py +17 -0
  2391. vibe_surf/langflow/exceptions/serialization.py +56 -0
  2392. vibe_surf/langflow/field_typing/__init__.py +91 -0
  2393. vibe_surf/langflow/field_typing/constants.py +137 -0
  2394. vibe_surf/langflow/field_typing/range_spec.py +33 -0
  2395. vibe_surf/langflow/graph/__init__.py +6 -0
  2396. vibe_surf/langflow/graph/edge/__init__.py +0 -0
  2397. vibe_surf/langflow/graph/edge/base.py +277 -0
  2398. vibe_surf/langflow/graph/edge/schema.py +119 -0
  2399. vibe_surf/langflow/graph/edge/utils.py +0 -0
  2400. vibe_surf/langflow/graph/graph/__init__.py +0 -0
  2401. vibe_surf/langflow/graph/graph/ascii.py +202 -0
  2402. vibe_surf/langflow/graph/graph/base.py +2242 -0
  2403. vibe_surf/langflow/graph/graph/constants.py +58 -0
  2404. vibe_surf/langflow/graph/graph/runnable_vertices_manager.py +133 -0
  2405. vibe_surf/langflow/graph/graph/schema.py +53 -0
  2406. vibe_surf/langflow/graph/graph/state_model.py +66 -0
  2407. vibe_surf/langflow/graph/graph/utils.py +1024 -0
  2408. vibe_surf/langflow/graph/schema.py +75 -0
  2409. vibe_surf/langflow/graph/state/__init__.py +0 -0
  2410. vibe_surf/langflow/graph/state/model.py +237 -0
  2411. vibe_surf/langflow/graph/utils.py +229 -0
  2412. vibe_surf/langflow/graph/vertex/__init__.py +0 -0
  2413. vibe_surf/langflow/graph/vertex/base.py +811 -0
  2414. vibe_surf/langflow/graph/vertex/constants.py +0 -0
  2415. vibe_surf/langflow/graph/vertex/exceptions.py +4 -0
  2416. vibe_surf/langflow/graph/vertex/param_handler.py +255 -0
  2417. vibe_surf/langflow/graph/vertex/schema.py +26 -0
  2418. vibe_surf/langflow/graph/vertex/utils.py +19 -0
  2419. vibe_surf/langflow/graph/vertex/vertex_types.py +489 -0
  2420. vibe_surf/langflow/helpers/__init__.py +3 -0
  2421. vibe_surf/langflow/helpers/base_model.py +71 -0
  2422. vibe_surf/langflow/helpers/custom.py +13 -0
  2423. vibe_surf/langflow/helpers/data.py +206 -0
  2424. vibe_surf/langflow/helpers/flow.py +359 -0
  2425. vibe_surf/langflow/helpers/folders.py +26 -0
  2426. vibe_surf/langflow/helpers/user.py +27 -0
  2427. vibe_surf/langflow/initial_setup/__init__.py +0 -0
  2428. vibe_surf/langflow/initial_setup/constants.py +2 -0
  2429. vibe_surf/langflow/initial_setup/load.py +21 -0
  2430. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-01.svg +102 -0
  2431. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-02.svg +135 -0
  2432. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-03.svg +126 -0
  2433. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-04.svg +132 -0
  2434. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-05.svg +151 -0
  2435. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-06.svg +132 -0
  2436. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-07.svg +138 -0
  2437. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-08.svg +125 -0
  2438. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-09.svg +137 -0
  2439. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-10.svg +109 -0
  2440. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-11.svg +140 -0
  2441. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-12.svg +99 -0
  2442. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-13.svg +118 -0
  2443. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-14.svg +99 -0
  2444. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-15.svg +90 -0
  2445. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-16.svg +106 -0
  2446. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-17.svg +97 -0
  2447. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-18.svg +128 -0
  2448. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-19.svg +100 -0
  2449. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-20.svg +101 -0
  2450. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-21.svg +134 -0
  2451. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-22.svg +127 -0
  2452. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-23.svg +120 -0
  2453. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-24.svg +110 -0
  2454. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-25.svg +79 -0
  2455. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-26.svg +98 -0
  2456. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-27.svg +113 -0
  2457. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-01.svg +113 -0
  2458. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-02.svg +167 -0
  2459. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-03.svg +91 -0
  2460. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-04.svg +114 -0
  2461. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-05.svg +71 -0
  2462. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-06.svg +105 -0
  2463. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-07.svg +101 -0
  2464. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-08.svg +92 -0
  2465. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-09.svg +91 -0
  2466. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-10.svg +110 -0
  2467. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-11.svg +102 -0
  2468. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-12.svg +92 -0
  2469. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-13.svg +77 -0
  2470. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-14.svg +99 -0
  2471. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-15.svg +81 -0
  2472. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-16.svg +91 -0
  2473. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-17.svg +100 -0
  2474. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-18.svg +99 -0
  2475. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-19.svg +155 -0
  2476. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-20.svg +110 -0
  2477. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-21.svg +128 -0
  2478. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-22.svg +90 -0
  2479. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-23.svg +117 -0
  2480. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-24.svg +100 -0
  2481. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-25.svg +97 -0
  2482. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-26.svg +105 -0
  2483. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-27.svg +82 -0
  2484. vibe_surf/langflow/initial_setup/profile_pictures/Space/026-alien.svg +1 -0
  2485. vibe_surf/langflow/initial_setup/profile_pictures/Space/027-satellite.svg +1 -0
  2486. vibe_surf/langflow/initial_setup/profile_pictures/Space/028-alien.svg +1 -0
  2487. vibe_surf/langflow/initial_setup/profile_pictures/Space/029-telescope.svg +1 -0
  2488. vibe_surf/langflow/initial_setup/profile_pictures/Space/030-books.svg +1 -0
  2489. vibe_surf/langflow/initial_setup/profile_pictures/Space/031-planet.svg +1 -0
  2490. vibe_surf/langflow/initial_setup/profile_pictures/Space/032-constellation.svg +1 -0
  2491. vibe_surf/langflow/initial_setup/profile_pictures/Space/033-planet.svg +1 -0
  2492. vibe_surf/langflow/initial_setup/profile_pictures/Space/034-alien.svg +1 -0
  2493. vibe_surf/langflow/initial_setup/profile_pictures/Space/035-globe.svg +1 -0
  2494. vibe_surf/langflow/initial_setup/profile_pictures/Space/036-eclipse.svg +1 -0
  2495. vibe_surf/langflow/initial_setup/profile_pictures/Space/037-meteor.svg +1 -0
  2496. vibe_surf/langflow/initial_setup/profile_pictures/Space/038-eclipse.svg +1 -0
  2497. vibe_surf/langflow/initial_setup/profile_pictures/Space/039-Asteroid.svg +1 -0
  2498. vibe_surf/langflow/initial_setup/profile_pictures/Space/040-mission.svg +1 -0
  2499. vibe_surf/langflow/initial_setup/profile_pictures/Space/041-spaceship.svg +1 -0
  2500. vibe_surf/langflow/initial_setup/profile_pictures/Space/042-space shuttle.svg +1 -0
  2501. vibe_surf/langflow/initial_setup/profile_pictures/Space/043-space shuttle.svg +1 -0
  2502. vibe_surf/langflow/initial_setup/profile_pictures/Space/044-rocket.svg +1 -0
  2503. vibe_surf/langflow/initial_setup/profile_pictures/Space/045-astronaut.svg +1 -0
  2504. vibe_surf/langflow/initial_setup/profile_pictures/Space/046-rocket.svg +1 -0
  2505. vibe_surf/langflow/initial_setup/profile_pictures/Space/047-computer.svg +1 -0
  2506. vibe_surf/langflow/initial_setup/profile_pictures/Space/048-satellite.svg +1 -0
  2507. vibe_surf/langflow/initial_setup/profile_pictures/Space/049-astronaut.svg +1 -0
  2508. vibe_surf/langflow/initial_setup/profile_pictures/Space/050-space robot.svg +1 -0
  2509. vibe_surf/langflow/initial_setup/setup.py +1108 -0
  2510. vibe_surf/langflow/initial_setup/starter_projects/Basic Prompt Chaining.json +1976 -0
  2511. vibe_surf/langflow/initial_setup/starter_projects/Basic Prompting.json +1051 -0
  2512. vibe_surf/langflow/initial_setup/starter_projects/Blog Writer.json +1529 -0
  2513. vibe_surf/langflow/initial_setup/starter_projects/Custom Component Generator.json +2671 -0
  2514. vibe_surf/langflow/initial_setup/starter_projects/Document Q&A.json +1522 -0
  2515. vibe_surf/langflow/initial_setup/starter_projects/Financial Report Parser.json +1418 -0
  2516. vibe_surf/langflow/initial_setup/starter_projects/Hybrid Search RAG.json +2718 -0
  2517. vibe_surf/langflow/initial_setup/starter_projects/Image Sentiment Analysis.json +1884 -0
  2518. vibe_surf/langflow/initial_setup/starter_projects/Instagram Copywriter.json +3069 -0
  2519. vibe_surf/langflow/initial_setup/starter_projects/Invoice Summarizer.json +1666 -0
  2520. vibe_surf/langflow/initial_setup/starter_projects/Knowledge Ingestion.json +1042 -0
  2521. vibe_surf/langflow/initial_setup/starter_projects/Knowledge Retrieval.json +630 -0
  2522. vibe_surf/langflow/initial_setup/starter_projects/Market Research.json +2532 -0
  2523. vibe_surf/langflow/initial_setup/starter_projects/Meeting Summary.json +3263 -0
  2524. vibe_surf/langflow/initial_setup/starter_projects/Memory Chatbot.json +1419 -0
  2525. vibe_surf/langflow/initial_setup/starter_projects/News Aggregator.json +1835 -0
  2526. vibe_surf/langflow/initial_setup/starter_projects/Nvidia Remix.json +4866 -0
  2527. vibe_surf/langflow/initial_setup/starter_projects/Pok/303/251dex Agent.json" +1739 -0
  2528. vibe_surf/langflow/initial_setup/starter_projects/Portfolio Website Code Generator.json +2243 -0
  2529. vibe_surf/langflow/initial_setup/starter_projects/Price Deal Finder.json +2099 -0
  2530. vibe_surf/langflow/initial_setup/starter_projects/Research Agent.json +3032 -0
  2531. vibe_surf/langflow/initial_setup/starter_projects/Research Translation Loop.json +1580 -0
  2532. vibe_surf/langflow/initial_setup/starter_projects/SEO Keyword Generator.json +1091 -0
  2533. vibe_surf/langflow/initial_setup/starter_projects/SaaS Pricing.json +1416 -0
  2534. vibe_surf/langflow/initial_setup/starter_projects/Search agent.json +1455 -0
  2535. vibe_surf/langflow/initial_setup/starter_projects/Sequential Tasks Agents.json +4101 -0
  2536. vibe_surf/langflow/initial_setup/starter_projects/Simple Agent.json +1841 -0
  2537. vibe_surf/langflow/initial_setup/starter_projects/Social Media Agent.json +1759 -0
  2538. vibe_surf/langflow/initial_setup/starter_projects/Text Sentiment Analysis.json +2557 -0
  2539. vibe_surf/langflow/initial_setup/starter_projects/Travel Planning Agents.json +3448 -0
  2540. vibe_surf/langflow/initial_setup/starter_projects/Twitter Thread Generator.json +1978 -0
  2541. vibe_surf/langflow/initial_setup/starter_projects/Vector Store RAG.json +4850 -0
  2542. vibe_surf/langflow/initial_setup/starter_projects/Youtube Analysis.json +2734 -0
  2543. vibe_surf/langflow/initial_setup/starter_projects/__init__.py +19 -0
  2544. vibe_surf/langflow/initial_setup/starter_projects/basic_prompting.py +28 -0
  2545. vibe_surf/langflow/initial_setup/starter_projects/blog_writer.py +46 -0
  2546. vibe_surf/langflow/initial_setup/starter_projects/complex_agent.py +96 -0
  2547. vibe_surf/langflow/initial_setup/starter_projects/document_qa.py +39 -0
  2548. vibe_surf/langflow/initial_setup/starter_projects/hierarchical_tasks_agent.py +69 -0
  2549. vibe_surf/langflow/initial_setup/starter_projects/memory_chatbot.py +31 -0
  2550. vibe_surf/langflow/initial_setup/starter_projects/sequential_tasks_agent.py +97 -0
  2551. vibe_surf/langflow/initial_setup/starter_projects/vector_store_rag.py +61 -0
  2552. vibe_surf/langflow/inputs/__init__.py +68 -0
  2553. vibe_surf/langflow/inputs/constants.py +2 -0
  2554. vibe_surf/langflow/inputs/input_mixin.py +312 -0
  2555. vibe_surf/langflow/inputs/inputs.py +706 -0
  2556. vibe_surf/langflow/inputs/utils.py +32 -0
  2557. vibe_surf/langflow/inputs/validators.py +19 -0
  2558. vibe_surf/langflow/interface/__init__.py +0 -0
  2559. vibe_surf/langflow/interface/components.py +496 -0
  2560. vibe_surf/langflow/interface/importing/__init__.py +5 -0
  2561. vibe_surf/langflow/interface/importing/utils.py +39 -0
  2562. vibe_surf/langflow/interface/initialize/__init__.py +3 -0
  2563. vibe_surf/langflow/interface/initialize/loading.py +200 -0
  2564. vibe_surf/langflow/interface/listing.py +26 -0
  2565. vibe_surf/langflow/interface/run.py +45 -0
  2566. vibe_surf/langflow/interface/utils.py +112 -0
  2567. vibe_surf/langflow/io/__init__.py +63 -0
  2568. vibe_surf/langflow/io/schema.py +304 -0
  2569. vibe_surf/langflow/langflow_launcher.py +51 -0
  2570. vibe_surf/langflow/legacy_custom/__init__.py +0 -0
  2571. vibe_surf/langflow/legacy_custom/customs.py +16 -0
  2572. vibe_surf/langflow/load/__init__.py +12 -0
  2573. vibe_surf/langflow/load/load.py +250 -0
  2574. vibe_surf/langflow/load/utils.py +126 -0
  2575. vibe_surf/langflow/logging/__init__.py +4 -0
  2576. vibe_surf/langflow/logging/logger.py +407 -0
  2577. vibe_surf/langflow/logging/setup.py +16 -0
  2578. vibe_surf/langflow/main.py +550 -0
  2579. vibe_surf/langflow/memory.py +326 -0
  2580. vibe_surf/langflow/middleware.py +59 -0
  2581. vibe_surf/langflow/processing/__init__.py +0 -0
  2582. vibe_surf/langflow/processing/process.py +216 -0
  2583. vibe_surf/langflow/processing/utils.py +25 -0
  2584. vibe_surf/langflow/py.typed +0 -0
  2585. vibe_surf/langflow/schema/__init__.py +6 -0
  2586. vibe_surf/langflow/schema/artifact.py +82 -0
  2587. vibe_surf/langflow/schema/content_block.py +62 -0
  2588. vibe_surf/langflow/schema/content_types.py +91 -0
  2589. vibe_surf/langflow/schema/data.py +306 -0
  2590. vibe_surf/langflow/schema/dataframe.py +206 -0
  2591. vibe_surf/langflow/schema/dotdict.py +71 -0
  2592. vibe_surf/langflow/schema/encoders.py +13 -0
  2593. vibe_surf/langflow/schema/graph.py +47 -0
  2594. vibe_surf/langflow/schema/image.py +128 -0
  2595. vibe_surf/langflow/schema/log.py +33 -0
  2596. vibe_surf/langflow/schema/message.py +483 -0
  2597. vibe_surf/langflow/schema/openai_responses_schemas.py +74 -0
  2598. vibe_surf/langflow/schema/playground_events.py +182 -0
  2599. vibe_surf/langflow/schema/properties.py +39 -0
  2600. vibe_surf/langflow/schema/schema.py +121 -0
  2601. vibe_surf/langflow/schema/serialize.py +14 -0
  2602. vibe_surf/langflow/schema/table.py +140 -0
  2603. vibe_surf/langflow/schema/validators.py +114 -0
  2604. vibe_surf/langflow/serialization/__init__.py +3 -0
  2605. vibe_surf/langflow/serialization/constants.py +2 -0
  2606. vibe_surf/langflow/serialization/serialization.py +320 -0
  2607. vibe_surf/langflow/server.py +70 -0
  2608. vibe_surf/langflow/services/__init__.py +4 -0
  2609. vibe_surf/langflow/services/auth/__init__.py +0 -0
  2610. vibe_surf/langflow/services/auth/factory.py +15 -0
  2611. vibe_surf/langflow/services/auth/mcp_encryption.py +120 -0
  2612. vibe_surf/langflow/services/auth/service.py +15 -0
  2613. vibe_surf/langflow/services/auth/utils.py +583 -0
  2614. vibe_surf/langflow/services/base.py +28 -0
  2615. vibe_surf/langflow/services/cache/__init__.py +12 -0
  2616. vibe_surf/langflow/services/cache/base.py +183 -0
  2617. vibe_surf/langflow/services/cache/disk.py +95 -0
  2618. vibe_surf/langflow/services/cache/factory.py +44 -0
  2619. vibe_surf/langflow/services/cache/service.py +355 -0
  2620. vibe_surf/langflow/services/cache/utils.py +169 -0
  2621. vibe_surf/langflow/services/chat/__init__.py +0 -0
  2622. vibe_surf/langflow/services/chat/cache.py +150 -0
  2623. vibe_surf/langflow/services/chat/config.py +2 -0
  2624. vibe_surf/langflow/services/chat/factory.py +11 -0
  2625. vibe_surf/langflow/services/chat/schema.py +10 -0
  2626. vibe_surf/langflow/services/chat/service.py +67 -0
  2627. vibe_surf/langflow/services/database/__init__.py +0 -0
  2628. vibe_surf/langflow/services/database/factory.py +21 -0
  2629. vibe_surf/langflow/services/database/models/__init__.py +19 -0
  2630. vibe_surf/langflow/services/database/models/api_key/__init__.py +3 -0
  2631. vibe_surf/langflow/services/database/models/api_key/crud.py +74 -0
  2632. vibe_surf/langflow/services/database/models/api_key/model.py +66 -0
  2633. vibe_surf/langflow/services/database/models/base.py +17 -0
  2634. vibe_surf/langflow/services/database/models/file/__init__.py +5 -0
  2635. vibe_surf/langflow/services/database/models/file/crud.py +14 -0
  2636. vibe_surf/langflow/services/database/models/file/model.py +19 -0
  2637. vibe_surf/langflow/services/database/models/flow/__init__.py +3 -0
  2638. vibe_surf/langflow/services/database/models/flow/model.py +283 -0
  2639. vibe_surf/langflow/services/database/models/flow/schema.py +6 -0
  2640. vibe_surf/langflow/services/database/models/flow/utils.py +42 -0
  2641. vibe_surf/langflow/services/database/models/folder/__init__.py +3 -0
  2642. vibe_surf/langflow/services/database/models/folder/constants.py +2 -0
  2643. vibe_surf/langflow/services/database/models/folder/model.py +61 -0
  2644. vibe_surf/langflow/services/database/models/folder/pagination_model.py +10 -0
  2645. vibe_surf/langflow/services/database/models/folder/utils.py +45 -0
  2646. vibe_surf/langflow/services/database/models/message/__init__.py +3 -0
  2647. vibe_surf/langflow/services/database/models/message/crud.py +26 -0
  2648. vibe_surf/langflow/services/database/models/message/model.py +182 -0
  2649. vibe_surf/langflow/services/database/models/transactions/__init__.py +3 -0
  2650. vibe_surf/langflow/services/database/models/transactions/crud.py +82 -0
  2651. vibe_surf/langflow/services/database/models/transactions/model.py +65 -0
  2652. vibe_surf/langflow/services/database/models/user/__init__.py +8 -0
  2653. vibe_surf/langflow/services/database/models/user/crud.py +69 -0
  2654. vibe_surf/langflow/services/database/models/user/model.py +82 -0
  2655. vibe_surf/langflow/services/database/models/variable/__init__.py +3 -0
  2656. vibe_surf/langflow/services/database/models/variable/model.py +73 -0
  2657. vibe_surf/langflow/services/database/models/vertex_builds/__init__.py +3 -0
  2658. vibe_surf/langflow/services/database/models/vertex_builds/crud.py +145 -0
  2659. vibe_surf/langflow/services/database/models/vertex_builds/model.py +83 -0
  2660. vibe_surf/langflow/services/database/service.py +485 -0
  2661. vibe_surf/langflow/services/database/session.py +62 -0
  2662. vibe_surf/langflow/services/database/utils.py +88 -0
  2663. vibe_surf/langflow/services/deps.py +259 -0
  2664. vibe_surf/langflow/services/factory.py +88 -0
  2665. vibe_surf/langflow/services/flow/__init__.py +0 -0
  2666. vibe_surf/langflow/services/flow/flow_runner.py +265 -0
  2667. vibe_surf/langflow/services/job_queue/__init__.py +0 -0
  2668. vibe_surf/langflow/services/job_queue/factory.py +11 -0
  2669. vibe_surf/langflow/services/job_queue/service.py +328 -0
  2670. vibe_surf/langflow/services/manager.py +149 -0
  2671. vibe_surf/langflow/services/mcp_composer/__init__.py +6 -0
  2672. vibe_surf/langflow/services/mcp_composer/factory.py +15 -0
  2673. vibe_surf/langflow/services/mcp_composer/service.py +591 -0
  2674. vibe_surf/langflow/services/schema.py +23 -0
  2675. vibe_surf/langflow/services/session/__init__.py +0 -0
  2676. vibe_surf/langflow/services/session/factory.py +18 -0
  2677. vibe_surf/langflow/services/session/service.py +63 -0
  2678. vibe_surf/langflow/services/session/utils.py +18 -0
  2679. vibe_surf/langflow/services/settings/__init__.py +3 -0
  2680. vibe_surf/langflow/services/settings/auth.py +147 -0
  2681. vibe_surf/langflow/services/settings/base.py +587 -0
  2682. vibe_surf/langflow/services/settings/constants.py +34 -0
  2683. vibe_surf/langflow/services/settings/factory.py +22 -0
  2684. vibe_surf/langflow/services/settings/feature_flags.py +11 -0
  2685. vibe_surf/langflow/services/settings/manager.py +49 -0
  2686. vibe_surf/langflow/services/settings/service.py +32 -0
  2687. vibe_surf/langflow/services/settings/utils.py +40 -0
  2688. vibe_surf/langflow/services/shared_component_cache/__init__.py +0 -0
  2689. vibe_surf/langflow/services/shared_component_cache/factory.py +18 -0
  2690. vibe_surf/langflow/services/shared_component_cache/service.py +7 -0
  2691. vibe_surf/langflow/services/socket/__init__.py +0 -0
  2692. vibe_surf/langflow/services/socket/factory.py +20 -0
  2693. vibe_surf/langflow/services/socket/service.py +84 -0
  2694. vibe_surf/langflow/services/socket/utils.py +112 -0
  2695. vibe_surf/langflow/services/state/__init__.py +0 -0
  2696. vibe_surf/langflow/services/state/factory.py +16 -0
  2697. vibe_surf/langflow/services/state/service.py +82 -0
  2698. vibe_surf/langflow/services/storage/__init__.py +0 -0
  2699. vibe_surf/langflow/services/storage/constants.py +28 -0
  2700. vibe_surf/langflow/services/storage/factory.py +30 -0
  2701. vibe_surf/langflow/services/storage/local.py +127 -0
  2702. vibe_surf/langflow/services/storage/s3.py +105 -0
  2703. vibe_surf/langflow/services/storage/service.py +51 -0
  2704. vibe_surf/langflow/services/storage/utils.py +5 -0
  2705. vibe_surf/langflow/services/store/__init__.py +0 -0
  2706. vibe_surf/langflow/services/store/exceptions.py +25 -0
  2707. vibe_surf/langflow/services/store/factory.py +20 -0
  2708. vibe_surf/langflow/services/store/schema.py +74 -0
  2709. vibe_surf/langflow/services/store/service.py +600 -0
  2710. vibe_surf/langflow/services/store/utils.py +67 -0
  2711. vibe_surf/langflow/services/task/__init__.py +0 -0
  2712. vibe_surf/langflow/services/task/backends/__init__.py +0 -0
  2713. vibe_surf/langflow/services/task/backends/anyio.py +117 -0
  2714. vibe_surf/langflow/services/task/backends/base.py +15 -0
  2715. vibe_surf/langflow/services/task/backends/celery.py +29 -0
  2716. vibe_surf/langflow/services/task/factory.py +14 -0
  2717. vibe_surf/langflow/services/task/service.py +40 -0
  2718. vibe_surf/langflow/services/task/temp_flow_cleanup.py +136 -0
  2719. vibe_surf/langflow/services/task/utils.py +23 -0
  2720. vibe_surf/langflow/services/telemetry/__init__.py +0 -0
  2721. vibe_surf/langflow/services/telemetry/factory.py +20 -0
  2722. vibe_surf/langflow/services/telemetry/opentelemetry.py +253 -0
  2723. vibe_surf/langflow/services/telemetry/schema.py +45 -0
  2724. vibe_surf/langflow/services/telemetry/service.py +281 -0
  2725. vibe_surf/langflow/services/tracing/__init__.py +0 -0
  2726. vibe_surf/langflow/services/tracing/arize_phoenix.py +375 -0
  2727. vibe_surf/langflow/services/tracing/base.py +71 -0
  2728. vibe_surf/langflow/services/tracing/factory.py +20 -0
  2729. vibe_surf/langflow/services/tracing/langfuse.py +170 -0
  2730. vibe_surf/langflow/services/tracing/langsmith.py +208 -0
  2731. vibe_surf/langflow/services/tracing/langwatch.py +185 -0
  2732. vibe_surf/langflow/services/tracing/opik.py +235 -0
  2733. vibe_surf/langflow/services/tracing/schema.py +20 -0
  2734. vibe_surf/langflow/services/tracing/service.py +460 -0
  2735. vibe_surf/langflow/services/tracing/traceloop.py +244 -0
  2736. vibe_surf/langflow/services/tracing/utils.py +29 -0
  2737. vibe_surf/langflow/services/utils.py +246 -0
  2738. vibe_surf/langflow/services/variable/__init__.py +0 -0
  2739. vibe_surf/langflow/services/variable/base.py +119 -0
  2740. vibe_surf/langflow/services/variable/constants.py +2 -0
  2741. vibe_surf/langflow/services/variable/factory.py +28 -0
  2742. vibe_surf/langflow/services/variable/kubernetes.py +204 -0
  2743. vibe_surf/langflow/services/variable/kubernetes_secrets.py +193 -0
  2744. vibe_surf/langflow/services/variable/service.py +195 -0
  2745. vibe_surf/langflow/settings.py +12 -0
  2746. vibe_surf/langflow/template/__init__.py +10 -0
  2747. vibe_surf/langflow/template/field/__init__.py +0 -0
  2748. vibe_surf/langflow/template/field/base.py +257 -0
  2749. vibe_surf/langflow/template/field/prompt.py +2 -0
  2750. vibe_surf/langflow/template/frontend_node/__init__.py +6 -0
  2751. vibe_surf/langflow/template/frontend_node/base.py +214 -0
  2752. vibe_surf/langflow/template/frontend_node/constants.py +65 -0
  2753. vibe_surf/langflow/template/frontend_node/custom_components.py +97 -0
  2754. vibe_surf/langflow/template/template/__init__.py +0 -0
  2755. vibe_surf/langflow/template/template/base.py +99 -0
  2756. vibe_surf/langflow/template/utils.py +217 -0
  2757. vibe_surf/langflow/type_extraction/__init__.py +0 -0
  2758. vibe_surf/langflow/type_extraction/type_extraction.py +78 -0
  2759. vibe_surf/langflow/utils/__init__.py +0 -0
  2760. vibe_surf/langflow/utils/async_helpers.py +42 -0
  2761. vibe_surf/langflow/utils/component_utils.py +147 -0
  2762. vibe_surf/langflow/utils/compression.py +19 -0
  2763. vibe_surf/langflow/utils/concurrency.py +60 -0
  2764. vibe_surf/langflow/utils/connection_string_parser.py +8 -0
  2765. vibe_surf/langflow/utils/constants.py +205 -0
  2766. vibe_surf/langflow/utils/data_structure.py +212 -0
  2767. vibe_surf/langflow/utils/image.py +102 -0
  2768. vibe_surf/langflow/utils/lazy_load.py +15 -0
  2769. vibe_surf/langflow/utils/migration.py +61 -0
  2770. vibe_surf/langflow/utils/payload.py +84 -0
  2771. vibe_surf/langflow/utils/schemas.py +117 -0
  2772. vibe_surf/langflow/utils/template_validation.py +284 -0
  2773. vibe_surf/langflow/utils/util.py +479 -0
  2774. vibe_surf/langflow/utils/util_strings.py +56 -0
  2775. vibe_surf/langflow/utils/validate.py +489 -0
  2776. vibe_surf/langflow/utils/version.py +72 -0
  2777. vibe_surf/langflow/utils/voice_utils.py +92 -0
  2778. vibe_surf/langflow/worker.py +37 -0
  2779. vibe_surf/llm/openai_compatible.py +36 -19
  2780. vibe_surf/logger.py +3 -3
  2781. vibe_surf/telemetry/__init__.py +60 -0
  2782. vibe_surf/telemetry/service.py +113 -0
  2783. vibe_surf/telemetry/views.py +188 -0
  2784. vibe_surf/tools/browser_use_tools.py +206 -134
  2785. vibe_surf/tools/composio_client.py +458 -0
  2786. vibe_surf/tools/file_system.py +9 -5
  2787. vibe_surf/tools/finance_tools.py +629 -0
  2788. vibe_surf/tools/mcp_client.py +21 -2
  2789. vibe_surf/tools/report_writer_tools.py +2 -1
  2790. vibe_surf/tools/utils.py +1540 -0
  2791. vibe_surf/tools/vibesurf_registry.py +52 -0
  2792. vibe_surf/tools/vibesurf_tools.py +1376 -83
  2793. vibe_surf/tools/views.py +215 -4
  2794. vibe_surf/tools/website_api/__init__.py +0 -0
  2795. vibe_surf/tools/website_api/douyin/__init__.py +0 -0
  2796. vibe_surf/tools/website_api/douyin/client.py +861 -0
  2797. vibe_surf/tools/website_api/douyin/helpers.py +239 -0
  2798. vibe_surf/tools/website_api/weibo/__init__.py +0 -0
  2799. vibe_surf/tools/website_api/weibo/client.py +777 -0
  2800. vibe_surf/tools/website_api/weibo/helpers.py +997 -0
  2801. vibe_surf/tools/website_api/xhs/__init__.py +0 -0
  2802. vibe_surf/tools/website_api/xhs/client.py +814 -0
  2803. vibe_surf/tools/website_api/xhs/helpers.py +302 -0
  2804. vibe_surf/tools/website_api/youtube/__init__.py +32 -0
  2805. vibe_surf/tools/website_api/youtube/client.py +1267 -0
  2806. vibe_surf/tools/website_api/youtube/helpers.py +420 -0
  2807. vibe_surf/utils.py +34 -0
  2808. vibe_surf/workflows/Browser/browser_click_element.py +189 -0
  2809. vibe_surf/workflows/Browser/browser_drag_drop.py +81 -0
  2810. vibe_surf/workflows/Browser/browser_evaluate_js.py +178 -0
  2811. vibe_surf/workflows/Browser/browser_extract_content.py +197 -0
  2812. vibe_surf/workflows/Browser/browser_focus_element.py +153 -0
  2813. vibe_surf/workflows/Browser/browser_generate_js.py +85 -0
  2814. vibe_surf/workflows/Browser/browser_go_back.py +45 -0
  2815. vibe_surf/workflows/Browser/browser_go_forward.py +44 -0
  2816. vibe_surf/workflows/Browser/browser_hover_element.py +154 -0
  2817. vibe_surf/workflows/Browser/browser_html_content.py +73 -0
  2818. vibe_surf/workflows/Browser/browser_input_text.py +169 -0
  2819. vibe_surf/workflows/Browser/browser_navigate.py +50 -0
  2820. vibe_surf/workflows/Browser/browser_new_tab.py +50 -0
  2821. vibe_surf/workflows/Browser/browser_page_info.py +67 -0
  2822. vibe_surf/workflows/Browser/browser_press_key.py +51 -0
  2823. vibe_surf/workflows/Browser/browser_reload.py +44 -0
  2824. vibe_surf/workflows/Browser/browser_scroll.py +99 -0
  2825. vibe_surf/workflows/Browser/browser_search.py +88 -0
  2826. vibe_surf/workflows/Browser/browser_select_options.py +94 -0
  2827. vibe_surf/workflows/Browser/browser_session.py +54 -0
  2828. vibe_surf/workflows/Browser/browser_take_screenshot.py +76 -0
  2829. vibe_surf/workflows/Browser/browser_upload_file.py +178 -0
  2830. vibe_surf/workflows/Browser/browser_wait.py +46 -0
  2831. vibe_surf/workflows/Browser/close_browser_session.py +51 -0
  2832. vibe_surf/workflows/FileSystem/extract_content_from_file.py +112 -0
  2833. vibe_surf/workflows/FileSystem/load_json.py +136 -0
  2834. vibe_surf/workflows/Integrations/composio_api.py +279 -0
  2835. vibe_surf/workflows/Integrations/douyin.py +232 -0
  2836. vibe_surf/workflows/Integrations/dropbox_compnent.py +11 -0
  2837. vibe_surf/workflows/Integrations/github_composio.py +11 -0
  2838. vibe_surf/workflows/Integrations/gmail_composio.py +38 -0
  2839. vibe_surf/workflows/Integrations/googlecalendar_composio.py +11 -0
  2840. vibe_surf/workflows/Integrations/googlemeet_composio.py +11 -0
  2841. vibe_surf/workflows/Integrations/googletasks_composio.py +8 -0
  2842. vibe_surf/workflows/Integrations/linear_composio.py +11 -0
  2843. vibe_surf/workflows/Integrations/outlook_composio.py +11 -0
  2844. vibe_surf/workflows/Integrations/reddit_composio.py +11 -0
  2845. vibe_surf/workflows/Integrations/slack_composio.py +11 -0
  2846. vibe_surf/workflows/Integrations/slackbot_composio.py +11 -0
  2847. vibe_surf/workflows/Integrations/supabase_composio.py +11 -0
  2848. vibe_surf/workflows/Integrations/todoist_composio.py +11 -0
  2849. vibe_surf/workflows/Integrations/weibo.py +244 -0
  2850. vibe_surf/workflows/Integrations/xiaohongshu.py +229 -0
  2851. vibe_surf/workflows/Integrations/yahoo.py +103 -0
  2852. vibe_surf/workflows/Integrations/youtube.py +251 -0
  2853. vibe_surf/workflows/Integrations/youtube_composio.py +11 -0
  2854. vibe_surf/workflows/VibeSurf/advanced_search.py +166 -0
  2855. vibe_surf/workflows/VibeSurf/browser_use_agent.py +150 -0
  2856. vibe_surf/workflows/VibeSurf/llm_profiles.py +103 -0
  2857. vibe_surf/workflows/VibeSurf/select_dataframe.py +44 -0
  2858. vibe_surf/workflows/VibeSurf/variable_manager.py +140 -0
  2859. vibe_surf/workflows/VibeSurf/vibesurf_agent.py +113 -0
  2860. vibesurf-0.2.6.dist-info/METADATA +406 -0
  2861. vibesurf-0.2.6.dist-info/RECORD +2916 -0
  2862. vibesurf-0.2.6.dist-info/licenses/LICENSE +22 -0
  2863. vibesurf-0.1.21.dist-info/METADATA +0 -125
  2864. vibesurf-0.1.21.dist-info/RECORD +0 -101
  2865. vibesurf-0.1.21.dist-info/licenses/LICENSE +0 -201
  2866. {vibesurf-0.1.21.dist-info → vibesurf-0.2.6.dist-info}/WHEEL +0 -0
  2867. {vibesurf-0.1.21.dist-info → vibesurf-0.2.6.dist-info}/entry_points.txt +0 -0
  2868. {vibesurf-0.1.21.dist-info → vibesurf-0.2.6.dist-info}/top_level.txt +0 -0
@@ -18,18 +18,20 @@ class VibeSurfUIManager {
18
18
  this.fileManager = null;
19
19
  this.modalManager = null;
20
20
  this.voiceRecorder = null;
21
-
21
+
22
22
  // Initialize user settings storage
23
23
  this.userSettingsStorage = null;
24
-
24
+
25
25
  // Track if we're currently restoring selections to prevent override
26
26
  this.isRestoringSelections = false;
27
-
27
+
28
28
  this.bindElements();
29
29
  this.initializeTabSelector(); // Initialize tab selector before binding events
30
+ this.initializeSkillSelector(); // Initialize skill selector
30
31
  this.initializeManagers();
31
32
  this.bindEvents();
32
33
  this.setupSessionListeners();
34
+ this.initializeSocialLinks();
33
35
  }
34
36
 
35
37
  bindElements() {
@@ -37,36 +39,41 @@ class VibeSurfUIManager {
37
39
  this.elements = {
38
40
  // Header elements
39
41
  newSessionBtn: document.getElementById('new-session-btn'),
42
+ upgradeBtn: document.getElementById('upgrade-btn'),
40
43
  historyBtn: document.getElementById('history-btn'),
41
44
  settingsBtn: document.getElementById('settings-btn'),
42
-
45
+
43
46
  // Session info
44
47
  sessionId: document.getElementById('session-id'),
45
48
  copySessionBtn: document.getElementById('copy-session-btn'),
46
-
49
+
47
50
  // Activity area
48
51
  activityLog: document.getElementById('activity-log'),
49
-
52
+
50
53
  // Control panel
51
54
  controlPanel: document.getElementById('control-panel'),
52
55
  cancelBtn: document.getElementById('cancel-btn'),
53
56
  resumeBtn: document.getElementById('resume-btn'),
54
57
  terminateBtn: document.getElementById('terminate-btn'),
55
-
58
+
56
59
  // Input area
57
60
  llmProfileSelect: document.getElementById('llm-profile-select'),
58
61
  agentModeSelect: document.getElementById('agent-mode-select'),
59
62
  taskInput: document.getElementById('task-input'),
60
63
  sendBtn: document.getElementById('send-btn'),
61
64
  voiceRecordBtn: document.getElementById('voice-record-btn'),
62
-
65
+
63
66
  // Tab selector elements
64
67
  tabSelectorDropdown: document.getElementById('tab-selector-dropdown'),
65
68
  tabSelectorCancel: document.getElementById('tab-selector-cancel'),
66
69
  tabSelectorConfirm: document.getElementById('tab-selector-confirm'),
67
70
  selectAllTabs: document.getElementById('select-all-tabs'),
68
71
  tabOptionsList: document.getElementById('tab-options-list'),
69
-
72
+
73
+ // Skill selector elements
74
+ skillSelectorDropdown: document.getElementById('skill-selector-dropdown'),
75
+ skillOptionsList: document.getElementById('skill-options-list'),
76
+
70
77
  // Loading
71
78
  loadingOverlay: document.getElementById('loading-overlay')
72
79
  };
@@ -84,23 +91,23 @@ class VibeSurfUIManager {
84
91
  try {
85
92
  // Initialize modal manager first (others may depend on it)
86
93
  this.modalManager = new VibeSurfModalManager();
87
-
94
+
88
95
  // Initialize user settings storage
89
96
  this.userSettingsStorage = new VibeSurfUserSettingsStorage();
90
-
97
+
91
98
  // Initialize voice recorder
92
99
  this.voiceRecorder = new VibeSurfVoiceRecorder(this.apiClient);
93
100
  this.setupVoiceRecorderCallbacks();
94
-
101
+
95
102
  // Initialize other managers
96
103
  this.settingsManager = new VibeSurfSettingsManager(this.apiClient);
97
104
  this.historyManager = new VibeSurfHistoryManager(this.apiClient);
98
105
  this.fileManager = new VibeSurfFileManager(this.sessionManager);
99
-
106
+
100
107
  // Set up inter-manager communication
101
108
  this.setupManagerEvents();
102
-
103
-
109
+
110
+
104
111
  } catch (error) {
105
112
  console.error('[UIManager] Failed to initialize managers:', error);
106
113
  this.showNotification('Failed to initialize UI components', 'error');
@@ -115,15 +122,15 @@ class VibeSurfUIManager {
115
122
  if (!this.isRestoringSelections) {
116
123
  this.updateLLMProfileSelect();
117
124
  }
118
-
125
+
119
126
  // Also update voice button state when profiles are updated (ASR profiles might have changed)
120
127
  this.updateVoiceButtonState();
121
128
  });
122
-
129
+
123
130
  this.settingsManager.on('notification', (data) => {
124
131
  this.showNotification(data.message, data.type);
125
132
  });
126
-
133
+
127
134
  this.settingsManager.on('loading', (data) => {
128
135
  if (data.hide) {
129
136
  this.hideLoading();
@@ -131,12 +138,12 @@ class VibeSurfUIManager {
131
138
  this.showLoading(data.message);
132
139
  }
133
140
  });
134
-
141
+
135
142
  this.settingsManager.on('error', (data) => {
136
143
  console.error('[UIManager] Settings error:', data.error);
137
144
  this.showNotification(data.message || 'Settings error occurred', 'error');
138
145
  });
139
-
146
+
140
147
  this.settingsManager.on('confirmDeletion', (data) => {
141
148
  this.modalManager.showConfirmModal(
142
149
  'Delete Profile',
@@ -151,12 +158,12 @@ class VibeSurfUIManager {
151
158
  }
152
159
  );
153
160
  });
154
-
161
+
155
162
  this.settingsManager.on('selectNewDefault', (data) => {
156
163
  const options = data.otherProfiles.map(profile =>
157
164
  `<option value="${profile.profile_name}">${profile.profile_name}</option>`
158
165
  ).join('');
159
-
166
+
160
167
  const modalData = this.modalManager.createModal(`
161
168
  <div class="select-default-modal">
162
169
  <p>You are deleting the default LLM profile. Please select a new default profile:</p>
@@ -171,11 +178,11 @@ class VibeSurfUIManager {
171
178
  `, {
172
179
  title: 'Select New Default Profile'
173
180
  });
174
-
181
+
175
182
  const select = document.getElementById('new-default-select');
176
183
  const confirmBtn = modalData.modal.querySelector('.confirm-btn');
177
184
  const cancelBtn = modalData.modal.querySelector('.cancel-btn');
178
-
185
+
179
186
  confirmBtn.addEventListener('click', () => {
180
187
  const newDefaultId = select.value;
181
188
  if (newDefaultId && data.callback) {
@@ -183,17 +190,17 @@ class VibeSurfUIManager {
183
190
  }
184
191
  modalData.close();
185
192
  });
186
-
193
+
187
194
  cancelBtn.addEventListener('click', () => {
188
195
  modalData.close();
189
196
  });
190
197
  });
191
-
198
+
192
199
  // History Manager Events
193
200
  this.historyManager.on('loadSession', (data) => {
194
201
  this.loadSession(data.sessionId);
195
202
  });
196
-
203
+
197
204
  this.historyManager.on('loading', (data) => {
198
205
  if (data.hide) {
199
206
  this.hideLoading();
@@ -201,16 +208,16 @@ class VibeSurfUIManager {
201
208
  this.showLoading(data.message);
202
209
  }
203
210
  });
204
-
211
+
205
212
  this.historyManager.on('notification', (data) => {
206
213
  this.showNotification(data.message, data.type);
207
214
  });
208
-
215
+
209
216
  this.historyManager.on('error', (data) => {
210
217
  console.error('[UIManager] History error:', data.error);
211
218
  this.showNotification(data.message || 'History error occurred', 'error');
212
219
  });
213
-
220
+
214
221
  // File Manager Events
215
222
  this.fileManager.on('loading', (data) => {
216
223
  if (data.hide) {
@@ -219,16 +226,16 @@ class VibeSurfUIManager {
219
226
  this.showLoading(data.message);
220
227
  }
221
228
  });
222
-
229
+
223
230
  this.fileManager.on('notification', (data) => {
224
231
  this.showNotification(data.message, data.type);
225
232
  });
226
-
233
+
227
234
  this.fileManager.on('error', (data) => {
228
235
  console.error('[UIManager] File error:', data.error);
229
236
  this.showNotification(data.message || 'File error occurred', 'error');
230
237
  });
231
-
238
+
232
239
  // Modal Manager Events (if needed for future extensions)
233
240
  this.modalManager.on('modalClosed', (data) => {
234
241
  // Handle modal close events if needed
@@ -271,7 +278,7 @@ class VibeSurfUIManager {
271
278
  this.elements.voiceRecordBtn.classList.remove('recording');
272
279
  this.elements.voiceRecordBtn.setAttribute('title', 'Voice Input');
273
280
  this.elements.voiceRecordBtn.setAttribute('data-tooltip', 'Click to start voice recording');
274
-
281
+
275
282
  // Clear duration display
276
283
  this.updateRecordingDuration('0:00', 0);
277
284
  }
@@ -283,7 +290,7 @@ class VibeSurfUIManager {
283
290
  if (this.elements.voiceRecordBtn) {
284
291
  // Update the tooltip with duration
285
292
  this.elements.voiceRecordBtn.setAttribute('data-tooltip', `Recording... ${formattedDuration} - Click to stop`);
286
-
293
+
287
294
  // Create or update duration display element
288
295
  let durationElement = this.elements.voiceRecordBtn.querySelector('.recording-duration');
289
296
  if (!durationElement) {
@@ -291,7 +298,7 @@ class VibeSurfUIManager {
291
298
  durationElement.className = 'recording-duration';
292
299
  this.elements.voiceRecordBtn.appendChild(durationElement);
293
300
  }
294
-
301
+
295
302
  durationElement.textContent = formattedDuration;
296
303
  }
297
304
  }
@@ -306,29 +313,29 @@ class VibeSurfUIManager {
306
313
  // Insert transcribed text into the input field
307
314
  const currentValue = this.elements.taskInput.value;
308
315
  const cursorPosition = this.elements.taskInput.selectionStart;
309
-
316
+
310
317
  // Insert at cursor position or append to end
311
318
  const beforeCursor = currentValue.substring(0, cursorPosition);
312
319
  const afterCursor = currentValue.substring(cursorPosition);
313
320
  const newValue = beforeCursor + transcribedText + afterCursor;
314
-
321
+
315
322
  this.elements.taskInput.value = newValue;
316
-
323
+
317
324
  // Trigger input change event for validation and auto-resize
318
325
  this.handleTaskInputChange({ target: this.elements.taskInput });
319
-
326
+
320
327
  // Set cursor position after the inserted text
321
328
  const newCursorPosition = cursorPosition + transcribedText.length;
322
329
  this.elements.taskInput.setSelectionRange(newCursorPosition, newCursorPosition);
323
330
  this.elements.taskInput.focus();
324
-
331
+
325
332
  this.showNotification('Voice transcription completed', 'success');
326
333
  }
327
334
 
328
335
  // Handle transcription errors
329
336
  handleTranscriptionError(errorMessage, errorType) {
330
337
  let userMessage = 'Voice transcription failed';
331
-
338
+
332
339
  if (errorType === 'recording') {
333
340
  userMessage = `Recording failed: ${errorMessage}`;
334
341
  } else if (errorType === 'transcription') {
@@ -338,45 +345,46 @@ class VibeSurfUIManager {
338
345
  userMessage = `Transcription failed: ${errorMessage}`;
339
346
  }
340
347
  }
341
-
348
+
342
349
  this.showNotification(userMessage, 'error');
343
350
  }
344
351
 
345
352
  bindEvents() {
346
353
  // Header buttons
347
354
  this.elements.newSessionBtn?.addEventListener('click', this.handleNewSession.bind(this));
355
+ this.elements.upgradeBtn?.addEventListener('click', this.handleUpgrade.bind(this));
348
356
  this.elements.historyBtn?.addEventListener('click', this.handleShowHistory.bind(this));
349
357
  this.elements.settingsBtn?.addEventListener('click', this.handleShowSettings.bind(this));
350
-
358
+
351
359
  // Session controls
352
360
  this.elements.copySessionBtn?.addEventListener('click', this.handleCopySession.bind(this));
353
-
361
+
354
362
  // Task controls
355
363
  this.elements.cancelBtn?.addEventListener('click', this.handleCancelTask.bind(this));
356
364
  this.elements.resumeBtn?.addEventListener('click', this.handleResumeTask.bind(this));
357
365
  this.elements.terminateBtn?.addEventListener('click', this.handleTerminateTask.bind(this));
358
-
366
+
359
367
  // Input handling
360
368
  this.elements.sendBtn?.addEventListener('click', this.handleSendTask.bind(this));
361
369
  this.elements.voiceRecordBtn?.addEventListener('click', this.handleVoiceRecord.bind(this));
362
-
370
+
363
371
  // Task input handling
364
372
  this.elements.taskInput?.addEventListener('keydown', this.handleTaskInputKeydown.bind(this));
365
373
  this.elements.taskInput?.addEventListener('input', this.handleTaskInputChange.bind(this));
366
-
374
+
367
375
  // LLM profile selection handling
368
376
  this.elements.llmProfileSelect?.addEventListener('change', this.handleLlmProfileChange.bind(this));
369
-
377
+
370
378
  // Agent mode selection handling
371
379
  this.elements.agentModeSelect?.addEventListener('change', this.handleAgentModeChange.bind(this));
372
-
380
+
373
381
  // Initialize auto-resize for textarea
374
382
  if (this.elements.taskInput) {
375
383
  this.autoResizeTextarea(this.elements.taskInput);
376
384
  // Set initial send button state
377
385
  this.handleTaskInputChange({ target: this.elements.taskInput });
378
386
  }
379
-
387
+
380
388
  // Bind initial task suggestions if present
381
389
  this.bindTaskSuggestionEvents();
382
390
  }
@@ -395,7 +403,7 @@ class VibeSurfUIManager {
395
403
  this.sessionManager.on('pollingStopped', this.handlePollingStopped.bind(this));
396
404
  this.sessionManager.on('sessionError', this.handleSessionError.bind(this));
397
405
  this.sessionManager.on('taskError', this.handleTaskError.bind(this));
398
-
406
+
399
407
  // Start periodic task status check
400
408
  this.startTaskStatusMonitoring();
401
409
  }
@@ -411,11 +419,11 @@ class VibeSurfUIManager {
411
419
  handleSessionLoaded(data) {
412
420
  // Update session display
413
421
  this.updateSessionDisplay(data.sessionId);
414
-
422
+
415
423
  // Load and display activity logs
416
424
  const activityLogs = this.sessionManager.getActivityLogs();
417
425
  this.displayActivityLogs(activityLogs);
418
-
426
+
419
427
  // Update control panel
420
428
  const taskStatus = this.sessionManager.getTaskStatus();
421
429
  if (taskStatus) {
@@ -424,7 +432,7 @@ class VibeSurfUIManager {
424
432
  }
425
433
 
426
434
  handleTaskSubmitted(data) {
427
-
435
+
428
436
  this.updateControlPanel('running');
429
437
  this.clearTaskInput();
430
438
  }
@@ -449,26 +457,26 @@ class VibeSurfUIManager {
449
457
  }
450
458
 
451
459
  handleTaskCompleted(data) {
452
-
453
-
460
+
461
+
454
462
  const message = data.status === 'done' ? 'Task completed successfully!' : 'Task completed with errors';
455
463
  const type = data.status === 'done' ? 'success' : 'error';
456
-
464
+
457
465
  // Check if we need to respect minimum visibility period
458
466
  if (this.controlPanelMinVisibilityActive) {
459
-
467
+
460
468
  const remainingTime = 1000;
461
469
  setTimeout(() => {
462
-
470
+
463
471
  this.updateControlPanel('ready');
464
472
  }, remainingTime);
465
473
  } else {
466
-
474
+
467
475
  this.updateControlPanel('ready');
468
476
  }
469
-
477
+
470
478
  this.showNotification(message, type);
471
-
479
+
472
480
  // Clear uploaded files when task is completed
473
481
  this.fileManager.clearUploadedFiles();
474
482
  }
@@ -493,17 +501,17 @@ class VibeSurfUIManager {
493
501
 
494
502
  handleTaskError(data) {
495
503
  console.error('[UIManager] Task error:', data.error);
496
-
497
-
504
+
505
+
498
506
  // Check if this is an LLM connection failure
499
507
  if (data.error && typeof data.error === 'object' && data.error.error === 'llm_connection_failed') {
500
-
508
+
501
509
  // Show LLM connection failed modal instead of generic notification
502
510
  this.showLLMConnectionFailedModal(data.error);
503
511
  this.updateControlPanel('ready'); // Reset UI since task failed to start
504
512
  return;
505
513
  } else if (data.error && typeof data.error === 'string' && data.error.includes('llm_connection_failed')) {
506
-
514
+
507
515
  // Handle case where error is a string containing the error type
508
516
  this.showLLMConnectionFailedModal({
509
517
  message: data.error,
@@ -512,20 +520,20 @@ class VibeSurfUIManager {
512
520
  this.updateControlPanel('ready'); // Reset UI since task failed to start
513
521
  return;
514
522
  }
515
-
523
+
516
524
  // Default error handling for other types of errors
517
525
  this.showNotification(`Task error: ${data.error}`, 'error');
518
-
526
+
519
527
  this.updateControlPanel('error');
520
-
528
+
521
529
  // Optional: Verify task status after a delay
522
530
  setTimeout(() => {
523
531
  this.checkTaskStatus().then(status => {
524
532
  if (!status.isRunning) {
525
-
533
+
526
534
  this.updateControlPanel('ready');
527
535
  } else {
528
-
536
+
529
537
  }
530
538
  }).catch(err => {
531
539
  console.warn('[UIManager] Could not verify task status after error:', err);
@@ -538,15 +546,15 @@ class VibeSurfUIManager {
538
546
  try {
539
547
  const statusCheck = await this.apiClient.checkTaskRunning();
540
548
  const wasRunning = this.state.isTaskRunning;
541
-
549
+
542
550
  this.state.isTaskRunning = statusCheck.isRunning;
543
551
  this.state.taskInfo = statusCheck.taskInfo;
544
-
552
+
545
553
  // Update UI state when task status changes
546
554
  if (wasRunning !== statusCheck.isRunning) {
547
555
  this.updateUIForTaskStatus(statusCheck.isRunning);
548
556
  }
549
-
557
+
550
558
  return statusCheck;
551
559
  } catch (error) {
552
560
  console.error('[UIManager] Failed to check task status:', error);
@@ -571,7 +579,7 @@ class VibeSurfUIManager {
571
579
  updateUIForTaskStatus(isRunning) {
572
580
  const taskStatus = this.sessionManager.getTaskStatus();
573
581
  const isPaused = taskStatus === 'paused';
574
-
582
+
575
583
  // Disable/enable input elements based on task status
576
584
  if (this.elements.taskInput) {
577
585
  // Allow input when paused or not running
@@ -581,25 +589,25 @@ class VibeSurfUIManager {
581
589
  } else if (isRunning) {
582
590
  this.elements.taskInput.placeholder = 'Task is running - please wait...';
583
591
  } else {
584
- this.elements.taskInput.placeholder = 'Enter your task description...';
592
+ this.elements.taskInput.placeholder = 'Ask anything (/ for skills, @ to specify tab)';
585
593
  }
586
594
  }
587
-
595
+
588
596
  if (this.elements.sendBtn) {
589
597
  // Enable send button when paused or when can submit new task
590
598
  this.elements.sendBtn.disabled = (isRunning && !isPaused) || (!isPaused && !this.canSubmitTask()) || (isPaused && !this.canAddNewTask());
591
599
  }
592
-
600
+
593
601
  if (this.elements.llmProfileSelect) {
594
602
  // Allow LLM profile change only when not running
595
603
  this.elements.llmProfileSelect.disabled = isRunning && !isPaused;
596
604
  }
597
-
605
+
598
606
  if (this.elements.agentModeSelect) {
599
607
  // Allow agent mode change only when not running
600
608
  this.elements.agentModeSelect.disabled = isRunning && !isPaused;
601
609
  }
602
-
610
+
603
611
  // Update voice record button state - disable during task execution unless paused
604
612
  if (this.elements.voiceRecordBtn) {
605
613
  const shouldDisableVoice = isRunning && !isPaused;
@@ -616,17 +624,17 @@ class VibeSurfUIManager {
616
624
  }
617
625
  }
618
626
  }
619
-
627
+
620
628
  // Update file manager state - keep disabled during pause (as per requirement)
621
629
  this.fileManager.setEnabled(!isRunning);
622
-
630
+
623
631
  // Also disable header buttons when task is running (but not when paused)
624
632
  const headerButtons = [
625
633
  this.elements.newSessionBtn,
626
634
  this.elements.historyBtn,
627
635
  this.elements.settingsBtn
628
636
  ];
629
-
637
+
630
638
  headerButtons.forEach(button => {
631
639
  if (button) {
632
640
  const shouldDisable = isRunning && !isPaused;
@@ -643,45 +651,45 @@ class VibeSurfUIManager {
643
651
  }
644
652
 
645
653
  forceUpdateUIForPausedState() {
646
-
654
+
647
655
  // Enable input during pause
648
656
  if (this.elements.taskInput) {
649
657
  this.elements.taskInput.disabled = false;
650
658
  this.elements.taskInput.placeholder = 'Add additional information or guidance...';
651
659
  }
652
-
660
+
653
661
  if (this.elements.sendBtn) {
654
662
  const hasText = this.elements.taskInput?.value.trim().length > 0;
655
663
  this.elements.sendBtn.disabled = !hasText;
656
664
  }
657
-
665
+
658
666
  // Enable voice record button during pause
659
667
  if (this.elements.voiceRecordBtn) {
660
668
  this.elements.voiceRecordBtn.disabled = false;
661
669
  this.elements.voiceRecordBtn.classList.remove('task-running-disabled');
662
670
  this.elements.voiceRecordBtn.setAttribute('title', 'Click to start voice recording');
663
671
  }
664
-
672
+
665
673
  // Keep LLM profile disabled during pause (user doesn't need to change it)
666
674
  if (this.elements.llmProfileSelect) {
667
675
  this.elements.llmProfileSelect.disabled = true;
668
676
  }
669
-
677
+
670
678
  // Keep agent mode disabled during pause (user doesn't need to change it)
671
679
  if (this.elements.agentModeSelect) {
672
680
  this.elements.agentModeSelect.disabled = true;
673
681
  }
674
-
682
+
675
683
  // Keep file manager disabled during pause
676
684
  this.fileManager.setEnabled(false);
677
-
685
+
678
686
  // Keep header buttons disabled during pause (only input, send, and voice should be available)
679
687
  const headerButtons = [
680
688
  this.elements.newSessionBtn,
681
689
  this.elements.historyBtn,
682
690
  this.elements.settingsBtn
683
691
  ];
684
-
692
+
685
693
  headerButtons.forEach(button => {
686
694
  if (button) {
687
695
  button.disabled = true;
@@ -692,43 +700,43 @@ class VibeSurfUIManager {
692
700
  }
693
701
 
694
702
  forceUpdateUIForRunningState() {
695
-
696
-
703
+
704
+
697
705
  // Disable input during running
698
706
  if (this.elements.taskInput) {
699
707
  this.elements.taskInput.disabled = true;
700
708
  this.elements.taskInput.placeholder = 'Task is running - please wait...';
701
709
  }
702
-
710
+
703
711
  if (this.elements.sendBtn) {
704
712
  this.elements.sendBtn.disabled = true;
705
713
  }
706
-
714
+
707
715
  if (this.elements.llmProfileSelect) {
708
716
  this.elements.llmProfileSelect.disabled = true;
709
717
  }
710
-
718
+
711
719
  if (this.elements.agentModeSelect) {
712
720
  this.elements.agentModeSelect.disabled = true;
713
721
  }
714
-
722
+
715
723
  // Disable voice record button during running
716
724
  if (this.elements.voiceRecordBtn) {
717
725
  this.elements.voiceRecordBtn.disabled = true;
718
726
  this.elements.voiceRecordBtn.classList.add('task-running-disabled');
719
727
  this.elements.voiceRecordBtn.setAttribute('title', 'Voice input disabled while task is running');
720
728
  }
721
-
729
+
722
730
  // Update file manager state
723
731
  this.fileManager.setEnabled(false);
724
-
732
+
725
733
  // Disable header buttons when task is running
726
734
  const headerButtons = [
727
735
  this.elements.newSessionBtn,
728
736
  this.elements.historyBtn,
729
737
  this.elements.settingsBtn
730
738
  ];
731
-
739
+
732
740
  headerButtons.forEach(button => {
733
741
  if (button) {
734
742
  button.disabled = true;
@@ -754,7 +762,7 @@ class VibeSurfUIManager {
754
762
  const taskInfo = this.state.taskInfo;
755
763
  const taskId = taskInfo?.task_id || 'unknown';
756
764
  const sessionId = taskInfo?.session_id || 'unknown';
757
-
765
+
758
766
  return this.modalManager.showConfirmModalAsync(
759
767
  'Task Currently Running',
760
768
  `A task is currently ${taskInfo?.status || 'running'}. You must stop the current task before you can ${action}.`,
@@ -783,12 +791,12 @@ class VibeSurfUIManager {
783
791
  const canProceed = await this.showTaskRunningWarning('create a new session');
784
792
  if (!canProceed) return;
785
793
  }
786
-
794
+
787
795
  try {
788
796
  this.showLoading('Creating new session...');
789
-
797
+
790
798
  const sessionId = await this.sessionManager.createSession();
791
-
799
+
792
800
  this.hideLoading();
793
801
  } catch (error) {
794
802
  this.hideLoading();
@@ -803,7 +811,7 @@ class VibeSurfUIManager {
803
811
  const canProceed = await this.showTaskRunningWarning('view session history');
804
812
  if (!canProceed) return;
805
813
  }
806
-
814
+
807
815
  this.historyManager.showHistory();
808
816
  }
809
817
 
@@ -814,7 +822,7 @@ class VibeSurfUIManager {
814
822
  const canProceed = await this.showTaskRunningWarning('access settings');
815
823
  if (!canProceed) return;
816
824
  }
817
-
825
+
818
826
  this.settingsManager.showSettings();
819
827
  }
820
828
 
@@ -825,10 +833,10 @@ class VibeSurfUIManager {
825
833
  const canProceed = await this.showTaskRunningWarning('access settings');
826
834
  if (!canProceed) return;
827
835
  }
828
-
836
+
829
837
  // Show settings and navigate directly to LLM profiles tab
830
838
  this.settingsManager.showSettings();
831
-
839
+
832
840
  // Switch to LLM profiles tab after settings are shown
833
841
  setTimeout(() => {
834
842
  const llmTab = document.querySelector('.settings-tab[data-tab="llm-profiles"]');
@@ -840,12 +848,12 @@ class VibeSurfUIManager {
840
848
 
841
849
  async handleCopySession() {
842
850
  const sessionId = this.sessionManager.getCurrentSessionId();
843
-
851
+
844
852
  if (!sessionId) {
845
853
  this.showNotification('No active session to copy', 'warning');
846
854
  return;
847
855
  }
848
-
856
+
849
857
  try {
850
858
  await navigator.clipboard.writeText(sessionId);
851
859
  this.showNotification('Session ID copied to clipboard!', 'success');
@@ -855,6 +863,47 @@ class VibeSurfUIManager {
855
863
  }
856
864
  }
857
865
 
866
+ // Upgrade Handler
867
+ async handleUpgrade() {
868
+ try {
869
+ console.log('[UIManager] Starting extension upgrade...');
870
+
871
+ // Download the latest extension zip from GitHub releases
872
+ const downloadUrl = 'https://github.com/vibesurf-ai/VibeSurf/releases/latest/download/vibesurf-extension.zip';
873
+
874
+ // Open download URL in new tab
875
+ const downloadResult = await chrome.runtime.sendMessage({
876
+ type: 'OPEN_FILE_URL',
877
+ data: { fileUrl: downloadUrl }
878
+ });
879
+
880
+ if (!downloadResult || !downloadResult.success) {
881
+ throw new Error(downloadResult?.error || 'Failed to open download URL');
882
+ }
883
+
884
+ console.log('[UIManager] Successfully opened download tab:', downloadResult.tabId);
885
+
886
+ // Also open chrome://extensions in a new tab
887
+ const extensionsResult = await chrome.runtime.sendMessage({
888
+ type: 'OPEN_FILE_URL',
889
+ data: { fileUrl: 'chrome://extensions' }
890
+ });
891
+
892
+ if (!extensionsResult || !extensionsResult.success) {
893
+ console.warn('[UIManager] Failed to open chrome://extensions:', extensionsResult?.error);
894
+ // Don't throw error here as download was successful
895
+ } else {
896
+ console.log('[UIManager] Successfully opened chrome://extensions tab:', extensionsResult.tabId);
897
+ }
898
+
899
+ this.showNotification('Extension download started and chrome://extensions opened. Please follow the installation instructions.', 'info');
900
+
901
+ } catch (error) {
902
+ console.error('[UIManager] Upgrade failed:', error);
903
+ this.showNotification(`Failed to start upgrade: ${error.message}`, 'error');
904
+ }
905
+ }
906
+
858
907
  // Voice Recording UI Handler
859
908
  async handleVoiceRecord() {
860
909
  // Check if voice recording is supported
@@ -874,12 +923,12 @@ class VibeSurfUIManager {
874
923
  // Enhanced task status check - disable recording during task execution unless paused
875
924
  const taskStatus = this.sessionManager.getTaskStatus();
876
925
  const isTaskRunning = this.state.isTaskRunning;
877
-
926
+
878
927
  if (isTaskRunning && taskStatus !== 'paused') {
879
928
  this.showNotification('Cannot record voice while task is running. Stop the current task or wait for it to complete.', 'warning');
880
929
  return;
881
930
  }
882
-
931
+
883
932
  // Additional check: if task is paused, allow voice input but show info message
884
933
  if (isTaskRunning && taskStatus === 'paused') {
885
934
  console.log('[UIManager] Task is paused, allowing voice input');
@@ -900,15 +949,15 @@ class VibeSurfUIManager {
900
949
  } else {
901
950
  // Start recording
902
951
  console.log('[UIManager] Starting voice recording');
903
-
952
+
904
953
  // Request microphone permission first
905
954
  try {
906
955
  // For Chrome extensions, ensure we have proper user gesture context
907
956
  console.log('[UIManager] Requesting microphone permission with user gesture context');
908
-
957
+
909
958
  // Add a small delay to ensure user gesture is properly registered
910
959
  await new Promise(resolve => setTimeout(resolve, 100));
911
-
960
+
912
961
  const hasPermission = await this.voiceRecorder.requestMicrophonePermission();
913
962
  if (!hasPermission) {
914
963
  this.showNotification('Microphone permission denied. Please allow microphone access to use voice input.', 'error');
@@ -916,11 +965,11 @@ class VibeSurfUIManager {
916
965
  }
917
966
  } catch (permissionError) {
918
967
  console.error('[UIManager] Microphone permission error:', permissionError);
919
-
968
+
920
969
  // Handle different types of permission errors with detailed guidance
921
970
  let errorMessage = 'Microphone permission denied';
922
971
  let detailedHelp = '';
923
-
972
+
924
973
  if (permissionError.name === 'MicrophonePermissionError') {
925
974
  errorMessage = permissionError.message;
926
975
  if (permissionError.userAction) {
@@ -933,11 +982,11 @@ class VibeSurfUIManager {
933
982
  errorMessage = `Microphone access error: ${permissionError.message}`;
934
983
  detailedHelp = 'Please ensure your browser allows microphone access and that a microphone is connected.';
935
984
  }
936
-
985
+
937
986
  // Show detailed error message
938
987
  const fullMessage = detailedHelp ? `${errorMessage}\n\n${detailedHelp}` : errorMessage;
939
988
  this.showNotification(fullMessage, 'error');
940
-
989
+
941
990
  // Also log detailed error for debugging
942
991
  console.error('[UIManager] Detailed microphone permission error:', {
943
992
  name: permissionError.name,
@@ -945,7 +994,7 @@ class VibeSurfUIManager {
945
994
  userAction: permissionError.userAction,
946
995
  originalError: permissionError.originalError
947
996
  });
948
-
997
+
949
998
  this.updateVoiceRecordingUI(false);
950
999
  return;
951
1000
  }
@@ -962,9 +1011,7 @@ class VibeSurfUIManager {
962
1011
 
963
1012
  async handleSendTask() {
964
1013
  const taskDescription = this.elements.taskInput?.value.trim();
965
- const taskStatus = this.sessionManager.getTaskStatus();
966
- const isPaused = taskStatus === 'paused';
967
-
1014
+
968
1015
  if (!taskDescription) {
969
1016
  this.showNotification('Please enter a task description', 'warning');
970
1017
  this.elements.taskInput?.focus();
@@ -972,23 +1019,29 @@ class VibeSurfUIManager {
972
1019
  }
973
1020
 
974
1021
  try {
1022
+ // Check task status from session manager first (more reliable than API check)
1023
+ const sessionTaskStatus = this.sessionManager.getTaskStatus();
1024
+ const isPaused = sessionTaskStatus === 'paused';
1025
+
1026
+ console.log('[UIManager] handleSendTask - session task status:', sessionTaskStatus, 'isPaused:', isPaused);
1027
+
975
1028
  if (isPaused) {
976
1029
  // Handle adding new task to paused execution
977
-
1030
+
978
1031
  await this.sessionManager.addNewTaskToPaused(taskDescription);
979
-
1032
+
980
1033
  // Clear the input after successful addition
981
1034
  this.clearTaskInput();
982
1035
  this.showNotification('Additional information added to the task', 'success');
983
-
1036
+
984
1037
  // Automatically resume the task after adding new information
985
-
1038
+
986
1039
  await this.sessionManager.resumeTask('Auto-resume after adding new task information');
987
-
1040
+
988
1041
  return;
989
1042
  }
990
-
991
- // Original logic for new task submission
1043
+
1044
+ // For non-paused states, check if any task is running
992
1045
  const statusCheck = await this.checkTaskStatus();
993
1046
  if (statusCheck.isRunning) {
994
1047
  const canProceed = await this.showTaskRunningWarning('send a new task');
@@ -997,9 +1050,9 @@ class VibeSurfUIManager {
997
1050
  return;
998
1051
  }
999
1052
  }
1000
-
1053
+
1001
1054
  const llmProfile = this.elements.llmProfileSelect?.value;
1002
-
1055
+
1003
1056
  // Check if LLM profile is selected
1004
1057
  if (!llmProfile || llmProfile.trim() === '') {
1005
1058
  // Check if there are any LLM profiles available
@@ -1013,33 +1066,38 @@ class VibeSurfUIManager {
1013
1066
  }
1014
1067
  return;
1015
1068
  }
1016
-
1069
+
1017
1070
  // Immediately clear welcome message and show user request
1018
1071
  this.clearWelcomeMessage();
1019
-
1072
+
1020
1073
  const taskData = {
1021
1074
  task_description: taskDescription,
1022
1075
  llm_profile_name: llmProfile,
1023
1076
  agent_mode: this.elements.agentModeSelect?.value || 'thinking'
1024
1077
  };
1025
-
1078
+
1026
1079
  // Add uploaded files path if any
1027
1080
  const filePath = this.fileManager.getUploadedFilesForTask();
1028
1081
  if (filePath) {
1029
1082
  taskData.upload_files_path = filePath;
1030
-
1083
+
1031
1084
  }
1032
-
1085
+
1033
1086
  // Add selected tabs information if any
1034
1087
  const selectedTabsData = this.getSelectedTabsForTask();
1035
1088
  if (selectedTabsData) {
1036
1089
  taskData.selected_tabs = selectedTabsData;
1037
-
1038
1090
  }
1039
-
1040
-
1091
+
1092
+ // Add selected skills information if any
1093
+ const selectedSkillsData = this.getSelectedSkillsForTask();
1094
+ if (selectedSkillsData) {
1095
+ taskData.selected_skills = selectedSkillsData;
1096
+ }
1097
+
1098
+
1041
1099
  await this.sessionManager.submitTask(taskData);
1042
-
1100
+
1043
1101
  // Clear uploaded files after successful task submission
1044
1102
  this.fileManager.clearUploadedFiles();
1045
1103
  } catch (error) {
@@ -1075,9 +1133,9 @@ class VibeSurfUIManager {
1075
1133
  if (wasMonitoring) {
1076
1134
  this.stopTaskStatusMonitoring();
1077
1135
  }
1078
-
1136
+
1079
1137
  await this.sessionManager.stopTask('User clicked terminate');
1080
-
1138
+
1081
1139
  // Restart monitoring after a brief delay if it was running
1082
1140
  if (wasMonitoring) {
1083
1141
  setTimeout(() => {
@@ -1098,13 +1156,26 @@ class VibeSurfUIManager {
1098
1156
  this.handleSendTask();
1099
1157
  return;
1100
1158
  }
1101
-
1159
+
1102
1160
  // Handle tab token deletion
1103
1161
  if (event.key === 'Backspace' || event.key === 'Delete') {
1104
1162
  if (this.handleTabTokenDeletion(event)) {
1105
1163
  event.preventDefault();
1106
1164
  return;
1107
1165
  }
1166
+ // Also handle skill token deletion
1167
+ if (this.handleSkillTokenDeletion(event)) {
1168
+ event.preventDefault();
1169
+ return;
1170
+ }
1171
+ }
1172
+
1173
+ // Handle Tab key for skill auto-completion when only one skill matches
1174
+ if (event.key === 'Tab' && this.skillSelectorState.isVisible) {
1175
+ if (this.skillSelectorState.filteredSkills.length === 1) {
1176
+ event.preventDefault();
1177
+ this.selectSkill(this.skillSelectorState.filteredSkills[0]);
1178
+ }
1108
1179
  }
1109
1180
  }
1110
1181
 
@@ -1112,14 +1183,14 @@ class VibeSurfUIManager {
1112
1183
  const input = event.target;
1113
1184
  const cursorPos = input.selectionStart;
1114
1185
  const text = input.value;
1115
-
1186
+
1116
1187
  // Unicode markers for tab tokens
1117
1188
  const startMarker = '\u200B'; // Zero-width space
1118
1189
  const endMarker = '\u200C'; // Zero-width non-joiner
1119
-
1190
+
1120
1191
  let tokenStart = -1;
1121
1192
  let tokenEnd = -1;
1122
-
1193
+
1123
1194
  if (event.key === 'Backspace') {
1124
1195
  // Only delete if cursor is directly adjacent to end of token
1125
1196
  // Check if the character immediately before cursor is an endMarker
@@ -1147,49 +1218,103 @@ class VibeSurfUIManager {
1147
1218
  }
1148
1219
  }
1149
1220
  }
1150
-
1221
+
1151
1222
  // If we found a complete token, delete it
1152
1223
  if (tokenStart !== -1 && tokenEnd !== -1) {
1153
1224
  const beforeToken = text.substring(0, tokenStart);
1154
1225
  const afterToken = text.substring(tokenEnd);
1155
1226
  input.value = beforeToken + afterToken;
1156
1227
  input.setSelectionRange(tokenStart, tokenStart);
1157
-
1228
+
1158
1229
  // Trigger input change event for validation
1159
1230
  this.handleTaskInputChange({ target: input });
1160
-
1231
+
1161
1232
  return true; // Prevent default behavior
1162
1233
  }
1163
-
1234
+
1235
+ return false; // Allow default behavior
1236
+ }
1237
+
1238
+ handleSkillTokenDeletion(event) {
1239
+ const input = event.target;
1240
+ const cursorPos = input.selectionStart;
1241
+ const text = input.value;
1242
+
1243
+ // Unicode markers for skill tokens
1244
+ const startMarker = '\u200D'; // Zero-width joiner
1245
+ const endMarker = '\u200E'; // Left-to-right mark
1246
+
1247
+ let tokenStart = -1;
1248
+ let tokenEnd = -1;
1249
+
1250
+ if (event.key === 'Backspace') {
1251
+ // Only delete if cursor is directly adjacent to end of token
1252
+ if (cursorPos > 0 && text[cursorPos - 1] === endMarker) {
1253
+ tokenEnd = cursorPos; // Include the marker
1254
+ // Find the corresponding start marker backwards
1255
+ for (let j = cursorPos - 2; j >= 0; j--) {
1256
+ if (text[j] === startMarker) {
1257
+ tokenStart = j;
1258
+ break;
1259
+ }
1260
+ }
1261
+ }
1262
+ } else if (event.key === 'Delete') {
1263
+ // Only delete if cursor is directly adjacent to start of token
1264
+ if (cursorPos < text.length && text[cursorPos] === startMarker) {
1265
+ tokenStart = cursorPos;
1266
+ // Find the corresponding end marker forwards
1267
+ for (let j = cursorPos + 1; j < text.length; j++) {
1268
+ if (text[j] === endMarker) {
1269
+ tokenEnd = j + 1; // Include the marker
1270
+ break;
1271
+ }
1272
+ }
1273
+ }
1274
+ }
1275
+
1276
+ // If we found a complete token, delete it
1277
+ if (tokenStart !== -1 && tokenEnd !== -1) {
1278
+ const beforeToken = text.substring(0, tokenStart);
1279
+ const afterToken = text.substring(tokenEnd);
1280
+ input.value = beforeToken + afterToken;
1281
+ input.setSelectionRange(tokenStart, tokenStart);
1282
+
1283
+ // Trigger input change event for validation
1284
+ this.handleTaskInputChange({ target: input });
1285
+
1286
+ return true; // Prevent default behavior
1287
+ }
1288
+
1164
1289
  return false; // Allow default behavior
1165
1290
  }
1166
1291
 
1167
1292
  async handleLlmProfileChange(event) {
1168
1293
  const selectedProfile = event.target.value;
1169
-
1170
-
1171
-
1294
+
1295
+
1296
+
1172
1297
  try {
1173
1298
  // Save the selected LLM profile to user settings storage
1174
1299
  if (this.userSettingsStorage) {
1175
-
1300
+
1176
1301
  await this.userSettingsStorage.setSelectedLlmProfile(selectedProfile);
1177
-
1178
-
1302
+
1303
+
1179
1304
  // Verify the save
1180
1305
  const verified = await this.userSettingsStorage.getSelectedLlmProfile();
1181
-
1182
-
1306
+
1307
+
1183
1308
  // Also save to localStorage as backup for browser restart scenarios
1184
1309
  localStorage.setItem('vibesurf-llm-profile-backup', selectedProfile);
1185
-
1310
+
1186
1311
  } else {
1187
1312
  console.warn('[UIManager] userSettingsStorage not available for LLM profile save');
1188
1313
  }
1189
1314
  } catch (error) {
1190
1315
  console.error('[UIManager] Failed to save LLM profile selection:', error);
1191
1316
  }
1192
-
1317
+
1193
1318
  // Re-validate send button state when LLM profile changes
1194
1319
  if (this.elements.taskInput) {
1195
1320
  this.handleTaskInputChange({ target: this.elements.taskInput });
@@ -1198,30 +1323,30 @@ class VibeSurfUIManager {
1198
1323
 
1199
1324
  async handleAgentModeChange(event) {
1200
1325
  const selectedMode = event.target.value;
1201
-
1202
-
1203
-
1326
+
1327
+
1328
+
1204
1329
  try {
1205
1330
  // Save the selected agent mode to user settings storage
1206
1331
  if (this.userSettingsStorage) {
1207
-
1332
+
1208
1333
  await this.userSettingsStorage.setSelectedAgentMode(selectedMode);
1209
-
1210
-
1334
+
1335
+
1211
1336
  // Verify the save
1212
1337
  const verified = await this.userSettingsStorage.getSelectedAgentMode();
1213
-
1214
-
1338
+
1339
+
1215
1340
  // Also save to localStorage as backup for browser restart scenarios
1216
1341
  localStorage.setItem('vibesurf-agent-mode-backup', selectedMode);
1217
-
1342
+
1218
1343
  } else {
1219
1344
  console.warn('[UIManager] userSettingsStorage not available for agent mode save');
1220
1345
  }
1221
1346
  } catch (error) {
1222
1347
  console.error('[UIManager] Failed to save agent mode selection:', error);
1223
1348
  }
1224
-
1349
+
1225
1350
  // Re-validate send button state when agent mode changes
1226
1351
  if (this.elements.taskInput) {
1227
1352
  this.handleTaskInputChange({ target: this.elements.taskInput });
@@ -1229,18 +1354,19 @@ class VibeSurfUIManager {
1229
1354
  }
1230
1355
 
1231
1356
  handleTaskInputChange(event) {
1232
-
1233
-
1234
1357
  const hasText = event.target.value.trim().length > 0;
1235
1358
  const textarea = event.target;
1236
1359
  const llmProfile = this.elements.llmProfileSelect?.value;
1237
1360
  const hasLlmProfile = llmProfile && llmProfile.trim() !== '';
1238
1361
  const taskStatus = this.sessionManager.getTaskStatus();
1239
1362
  const isPaused = taskStatus === 'paused';
1240
-
1363
+
1241
1364
  // Check for @ character to trigger tab selector
1242
1365
  this.handleTabSelectorInput(event);
1243
-
1366
+
1367
+ // Check for / character to trigger skill selector
1368
+ this.handleSkillSelectorInput(event);
1369
+
1244
1370
  // Update send button state - special handling for pause state
1245
1371
  if (this.elements.sendBtn) {
1246
1372
  if (isPaused) {
@@ -1251,32 +1377,32 @@ class VibeSurfUIManager {
1251
1377
  this.elements.sendBtn.disabled = !(hasText && hasLlmProfile && !this.state.isTaskRunning);
1252
1378
  }
1253
1379
  }
1254
-
1380
+
1255
1381
  // Auto-resize textarea based on content
1256
1382
  this.autoResizeTextarea(textarea);
1257
1383
  }
1258
-
1384
+
1259
1385
  autoResizeTextarea(textarea) {
1260
1386
  if (!textarea) return;
1261
-
1387
+
1262
1388
  // Reset height to auto to get the natural scrollHeight
1263
1389
  textarea.style.height = 'auto';
1264
-
1390
+
1265
1391
  // Calculate the new height based on content
1266
1392
  const minHeight = 44; // Min height from CSS
1267
1393
  const maxHeight = 200; // Max height from CSS
1268
1394
  const newHeight = Math.max(minHeight, Math.min(maxHeight, textarea.scrollHeight));
1269
-
1395
+
1270
1396
  // Apply the new height
1271
1397
  textarea.style.height = newHeight + 'px';
1272
1398
  }
1273
1399
 
1274
1400
  // UI Display Methods
1275
1401
  updateSessionDisplay(sessionId) {
1276
-
1402
+
1277
1403
  if (this.elements.sessionId) {
1278
1404
  this.elements.sessionId.textContent = sessionId || '-';
1279
-
1405
+
1280
1406
  } else {
1281
1407
  console.error('[UIManager] Session ID element not found');
1282
1408
  }
@@ -1287,72 +1413,81 @@ class VibeSurfUIManager {
1287
1413
  const cancelBtn = this.elements.cancelBtn;
1288
1414
  const resumeBtn = this.elements.resumeBtn;
1289
1415
  const terminateBtn = this.elements.terminateBtn;
1290
-
1416
+
1291
1417
  console.log(`[UIManager] updateControlPanel called with status: ${status}`);
1292
-
1418
+
1293
1419
  if (!panel) {
1294
1420
  console.error('[UIManager] Control panel element not found');
1295
1421
  return;
1296
1422
  }
1297
-
1423
+
1298
1424
  // Clear any existing auto-hide timeout
1299
1425
  if (this.controlPanelTimeout) {
1300
1426
  clearTimeout(this.controlPanelTimeout);
1301
1427
  this.controlPanelTimeout = null;
1302
1428
  }
1303
-
1429
+
1304
1430
  switch (status) {
1305
1431
  case 'ready':
1306
-
1432
+
1307
1433
  panel.classList.add('hidden');
1308
1434
  panel.classList.remove('error-state');
1309
1435
  break;
1310
-
1436
+
1311
1437
  case 'running':
1312
-
1438
+
1313
1439
  panel.classList.remove('hidden');
1314
1440
  panel.classList.remove('error-state');
1315
1441
  cancelBtn?.classList.remove('hidden');
1316
1442
  resumeBtn?.classList.add('hidden');
1317
1443
  terminateBtn?.classList.add('hidden');
1318
-
1444
+
1319
1445
  // For fast-completing tasks, ensure minimum visibility duration
1320
1446
  this.ensureMinimumControlPanelVisibility();
1321
1447
  break;
1322
-
1448
+
1323
1449
  case 'paused':
1324
-
1450
+
1325
1451
  panel.classList.remove('hidden');
1326
1452
  panel.classList.remove('error-state');
1327
1453
  cancelBtn?.classList.add('hidden');
1328
1454
  resumeBtn?.classList.remove('hidden');
1329
1455
  terminateBtn?.classList.remove('hidden');
1330
1456
  break;
1331
-
1457
+
1332
1458
  case 'error':
1333
-
1459
+
1334
1460
  panel.classList.remove('hidden');
1335
1461
  panel.classList.add('error-state');
1336
1462
  cancelBtn?.classList.remove('hidden');
1337
1463
  resumeBtn?.classList.add('hidden');
1338
1464
  terminateBtn?.classList.remove('hidden');
1339
1465
  break;
1340
-
1466
+
1467
+ case 'done':
1468
+ case 'completed':
1469
+ case 'finished':
1470
+ console.log(`[UIManager] Task completed with status: ${status}, hiding panel after delay`);
1471
+ // Treat as ready state
1472
+ panel.classList.add('hidden');
1473
+ panel.classList.remove('error-state');
1474
+ break;
1475
+
1341
1476
  default:
1342
1477
  console.log(`[UIManager] Unknown control panel status: ${status}, hiding panel`);
1343
1478
  panel.classList.add('hidden');
1344
1479
  panel.classList.remove('error-state');
1345
1480
  }
1346
1481
  }
1347
-
1482
+
1348
1483
  ensureMinimumControlPanelVisibility() {
1349
1484
  // Set a flag to prevent immediate hiding of control panel for fast tasks
1350
1485
  this.controlPanelMinVisibilityActive = true;
1351
-
1486
+
1352
1487
  // Clear the flag after minimum visibility period (2 seconds)
1353
1488
  setTimeout(() => {
1354
1489
  this.controlPanelMinVisibilityActive = false;
1355
-
1490
+
1356
1491
  }, 2000);
1357
1492
  }
1358
1493
 
@@ -1383,7 +1518,7 @@ class VibeSurfUIManager {
1383
1518
  <div class="task-icon">🔍</div>
1384
1519
  <div class="task-content">
1385
1520
  <div class="task-title">Research Founders</div>
1386
- <div class="task-description">Search information about browser-use and browser-use-webui, write a brief report</div>
1521
+ <div class="task-description">Search information about AI browser assistant: VibeSurf, write a brief report</div>
1387
1522
  </div>
1388
1523
  </div>
1389
1524
  <div class="task-suggestion" data-task="news">
@@ -1403,7 +1538,7 @@ class VibeSurfUIManager {
1403
1538
  </div>
1404
1539
  </div>
1405
1540
  `;
1406
-
1541
+
1407
1542
  if (this.elements.activityLog) {
1408
1543
  this.elements.activityLog.innerHTML = welcomeHTML;
1409
1544
  this.bindTaskSuggestionEvents();
@@ -1412,19 +1547,19 @@ class VibeSurfUIManager {
1412
1547
 
1413
1548
  bindTaskSuggestionEvents() {
1414
1549
  const taskSuggestions = document.querySelectorAll('.task-suggestion');
1415
-
1550
+
1416
1551
  taskSuggestions.forEach(suggestion => {
1417
1552
  suggestion.addEventListener('click', () => {
1418
1553
  const taskDescription = suggestion.querySelector('.task-description').textContent;
1419
-
1554
+
1420
1555
  // Populate task input with suggestion (only description, no title prefix)
1421
1556
  if (this.elements.taskInput) {
1422
1557
  this.elements.taskInput.value = taskDescription;
1423
1558
  this.elements.taskInput.focus();
1424
-
1559
+
1425
1560
  // Trigger input change event for validation and auto-resize
1426
1561
  this.handleTaskInputChange({ target: this.elements.taskInput });
1427
-
1562
+
1428
1563
  // Auto-send the task
1429
1564
  setTimeout(() => {
1430
1565
  this.handleSendTask();
@@ -1436,32 +1571,44 @@ class VibeSurfUIManager {
1436
1571
 
1437
1572
  displayActivityLogs(logs) {
1438
1573
  this.clearActivityLog();
1439
-
1574
+
1440
1575
  if (logs.length === 0) {
1441
1576
  this.showWelcomeMessage();
1442
1577
  return;
1443
1578
  }
1444
-
1579
+
1445
1580
  logs.forEach(log => this.addActivityLog(log));
1581
+
1582
+ // Bind link click handlers to all existing activity items after loading
1583
+ this.bindLinkHandlersToAllActivityItems();
1584
+
1446
1585
  this.scrollActivityToBottom();
1447
1586
  }
1448
1587
 
1588
+ bindLinkHandlersToAllActivityItems() {
1589
+ // Bind link click handlers to all existing activity items
1590
+ const activityItems = this.elements.activityLog.querySelectorAll('.activity-item');
1591
+ activityItems.forEach(item => {
1592
+ this.bindLinkClickHandlers(item);
1593
+ });
1594
+ }
1595
+
1449
1596
  addActivityLog(activityData) {
1450
1597
  // Filter out "done" status messages from UI display only
1451
1598
  const agentStatus = activityData.agent_status || activityData.status || '';
1452
-
1599
+
1453
1600
  // Filter done messages that are just status updates without meaningful content
1454
1601
  if (agentStatus.toLowerCase() === 'done') {
1455
1602
  return;
1456
1603
  }
1457
-
1604
+
1458
1605
  if (this.elements.activityLog) {
1459
1606
  // Remove welcome message if present
1460
1607
  const welcomeMsg = this.elements.activityLog.querySelector('.welcome-message');
1461
1608
  if (welcomeMsg) {
1462
1609
  welcomeMsg.remove();
1463
1610
  }
1464
-
1611
+
1465
1612
  // Check if this is a suggestion_tasks message
1466
1613
  if (agentStatus.toLowerCase() === 'suggestion_tasks') {
1467
1614
  // For suggestion_tasks, only show suggestion cards, not the normal message
@@ -1472,33 +1619,36 @@ class VibeSurfUIManager {
1472
1619
  const activityItem = this.createActivityItem(activityData);
1473
1620
  this.elements.activityLog.appendChild(activityItem);
1474
1621
  activityItem.classList.add('fade-in');
1475
-
1622
+
1476
1623
  // Bind copy button functionality
1477
1624
  this.bindCopyButtonEvent(activityItem, activityData);
1625
+
1626
+ // Bind link click handlers to prevent extension freezing
1627
+ this.bindLinkClickHandlers(activityItem);
1478
1628
  }
1479
1629
  }
1480
1630
  }
1481
1631
 
1482
1632
  addSuggestionTaskCards(activityData) {
1483
1633
  const agentMsg = activityData.agent_msg || activityData.message || '';
1484
-
1634
+
1485
1635
  if (!agentMsg || typeof agentMsg !== 'string') {
1486
1636
  return;
1487
1637
  }
1488
-
1638
+
1489
1639
  // Parse tasks by splitting on newlines and filtering empty lines
1490
1640
  const tasks = agentMsg.split('\n')
1491
1641
  .map(task => task.trim())
1492
1642
  .filter(task => task.length > 0);
1493
-
1643
+
1494
1644
  if (tasks.length === 0) {
1495
1645
  return;
1496
1646
  }
1497
-
1647
+
1498
1648
  // Create suggestion cards container
1499
1649
  const suggestionsContainer = document.createElement('div');
1500
1650
  suggestionsContainer.className = 'suggestion-tasks-container';
1501
-
1651
+
1502
1652
  // Add header for suggestion cards
1503
1653
  const headerElement = document.createElement('div');
1504
1654
  headerElement.className = 'suggestion-tasks-header';
@@ -1506,18 +1656,18 @@ class VibeSurfUIManager {
1506
1656
  <h4>Suggestion Follow-Up Tasks</h4>
1507
1657
  `;
1508
1658
  suggestionsContainer.appendChild(headerElement);
1509
-
1659
+
1510
1660
  // Create cards container
1511
1661
  const cardsContainer = document.createElement('div');
1512
1662
  cardsContainer.className = 'suggestion-cards';
1513
-
1663
+
1514
1664
  // Create individual task cards
1515
1665
  tasks.forEach((task, index) => {
1516
1666
  const taskCard = document.createElement('div');
1517
1667
  taskCard.className = 'suggestion-task-card';
1518
1668
  taskCard.setAttribute('data-task', task);
1519
1669
  taskCard.setAttribute('data-index', index);
1520
-
1670
+
1521
1671
  taskCard.innerHTML = `
1522
1672
  <div class="suggestion-card-icon">
1523
1673
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
@@ -1533,18 +1683,18 @@ class VibeSurfUIManager {
1533
1683
  </svg>
1534
1684
  </div>
1535
1685
  `;
1536
-
1686
+
1537
1687
  // Add click event handler
1538
1688
  taskCard.addEventListener('click', (e) => {
1539
1689
  e.preventDefault();
1540
1690
  this.handleSuggestionTaskClick(task);
1541
1691
  });
1542
-
1692
+
1543
1693
  cardsContainer.appendChild(taskCard);
1544
1694
  });
1545
-
1695
+
1546
1696
  suggestionsContainer.appendChild(cardsContainer);
1547
-
1697
+
1548
1698
  // Add the suggestions container to the activity log
1549
1699
  if (this.elements.activityLog) {
1550
1700
  this.elements.activityLog.appendChild(suggestionsContainer);
@@ -1553,38 +1703,38 @@ class VibeSurfUIManager {
1553
1703
  }
1554
1704
 
1555
1705
  handleSuggestionTaskClick(taskDescription) {
1556
-
1557
-
1706
+
1707
+
1558
1708
  // First check if task is running
1559
1709
  if (this.state.isTaskRunning) {
1560
1710
  this.showNotification('Cannot submit task while another task is running', 'warning');
1561
1711
  return;
1562
1712
  }
1563
-
1713
+
1564
1714
  // Check if LLM profile is selected
1565
1715
  const llmProfile = this.elements.llmProfileSelect?.value;
1566
1716
  if (!llmProfile || llmProfile.trim() === '') {
1567
1717
  this.showLLMProfileRequiredModal('select');
1568
1718
  return;
1569
1719
  }
1570
-
1720
+
1571
1721
  // Set the task description in the input first
1572
1722
  if (!this.elements.taskInput) {
1573
1723
  console.error('[UIManager] Task input element not found');
1574
1724
  this.showNotification('Task input not available', 'error');
1575
1725
  return;
1576
1726
  }
1577
-
1578
-
1727
+
1728
+
1579
1729
  this.elements.taskInput.value = taskDescription;
1580
1730
  this.elements.taskInput.focus();
1581
-
1731
+
1582
1732
  // Trigger input change event for validation and auto-resize
1583
1733
  this.handleTaskInputChange({ target: this.elements.taskInput });
1584
-
1734
+
1585
1735
  // Auto-submit the task after a short delay
1586
1736
  setTimeout(() => {
1587
-
1737
+
1588
1738
  this.handleSendTask();
1589
1739
  }, 100);
1590
1740
  }
@@ -1597,12 +1747,12 @@ class VibeSurfUIManager {
1597
1747
 
1598
1748
  createActivityItem(data) {
1599
1749
  const item = document.createElement('div');
1600
-
1750
+
1601
1751
  // Extract activity data with correct keys
1602
1752
  const agentName = data.agent_name || 'system';
1603
1753
  const agentStatus = data.agent_status || data.status || 'info';
1604
1754
  const agentMsg = data.agent_msg || data.message || data.action_description || 'No description';
1605
-
1755
+
1606
1756
  // Use backend timestamp if available, otherwise generate frontend timestamp
1607
1757
  let timestamp;
1608
1758
  if (data.timestamp) {
@@ -1610,20 +1760,20 @@ class VibeSurfUIManager {
1610
1760
  } else {
1611
1761
  timestamp = new Date().toLocaleString();
1612
1762
  }
1613
-
1763
+
1614
1764
  // Extract token and cost information
1615
1765
  const totalTokens = data.total_tokens;
1616
1766
  const totalCost = data.total_cost;
1617
-
1767
+
1618
1768
  // Determine if this is a user message (should be on the right)
1619
1769
  const isUser = agentName.toLowerCase() === 'user';
1620
-
1770
+
1621
1771
  // Set CSS classes based on agent type and status
1622
1772
  item.className = `activity-item ${isUser ? 'user-message' : 'agent-message'} ${agentStatus}`;
1623
-
1773
+
1624
1774
  // Build metadata display (timestamp, tokens, cost)
1625
1775
  let metadataHtml = `<span class="message-time">${timestamp}</span>`;
1626
-
1776
+
1627
1777
  if (totalTokens !== undefined || totalCost !== undefined) {
1628
1778
  metadataHtml += '<span class="message-metrics">';
1629
1779
  if (totalTokens !== undefined) {
@@ -1636,7 +1786,7 @@ class VibeSurfUIManager {
1636
1786
  }
1637
1787
  metadataHtml += '</span>';
1638
1788
  }
1639
-
1789
+
1640
1790
  // Create the message structure similar to chat interface
1641
1791
  item.innerHTML = `
1642
1792
  <div class="message-container ${isUser ? 'user-container' : 'agent-container'}">
@@ -1660,28 +1810,171 @@ class VibeSurfUIManager {
1660
1810
  </div>
1661
1811
  </div>
1662
1812
  `;
1663
-
1813
+
1664
1814
  return item;
1665
1815
  }
1666
1816
 
1667
1817
  bindCopyButtonEvent(activityItem, activityData) {
1668
1818
  const copyBtn = activityItem.querySelector('.copy-message-btn');
1669
-
1819
+
1670
1820
  if (copyBtn) {
1671
1821
  copyBtn.addEventListener('click', async (e) => {
1672
1822
  e.preventDefault();
1673
1823
  e.stopPropagation();
1674
-
1824
+
1675
1825
  await this.copyMessageToClipboard(activityData);
1676
1826
  });
1677
1827
  }
1678
1828
  }
1679
1829
 
1830
+ bindLinkClickHandlers(activityItem) {
1831
+ // Handle all link clicks within activity items to prevent extension freezing
1832
+ const links = activityItem.querySelectorAll('a');
1833
+
1834
+ links.forEach(link => {
1835
+ // Check if handler is already attached to prevent double binding
1836
+ if (link.hasAttribute('data-link-handler-attached')) {
1837
+ return;
1838
+ }
1839
+
1840
+ link.setAttribute('data-link-handler-attached', 'true');
1841
+
1842
+ link.addEventListener('click', async (e) => {
1843
+ console.log('[VibeSurf] Link click event detected:', e);
1844
+
1845
+ // Comprehensive event prevention
1846
+ e.preventDefault();
1847
+ e.stopPropagation();
1848
+ e.stopImmediatePropagation(); // Prevent any other handlers
1849
+
1850
+ // Remove href temporarily to prevent default browser behavior
1851
+ const originalHref = link.getAttribute('href');
1852
+ const dataFilePath = link.getAttribute('data-file-path');
1853
+ link.setAttribute('href', '#');
1854
+
1855
+ // Use data-file-path if available (for file:// links), otherwise use href
1856
+ const targetUrl = dataFilePath || originalHref;
1857
+ if (!targetUrl || (targetUrl === '#' && !dataFilePath)) return;
1858
+
1859
+ // Debounce - prevent rapid repeated clicks
1860
+ if (link.hasAttribute('data-link-processing')) {
1861
+ console.log('[VibeSurf] Link already processing, ignoring duplicate click');
1862
+ return;
1863
+ }
1864
+
1865
+ link.setAttribute('data-link-processing', 'true');
1866
+
1867
+ try {
1868
+ console.log('[VibeSurf] Processing link:', targetUrl);
1869
+
1870
+ // Handle file:// links using existing logic
1871
+ if (targetUrl.startsWith('file://')) {
1872
+ await this.handleFileLinkClick(targetUrl);
1873
+ }
1874
+ // Handle HTTP/HTTPS links
1875
+ else if (targetUrl.startsWith('http://') || targetUrl.startsWith('https://')) {
1876
+ await this.handleHttpLinkClick(targetUrl);
1877
+ }
1878
+ // Handle other protocols or relative URLs
1879
+ else {
1880
+ await this.handleOtherLinkClick(targetUrl);
1881
+ }
1882
+
1883
+ console.log('[VibeSurf] Link processed successfully:', targetUrl);
1884
+ } catch (error) {
1885
+ console.error('[VibeSurf] Error handling link click:', error);
1886
+ this.showNotification(`Failed to open link: ${error.message}`, 'error');
1887
+ } finally {
1888
+ // Restore original href
1889
+ link.setAttribute('href', originalHref);
1890
+
1891
+ // Remove processing flag after a short delay
1892
+ setTimeout(() => {
1893
+ link.removeAttribute('data-link-processing');
1894
+ }, 1000);
1895
+ }
1896
+ });
1897
+ });
1898
+ }
1899
+
1900
+ async handleFileLinkClick(fileUrl) {
1901
+ console.log('[UIManager] Opening file URL:', fileUrl);
1902
+
1903
+ // Use the background script to handle file URLs
1904
+ const result = await chrome.runtime.sendMessage({
1905
+ type: 'OPEN_FILE_URL',
1906
+ data: { fileUrl }
1907
+ });
1908
+
1909
+ if (!result.success) {
1910
+ throw new Error(result.error || 'Failed to open file');
1911
+ }
1912
+ }
1913
+
1914
+ async handleHttpLinkClick(url) {
1915
+ console.log('[VibeSurf] Opening HTTP URL:', url);
1916
+
1917
+ try {
1918
+ // Open HTTP/HTTPS links in a new tab
1919
+ const result = await chrome.runtime.sendMessage({
1920
+ type: 'OPEN_FILE_URL',
1921
+ data: { fileUrl: url }
1922
+ });
1923
+
1924
+ console.log('[VibeSurf] Background script response:', result);
1925
+
1926
+ if (!result || !result.success) {
1927
+ throw new Error(result?.error || 'Failed to create tab for URL');
1928
+ }
1929
+
1930
+ console.log('[VibeSurf] Successfully opened tab:', result.tabId);
1931
+ } catch (error) {
1932
+ console.error('[VibeSurf] Error opening HTTP URL:', error);
1933
+ throw error;
1934
+ }
1935
+ }
1936
+
1937
+ async handleOtherLinkClick(url) {
1938
+ console.log('[UIManager] Opening other URL:', url);
1939
+
1940
+ // For relative URLs or other protocols, try to open in new tab
1941
+ try {
1942
+ // Use the background script to handle URL opening
1943
+ const result = await chrome.runtime.sendMessage({
1944
+ type: 'OPEN_FILE_URL',
1945
+ data: { fileUrl: url }
1946
+ });
1947
+
1948
+ if (!result.success) {
1949
+ throw new Error(result.error || 'Failed to open URL');
1950
+ }
1951
+ } catch (error) {
1952
+ // If the background script method fails, try to construct absolute URL
1953
+ if (!url.startsWith('http')) {
1954
+ try {
1955
+ const absoluteUrl = new URL(url, window.location.href).href;
1956
+ const result = await chrome.runtime.sendMessage({
1957
+ type: 'OPEN_FILE_URL',
1958
+ data: { fileUrl: absoluteUrl }
1959
+ });
1960
+
1961
+ if (!result.success) {
1962
+ throw new Error(result.error || 'Failed to open absolute URL');
1963
+ }
1964
+ } catch (urlError) {
1965
+ throw new Error(`Failed to open URL: ${urlError.message}`);
1966
+ }
1967
+ } else {
1968
+ throw error;
1969
+ }
1970
+ }
1971
+ }
1972
+
1680
1973
  async copyMessageToClipboard(activityData) {
1681
1974
  try {
1682
1975
  // Extract only the message content (no agent info or timestamps)
1683
1976
  const agentMsg = activityData.agent_msg || activityData.message || activityData.action_description || 'No description';
1684
-
1977
+
1685
1978
  // Convert to plain text
1686
1979
  let messageText = '';
1687
1980
  if (typeof agentMsg === 'object') {
@@ -1703,19 +1996,19 @@ class VibeSurfUIManager {
1703
1996
  .replace(/\s+/g, ' ') // Normalize whitespace
1704
1997
  .trim(); // Remove leading/trailing whitespace
1705
1998
  }
1706
-
1999
+
1707
2000
  // Check clipboard API availability
1708
-
1709
-
1710
-
1711
-
2001
+
2002
+
2003
+
2004
+
1712
2005
  // Try multiple clipboard methods
1713
2006
  let copySuccess = false;
1714
2007
  let lastError = null;
1715
-
2008
+
1716
2009
  // Method 1: Chrome extension messaging approach
1717
2010
  try {
1718
-
2011
+
1719
2012
  await new Promise((resolve, reject) => {
1720
2013
  chrome.runtime.sendMessage({
1721
2014
  type: 'COPY_TO_CLIPBOARD',
@@ -1731,29 +2024,29 @@ class VibeSurfUIManager {
1731
2024
  });
1732
2025
  });
1733
2026
  copySuccess = true;
1734
-
2027
+
1735
2028
  } catch (extensionError) {
1736
2029
  console.warn('[UIManager] Chrome extension messaging failed:', extensionError);
1737
2030
  lastError = extensionError;
1738
2031
  }
1739
-
2032
+
1740
2033
  // Method 2: Modern clipboard API (if extension method failed)
1741
2034
  if (!copySuccess && navigator.clipboard && navigator.clipboard.writeText) {
1742
2035
  try {
1743
-
2036
+
1744
2037
  await navigator.clipboard.writeText(messageText);
1745
2038
  copySuccess = true;
1746
-
2039
+
1747
2040
  } catch (clipboardError) {
1748
2041
  console.warn('[UIManager] Modern clipboard API failed:', clipboardError);
1749
2042
  lastError = clipboardError;
1750
2043
  }
1751
2044
  }
1752
-
2045
+
1753
2046
  // Method 3: Fallback using execCommand
1754
2047
  if (!copySuccess) {
1755
2048
  try {
1756
-
2049
+
1757
2050
  const textArea = document.createElement('textarea');
1758
2051
  textArea.value = messageText;
1759
2052
  textArea.style.position = 'fixed';
@@ -1764,13 +2057,13 @@ class VibeSurfUIManager {
1764
2057
  textArea.focus();
1765
2058
  textArea.select();
1766
2059
  textArea.setSelectionRange(0, textArea.value.length);
1767
-
2060
+
1768
2061
  const success = document.execCommand('copy');
1769
2062
  document.body.removeChild(textArea);
1770
-
2063
+
1771
2064
  if (success) {
1772
2065
  copySuccess = true;
1773
-
2066
+
1774
2067
  } else {
1775
2068
  console.warn('[UIManager] execCommand returned false');
1776
2069
  }
@@ -1779,15 +2072,15 @@ class VibeSurfUIManager {
1779
2072
  lastError = execError;
1780
2073
  }
1781
2074
  }
1782
-
2075
+
1783
2076
  if (copySuccess) {
1784
2077
  // Show visual feedback
1785
2078
  this.showCopyFeedback();
1786
-
2079
+
1787
2080
  } else {
1788
2081
  throw new Error(`All clipboard methods failed. Last error: ${lastError?.message || 'Unknown error'}`);
1789
2082
  }
1790
-
2083
+
1791
2084
  } catch (error) {
1792
2085
  console.error('[UIManager] Failed to copy message:', error);
1793
2086
  this.showNotification('Copy Fail: ' + error.message, 'error');
@@ -1816,6 +2109,8 @@ class VibeSurfUIManager {
1816
2109
  return '🔄';
1817
2110
  case 'request':
1818
2111
  return '💡';
2112
+ case 'additional_request':
2113
+ return '➕';
1819
2114
  default:
1820
2115
  return '💡';
1821
2116
  }
@@ -1823,15 +2118,15 @@ class VibeSurfUIManager {
1823
2118
 
1824
2119
  formatActivityContent(content) {
1825
2120
  if (!content) return 'No content';
1826
-
2121
+
1827
2122
  // Handle object content
1828
2123
  if (typeof content === 'object') {
1829
2124
  return `<pre class="json-content">${JSON.stringify(content, null, 2)}</pre>`;
1830
2125
  }
1831
-
2126
+
1832
2127
  // Convert content to string
1833
2128
  let formattedContent = String(content);
1834
-
2129
+
1835
2130
  // Use markdown-it library for proper markdown rendering if available
1836
2131
  if (typeof markdownit !== 'undefined') {
1837
2132
  try {
@@ -1842,16 +2137,16 @@ class VibeSurfUIManager {
1842
2137
  linkify: true, // Autoconvert URL-like text to links
1843
2138
  typographer: true // Enable some language-neutral replacement + quotes beautification
1844
2139
  });
1845
-
2140
+
1846
2141
  // Override link renderer to handle file:// protocol
1847
2142
  const defaultLinkRenderer = md.renderer.rules.link_open || function(tokens, idx, options, env, renderer) {
1848
2143
  return renderer.renderToken(tokens, idx, options);
1849
2144
  };
1850
-
2145
+
1851
2146
  md.renderer.rules.link_open = function (tokens, idx, options, env, renderer) {
1852
2147
  const token = tokens[idx];
1853
2148
  const href = token.attrGet('href');
1854
-
2149
+
1855
2150
  if (href && href.startsWith('file://')) {
1856
2151
  // Convert file:// links to our custom file-link format
1857
2152
  token.attrSet('href', '#');
@@ -1859,17 +2154,17 @@ class VibeSurfUIManager {
1859
2154
  token.attrSet('data-file-path', href);
1860
2155
  token.attrSet('title', `Click to open file: ${href}`);
1861
2156
  }
1862
-
2157
+
1863
2158
  return defaultLinkRenderer(tokens, idx, options, env, renderer);
1864
2159
  };
1865
-
2160
+
1866
2161
  // Add task list support manually (markdown-it doesn't have built-in task lists)
1867
2162
  formattedContent = this.preprocessTaskLists(formattedContent);
1868
-
2163
+
1869
2164
  // Pre-process both regular file paths and file:// markdown links
1870
2165
  const regularFilePathRegex = /\[([^\]]+)\]\(([^)]*\/[^)]*\.[^)]+)\)/g;
1871
2166
  const markdownFileLinkRegex = /\[([^\]]+)\]\((file:\/\/[^)]+)\)/g;
1872
-
2167
+
1873
2168
  // Handle regular file paths (convert to file:// format)
1874
2169
  formattedContent = formattedContent.replace(regularFilePathRegex, (match, linkText, filePath) => {
1875
2170
  // Only process if it looks like a file path (contains / and extension) and not already a URL
@@ -1879,19 +2174,19 @@ class VibeSurfUIManager {
1879
2174
  }
1880
2175
  return match;
1881
2176
  });
1882
-
2177
+
1883
2178
  // Handle file:// links
1884
2179
  formattedContent = formattedContent.replace(markdownFileLinkRegex, (match, linkText, fileUrl) => {
1885
2180
  // Convert to HTML format that markdown-it will preserve
1886
2181
  return `<a href="${fileUrl}" class="file-link-markdown">${linkText}</a>`;
1887
2182
  });
1888
-
2183
+
1889
2184
  // Parse markdown
1890
2185
  const htmlContent = md.render(formattedContent);
1891
-
2186
+
1892
2187
  // Post-process to handle local file path links
1893
2188
  let processedContent = htmlContent;
1894
-
2189
+
1895
2190
  // Convert our pre-processed file:// links to proper file-link format
1896
2191
  const preProcessedFileLinkRegex = /<a href="(file:\/\/[^"]+)"[^>]*class="file-link-markdown"[^>]*>([^<]*)<\/a>/g;
1897
2192
  processedContent = processedContent.replace(preProcessedFileLinkRegex, (match, fileUrl, linkText) => {
@@ -1899,58 +2194,58 @@ class VibeSurfUIManager {
1899
2194
  // Keep original URL but properly escape HTML attributes
1900
2195
  // Don't decode/encode to preserve original spaces and special characters
1901
2196
  const escapedUrl = fileUrl.replace(/"/g, '&quot;');
1902
-
2197
+
1903
2198
  return `<a href="#" class="file-link" data-file-path="${escapedUrl}" title="Click to open file: ${linkText}">${linkText}</a>`;
1904
2199
  } catch (error) {
1905
2200
  console.error('[UIManager] Error processing pre-processed file:// link:', error);
1906
2201
  return match;
1907
2202
  }
1908
2203
  });
1909
-
2204
+
1910
2205
  // Add custom classes and post-process
1911
2206
  return processedContent
1912
2207
  .replace(/<pre><code/g, '<pre class="code-block"><code')
1913
2208
  .replace(/<code>/g, '<code class="inline-code">')
1914
2209
  .replace(/<table>/g, '<table class="markdown-table">')
1915
2210
  .replace(/<blockquote>/g, '<blockquote class="markdown-quote">');
1916
-
2211
+
1917
2212
  } catch (error) {
1918
2213
  console.warn('[UIManager] markdown-it parsing failed, falling back to basic formatting:', error);
1919
2214
  // Fall through to basic formatting
1920
2215
  }
1921
2216
  }
1922
-
2217
+
1923
2218
  // Fallback: Enhanced basic markdown-like formatting
1924
2219
  formattedContent = this.preprocessTaskLists(formattedContent);
1925
-
2220
+
1926
2221
  // Bold text **text**
1927
2222
  formattedContent = formattedContent.replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>');
1928
-
2223
+
1929
2224
  // Italic text *text*
1930
2225
  formattedContent = formattedContent.replace(/\*(.*?)\*/g, '<em>$1</em>');
1931
-
2226
+
1932
2227
  // Code blocks ```code```
1933
2228
  formattedContent = formattedContent.replace(/```([\s\S]*?)```/g, '<pre class="code-block">$1</pre>');
1934
-
2229
+
1935
2230
  // Inline code `code`
1936
2231
  formattedContent = formattedContent.replace(/`([^`]+)`/g, '<code class="inline-code">$1</code>');
1937
-
2232
+
1938
2233
  // Headers
1939
2234
  formattedContent = formattedContent.replace(/^### (.*$)/gm, '<h3>$1</h3>');
1940
2235
  formattedContent = formattedContent.replace(/^## (.*$)/gm, '<h2>$1</h2>');
1941
2236
  formattedContent = formattedContent.replace(/^# (.*$)/gm, '<h1>$1</h1>');
1942
-
2237
+
1943
2238
  // Lists - regular
1944
2239
  formattedContent = formattedContent.replace(/^- (.*$)/gm, '<li>$1</li>');
1945
2240
  formattedContent = formattedContent.replace(/(<li>.*<\/li>)/s, '<ul>$1</ul>');
1946
-
2241
+
1947
2242
  // Convert URLs to links
1948
2243
  const httpUrlRegex = /(https?:\/\/[^\s]+)/g;
1949
2244
  formattedContent = formattedContent.replace(httpUrlRegex, '<a href="$1" target="_blank" rel="noopener noreferrer">$1</a>');
1950
-
2245
+
1951
2246
  // Convert newlines to br tags
1952
2247
  formattedContent = formattedContent.replace(/\n/g, '<br>');
1953
-
2248
+
1954
2249
  return formattedContent;
1955
2250
  }
1956
2251
 
@@ -1974,7 +2269,7 @@ class VibeSurfUIManager {
1974
2269
  if (this.elements.taskInput) {
1975
2270
  this.elements.taskInput.value = '';
1976
2271
  }
1977
-
2272
+
1978
2273
  if (this.elements.sendBtn) {
1979
2274
  this.elements.sendBtn.disabled = true;
1980
2275
  }
@@ -1986,14 +2281,14 @@ class VibeSurfUIManager {
1986
2281
  const canProceed = await this.showTaskRunningWarning('load a different session');
1987
2282
  if (!canProceed) return;
1988
2283
  }
1989
-
2284
+
1990
2285
  try {
1991
2286
  this.showLoading('Loading session...');
1992
-
2287
+
1993
2288
  const success = await this.sessionManager.loadSession(sessionId);
1994
-
2289
+
1995
2290
  this.hideLoading();
1996
-
2291
+
1997
2292
  if (!success) {
1998
2293
  this.showNotification('Failed to load session', 'error');
1999
2294
  }
@@ -2005,14 +2300,14 @@ class VibeSurfUIManager {
2005
2300
 
2006
2301
  async updateLLMProfileSelect() {
2007
2302
  if (!this.elements.llmProfileSelect) return;
2008
-
2303
+
2009
2304
  // Preserve current user selection if any (to avoid overriding during profile updates)
2010
2305
  const currentSelection = this.elements.llmProfileSelect.value;
2011
-
2306
+
2012
2307
  const profiles = this.settingsManager.getLLMProfiles();
2013
2308
  const select = this.elements.llmProfileSelect;
2014
2309
  select.innerHTML = '';
2015
-
2310
+
2016
2311
  if (profiles.length === 0) {
2017
2312
  // Add placeholder option when no profiles available
2018
2313
  const placeholderOption = document.createElement('option');
@@ -2028,10 +2323,10 @@ class VibeSurfUIManager {
2028
2323
  emptyOption.textContent = 'Select LLM Profile...';
2029
2324
  emptyOption.disabled = true;
2030
2325
  select.appendChild(emptyOption);
2031
-
2326
+
2032
2327
  // Determine selection priority: current selection > saved selection > default profile
2033
2328
  let targetSelection = currentSelection; // Preserve current selection first
2034
-
2329
+
2035
2330
  // If no current selection, get saved selection
2036
2331
  if (!targetSelection) {
2037
2332
  try {
@@ -2042,24 +2337,24 @@ class VibeSurfUIManager {
2042
2337
  console.error('[UIManager] Failed to get saved LLM profile selection:', error);
2043
2338
  }
2044
2339
  }
2045
-
2340
+
2046
2341
  // Add actual profiles
2047
2342
  let hasSelectedProfile = false;
2048
2343
  let hasTargetProfile = false;
2049
-
2344
+
2050
2345
  profiles.forEach(profile => {
2051
2346
  const option = document.createElement('option');
2052
2347
  option.value = profile.profile_name;
2053
2348
  option.textContent = profile.profile_name;
2054
-
2349
+
2055
2350
  // Check if this profile matches our target selection
2056
2351
  if (targetSelection && profile.profile_name === targetSelection) {
2057
2352
  hasTargetProfile = true;
2058
2353
  }
2059
-
2354
+
2060
2355
  select.appendChild(option);
2061
2356
  });
2062
-
2357
+
2063
2358
  // Apply selection based on priority
2064
2359
  if (hasTargetProfile) {
2065
2360
  select.value = targetSelection;
@@ -2072,9 +2367,9 @@ class VibeSurfUIManager {
2072
2367
  hasSelectedProfile = true;
2073
2368
  }
2074
2369
  }
2075
-
2370
+
2076
2371
  }
2077
-
2372
+
2078
2373
  // Update send button state if taskInput exists
2079
2374
  if (this.elements.taskInput) {
2080
2375
  this.handleTaskInputChange({ target: this.elements.taskInput });
@@ -2087,7 +2382,7 @@ class VibeSurfUIManager {
2087
2382
  const message = isConfigureAction
2088
2383
  ? 'No LLM profiles are configured. You need to configure at least one LLM profile before sending tasks.'
2089
2384
  : 'Please select an LLM profile from the dropdown to proceed with your task.';
2090
-
2385
+
2091
2386
  const options = isConfigureAction
2092
2387
  ? {
2093
2388
  confirmText: 'Open Settings',
@@ -2106,7 +2401,7 @@ class VibeSurfUIManager {
2106
2401
  this.handleShowLLMSettings();
2107
2402
  }
2108
2403
  };
2109
-
2404
+
2110
2405
  this.modalManager.showWarningModal(title, message, options);
2111
2406
  }
2112
2407
 
@@ -2116,7 +2411,7 @@ class VibeSurfUIManager {
2116
2411
  const message = isConfigureAction
2117
2412
  ? 'No voice recognition (ASR) profiles are configured. You need to configure at least one voice profile before using voice input.'
2118
2413
  : 'Please configure a voice recognition profile to use voice input functionality.';
2119
-
2414
+
2120
2415
  const options = isConfigureAction
2121
2416
  ? {
2122
2417
  confirmText: 'Open Voice Settings',
@@ -2132,7 +2427,7 @@ class VibeSurfUIManager {
2132
2427
  this.handleShowVoiceSettings();
2133
2428
  }
2134
2429
  };
2135
-
2430
+
2136
2431
  this.modalManager.showWarningModal(title, message, options);
2137
2432
  }
2138
2433
 
@@ -2143,10 +2438,10 @@ class VibeSurfUIManager {
2143
2438
  const canProceed = await this.showTaskRunningWarning('access voice settings');
2144
2439
  if (!canProceed) return;
2145
2440
  }
2146
-
2441
+
2147
2442
  // Show settings and navigate directly to Voice profiles tab
2148
2443
  this.settingsManager.showSettings();
2149
-
2444
+
2150
2445
  // Switch to Voice profiles tab after settings are shown
2151
2446
  setTimeout(() => {
2152
2447
  const voiceTab = document.querySelector('.settings-tab[data-tab="voice-profiles"]');
@@ -2157,14 +2452,14 @@ class VibeSurfUIManager {
2157
2452
  }
2158
2453
 
2159
2454
  showLLMConnectionFailedModal(errorData) {
2160
-
2161
-
2455
+
2456
+
2162
2457
  const llmProfile = errorData.llm_profile || 'unknown';
2163
2458
  const errorMessage = errorData.message || 'Cannot connect to LLM API';
2164
-
2459
+
2165
2460
  const title = 'LLM Connection Failed';
2166
2461
  const message = `${errorMessage}\n\nThe LLM profile "${llmProfile}" cannot be reached. Please check your LLM configuration and API credentials.`;
2167
-
2462
+
2168
2463
  const options = {
2169
2464
  confirmText: 'Update LLM Profile',
2170
2465
  cancelText: 'Cancel',
@@ -2173,8 +2468,8 @@ class VibeSurfUIManager {
2173
2468
  this.handleShowLLMProfileSettings(llmProfile);
2174
2469
  }
2175
2470
  };
2176
-
2177
-
2471
+
2472
+
2178
2473
  this.modalManager.showWarningModal(title, message, options);
2179
2474
  }
2180
2475
 
@@ -2185,10 +2480,10 @@ class VibeSurfUIManager {
2185
2480
  const canProceed = await this.showTaskRunningWarning('access settings');
2186
2481
  if (!canProceed) return;
2187
2482
  }
2188
-
2483
+
2189
2484
  // Show settings and navigate to the specific LLM profile
2190
2485
  this.settingsManager.showSettings();
2191
-
2486
+
2192
2487
  // Navigate to LLM profiles section and edit the specific profile
2193
2488
  // We'll add a method to settings manager to handle this
2194
2489
  if (this.settingsManager.navigateToLLMProfile) {
@@ -2199,7 +2494,7 @@ class VibeSurfUIManager {
2199
2494
  // Loading and notifications
2200
2495
  showLoading(message = 'Loading...') {
2201
2496
  this.state.isLoading = true;
2202
-
2497
+
2203
2498
  if (this.elements.loadingOverlay) {
2204
2499
  const textElement = this.elements.loadingOverlay.querySelector('.loading-text');
2205
2500
  if (textElement) {
@@ -2211,7 +2506,7 @@ class VibeSurfUIManager {
2211
2506
 
2212
2507
  hideLoading() {
2213
2508
  this.state.isLoading = false;
2214
-
2509
+
2215
2510
  if (this.elements.loadingOverlay) {
2216
2511
  this.elements.loadingOverlay.classList.add('hidden');
2217
2512
  }
@@ -2219,28 +2514,30 @@ class VibeSurfUIManager {
2219
2514
 
2220
2515
  showNotification(message, type = 'info') {
2221
2516
  // Map UI notification types to valid Chrome notification types
2222
- const validTypes = {
2223
- 'info': 'basic',
2224
- 'success': 'basic',
2225
- 'warning': 'basic',
2226
- 'error': 'basic',
2227
- 'basic': 'basic',
2228
- 'image': 'image',
2229
- 'list': 'list',
2230
- 'progress': 'progress'
2231
- };
2232
-
2233
- const chromeType = validTypes[type] || 'basic';
2234
-
2235
- // Send notification to background script for display
2236
- chrome.runtime.sendMessage({
2237
- type: 'SHOW_NOTIFICATION',
2238
- data: {
2239
- title: 'VibeSurf',
2240
- message,
2241
- type: chromeType
2242
- }
2243
- });
2517
+ if(type === "error") {
2518
+ const validTypes = {
2519
+ 'info': 'basic',
2520
+ 'success': 'basic',
2521
+ 'warning': 'basic',
2522
+ 'error': 'basic',
2523
+ 'basic': 'basic',
2524
+ 'image': 'image',
2525
+ 'list': 'list',
2526
+ 'progress': 'progress'
2527
+ };
2528
+
2529
+ const chromeType = validTypes[type] || 'basic';
2530
+
2531
+ // Send notification to background script for display
2532
+ chrome.runtime.sendMessage({
2533
+ type: 'SHOW_NOTIFICATION',
2534
+ data: {
2535
+ title: 'VibeSurf',
2536
+ message,
2537
+ type: chromeType
2538
+ }
2539
+ });
2540
+ }
2244
2541
  }
2245
2542
 
2246
2543
  // Restore LLM profile selection from user settings storage
@@ -2249,13 +2546,13 @@ class VibeSurfUIManager {
2249
2546
  if (this.userSettingsStorage && this.elements.llmProfileSelect) {
2250
2547
  // Check current options available
2251
2548
  const availableOptions = Array.from(this.elements.llmProfileSelect.options).map(opt => opt.value);
2252
-
2549
+
2253
2550
  const savedLlmProfile = await this.userSettingsStorage.getSelectedLlmProfile();
2254
-
2551
+
2255
2552
  if (savedLlmProfile && savedLlmProfile.trim() !== '') {
2256
2553
  // Check if the saved profile exists in the current options
2257
2554
  const option = this.elements.llmProfileSelect.querySelector(`option[value="${savedLlmProfile}"]`);
2258
-
2555
+
2259
2556
  if (option) {
2260
2557
  this.elements.llmProfileSelect.value = savedLlmProfile;
2261
2558
  } else {
@@ -2264,7 +2561,7 @@ class VibeSurfUIManager {
2264
2561
  } else {
2265
2562
  // Check localStorage backup for browser restart scenarios
2266
2563
  const backupProfile = localStorage.getItem('vibesurf-llm-profile-backup');
2267
-
2564
+
2268
2565
  if (backupProfile) {
2269
2566
  const option = this.elements.llmProfileSelect.querySelector(`option[value="${backupProfile}"]`);
2270
2567
  if (option) {
@@ -2287,10 +2584,10 @@ class VibeSurfUIManager {
2287
2584
  // Check and update voice button state based on ASR profile availability
2288
2585
  async updateVoiceButtonState() {
2289
2586
  if (!this.elements.voiceRecordBtn) return;
2290
-
2587
+
2291
2588
  try {
2292
2589
  const isVoiceAvailable = await this.voiceRecorder.isVoiceRecordingAvailable();
2293
-
2590
+
2294
2591
  if (!isVoiceAvailable) {
2295
2592
  // Add visual indication but keep button enabled for click handling
2296
2593
  this.elements.voiceRecordBtn.classList.add('voice-disabled');
@@ -2319,56 +2616,58 @@ class VibeSurfUIManager {
2319
2616
  // Check for microphone permission parameter first (like Doubao AI)
2320
2617
  const urlParams = new URLSearchParams(window.location.search);
2321
2618
  const enterParam = urlParams.get('enter');
2322
-
2619
+
2323
2620
  if (enterParam === 'mic-permission') {
2324
2621
  console.log('[UIManager] Detected microphone permission request parameter');
2325
2622
  this.showMicrophonePermissionRequest();
2326
2623
  return; // Skip normal initialization for permission request
2327
2624
  }
2328
-
2625
+
2329
2626
  this.showLoading('Initializing VibeSurf...');
2330
-
2627
+
2331
2628
  // Initialize user settings storage first
2332
2629
  if (this.userSettingsStorage) {
2333
-
2630
+
2334
2631
  await this.userSettingsStorage.initialize();
2335
-
2632
+
2336
2633
  } else {
2337
2634
  console.error('[UIManager] userSettingsStorage not available during initialization');
2338
2635
  }
2339
-
2636
+
2340
2637
  // Load settings data through settings manager
2341
-
2638
+
2342
2639
  await this.settingsManager.loadSettingsData();
2343
-
2344
-
2640
+
2641
+
2345
2642
  // Now restore user selections AFTER profiles are loaded but before any other initialization
2346
-
2643
+
2347
2644
  this.isRestoringSelections = true;
2348
-
2645
+
2349
2646
  try {
2350
2647
  // Restore LLM profile selection first
2351
2648
  await this.restoreLlmProfileSelection();
2352
-
2649
+
2353
2650
  // Restore agent mode selection
2354
2651
  await this.restoreAgentModeSelection();
2355
2652
  } finally {
2356
2653
  this.isRestoringSelections = false;
2357
2654
  }
2358
-
2655
+
2359
2656
  // Check and update voice button state based on ASR profile availability
2360
2657
  await this.updateVoiceButtonState();
2361
-
2362
-
2658
+
2659
+ // Check version and show upgrade button if needed
2660
+ await this.checkVersionAndShowUpgrade();
2661
+
2363
2662
  // Create initial session if none exists
2364
-
2663
+
2365
2664
  if (!this.sessionManager.getCurrentSession()) {
2366
-
2665
+
2367
2666
  await this.sessionManager.createSession();
2368
2667
  }
2369
-
2668
+
2370
2669
  this.hideLoading();
2371
-
2670
+
2372
2671
  } catch (error) {
2373
2672
  this.hideLoading();
2374
2673
  console.error('[UIManager] Initialization failed:', error);
@@ -2381,7 +2680,7 @@ class VibeSurfUIManager {
2381
2680
  console.log('[UIManager] Showing simplified microphone permission request');
2382
2681
  console.log('[UIManager] Current URL:', window.location.href);
2383
2682
  console.log('[UIManager] URL params:', window.location.search);
2384
-
2683
+
2385
2684
  // Simple approach: just try to get permission directly
2386
2685
  this.requestMicrophonePermissionDirectly();
2387
2686
  }
@@ -2389,24 +2688,24 @@ class VibeSurfUIManager {
2389
2688
  // Direct microphone permission request (simplified like Doubao AI)
2390
2689
  async requestMicrophonePermissionDirectly() {
2391
2690
  console.log('[UIManager] Requesting microphone permission directly');
2392
-
2691
+
2393
2692
  try {
2394
2693
  // Immediately try to get microphone permission
2395
2694
  console.log('[UIManager] Calling getUserMedia...');
2396
2695
  console.log('[UIManager] User agent:', navigator.userAgent);
2397
2696
  console.log('[UIManager] Location protocol:', window.location.protocol);
2398
2697
  console.log('[UIManager] Location href:', window.location.href);
2399
-
2698
+
2400
2699
  const stream = await navigator.mediaDevices.getUserMedia({
2401
2700
  audio: true,
2402
2701
  video: false
2403
2702
  });
2404
-
2703
+
2405
2704
  console.log('[UIManager] Microphone permission granted!');
2406
-
2705
+
2407
2706
  // Stop the stream immediately (we just need permission)
2408
2707
  stream.getTracks().forEach(track => track.stop());
2409
-
2708
+
2410
2709
  // Send success message back to original tab
2411
2710
  console.log('[UIManager] Sending success message...');
2412
2711
  chrome.runtime.sendMessage({
@@ -2415,19 +2714,19 @@ class VibeSurfUIManager {
2415
2714
  }, (response) => {
2416
2715
  console.log('[UIManager] Success message response:', response);
2417
2716
  });
2418
-
2717
+
2419
2718
  // Close this tab after a short delay
2420
2719
  setTimeout(() => {
2421
2720
  console.log('[UIManager] Closing tab...');
2422
2721
  window.close();
2423
2722
  }, 1000);
2424
-
2723
+
2425
2724
  } catch (error) {
2426
2725
  console.error('[UIManager] Microphone permission denied:', error);
2427
2726
  console.log('[UIManager] Error name:', error.name);
2428
2727
  console.log('[UIManager] Error message:', error.message);
2429
2728
  console.log('[UIManager] Error stack:', error.stack);
2430
-
2729
+
2431
2730
  // Send error message back to original tab
2432
2731
  console.log('[UIManager] Sending error message...');
2433
2732
  chrome.runtime.sendMessage({
@@ -2438,7 +2737,7 @@ class VibeSurfUIManager {
2438
2737
  }, (response) => {
2439
2738
  console.log('[UIManager] Error message response:', response);
2440
2739
  });
2441
-
2740
+
2442
2741
  // Close this tab after a short delay
2443
2742
  setTimeout(() => {
2444
2743
  console.log('[UIManager] Closing tab after error...');
@@ -2449,13 +2748,13 @@ class VibeSurfUIManager {
2449
2748
  // Restore agent mode selection from user settings storage
2450
2749
  async restoreAgentModeSelection() {
2451
2750
  try {
2452
-
2751
+
2453
2752
  if (this.userSettingsStorage && this.elements.agentModeSelect) {
2454
2753
  // Check current options available
2455
2754
  const availableOptions = Array.from(this.elements.agentModeSelect.options).map(opt => opt.value);
2456
-
2755
+
2457
2756
  const savedAgentMode = await this.userSettingsStorage.getSelectedAgentMode();
2458
-
2757
+
2459
2758
  if (savedAgentMode && savedAgentMode.trim() !== '') {
2460
2759
  // Restore any saved agent mode, including 'thinking'
2461
2760
  this.elements.agentModeSelect.value = savedAgentMode;
@@ -2470,7 +2769,7 @@ class VibeSurfUIManager {
2470
2769
  } else {
2471
2770
  // Check localStorage backup for browser restart scenarios
2472
2771
  const backupMode = localStorage.getItem('vibesurf-agent-mode-backup');
2473
-
2772
+
2474
2773
  if (backupMode) {
2475
2774
  const option = this.elements.agentModeSelect.querySelector(`option[value="${backupMode}"]`);
2476
2775
  if (option) {
@@ -2490,53 +2789,162 @@ class VibeSurfUIManager {
2490
2789
  }
2491
2790
  }
2492
2791
 
2792
+ // Version checking and upgrade button management
2793
+ async checkVersionAndShowUpgrade() {
2794
+ try {
2795
+ console.log('[UIManager] Checking version for upgrade notification...');
2796
+
2797
+ // Get extension version from version.js
2798
+ const extensionVersion = window.VIBESURF_EXTENSION_VERSION;
2799
+ if (!extensionVersion) {
2800
+ console.warn('[UIManager] Extension version not found');
2801
+ return;
2802
+ }
2803
+
2804
+ console.log('[UIManager] Extension version:', extensionVersion);
2805
+
2806
+ // Get VibeSurf backend version from API
2807
+ const versionResponse = await this.apiClient.getVibeSurfVersion();
2808
+ const backendVersion = versionResponse.version;
2809
+
2810
+ if (!backendVersion) {
2811
+ console.warn('[UIManager] Backend version not found');
2812
+ return;
2813
+ }
2814
+
2815
+ console.log('[UIManager] Backend version:', backendVersion);
2816
+
2817
+ // Compare versions - show upgrade if extension version is different from backend
2818
+ const shouldShowUpgrade = this.compareVersions(extensionVersion, backendVersion);
2819
+
2820
+ if (shouldShowUpgrade) {
2821
+ console.log('[UIManager] Extension version mismatch detected, showing upgrade button');
2822
+ this.showUpgradeButton();
2823
+ } else {
2824
+ console.log('[UIManager] Extension version is up to date');
2825
+ this.hideUpgradeButton();
2826
+ }
2827
+
2828
+ } catch (error) {
2829
+ console.error('[UIManager] Failed to check version:', error);
2830
+ // Don't show upgrade button on error to avoid false positives
2831
+ }
2832
+ }
2833
+
2834
+ // Compare versions - returns true if extension needs upgrade
2835
+ compareVersions(extensionVersion, backendVersion) {
2836
+ // Remove any +dev suffix from extension version for comparison
2837
+ const cleanExtensionVersion = extensionVersion.replace(/\+.*$/, '');
2838
+ const cleanBackendVersion = backendVersion.replace(/\+.*$/, '');
2839
+
2840
+ console.log('[UIManager] Comparing versions:', cleanExtensionVersion, 'vs', cleanBackendVersion);
2841
+
2842
+ // Simple string comparison - if they're different, show upgrade
2843
+ // This handles cases where extension is older, newer, or just different
2844
+ return cleanExtensionVersion !== cleanBackendVersion;
2845
+ }
2846
+
2847
+ // Show upgrade button with animation
2848
+ showUpgradeButton() {
2849
+ if (this.elements.upgradeBtn) {
2850
+ this.elements.upgradeBtn.classList.remove('hidden');
2851
+ console.log('[UIManager] Upgrade button shown');
2852
+ }
2853
+ }
2854
+
2855
+ // Hide upgrade button
2856
+ hideUpgradeButton() {
2857
+ if (this.elements.upgradeBtn) {
2858
+ this.elements.upgradeBtn.classList.add('hidden');
2859
+ console.log('[UIManager] Upgrade button hidden');
2860
+ }
2861
+ }
2862
+
2493
2863
  // Cleanup
2494
2864
  destroy() {
2495
- // Stop task status monitoring
2496
- this.stopTaskStatusMonitoring();
2497
-
2498
- // Cleanup voice recorder
2499
- if (this.voiceRecorder) {
2500
- this.voiceRecorder.cleanup();
2865
+ // Prevent multiple cleanup calls
2866
+ if (this.isDestroying) {
2867
+ console.log('[UIManager] Cleanup already in progress, skipping...');
2868
+ return;
2501
2869
  }
2502
-
2503
- // Cleanup managers
2504
- if (this.settingsManager) {
2505
- // Cleanup settings manager if it has destroy method
2506
- if (typeof this.settingsManager.destroy === 'function') {
2507
- this.settingsManager.destroy();
2870
+
2871
+ this.isDestroying = true;
2872
+ console.log('[UIManager] Destroying UI manager...');
2873
+
2874
+ try {
2875
+ // Stop task status monitoring
2876
+ this.stopTaskStatusMonitoring();
2877
+
2878
+ // Cleanup voice recorder
2879
+ if (this.voiceRecorder) {
2880
+ this.voiceRecorder.cleanup();
2881
+ this.voiceRecorder = null;
2508
2882
  }
2509
- }
2510
-
2511
- if (this.historyManager) {
2512
- // Cleanup history manager if it has destroy method
2513
- if (typeof this.historyManager.destroy === 'function') {
2514
- this.historyManager.destroy();
2883
+
2884
+ // Cleanup managers with error handling
2885
+ if (this.settingsManager) {
2886
+ try {
2887
+ if (typeof this.settingsManager.destroy === 'function') {
2888
+ this.settingsManager.destroy();
2889
+ }
2890
+ } catch (error) {
2891
+ console.error('[UIManager] Error destroying settings manager:', error);
2892
+ }
2893
+ this.settingsManager = null;
2515
2894
  }
2516
- }
2517
-
2518
- if (this.fileManager) {
2519
- // Cleanup file manager if it has destroy method
2520
- if (typeof this.fileManager.destroy === 'function') {
2521
- this.fileManager.destroy();
2895
+
2896
+ if (this.historyManager) {
2897
+ try {
2898
+ if (typeof this.historyManager.destroy === 'function') {
2899
+ this.historyManager.destroy();
2900
+ }
2901
+ } catch (error) {
2902
+ console.error('[UIManager] Error destroying history manager:', error);
2903
+ }
2904
+ this.historyManager = null;
2522
2905
  }
2523
- }
2524
-
2525
- if (this.modalManager) {
2526
- // Cleanup modal manager if it has destroy method
2527
- if (typeof this.modalManager.destroy === 'function') {
2528
- this.modalManager.destroy();
2906
+
2907
+ if (this.fileManager) {
2908
+ try {
2909
+ if (typeof this.fileManager.destroy === 'function') {
2910
+ this.fileManager.destroy();
2911
+ }
2912
+ } catch (error) {
2913
+ console.error('[UIManager] Error destroying file manager:', error);
2914
+ }
2915
+ this.fileManager = null;
2916
+ }
2917
+
2918
+ if (this.modalManager) {
2919
+ try {
2920
+ if (typeof this.modalManager.destroy === 'function') {
2921
+ this.modalManager.destroy();
2922
+ }
2923
+ } catch (error) {
2924
+ console.error('[UIManager] Error destroying modal manager:', error);
2925
+ }
2926
+ this.modalManager = null;
2529
2927
  }
2928
+
2929
+ // Clear state
2930
+ this.state = {
2931
+ isLoading: false,
2932
+ isTaskRunning: false,
2933
+ taskInfo: null
2934
+ };
2935
+
2936
+ console.log('[UIManager] UI manager cleanup complete');
2937
+ } catch (error) {
2938
+ console.error('[UIManager] Error during destroy:', error);
2939
+ } finally {
2940
+ this.isDestroying = false;
2530
2941
  }
2531
-
2532
- // Clear state
2533
- this.state.currentModal = null;
2534
2942
  }
2535
2943
 
2536
2944
  // Tab Selector Methods
2537
2945
  initializeTabSelector() {
2538
-
2539
-
2946
+
2947
+
2540
2948
  // Initialize tab selector state
2541
2949
  this.tabSelectorState = {
2542
2950
  isVisible: false,
@@ -2545,19 +2953,19 @@ class VibeSurfUIManager {
2545
2953
  atPosition: -1 // Position where @ was typed
2546
2954
  };
2547
2955
 
2548
-
2549
-
2956
+
2957
+
2550
2958
  // Bind tab selector events
2551
2959
  this.bindTabSelectorEvents();
2552
2960
  }
2553
2961
 
2554
2962
  bindTabSelectorEvents() {
2555
-
2556
-
2557
-
2963
+
2964
+
2965
+
2558
2966
  // Select all radio button
2559
2967
  this.elements.selectAllTabs?.addEventListener('change', this.handleSelectAllTabs.bind(this));
2560
-
2968
+
2561
2969
  // Hide on click outside
2562
2970
  document.addEventListener('click', (event) => {
2563
2971
  if (this.tabSelectorState.isVisible &&
@@ -2567,8 +2975,8 @@ class VibeSurfUIManager {
2567
2975
  this.hideTabSelector();
2568
2976
  }
2569
2977
  });
2570
-
2571
-
2978
+
2979
+
2572
2980
  }
2573
2981
 
2574
2982
  handleTabSelectorInput(event) {
@@ -2577,15 +2985,15 @@ class VibeSurfUIManager {
2577
2985
  console.warn('[UIManager] Tab selector state not initialized');
2578
2986
  return;
2579
2987
  }
2580
-
2988
+
2581
2989
  const inputValue = event.target.value;
2582
2990
  const cursorPosition = event.target.selectionStart;
2583
-
2584
-
2585
-
2991
+
2992
+
2993
+
2586
2994
  // Check if @ was just typed
2587
2995
  if (inputValue[cursorPosition - 1] === '@') {
2588
-
2996
+
2589
2997
  this.tabSelectorState.atPosition = cursorPosition - 1;
2590
2998
  this.showTabSelector();
2591
2999
  } else if (this.tabSelectorState.isVisible) {
@@ -2593,24 +3001,24 @@ class VibeSurfUIManager {
2593
3001
  if (this.tabSelectorState.atPosition >= 0 &&
2594
3002
  (this.tabSelectorState.atPosition >= inputValue.length ||
2595
3003
  inputValue[this.tabSelectorState.atPosition] !== '@')) {
2596
-
3004
+
2597
3005
  this.hideTabSelector();
2598
3006
  return;
2599
3007
  }
2600
-
3008
+
2601
3009
  // Hide tab selector if user continues typing after @
2602
3010
  const textAfterAt = inputValue.substring(this.tabSelectorState.atPosition + 1, cursorPosition);
2603
3011
  if (textAfterAt.length > 0 && !textAfterAt.match(/^[\s]*$/)) {
2604
-
3012
+
2605
3013
  this.hideTabSelector();
2606
3014
  }
2607
3015
  }
2608
3016
  }
2609
3017
 
2610
3018
  async showTabSelector() {
2611
-
2612
-
2613
-
3019
+
3020
+
3021
+
2614
3022
  if (!this.elements.tabSelectorDropdown || !this.elements.taskInput) {
2615
3023
  console.error('[UIManager] Tab selector elements not found', {
2616
3024
  dropdown: this.elements.tabSelectorDropdown,
@@ -2620,26 +3028,26 @@ class VibeSurfUIManager {
2620
3028
  }
2621
3029
 
2622
3030
  try {
2623
-
3031
+
2624
3032
  // Fetch tab data from backend
2625
3033
  await this.populateTabSelector();
2626
-
2627
-
3034
+
3035
+
2628
3036
  // Position the dropdown relative to the input
2629
3037
  this.positionTabSelector();
2630
-
2631
-
3038
+
3039
+
2632
3040
  // Show the dropdown with explicit visibility
2633
3041
  this.elements.tabSelectorDropdown.classList.remove('hidden');
2634
3042
  this.elements.tabSelectorDropdown.style.display = 'block';
2635
3043
  this.elements.tabSelectorDropdown.style.visibility = 'visible';
2636
3044
  this.elements.tabSelectorDropdown.style.opacity = '1';
2637
3045
  this.tabSelectorState.isVisible = true;
2638
-
2639
-
2640
-
2641
-
2642
-
3046
+
3047
+
3048
+
3049
+
3050
+
2643
3051
  } catch (error) {
2644
3052
  console.error('[UIManager] Failed to show tab selector:', error);
2645
3053
  this.showNotification('Failed to load browser tabs', 'error');
@@ -2654,21 +3062,21 @@ class VibeSurfUIManager {
2654
3062
  this.tabSelectorState.isVisible = false;
2655
3063
  this.tabSelectorState.selectedTabs = [];
2656
3064
  this.tabSelectorState.atPosition = -1;
2657
-
2658
-
3065
+
3066
+
2659
3067
  }
2660
3068
 
2661
3069
  positionTabSelector() {
2662
3070
  if (!this.elements.tabSelectorDropdown || !this.elements.taskInput) return;
2663
-
3071
+
2664
3072
  const inputRect = this.elements.taskInput.getBoundingClientRect();
2665
3073
  const dropdown = this.elements.tabSelectorDropdown;
2666
-
2667
-
2668
-
3074
+
3075
+
3076
+
2669
3077
  // Calculate 90% width of input
2670
3078
  const dropdownWidth = inputRect.width * 0.9;
2671
-
3079
+
2672
3080
  // Position dropdown ABOVE the input (not below)
2673
3081
  dropdown.style.position = 'fixed';
2674
3082
  dropdown.style.bottom = `${window.innerHeight - inputRect.top + 5}px`; // Above the input
@@ -2677,38 +3085,38 @@ class VibeSurfUIManager {
2677
3085
  dropdown.style.zIndex = '9999';
2678
3086
  dropdown.style.maxHeight = '300px';
2679
3087
  dropdown.style.overflowY = 'auto';
2680
-
2681
-
3088
+
3089
+
2682
3090
  }
2683
3091
 
2684
3092
  async populateTabSelector() {
2685
3093
  try {
2686
-
3094
+
2687
3095
  // Get all tabs and active tab from backend
2688
3096
  const [allTabsResponse, activeTabResponse] = await Promise.all([
2689
3097
  this.apiClient.getAllBrowserTabs(),
2690
3098
  this.apiClient.getActiveBrowserTab()
2691
3099
  ]);
2692
-
2693
-
2694
-
3100
+
3101
+
3102
+
2695
3103
  const allTabs = allTabsResponse.tabs || allTabsResponse || {};
2696
3104
  const activeTab = activeTabResponse.tab || activeTabResponse || {};
2697
3105
  const activeTabId = Object.keys(activeTab)[0];
2698
-
2699
-
2700
-
3106
+
3107
+
3108
+
2701
3109
  this.tabSelectorState.allTabs = allTabs;
2702
-
3110
+
2703
3111
  // Clear existing options
2704
3112
  if (this.elements.tabOptionsList) {
2705
3113
  this.elements.tabOptionsList.innerHTML = '';
2706
-
3114
+
2707
3115
  } else {
2708
3116
  console.error('[UIManager] tabOptionsList element not found!');
2709
3117
  return;
2710
3118
  }
2711
-
3119
+
2712
3120
  // Add fallback test data if no tabs returned
2713
3121
  if (Object.keys(allTabs).length === 0) {
2714
3122
  console.warn('[UIManager] No tabs returned from API, adding test data for debugging');
@@ -2717,31 +3125,31 @@ class VibeSurfUIManager {
2717
3125
  'test-2': { title: 'Test Tab 2', url: 'https://google.com' },
2718
3126
  'test-3': { title: 'Very Long Tab Title That Should Be Truncated', url: 'https://github.com' }
2719
3127
  };
2720
-
3128
+
2721
3129
  Object.entries(testTabs).forEach(([tabId, tabInfo]) => {
2722
3130
  const isActive = tabId === 'test-1';
2723
-
3131
+
2724
3132
  const option = this.createTabOption(tabId, tabInfo, isActive);
2725
3133
  this.elements.tabOptionsList.appendChild(option);
2726
3134
  });
2727
-
3135
+
2728
3136
  this.tabSelectorState.allTabs = testTabs;
2729
3137
  } else {
2730
3138
  // Add real tab options
2731
3139
  Object.entries(allTabs).forEach(([tabId, tabInfo]) => {
2732
3140
  const isActive = tabId === activeTabId;
2733
-
3141
+
2734
3142
  const option = this.createTabOption(tabId, tabInfo, isActive);
2735
3143
  this.elements.tabOptionsList.appendChild(option);
2736
3144
  });
2737
3145
  }
2738
-
3146
+
2739
3147
  // Reset select all checkbox
2740
3148
  if (this.elements.selectAllTabs) {
2741
3149
  this.elements.selectAllTabs.checked = false;
2742
3150
  }
2743
-
2744
-
3151
+
3152
+
2745
3153
  } catch (error) {
2746
3154
  console.error('[UIManager] Failed to populate tab selector:', error);
2747
3155
  throw error;
@@ -2752,12 +3160,12 @@ class VibeSurfUIManager {
2752
3160
  const option = document.createElement('div');
2753
3161
  option.className = `tab-option ${isActive ? 'active-tab' : ''}`;
2754
3162
  option.dataset.tabId = tabId;
2755
-
3163
+
2756
3164
  // Format title (first 20 characters)
2757
3165
  const displayTitle = tabInfo.title ?
2758
3166
  (tabInfo.title.length > 20 ? tabInfo.title.substring(0, 20) + '...' : tabInfo.title) :
2759
3167
  'Unknown Title';
2760
-
3168
+
2761
3169
  option.innerHTML = `
2762
3170
  <input type="radio" class="tab-radio" id="tab-${tabId}" name="tab-selection" value="${tabId}">
2763
3171
  <label for="tab-${tabId}" class="tab-label">
@@ -2766,23 +3174,23 @@ class VibeSurfUIManager {
2766
3174
  ${isActive ? '<span class="active-indicator">(Active)</span>' : ''}
2767
3175
  </label>
2768
3176
  `;
2769
-
3177
+
2770
3178
  // Add change event to radio button for auto-confirm
2771
3179
  const radio = option.querySelector('.tab-radio');
2772
3180
  radio?.addEventListener('change', this.handleTabSelection.bind(this));
2773
-
3181
+
2774
3182
  return option;
2775
3183
  }
2776
3184
 
2777
3185
  handleTabSelection(event) {
2778
3186
  const tabId = event.target.value;
2779
-
3187
+
2780
3188
  if (event.target.checked) {
2781
3189
  // For radio buttons, replace the selected tabs array with just this tab
2782
3190
  this.tabSelectorState.selectedTabs = [tabId];
2783
-
2784
-
2785
-
3191
+
3192
+
3193
+
2786
3194
  // Auto-confirm selection immediately
2787
3195
  this.confirmTabSelection();
2788
3196
  }
@@ -2793,9 +3201,9 @@ class VibeSurfUIManager {
2793
3201
  // "Select All" means list all tabs in the input
2794
3202
  const allTabIds = Object.keys(this.tabSelectorState.allTabs);
2795
3203
  this.tabSelectorState.selectedTabs = allTabIds;
2796
-
2797
-
2798
-
3204
+
3205
+
3206
+
2799
3207
  // Auto-confirm selection immediately
2800
3208
  this.confirmTabSelection();
2801
3209
  }
@@ -2803,10 +3211,10 @@ class VibeSurfUIManager {
2803
3211
 
2804
3212
  updateSelectAllState() {
2805
3213
  if (!this.elements.selectAllTabs || !this.elements.tabOptionsList) return;
2806
-
3214
+
2807
3215
  const checkboxes = this.elements.tabOptionsList.querySelectorAll('.tab-checkbox');
2808
3216
  const checkedBoxes = this.elements.tabOptionsList.querySelectorAll('.tab-checkbox:checked');
2809
-
3217
+
2810
3218
  if (checkboxes.length === 0) {
2811
3219
  this.elements.selectAllTabs.indeterminate = false;
2812
3220
  this.elements.selectAllTabs.checked = false;
@@ -2827,27 +3235,27 @@ class VibeSurfUIManager {
2827
3235
  this.showNotification('Please select at least one tab', 'warning');
2828
3236
  return;
2829
3237
  }
2830
-
3238
+
2831
3239
  // Replace @ with selected tabs information
2832
3240
  this.insertSelectedTabsIntoInput();
2833
-
3241
+
2834
3242
  // Hide the selector
2835
3243
  this.hideTabSelector();
2836
-
3244
+
2837
3245
  console.log(`[UIManager] ${this.tabSelectorState.selectedTabs.length} tab(s) selected and confirmed`);
2838
3246
  }
2839
3247
 
2840
3248
  insertSelectedTabsIntoInput() {
2841
3249
  if (!this.elements.taskInput) return;
2842
-
3250
+
2843
3251
  const input = this.elements.taskInput;
2844
3252
  const currentValue = input.value;
2845
3253
  const atPosition = this.tabSelectorState.atPosition;
2846
-
3254
+
2847
3255
  // Use special Unicode characters as boundaries for easy deletion
2848
3256
  const TAB_START_MARKER = '\u200B'; // Zero-width space
2849
3257
  const TAB_END_MARKER = '\u200C'; // Zero-width non-joiner
2850
-
3258
+
2851
3259
  // Create tab information string in new format: @ tab_id: title[:20]
2852
3260
  const selectedTabsInfo = this.tabSelectorState.selectedTabs.map(tabId => {
2853
3261
  const tabInfo = this.tabSelectorState.allTabs[tabId];
@@ -2856,17 +3264,17 @@ class VibeSurfUIManager {
2856
3264
  'Unknown';
2857
3265
  return `${TAB_START_MARKER}@ ${tabId}: ${displayTitle}${TAB_END_MARKER}`;
2858
3266
  }).join(' ');
2859
-
3267
+
2860
3268
  // Replace @ with tab selection (preserve the @ symbol)
2861
3269
  const beforeAt = currentValue.substring(0, atPosition);
2862
3270
  const afterAt = currentValue.substring(atPosition + 1);
2863
3271
  const newValue = `${beforeAt}${selectedTabsInfo} ${afterAt}`;
2864
-
3272
+
2865
3273
  input.value = newValue;
2866
-
3274
+
2867
3275
  // Trigger input change event for validation
2868
3276
  this.handleTaskInputChange({ target: input });
2869
-
3277
+
2870
3278
  // Set cursor position after the inserted text
2871
3279
  const newCursorPosition = beforeAt.length + selectedTabsInfo.length + 1; // Add space
2872
3280
  input.setSelectionRange(newCursorPosition, newCursorPosition);
@@ -2878,7 +3286,7 @@ class VibeSurfUIManager {
2878
3286
  if (this.tabSelectorState.selectedTabs.length === 0) {
2879
3287
  return null;
2880
3288
  }
2881
-
3289
+
2882
3290
  const selectedTabsData = {};
2883
3291
  this.tabSelectorState.selectedTabs.forEach(tabId => {
2884
3292
  const tabInfo = this.tabSelectorState.allTabs[tabId];
@@ -2889,12 +3297,455 @@ class VibeSurfUIManager {
2889
3297
  };
2890
3298
  }
2891
3299
  });
2892
-
3300
+
2893
3301
  return selectedTabsData;
2894
3302
  }
3303
+
3304
+ // Skill Selector Methods
3305
+ initializeSkillSelector() {
3306
+ // Initialize skill selector state
3307
+ this.skillSelectorState = {
3308
+ isVisible: false,
3309
+ selectedSkills: [],
3310
+ allSkills: [],
3311
+ slashPosition: -1, // Position where / was typed
3312
+ currentFilter: '', // Current filter text after /
3313
+ filteredSkills: [] // Filtered skills based on current input
3314
+ };
3315
+
3316
+ // Bind skill selector events
3317
+ this.bindSkillSelectorEvents();
3318
+ }
3319
+
3320
+ bindSkillSelectorEvents() {
3321
+ // Hide on click outside
3322
+ document.addEventListener('click', (event) => {
3323
+ if (this.skillSelectorState.isVisible &&
3324
+ this.elements.skillSelectorDropdown &&
3325
+ !this.elements.skillSelectorDropdown.contains(event.target) &&
3326
+ !this.elements.taskInput?.contains(event.target)) {
3327
+ this.hideSkillSelector();
3328
+ }
3329
+ });
3330
+ }
3331
+
3332
+ handleSkillSelectorInput(event) {
3333
+ // Safety check - ensure skill selector state is initialized
3334
+ if (!this.skillSelectorState) {
3335
+ console.warn('[UIManager] Skill selector state not initialized');
3336
+ return;
3337
+ }
3338
+
3339
+ const inputValue = event.target.value;
3340
+ const cursorPosition = event.target.selectionStart;
3341
+
3342
+ // Check if / was just typed
3343
+ if (inputValue[cursorPosition - 1] === '/') {
3344
+ this.skillSelectorState.slashPosition = cursorPosition - 1;
3345
+ this.skillSelectorState.currentFilter = '';
3346
+ this.showSkillSelector();
3347
+ } else if (this.skillSelectorState.isVisible) {
3348
+ // Check if / was deleted - hide skill selector immediately
3349
+ if (this.skillSelectorState.slashPosition >= 0 &&
3350
+ (this.skillSelectorState.slashPosition >= inputValue.length ||
3351
+ inputValue[this.skillSelectorState.slashPosition] !== '/')) {
3352
+ this.hideSkillSelector();
3353
+ return;
3354
+ }
3355
+
3356
+ // Update filter based on text after /
3357
+ const textAfterSlash = inputValue.substring(this.skillSelectorState.slashPosition + 1, cursorPosition);
3358
+
3359
+ // Only consider text up to the next space or special character
3360
+ const filterText = textAfterSlash.split(/[\s@]/)[0];
3361
+
3362
+ if (this.skillSelectorState.currentFilter !== filterText) {
3363
+ this.skillSelectorState.currentFilter = filterText;
3364
+ this.filterSkills();
3365
+ }
3366
+
3367
+ // Hide skill selector if user typed a space or moved past the skill context
3368
+ if (textAfterSlash.includes(' ') || textAfterSlash.includes('@')) {
3369
+ this.hideSkillSelector();
3370
+ }
3371
+ }
3372
+ }
3373
+
3374
+ async showSkillSelector() {
3375
+ if (!this.elements.skillSelectorDropdown || !this.elements.taskInput) {
3376
+ console.error('[UIManager] Skill selector elements not found', {
3377
+ dropdown: this.elements.skillSelectorDropdown,
3378
+ taskInput: this.elements.taskInput
3379
+ });
3380
+ return;
3381
+ }
3382
+
3383
+ try {
3384
+ // Fetch skill data from backend if not already cached
3385
+ if (this.skillSelectorState.allSkills.length === 0) {
3386
+ await this.populateSkillSelector();
3387
+ }
3388
+
3389
+ // Filter skills based on current input
3390
+ this.filterSkills();
3391
+
3392
+ // Position the dropdown relative to the input
3393
+ this.positionSkillSelector();
3394
+
3395
+ // Show the dropdown with explicit visibility
3396
+ this.elements.skillSelectorDropdown.classList.remove('hidden');
3397
+ this.elements.skillSelectorDropdown.style.display = 'block';
3398
+ this.elements.skillSelectorDropdown.style.visibility = 'visible';
3399
+ this.elements.skillSelectorDropdown.style.opacity = '1';
3400
+ this.skillSelectorState.isVisible = true;
3401
+
3402
+ } catch (error) {
3403
+ console.error('[UIManager] Failed to show skill selector:', error);
3404
+ this.showNotification('Failed to load skills', 'error');
3405
+ }
3406
+ }
3407
+
3408
+ hideSkillSelector() {
3409
+ if (this.elements.skillSelectorDropdown) {
3410
+ this.elements.skillSelectorDropdown.classList.add('hidden');
3411
+ this.elements.skillSelectorDropdown.style.display = 'none';
3412
+ }
3413
+ this.skillSelectorState.isVisible = false;
3414
+ this.skillSelectorState.slashPosition = -1;
3415
+ this.skillSelectorState.currentFilter = '';
3416
+ this.skillSelectorState.filteredSkills = [];
3417
+ }
3418
+
3419
+ positionSkillSelector() {
3420
+ if (!this.elements.skillSelectorDropdown || !this.elements.taskInput) return;
3421
+
3422
+ const inputRect = this.elements.taskInput.getBoundingClientRect();
3423
+ const dropdown = this.elements.skillSelectorDropdown;
3424
+
3425
+ // Calculate 90% width of input
3426
+ const dropdownWidth = inputRect.width * 0.9;
3427
+
3428
+ // Position dropdown ABOVE the input (not below)
3429
+ dropdown.style.position = 'fixed';
3430
+ dropdown.style.bottom = `${window.innerHeight - inputRect.top + 5}px`; // Above the input
3431
+ dropdown.style.left = `${inputRect.left + (inputRect.width - dropdownWidth) / 2}px`; // Centered
3432
+ dropdown.style.width = `${dropdownWidth}px`; // 90% of input width
3433
+ dropdown.style.zIndex = '9999';
3434
+ dropdown.style.maxHeight = '300px';
3435
+ dropdown.style.overflowY = 'auto';
3436
+ }
3437
+
3438
+ async populateSkillSelector() {
3439
+ try {
3440
+ console.log('[UIManager] Fetching skills from backend...');
3441
+ // Get all skills from backend
3442
+ const skills = await this.apiClient.getAllSkills();
3443
+
3444
+ console.log('[UIManager] Skills received from backend:', skills);
3445
+
3446
+ if (!skills || !Array.isArray(skills) || skills.length === 0) {
3447
+ console.warn('[UIManager] No skills returned from backend');
3448
+ this.skillSelectorState.allSkills = [];
3449
+ return;
3450
+ }
3451
+
3452
+ this.skillSelectorState.allSkills = skills.map(skillName => ({
3453
+ name: skillName,
3454
+ displayName: skillName // Keep original skill name without transformation
3455
+ }));
3456
+ console.log('[UIManager] Processed skills:', this.skillSelectorState.allSkills);
3457
+
3458
+ } catch (error) {
3459
+ console.error('[UIManager] Failed to populate skill selector:', error);
3460
+ console.error('[UIManager] Error details:', {
3461
+ message: error.message,
3462
+ stack: error.stack,
3463
+ response: error.response,
3464
+ data: error.data
3465
+ });
3466
+
3467
+ // Show error to user
3468
+ this.showNotification(`Failed to load skills: ${error.message}`, 'error');
3469
+
3470
+ // Set empty array instead of fallback test data
3471
+ this.skillSelectorState.allSkills = [];
3472
+ }
3473
+ }
3474
+
3475
+ filterSkills() {
3476
+ const filter = this.skillSelectorState.currentFilter.toLowerCase();
3477
+
3478
+ if (!filter) {
3479
+ this.skillSelectorState.filteredSkills = this.skillSelectorState.allSkills;
3480
+ } else {
3481
+ this.skillSelectorState.filteredSkills = this.skillSelectorState.allSkills.filter(skill =>
3482
+ skill.name.toLowerCase().startsWith(filter) ||
3483
+ skill.displayName.toLowerCase().startsWith(filter)
3484
+ );
3485
+ }
3486
+
3487
+ this.renderSkillOptions();
3488
+ }
3489
+
3490
+ renderSkillOptions() {
3491
+ if (!this.elements.skillOptionsList) return;
3492
+
3493
+ // Clear existing options
3494
+ this.elements.skillOptionsList.innerHTML = '';
3495
+
3496
+ if (this.skillSelectorState.filteredSkills.length === 0) {
3497
+ const noResults = document.createElement('div');
3498
+ noResults.className = 'skill-option';
3499
+ noResults.innerHTML = '<span class="skill-name">No skills found</span>';
3500
+ noResults.style.opacity = '0.6';
3501
+ noResults.style.cursor = 'not-allowed';
3502
+ this.elements.skillOptionsList.appendChild(noResults);
3503
+ return;
3504
+ }
3505
+
3506
+ // Add skill options
3507
+ this.skillSelectorState.filteredSkills.forEach((skill, index) => {
3508
+ const option = this.createSkillOption(skill, index);
3509
+ this.elements.skillOptionsList.appendChild(option);
3510
+ });
3511
+ }
3512
+
3513
+ createSkillOption(skill, index) {
3514
+ const option = document.createElement('div');
3515
+ option.className = 'skill-option';
3516
+ option.dataset.skillName = skill.name;
3517
+ option.dataset.skillIndex = index;
3518
+
3519
+ option.innerHTML = `
3520
+ <span class="skill-name">${this.escapeHtml(skill.displayName)}</span>
3521
+ `;
3522
+
3523
+ // Add click event for skill selection
3524
+ option.addEventListener('click', () => {
3525
+ this.selectSkill(skill);
3526
+ });
3527
+
3528
+ return option;
3529
+ }
3530
+
3531
+ selectSkill(skill) {
3532
+ if (!this.elements.taskInput) return;
3533
+
3534
+ const input = this.elements.taskInput;
3535
+ const currentValue = input.value;
3536
+ const slashPosition = this.skillSelectorState.slashPosition;
3537
+
3538
+ // Use special Unicode characters as boundaries for easy deletion
3539
+ const SKILL_START_MARKER = '\u200D'; // Zero-width joiner
3540
+ const SKILL_END_MARKER = '\u200E'; // Left-to-right mark
3541
+
3542
+ // Create skill information string
3543
+ const skillInfo = `${SKILL_START_MARKER}/${skill.name}${SKILL_END_MARKER}`;
3544
+
3545
+ // Replace / with skill selection
3546
+ const beforeSlash = currentValue.substring(0, slashPosition);
3547
+ const afterSlash = currentValue.substring(slashPosition + 1 + this.skillSelectorState.currentFilter.length);
3548
+ const newValue = `${beforeSlash}${skillInfo} ${afterSlash}`;
3549
+
3550
+ input.value = newValue;
3551
+
3552
+ // Trigger input change event for validation
3553
+ this.handleTaskInputChange({ target: input });
3554
+
3555
+ // Set cursor position after the inserted text
3556
+ const newCursorPosition = beforeSlash.length + skillInfo.length + 1;
3557
+ input.setSelectionRange(newCursorPosition, newCursorPosition);
3558
+ input.focus();
3559
+
3560
+ // Hide the selector
3561
+ this.hideSkillSelector();
3562
+ }
3563
+
3564
+ getSelectedSkillsForTask() {
3565
+ if (!this.elements.taskInput) return null;
3566
+
3567
+ const inputValue = this.elements.taskInput.value;
3568
+ const SKILL_START_MARKER = '\u200D'; // Zero-width joiner
3569
+ const SKILL_END_MARKER = '\u200E'; // Left-to-right mark
3570
+
3571
+ const skills = [];
3572
+ let startIndex = 0;
3573
+
3574
+ while ((startIndex = inputValue.indexOf(SKILL_START_MARKER, startIndex)) !== -1) {
3575
+ const endIndex = inputValue.indexOf(SKILL_END_MARKER, startIndex);
3576
+ if (endIndex !== -1) {
3577
+ const skillText = inputValue.substring(startIndex + 1, endIndex);
3578
+ if (skillText.startsWith('/')) {
3579
+ skills.push(skillText.substring(1)); // Remove the / prefix
3580
+ }
3581
+ startIndex = endIndex + 1;
3582
+ } else {
3583
+ break;
3584
+ }
3585
+ }
3586
+
3587
+ return skills.length > 0 ? skills : null;
3588
+ }
3589
+
3590
+ // Initialize social links from config
3591
+ initializeSocialLinks() {
3592
+ const socialLinksContainer = document.getElementById('social-links-container');
3593
+ if (!socialLinksContainer) {
3594
+ console.warn('[UIManager] Social links container not found');
3595
+ return;
3596
+ }
3597
+
3598
+ // Get social links from config
3599
+ const socialLinks = window.VIBESURF_CONFIG?.SOCIAL_LINKS;
3600
+ if (!socialLinks) {
3601
+ console.warn('[UIManager] Social links not found in config');
3602
+ return;
3603
+ }
3604
+
3605
+ // Clear existing content
3606
+ socialLinksContainer.innerHTML = '';
3607
+
3608
+ // Handle website link separately by making VibeSurf logo/text clickable
3609
+ const websiteUrl = socialLinks.website;
3610
+ if (websiteUrl) {
3611
+ this.initializeVibeSurfWebsiteLink(websiteUrl);
3612
+ }
3613
+
3614
+ // Create social link elements (excluding website)
3615
+ Object.entries(socialLinks).forEach(([platform, url]) => {
3616
+ if (platform !== 'website') {
3617
+ const link = this.createSocialLink(platform, url);
3618
+ if (link) {
3619
+ socialLinksContainer.appendChild(link);
3620
+ }
3621
+ }
3622
+ });
3623
+ }
3624
+
3625
+ // Make VibeSurf text clickable to link to website
3626
+ initializeVibeSurfWebsiteLink(websiteUrl) {
3627
+ // Only find elements that contain "VibeSurf" text specifically
3628
+ const allElements = document.querySelectorAll('*');
3629
+ const vibeSurfTextElements = [];
3630
+
3631
+ allElements.forEach(element => {
3632
+ // Only target elements that contain "VibeSurf" text and are likely text elements
3633
+ if (element.textContent &&
3634
+ element.textContent.trim() === 'VibeSurf' &&
3635
+ element.children.length === 0) { // Only leaf text nodes, not containers
3636
+ vibeSurfTextElements.push(element);
3637
+ }
3638
+ });
3639
+
3640
+ // Make only VibeSurf text elements clickable
3641
+ vibeSurfTextElements.forEach(element => {
3642
+ if (element && !element.querySelector('a')) { // Don't double-wrap already linked elements
3643
+ element.style.cursor = 'pointer';
3644
+ element.style.transition = 'opacity 0.2s ease';
3645
+ element.setAttribute('title', 'Login to early access alpha features');
3646
+
3647
+ // Add hover effect
3648
+ element.addEventListener('mouseenter', () => {
3649
+ element.style.opacity = '0.8';
3650
+ });
3651
+
3652
+ element.addEventListener('mouseleave', () => {
3653
+ element.style.opacity = '1';
3654
+ });
3655
+
3656
+ // Add click handler
3657
+ element.addEventListener('click', (e) => {
3658
+ e.preventDefault();
3659
+ e.stopPropagation();
3660
+ this.openWebsiteLink(websiteUrl);
3661
+ });
3662
+ }
3663
+ });
3664
+ }
3665
+
3666
+ // Open website link in new tab
3667
+ async openWebsiteLink(url) {
3668
+ try {
3669
+ console.log('[UIManager] Opening VibeSurf website:', url);
3670
+
3671
+ const result = await chrome.runtime.sendMessage({
3672
+ type: 'OPEN_FILE_URL',
3673
+ data: { fileUrl: url }
3674
+ });
3675
+
3676
+ if (!result || !result.success) {
3677
+ throw new Error(result?.error || 'Failed to open website');
3678
+ }
3679
+
3680
+ console.log('[UIManager] Successfully opened website tab:', result.tabId);
3681
+ } catch (error) {
3682
+ console.error('[UIManager] Error opening website:', error);
3683
+ this.showNotification(`Failed to open website: ${error.message}`, 'error');
3684
+ }
3685
+ }
3686
+
3687
+ // Create individual social link element
3688
+ createSocialLink(platform, url) {
3689
+ const link = document.createElement('a');
3690
+ link.href = url;
3691
+ link.className = 'social-link';
3692
+ link.setAttribute('data-platform', platform);
3693
+ link.setAttribute('target', '_blank');
3694
+ link.setAttribute('rel', 'noopener noreferrer');
3695
+
3696
+ // Set title and tooltip based on platform
3697
+ let title = '';
3698
+ let svg = '';
3699
+
3700
+ switch (platform.toLowerCase()) {
3701
+ case 'github':
3702
+ title = 'GitHub';
3703
+ svg = `<svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
3704
+ <path d="M12 0C5.374 0 0 5.373 0 12c0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23A11.509 11.509 0 0112 5.803c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576C20.566 21.797 24 17.3 24 12c0-6.627-5.373-12-12-12z" fill="currentColor"/>
3705
+ </svg>`;
3706
+ break;
3707
+
3708
+ case 'discord':
3709
+ title = 'Discord';
3710
+ svg = `<svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
3711
+ <path d="M20.317 4.37a19.791 19.791 0 00-4.885-1.515.074.074 0 00-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 00-5.487 0 12.64 12.64 0 00-.617-1.25.077.077 0 00-.079-.037A19.736 19.736 0 003.677 4.37a.07.07 0 00-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 00.031.057 19.9 19.9 0 005.993 3.03.078.078 0 00.084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 00-.041-.106 13.107 13.107 0 01-1.872-.892.077.077 0 01-.008-.128 10.2 10.2 0 00.372-.292.074.074 0 01.077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 01.078.01c.12.098.246.198.373.292a.077.077 0 01-.006.127 12.299 12.299 0 01-1.873.892.077.077 0 00-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 00.084.028 19.839 19.839 0 006.002-3.03.077.077 0 00.032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 00-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z" fill="currentColor"/>
3712
+ </svg>`;
3713
+ break;
3714
+
3715
+ case 'x':
3716
+ case 'twitter':
3717
+ title = 'X (Twitter)';
3718
+ svg = `<svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
3719
+ <path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z" fill="currentColor"/>
3720
+ </svg>`;
3721
+ break;
3722
+
3723
+
3724
+ case 'reportbug':
3725
+ title = 'Report Bug';
3726
+ svg = `<svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
3727
+ <path d="M20 8h-2.81c-.45-.78-1.07-1.45-1.82-1.96L17 4.41 15.59 3l-2.17 2.17C12.96 5.06 12.49 5 12 5c-.49 0-.96.06-1.42.17L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20V8zm-6 8h-4v-2h4v2zm0-4h-4v-2h4v2z" fill="currentColor"/>
3728
+ </svg>`;
3729
+ break;
3730
+
3731
+ default:
3732
+ console.warn(`[UIManager] Unknown social platform: ${platform}`);
3733
+ return null;
3734
+ }
3735
+
3736
+ link.setAttribute('title', title);
3737
+ link.innerHTML = svg;
3738
+
3739
+ return link;
3740
+ }
3741
+
3742
+ // Export for use in other modules
3743
+ static exportToWindow() {
3744
+ if (typeof window !== 'undefined') {
3745
+ window.VibeSurfUIManager = VibeSurfUIManager;
3746
+ }
3747
+ }
2895
3748
  }
2896
3749
 
2897
- // Export for use in other modules
2898
- if (typeof window !== 'undefined') {
2899
- window.VibeSurfUIManager = VibeSurfUIManager;
2900
- }
3750
+ // Call the export method
3751
+ VibeSurfUIManager.exportToWindow();