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