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
@@ -31,14 +31,19 @@ from browser_use.tools.views import NoParamsAction
31
31
  from vibe_surf.browser.agent_browser_session import AgentBrowserSession
32
32
  from vibe_surf.tools.views import HoverAction, ExtractionAction, FileExtractionAction, BrowserUseAgentExecution, \
33
33
  ReportWriterTask, TodoGenerateAction, TodoModifyAction, VibeSurfDoneAction, SkillSearchAction, SkillCrawlAction, \
34
- SkillSummaryAction, SkillTakeScreenshotAction, SkillDeepResearchAction, SkillCodeAction, SkillFinanceAction
34
+ SkillSummaryAction, SkillTakeScreenshotAction, SkillDeepResearchAction, SkillCodeAction, SkillFinanceAction, \
35
+ SkillXhsAction, SkillDouyinAction, SkillYoutubeAction, SkillWeiboAction, GrepContentAction, \
36
+ SearchToolAction, GetToolInfoAction, ExecuteExtraToolAction
35
37
  from vibe_surf.tools.finance_tools import FinanceDataRetriever, FinanceMarkdownFormatter, FinanceMethod
36
38
  from vibe_surf.tools.mcp_client import CustomMCPClient
39
+ from vibe_surf.tools.composio_client import ComposioClient
37
40
  from vibe_surf.tools.file_system import CustomFileSystem
38
41
  from vibe_surf.browser.browser_manager import BrowserManager
39
42
  from vibe_surf.tools.vibesurf_registry import VibeSurfRegistry
40
43
  from bs4 import BeautifulSoup
41
44
  from vibe_surf.logger import get_logger
45
+ from vibe_surf.tools.utils import clean_html_basic
46
+ from vibe_surf.tools.utils import _extract_structured_content, _rank_search_results_with_llm, extract_file_content_with_llm
42
47
 
43
48
  logger = get_logger(__name__)
44
49
 
@@ -47,125 +52,9 @@ Context = TypeVar('Context')
47
52
  T = TypeVar('T', bound=BaseModel)
48
53
 
49
54
 
50
- def clean_html_basic(page_html_content, max_text_length=100):
51
- soup = BeautifulSoup(page_html_content, 'html.parser')
52
-
53
- for script in soup(["script", "style"]):
54
- script.decompose()
55
-
56
- from bs4 import Comment
57
- comments = soup.findAll(text=lambda text: isinstance(text, Comment))
58
- for comment in comments:
59
- comment.extract()
60
-
61
- for text_node in soup.find_all(string=True):
62
- if text_node.parent.name not in ['script', 'style']:
63
- clean_text = ' '.join(text_node.split())
64
-
65
- if len(clean_text) > max_text_length:
66
- clean_text = clean_text[:max_text_length].rstrip() + "..."
67
-
68
- if clean_text != text_node:
69
- text_node.replace_with(clean_text)
70
-
71
- important_attrs = ['id', 'class', 'name', 'role', 'type',
72
- 'colspan', 'rowspan', 'headers', 'scope',
73
- 'href', 'src', 'alt', 'title']
74
-
75
- for tag in soup.find_all():
76
- attrs_to_keep = {}
77
- for attr in list(tag.attrs.keys()):
78
- if (attr in important_attrs or
79
- attr.startswith('data-') or
80
- attr.startswith('aria-')):
81
- attrs_to_keep[attr] = tag.attrs[attr]
82
- tag.attrs = attrs_to_keep
83
-
84
- return str(soup)
85
-
86
-
87
- def get_sibling_position(node: EnhancedDOMTreeNode) -> int:
88
- """Get the position of node among its siblings with the same tag"""
89
- if not node.parent_node:
90
- return 1
91
-
92
- tag_name = node.tag_name
93
- position = 1
94
-
95
- # Find siblings with same tag name before this node
96
- for sibling in node.parent_node.children:
97
- if sibling == node:
98
- break
99
- if sibling.tag_name == tag_name:
100
- position += 1
101
-
102
- return position
103
-
104
-
105
- def extract_css_hints(node: EnhancedDOMTreeNode) -> dict:
106
- """Extract CSS selector construction hints"""
107
- hints = {}
108
-
109
- if "id" in node.attributes:
110
- hints["id"] = f"#{node.attributes['id']}"
111
-
112
- if "class" in node.attributes:
113
- classes = node.attributes["class"].split()
114
- hints["class"] = f".{'.'.join(classes[:3])}" # Limit class count
115
-
116
- # Attribute selector hints
117
- for attr in ["name", "data-testid", "type"]:
118
- if attr in node.attributes:
119
- hints[f"attr_{attr}"] = f"[{attr}='{node.attributes[attr]}']"
120
-
121
- return hints
122
-
123
-
124
- def convert_selector_map_for_llm(selector_map) -> dict:
125
- """
126
- Convert complex selector_map to simplified format suitable for LLM understanding and JS code writing
127
- """
128
- simplified_elements = []
129
-
130
- for element_index, node in selector_map.items():
131
- if node.is_visible and node.element_index is not None: # Only include visible interactive elements
132
- element_info = {
133
- "tag": node.tag_name,
134
- "text": node.get_meaningful_text_for_llm()[:200], # Limit text length
135
-
136
- # Selector information - most needed for JS code
137
- "selectors": {
138
- "xpath": node.xpath,
139
- "css_hints": extract_css_hints(node), # Extract id, class etc
140
- },
141
-
142
- # Element semantics
143
- "role": node.ax_node.role if node.ax_node else None,
144
- "type": node.attributes.get("type"),
145
- "aria_label": node.attributes.get("aria-label"),
146
-
147
- # Key attributes
148
- "attributes": {k: v for k, v in node.attributes.items()
149
- if k in ["id", "class", "name", "href", "src", "value", "placeholder", "data-testid"]},
150
-
151
- # Interactivity
152
- "is_clickable": node.snapshot_node.is_clickable if node.snapshot_node else False,
153
- "is_input": node.tag_name.lower() in ["input", "textarea", "select"],
154
-
155
- # Structure information
156
- "parent_tag": node.parent_node.tag_name if node.parent_node else None,
157
- "position_info": f"{node.tag_name}[{get_sibling_position(node)}]"
158
- }
159
- simplified_elements.append(element_info)
160
-
161
- return {
162
- "page_elements": simplified_elements,
163
- "total_elements": len(simplified_elements)
164
- }
165
-
166
-
167
55
  class VibeSurfTools:
168
- def __init__(self, exclude_actions: list[str] = [], mcp_server_config: Optional[Dict[str, Any]] = None):
56
+ def __init__(self, exclude_actions: list[str] = [], mcp_server_config: Optional[Dict[str, Any]] = None,
57
+ composio_client: ComposioClient = None):
169
58
  self.registry = VibeSurfRegistry(exclude_actions)
170
59
  self._register_file_actions()
171
60
  self._register_browser_use_agent()
@@ -173,12 +62,27 @@ class VibeSurfTools:
173
62
  self._register_todo_actions()
174
63
  self._register_done_action()
175
64
  self._register_skills()
65
+ self._register_extra_tools()
176
66
  self.mcp_server_config = mcp_server_config
177
67
  self.mcp_clients: Dict[str, MCPClient] = {}
68
+ self.composio_toolkits: Dict[str, Any] = {}
69
+ self.composio_client: ComposioClient = composio_client
70
+
71
+ def get_all_action_names(self, exclude_actions: Optional[list] = None) -> list[str]:
72
+ action_names = []
73
+ for action_name in self.registry.registry.actions:
74
+ add_flag = True
75
+ for ex_action_name in exclude_actions:
76
+ if action_name.startswith(ex_action_name) or ex_action_name in action_name:
77
+ add_flag = False
78
+ break
79
+ if add_flag:
80
+ action_names.append(action_name)
81
+ return action_names
178
82
 
179
83
  def _register_skills(self):
180
84
  @self.registry.action(
181
- 'Skill: Advanced parallel search - analyze user intent and generate 5 different search tasks, perform parallel Google searches, and return top 10 most relevant results',
85
+ 'Advanced search',
182
86
  param_model=SkillSearchAction,
183
87
  )
184
88
  async def skill_search(
@@ -187,187 +91,109 @@ class VibeSurfTools:
187
91
  page_extraction_llm: BaseChatModel
188
92
  ):
189
93
  """
190
- Skill: Advanced parallel search with LLM-generated search strategies
94
+ Advanced search skill that uses Google AI model search as primary method,
95
+ with fallback to parallel search across all/news/videos tabs.
96
+
97
+ Primary Method: Google AI model search (udm=50) with "show more" button click
98
+ Fallback Method: Parallel search across all, news, and videos tabs
99
+
100
+ Args:
101
+ params: SkillSearchAction containing query and rank parameters
102
+ browser_manager: Browser manager for creating browser sessions
103
+ page_extraction_llm: LLM for ranking results when rank=True
104
+
105
+ Returns:
106
+ ActionResult with formatted search results
191
107
  """
192
- llm = page_extraction_llm
108
+ from vibe_surf.tools.utils import google_ai_model_search, fallback_parallel_search
109
+
193
110
  agent_ids = []
194
111
  try:
195
- if not llm:
196
- raise RuntimeError("LLM is required for skill_search")
197
-
198
- # Step 1: Use LLM to analyze user intent and generate different search tasks
199
- query_num = 6
200
- from datetime import datetime
201
- analysis_prompt = f"""
202
- Analyze the user query and generate 5 different Google search strategies to comprehensively find relevant information.
112
+ # Step 1: Try Google AI model search first (primary method)
113
+ logger.info(f'🔍 Starting Google AI model search for: {params.query}')
203
114
 
204
- Current Time: {datetime.now().isoformat()}
115
+ # Attempt Google AI model search with udm=50
116
+ ai_search_results = await google_ai_model_search(browser_manager, params.query, max_results=15)
205
117
 
206
- User Query: "{params.query}"
118
+ # Step 2: If AI search fails or returns insufficient results, use fallback method
119
+ if not ai_search_results or len(ai_search_results) == 0:
120
+ logger.info(f'🔄 Google AI search returned no results, using fallback parallel search')
207
121
 
208
- Generate {query_num} different search queries that approach this topic from different angles. Each search should be:
209
- 1. Specific and concrete (good for Google search)
210
- 2. Different from the others (different perspectives/aspects)
211
- 3. Likely to return valuable, unique information
212
-
213
- Return your response as a JSON array of {query_num} search query strings.
214
- Example format: ["query 1", "query 2", "query 3", "query 4", "query 5", "query 6"]
215
- """
216
-
217
- from browser_use.llm.messages import SystemMessage, UserMessage
218
- response = await llm.ainvoke([
219
- SystemMessage(content="You are an expert at generating comprehensive search strategies."),
220
- UserMessage(content=analysis_prompt)
221
- ])
222
-
223
- # Parse the search queries
224
- import json
225
- try:
226
- search_queries = json.loads(response.completion.strip())
227
- if not isinstance(search_queries, list):
228
- raise ValueError("Invalid search queries format")
229
- search_queries = search_queries[:query_num]
230
- except (json.JSONDecodeError, ValueError):
231
- # Fallback to simple queries if parsing fails
232
- try:
233
- from json_repair import repair_json
234
- search_queries_s = repair_json(response.completion.strip())
235
- search_queries = json.loads(search_queries_s)
236
- search_queries = search_queries[:query_num]
237
- except Exception as e:
238
- search_queries = [
239
- params.query,
240
- f"{params.query} guide",
241
- f"{params.query} best practices",
242
- f"{params.query} examples",
243
- f"{params.query} latest news"
244
- ]
245
-
246
- # Step 2: Create browser sessions for parallel searching
247
- register_sessions = []
248
-
249
- for i, query in enumerate(search_queries[:query_num]):
250
- agent_id = f"search_agent_{i + 1:03d}"
251
- register_sessions.append(
252
- browser_manager.register_agent(agent_id, target_id=None)
253
- )
254
- agent_ids.append(agent_id)
255
-
256
- agent_browser_sessions = await asyncio.gather(*register_sessions)
257
-
258
- # Step 3: Perform parallel Google searches
259
- search_tasks = []
260
- for i, (browser_session, query) in enumerate(zip(agent_browser_sessions, search_queries)):
261
- search_tasks.append(self._perform_google_search(browser_session, query, llm))
262
-
263
- search_results = await asyncio.gather(*search_tasks, return_exceptions=True)
264
- # Step 4: Aggregate and filter results
265
- all_results = []
266
- for i, result in enumerate(search_results):
267
- if isinstance(result, Exception):
268
- logger.error(f"Search task {i + 1} failed: {result}")
269
- continue
270
- if result:
271
- all_results.extend(result)
272
-
273
- # Step 4.5: Rule-based deduplication to reduce LLM processing load
274
- # if all_results:
275
- # deduplicated_results = self._rule_based_deduplication(all_results)
276
- # logger.info(f"Rule-based deduplication: {len(all_results)} -> {len(deduplicated_results)} results")
277
- # else:
278
- # deduplicated_results = []
279
-
280
- # Step 5: Use LLM only for final ranking and selection (much smaller dataset now)
281
- if all_results and len(all_results) > 10:
282
- # Only use LLM if we have more than 10 results to rank
283
- # Create indexed results for LLM prompt
284
- indexed_results = []
285
- for i, result in enumerate(all_results):
286
- indexed_results.append({
287
- "index": i,
288
- "title": result.get('title', 'Unknown Title'),
289
- "url": result.get('url', 'No URL'),
290
- "summary": result.get('summary', 'No summary available')
291
- })
292
-
293
- ranking_prompt = f"""
294
- Rank these search results for the query "{params.query}" by relevance and value.
295
- Select the TOP 10 most relevant and valuable results.
296
-
297
- Search Results ({len(indexed_results)} total):
298
- {json.dumps(indexed_results, indent=2, ensure_ascii=False)}
299
-
300
- Return ONLY the indices of the top 10 results as a JSON array of numbers.
301
- For example: [0, 5, 2, 8, 1, 9, 3, 7, 4, 6]
302
-
303
- Format: [index1, index2, index3, ...]
304
- """
122
+ # Use parallel search across all, news, and videos tabs
123
+ fallback_results = await fallback_parallel_search(browser_manager, params.query, max_results=15)
124
+ all_results = fallback_results
125
+ else:
126
+ logger.info(f'✅ Google AI search found {len(ai_search_results)} results')
127
+ all_results = ai_search_results
305
128
 
306
- ranking_response = await llm.ainvoke([
307
- SystemMessage(
308
- content="You are an expert at ranking search results for relevance and value. Return only the indices of the top results."),
309
- UserMessage(content=ranking_prompt)
310
- ])
129
+ # Step 3: Process results based on rank parameter
130
+ if params.rank and all_results and len(all_results) > 10:
131
+ logger.info(f'🔄 Using LLM ranking for {len(all_results)} results')
311
132
 
312
- try:
313
- selected_indices = json.loads(ranking_response.completion.strip())
314
- if not isinstance(selected_indices, list):
315
- raise ValueError("Invalid ranking results format")
316
- # Ensure indices are valid and limit to 10
317
- valid_indices = [i for i in selected_indices if isinstance(i, int) and 0 <= i < len(all_results)][:10]
318
- if valid_indices:
319
- top_results = [all_results[i] for i in valid_indices]
320
- else:
321
- top_results = all_results[:10]
322
- except (json.JSONDecodeError, ValueError):
323
- try:
324
- selected_indices_s = repair_json(ranking_response.completion.strip())
325
- selected_indices = json.loads(selected_indices_s)
326
- if isinstance(selected_indices, list):
327
- valid_indices = [i for i in selected_indices if isinstance(i, int) and 0 <= i < len(all_results)][:10]
328
- if valid_indices:
329
- top_results = [all_results[i] for i in valid_indices]
330
- else:
331
- top_results = all_results[:10]
332
- else:
333
- top_results = all_results[:10]
334
- except Exception:
335
- # Fallback to first 10 results
336
- top_results = all_results[:10]
337
- elif all_results:
338
- # If we have 10 or fewer results, skip LLM ranking
339
- top_results = all_results[:10]
340
- logger.info(f"Skipping LLM ranking for {len(all_results)} results (≤10)")
133
+ if not page_extraction_llm:
134
+ logger.warning("LLM not available for ranking, returning unranked results")
135
+ top_results = all_results[:15]
136
+ else:
137
+ # Use LLM ranking when rank=True and we have many results
138
+ top_results = await _rank_search_results_with_llm(
139
+ all_results, params.query, page_extraction_llm
140
+ )
141
+ elif params.rank and all_results and len(all_results) <= 10:
142
+ logger.info(f'⭐ Skipping LLM ranking for {len(all_results)} results (≤10)')
143
+ top_results = all_results
341
144
  else:
342
- top_results = []
145
+ # When rank=False, return results from different tabs (5 each from all, news, videos)
146
+ if hasattr(all_results, '__iter__') and all_results:
147
+ # Group results by source_tab if available, otherwise take first 15
148
+ tab_groups = {'all': [], 'news': [], 'videos': [], 'other': []}
149
+
150
+ for result in all_results:
151
+ source_tab = result.get('source_tab', 'other')
152
+ tab_groups[source_tab].append(result)
153
+
154
+ # Take up to 5 results from each tab
155
+ top_results = []
156
+ for tab_name in ['all', 'news', 'videos', 'other']:
157
+ top_results.extend(tab_groups[tab_name][:5])
158
+
159
+ # If we don't have enough results from tabs, take the first 15 overall
160
+ if len(top_results) < 15:
161
+ top_results = all_results[:15]
162
+ else:
163
+ top_results = all_results[:15] if all_results else []
343
164
 
344
- # Format results for display
165
+ # Step 4: Format results for display
345
166
  if top_results:
346
- results_text = f"🔍 Advanced Search Results for '{params.query}':\n\n"
347
- for i, result in enumerate(top_results[:10]):
167
+ results_text = f"🔍 Search Results for '{params.query}':\n\n"
168
+ for i, result in enumerate(top_results):
348
169
  title = result.get('title', 'Unknown Title')
349
170
  url = result.get('url', 'No URL')
350
- summary = result.get('summary', 'No summary available')
351
- results_text += f"{i}. **{title}**\n URL: {url}\n Summary: {summary}\n\n"
171
+ summary = result.get('summary', 'No description available')
172
+
173
+ results_text += f"{i + 1}. **{title}**\n URL: {url}\n Summary: {summary}\n\n"
352
174
  else:
353
175
  results_text = f"No results found for query: {params.query}"
354
176
 
355
- logger.info(f'🔍 Skill Search completed for: {params.query}')
177
+ logger.info(f'🔍 Skill Search completed for: {params.query}, found {len(top_results)} results')
356
178
  return ActionResult(
357
179
  extracted_content=results_text,
358
180
  include_extracted_content_only_once=True,
359
- long_term_memory=f'Advanced search completed for: {params.query}, found {len(top_results)} relevant results',
181
+ long_term_memory=f'Search completed for: {params.query}, found {len(top_results)} relevant results using {"AI model search" if ai_search_results else "fallback search"}'
360
182
  )
361
183
 
362
184
  except Exception as e:
363
185
  logger.error(f'❌ Skill Search failed: {e}')
364
186
  return ActionResult(error=f'Skill search failed: {str(e)}')
365
187
  finally:
366
- for i, agent_id in enumerate(agent_ids):
367
- await browser_manager.unregister_agent(agent_id, close_tabs=True)
188
+ # Clean up browser sessions
189
+ for agent_id in agent_ids:
190
+ try:
191
+ await browser_manager.unregister_agent(agent_id, close_tabs=True)
192
+ except Exception as cleanup_error:
193
+ logger.warning(f"Failed to cleanup agent {agent_id}: {cleanup_error}")
368
194
 
369
195
  @self.registry.action(
370
- 'Skill: Crawl a web page and extract structured information from a webpage with optional tab selection',
196
+ '',
371
197
  param_model=SkillCrawlAction,
372
198
  )
373
199
  async def skill_crawl(
@@ -387,13 +213,22 @@ Format: [index1, index2, index3, ...]
387
213
  browser_session = browser_manager.main_browser_session
388
214
 
389
215
  # If tab_id is provided, switch to that tab
216
+ target_id = None
390
217
  if params.tab_id:
391
218
  target_id = await browser_session.get_target_id_from_tab_id(params.tab_id)
219
+ url = await browser_session.get_current_page_url()
220
+ current_target_id = None
221
+ current_url = None
222
+ if browser_session._dom_watchdog and browser_session._dom_watchdog.enhanced_dom_tree:
223
+ current_target_id = browser_session._dom_watchdog.enhanced_dom_tree.target_id
224
+ current_url = browser_session._dom_watchdog.enhanced_dom_tree.current_url
225
+ if current_target_id != target_id or url != current_url:
226
+ browser_session._dom_watchdog.clear_cache()
392
227
  await browser_session.get_or_create_cdp_session(target_id, focus=True)
393
228
 
394
229
  # Extract structured content using the existing method
395
- extracted_content = await self._extract_structured_content(
396
- browser_session, params.query, llm
230
+ extracted_content = await _extract_structured_content(
231
+ browser_session, params.query, llm, target_id=target_id
397
232
  )
398
233
 
399
234
  current_url = await browser_session.get_current_page_url()
@@ -420,7 +255,7 @@ Format: [index1, index2, index3, ...]
420
255
  return ActionResult(error=f'Skill crawl failed: {str(e)}')
421
256
 
422
257
  @self.registry.action(
423
- 'Skill: Summarize webpage content with optional tab selection',
258
+ '',
424
259
  param_model=SkillSummaryAction,
425
260
  )
426
261
  async def skill_summary(
@@ -440,13 +275,22 @@ Format: [index1, index2, index3, ...]
440
275
  browser_session = browser_manager.main_browser_session
441
276
 
442
277
  # If tab_id is provided, switch to that tab
278
+ target_id = None
443
279
  if params.tab_id:
444
280
  target_id = await browser_session.get_target_id_from_tab_id(params.tab_id)
281
+ url = await browser_session.get_current_page_url()
282
+ current_target_id = None
283
+ current_url = None
284
+ if browser_session._dom_watchdog and browser_session._dom_watchdog.enhanced_dom_tree:
285
+ current_target_id = browser_session._dom_watchdog.enhanced_dom_tree.target_id
286
+ current_url = browser_session._dom_watchdog.enhanced_dom_tree.current_url
287
+ if current_target_id != target_id or url != current_url:
288
+ browser_session._dom_watchdog.clear_cache()
445
289
  await browser_session.get_or_create_cdp_session(target_id, focus=True)
446
290
 
447
291
  # Extract and summarize content
448
- summary = await self._extract_structured_content(
449
- browser_session, "Provide a comprehensive summary of this webpage", llm
292
+ summary = await _extract_structured_content(
293
+ browser_session, "Provide a comprehensive summary of this webpage", llm, target_id=target_id
450
294
  )
451
295
 
452
296
  current_url = await browser_session.get_current_page_url()
@@ -473,7 +317,7 @@ Format: [index1, index2, index3, ...]
473
317
  return ActionResult(error=f'Skill summary failed: {str(e)}')
474
318
 
475
319
  @self.registry.action(
476
- 'Skill: Take screenshot of current page or specified tab',
320
+ '',
477
321
  param_model=SkillTakeScreenshotAction,
478
322
  )
479
323
  async def skill_screenshot(
@@ -494,7 +338,7 @@ Format: [index1, index2, index3, ...]
494
338
  await browser_session.get_or_create_cdp_session(target_id, focus=True)
495
339
 
496
340
  # Take screenshot using browser session
497
- screenshot = await browser_session.take_screenshot()
341
+ screenshot_bytes = await browser_session.take_screenshot()
498
342
 
499
343
  # Generate timestamp for filename
500
344
  timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
@@ -514,9 +358,9 @@ Format: [index1, index2, index3, ...]
514
358
  filepath = screenshots_dir / filename
515
359
 
516
360
  with open(filepath, "wb") as f:
517
- f.write(base64.b64decode(screenshot))
361
+ f.write(screenshot_bytes)
518
362
 
519
- msg = f'📸 Screenshot saved to path: {str(filepath.relative_to(fs_dir))}'
363
+ msg = f'📸 Screenshot saved to path: [{filename}]({str(filepath.relative_to(fs_dir))})'
520
364
  logger.info(msg)
521
365
  return ActionResult(
522
366
  extracted_content=msg,
@@ -530,7 +374,7 @@ Format: [index1, index2, index3, ...]
530
374
  return ActionResult(error=error_msg)
531
375
 
532
376
  @self.registry.action(
533
- 'Skill: Execute JavaScript code on webpage with optional tab selection - accepts functional requirements, code prompts, or code snippets that will be processed by LLM to generate proper executable JavaScript',
377
+ 'Execute JavaScript code on webpage',
534
378
  param_model=SkillCodeAction,
535
379
  )
536
380
  async def skill_code(
@@ -555,261 +399,23 @@ Format: [index1, index2, index3, ...]
555
399
  target_id = await browser_session.get_target_id_from_tab_id(params.tab_id)
556
400
  await browser_session.get_or_create_cdp_session(target_id, focus=True)
557
401
 
558
- # Get browser state and convert for LLM
559
- # browser_state = await browser_session.get_browser_state_summary()
560
- # web_page_description = browser_state.dom_state.llm_representation()
561
-
562
- page_html_content = await browser_session.get_html_content()
563
- web_page_html = clean_html_basic(page_html_content)
564
- if len(web_page_html) > 30000:
565
- web_page_html = web_page_html[:24000] + "..." + web_page_html[-6000:]
566
-
567
- # Get current page URL for context
568
- current_url = await browser_session.get_current_page_url()
569
-
570
- # Create base system prompt for JavaScript code generation
571
- base_system_prompt = """You are an expert JavaScript developer specializing in browser automation and DOM manipulation.
572
-
573
- You will be given a functional requirement or code prompt, along with the current page's DOM structure information.
574
- Your task is to generate valid, executable JavaScript code that accomplishes the specified requirement.
575
-
576
- IMPORTANT GUIDELINES:
577
- This JavaScript code gets executed with Runtime.evaluate and 'returnByValue': True, 'awaitPromise': True
578
-
579
- SYNTAX RULES - FAILURE TO FOLLOW CAUSES "Uncaught at line 0" ERRORS:
580
- - ALWAYS wrap your code in IIFE: (function(){ ... })() or (async function(){ ... })() for async code
581
- - ALWAYS add try-catch blocks to prevent execution errors
582
- - ALWAYS use proper semicolons and valid JavaScript syntax
583
- - NEVER write multiline code without proper IIFE wrapping
584
- - ALWAYS validate elements exist before accessing them
585
-
586
- EXAMPLES:
587
- Use this tool when other tools do not work on the first try as expected or when a more general tool is needed, e.g. for filling a form all at once, hovering, dragging, extracting only links, extracting content from the page, press and hold, hovering, clicking on coordinates, zooming, use this if the user provides custom selectors which you can otherwise not interact with ....
588
- You can also use it to explore the website.
589
- - Write code to solve problems you could not solve with other tools.
590
- - Don't write comments in here, no human reads that.
591
- - Write only valid js code.
592
- - use this to e.g. extract + filter links, convert the page to json into the format you need etc...
593
-
594
- - limit the output otherwise your context will explode
595
- - think if you deal with special elements like iframes / shadow roots etc
596
- - Adopt your strategy for React Native Web, React, Angular, Vue, MUI pages etc.
597
- - e.g. with synthetic events, keyboard simulation, shadow DOM, etc.
598
-
599
- PROPER SYNTAX EXAMPLES:
600
- CORRECT: (function(){ try { const el = document.querySelector('#id'); return el ? el.value : 'not found'; } catch(e) { return 'Error: ' + e.message; } })()
601
- CORRECT: (async function(){ try { await new Promise(r => setTimeout(r, 100)); return 'done'; } catch(e) { return 'Error: ' + e.message; } })()
602
-
603
- WRONG: const el = document.querySelector('#id'); el ? el.value : '';
604
- WRONG: document.querySelector('#id').value
605
- WRONG: Multiline code without IIFE wrapping
606
-
607
- SHADOW DOM ACCESS EXAMPLE:
608
- (function(){
609
- try {
610
- const hosts = document.querySelectorAll('*');
611
- for (let host of hosts) {
612
- if (host.shadowRoot) {
613
- const el = host.shadowRoot.querySelector('#target');
614
- if (el) return el.textContent;
615
- }
616
- }
617
- return 'Not found';
618
- } catch(e) {
619
- return 'Error: ' + e.message;
620
- }
621
- })()
622
-
623
- ## Return values:
624
- - Async functions (with await, promises, timeouts) are automatically handled
625
- - Returns strings, numbers, booleans, and serialized objects/arrays
626
- - Use JSON.stringify() for complex objects: JSON.stringify(Array.from(document.querySelectorAll('a')).map(el => el.textContent.trim()))
627
-
628
- OUTPUT FORMAT:
629
- Return ONLY the JavaScript code, no explanations or markdown formatting."""
630
-
631
- # Initialize message history for iterative prompting
632
- from browser_use.llm.messages import SystemMessage, UserMessage
633
- message_history = [SystemMessage(content=base_system_prompt)]
634
-
635
- # Initial user prompt
636
- initial_user_prompt = f"""Current Page URL: {current_url}
637
-
638
- USER REQUIREMENT: {params.code_requirement}
639
-
640
- Web Page Html Content:
641
- {web_page_html}
642
-
643
- Generate JavaScript code to fulfill the requirement:"""
644
-
645
- message_history.append(UserMessage(content=initial_user_prompt))
646
-
647
- # Get CDP session for JavaScript execution
648
- cdp_session = await browser_session.get_or_create_cdp_session()
649
-
650
- # Iterative code generation and execution
651
- for iteration in range(1, MAX_ITERATIONS + 1):
652
- try:
653
- logger.info(f'🔄 Skill Code iteration {iteration}/{MAX_ITERATIONS}')
654
-
655
- # Generate JavaScript code using LLM with message history
656
- response = await asyncio.wait_for(
657
- page_extraction_llm.ainvoke(message_history),
658
- timeout=60.0,
659
- )
660
-
661
- generated_js_code = response.completion.strip()
662
- message_history.append(AssistantMessage(content=generated_js_code))
663
-
664
- # Clean up the generated code (remove markdown if present)
665
- if generated_js_code.startswith('```javascript'):
666
- generated_js_code = generated_js_code.replace('```javascript', '').replace('```',
667
- '').strip()
668
- elif generated_js_code.startswith('```js'):
669
- generated_js_code = generated_js_code.replace('```js', '').replace('```', '').strip()
670
- elif generated_js_code.startswith('```'):
671
- generated_js_code = generated_js_code.replace('```', '').strip()
672
-
673
- # Execute the generated JavaScript code
674
- try:
675
- logger.info(generated_js_code)
676
- # Always use awaitPromise=True - it's ignored for non-promises
677
- result = await cdp_session.cdp_client.send.Runtime.evaluate(
678
- params={'expression': generated_js_code, 'returnByValue': True, 'awaitPromise': True},
679
- session_id=cdp_session.session_id,
680
- )
402
+ from vibe_surf.tools.utils import generate_java_script_code
681
403
 
682
- logger.info(result)
683
- # Check for JavaScript execution errors
684
- if result.get('exceptionDetails'):
685
- exception = result['exceptionDetails']
686
- error_msg = f'JavaScript execution error: {exception.get("text", "Unknown error")}'
687
- if 'lineNumber' in exception:
688
- error_msg += f' at line {exception["lineNumber"]}'
689
-
690
- # Add error feedback to message history for next iteration
691
- if iteration < MAX_ITERATIONS:
692
- error_feedback = f"""The previous JavaScript code failed with error:
693
- {error_msg}
694
-
695
- Please fix the error and generate corrected JavaScript code:"""
696
- message_history.append(UserMessage(content=error_feedback))
697
- continue # Try next iteration
698
- else:
699
- # Final iteration, return error
700
- msg = f'Requirement: {params.code_requirement}\n\nFinal Generated Code (Iteration {iteration}): {generated_js_code}\n\nError: {error_msg}'
701
- logger.info(msg)
702
- return ActionResult(error=msg)
703
-
704
- # Get the result data
705
- result_data = result.get('result', {})
706
-
707
- # Check for wasThrown flag (backup error detection)
708
- if result_data.get('wasThrown'):
709
- error_msg = 'JavaScript execution failed (wasThrown=true)'
710
-
711
- # Add error feedback to message history for next iteration
712
- if iteration < MAX_ITERATIONS:
713
- error_feedback = f"""The previous JavaScript code failed with error:
714
- {error_msg}
715
-
716
- Please fix the error and generate corrected JavaScript code:"""
717
- message_history.append(UserMessage(content=error_feedback))
718
- continue # Try next iteration
719
- else:
720
- # Final iteration, return error
721
- msg = f'Requirement: {params.code_requirement}\n\nFinal Generated Code (Iteration {iteration}): {generated_js_code}\n\nError: {error_msg}'
722
- logger.info(msg)
723
- return ActionResult(error=msg)
724
-
725
- # Get the actual value
726
- value = result_data.get('value')
727
-
728
- # Handle different value types
729
- if value is None:
730
- # Could be legitimate null/undefined result
731
- result_text = str(value) if 'value' in result_data else 'undefined'
732
- elif isinstance(value, (dict, list)):
733
- # Complex objects - should be serialized by returnByValue
734
- try:
735
- result_text = json.dumps(value, ensure_ascii=False, indent=2)
736
- except (TypeError, ValueError):
737
- # Fallback for non-serializable objects
738
- result_text = str(value)
739
- else:
740
- # Primitive values (string, number, boolean)
741
- result_text = str(value)
742
-
743
- # Check if result is empty or meaningless
744
- if (not result_text or
745
- result_text.strip() in ['', 'null', 'undefined', '[]', '{}'] or
746
- len(result_text.strip()) == 0):
747
-
748
- # Add empty result feedback to message history for next iteration
749
- if iteration < MAX_ITERATIONS:
750
- empty_feedback = f"""The previous JavaScript code executed successfully but returned empty/meaningless result:
751
- Result: {result_text}
752
-
753
- The result is empty or not useful. Please generate improved JavaScript code that returns meaningful data:"""
754
- message_history.append(UserMessage(content=empty_feedback))
755
- continue # Try next iteration
756
- else:
757
- # Final iteration, return empty result with warning
758
- msg = f'Requirement: {params.code_requirement}\n\nFinal Generated Code (Iteration {iteration}): {generated_js_code}\n\nWarning: Empty or meaningless result: {result_text}'
759
- logger.info(msg)
760
- return ActionResult(
761
- extracted_content=msg,
762
- long_term_memory=f'Generated JavaScript code (iteration {iteration}) for requirement: {params.code_requirement} - Empty result warning',
763
- )
764
-
765
- # Apply length limit with better truncation
766
- if len(result_text) > 30000:
767
- result_text = result_text[:30000] + '\n... [Truncated after 30000 characters]'
768
-
769
- # Success! Return the result
770
- msg = f'Generated Code (Iteration {iteration}): \n```javascript\n{generated_js_code}\n```\nResult:\n```json\n {result_text}\n```\n'
771
- logger.info(f'✅ Skill Code succeeded on iteration {iteration}')
772
-
773
- return ActionResult(
774
- extracted_content=msg,
775
- long_term_memory=f'Generated and executed JavaScript code (iteration {iteration}) for requirement: {params.code_requirement}',
776
- )
777
-
778
- except Exception as e:
779
- # CDP communication or other system errors
780
- error_msg = f'Failed to execute JavaScript: {type(e).__name__}: {e}'
781
-
782
- # Add system error feedback to message history for next iteration
783
- if iteration < MAX_ITERATIONS:
784
- system_error_feedback = f"""The previous JavaScript code failed to execute due to system error:
785
- {error_msg}
786
-
787
- Please generate alternative JavaScript code that avoids this system error:"""
788
- message_history.append(UserMessage(content=system_error_feedback))
789
- continue # Try next iteration
790
- else:
791
- # Final iteration, return system error
792
- error_msg = f'Requirement: {params.code_requirement}\n\nFinal Generated Code (Iteration {iteration}): {generated_js_code}\n\nError: {error_msg}'
793
- logger.info(error_msg)
794
- return ActionResult(error=error_msg)
795
-
796
- except Exception as e:
797
- # LLM generation error
798
- logger.error(f'❌ LLM generation failed on iteration {iteration}: {e}')
799
- if iteration == MAX_ITERATIONS:
800
- return ActionResult(
801
- error=f'LLM generation failed after {MAX_ITERATIONS} iterations: {str(e)}')
802
- continue # Try next iteration with same message history
803
-
804
- # Should not reach here, but just in case
805
- return ActionResult(error=f'Skill code failed after {MAX_ITERATIONS} iterations')
404
+ success, execute_result, js_code = await generate_java_script_code(params.code_requirement,
405
+ page_extraction_llm, browser_session,
406
+ MAX_ITERATIONS=5)
407
+ msg = f'```javascript\n{js_code}\n```\nResult:\n```json\n {execute_result}\n```\n'
408
+ if success:
409
+ return ActionResult(extracted_content=msg)
410
+ else:
411
+ return ActionResult(error=msg)
806
412
 
807
413
  except Exception as e:
808
414
  logger.error(f'❌ Skill Code failed: {e}')
809
415
  return ActionResult(error=f'Skill code failed: {str(e)}')
810
416
 
811
417
  @self.registry.action(
812
- 'Skill: Deep research mode - Only return the guideline for deep research. Please follow the guideline to do real deep research actions.',
418
+ 'Return the guideline for deep research. Please follow the guideline to do real deep research actions.',
813
419
  param_model=NoParamsAction,
814
420
  )
815
421
  async def skill_deep_research(
@@ -860,7 +466,7 @@ Please generate alternative JavaScript code that avoids this system error:"""
860
466
  )
861
467
 
862
468
  @self.registry.action(
863
- 'Skill: Get comprehensive financial data for stocks - retrieve company information, historical prices, news, earnings, dividends, analyst recommendations and other financial data using Yahoo Finance. Available methods include: get_info (company info), get_history (price history), get_news (latest news), get_dividends (dividend history), get_earnings (earnings data), get_recommendations (analyst recommendations), get_balance_sheet (balance sheet data), get_income_stmt (income statement), get_cashflow (cash flow statement), get_fast_info (quick stats), get_institutional_holders (institutional ownership), get_major_holders (major shareholders), get_sustainability (ESG data), get_upgrades_downgrades (analyst upgrades/downgrades), and more. If no methods specified, defaults to get_info.',
469
+ 'Get comprehensive financial data for stocks - retrieve company information, historical prices, news, earnings, dividends, analyst recommendations and other financial data using Yahoo Finance.',
864
470
  param_model=SkillFinanceAction,
865
471
  )
866
472
  async def skill_finance(
@@ -896,7 +502,7 @@ Please generate alternative JavaScript code that avoids this system error:"""
896
502
  try:
897
503
  # Default to get_info if no methods specified
898
504
  methods = params.methods if params.methods else [FinanceMethod.GET_INFO]
899
-
505
+
900
506
  # Convert string methods to FinanceMethod enum if needed
901
507
  if methods and isinstance(methods[0], str):
902
508
  try:
@@ -906,13 +512,13 @@ Please generate alternative JavaScript code that avoids this system error:"""
906
512
  return ActionResult(
907
513
  error=f'Invalid method in {methods}. Available methods: {available_methods}'
908
514
  )
909
-
515
+
910
516
  # Create data retriever with symbol
911
517
  retriever = FinanceDataRetriever(params.symbol)
912
-
518
+
913
519
  # Convert FinanceMethod enum values to strings for the retriever
914
520
  method_strings = [method.value for method in methods]
915
-
521
+
916
522
  # Retrieve financial data
917
523
  financial_data = retriever.get_finance_data(
918
524
  methods=method_strings,
@@ -922,429 +528,684 @@ Please generate alternative JavaScript code that avoids this system error:"""
922
528
  interval=getattr(params, 'interval', '1d'),
923
529
  num_news=getattr(params, 'num_news', 5)
924
530
  )
925
-
531
+
926
532
  # Format as markdown using the static method
927
533
  markdown_content = FinanceMarkdownFormatter.format_finance_data(
928
534
  symbol=params.symbol,
929
535
  results=financial_data,
930
536
  methods=method_strings
931
537
  )
932
-
538
+
933
539
  method_names = [method.value for method in methods]
934
540
  logger.info(f'💹 Comprehensive finance data retrieved for {params.symbol} with methods: {method_names}')
935
-
541
+
936
542
  return ActionResult(
937
543
  extracted_content=markdown_content,
938
544
  include_extracted_content_only_once=True,
939
545
  long_term_memory=f'Retrieved comprehensive financial data for {params.symbol} using methods: {", ".join(method_names)}',
940
546
  )
941
-
547
+
942
548
  except Exception as e:
943
549
  error_msg = f'❌ Failed to retrieve financial data for {params.symbol}: {str(e)}'
944
550
  logger.error(error_msg)
945
- return ActionResult(error=error_msg)
946
-
551
+ return ActionResult(error=error_msg, extracted_content=error_msg)
947
552
 
948
- async def _extract_google_results_rule_based(self, browser_session):
949
- """Rule-based extraction of Google search results using JavaScript"""
950
- try:
951
- cdp_session = await browser_session.get_or_create_cdp_session()
952
-
953
- # JavaScript code to extract Google search results using DOM selectors
954
- js_extraction_code = """
955
- (function() {
956
- try {
957
- const results = [];
958
-
959
- // Multiple selector strategies for different Google layouts
960
- const selectors = [
961
- 'div[data-sokoban-container] div[data-sokoban-feature]', // Standard results
962
- 'div.g:not(.g-blk)', // Classic results container
963
- '.tF2Cxc', // Modern result container
964
- 'div[data-ved] h3', // Result titles
965
- ];
966
-
967
- let resultElements = [];
968
-
969
- // Try each selector until we find results
970
- for (const selector of selectors) {
971
- const elements = document.querySelectorAll(selector);
972
- if (elements.length > 0) {
973
- resultElements = Array.from(elements).slice(0, 10); // Get up to 10 results
974
- break;
975
- }
976
- }
977
-
978
- // If no results found with specific selectors, try broader search
979
- if (resultElements.length === 0) {
980
- // Look for any divs containing h3 elements (likely search results)
981
- const h3Elements = document.querySelectorAll('h3');
982
- resultElements = Array.from(h3Elements)
983
- .map(h3 => h3.closest('div'))
984
- .filter(div => div && div.querySelector('a[href]'))
985
- .slice(0, 10);
986
- }
987
-
988
- for (let i = 0; i < Math.min(resultElements.length, 10); i++) {
989
- const element = resultElements[i];
990
-
991
- // Extract title
992
- let title = '';
993
- const titleSelectors = ['h3', '[role="heading"]', 'a > span', '.LC20lb'];
994
- for (const sel of titleSelectors) {
995
- const titleEl = element.querySelector(sel);
996
- if (titleEl && titleEl.textContent.trim()) {
997
- title = titleEl.textContent.trim();
998
- break;
999
- }
1000
- }
1001
-
1002
- // Extract URL
1003
- let url = '';
1004
- const linkSelectors = ['a[href^="http"]', 'a[href^="/url?q="]', 'a[href]'];
1005
- for (const sel of linkSelectors) {
1006
- const linkEl = element.querySelector(sel);
1007
- if (linkEl && linkEl.href) {
1008
- url = linkEl.href;
1009
- // Clean Google redirect URLs
1010
- if (url.includes('/url?q=')) {
1011
- const urlMatch = url.match(/[?&]q=([^&]*)/);
1012
- if (urlMatch) {
1013
- url = decodeURIComponent(urlMatch[1]);
1014
- }
1015
- }
1016
- break;
1017
- }
1018
- }
1019
-
1020
- // Extract summary/description
1021
- let summary = '';
1022
- const summarySelectors = [
1023
- '.VwiC3b', // Description text
1024
- '.yXK7lf', // Snippet text
1025
- '[data-content-feature="1"] span',
1026
- '.s', // Classic description
1027
- 'span:not(:has(a))'
1028
- ];
1029
- for (const sel of summarySelectors) {
1030
- const summaryEl = element.querySelector(sel);
1031
- if (summaryEl && summaryEl.textContent.trim() && summaryEl.textContent.length > 10) {
1032
- summary = summaryEl.textContent.trim();
1033
- break;
1034
- }
1035
- }
1036
-
1037
- // Only add if we have at least title or URL
1038
- if (title || url) {
1039
- results.push({
1040
- title: title || 'No title',
1041
- url: url || 'No URL',
1042
- summary: summary || 'No description available'
1043
- });
1044
- }
1045
- }
1046
-
1047
- return JSON.stringify(results);
1048
-
1049
- } catch (e) {
1050
- return JSON.stringify([{
1051
- title: 'Error extracting results',
1052
- url: window.location.href,
1053
- summary: 'JavaScript extraction failed: ' + e.message
1054
- }]);
1055
- }
1056
- })()
1057
- """
1058
-
1059
- # Execute JavaScript to extract results
1060
- result = await cdp_session.cdp_client.send.Runtime.evaluate(
1061
- params={'expression': js_extraction_code, 'returnByValue': True, 'awaitPromise': True},
1062
- session_id=cdp_session.session_id,
1063
- )
1064
-
1065
- if result.get('exceptionDetails'):
1066
- logger.warning(f"JavaScript extraction failed: {result['exceptionDetails']}")
1067
- return []
1068
-
1069
- result_data = result.get('result', {})
1070
- value = result_data.get('value', '[]')
553
+ @self.registry.action(
554
+ '',
555
+ param_model=SkillXhsAction,
556
+ )
557
+ async def skill_xhs(
558
+ params: SkillXhsAction,
559
+ browser_manager: BrowserManager,
560
+ file_system: CustomFileSystem
561
+ ):
562
+ """
563
+ Skill: Xiaohongshu API integration
1071
564
 
565
+ Available methods:
566
+ - search_content_by_keyword: Search content by keyword with sorting options
567
+ - fetch_content_details: Get detailed information about specific content
568
+ - fetch_all_content_comments: Get all comments for specific content
569
+ - get_user_profile: Get user profile information
570
+ - fetch_all_user_content: Get all content posted by a user
571
+ - get_home_recommendations: Get homepage recommended content
572
+ """
1072
573
  try:
1073
- extracted_results = json.loads(value)
1074
- return extracted_results if isinstance(extracted_results, list) else []
1075
- except (json.JSONDecodeError, ValueError):
1076
- logger.warning(f"Failed to parse extraction results: {value}")
1077
- return []
1078
-
1079
- except Exception as e:
1080
- logger.error(f"Rule-based extraction failed: {e}")
1081
- return []
574
+ from vibe_surf.tools.website_api.xhs.client import XiaoHongShuApiClient
1082
575
 
1083
- async def _perform_google_search(self, browser_session, query: str, llm: BaseChatModel):
1084
- """Helper method to perform Google search and extract top 5 results using rule-based extraction"""
1085
- try:
1086
- # Navigate to Google search
1087
- search_url = f'https://www.google.com/search?q={query}&udm=14'
1088
- await browser_session.navigate_to_url(search_url, new_tab=False)
1089
-
1090
- # Wait a moment for page to load
1091
- await asyncio.sleep(2)
1092
-
1093
- # Use rule-based extraction first (much faster than LLM)
1094
- search_ret_len = 10
1095
- results = await self._extract_google_results_rule_based(browser_session)
1096
- if results and len(results) > 0:
1097
- # Rule-based extraction succeeded
1098
- logger.debug(f"Rule-based extraction found {len(results)} results for query: {query}")
1099
- return results[:search_ret_len] # Return top 6 results
1100
-
1101
- # Fallback to LLM extraction if rule-based fails
1102
- logger.warning(f"Rule-based extraction failed for query '{query}', falling back to LLM")
1103
-
1104
- extraction_query = f"""
1105
- Extract the top {search_ret_len} search results from this Google search page. For each result, provide:
1106
- - title: The clickable title/headline
1107
- - url: The website URL
1108
- - summary: A brief description of what this result contains
576
+ # Initialize client
577
+ xhs_client = XiaoHongShuApiClient(browser_session=browser_manager.main_browser_session)
578
+ await xhs_client.setup()
579
+
580
+ # Parse params JSON string
581
+ import json
582
+ from json_repair import repair_json
583
+ try:
584
+ method_params = json.loads(params.params)
585
+ except json.JSONDecodeError:
586
+ method_params = json.loads(repair_json(params.params))
587
+
588
+ # Execute the requested method
589
+ result = None
590
+ if params.method == "search_content_by_keyword":
591
+ result = await xhs_client.search_content_by_keyword(**method_params)
592
+ elif params.method == "fetch_content_details":
593
+ result = await xhs_client.fetch_content_details(**method_params)
594
+ elif params.method == "fetch_all_content_comments":
595
+ result = await xhs_client.fetch_all_content_comments(**method_params)
596
+ elif params.method == "get_user_profile":
597
+ result = await xhs_client.get_user_profile(**method_params)
598
+ elif params.method == "fetch_all_user_content":
599
+ result = await xhs_client.fetch_all_user_content(**method_params)
600
+ elif params.method == "get_home_recommendations":
601
+ result = await xhs_client.get_home_recommendations()
602
+ else:
603
+ return ActionResult(error=f"Unknown method: {params.method}")
1109
604
 
1110
- Return results as a JSON array: [{{"title": "...", "url": "...", "summary": "..."}}, ...]
1111
- """
605
+ # Save result to file
606
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
607
+ filename = f"xhs_{params.method}_{timestamp}.json"
608
+ filepath = file_system.get_dir() / "data" / filename
609
+ filepath.parent.mkdir(exist_ok=True)
610
+
611
+ with open(filepath, "w", encoding="utf-8") as f:
612
+ json.dump(result, f, ensure_ascii=False, indent=2)
613
+
614
+ # Format result as markdown
615
+ if isinstance(result, list):
616
+ display_count = min(5, len(result))
617
+ md_content = f"## Xiaohongshu {params.method.replace('_', ' ').title()}\n\n"
618
+ md_content += f"Showing {display_count} of {len(result)} results:\n\n"
619
+ for i, item in enumerate(result[:display_count]):
620
+ md_content += f"### Result {i + 1}\n"
621
+ for key, value in item.items():
622
+ if not value:
623
+ continue
624
+ if isinstance(value, str) and len(value) > 200:
625
+ md_content += f"- **{key}**: {value[:200]}...\n"
626
+ else:
627
+ md_content += f"- **{key}**: {value}\n"
628
+ md_content += "\n"
629
+ else:
630
+ md_content = f"## Xiaohongshu {params.method.replace('_', ' ').title()}\n\n"
631
+ for key, value in result.items():
632
+ if isinstance(value, str) and len(value) > 200:
633
+ md_content += f"- **{key}**: {value[:200]}...\n"
634
+ else:
635
+ md_content += f"- **{key}**: {value}\n"
636
+ md_content += "\n"
637
+
638
+ # Add file path to markdown
639
+ relative_path = str(filepath.relative_to(file_system.get_dir()))
640
+ md_content += f"\n> 📁 Full data saved to: [{filename}]({relative_path})\n"
641
+ md_content += f"> 💡 Click the link above to view all results.\n"
642
+
643
+ logger.info(f'📕 Xiaohongshu data retrieved with method: {params.method}')
644
+
645
+ # Close client
646
+ await xhs_client.close()
647
+
648
+ return ActionResult(
649
+ extracted_content=md_content
650
+ )
1112
651
 
1113
- results_text = await self._extract_structured_content(browser_session, extraction_query, llm)
652
+ except Exception as e:
653
+ error_msg = f'❌ Failed to retrieve Xiaohongshu data: {str(e)}'
654
+ logger.error(error_msg)
655
+ return ActionResult(error=error_msg, extracted_content=error_msg)
1114
656
 
1115
- # Try to parse JSON results
657
+ @self.registry.action(
658
+ '',
659
+ param_model=SkillWeiboAction,
660
+ )
661
+ async def skill_weibo(
662
+ params: SkillWeiboAction,
663
+ browser_manager: BrowserManager,
664
+ file_system: CustomFileSystem
665
+ ):
666
+ """
667
+ Skill: Weibo API integration
668
+
669
+ Available methods:
670
+ - search_posts_by_keyword: Search posts by keyword with sorting options
671
+ - get_post_detail: Get detailed information about specific post
672
+ - get_all_post_comments: Get all comments for specific post
673
+ - get_user_info: Get user profile information
674
+ - get_all_user_posts: Get all posts by a user
675
+ - get_hot_posts: Get hot posts
676
+ - get_trending_list: Get trending list
677
+ """
1116
678
  try:
1117
- results = json.loads(results_text.strip())
1118
- if isinstance(results, list):
1119
- return results[:search_ret_len] # Ensure max 5 results
1120
- except (json.JSONDecodeError, ValueError):
679
+ from vibe_surf.tools.website_api.weibo.client import WeiboApiClient
680
+
681
+ # Initialize client
682
+ wb_client = WeiboApiClient(browser_session=browser_manager.main_browser_session)
683
+ await wb_client.setup()
684
+
685
+ # Parse params JSON string
686
+ import json
687
+ from json_repair import repair_json
1121
688
  try:
1122
- results = repair_json(results_text.strip())
1123
- if isinstance(results, list):
1124
- return results[:search_ret_len] # Ensure max 5 results
1125
- except Exception as e:
1126
- logger.warning(f"Failed to parse JSON from LLM search results: {results_text}")
689
+ method_params = json.loads(params.params)
690
+ except json.JSONDecodeError:
691
+ method_params = json.loads(repair_json(params.params))
692
+
693
+ # Execute the requested method
694
+ result = None
695
+ if params.method == "search_posts_by_keyword":
696
+ result = await wb_client.search_posts_by_keyword(**method_params)
697
+ elif params.method == "get_post_detail":
698
+ result = await wb_client.get_post_detail(**method_params)
699
+ elif params.method == "get_all_post_comments":
700
+ result = await wb_client.get_all_post_comments(**method_params)
701
+ elif params.method == "get_user_info":
702
+ result = await wb_client.get_user_info(**method_params)
703
+ elif params.method == "get_all_user_posts":
704
+ result = await wb_client.get_all_user_posts(**method_params)
705
+ elif params.method == "get_hot_posts":
706
+ result = await wb_client.get_hot_posts()
707
+ elif params.method == "get_trending_posts":
708
+ result = await wb_client.get_trending_posts()
709
+ else:
710
+ return ActionResult(error=f"Unknown method: {params.method}")
1127
711
 
1128
- # Fallback: return raw text as single result
1129
- current_url = await browser_session.get_current_page_url()
1130
- return [{
1131
- "title": f"Search results for: {query}",
1132
- "url": current_url,
1133
- "summary": results_text[:200] + "..." if len(results_text) > 200 else results_text
1134
- }]
712
+ # Save result to file
713
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
714
+ filename = f"weibo_{params.method}_{timestamp}.json"
715
+ filepath = file_system.get_dir() / "data" / filename
716
+ filepath.parent.mkdir(exist_ok=True)
717
+
718
+ with open(filepath, "w", encoding="utf-8") as f:
719
+ json.dump(result, f, ensure_ascii=False, indent=2)
720
+ # Format result as markdown
721
+ if isinstance(result, list):
722
+ display_count = min(5, len(result))
723
+ md_content = f"## Weibo {params.method.replace('_', ' ').title()}\n\n"
724
+ md_content += f"Showing {display_count} of {len(result)} results:\n\n"
725
+ for i, item in enumerate(result[:display_count]):
726
+ md_content += f"### Result {i + 1}\n"
727
+ for key, value in item.items():
728
+ if not value:
729
+ continue
730
+ if isinstance(value, str) and len(value) > 200:
731
+ md_content += f"- **{key}**: {value[:200]}...\n"
732
+ else:
733
+ md_content += f"- **{key}**: {value}\n"
734
+ md_content += "\n"
735
+ else:
736
+ md_content = f"## Weibo {params.method.replace('_', ' ').title()}\n\n"
737
+ for key, value in result.items():
738
+ if isinstance(value, str) and len(value) > 200:
739
+ md_content += f"- **{key}**: {value[:200]}...\n"
740
+ else:
741
+ md_content += f"- **{key}**: {value}\n"
742
+ md_content += "\n"
1135
743
 
1136
- except Exception as e:
1137
- logger.error(f"Google search failed for query '{query}': {e}")
1138
- return []
744
+ # Add file path to markdown
745
+ relative_path = str(filepath.relative_to(file_system.get_dir()))
746
+ md_content += f"\n> 📁 Full data saved to: [{filename}]({relative_path})\n"
747
+ md_content += f"> 💡 Click the link above to view all results.\n"
1139
748
 
1140
- def _rule_based_deduplication(self, results):
1141
- """Rule-based deduplication to reduce dataset before LLM processing"""
1142
- if not results:
1143
- return []
1144
-
1145
- deduplicated = []
1146
- seen_urls = set()
1147
- seen_titles = set()
1148
-
1149
- for result in results:
1150
- url = result.get('url', '').strip()
1151
- title = result.get('title', '').strip().lower()
1152
-
1153
- # Skip results with missing essential data
1154
- if not url or not title or url == 'No URL' or title == 'no title':
1155
- continue
1156
-
1157
- # Normalize URL for comparison (remove fragments, query params for deduplication)
1158
- normalized_url = url.split('#')[0].split('?')[0].lower()
1159
-
1160
- # Check for duplicate URLs
1161
- if normalized_url in seen_urls:
1162
- continue
1163
-
1164
- # Check for very similar titles (basic similarity)
1165
- title_normalized = ''.join(c for c in title if c.isalnum()).lower()
1166
- if len(title_normalized) > 10: # Only check titles with substantial content
1167
- similar_found = False
1168
- for seen_title in seen_titles:
1169
- # Simple similarity check: if 80% of characters match
1170
- if len(title_normalized) > 0 and len(seen_title) > 0:
1171
- common_chars = sum(1 for c in title_normalized if c in seen_title)
1172
- similarity = common_chars / max(len(title_normalized), len(seen_title))
1173
- if similarity > 0.8:
1174
- similar_found = True
1175
- break
1176
-
1177
- if similar_found:
1178
- continue
1179
-
1180
- # Add to deduplicated results
1181
- seen_urls.add(normalized_url)
1182
- seen_titles.add(title_normalized)
1183
- deduplicated.append(result)
1184
-
1185
- # Sort by relevance indicators (prioritize results with longer summaries, non-generic titles)
1186
- def relevance_score(result):
1187
- score = 0
1188
- title = result.get('title', '')
1189
- summary = result.get('summary', '')
1190
-
1191
- # Longer summaries are typically more informative
1192
- score += min(len(summary), 200) / 10
1193
-
1194
- # Non-generic titles score higher
1195
- generic_terms = ['search results', 'no title', 'error', 'loading']
1196
- if not any(term in title.lower() for term in generic_terms):
1197
- score += 10
1198
-
1199
- # Prefer results with actual descriptions
1200
- if summary and summary != 'No description available' and len(summary) > 20:
1201
- score += 5
1202
-
1203
- return score
1204
-
1205
- deduplicated.sort(key=relevance_score, reverse=True)
1206
- return deduplicated
749
+ logger.info(f'🐦 Weibo data retrieved with method: {params.method}')
1207
750
 
1208
- async def _extract_structured_content(self, browser_session, query: str, llm: BaseChatModel):
1209
- """Helper method to extract structured content from current page"""
1210
- MAX_CHAR_LIMIT = 30000
751
+ # Close client
752
+ await wb_client.close()
1211
753
 
1212
- # Extract clean markdown using the existing method
1213
- try:
1214
- content, content_stats = await self.extract_clean_markdown(browser_session, extract_links=False)
1215
- except Exception as e:
1216
- raise RuntimeError(f'Could not extract clean markdown: {type(e).__name__}')
1217
-
1218
- # Smart truncation with context preservation
1219
- if len(content) > MAX_CHAR_LIMIT:
1220
- # Try to truncate at a natural break point
1221
- truncate_at = MAX_CHAR_LIMIT
1222
- paragraph_break = content.rfind('\n\n', MAX_CHAR_LIMIT - 500, MAX_CHAR_LIMIT)
1223
- if paragraph_break > 0:
1224
- truncate_at = paragraph_break
1225
- else:
1226
- sentence_break = content.rfind('.', MAX_CHAR_LIMIT - 200, MAX_CHAR_LIMIT)
1227
- if sentence_break > 0:
1228
- truncate_at = sentence_break + 1
1229
- content = content[:truncate_at]
754
+ return ActionResult(
755
+ extracted_content=md_content
756
+ )
1230
757
 
1231
- system_prompt = """
1232
- You are an expert at extracting data from the markdown of a webpage.
758
+ except Exception as e:
759
+ import traceback
760
+ traceback.print_exc()
761
+ error_msg = f'❌ Failed to retrieve Weibo data: {str(e)}. \nMost likely you are not login, please go to: [Weibo login page](https://passport.weibo.com/sso/signin?entry=miniblog&source=miniblog) and login.'
762
+ logger.error(error_msg)
763
+ return ActionResult(error=error_msg, extracted_content=error_msg)
1233
764
 
1234
- <input>
1235
- You will be given a query and the markdown of a webpage that has been filtered to remove noise and advertising content.
1236
- </input>
765
+ @self.registry.action(
766
+ '',
767
+ param_model=SkillDouyinAction,
768
+ )
769
+ async def skill_douyin(
770
+ params: SkillDouyinAction,
771
+ browser_manager: BrowserManager,
772
+ file_system: CustomFileSystem
773
+ ):
774
+ """
775
+ Skill: Douyin API integration
776
+
777
+ Available methods:
778
+ - search_content_by_keyword: Search content by keyword with filtering options
779
+ - fetch_video_details: Get detailed information about specific video
780
+ - fetch_all_video_comments: Get all comments for specific video
781
+ - fetch_user_info: Get user profile information
782
+ - fetch_all_user_videos: Get all videos by a user
783
+ """
784
+ try:
785
+ from vibe_surf.tools.website_api.douyin.client import DouyinApiClient
1237
786
 
1238
- <instructions>
1239
- - You are tasked to extract information from the webpage that is relevant to the query.
1240
- - You should ONLY use the information available in the webpage to answer the query. Do not make up information or provide guess from your own knowledge.
1241
- - If the information relevant to the query is not available in the page, your response should mention that.
1242
- - If the query asks for all items, products, etc., make sure to directly list all of them.
1243
- </instructions>
787
+ # Initialize client
788
+ dy_client = DouyinApiClient(browser_session=browser_manager.main_browser_session)
789
+ await dy_client.setup()
1244
790
 
1245
- <output>
1246
- - Your output should present ALL the information relevant to the query in a concise way.
1247
- - Do not answer in conversational format - directly output the relevant information or that the information is unavailable.
1248
- </output>
1249
- """.strip()
791
+ # Parse params JSON string
792
+ import json
793
+ from json_repair import repair_json
794
+ try:
795
+ method_params = json.loads(params.params)
796
+ except json.JSONDecodeError:
797
+ method_params = json.loads(repair_json(params.params))
798
+
799
+ # Execute the requested method
800
+ result = None
801
+ if params.method == "search_content_by_keyword":
802
+ result = await dy_client.search_content_by_keyword(**method_params)
803
+ elif params.method == "fetch_video_details":
804
+ result = await dy_client.fetch_video_details(**method_params)
805
+ elif params.method == "fetch_all_video_comments":
806
+ result = await dy_client.fetch_all_video_comments(**method_params)
807
+ elif params.method == "fetch_user_info":
808
+ result = await dy_client.fetch_user_info(**method_params)
809
+ elif params.method == "fetch_all_user_videos":
810
+ result = await dy_client.fetch_all_user_videos(**method_params)
811
+ else:
812
+ return ActionResult(error=f"Unknown method: {params.method}")
1250
813
 
1251
- prompt = f'<query>\n{query}\n</query>\n\n<webpage_content>\n{content}\n</webpage_content>'
814
+ # Save result to file
815
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
816
+ filename = f"douyin_{params.method}_{timestamp}.json"
817
+ filepath = file_system.get_dir() / "data" / filename
818
+ filepath.parent.mkdir(exist_ok=True)
819
+
820
+ with open(filepath, "w", encoding="utf-8") as f:
821
+ json.dump(result, f, ensure_ascii=False, indent=2)
822
+
823
+ # Format result as markdown
824
+ if isinstance(result, list):
825
+ display_count = min(5, len(result))
826
+ md_content = f"## Douyin {params.method.replace('_', ' ').title()}\n\n"
827
+ md_content += f"Showing {display_count} of {len(result)} results:\n\n"
828
+ for i, item in enumerate(result[:display_count]):
829
+ md_content += f"### Result {i + 1}\n"
830
+ for key, value in item.items():
831
+ if not value:
832
+ continue
833
+ if isinstance(value, str) and len(value) > 200:
834
+ md_content += f"- **{key}**: {value[:200]}...\n"
835
+ else:
836
+ md_content += f"- **{key}**: {value}\n"
837
+ md_content += "\n"
838
+ else:
839
+ md_content = f"## Douyin {params.method.replace('_', ' ').title()}\n\n"
840
+ for key, value in result.items():
841
+ if isinstance(value, str) and len(value) > 200:
842
+ md_content += f"- **{key}**: {value[:200]}...\n"
843
+ else:
844
+ md_content += f"- **{key}**: {value}\n"
845
+ md_content += "\n"
1252
846
 
1253
- try:
1254
- from browser_use.llm.messages import SystemMessage, UserMessage
1255
- response = await asyncio.wait_for(
1256
- llm.ainvoke([SystemMessage(content=system_prompt), UserMessage(content=prompt)]),
1257
- timeout=120.0,
1258
- )
1259
- return response.completion
1260
- except Exception as e:
1261
- logger.debug(f'Error extracting content: {e}')
1262
- raise RuntimeError(str(e))
847
+ # Add file path to markdown
848
+ relative_path = str(filepath.relative_to(file_system.get_dir()))
849
+ md_content += f"\n> 📁 Full data saved to: [{filename}]({relative_path})\n"
850
+ md_content += f"> 💡 Click the link above to view all results.\n"
1263
851
 
1264
- async def extract_clean_markdown(
1265
- self, browser_session: BrowserSession, extract_links: bool = True
1266
- ) -> tuple[str, dict[str, Any]]:
1267
- """Extract clean markdown from the current page."""
1268
- import re
852
+ logger.info(f'🎵 Douyin data retrieved with method: {params.method}')
1269
853
 
1270
- # Get HTML content from current page
1271
- cdp_session = await browser_session.get_or_create_cdp_session()
1272
- try:
1273
- body_id = await cdp_session.cdp_client.send.DOM.getDocument(session_id=cdp_session.session_id)
1274
- page_html_result = await cdp_session.cdp_client.send.DOM.getOuterHTML(
1275
- params={'backendNodeId': body_id['root']['backendNodeId']}, session_id=cdp_session.session_id
1276
- )
1277
- page_html = page_html_result['outerHTML']
1278
- current_url = await browser_session.get_current_page_url()
1279
- except Exception as e:
1280
- raise RuntimeError(f"Couldn't extract page content: {e}")
854
+ # Close client
855
+ await dy_client.close()
1281
856
 
1282
- original_html_length = len(page_html)
857
+ return ActionResult(
858
+ extracted_content=md_content
859
+ )
1283
860
 
1284
- # Use html2text for clean markdown conversion
1285
- import html2text
861
+ except Exception as e:
862
+ error_msg = f'❌ Failed to retrieve Douyin data: {str(e)}'
863
+ logger.error(error_msg)
864
+ return ActionResult(error=error_msg, extracted_content=error_msg)
1286
865
 
1287
- h = html2text.HTML2Text()
1288
- h.ignore_links = not extract_links
1289
- h.ignore_images = True
1290
- h.ignore_emphasis = False
1291
- h.body_width = 0 # Don't wrap lines
1292
- h.unicode_snob = True
1293
- h.skip_internal_links = True
1294
- content = h.handle(page_html)
866
+ @self.registry.action(
867
+ """YouTube API - If users want to know the specific content of this video, please use get_video_transcript to get detailed video content first.""",
868
+ param_model=SkillYoutubeAction,
869
+ )
870
+ async def skill_youtube(
871
+ params: SkillYoutubeAction,
872
+ browser_manager: BrowserManager,
873
+ file_system: CustomFileSystem
874
+ ):
875
+ """
876
+ Skill: YouTube API integration
877
+
878
+ Available methods:
879
+ - search_videos: Search videos by keyword
880
+ - get_video_details: Get detailed information about specific video
881
+ - get_video_comments: Get comments for specific video
882
+ - get_channel_info: Get channel information
883
+ - get_channel_videos: Get videos from specific channel
884
+ - get_trending_videos: Get trending videos
885
+ - get_video_transcript: Get video transcript in multiple languages
886
+ """
887
+ try:
888
+ from vibe_surf.tools.website_api.youtube.client import YouTubeApiClient
1295
889
 
1296
- initial_markdown_length = len(content)
890
+ # Initialize client
891
+ yt_client = YouTubeApiClient(browser_session=browser_manager.main_browser_session)
892
+ await yt_client.setup()
1297
893
 
1298
- # Minimal cleanup - html2text already does most of the work
1299
- content = re.sub(r'%[0-9A-Fa-f]{2}', '', content) # Remove any remaining URL encoding
894
+ # Parse params JSON string
895
+ import json
896
+ from json_repair import repair_json
897
+ try:
898
+ method_params = json.loads(params.params)
899
+ except json.JSONDecodeError:
900
+ method_params = json.loads(repair_json(params.params))
901
+
902
+ # Execute the requested method
903
+ result = None
904
+ if params.method == "search_videos":
905
+ result = await yt_client.search_videos(**method_params)
906
+ elif params.method == "get_video_details":
907
+ result = await yt_client.get_video_details(**method_params)
908
+ elif params.method == "get_video_comments":
909
+ result = await yt_client.get_video_comments(**method_params)
910
+ elif params.method == "get_channel_info":
911
+ result = await yt_client.get_channel_info(**method_params)
912
+ elif params.method == "get_channel_videos":
913
+ result = await yt_client.get_channel_videos(**method_params)
914
+ elif params.method == "get_trending_videos":
915
+ result = await yt_client.get_trending_videos()
916
+ elif params.method == "get_video_transcript":
917
+ result = await yt_client.get_video_transcript(**method_params)
918
+ else:
919
+ return ActionResult(error=f"Unknown method: {params.method}")
1300
920
 
1301
- # Apply light preprocessing to clean up excessive whitespace
1302
- content, chars_filtered = self._preprocess_markdown_content(content)
921
+ # Save result to file
922
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
923
+ filename = f"youtube_{params.method}_{timestamp}.json"
924
+ filepath = file_system.get_dir() / "data" / filename
925
+ filepath.parent.mkdir(exist_ok=True)
926
+
927
+ with open(filepath, "w", encoding="utf-8") as f:
928
+ json.dump(result, f, ensure_ascii=False, indent=2)
929
+
930
+ # Format result as markdown
931
+ if isinstance(result, list):
932
+ display_count = min(5, len(result))
933
+ md_content = f"## YouTube {params.method.replace('_', ' ').title()}\n\n"
934
+ md_content += f"Showing {display_count} of {len(result)} results:\n\n"
935
+ for i, item in enumerate(result[:display_count]):
936
+ md_content += f"### Result {i + 1}\n"
937
+ for key, value in item.items():
938
+ if not value:
939
+ continue
940
+ if isinstance(value, str) and len(value) > 200:
941
+ md_content += f"- **{key}**: {value[:200]}...\n"
942
+ else:
943
+ md_content += f"- **{key}**: {value}\n"
944
+ md_content += "\n"
945
+ else:
946
+ md_content = f"## YouTube {params.method.replace('_', ' ').title()}\n\n"
947
+ for key, value in result.items():
948
+ if isinstance(value, str) and len(value) > 200:
949
+ md_content += f"- **{key}**: {value[:200]}...\n"
950
+ else:
951
+ md_content += f"- **{key}**: {value}\n"
952
+ md_content += "\n"
1303
953
 
1304
- final_filtered_length = len(content)
954
+ # Add file path to markdown
955
+ relative_path = str(filepath.relative_to(file_system.get_dir()))
956
+ md_content += f"\n> 📁 Full data saved to: [{filename}]({relative_path})\n"
957
+ md_content += f"> 💡 Click the link above to view all results.\n"
1305
958
 
1306
- # Content statistics
1307
- stats = {
1308
- 'url': current_url,
1309
- 'original_html_chars': original_html_length,
1310
- 'initial_markdown_chars': initial_markdown_length,
1311
- 'filtered_chars_removed': chars_filtered,
1312
- 'final_filtered_chars': final_filtered_length,
1313
- }
959
+ logger.info(f'🎬 YouTube data retrieved with method: {params.method}')
1314
960
 
1315
- return content, stats
961
+ # Close client
962
+ await yt_client.close()
1316
963
 
1317
- def _preprocess_markdown_content(self, content: str, max_newlines: int = 3) -> tuple[str, int]:
1318
- """Light preprocessing of html2text output - minimal cleanup since html2text is already clean."""
1319
- import re
964
+ return ActionResult(
965
+ extracted_content=md_content
966
+ )
1320
967
 
1321
- original_length = len(content)
968
+ except Exception as e:
969
+ error_msg = f'❌ Failed to retrieve YouTube data: {str(e)}'
970
+ logger.error(error_msg)
971
+ return ActionResult(error=error_msg, extracted_content=error_msg)
1322
972
 
1323
- # Compress consecutive newlines (4+ newlines become max_newlines)
1324
- content = re.sub(r'\n{4,}', '\n' * max_newlines, content)
973
+ def _register_extra_tools(self):
974
+ """
975
+ Register extra tools for dynamic toolkit and MCP tool access
976
+ """
977
+
978
+ @self.registry.action(
979
+ 'Get all available toolkit types from both Composio and MCP clients',
980
+ param_model=NoParamsAction,
981
+ )
982
+ async def get_all_toolkit_types():
983
+ """
984
+ Get all toolkit types available in composio_toolkits and mcp_clients
985
+
986
+ Returns:
987
+ ActionResult with list of all toolkit type names
988
+ """
989
+ try:
990
+ toolkit_types = []
991
+
992
+ # Add Composio toolkit types
993
+ if self.composio_toolkits:
994
+ toolkit_types.extend(list(self.composio_toolkits.keys()))
995
+
996
+ # Add MCP client types
997
+ if self.mcp_clients:
998
+ toolkit_types.extend(list(self.mcp_clients.keys()))
999
+
1000
+ result_text = f"Available toolkit types ({len(toolkit_types)} total):\n\n"
1001
+
1002
+ # Group by type
1003
+ composio_types = list(self.composio_toolkits.keys()) if self.composio_toolkits else []
1004
+ mcp_types = list(self.mcp_clients.keys()) if self.mcp_clients else []
1005
+
1006
+ if composio_types:
1007
+ result_text += f"**Composio Toolkits ({len(composio_types)}):**\n"
1008
+ for toolkit in composio_types:
1009
+ result_text += f"- {toolkit}\n"
1010
+ result_text += "\n"
1011
+
1012
+ if mcp_types:
1013
+ result_text += f"**MCP Clients ({len(mcp_types)}):**\n"
1014
+ for client in mcp_types:
1015
+ result_text += f"- {client}\n"
1016
+ result_text += "\n"
1017
+
1018
+ if not toolkit_types:
1019
+ result_text = "No toolkit types available. Please register Composio toolkits or MCP clients first."
1020
+
1021
+ logger.info(f'📋 Retrieved {len(toolkit_types)} toolkit types')
1022
+ return ActionResult(
1023
+ extracted_content=result_text,
1024
+ )
1025
+
1026
+ except Exception as e:
1027
+ logger.error(f'❌ Failed to get toolkit types: {e}')
1028
+ return ActionResult(error=f'Failed to get toolkit types: {str(e)}')
1325
1029
 
1326
- # Remove lines that are only whitespace or very short (likely artifacts)
1327
- lines = content.split('\n')
1328
- filtered_lines = []
1329
- for line in lines:
1330
- stripped = line.strip()
1331
- # Keep lines with substantial content (html2text output is already clean)
1332
- if len(stripped) > 2:
1333
- filtered_lines.append(line)
1030
+ @self.registry.action(
1031
+ 'Search tools within a specific toolkit type by name and description filters',
1032
+ param_model=SearchToolAction,
1033
+ )
1034
+ async def search_tool(params: SearchToolAction):
1035
+ """
1036
+ Search tools by toolkit type and filters
1037
+
1038
+ Args:
1039
+ params: SearchToolAction containing toolkit_type and filters
1040
+
1041
+ Returns:
1042
+ ActionResult with matching tools and their descriptions
1043
+ """
1044
+ try:
1045
+ toolkit_type = params.toolkit_type
1046
+ filters = [f.lower() for f in params.filters]
1047
+
1048
+ matching_tools = []
1049
+
1050
+ # Search in registry actions with prefixes
1051
+ for action_name, action in self.registry.registry.actions.items():
1052
+ # Check if this action belongs to the specified toolkit type
1053
+ if toolkit_type in self.composio_toolkits and action_name.startswith(f"cpo.{toolkit_type}."):
1054
+ # Get tool description from param_model
1055
+ try:
1056
+ param_dict = action.param_model.model_json_schema()
1057
+ description = param_dict.get('description', action_name)
1058
+ except:
1059
+ description = action_name
1060
+
1061
+ # Check if any filter matches tool name or description
1062
+ search_text = f"{action_name} {description}".lower()
1063
+ if any(filter_term in search_text for filter_term in filters):
1064
+ matching_tools.append({
1065
+ 'tool_name': action_name,
1066
+ 'description': description
1067
+ })
1068
+
1069
+ elif toolkit_type in self.mcp_clients and action_name.startswith(f"mcp.{toolkit_type}."):
1070
+ # Get tool description from param_model
1071
+ try:
1072
+ param_dict = action.param_model.model_json_schema()
1073
+ description = param_dict.get('description', action_name)
1074
+ except:
1075
+ description = action_name
1076
+
1077
+ # Check if any filter matches tool name or description
1078
+ search_text = f"{action_name} {description}".lower()
1079
+ if any(filter_term in search_text for filter_term in filters):
1080
+ matching_tools.append({
1081
+ 'tool_name': action_name,
1082
+ 'description': description
1083
+ })
1084
+
1085
+ # Format results
1086
+ if matching_tools:
1087
+ result_text = f"Found {len(matching_tools)} tools in '{toolkit_type}' matching filters {params.filters}:\n\n"
1088
+ for i, tool in enumerate(matching_tools, 1):
1089
+ result_text += f"{i}. **{tool['tool_name']}**\n"
1090
+ result_text += f" Description: {tool['description']}\n\n"
1091
+ else:
1092
+ result_text = f"No tools found in '{toolkit_type}' matching filters {params.filters}"
1093
+
1094
+ logger.info(f'🔍 Found {len(matching_tools)} tools in {toolkit_type} matching filters')
1095
+ return ActionResult(
1096
+ extracted_content=result_text,
1097
+ include_extracted_content_only_once=True,
1098
+ long_term_memory=f'Found {len(matching_tools)} tools in {toolkit_type} matching filters: {", ".join(params.filters)}'
1099
+ )
1100
+
1101
+ except Exception as e:
1102
+ logger.error(f'❌ Failed to search tools: {e}')
1103
+ return ActionResult(error=f'Failed to search tools: {str(e)}')
1334
1104
 
1335
- content = '\n'.join(filtered_lines)
1336
- content = content.strip()
1105
+ @self.registry.action(
1106
+ 'Get detailed information about a specific tool including its parameters',
1107
+ param_model=GetToolInfoAction,
1108
+ )
1109
+ async def get_tool_info(params: GetToolInfoAction):
1110
+ """
1111
+ Get tool information including parameter model
1112
+
1113
+ Args:
1114
+ params: GetToolInfoAction containing tool_name
1115
+
1116
+ Returns:
1117
+ ActionResult with tool parameter information
1118
+ """
1119
+ try:
1120
+ tool_name = params.tool_name
1121
+
1122
+ if tool_name not in self.registry.registry.actions:
1123
+ return ActionResult(error=f'Tool "{tool_name}" not found in registry')
1124
+
1125
+ action = self.registry.registry.actions[tool_name]
1126
+
1127
+ # Convert param_model to dict
1128
+ try:
1129
+ param_dict = action.param_model.model_json_schema()
1130
+ result_text = json.dumps(param_dict, indent=2, ensure_ascii=False)
1131
+ except Exception as e:
1132
+ result_text = f"Tool: {tool_name}\nError getting parameter info: {str(e)}"
1133
+
1134
+ logger.info(f'ℹ️ Retrieved tool info for: {tool_name}')
1135
+ return ActionResult(
1136
+ extracted_content=f"```json\n{result_text}\n```"
1137
+ )
1138
+
1139
+ except Exception as e:
1140
+ logger.error(f'❌ Failed to get tool info: {e}')
1141
+ return ActionResult(error=f'Failed to get tool info: {str(e)}')
1337
1142
 
1338
- chars_filtered = original_length - len(content)
1339
- return content, chars_filtered
1143
+ @self.registry.action(
1144
+ 'Execute a specific extra tool with provided parameters',
1145
+ param_model=ExecuteExtraToolAction,
1146
+ )
1147
+ async def execute_extra_tool(
1148
+ params: ExecuteExtraToolAction,
1149
+ browser_manager: BrowserManager,
1150
+ page_extraction_llm: BaseChatModel,
1151
+ file_system: CustomFileSystem
1152
+ ):
1153
+ """
1154
+ Execute an extra tool with given parameters
1155
+
1156
+ Args:
1157
+ params: ExecuteExtraToolAction containing tool_name and tool_params
1158
+ browser_manager: Browser manager instance
1159
+ page_extraction_llm: LLM instance
1160
+ file_system: File system instance
1161
+
1162
+ Returns:
1163
+ ActionResult from the executed tool
1164
+ """
1165
+ try:
1166
+ tool_name = params.tool_name
1167
+
1168
+ if tool_name not in self.registry.registry.actions:
1169
+ return ActionResult(error=f'Tool "{tool_name}" not found in registry')
1170
+
1171
+ # Parse tool parameters
1172
+ try:
1173
+ tool_params_dict = json.loads(params.tool_params)
1174
+ except json.JSONDecodeError:
1175
+ try:
1176
+ tool_params_dict = json.loads(repair_json(params.tool_params))
1177
+ except Exception as e:
1178
+ return ActionResult(error=f'Failed to parse tool parameters: {str(e)}')
1179
+
1180
+ # Get the action
1181
+ action = self.registry.registry.actions[tool_name]
1182
+
1183
+ # Create special context (same as in act method)
1184
+ special_context = {
1185
+ 'browser_manager': browser_manager,
1186
+ 'page_extraction_llm': page_extraction_llm,
1187
+ 'file_system': file_system,
1188
+ }
1189
+
1190
+ # Validate parameters
1191
+ try:
1192
+ validated_params = action.param_model(**tool_params_dict)
1193
+ except Exception as e:
1194
+ return ActionResult(error=f'Invalid parameters {tool_params_dict} for action {tool_name}: {type(e)}: {e}')
1195
+
1196
+ # Execute the tool
1197
+ result = await action.function(params=validated_params, **special_context)
1198
+
1199
+ logger.info(f'🔧 Successfully executed extra tool: {tool_name}')
1200
+ return result
1201
+
1202
+ except Exception as e:
1203
+ logger.error(f'❌ Failed to execute extra tool: {e}')
1204
+ return ActionResult(error=f'Failed to execute extra tool: {str(e)}')
1340
1205
 
1341
1206
  def _register_browser_use_agent(self):
1342
1207
  @self.registry.action(
1343
- 'Execute browser_use agent tasks. Supports both single task execution (list length=1) and '
1344
- 'parallel execution of multiple tasks for improved efficiency. '
1345
- 'Accepts a list of tasks where each task can specify a tab_id (optional), '
1346
- 'task description (focusing on goals and expected returns), and task_files (optional). '
1347
- 'Browser_use agent has strong planning and execution capabilities, only needs task descriptions and desired outcomes.',
1208
+ 'Execute browser_use agent tasks. Please specify a tab id to an agent, if you want to let agent work on this tab.',
1348
1209
  param_model=BrowserUseAgentExecution,
1349
1210
  )
1350
1211
  async def execute_browser_use_agent(
@@ -1368,8 +1229,7 @@ You will be given a query and the markdown of a webpage that has been filtered t
1368
1229
 
1369
1230
  def _register_report_writer_agent(self):
1370
1231
  @self.registry.action(
1371
- 'Execute report writer agent to generate HTML reports. '
1372
- 'Task should describe report requirements, goals, insights observed, and any hints or tips for generating the report.',
1232
+ 'Execute report writer agent to generate HTML reports. ',
1373
1233
  param_model=ReportWriterTask,
1374
1234
  )
1375
1235
  async def execute_report_writer_agent(
@@ -1568,7 +1428,7 @@ You will be given a query and the markdown of a webpage that has been filtered t
1568
1428
 
1569
1429
  def _register_file_actions(self):
1570
1430
  @self.registry.action(
1571
- 'Replace old_str with new_str in file_name. old_str must exactly match the string to replace in original text. Recommended tool to mark completed items in todo.md or change specific contents in a file.'
1431
+ ''
1572
1432
  )
1573
1433
  async def replace_file_str(file_name: str, old_str: str, new_str: str, file_system: CustomFileSystem):
1574
1434
  result = await file_system.replace_file_str(file_name, old_str, new_str)
@@ -1624,71 +1484,13 @@ You will be given a query and the markdown of a webpage that has been filtered t
1624
1484
  if not os.path.exists(full_file_path):
1625
1485
  full_file_path = os.path.join(str(file_system.get_dir()), file_path)
1626
1486
 
1627
- # Determine if file is an image based on MIME type
1628
- mime_type, _ = mimetypes.guess_type(file_path)
1629
- is_image = mime_type and mime_type.startswith('image/')
1630
-
1631
- if is_image:
1632
- # Handle image files with LLM vision
1633
- try:
1634
- # Read image file and encode to base64
1635
- with open(full_file_path, 'rb') as image_file:
1636
- image_data = image_file.read()
1637
- image_base64 = base64.b64encode(image_data).decode('utf-8')
1638
-
1639
- # Create content parts similar to the user's example
1640
- content_parts: list[ContentPartTextParam | ContentPartImageParam] = [
1641
- ContentPartTextParam(text=f"Query: {params.query}")
1642
- ]
1643
-
1644
- # Add the image
1645
- content_parts.append(
1646
- ContentPartImageParam(
1647
- image_url=ImageURL(
1648
- url=f'data:{mime_type};base64,{image_base64}',
1649
- media_type=mime_type,
1650
- detail='high',
1651
- ),
1652
- )
1653
- )
1654
-
1655
- # Create user message and invoke LLM
1656
- user_message = UserMessage(content=content_parts, cache=True)
1657
- response = await asyncio.wait_for(
1658
- page_extraction_llm.ainvoke([user_message]),
1659
- timeout=120.0,
1660
- )
1661
-
1662
- extracted_content = f'File: {file_path}\nQuery: {params.query}\nExtracted Content:\n{response.completion}'
1663
-
1664
- except Exception as e:
1665
- raise Exception(f'Failed to process image file {file_path}: {str(e)}')
1666
-
1667
- else:
1668
- # Handle non-image files by reading content
1669
- try:
1670
- file_content = await file_system.read_file(full_file_path, external_file=True)
1671
-
1672
- # Create a simple prompt for text extraction
1673
- prompt = f"""Extract the requested information from this file content.
1674
-
1675
- Query: {params.query}
1676
-
1677
- File: {file_path}
1678
- File Content:
1679
- {file_content}
1680
-
1681
- Provide the extracted information in a clear, structured format."""
1682
-
1683
- response = await asyncio.wait_for(
1684
- page_extraction_llm.ainvoke([UserMessage(content=prompt)]),
1685
- timeout=120.0,
1686
- )
1687
-
1688
- extracted_content = f'File: {file_path}\nQuery: {params.query}\nExtracted Content:\n{response.completion}'
1689
-
1690
- except Exception as e:
1691
- raise Exception(f'Failed to read file {file_path}: {str(e)}')
1487
+ # Use the utility function to extract content from file
1488
+ extracted_content = await extract_file_content_with_llm(
1489
+ file_path=file_path,
1490
+ query=params.query,
1491
+ llm=page_extraction_llm,
1492
+ file_system=file_system
1493
+ )
1692
1494
 
1693
1495
  # Handle memory storage
1694
1496
  if len(extracted_content) < 1000:
@@ -1713,7 +1515,7 @@ You will be given a query and the markdown of a webpage that has been filtered t
1713
1515
  raise RuntimeError(str(e))
1714
1516
 
1715
1517
  @self.registry.action(
1716
- 'Write or append content to file_path in file system. Allowed extensions are .md, .txt, .json, .csv, .pdf. For .pdf files, write the content in markdown format and it will automatically be converted to a properly formatted PDF document.'
1518
+ ''
1717
1519
  )
1718
1520
  async def write_file(
1719
1521
  file_path: str,
@@ -1735,7 +1537,7 @@ You will be given a query and the markdown of a webpage that has been filtered t
1735
1537
  return ActionResult(extracted_content=result, long_term_memory=result)
1736
1538
 
1737
1539
  @self.registry.action(
1738
- 'Copy a file to the FileSystem. Set external_src=True to copy from external file(absolute path)to FileSystem, False to copy within FileSystem.'
1540
+ 'Set external_src=True to copy from external file(absolute path)to FileSystem, False to copy within FileSystem.'
1739
1541
  )
1740
1542
  async def copy_file(src_file_path: str, dst_file_path: str, file_system: CustomFileSystem,
1741
1543
  external_src: bool = False):
@@ -1792,7 +1594,7 @@ You will be given a query and the markdown of a webpage that has been filtered t
1792
1594
  )
1793
1595
 
1794
1596
  @self.registry.action(
1795
- 'List contents of a directory within the FileSystem. Use empty string "" or "." to list the root data_dir, or provide relative path for subdirectory.'
1597
+ 'List a directory within the FileSystem. Use empty string "" or "." to list the root FileSystem, or provide relative path for subdirectory.'
1796
1598
  )
1797
1599
  async def list_directory(directory_path: str, file_system: CustomFileSystem):
1798
1600
  result = await file_system.list_directory(directory_path)
@@ -1803,6 +1605,143 @@ You will be given a query and the markdown of a webpage that has been filtered t
1803
1605
  long_term_memory=result,
1804
1606
  )
1805
1607
 
1608
+ @self.registry.action(
1609
+ 'search for query or keywords and return surrounding context',
1610
+ param_model=GrepContentAction,
1611
+ )
1612
+ async def grep_content_from_file(
1613
+ params: GrepContentAction,
1614
+ page_extraction_llm: BaseChatModel,
1615
+ file_system: CustomFileSystem,
1616
+ ):
1617
+ try:
1618
+ # Get file path
1619
+ file_path = params.file_path
1620
+ full_file_path = file_path
1621
+ # Check if file exists
1622
+ if not os.path.exists(full_file_path):
1623
+ full_file_path = os.path.join(str(file_system.get_dir()), file_path)
1624
+
1625
+ # Determine if file is an image based on MIME type
1626
+ mime_type, _ = mimetypes.guess_type(file_path)
1627
+ is_image = mime_type and mime_type.startswith('image/')
1628
+
1629
+ if is_image:
1630
+ # Handle image files with LLM vision for OCR
1631
+ try:
1632
+ # Read image file and encode to base64
1633
+ with open(full_file_path, 'rb') as image_file:
1634
+ image_data = image_file.read()
1635
+ image_base64 = base64.b64encode(image_data).decode('utf-8')
1636
+
1637
+ # Create content parts for OCR
1638
+ content_parts: list[ContentPartTextParam | ContentPartImageParam] = [
1639
+ ContentPartTextParam(
1640
+ text="Please extract all text content from this image for search purposes. Return only the extracted text, no additional explanations.")
1641
+ ]
1642
+
1643
+ # Add the image
1644
+ content_parts.append(
1645
+ ContentPartImageParam(
1646
+ image_url=ImageURL(
1647
+ url=f'data:{mime_type};base64,{image_base64}',
1648
+ media_type=mime_type,
1649
+ detail='high',
1650
+ ),
1651
+ )
1652
+ )
1653
+
1654
+ # Create user message and invoke LLM for OCR
1655
+ user_message = UserMessage(content=content_parts, cache=True)
1656
+ response = await asyncio.wait_for(
1657
+ page_extraction_llm.ainvoke([user_message]),
1658
+ timeout=120.0,
1659
+ )
1660
+
1661
+ file_content = response.completion
1662
+
1663
+ except Exception as e:
1664
+ raise Exception(f'Failed to process image file {file_path} for OCR: {str(e)}')
1665
+
1666
+ else:
1667
+ # Handle non-image files by reading content
1668
+ try:
1669
+ file_content = await file_system.read_file(full_file_path, external_file=True)
1670
+ except Exception as e:
1671
+ raise Exception(f'Failed to read file {file_path}: {str(e)}')
1672
+
1673
+ # Perform grep search
1674
+ search_query = params.query.lower()
1675
+ context_chars = params.context_chars
1676
+
1677
+ # Find all matches with context
1678
+ matches = []
1679
+ content_lower = file_content.lower()
1680
+ search_start = 0
1681
+
1682
+ while True:
1683
+ match_pos = content_lower.find(search_query, search_start)
1684
+ if match_pos == -1:
1685
+ break
1686
+
1687
+ # Calculate context boundaries
1688
+ start_pos = max(0, match_pos - context_chars)
1689
+ end_pos = min(len(file_content), match_pos + len(search_query) + context_chars)
1690
+
1691
+ # Extract context with the match
1692
+ context_before = file_content[start_pos:match_pos]
1693
+ matched_text = file_content[match_pos:match_pos + len(search_query)]
1694
+ context_after = file_content[match_pos + len(search_query):end_pos]
1695
+
1696
+ # Add ellipsis if truncated
1697
+ if start_pos > 0:
1698
+ context_before = "..." + context_before
1699
+ if end_pos < len(file_content):
1700
+ context_after = context_after + "..."
1701
+
1702
+ matches.append({
1703
+ 'context_before': context_before,
1704
+ 'matched_text': matched_text,
1705
+ 'context_after': context_after,
1706
+ 'position': match_pos
1707
+ })
1708
+
1709
+ search_start = match_pos + 1
1710
+
1711
+ # Format results
1712
+ if not matches:
1713
+ extracted_content = f'File: {file_path}\nQuery: "{params.query}"\nResult: No matches found'
1714
+ else:
1715
+ result_text = f'File: {file_path}\nQuery: "{params.query}"\nFound {len(matches)} match(es):\n\n'
1716
+
1717
+ for i, match in enumerate(matches, 1):
1718
+ result_text += f"Match {i} (position: {match['position']}):\n"
1719
+ result_text += f"{match['context_before']}[{match['matched_text']}]{match['context_after']}\n\n"
1720
+
1721
+ extracted_content = result_text.strip()
1722
+
1723
+ # Handle memory storage
1724
+ if len(extracted_content) < 1000:
1725
+ memory = extracted_content
1726
+ include_extracted_content_only_once = False
1727
+ else:
1728
+ save_result = await file_system.save_extracted_content(extracted_content)
1729
+ memory = (
1730
+ f'Grep search completed in file {file_path} for query: {params.query}\nFound {len(matches)} match(es)\nContent saved to file system: {save_result}'
1731
+ )
1732
+ include_extracted_content_only_once = True
1733
+
1734
+ logger.info(f'🔍 Grep search completed in file: {file_path}, found {len(matches)} match(es)')
1735
+ return ActionResult(
1736
+ extracted_content=extracted_content,
1737
+ include_extracted_content_only_once=include_extracted_content_only_once,
1738
+ long_term_memory=memory,
1739
+ )
1740
+
1741
+ except Exception as e:
1742
+ logger.debug(f'Error grep searching content from file: {e}')
1743
+ raise RuntimeError(str(e))
1744
+
1806
1745
  @self.registry.action(
1807
1746
  'Create a directory within the FileSystem.'
1808
1747
  )
@@ -1898,6 +1837,72 @@ You will be given a query and the markdown of a webpage that has been filtered t
1898
1837
  self.mcp_clients.clear()
1899
1838
  logger.info('All MCP clients unregistered and disconnected')
1900
1839
 
1840
+ async def register_composio_clients(self, composio_instance: Optional[Any] = None,
1841
+ toolkit_tools_dict: Optional[Dict[str, Any]] = None):
1842
+ """
1843
+ Register Composio tools to the registry.
1844
+
1845
+ Args:
1846
+ composio_instance: Composio instance (optional, can be None initially)
1847
+ toolkit_tools_dict: Dict of toolkit_slug -> tools list
1848
+ """
1849
+ try:
1850
+ # Initialize Composio client if not exists
1851
+ if self.composio_client is None:
1852
+ self.composio_client = ComposioClient(composio_instance=composio_instance)
1853
+ else:
1854
+ # Update the composio instance
1855
+ self.composio_client.update_composio_instance(composio_instance)
1856
+ self.composio_toolkits = toolkit_tools_dict
1857
+ # Register tools if we have both instance and toolkit tools
1858
+ if composio_instance and toolkit_tools_dict:
1859
+ await self.composio_client.register_to_tools(
1860
+ tools=self,
1861
+ toolkit_tools_dict=toolkit_tools_dict,
1862
+ prefix="cpo."
1863
+ )
1864
+ logger.info(f'Successfully registered Composio tools from {len(toolkit_tools_dict)} toolkits')
1865
+ elif not composio_instance:
1866
+ logger.info("Composio client initialized without instance - will register tools later")
1867
+ elif not toolkit_tools_dict:
1868
+ logger.info("Composio client initialized without toolkit tools - will register tools later")
1869
+
1870
+ except Exception as e:
1871
+ logger.error(f'Failed to register Composio clients: {str(e)}')
1872
+
1873
+ async def unregister_composio_clients(self):
1874
+ """
1875
+ Unregister all Composio tools from the registry.
1876
+ """
1877
+ try:
1878
+ if self.composio_client:
1879
+ self.composio_client.unregister_all_tools(self)
1880
+ logger.info('All Composio tools unregistered')
1881
+ self.composio_toolkits.clear()
1882
+ except Exception as e:
1883
+ logger.error(f'Failed to unregister Composio clients: {str(e)}')
1884
+
1885
+ async def update_composio_tools(self, composio_instance: Optional[Any] = None,
1886
+ toolkit_tools_dict: Optional[Dict[str, Any]] = None):
1887
+ """
1888
+ Update Composio tools by unregistering old ones and registering new ones.
1889
+
1890
+ Args:
1891
+ composio_instance: Composio instance
1892
+ toolkit_tools_dict: Dict of toolkit_slug -> tools list
1893
+ """
1894
+ try:
1895
+ # Unregister existing tools
1896
+ await self.unregister_composio_clients()
1897
+
1898
+ # Register new tools
1899
+ await self.register_composio_clients(composio_instance, toolkit_tools_dict)
1900
+ self.composio_toolkits = toolkit_tools_dict
1901
+ logger.info('Composio tools updated successfully')
1902
+
1903
+ except Exception as e:
1904
+ logger.error(f'Failed to update Composio tools: {str(e)}')
1905
+
1901
1906
  @time_execution_sync('--act')
1902
1907
  async def act(
1903
1908
  self,