vibesurf 0.1.37__py3-none-any.whl → 0.2.9a2__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.
Files changed (2839) hide show
  1. vibe_surf/_version.py +2 -2
  2. vibe_surf/agents/browser_use_agent.py +1 -77
  3. vibe_surf/agents/prompts/vibe_surf_prompt.py +42 -5
  4. vibe_surf/agents/report_writer_agent.py +19 -39
  5. vibe_surf/agents/vibe_surf_agent.py +138 -141
  6. vibe_surf/agents/views.py +6 -15
  7. vibe_surf/backend/api/composio.py +46 -1
  8. vibe_surf/backend/api/schedule.py +331 -0
  9. vibe_surf/backend/api/vibesurf.py +449 -0
  10. vibe_surf/backend/database/migrations/v007_add_schedule_table.sql +29 -0
  11. vibe_surf/backend/database/models.py +34 -1
  12. vibe_surf/backend/database/queries.py +254 -1
  13. vibe_surf/backend/frontend/assets/MCPLangflow-Bzb6g6Zx.png +0 -0
  14. vibe_surf/backend/frontend/assets/SlackIcon-DH9MFXnM.js +1 -0
  15. vibe_surf/backend/frontend/assets/Wikipedia-MKjlsFhR.js +1 -0
  16. vibe_surf/backend/frontend/assets/Wolfram-DZjh94KW.js +1 -0
  17. vibe_surf/backend/frontend/assets/__vite-browser-external-BIHI7g3E.js +1 -0
  18. vibe_surf/backend/frontend/assets/a-arrow-down-M5pMOHfz.js +6 -0
  19. vibe_surf/backend/frontend/assets/a-arrow-up-Bhux1P9g.js +6 -0
  20. vibe_surf/backend/frontend/assets/a-large-small-CxpoIZ2k.js +6 -0
  21. vibe_surf/backend/frontend/assets/accessibility-DIOswxup.js +6 -0
  22. vibe_surf/backend/frontend/assets/activity-Cgoj6BfB.js +6 -0
  23. vibe_surf/backend/frontend/assets/air-vent-BRuCRSP-.js +6 -0
  24. vibe_surf/backend/frontend/assets/airplay-D6ddOHpT.js +6 -0
  25. vibe_surf/backend/frontend/assets/alarm-clock-BswE0svo.js +6 -0
  26. vibe_surf/backend/frontend/assets/alarm-clock-check-CMKnL746.js +6 -0
  27. vibe_surf/backend/frontend/assets/alarm-clock-minus-Cmry03T1.js +6 -0
  28. vibe_surf/backend/frontend/assets/alarm-clock-off-ByCGR7KD.js +6 -0
  29. vibe_surf/backend/frontend/assets/alarm-clock-plus-D80NSz4S.js +6 -0
  30. vibe_surf/backend/frontend/assets/alarm-smoke-DyUVOJUh.js +6 -0
  31. vibe_surf/backend/frontend/assets/album-CGIJADgR.js +6 -0
  32. vibe_surf/backend/frontend/assets/align-center-Cb9nxg1u.js +6 -0
  33. vibe_surf/backend/frontend/assets/align-center-horizontal-DunWyH8w.js +6 -0
  34. vibe_surf/backend/frontend/assets/align-center-vertical-COWbwf4r.js +6 -0
  35. vibe_surf/backend/frontend/assets/align-end-horizontal-BXGWZnJg.js +6 -0
  36. vibe_surf/backend/frontend/assets/align-end-vertical-DsDprlL7.js +6 -0
  37. vibe_surf/backend/frontend/assets/align-horizontal-distribute-center-fSZ29QkE.js +6 -0
  38. vibe_surf/backend/frontend/assets/align-horizontal-distribute-end-C3BFRnLg.js +6 -0
  39. vibe_surf/backend/frontend/assets/align-horizontal-distribute-start-DqYzU1-w.js +6 -0
  40. vibe_surf/backend/frontend/assets/align-horizontal-justify-center-2iNXkDKh.js +6 -0
  41. vibe_surf/backend/frontend/assets/align-horizontal-justify-end-COPIkT0U.js +6 -0
  42. vibe_surf/backend/frontend/assets/align-horizontal-justify-start-DoS3Jrzb.js +6 -0
  43. vibe_surf/backend/frontend/assets/align-horizontal-space-around-k9yEGjMh.js +6 -0
  44. vibe_surf/backend/frontend/assets/align-horizontal-space-between-C6RzmtkD.js +6 -0
  45. vibe_surf/backend/frontend/assets/align-justify-BvD3xtAK.js +6 -0
  46. vibe_surf/backend/frontend/assets/align-left-BP84nxXJ.js +6 -0
  47. vibe_surf/backend/frontend/assets/align-right-6z3k9YVj.js +6 -0
  48. vibe_surf/backend/frontend/assets/align-start-horizontal-DRihqJTg.js +6 -0
  49. vibe_surf/backend/frontend/assets/align-start-vertical-Bs-ISVmy.js +6 -0
  50. vibe_surf/backend/frontend/assets/align-vertical-distribute-center-CU82VWLq.js +6 -0
  51. vibe_surf/backend/frontend/assets/align-vertical-distribute-end-IrubG5LP.js +6 -0
  52. vibe_surf/backend/frontend/assets/align-vertical-distribute-start-BgBu3t8X.js +6 -0
  53. vibe_surf/backend/frontend/assets/align-vertical-justify-center-e7psKZ4D.js +6 -0
  54. vibe_surf/backend/frontend/assets/align-vertical-justify-end-CncIBU5b.js +6 -0
  55. vibe_surf/backend/frontend/assets/align-vertical-justify-start-21_MQReA.js +6 -0
  56. vibe_surf/backend/frontend/assets/align-vertical-space-around-NJNn7zPP.js +6 -0
  57. vibe_surf/backend/frontend/assets/align-vertical-space-between-LYs4c5i9.js +6 -0
  58. vibe_surf/backend/frontend/assets/ambulance-jMfwSVYH.js +6 -0
  59. vibe_surf/backend/frontend/assets/ampersand-B1-1HYj1.js +6 -0
  60. vibe_surf/backend/frontend/assets/ampersands-DVVxe50v.js +6 -0
  61. vibe_surf/backend/frontend/assets/amphora-B12bYdql.js +6 -0
  62. vibe_surf/backend/frontend/assets/anchor-C_JuZyO5.js +6 -0
  63. vibe_surf/backend/frontend/assets/angry-KqzvbAxB.js +6 -0
  64. vibe_surf/backend/frontend/assets/annoyed-CZXUdq0q.js +6 -0
  65. vibe_surf/backend/frontend/assets/antenna-CFlKnuEE.js +6 -0
  66. vibe_surf/backend/frontend/assets/anvil-ObmOBzcW.js +6 -0
  67. vibe_surf/backend/frontend/assets/aperture-CU6mXxj8.js +6 -0
  68. vibe_surf/backend/frontend/assets/apify_white-uCJdZkTU.png +0 -0
  69. vibe_surf/backend/frontend/assets/app-window-D5iSiHiS.js +6 -0
  70. vibe_surf/backend/frontend/assets/app-window-mac-QOaPWoGX.js +6 -0
  71. vibe_surf/backend/frontend/assets/apple-D7ZsI-et.js +6 -0
  72. vibe_surf/backend/frontend/assets/archive-FLn_d8Ny.js +6 -0
  73. vibe_surf/backend/frontend/assets/archive-restore-C668KwvC.js +6 -0
  74. vibe_surf/backend/frontend/assets/archive-x-DJJed9T2.js +6 -0
  75. vibe_surf/backend/frontend/assets/armchair-DfXLs0Nj.js +6 -0
  76. vibe_surf/backend/frontend/assets/arrow-big-down-DU2dtkeu.js +6 -0
  77. vibe_surf/backend/frontend/assets/arrow-big-down-dash-CzsIOlhF.js +6 -0
  78. vibe_surf/backend/frontend/assets/arrow-big-left-CCeUj8q9.js +6 -0
  79. vibe_surf/backend/frontend/assets/arrow-big-left-dash-CFpRtORj.js +6 -0
  80. vibe_surf/backend/frontend/assets/arrow-big-right-C1QE56k7.js +6 -0
  81. vibe_surf/backend/frontend/assets/arrow-big-right-dash-D6H2wruv.js +6 -0
  82. vibe_surf/backend/frontend/assets/arrow-big-up-0f0CsejQ.js +6 -0
  83. vibe_surf/backend/frontend/assets/arrow-big-up-dash-Dz-Sbw66.js +6 -0
  84. vibe_surf/backend/frontend/assets/arrow-down-0-1-B1PGN6BJ.js +6 -0
  85. vibe_surf/backend/frontend/assets/arrow-down-1-0-Bcl1KrrL.js +6 -0
  86. vibe_surf/backend/frontend/assets/arrow-down-DZKzcieL.js +6 -0
  87. vibe_surf/backend/frontend/assets/arrow-down-a-z-DurN_xiR.js +6 -0
  88. vibe_surf/backend/frontend/assets/arrow-down-from-line-D2i9DDA0.js +6 -0
  89. vibe_surf/backend/frontend/assets/arrow-down-left-Pid0zUYj.js +6 -0
  90. vibe_surf/backend/frontend/assets/arrow-down-narrow-wide-DtnDCgZY.js +6 -0
  91. vibe_surf/backend/frontend/assets/arrow-down-right-BgepY9bM.js +6 -0
  92. vibe_surf/backend/frontend/assets/arrow-down-to-dot-C5rQ12yn.js +6 -0
  93. vibe_surf/backend/frontend/assets/arrow-down-to-line-DovZ64L0.js +6 -0
  94. vibe_surf/backend/frontend/assets/arrow-down-up-D5-v7CDC.js +6 -0
  95. vibe_surf/backend/frontend/assets/arrow-down-wide-narrow-CGAsRLvP.js +6 -0
  96. vibe_surf/backend/frontend/assets/arrow-down-z-a-DOGHwUgR.js +6 -0
  97. vibe_surf/backend/frontend/assets/arrow-left-from-line-DwY8iDxY.js +6 -0
  98. vibe_surf/backend/frontend/assets/arrow-left-hKr3yGVm.js +6 -0
  99. vibe_surf/backend/frontend/assets/arrow-left-right-Be5fvvG0.js +6 -0
  100. vibe_surf/backend/frontend/assets/arrow-left-to-line-DKHIypu3.js +6 -0
  101. vibe_surf/backend/frontend/assets/arrow-right-BaRZuB8W.js +6 -0
  102. vibe_surf/backend/frontend/assets/arrow-right-from-line-D3jqt4-q.js +6 -0
  103. vibe_surf/backend/frontend/assets/arrow-right-left-BKRuMAR-.js +6 -0
  104. vibe_surf/backend/frontend/assets/arrow-right-to-line-rtWVy_CC.js +6 -0
  105. vibe_surf/backend/frontend/assets/arrow-up-0-1-yF8Nt_KM.js +6 -0
  106. vibe_surf/backend/frontend/assets/arrow-up-1-0-WRlLFmSw.js +6 -0
  107. vibe_surf/backend/frontend/assets/arrow-up-BKnAmgTC.js +6 -0
  108. vibe_surf/backend/frontend/assets/arrow-up-a-z-COXfk41y.js +6 -0
  109. vibe_surf/backend/frontend/assets/arrow-up-down-Dtw4v35K.js +6 -0
  110. vibe_surf/backend/frontend/assets/arrow-up-from-dot-B1XSjc2P.js +6 -0
  111. vibe_surf/backend/frontend/assets/arrow-up-from-line-C-lHvDpd.js +6 -0
  112. vibe_surf/backend/frontend/assets/arrow-up-left-CYojov8T.js +6 -0
  113. vibe_surf/backend/frontend/assets/arrow-up-narrow-wide-B54CYEHs.js +6 -0
  114. vibe_surf/backend/frontend/assets/arrow-up-right-Bdo9Z-7A.js +6 -0
  115. vibe_surf/backend/frontend/assets/arrow-up-to-line-DS_I-9Vp.js +6 -0
  116. vibe_surf/backend/frontend/assets/arrow-up-wide-narrow-B3GeXj9O.js +6 -0
  117. vibe_surf/backend/frontend/assets/arrow-up-z-a-CdyZuD75.js +6 -0
  118. vibe_surf/backend/frontend/assets/arrows-up-from-line-0sYhsLRw.js +6 -0
  119. vibe_surf/backend/frontend/assets/asterisk-CQWlVYDB.js +6 -0
  120. vibe_surf/backend/frontend/assets/at-sign-Dug8NlWL.js +6 -0
  121. vibe_surf/backend/frontend/assets/atom-Cx1vCOFb.js +6 -0
  122. vibe_surf/backend/frontend/assets/audio-lines-Cimsj6_f.js +6 -0
  123. vibe_surf/backend/frontend/assets/audio-waveform-BxCl1LyQ.js +6 -0
  124. vibe_surf/backend/frontend/assets/award-dRU3xhJ7.js +6 -0
  125. vibe_surf/backend/frontend/assets/axe-B8CCMGTD.js +6 -0
  126. vibe_surf/backend/frontend/assets/axis-3d-D2ZIjjx3.js +6 -0
  127. vibe_surf/backend/frontend/assets/baby-DWh5CwfC.js +6 -0
  128. vibe_surf/backend/frontend/assets/backpack-D9rjYWvf.js +6 -0
  129. vibe_surf/backend/frontend/assets/badge-C0r2CPAV.js +6 -0
  130. vibe_surf/backend/frontend/assets/badge-alert-Do89zN-s.js +6 -0
  131. vibe_surf/backend/frontend/assets/badge-cent-Dmv_cqc-.js +6 -0
  132. vibe_surf/backend/frontend/assets/badge-check--_Rese0X.js +6 -0
  133. vibe_surf/backend/frontend/assets/badge-dollar-sign-BHnNL8ma.js +6 -0
  134. vibe_surf/backend/frontend/assets/badge-euro-CKNQv-oO.js +6 -0
  135. vibe_surf/backend/frontend/assets/badge-help-BlZAHEa-.js +6 -0
  136. vibe_surf/backend/frontend/assets/badge-indian-rupee-BNIUcLaI.js +6 -0
  137. vibe_surf/backend/frontend/assets/badge-info-CrX5KTPR.js +6 -0
  138. vibe_surf/backend/frontend/assets/badge-japanese-yen-0mdbiK5f.js +6 -0
  139. vibe_surf/backend/frontend/assets/badge-minus-BX_scLIK.js +6 -0
  140. vibe_surf/backend/frontend/assets/badge-percent-BSJP3Okj.js +6 -0
  141. vibe_surf/backend/frontend/assets/badge-plus-DhlqCq3Z.js +6 -0
  142. vibe_surf/backend/frontend/assets/badge-pound-sterling-QpnkBN56.js +6 -0
  143. vibe_surf/backend/frontend/assets/badge-russian-ruble-L30Ncxnh.js +6 -0
  144. vibe_surf/backend/frontend/assets/badge-swiss-franc-BQrLli-C.js +6 -0
  145. vibe_surf/backend/frontend/assets/badge-x-DDXVSWE5.js +6 -0
  146. vibe_surf/backend/frontend/assets/baggage-claim-Nd9Qw4rX.js +6 -0
  147. vibe_surf/backend/frontend/assets/ban-fSKv80ss.js +6 -0
  148. vibe_surf/backend/frontend/assets/banana-DTClkW0x.js +6 -0
  149. vibe_surf/backend/frontend/assets/bandage-DLyvBCvf.js +6 -0
  150. vibe_surf/backend/frontend/assets/banknote-ArlwGdT1.js +6 -0
  151. vibe_surf/backend/frontend/assets/banknote-arrow-down-Dx9vP7KP.js +6 -0
  152. vibe_surf/backend/frontend/assets/banknote-arrow-up-CZNOWrKW.js +6 -0
  153. vibe_surf/backend/frontend/assets/banknote-x-y8ot0KXI.js +6 -0
  154. vibe_surf/backend/frontend/assets/barcode-U3mgwXvC.js +6 -0
  155. vibe_surf/backend/frontend/assets/baseline-Bb17nsNt.js +6 -0
  156. vibe_surf/backend/frontend/assets/bath-Fu-10Xqv.js +6 -0
  157. vibe_surf/backend/frontend/assets/battery-D2ng6PHz.js +6 -0
  158. vibe_surf/backend/frontend/assets/battery-charging-BBA_U97U.js +6 -0
  159. vibe_surf/backend/frontend/assets/battery-full-D74R09iv.js +6 -0
  160. vibe_surf/backend/frontend/assets/battery-low-BMeJBmJp.js +6 -0
  161. vibe_surf/backend/frontend/assets/battery-medium-clKHZw71.js +6 -0
  162. vibe_surf/backend/frontend/assets/battery-plus-DxtzU1bB.js +6 -0
  163. vibe_surf/backend/frontend/assets/battery-warning-1NEZ4eCa.js +6 -0
  164. vibe_surf/backend/frontend/assets/beaker-Br0pnmtw.js +6 -0
  165. vibe_surf/backend/frontend/assets/bean-B04lfjZo.js +6 -0
  166. vibe_surf/backend/frontend/assets/bean-off-C6H6plJJ.js +6 -0
  167. vibe_surf/backend/frontend/assets/bed-B7xWDlGQ.js +6 -0
  168. vibe_surf/backend/frontend/assets/bed-double-We8EVOE6.js +6 -0
  169. vibe_surf/backend/frontend/assets/bed-single-C-tVm75i.js +6 -0
  170. vibe_surf/backend/frontend/assets/beef-BzzCqLUx.js +6 -0
  171. vibe_surf/backend/frontend/assets/beer-B1aIU5Wp.js +6 -0
  172. vibe_surf/backend/frontend/assets/beer-off-T9p0sUQ_.js +6 -0
  173. vibe_surf/backend/frontend/assets/bell-BiEY08q7.js +6 -0
  174. vibe_surf/backend/frontend/assets/bell-dot-D6ZHJmF9.js +6 -0
  175. vibe_surf/backend/frontend/assets/bell-electric-BjP0O4kE.js +6 -0
  176. vibe_surf/backend/frontend/assets/bell-minus-Cw2KMMsV.js +6 -0
  177. vibe_surf/backend/frontend/assets/bell-off-JUGEvepv.js +6 -0
  178. vibe_surf/backend/frontend/assets/bell-plus-BtwPCtO5.js +6 -0
  179. vibe_surf/backend/frontend/assets/bell-ring-B_RAFBbK.js +6 -0
  180. vibe_surf/backend/frontend/assets/between-horizontal-end-DG9RojRP.js +6 -0
  181. vibe_surf/backend/frontend/assets/between-horizontal-start-BNuWKIUb.js +6 -0
  182. vibe_surf/backend/frontend/assets/between-vertical-end-CUvl7S4G.js +6 -0
  183. vibe_surf/backend/frontend/assets/between-vertical-start-tYvnZE7k.js +6 -0
  184. vibe_surf/backend/frontend/assets/biceps-flexed-D2zMmbhv.js +6 -0
  185. vibe_surf/backend/frontend/assets/bike-DPdpsZIt.js +6 -0
  186. vibe_surf/backend/frontend/assets/binary-DnnraEVk.js +6 -0
  187. vibe_surf/backend/frontend/assets/binoculars-BXc-CFA4.js +6 -0
  188. vibe_surf/backend/frontend/assets/biohazard-D-6PF7OA.js +6 -0
  189. vibe_surf/backend/frontend/assets/bird-CYNkrqM5.js +6 -0
  190. vibe_surf/backend/frontend/assets/bitcoin-DG6PDKEk.js +6 -0
  191. vibe_surf/backend/frontend/assets/blend-COR-wQIS.js +6 -0
  192. vibe_surf/backend/frontend/assets/blinds-_pD0AjwU.js +6 -0
  193. vibe_surf/backend/frontend/assets/blocks-C0goFnXe.js +6 -0
  194. vibe_surf/backend/frontend/assets/bluetooth-BFH9HCot.js +6 -0
  195. vibe_surf/backend/frontend/assets/bluetooth-connected-C9JKQLmC.js +6 -0
  196. vibe_surf/backend/frontend/assets/bluetooth-off-ka-F7ZnG.js +6 -0
  197. vibe_surf/backend/frontend/assets/bluetooth-searching-BdyfX9rD.js +6 -0
  198. vibe_surf/backend/frontend/assets/bold-CZSxbQF9.js +6 -0
  199. vibe_surf/backend/frontend/assets/bolt-BjrrPChn.js +6 -0
  200. vibe_surf/backend/frontend/assets/bomb-CMlcm4r9.js +6 -0
  201. vibe_surf/backend/frontend/assets/bone-qWIxHNfL.js +6 -0
  202. vibe_surf/backend/frontend/assets/book-BfRvOdc3.js +6 -0
  203. vibe_surf/backend/frontend/assets/book-a-CpoCb7Zv.js +6 -0
  204. vibe_surf/backend/frontend/assets/book-audio-cBKWAq-p.js +6 -0
  205. vibe_surf/backend/frontend/assets/book-check-CqwOgoOp.js +6 -0
  206. vibe_surf/backend/frontend/assets/book-copy-ORHl4yqI.js +6 -0
  207. vibe_surf/backend/frontend/assets/book-dashed-BrJdSa-D.js +6 -0
  208. vibe_surf/backend/frontend/assets/book-down-Bj4JV-P-.js +6 -0
  209. vibe_surf/backend/frontend/assets/book-headphones-BYuIU1gj.js +6 -0
  210. vibe_surf/backend/frontend/assets/book-heart-DCUxVJaU.js +6 -0
  211. vibe_surf/backend/frontend/assets/book-image-BPpCKv6n.js +6 -0
  212. vibe_surf/backend/frontend/assets/book-key-Ca_EtM6h.js +6 -0
  213. vibe_surf/backend/frontend/assets/book-lock-Bldzz1aF.js +6 -0
  214. vibe_surf/backend/frontend/assets/book-marked-BCleXwJ3.js +6 -0
  215. vibe_surf/backend/frontend/assets/book-minus-XoJOGZOx.js +6 -0
  216. vibe_surf/backend/frontend/assets/book-open-DUlI5XCY.js +6 -0
  217. vibe_surf/backend/frontend/assets/book-open-check-BEksHFoQ.js +6 -0
  218. vibe_surf/backend/frontend/assets/book-open-text-CiKyiRt-.js +6 -0
  219. vibe_surf/backend/frontend/assets/book-plus-DuUfSKu2.js +6 -0
  220. vibe_surf/backend/frontend/assets/book-text-TTfLk4-M.js +6 -0
  221. vibe_surf/backend/frontend/assets/book-type-CMV326FZ.js +6 -0
  222. vibe_surf/backend/frontend/assets/book-up-2-CGiuKI0n.js +6 -0
  223. vibe_surf/backend/frontend/assets/book-up-d2hb8aDq.js +6 -0
  224. vibe_surf/backend/frontend/assets/book-user-BsZySUGG.js +6 -0
  225. vibe_surf/backend/frontend/assets/book-x-CoSA25As.js +6 -0
  226. vibe_surf/backend/frontend/assets/bookmark-CVx8aFGk.js +6 -0
  227. vibe_surf/backend/frontend/assets/bookmark-check-Zh_1fqo_.js +6 -0
  228. vibe_surf/backend/frontend/assets/bookmark-minus---KmRSON.js +6 -0
  229. vibe_surf/backend/frontend/assets/bookmark-plus-ZY-aQ6r5.js +6 -0
  230. vibe_surf/backend/frontend/assets/bookmark-x-DnEKBdZC.js +6 -0
  231. vibe_surf/backend/frontend/assets/boom-box-D5cJf4pI.js +6 -0
  232. vibe_surf/backend/frontend/assets/bot-BbS7VJ5s.js +6 -0
  233. vibe_surf/backend/frontend/assets/bot-message-square-Bm4hBAbI.js +6 -0
  234. vibe_surf/backend/frontend/assets/bot-off-CFjG1wx4.js +6 -0
  235. vibe_surf/backend/frontend/assets/bow-arrow-Bupk8VJM.js +6 -0
  236. vibe_surf/backend/frontend/assets/box-CyVAC5Vv.js +6 -0
  237. vibe_surf/backend/frontend/assets/boxes-B3xCa_UA.js +6 -0
  238. vibe_surf/backend/frontend/assets/braces-QLXt2h0B.js +6 -0
  239. vibe_surf/backend/frontend/assets/brackets-CEy7gs9d.js +6 -0
  240. vibe_surf/backend/frontend/assets/brain-circuit-WmeDjyy5.js +6 -0
  241. vibe_surf/backend/frontend/assets/brain-cog-DKDdpxNn.js +6 -0
  242. vibe_surf/backend/frontend/assets/brain-ziGJYeS1.js +6 -0
  243. vibe_surf/backend/frontend/assets/brick-wall-DXer5s5J.js +6 -0
  244. vibe_surf/backend/frontend/assets/brick-wall-fire-CfXr8Krv.js +6 -0
  245. vibe_surf/backend/frontend/assets/briefcase-C2YbssAg.js +6 -0
  246. vibe_surf/backend/frontend/assets/briefcase-business-CJCpJSkU.js +6 -0
  247. vibe_surf/backend/frontend/assets/briefcase-conveyor-belt-B0jqiIT4.js +6 -0
  248. vibe_surf/backend/frontend/assets/briefcase-medical-BBH0C6ZQ.js +6 -0
  249. vibe_surf/backend/frontend/assets/bring-to-front-ywT72zy-.js +6 -0
  250. vibe_surf/backend/frontend/assets/brush-_uc9w_j1.js +6 -0
  251. vibe_surf/backend/frontend/assets/bubbles-ggRrvDQI.js +6 -0
  252. vibe_surf/backend/frontend/assets/bug-6l9frAXO.js +6 -0
  253. vibe_surf/backend/frontend/assets/bug-off-BmK1mJ7T.js +6 -0
  254. vibe_surf/backend/frontend/assets/bug-play-DbXJeqOa.js +6 -0
  255. vibe_surf/backend/frontend/assets/building-2-Cf9gYIvy.js +6 -0
  256. vibe_surf/backend/frontend/assets/building-D9eMVeBu.js +6 -0
  257. vibe_surf/backend/frontend/assets/bus-COrhWbdv.js +6 -0
  258. vibe_surf/backend/frontend/assets/bus-front-Csav5OG_.js +6 -0
  259. vibe_surf/backend/frontend/assets/cable-BPG7O6tf.js +6 -0
  260. vibe_surf/backend/frontend/assets/cable-car-ChPtZlze.js +6 -0
  261. vibe_surf/backend/frontend/assets/cake-DnmMZhI2.js +6 -0
  262. vibe_surf/backend/frontend/assets/cake-slice-Clc5mDPW.js +6 -0
  263. vibe_surf/backend/frontend/assets/calculator-C77I3XPN.js +6 -0
  264. vibe_surf/backend/frontend/assets/calendar-1-BMs-t7Zd.js +6 -0
  265. vibe_surf/backend/frontend/assets/calendar-DuLRS-6L.js +6 -0
  266. vibe_surf/backend/frontend/assets/calendar-arrow-down-DoVsOnV0.js +6 -0
  267. vibe_surf/backend/frontend/assets/calendar-arrow-up-Ca_1_rkT.js +6 -0
  268. vibe_surf/backend/frontend/assets/calendar-check-2-0JmvXRsb.js +6 -0
  269. vibe_surf/backend/frontend/assets/calendar-check-DtTDIbPE.js +6 -0
  270. vibe_surf/backend/frontend/assets/calendar-clock-39XA2NxZ.js +6 -0
  271. vibe_surf/backend/frontend/assets/calendar-cog-B3elAX8P.js +6 -0
  272. vibe_surf/backend/frontend/assets/calendar-days-B_4sd_nS.js +6 -0
  273. vibe_surf/backend/frontend/assets/calendar-fold-1GZdJiY5.js +6 -0
  274. vibe_surf/backend/frontend/assets/calendar-heart-C20Gu6Pq.js +6 -0
  275. vibe_surf/backend/frontend/assets/calendar-minus-2-C2uYA9Xy.js +6 -0
  276. vibe_surf/backend/frontend/assets/calendar-minus-Bf9ZhUgX.js +6 -0
  277. vibe_surf/backend/frontend/assets/calendar-off-oqUiDnlM.js +6 -0
  278. vibe_surf/backend/frontend/assets/calendar-plus-2-D5AF7K6Z.js +6 -0
  279. vibe_surf/backend/frontend/assets/calendar-plus-DFRLvp48.js +6 -0
  280. vibe_surf/backend/frontend/assets/calendar-range-BtbX_u86.js +6 -0
  281. vibe_surf/backend/frontend/assets/calendar-search-DKFr3oFg.js +6 -0
  282. vibe_surf/backend/frontend/assets/calendar-sync-J6s1mjVg.js +6 -0
  283. vibe_surf/backend/frontend/assets/calendar-x-16dHXmS-.js +6 -0
  284. vibe_surf/backend/frontend/assets/calendar-x-2-DASXeIpI.js +6 -0
  285. vibe_surf/backend/frontend/assets/camera-C73rx5T7.js +6 -0
  286. vibe_surf/backend/frontend/assets/camera-off-lYXrg8Ab.js +6 -0
  287. vibe_surf/backend/frontend/assets/candy-DHin-JSi.js +6 -0
  288. vibe_surf/backend/frontend/assets/candy-cane-BrFztxP3.js +6 -0
  289. vibe_surf/backend/frontend/assets/candy-off-C6p9RmsL.js +6 -0
  290. vibe_surf/backend/frontend/assets/cannabis-BIomtlTh.js +6 -0
  291. vibe_surf/backend/frontend/assets/captions-CU9AD1HN.js +6 -0
  292. vibe_surf/backend/frontend/assets/captions-off-BQabz_7T.js +6 -0
  293. vibe_surf/backend/frontend/assets/car-CIepr4l8.js +6 -0
  294. vibe_surf/backend/frontend/assets/car-front-BvC3NXIU.js +6 -0
  295. vibe_surf/backend/frontend/assets/car-taxi-front-D6kk_vUY.js +6 -0
  296. vibe_surf/backend/frontend/assets/caravan-B4YvOfvY.js +6 -0
  297. vibe_surf/backend/frontend/assets/carrot-DScNmGFZ.js +6 -0
  298. vibe_surf/backend/frontend/assets/case-lower-iW8MijQ2.js +6 -0
  299. vibe_surf/backend/frontend/assets/case-sensitive-DggKI0Fh.js +6 -0
  300. vibe_surf/backend/frontend/assets/case-upper-BC22BC0q.js +6 -0
  301. vibe_surf/backend/frontend/assets/cassette-tape-PMwALept.js +6 -0
  302. vibe_surf/backend/frontend/assets/cast-Kq2v55CB.js +6 -0
  303. vibe_surf/backend/frontend/assets/castle-DJzhSlL6.js +6 -0
  304. vibe_surf/backend/frontend/assets/cat-Cszwi-0j.js +6 -0
  305. vibe_surf/backend/frontend/assets/cctv-4zeLHFGP.js +6 -0
  306. vibe_surf/backend/frontend/assets/chart-area-JyFaZNpl.js +6 -0
  307. vibe_surf/backend/frontend/assets/chart-bar-Bcnue-Eu.js +6 -0
  308. vibe_surf/backend/frontend/assets/chart-bar-big-dJ6tM8UP.js +6 -0
  309. vibe_surf/backend/frontend/assets/chart-bar-decreasing-jviD9Nka.js +6 -0
  310. vibe_surf/backend/frontend/assets/chart-bar-increasing-BcpuBWlQ.js +6 -0
  311. vibe_surf/backend/frontend/assets/chart-bar-stacked-DLxMM-a6.js +6 -0
  312. vibe_surf/backend/frontend/assets/chart-candlestick-BK5WOKib.js +6 -0
  313. vibe_surf/backend/frontend/assets/chart-column-BjT_DIge.js +6 -0
  314. vibe_surf/backend/frontend/assets/chart-column-big-BoOEhNxT.js +6 -0
  315. vibe_surf/backend/frontend/assets/chart-column-decreasing-B3PEhFWj.js +6 -0
  316. vibe_surf/backend/frontend/assets/chart-column-increasing-KTAFoIBT.js +6 -0
  317. vibe_surf/backend/frontend/assets/chart-column-stacked-Drci0FWY.js +6 -0
  318. vibe_surf/backend/frontend/assets/chart-gantt-CxLhKfws.js +6 -0
  319. vibe_surf/backend/frontend/assets/chart-line-Deh3i4SN.js +6 -0
  320. vibe_surf/backend/frontend/assets/chart-network-1nLETKIo.js +6 -0
  321. vibe_surf/backend/frontend/assets/chart-no-axes-column-BBUb9OL4.js +6 -0
  322. vibe_surf/backend/frontend/assets/chart-no-axes-column-decreasing-BNGTEmAA.js +6 -0
  323. vibe_surf/backend/frontend/assets/chart-no-axes-column-increasing-DYl5MpQr.js +6 -0
  324. vibe_surf/backend/frontend/assets/chart-no-axes-combined-Bwo9fVPi.js +6 -0
  325. vibe_surf/backend/frontend/assets/chart-no-axes-gantt-CIpwp7-G.js +6 -0
  326. vibe_surf/backend/frontend/assets/chart-pie-Brn9eScK.js +6 -0
  327. vibe_surf/backend/frontend/assets/chart-scatter-BFmfnF4I.js +6 -0
  328. vibe_surf/backend/frontend/assets/chart-spline-iPy-W03i.js +6 -0
  329. vibe_surf/backend/frontend/assets/check-check-CQEfDsmx.js +6 -0
  330. vibe_surf/backend/frontend/assets/chef-hat-DdOkr4i8.js +6 -0
  331. vibe_surf/backend/frontend/assets/cherry-XkD_QiBI.js +6 -0
  332. vibe_surf/backend/frontend/assets/chevron-first-muFwJevA.js +6 -0
  333. vibe_surf/backend/frontend/assets/chevron-last-Bn079TLv.js +6 -0
  334. vibe_surf/backend/frontend/assets/chevron-left-BhWYBFsk.js +6 -0
  335. vibe_surf/backend/frontend/assets/chevron-right-zm672Mdr.js +6 -0
  336. vibe_surf/backend/frontend/assets/chevrons-down-T3mOFRB2.js +6 -0
  337. vibe_surf/backend/frontend/assets/chevrons-down-up-BfWmsaYK.js +6 -0
  338. vibe_surf/backend/frontend/assets/chevrons-left-BLFCiP6g.js +6 -0
  339. vibe_surf/backend/frontend/assets/chevrons-left-right-Cgp4lAQF.js +6 -0
  340. vibe_surf/backend/frontend/assets/chevrons-left-right-ellipsis-BZSVxQ-x.js +6 -0
  341. vibe_surf/backend/frontend/assets/chevrons-right-DMKOjes0.js +6 -0
  342. vibe_surf/backend/frontend/assets/chevrons-right-left-Clwbiy09.js +6 -0
  343. vibe_surf/backend/frontend/assets/chevrons-up-CdrwLxmN.js +6 -0
  344. vibe_surf/backend/frontend/assets/chrome-46ygw5lK.js +6 -0
  345. vibe_surf/backend/frontend/assets/church-DQW3bkcl.js +6 -0
  346. vibe_surf/backend/frontend/assets/cigarette-CTvLdOLV.js +6 -0
  347. vibe_surf/backend/frontend/assets/cigarette-off-D0kR9lro.js +6 -0
  348. vibe_surf/backend/frontend/assets/circle-alert-QG2k6eWP.js +6 -0
  349. vibe_surf/backend/frontend/assets/circle-arrow-down-BHFs0Q9-.js +6 -0
  350. vibe_surf/backend/frontend/assets/circle-arrow-left-DQWeTJLw.js +6 -0
  351. vibe_surf/backend/frontend/assets/circle-arrow-out-down-left-B_oYI2Rn.js +6 -0
  352. vibe_surf/backend/frontend/assets/circle-arrow-out-down-right-BL4vxEs9.js +6 -0
  353. vibe_surf/backend/frontend/assets/circle-arrow-out-up-left-CFi1FNF-.js +6 -0
  354. vibe_surf/backend/frontend/assets/circle-arrow-out-up-right-CmMWk14E.js +6 -0
  355. vibe_surf/backend/frontend/assets/circle-arrow-right-dhHL8jIm.js +6 -0
  356. vibe_surf/backend/frontend/assets/circle-arrow-up-B8XWR9s_.js +6 -0
  357. vibe_surf/backend/frontend/assets/circle-check-CRm9QkNA.js +6 -0
  358. vibe_surf/backend/frontend/assets/circle-check-big-CPPNLArI.js +6 -0
  359. vibe_surf/backend/frontend/assets/circle-chevron-down-Cs4S5V03.js +6 -0
  360. vibe_surf/backend/frontend/assets/circle-chevron-left-V81BDvwB.js +6 -0
  361. vibe_surf/backend/frontend/assets/circle-chevron-right-CRa7Bkcz.js +6 -0
  362. vibe_surf/backend/frontend/assets/circle-chevron-up-FDxLxvSd.js +6 -0
  363. vibe_surf/backend/frontend/assets/circle-dashed-DD55_roy.js +6 -0
  364. vibe_surf/backend/frontend/assets/circle-divide-DKpocsWo.js +6 -0
  365. vibe_surf/backend/frontend/assets/circle-dollar-sign-p7_bVi5m.js +6 -0
  366. vibe_surf/backend/frontend/assets/circle-dot-Be13EypY.js +6 -0
  367. vibe_surf/backend/frontend/assets/circle-dot-dashed-KuVNkxEv.js +6 -0
  368. vibe_surf/backend/frontend/assets/circle-ellipsis-BSLpVL-C.js +6 -0
  369. vibe_surf/backend/frontend/assets/circle-equal-_Mfed9km.js +6 -0
  370. vibe_surf/backend/frontend/assets/circle-fading-arrow-up-D_E3BIXf.js +6 -0
  371. vibe_surf/backend/frontend/assets/circle-fading-plus-5ZA5Je_2.js +6 -0
  372. vibe_surf/backend/frontend/assets/circle-gauge-b41i9Azv.js +6 -0
  373. vibe_surf/backend/frontend/assets/circle-help-BOLgIUsf.js +6 -0
  374. vibe_surf/backend/frontend/assets/circle-minus-C41JxC_E.js +6 -0
  375. vibe_surf/backend/frontend/assets/circle-off-yuGaN1EU.js +6 -0
  376. vibe_surf/backend/frontend/assets/circle-parking-B-DnXhcd.js +6 -0
  377. vibe_surf/backend/frontend/assets/circle-parking-off-DsCM2b8j.js +6 -0
  378. vibe_surf/backend/frontend/assets/circle-pause-Dqufdu9m.js +6 -0
  379. vibe_surf/backend/frontend/assets/circle-percent-Dp8UwPQq.js +6 -0
  380. vibe_surf/backend/frontend/assets/circle-play-N8vi1Pcd.js +6 -0
  381. vibe_surf/backend/frontend/assets/circle-plus-wD1VqIgT.js +6 -0
  382. vibe_surf/backend/frontend/assets/circle-power-DBZAmaYW.js +6 -0
  383. vibe_surf/backend/frontend/assets/circle-slash-2-hdq8_Fp6.js +6 -0
  384. vibe_surf/backend/frontend/assets/circle-slash-CSrHLLP2.js +6 -0
  385. vibe_surf/backend/frontend/assets/circle-small-BQ6lrOIo.js +6 -0
  386. vibe_surf/backend/frontend/assets/circle-stop-xgLQ9Loi.js +6 -0
  387. vibe_surf/backend/frontend/assets/circle-user-CzvrnVH9.js +6 -0
  388. vibe_surf/backend/frontend/assets/circle-user-round-0JhYfAcs.js +6 -0
  389. vibe_surf/backend/frontend/assets/circuit-board-DpN-UUwV.js +6 -0
  390. vibe_surf/backend/frontend/assets/citrus-BGWHfGg3.js +6 -0
  391. vibe_surf/backend/frontend/assets/clapperboard-9m-99Aof.js +6 -0
  392. vibe_surf/backend/frontend/assets/clipboard-C-MVPhAy.js +6 -0
  393. vibe_surf/backend/frontend/assets/clipboard-check-Bonb2WoP.js +6 -0
  394. vibe_surf/backend/frontend/assets/clipboard-copy-CmRHdw5h.js +6 -0
  395. vibe_surf/backend/frontend/assets/clipboard-list-DEof2iPM.js +6 -0
  396. vibe_surf/backend/frontend/assets/clipboard-minus-DN2QuVOG.js +6 -0
  397. vibe_surf/backend/frontend/assets/clipboard-paste-B20nudiB.js +6 -0
  398. vibe_surf/backend/frontend/assets/clipboard-pen-BZJamOnq.js +6 -0
  399. vibe_surf/backend/frontend/assets/clipboard-pen-line-DScYxgpw.js +6 -0
  400. vibe_surf/backend/frontend/assets/clipboard-plus-DJb4TcvR.js +6 -0
  401. vibe_surf/backend/frontend/assets/clipboard-type-DaibEn_w.js +6 -0
  402. vibe_surf/backend/frontend/assets/clipboard-x-CebR2xkR.js +6 -0
  403. vibe_surf/backend/frontend/assets/clock-1-Cz0OEQH3.js +6 -0
  404. vibe_surf/backend/frontend/assets/clock-10-BMLTtzHQ.js +6 -0
  405. vibe_surf/backend/frontend/assets/clock-11-CZ6m52x1.js +6 -0
  406. vibe_surf/backend/frontend/assets/clock-12-BXZWDgbr.js +6 -0
  407. vibe_surf/backend/frontend/assets/clock-2-ElC7DzP5.js +6 -0
  408. vibe_surf/backend/frontend/assets/clock-3-DN86BONK.js +6 -0
  409. vibe_surf/backend/frontend/assets/clock-4-CV9eUVD9.js +6 -0
  410. vibe_surf/backend/frontend/assets/clock-5-DgMTU8BD.js +6 -0
  411. vibe_surf/backend/frontend/assets/clock-6-_RjAiNVz.js +6 -0
  412. vibe_surf/backend/frontend/assets/clock-7-DsWDnhwN.js +6 -0
  413. vibe_surf/backend/frontend/assets/clock-8-CY-eCfWq.js +6 -0
  414. vibe_surf/backend/frontend/assets/clock-9-D4aWNYpk.js +6 -0
  415. vibe_surf/backend/frontend/assets/clock-UtAbEQE0.js +6 -0
  416. vibe_surf/backend/frontend/assets/clock-alert-gi6h-zRT.js +6 -0
  417. vibe_surf/backend/frontend/assets/clock-arrow-down-CC9Qp0ac.js +6 -0
  418. vibe_surf/backend/frontend/assets/clock-arrow-up-Cjt2qN9V.js +6 -0
  419. vibe_surf/backend/frontend/assets/clock-fading-BJp0FFxY.js +6 -0
  420. vibe_surf/backend/frontend/assets/cloud-TYaHXSiL.js +6 -0
  421. vibe_surf/backend/frontend/assets/cloud-alert-Dp4WVua8.js +6 -0
  422. vibe_surf/backend/frontend/assets/cloud-cog-Dlyn4rqA.js +6 -0
  423. vibe_surf/backend/frontend/assets/cloud-download-DH8UN3eX.js +6 -0
  424. vibe_surf/backend/frontend/assets/cloud-drizzle-s8348ic3.js +6 -0
  425. vibe_surf/backend/frontend/assets/cloud-fog-DHRDnzsg.js +6 -0
  426. vibe_surf/backend/frontend/assets/cloud-hail-D7nJGZgB.js +6 -0
  427. vibe_surf/backend/frontend/assets/cloud-lightning-CscbfdPI.js +6 -0
  428. vibe_surf/backend/frontend/assets/cloud-moon-C6897Z5z.js +6 -0
  429. vibe_surf/backend/frontend/assets/cloud-moon-rain-B6pK_auO.js +6 -0
  430. vibe_surf/backend/frontend/assets/cloud-off-1kN_AD0k.js +6 -0
  431. vibe_surf/backend/frontend/assets/cloud-rain-Dj6B4fBD.js +6 -0
  432. vibe_surf/backend/frontend/assets/cloud-rain-wind-BJrdBUd4.js +6 -0
  433. vibe_surf/backend/frontend/assets/cloud-snow-LK6lpCkZ.js +6 -0
  434. vibe_surf/backend/frontend/assets/cloud-sun-CRH8EQEJ.js +6 -0
  435. vibe_surf/backend/frontend/assets/cloud-sun-rain-7IssqnpA.js +6 -0
  436. vibe_surf/backend/frontend/assets/cloud-upload-tI3Dz1zd.js +6 -0
  437. vibe_surf/backend/frontend/assets/cloudy-okUc5uOM.js +6 -0
  438. vibe_surf/backend/frontend/assets/clover-O6CtUOhV.js +6 -0
  439. vibe_surf/backend/frontend/assets/club-SnWEwVMR.js +6 -0
  440. vibe_surf/backend/frontend/assets/code-xml-CYTnIdXN.js +6 -0
  441. vibe_surf/backend/frontend/assets/codepen-UxBTFH8q.js +6 -0
  442. vibe_surf/backend/frontend/assets/codesandbox-CSRpmotF.js +6 -0
  443. vibe_surf/backend/frontend/assets/coffee-BTr4K8Gn.js +6 -0
  444. vibe_surf/backend/frontend/assets/cog-C7RMqAcW.js +6 -0
  445. vibe_surf/backend/frontend/assets/coins-D7gWOtE7.js +6 -0
  446. vibe_surf/backend/frontend/assets/columns-2-WBM3YpNL.js +6 -0
  447. vibe_surf/backend/frontend/assets/columns-3-DyAMu-k8.js +6 -0
  448. vibe_surf/backend/frontend/assets/columns-3-cog-zfUPAOg0.js +6 -0
  449. vibe_surf/backend/frontend/assets/columns-4-Qz-B3Dvq.js +6 -0
  450. vibe_surf/backend/frontend/assets/combine-CLZvnf8j.js +6 -0
  451. vibe_surf/backend/frontend/assets/command-D8ymLYGG.js +6 -0
  452. vibe_surf/backend/frontend/assets/compass-DGYgNSVa.js +6 -0
  453. vibe_surf/backend/frontend/assets/component-CwL9ER1Q.js +6 -0
  454. vibe_surf/backend/frontend/assets/computer-QNTojt_5.js +6 -0
  455. vibe_surf/backend/frontend/assets/concierge-bell-C7jm8QJd.js +6 -0
  456. vibe_surf/backend/frontend/assets/cone-C9TQbkDB.js +6 -0
  457. vibe_surf/backend/frontend/assets/construction-CSyYpaz5.js +6 -0
  458. vibe_surf/backend/frontend/assets/contact-CFldvJVP.js +6 -0
  459. vibe_surf/backend/frontend/assets/contact-round-DA1kjclM.js +6 -0
  460. vibe_surf/backend/frontend/assets/container-BfGJKo0o.js +6 -0
  461. vibe_surf/backend/frontend/assets/contrast-DmYhTvN3.js +6 -0
  462. vibe_surf/backend/frontend/assets/cookie-Cw70purP.js +6 -0
  463. vibe_surf/backend/frontend/assets/cooking-pot-WzjjWZaR.js +6 -0
  464. vibe_surf/backend/frontend/assets/copy-BPjnY3ea.js +6 -0
  465. vibe_surf/backend/frontend/assets/copy-check-B6hqPf9B.js +6 -0
  466. vibe_surf/backend/frontend/assets/copy-minus-DMGhawAT.js +6 -0
  467. vibe_surf/backend/frontend/assets/copy-plus-DcW4_i4R.js +6 -0
  468. vibe_surf/backend/frontend/assets/copy-slash-Cn_xel6o.js +6 -0
  469. vibe_surf/backend/frontend/assets/copy-x-Dmf3jckJ.js +6 -0
  470. vibe_surf/backend/frontend/assets/copyleft-CJDbqV_Y.js +6 -0
  471. vibe_surf/backend/frontend/assets/copyright-Buw-D4Xa.js +6 -0
  472. vibe_surf/backend/frontend/assets/corner-down-left-BhPTW3SL.js +6 -0
  473. vibe_surf/backend/frontend/assets/corner-down-right-B_Md48mW.js +6 -0
  474. vibe_surf/backend/frontend/assets/corner-left-down-DDc0LvYT.js +6 -0
  475. vibe_surf/backend/frontend/assets/corner-left-up-C_EIQYvd.js +6 -0
  476. vibe_surf/backend/frontend/assets/corner-right-down-Bipz7-p6.js +6 -0
  477. vibe_surf/backend/frontend/assets/corner-right-up-euSAC3Mi.js +6 -0
  478. vibe_surf/backend/frontend/assets/corner-up-left-CRvdJT3E.js +6 -0
  479. vibe_surf/backend/frontend/assets/corner-up-right-CCK7dhVV.js +6 -0
  480. vibe_surf/backend/frontend/assets/cpu-DB-52VKi.js +6 -0
  481. vibe_surf/backend/frontend/assets/creative-commons-CXWueat0.js +6 -0
  482. vibe_surf/backend/frontend/assets/credit-card-CR5swmPL.js +6 -0
  483. vibe_surf/backend/frontend/assets/croissant-ClZbIF3L.js +6 -0
  484. vibe_surf/backend/frontend/assets/crop-DSXkvq6D.js +6 -0
  485. vibe_surf/backend/frontend/assets/cross-CkHV6YOi.js +6 -0
  486. vibe_surf/backend/frontend/assets/crosshair-C3tcoYxo.js +6 -0
  487. vibe_surf/backend/frontend/assets/crown-0LB9DCRa.js +6 -0
  488. vibe_surf/backend/frontend/assets/cuboid-CidkVtLJ.js +6 -0
  489. vibe_surf/backend/frontend/assets/cup-soda-DG_5s6Ma.js +6 -0
  490. vibe_surf/backend/frontend/assets/currency-AEQeyk_J.js +6 -0
  491. vibe_surf/backend/frontend/assets/cylinder-Da7lV5Pc.js +6 -0
  492. vibe_surf/backend/frontend/assets/dam-BIFS7P89.js +6 -0
  493. vibe_surf/backend/frontend/assets/database-Dx9euHTJ.js +6 -0
  494. vibe_surf/backend/frontend/assets/database-backup-Bbbt7mXt.js +6 -0
  495. vibe_surf/backend/frontend/assets/database-zap-CJC7IfdF.js +6 -0
  496. vibe_surf/backend/frontend/assets/decimals-arrow-left-BrRd8_vb.js +6 -0
  497. vibe_surf/backend/frontend/assets/decimals-arrow-right-Cglo48c9.js +6 -0
  498. vibe_surf/backend/frontend/assets/delete-C9qTL0sD.js +6 -0
  499. vibe_surf/backend/frontend/assets/dessert-7PTt5JJ0.js +6 -0
  500. vibe_surf/backend/frontend/assets/diameter-oheO2UGD.js +6 -0
  501. vibe_surf/backend/frontend/assets/diamond-DhBpDMNy.js +6 -0
  502. vibe_surf/backend/frontend/assets/diamond-minus-BqTULDvb.js +6 -0
  503. vibe_surf/backend/frontend/assets/diamond-percent-D1Ck8xGc.js +6 -0
  504. vibe_surf/backend/frontend/assets/diamond-plus-DfSf7Xoq.js +6 -0
  505. vibe_surf/backend/frontend/assets/dice-1-CIRG2xPK.js +6 -0
  506. vibe_surf/backend/frontend/assets/dice-2-r7s36USZ.js +6 -0
  507. vibe_surf/backend/frontend/assets/dice-3-Cl7FLe3x.js +6 -0
  508. vibe_surf/backend/frontend/assets/dice-4-D-yJWiku.js +6 -0
  509. vibe_surf/backend/frontend/assets/dice-5-Ci09NYyS.js +6 -0
  510. vibe_surf/backend/frontend/assets/dice-6-CC2FLvLo.js +6 -0
  511. vibe_surf/backend/frontend/assets/dices-CmB6hNUU.js +6 -0
  512. vibe_surf/backend/frontend/assets/diff-oCWjvY-c.js +6 -0
  513. vibe_surf/backend/frontend/assets/disc-2-DpUl7fl6.js +6 -0
  514. vibe_surf/backend/frontend/assets/disc-3-BugUAszu.js +6 -0
  515. vibe_surf/backend/frontend/assets/disc-DUbtGdHe.js +6 -0
  516. vibe_surf/backend/frontend/assets/disc-album-CXJRMctz.js +6 -0
  517. vibe_surf/backend/frontend/assets/divide-CY1K-HT7.js +6 -0
  518. vibe_surf/backend/frontend/assets/dna-CeE8ObeE.js +6 -0
  519. vibe_surf/backend/frontend/assets/dna-off-BviJKT3C.js +6 -0
  520. vibe_surf/backend/frontend/assets/dock-eIe8zGWk.js +6 -0
  521. vibe_surf/backend/frontend/assets/dog-CSlDDqxp.js +6 -0
  522. vibe_surf/backend/frontend/assets/dollar-sign-5U68U397.js +6 -0
  523. vibe_surf/backend/frontend/assets/donut-BeawTrlI.js +6 -0
  524. vibe_surf/backend/frontend/assets/door-closed-CwY8Mg15.js +6 -0
  525. vibe_surf/backend/frontend/assets/door-open-DFgi7N5B.js +6 -0
  526. vibe_surf/backend/frontend/assets/dot-fPF_etdO.js +6 -0
  527. vibe_surf/backend/frontend/assets/download-gSwRRqnX.js +6 -0
  528. vibe_surf/backend/frontend/assets/drafting-compass-Dj_7EFRc.js +6 -0
  529. vibe_surf/backend/frontend/assets/drama-BlDJuZEs.js +6 -0
  530. vibe_surf/backend/frontend/assets/dribbble-C0k3dpAi.js +6 -0
  531. vibe_surf/backend/frontend/assets/drill-COJcLBB4.js +6 -0
  532. vibe_surf/backend/frontend/assets/droplet-5wuLGLgZ.js +6 -0
  533. vibe_surf/backend/frontend/assets/droplet-off-Bra_6Oh9.js +6 -0
  534. vibe_surf/backend/frontend/assets/droplets-BE8PR1pM.js +6 -0
  535. vibe_surf/backend/frontend/assets/drum-DnJ1RUvq.js +6 -0
  536. vibe_surf/backend/frontend/assets/drumstick-JGiBDDwZ.js +6 -0
  537. vibe_surf/backend/frontend/assets/dumbbell-BEtc4tyd.js +6 -0
  538. vibe_surf/backend/frontend/assets/ear-DAqeJjkr.js +6 -0
  539. vibe_surf/backend/frontend/assets/ear-off-BA7gp4ie.js +6 -0
  540. vibe_surf/backend/frontend/assets/earth-CUlUl7Bp.js +6 -0
  541. vibe_surf/backend/frontend/assets/earth-lock-sl59Ywm7.js +6 -0
  542. vibe_surf/backend/frontend/assets/eclipse-DY7fC5N3.js +6 -0
  543. vibe_surf/backend/frontend/assets/egg-DxfY2UB8.js +6 -0
  544. vibe_surf/backend/frontend/assets/egg-fried-D2Eo3APu.js +6 -0
  545. vibe_surf/backend/frontend/assets/egg-off-DqYobjwG.js +6 -0
  546. vibe_surf/backend/frontend/assets/ellipsis-DgOuKLdR.js +6 -0
  547. vibe_surf/backend/frontend/assets/ellipsis-vertical--sr8F_UD.js +6 -0
  548. vibe_surf/backend/frontend/assets/equal-DS1qMZhi.js +6 -0
  549. vibe_surf/backend/frontend/assets/equal-approximately-mgMMBVF_.js +6 -0
  550. vibe_surf/backend/frontend/assets/equal-not-1Alw8lqE.js +6 -0
  551. vibe_surf/backend/frontend/assets/eraser-IStMo8nh.js +6 -0
  552. vibe_surf/backend/frontend/assets/ethernet-port-B6SRY0d8.js +6 -0
  553. vibe_surf/backend/frontend/assets/euro-S1kGUYTE.js +6 -0
  554. vibe_surf/backend/frontend/assets/expand-Cj8IQccm.js +6 -0
  555. vibe_surf/backend/frontend/assets/eye-DrnoCeKD.js +6 -0
  556. vibe_surf/backend/frontend/assets/eye-closed-B0cNIHJN.js +6 -0
  557. vibe_surf/backend/frontend/assets/eye-off-DIIh42Ws.js +6 -0
  558. vibe_surf/backend/frontend/assets/facebook-Df9Fpfnn.js +6 -0
  559. vibe_surf/backend/frontend/assets/factory-BLKvR2Z1.js +6 -0
  560. vibe_surf/backend/frontend/assets/fan-C-xRuGdo.js +6 -0
  561. vibe_surf/backend/frontend/assets/fast-forward-Bae5V83y.js +6 -0
  562. vibe_surf/backend/frontend/assets/feather-DTPfgED2.js +6 -0
  563. vibe_surf/backend/frontend/assets/fence-Mr7VQ0O9.js +6 -0
  564. vibe_surf/backend/frontend/assets/ferris-wheel-D82pDMqi.js +6 -0
  565. vibe_surf/backend/frontend/assets/figma-DBFJo9L2.js +6 -0
  566. vibe_surf/backend/frontend/assets/file-DvuZsaUg.js +6 -0
  567. vibe_surf/backend/frontend/assets/file-archive-DRtB2ivb.js +6 -0
  568. vibe_surf/backend/frontend/assets/file-audio-2-JE5iEkL9.js +6 -0
  569. vibe_surf/backend/frontend/assets/file-audio-C4RwC1BT.js +6 -0
  570. vibe_surf/backend/frontend/assets/file-axis-3d-DQSHzEo4.js +6 -0
  571. vibe_surf/backend/frontend/assets/file-badge-2-P__XKUXn.js +6 -0
  572. vibe_surf/backend/frontend/assets/file-badge-CejYglxU.js +6 -0
  573. vibe_surf/backend/frontend/assets/file-box-CgFMY7Rp.js +6 -0
  574. vibe_surf/backend/frontend/assets/file-chart-column-Bq5PyMwY.js +6 -0
  575. vibe_surf/backend/frontend/assets/file-chart-column-increasing-t_d1wCSV.js +6 -0
  576. vibe_surf/backend/frontend/assets/file-chart-line-Df6iedBR.js +6 -0
  577. vibe_surf/backend/frontend/assets/file-chart-pie-YH23adPM.js +6 -0
  578. vibe_surf/backend/frontend/assets/file-check-2-CKcRkU0L.js +6 -0
  579. vibe_surf/backend/frontend/assets/file-check-BYZznME9.js +6 -0
  580. vibe_surf/backend/frontend/assets/file-clock-8rD4-Bqt.js +6 -0
  581. vibe_surf/backend/frontend/assets/file-code-2-BjV8KhR4.js +6 -0
  582. vibe_surf/backend/frontend/assets/file-code-CXS3YUpM.js +6 -0
  583. vibe_surf/backend/frontend/assets/file-cog-GKLng0Qf.js +6 -0
  584. vibe_surf/backend/frontend/assets/file-diff-B_7HXPkJ.js +6 -0
  585. vibe_surf/backend/frontend/assets/file-digit-AtVulYi7.js +6 -0
  586. vibe_surf/backend/frontend/assets/file-down-CJIG5dHj.js +6 -0
  587. vibe_surf/backend/frontend/assets/file-heart-B8jWzdG5.js +6 -0
  588. vibe_surf/backend/frontend/assets/file-image-CXtDt3N3.js +6 -0
  589. vibe_surf/backend/frontend/assets/file-input-B-0mgcKT.js +6 -0
  590. vibe_surf/backend/frontend/assets/file-json-2-DQHJM93o.js +6 -0
  591. vibe_surf/backend/frontend/assets/file-json-BmrGDLh2.js +6 -0
  592. vibe_surf/backend/frontend/assets/file-key-2-DnpQ1dTj.js +6 -0
  593. vibe_surf/backend/frontend/assets/file-key-D3lJXveQ.js +6 -0
  594. vibe_surf/backend/frontend/assets/file-lock-2-DWdLzoF7.js +6 -0
  595. vibe_surf/backend/frontend/assets/file-lock-ZMZB3U4I.js +6 -0
  596. vibe_surf/backend/frontend/assets/file-minus-2-CsTsio0s.js +6 -0
  597. vibe_surf/backend/frontend/assets/file-minus-CtfRmVme.js +6 -0
  598. vibe_surf/backend/frontend/assets/file-music-DHhVu2aK.js +6 -0
  599. vibe_surf/backend/frontend/assets/file-output-CjQ-FMg0.js +6 -0
  600. vibe_surf/backend/frontend/assets/file-pen-C9S_u4U9.js +6 -0
  601. vibe_surf/backend/frontend/assets/file-pen-line-niZF4quE.js +6 -0
  602. vibe_surf/backend/frontend/assets/file-plus-2-DzIiS2EM.js +6 -0
  603. vibe_surf/backend/frontend/assets/file-plus-Bloe0E45.js +6 -0
  604. vibe_surf/backend/frontend/assets/file-question-BBTjP9h0.js +6 -0
  605. vibe_surf/backend/frontend/assets/file-scan-B3Bn2EZN.js +6 -0
  606. vibe_surf/backend/frontend/assets/file-search-2-DnC8d9OD.js +6 -0
  607. vibe_surf/backend/frontend/assets/file-search-DzPGZllw.js +6 -0
  608. vibe_surf/backend/frontend/assets/file-sliders-BHYXa9jQ.js +6 -0
  609. vibe_surf/backend/frontend/assets/file-spreadsheet-DvjPpK9G.js +6 -0
  610. vibe_surf/backend/frontend/assets/file-stack-yJR4id_3.js +6 -0
  611. vibe_surf/backend/frontend/assets/file-symlink-BWQBdrEp.js +6 -0
  612. vibe_surf/backend/frontend/assets/file-terminal-CvhcKgiv.js +6 -0
  613. vibe_surf/backend/frontend/assets/file-text-tuxzZhRs.js +6 -0
  614. vibe_surf/backend/frontend/assets/file-type-2-Dgantaer.js +6 -0
  615. vibe_surf/backend/frontend/assets/file-type-DfZBPqmH.js +6 -0
  616. vibe_surf/backend/frontend/assets/file-up-GXfnonbH.js +6 -0
  617. vibe_surf/backend/frontend/assets/file-user-N7Fan7ao.js +6 -0
  618. vibe_surf/backend/frontend/assets/file-video-2-B4JBmAcG.js +6 -0
  619. vibe_surf/backend/frontend/assets/file-video-Fsp8g5kU.js +6 -0
  620. vibe_surf/backend/frontend/assets/file-volume-2-Cg1A9z8S.js +6 -0
  621. vibe_surf/backend/frontend/assets/file-volume-xzVZMKW0.js +6 -0
  622. vibe_surf/backend/frontend/assets/file-warning-CS2F3Xr2.js +6 -0
  623. vibe_surf/backend/frontend/assets/file-x-2-BNUgAQH8.js +6 -0
  624. vibe_surf/backend/frontend/assets/file-x-DTK5Zfd-.js +6 -0
  625. vibe_surf/backend/frontend/assets/files-CNx4yvup.js +6 -0
  626. vibe_surf/backend/frontend/assets/film-Dec7cGCL.js +6 -0
  627. vibe_surf/backend/frontend/assets/fingerprint-B_IGMLcp.js +6 -0
  628. vibe_surf/backend/frontend/assets/fire-extinguisher-CjZilrfE.js +6 -0
  629. vibe_surf/backend/frontend/assets/fish-CXs3XpVQ.js +6 -0
  630. vibe_surf/backend/frontend/assets/fish-off-BfYutBG_.js +6 -0
  631. vibe_surf/backend/frontend/assets/fish-symbol-DFoA8GWJ.js +6 -0
  632. vibe_surf/backend/frontend/assets/flag-cx37QYSs.js +6 -0
  633. vibe_surf/backend/frontend/assets/flag-off-DyXYguA1.js +6 -0
  634. vibe_surf/backend/frontend/assets/flag-triangle-left-Dvsg9XUg.js +6 -0
  635. vibe_surf/backend/frontend/assets/flag-triangle-right-CluL18qS.js +6 -0
  636. vibe_surf/backend/frontend/assets/flame-DwjoBypP.js +6 -0
  637. vibe_surf/backend/frontend/assets/flame-kindling-DFbZUxx1.js +6 -0
  638. vibe_surf/backend/frontend/assets/flashlight-eSCrcAU_.js +6 -0
  639. vibe_surf/backend/frontend/assets/flashlight-off-C6ZnSGnv.js +6 -0
  640. vibe_surf/backend/frontend/assets/flask-conical-CqZXJFUg.js +6 -0
  641. vibe_surf/backend/frontend/assets/flask-conical-off-DLnkLxdX.js +6 -0
  642. vibe_surf/backend/frontend/assets/flask-round-Dukzlk12.js +6 -0
  643. vibe_surf/backend/frontend/assets/flip-horizontal-2-DPCHT9Se.js +6 -0
  644. vibe_surf/backend/frontend/assets/flip-horizontal-B27Zih29.js +6 -0
  645. vibe_surf/backend/frontend/assets/flip-vertical-2-BLZ7P_e7.js +6 -0
  646. vibe_surf/backend/frontend/assets/flip-vertical-BKIxHZUr.js +6 -0
  647. vibe_surf/backend/frontend/assets/flower-2-C3USolHO.js +6 -0
  648. vibe_surf/backend/frontend/assets/flower-MuZltbIo.js +6 -0
  649. vibe_surf/backend/frontend/assets/focus-42uZfpdQ.js +6 -0
  650. vibe_surf/backend/frontend/assets/fold-horizontal-Di0iHFys.js +6 -0
  651. vibe_surf/backend/frontend/assets/fold-vertical-DTaNfFgW.js +6 -0
  652. vibe_surf/backend/frontend/assets/folder-CZZJq_yO.js +6 -0
  653. vibe_surf/backend/frontend/assets/folder-archive-B9gmPXfh.js +6 -0
  654. vibe_surf/backend/frontend/assets/folder-check-D8RNiC0h.js +6 -0
  655. vibe_surf/backend/frontend/assets/folder-clock-xJeq54e5.js +6 -0
  656. vibe_surf/backend/frontend/assets/folder-closed-J_oj7irx.js +6 -0
  657. vibe_surf/backend/frontend/assets/folder-code-sdeNF88C.js +6 -0
  658. vibe_surf/backend/frontend/assets/folder-cog-DaxTyB8x.js +6 -0
  659. vibe_surf/backend/frontend/assets/folder-dot-CcddM8ht.js +6 -0
  660. vibe_surf/backend/frontend/assets/folder-down-B6ibnVRy.js +6 -0
  661. vibe_surf/backend/frontend/assets/folder-git-2-C1s592lv.js +6 -0
  662. vibe_surf/backend/frontend/assets/folder-git-DT6ZCpGc.js +6 -0
  663. vibe_surf/backend/frontend/assets/folder-heart-_fpvnFcA.js +6 -0
  664. vibe_surf/backend/frontend/assets/folder-input-OCjNnVk-.js +6 -0
  665. vibe_surf/backend/frontend/assets/folder-kanban-DgbGiYl_.js +6 -0
  666. vibe_surf/backend/frontend/assets/folder-key-6dl4vOVJ.js +6 -0
  667. vibe_surf/backend/frontend/assets/folder-lock-C0FPUNUM.js +6 -0
  668. vibe_surf/backend/frontend/assets/folder-minus-CnnUrRgx.js +6 -0
  669. vibe_surf/backend/frontend/assets/folder-open-B6qoyzo4.js +6 -0
  670. vibe_surf/backend/frontend/assets/folder-open-dot-vcn79EAq.js +6 -0
  671. vibe_surf/backend/frontend/assets/folder-output-aqyTbjq1.js +6 -0
  672. vibe_surf/backend/frontend/assets/folder-pen-DONbvY-M.js +6 -0
  673. vibe_surf/backend/frontend/assets/folder-plus-B1CMWyUH.js +6 -0
  674. vibe_surf/backend/frontend/assets/folder-root-CO03ueMD.js +6 -0
  675. vibe_surf/backend/frontend/assets/folder-search-2-vXSwPDsr.js +6 -0
  676. vibe_surf/backend/frontend/assets/folder-search-CqRRhEYi.js +6 -0
  677. vibe_surf/backend/frontend/assets/folder-symlink-CyG26ZIM.js +6 -0
  678. vibe_surf/backend/frontend/assets/folder-sync-D7kc3Qv9.js +6 -0
  679. vibe_surf/backend/frontend/assets/folder-tree-B_kJAFgg.js +6 -0
  680. vibe_surf/backend/frontend/assets/folder-up-CPWWXuBL.js +6 -0
  681. vibe_surf/backend/frontend/assets/folder-x-BgWBu65a.js +6 -0
  682. vibe_surf/backend/frontend/assets/folders-BqIxqB0_.js +6 -0
  683. vibe_surf/backend/frontend/assets/footprints-U_DOce2V.js +6 -0
  684. vibe_surf/backend/frontend/assets/forklift-HwzIz7aw.js +6 -0
  685. vibe_surf/backend/frontend/assets/forward-DjYLGiCR.js +6 -0
  686. vibe_surf/backend/frontend/assets/frame-poMkf2ta.js +6 -0
  687. vibe_surf/backend/frontend/assets/framer-DNQvf86-.js +6 -0
  688. vibe_surf/backend/frontend/assets/frown-BnHOvtLa.js +6 -0
  689. vibe_surf/backend/frontend/assets/fuel-Cm_lHCJg.js +6 -0
  690. vibe_surf/backend/frontend/assets/fullscreen-COEG0zVc.js +6 -0
  691. vibe_surf/backend/frontend/assets/funnel-BKREn55d.js +6 -0
  692. vibe_surf/backend/frontend/assets/funnel-plus-B1RbFoZ4.js +6 -0
  693. vibe_surf/backend/frontend/assets/funnel-x-z3lufNFJ.js +6 -0
  694. vibe_surf/backend/frontend/assets/gallery-horizontal-CZQKmb1v.js +6 -0
  695. vibe_surf/backend/frontend/assets/gallery-horizontal-end-rt0pNZmd.js +6 -0
  696. vibe_surf/backend/frontend/assets/gallery-thumbnails-BawPOO5E.js +6 -0
  697. vibe_surf/backend/frontend/assets/gallery-vertical-DHlqWz-O.js +6 -0
  698. vibe_surf/backend/frontend/assets/gallery-vertical-end-1UBU5tP0.js +6 -0
  699. vibe_surf/backend/frontend/assets/gamepad-2-CGlBaPJy.js +6 -0
  700. vibe_surf/backend/frontend/assets/gamepad-B7EN8TXy.js +6 -0
  701. vibe_surf/backend/frontend/assets/gauge-CkJyJpYu.js +6 -0
  702. vibe_surf/backend/frontend/assets/gavel-BXOFsfyc.js +6 -0
  703. vibe_surf/backend/frontend/assets/gem-DJaoJhpp.js +6 -0
  704. vibe_surf/backend/frontend/assets/ghost-5jDlD5mv.js +6 -0
  705. vibe_surf/backend/frontend/assets/gift-DTuN9n1d.js +6 -0
  706. vibe_surf/backend/frontend/assets/git-branch-CAxiUjEF.js +6 -0
  707. vibe_surf/backend/frontend/assets/git-branch-plus-BcouIUD3.js +6 -0
  708. vibe_surf/backend/frontend/assets/git-commit-horizontal-DqOnbX0A.js +6 -0
  709. vibe_surf/backend/frontend/assets/git-commit-vertical-DEAmtVm7.js +6 -0
  710. vibe_surf/backend/frontend/assets/git-compare-8F4A8hf8.js +6 -0
  711. vibe_surf/backend/frontend/assets/git-compare-arrows-BCgbMQBd.js +6 -0
  712. vibe_surf/backend/frontend/assets/git-fork-UmnYpjac.js +6 -0
  713. vibe_surf/backend/frontend/assets/git-graph-MIRVcG3s.js +6 -0
  714. vibe_surf/backend/frontend/assets/git-merge-1ccPZB0a.js +6 -0
  715. vibe_surf/backend/frontend/assets/git-pull-request-BAmJjoSf.js +6 -0
  716. vibe_surf/backend/frontend/assets/git-pull-request-arrow-hDbG9s0T.js +6 -0
  717. vibe_surf/backend/frontend/assets/git-pull-request-closed-DZVF4_75.js +6 -0
  718. vibe_surf/backend/frontend/assets/git-pull-request-create-B_ikGAua.js +6 -0
  719. vibe_surf/backend/frontend/assets/git-pull-request-create-arrow-OlDcvuiA.js +6 -0
  720. vibe_surf/backend/frontend/assets/git-pull-request-draft-CfvzgQz4.js +6 -0
  721. vibe_surf/backend/frontend/assets/github-DlTWmBTt.js +6 -0
  722. vibe_surf/backend/frontend/assets/gitlab-DquWeR50.js +6 -0
  723. vibe_surf/backend/frontend/assets/glass-water-yuqxiPgK.js +6 -0
  724. vibe_surf/backend/frontend/assets/glasses-DPTQtusr.js +6 -0
  725. vibe_surf/backend/frontend/assets/globe-D1X1kv-g.js +6 -0
  726. vibe_surf/backend/frontend/assets/globe-lock-miWknHfI.js +6 -0
  727. vibe_surf/backend/frontend/assets/goal-BY1nb-LN.js +6 -0
  728. vibe_surf/backend/frontend/assets/grab-CnmpLOMH.js +6 -0
  729. vibe_surf/backend/frontend/assets/graduation-cap-CcH89wnV.js +6 -0
  730. vibe_surf/backend/frontend/assets/grape-CIiMFgS_.js +6 -0
  731. vibe_surf/backend/frontend/assets/grid-2x2-DyXR6Owe.js +6 -0
  732. vibe_surf/backend/frontend/assets/grid-2x2-check-D2GIuWpl.js +6 -0
  733. vibe_surf/backend/frontend/assets/grid-2x2-plus-D89B7CNh.js +6 -0
  734. vibe_surf/backend/frontend/assets/grid-2x2-x-CMeekq27.js +6 -0
  735. vibe_surf/backend/frontend/assets/grid-3x3-qKjElxaz.js +6 -0
  736. vibe_surf/backend/frontend/assets/grip--SsS48b-.js +6 -0
  737. vibe_surf/backend/frontend/assets/grip-horizontal-DapWkFjo.js +6 -0
  738. vibe_surf/backend/frontend/assets/grip-vertical-vn3rXQIt.js +6 -0
  739. vibe_surf/backend/frontend/assets/group-XhzCMXdw.js +6 -0
  740. vibe_surf/backend/frontend/assets/guitar-But8OLt2.js +6 -0
  741. vibe_surf/backend/frontend/assets/ham-_9G65W_I.js +6 -0
  742. vibe_surf/backend/frontend/assets/hammer-C2AZqVnX.js +6 -0
  743. vibe_surf/backend/frontend/assets/hand-DXuxSiOo.js +6 -0
  744. vibe_surf/backend/frontend/assets/hand-coins-mma7__lh.js +6 -0
  745. vibe_surf/backend/frontend/assets/hand-heart-DNtq1bnS.js +6 -0
  746. vibe_surf/backend/frontend/assets/hand-helping-Cdw7lKNu.js +6 -0
  747. vibe_surf/backend/frontend/assets/hand-metal-CcoWdRUV.js +6 -0
  748. vibe_surf/backend/frontend/assets/hand-platter-DoQTVTFx.js +6 -0
  749. vibe_surf/backend/frontend/assets/handshake-CJyspjIU.js +6 -0
  750. vibe_surf/backend/frontend/assets/hard-drive-ZduQuJtY.js +6 -0
  751. vibe_surf/backend/frontend/assets/hard-drive-download-D_hUh11c.js +6 -0
  752. vibe_surf/backend/frontend/assets/hard-drive-upload-BBPLIyZo.js +6 -0
  753. vibe_surf/backend/frontend/assets/hard-hat-OlmGevRI.js +6 -0
  754. vibe_surf/backend/frontend/assets/hash-COjLjaYu.js +6 -0
  755. vibe_surf/backend/frontend/assets/haze-Vf7OsAWn.js +6 -0
  756. vibe_surf/backend/frontend/assets/hdmi-port-B3C9bYX1.js +6 -0
  757. vibe_surf/backend/frontend/assets/heading-1-Dyyb72R2.js +6 -0
  758. vibe_surf/backend/frontend/assets/heading-2-ClF7vOi5.js +6 -0
  759. vibe_surf/backend/frontend/assets/heading-3-DPRazJfc.js +6 -0
  760. vibe_surf/backend/frontend/assets/heading-4-3e6Zii5g.js +6 -0
  761. vibe_surf/backend/frontend/assets/heading-5-GEVsfo30.js +6 -0
  762. vibe_surf/backend/frontend/assets/heading-6-CtX8dWYy.js +6 -0
  763. vibe_surf/backend/frontend/assets/heading-C_c5dBtC.js +6 -0
  764. vibe_surf/backend/frontend/assets/headphone-off-VkuNIw42.js +6 -0
  765. vibe_surf/backend/frontend/assets/headphones-BdMKOmhg.js +6 -0
  766. vibe_surf/backend/frontend/assets/headset-CGOllUmf.js +6 -0
  767. vibe_surf/backend/frontend/assets/heart-J_dfRIZ7.js +6 -0
  768. vibe_surf/backend/frontend/assets/heart-crack-BDNXXAjd.js +6 -0
  769. vibe_surf/backend/frontend/assets/heart-handshake-BhQLIVaj.js +6 -0
  770. vibe_surf/backend/frontend/assets/heart-minus-Dgexi3zQ.js +6 -0
  771. vibe_surf/backend/frontend/assets/heart-off-DF68jDRm.js +6 -0
  772. vibe_surf/backend/frontend/assets/heart-plus-D3LX6R_l.js +6 -0
  773. vibe_surf/backend/frontend/assets/heart-pulse-DnwkpqSJ.js +6 -0
  774. vibe_surf/backend/frontend/assets/heater-Bilq_TPS.js +6 -0
  775. vibe_surf/backend/frontend/assets/hexagon-BEvfIIaV.js +6 -0
  776. vibe_surf/backend/frontend/assets/highlighter-CNa8UVQD.js +6 -0
  777. vibe_surf/backend/frontend/assets/history-BggOc8wP.js +6 -0
  778. vibe_surf/backend/frontend/assets/hop-BCUHAdeR.js +6 -0
  779. vibe_surf/backend/frontend/assets/hop-off-B5f9Fr80.js +6 -0
  780. vibe_surf/backend/frontend/assets/hospital-Dk0tqXu9.js +6 -0
  781. vibe_surf/backend/frontend/assets/hotel-CXl-yW7B.js +6 -0
  782. vibe_surf/backend/frontend/assets/hourglass-DSRXQwTc.js +6 -0
  783. vibe_surf/backend/frontend/assets/house-Bhp2WF4v.js +6 -0
  784. vibe_surf/backend/frontend/assets/house-plug-DXm5j2Xq.js +6 -0
  785. vibe_surf/backend/frontend/assets/house-plus-KMp_x4hA.js +6 -0
  786. vibe_surf/backend/frontend/assets/house-wifi-Ccrar5-8.js +6 -0
  787. vibe_surf/backend/frontend/assets/ice-cream-bowl-j3qet3-o.js +6 -0
  788. vibe_surf/backend/frontend/assets/ice-cream-cone-XtpMBOSu.js +6 -0
  789. vibe_surf/backend/frontend/assets/id-card-BqzQOrR_.js +6 -0
  790. vibe_surf/backend/frontend/assets/image-B3lEwdvu.js +6 -0
  791. vibe_surf/backend/frontend/assets/image-down-sVdzbwfm.js +6 -0
  792. vibe_surf/backend/frontend/assets/image-minus-BdddBiyu.js +6 -0
  793. vibe_surf/backend/frontend/assets/image-off-CCZ9kVWH.js +6 -0
  794. vibe_surf/backend/frontend/assets/image-play-LNuKchCO.js +6 -0
  795. vibe_surf/backend/frontend/assets/image-plus-B4GTKJ6Z.js +6 -0
  796. vibe_surf/backend/frontend/assets/image-up-BfxmsdpY.js +6 -0
  797. vibe_surf/backend/frontend/assets/image-upscale-CexWZ50d.js +6 -0
  798. vibe_surf/backend/frontend/assets/images-C8Wp1eOg.js +6 -0
  799. vibe_surf/backend/frontend/assets/import-ec27SWYy.js +6 -0
  800. vibe_surf/backend/frontend/assets/inbox-YvwvpFKi.js +6 -0
  801. vibe_surf/backend/frontend/assets/indent-decrease-Dp0BVsoQ.js +6 -0
  802. vibe_surf/backend/frontend/assets/indent-increase-D3BuYj2n.js +6 -0
  803. vibe_surf/backend/frontend/assets/index-2CcQW4OZ.js +13 -0
  804. vibe_surf/backend/frontend/assets/index-4vq5awkV.js +1 -0
  805. vibe_surf/backend/frontend/assets/index-5ZZlgfo-.js +1 -0
  806. vibe_surf/backend/frontend/assets/index-6dxAUV6Y.js +1 -0
  807. vibe_surf/backend/frontend/assets/index-AzcZQWVx.js +2723 -0
  808. vibe_surf/backend/frontend/assets/index-B-IDFsd0.js +1 -0
  809. vibe_surf/backend/frontend/assets/index-B-ohDVDe.js +1 -0
  810. vibe_surf/backend/frontend/assets/index-B1Q4y1qa.js +1 -0
  811. vibe_surf/backend/frontend/assets/index-B1SY6fah.js +1 -0
  812. vibe_surf/backend/frontend/assets/index-B2ljcLYu.js +1 -0
  813. vibe_surf/backend/frontend/assets/index-B4-H1yfm.js +108 -0
  814. vibe_surf/backend/frontend/assets/index-B6MKztQU.js +1 -0
  815. vibe_surf/backend/frontend/assets/index-B7i2Q-3O.js +1 -0
  816. vibe_surf/backend/frontend/assets/index-B9Wx-Ii0.js +1 -0
  817. vibe_surf/backend/frontend/assets/index-BFzpTaXY.js +1 -0
  818. vibe_surf/backend/frontend/assets/index-BIBNbmyC.js +1 -0
  819. vibe_surf/backend/frontend/assets/index-BL_hoToU.js +1 -0
  820. vibe_surf/backend/frontend/assets/index-BOeI-zQ9.js +1 -0
  821. vibe_surf/backend/frontend/assets/index-BPEpFAuc.js +1 -0
  822. vibe_surf/backend/frontend/assets/index-BQ1eB4fC.js +1 -0
  823. vibe_surf/backend/frontend/assets/index-BQ2H2d3f.js +1 -0
  824. vibe_surf/backend/frontend/assets/index-BR-8IPV4.js +205 -0
  825. vibe_surf/backend/frontend/assets/index-BV8ArFsA.js +1 -0
  826. vibe_surf/backend/frontend/assets/index-BWwASCq5.js +1 -0
  827. vibe_surf/backend/frontend/assets/index-BWwglY3I.js +1 -0
  828. vibe_surf/backend/frontend/assets/index-B_Qz_foX.js +1 -0
  829. vibe_surf/backend/frontend/assets/index-BaoW7GZH.js +1 -0
  830. vibe_surf/backend/frontend/assets/index-BcrHz-y8.js +1 -0
  831. vibe_surf/backend/frontend/assets/index-BdSzkc1f.js +20 -0
  832. vibe_surf/backend/frontend/assets/index-BeLkvqxv.js +1 -0
  833. vibe_surf/backend/frontend/assets/index-Beq_etUM.js +1 -0
  834. vibe_surf/backend/frontend/assets/index-BgzQso9y.js +1 -0
  835. vibe_surf/backend/frontend/assets/index-BiNrEY13.js +1 -0
  836. vibe_surf/backend/frontend/assets/index-Bja3ZEZo.js +1 -0
  837. vibe_surf/backend/frontend/assets/index-BmcD7XCM.js +1 -0
  838. vibe_surf/backend/frontend/assets/index-BmnwJzsA.js +1 -0
  839. vibe_surf/backend/frontend/assets/index-BssAenIo.js +1 -0
  840. vibe_surf/backend/frontend/assets/index-BvEZ1ywS.js +1 -0
  841. vibe_surf/backend/frontend/assets/index-BwO1owi8.js +1 -0
  842. vibe_surf/backend/frontend/assets/index-BwXsJbuu.js +21 -0
  843. vibe_surf/backend/frontend/assets/index-BwlG2DdK.js +1 -0
  844. vibe_surf/backend/frontend/assets/index-BzjC6B6I.js +1 -0
  845. vibe_surf/backend/frontend/assets/index-C0BOag_5.js +1 -0
  846. vibe_surf/backend/frontend/assets/index-C0EsaEHC.js +1 -0
  847. vibe_surf/backend/frontend/assets/index-C0IGIaTE.js +1 -0
  848. vibe_surf/backend/frontend/assets/index-C0IdY_9F.js +1 -0
  849. vibe_surf/backend/frontend/assets/index-C1DABLwl.js +1 -0
  850. vibe_surf/backend/frontend/assets/index-C1JE4AZB.js +1 -0
  851. vibe_surf/backend/frontend/assets/index-C1Rkl2Ur.js +1 -0
  852. vibe_surf/backend/frontend/assets/index-C2YWu5t8.js +1 -0
  853. vibe_surf/backend/frontend/assets/index-C2_4AcrM.js +1 -0
  854. vibe_surf/backend/frontend/assets/index-C48IE5LT.js +1 -0
  855. vibe_surf/backend/frontend/assets/index-C4JqQnzd.js +1 -0
  856. vibe_surf/backend/frontend/assets/index-C5QqjjEO.js +1 -0
  857. vibe_surf/backend/frontend/assets/index-C6ZyrgxW.js +1 -0
  858. vibe_surf/backend/frontend/assets/index-C9n9R8Ob.js +1 -0
  859. vibe_surf/backend/frontend/assets/index-CATPt8gz.js +1 -0
  860. vibe_surf/backend/frontend/assets/index-CAc6KlCl.js +1 -0
  861. vibe_surf/backend/frontend/assets/index-CAeE91z_.js +1 -0
  862. vibe_surf/backend/frontend/assets/index-CBLrD5S8.js +1 -0
  863. vibe_surf/backend/frontend/assets/index-CEx7_efn.js +1 -0
  864. vibe_surf/backend/frontend/assets/index-CGNwvjd6.js +1 -0
  865. vibe_surf/backend/frontend/assets/index-CJIkyYuu.js +1 -0
  866. vibe_surf/backend/frontend/assets/index-CL8YNknR.js +1 -0
  867. vibe_surf/backend/frontend/assets/index-CQ4c4zmh.js +1 -0
  868. vibe_surf/backend/frontend/assets/index-CSKpbeRU.js +1 -0
  869. vibe_surf/backend/frontend/assets/index-CTJUto70.js +1 -0
  870. vibe_surf/backend/frontend/assets/index-CUm8t_3-.js +1 -0
  871. vibe_surf/backend/frontend/assets/index-CWaG8YQf.js +1 -0
  872. vibe_surf/backend/frontend/assets/index-CWqCL2_S.js +1 -0
  873. vibe_surf/backend/frontend/assets/index-CZKjLvxC.js +1 -0
  874. vibe_surf/backend/frontend/assets/index-C_a_gjJ3.js +7382 -0
  875. vibe_surf/backend/frontend/assets/index-C_gjztJA.js +1 -0
  876. vibe_surf/backend/frontend/assets/index-Cd394DZ3.js +1 -0
  877. vibe_surf/backend/frontend/assets/index-Ch_ENQTO.js +1 -0
  878. vibe_surf/backend/frontend/assets/index-CjDauRtw.js +1 -0
  879. vibe_surf/backend/frontend/assets/index-Cjsyudia.js +1 -0
  880. vibe_surf/backend/frontend/assets/index-Ck0Rk7OE.js +1 -0
  881. vibe_surf/backend/frontend/assets/index-Ct1jT_zG.js +1 -0
  882. vibe_surf/backend/frontend/assets/index-CtZOHuJR.js +1 -0
  883. vibe_surf/backend/frontend/assets/index-CwylYZIy.js +1 -0
  884. vibe_surf/backend/frontend/assets/index-CxGAIJCD.js +1 -0
  885. vibe_surf/backend/frontend/assets/index-D-6VXnmQ.js +1 -0
  886. vibe_surf/backend/frontend/assets/index-D-_pq5D8.js +1 -0
  887. vibe_surf/backend/frontend/assets/index-D-oTsuqV.js +1 -0
  888. vibe_surf/backend/frontend/assets/index-D8iHrvl3.js +1 -0
  889. vibe_surf/backend/frontend/assets/index-DDYB0tod.js +1 -0
  890. vibe_surf/backend/frontend/assets/index-DDtHdtyM.js +1 -0
  891. vibe_surf/backend/frontend/assets/index-DH3R0iod.js +1 -0
  892. vibe_surf/backend/frontend/assets/index-DJAmqieX.js +1 -0
  893. vibe_surf/backend/frontend/assets/index-DJYhOcBD.js +1 -0
  894. vibe_surf/backend/frontend/assets/index-DQKxDe4Q.js +1 -0
  895. vibe_surf/backend/frontend/assets/index-DS9glxiF.js +1 -0
  896. vibe_surf/backend/frontend/assets/index-DUjF6qus.js +2 -0
  897. vibe_surf/backend/frontend/assets/index-DXYmUzC_.css +1 -0
  898. vibe_surf/backend/frontend/assets/index-D_wRbh5r.js +1 -0
  899. vibe_surf/backend/frontend/assets/index-Db4BfmcT.js +1 -0
  900. vibe_surf/backend/frontend/assets/index-DfZGZYcK.js +1 -0
  901. vibe_surf/backend/frontend/assets/index-DlDGYPf2.js +1 -0
  902. vibe_surf/backend/frontend/assets/index-DlFy5Gok.js +1 -0
  903. vibe_surf/backend/frontend/assets/index-DmVpDlko.js +1 -0
  904. vibe_surf/backend/frontend/assets/index-Dpc9wHta.js +1 -0
  905. vibe_surf/backend/frontend/assets/index-DvcAIETO.js +1 -0
  906. vibe_surf/backend/frontend/assets/index-Dwi-X1Od.js +1 -0
  907. vibe_surf/backend/frontend/assets/index-FMPFv3Wf.js +1 -0
  908. vibe_surf/backend/frontend/assets/index-H3Uskc2o.js +1 -0
  909. vibe_surf/backend/frontend/assets/index-JWfrTs_0.js +1 -0
  910. vibe_surf/backend/frontend/assets/index-LX3KOMfj.js +1 -0
  911. vibe_surf/backend/frontend/assets/index-LXWgTVf4.js +1 -0
  912. vibe_surf/backend/frontend/assets/index-WJ6PviAq.js +1 -0
  913. vibe_surf/backend/frontend/assets/index-WrqFIXAC.js +1 -0
  914. vibe_surf/backend/frontend/assets/index-Yoj1a8xs.js +1 -0
  915. vibe_surf/backend/frontend/assets/index-YxTPhodS.js +1 -0
  916. vibe_surf/backend/frontend/assets/index-_8LB3oNa.js +1 -0
  917. vibe_surf/backend/frontend/assets/index-bNhROe-x.js +1 -0
  918. vibe_surf/backend/frontend/assets/index-cQAtXO5d.js +1 -0
  919. vibe_surf/backend/frontend/assets/index-hIdlDvEv.js +1 -0
  920. vibe_surf/backend/frontend/assets/index-hxJwU1-s.js +1 -0
  921. vibe_surf/backend/frontend/assets/index-iA_X3O5r.js +1 -0
  922. vibe_surf/backend/frontend/assets/index-iW93REva.js +1 -0
  923. vibe_surf/backend/frontend/assets/index-k2RdCBHb.js +1 -0
  924. vibe_surf/backend/frontend/assets/index-kJKg9EzG.js +1 -0
  925. vibe_surf/backend/frontend/assets/index-mX6ATl2n.js +1 -0
  926. vibe_surf/backend/frontend/assets/index-muCxPdjC.js +1 -0
  927. vibe_surf/backend/frontend/assets/index-nd1f74Wi.js +1 -0
  928. vibe_surf/backend/frontend/assets/index-qGbEX4n3.js +1 -0
  929. vibe_surf/backend/frontend/assets/index-qOd-CLaR.js +1 -0
  930. vibe_surf/backend/frontend/assets/index-sguRseYw.js +1 -0
  931. vibe_surf/backend/frontend/assets/index-vd7ILFrg.js +1 -0
  932. vibe_surf/backend/frontend/assets/index-we6mCAhv.js +1 -0
  933. vibe_surf/backend/frontend/assets/index-x0VA7yzX.js +1 -0
  934. vibe_surf/backend/frontend/assets/index-yCVeNkNd.js +1 -0
  935. vibe_surf/backend/frontend/assets/indian-rupee-ClaZI0Dh.js +6 -0
  936. vibe_surf/backend/frontend/assets/infinity-LKjcIaZa.js +6 -0
  937. vibe_surf/backend/frontend/assets/info-DFBdB7_c.js +6 -0
  938. vibe_surf/backend/frontend/assets/inspection-panel-DGzE6245.js +6 -0
  939. vibe_surf/backend/frontend/assets/instagram-CJj5AWOV.js +6 -0
  940. vibe_surf/backend/frontend/assets/italic-CKFB3the.js +6 -0
  941. vibe_surf/backend/frontend/assets/iteration-ccw-YnfylsKm.js +6 -0
  942. vibe_surf/backend/frontend/assets/iteration-cw-DTHRwCcy.js +6 -0
  943. vibe_surf/backend/frontend/assets/japanese-yen-BG_Inyh_.js +6 -0
  944. vibe_surf/backend/frontend/assets/joystick-bJVSvZlL.js +6 -0
  945. vibe_surf/backend/frontend/assets/kanban-KP-K8pC9.js +6 -0
  946. vibe_surf/backend/frontend/assets/key-CNaiqe5q.js +6 -0
  947. vibe_surf/backend/frontend/assets/key-round-RTYFDTCa.js +6 -0
  948. vibe_surf/backend/frontend/assets/key-square-C7EKR-zE.js +6 -0
  949. vibe_surf/backend/frontend/assets/keyboard-DaM0Dl19.js +6 -0
  950. vibe_surf/backend/frontend/assets/keyboard-music-CzJZiHzS.js +6 -0
  951. vibe_surf/backend/frontend/assets/keyboard-off-C9Jl7GZs.js +6 -0
  952. vibe_surf/backend/frontend/assets/lamp-DK_3DJnO.js +6 -0
  953. vibe_surf/backend/frontend/assets/lamp-ceiling-B8sGjZ8c.js +6 -0
  954. vibe_surf/backend/frontend/assets/lamp-desk-CxWpiNas.js +6 -0
  955. vibe_surf/backend/frontend/assets/lamp-floor-EUFzRKf7.js +6 -0
  956. vibe_surf/backend/frontend/assets/lamp-wall-down-BV84JTWM.js +6 -0
  957. vibe_surf/backend/frontend/assets/lamp-wall-up-BqpaYZN9.js +6 -0
  958. vibe_surf/backend/frontend/assets/land-plot-Dly_Debw.js +6 -0
  959. vibe_surf/backend/frontend/assets/landmark-W6MewilS.js +6 -0
  960. vibe_surf/backend/frontend/assets/languages-BQghN4Gu.js +6 -0
  961. vibe_surf/backend/frontend/assets/laptop-BysYcdO1.js +6 -0
  962. vibe_surf/backend/frontend/assets/laptop-minimal-CUViKl_u.js +6 -0
  963. vibe_surf/backend/frontend/assets/laptop-minimal-check-BZNY8l54.js +6 -0
  964. vibe_surf/backend/frontend/assets/lasso-CBTyEbGH.js +6 -0
  965. vibe_surf/backend/frontend/assets/lasso-select-D9j71vtb.js +6 -0
  966. vibe_surf/backend/frontend/assets/laugh-fkxJEAC6.js +6 -0
  967. vibe_surf/backend/frontend/assets/layers-2-B3mnroGJ.js +6 -0
  968. vibe_surf/backend/frontend/assets/layers-CLO8Qj7V.js +6 -0
  969. vibe_surf/backend/frontend/assets/layout-dashboard-BCgC4-j3.js +6 -0
  970. vibe_surf/backend/frontend/assets/layout-grid-DQlh6Dv5.js +6 -0
  971. vibe_surf/backend/frontend/assets/layout-list-BK2Y57B-.js +6 -0
  972. vibe_surf/backend/frontend/assets/layout-panel-left-BzdjKizu.js +6 -0
  973. vibe_surf/backend/frontend/assets/layout-panel-top-CmMnqmez.js +6 -0
  974. vibe_surf/backend/frontend/assets/layout-template-DkuzhO5B.js +6 -0
  975. vibe_surf/backend/frontend/assets/lazyIconImports-Cbxc-ykm.js +2 -0
  976. vibe_surf/backend/frontend/assets/leaf-D1Z4WxA8.js +6 -0
  977. vibe_surf/backend/frontend/assets/leafy-green-C7IHTNVi.js +6 -0
  978. vibe_surf/backend/frontend/assets/lectern-BpswhiFV.js +6 -0
  979. vibe_surf/backend/frontend/assets/letter-text-B_mZgzJ7.js +6 -0
  980. vibe_surf/backend/frontend/assets/library-BEQ0EBja.js +6 -0
  981. vibe_surf/backend/frontend/assets/library-big-C32jLDwT.js +6 -0
  982. vibe_surf/backend/frontend/assets/life-buoy-AWdXr4CQ.js +6 -0
  983. vibe_surf/backend/frontend/assets/ligature-DRsGqV7j.js +6 -0
  984. vibe_surf/backend/frontend/assets/lightbulb-D3KZbCQp.js +6 -0
  985. vibe_surf/backend/frontend/assets/lightbulb-off-iSDmy8d6.js +6 -0
  986. vibe_surf/backend/frontend/assets/link-2-CCZYGxDI.js +6 -0
  987. vibe_surf/backend/frontend/assets/link-2-off-BWpEKUCS.js +6 -0
  988. vibe_surf/backend/frontend/assets/link-Diw-YZ8t.js +6 -0
  989. vibe_surf/backend/frontend/assets/linkedin-CExn9EK5.js +6 -0
  990. vibe_surf/backend/frontend/assets/list-CB9zDbEv.js +6 -0
  991. vibe_surf/backend/frontend/assets/list-check-CCdijvLD.js +6 -0
  992. vibe_surf/backend/frontend/assets/list-checks-B1EQ8oeV.js +6 -0
  993. vibe_surf/backend/frontend/assets/list-collapse-B_Nyhn3U.js +6 -0
  994. vibe_surf/backend/frontend/assets/list-end-BRGFPR4T.js +6 -0
  995. vibe_surf/backend/frontend/assets/list-filter-DR4JqPVX.js +6 -0
  996. vibe_surf/backend/frontend/assets/list-filter-plus-Q7j2JYzP.js +6 -0
  997. vibe_surf/backend/frontend/assets/list-minus-DrLtfmEG.js +6 -0
  998. vibe_surf/backend/frontend/assets/list-music-C6MOQHoL.js +6 -0
  999. vibe_surf/backend/frontend/assets/list-ordered-Db8L0lqU.js +6 -0
  1000. vibe_surf/backend/frontend/assets/list-plus-C1dade1Z.js +6 -0
  1001. vibe_surf/backend/frontend/assets/list-restart-CyRkF6Xo.js +6 -0
  1002. vibe_surf/backend/frontend/assets/list-start-CAn16QHF.js +6 -0
  1003. vibe_surf/backend/frontend/assets/list-todo-giJ3EaBY.js +6 -0
  1004. vibe_surf/backend/frontend/assets/list-tree-ZTTp4tz8.js +6 -0
  1005. vibe_surf/backend/frontend/assets/list-video-SNqnTTmu.js +6 -0
  1006. vibe_surf/backend/frontend/assets/list-x-XeDairuR.js +6 -0
  1007. vibe_surf/backend/frontend/assets/loader-RYX0GikH.js +6 -0
  1008. vibe_surf/backend/frontend/assets/loader-circle-CjMVhyrE.js +6 -0
  1009. vibe_surf/backend/frontend/assets/loader-pinwheel-Dv08mzUX.js +6 -0
  1010. vibe_surf/backend/frontend/assets/locate-DcqAXVyu.js +6 -0
  1011. vibe_surf/backend/frontend/assets/locate-fixed-BgaqK3FM.js +6 -0
  1012. vibe_surf/backend/frontend/assets/locate-off-1UN8A6fK.js +6 -0
  1013. vibe_surf/backend/frontend/assets/location-edit-DFbMZW6i.js +6 -0
  1014. vibe_surf/backend/frontend/assets/lock-DWN4LH3Q.js +6 -0
  1015. vibe_surf/backend/frontend/assets/lock-keyhole-aeS26SmF.js +6 -0
  1016. vibe_surf/backend/frontend/assets/lock-keyhole-open-CoXzZLpr.js +6 -0
  1017. vibe_surf/backend/frontend/assets/lock-open-CBPubokC.js +6 -0
  1018. vibe_surf/backend/frontend/assets/log-in-BW8pmSIu.js +6 -0
  1019. vibe_surf/backend/frontend/assets/log-out-D-d0DczA.js +6 -0
  1020. vibe_surf/backend/frontend/assets/logo_dark-_nccwgMn.png +0 -0
  1021. vibe_surf/backend/frontend/assets/logo_light-DKZjS8CD.png +0 -0
  1022. vibe_surf/backend/frontend/assets/logs-AXuVwIE_.js +6 -0
  1023. vibe_surf/backend/frontend/assets/lollipop-CxugcHkj.js +6 -0
  1024. vibe_surf/backend/frontend/assets/luggage-CFtS088O.js +6 -0
  1025. vibe_surf/backend/frontend/assets/magnet-BpIqKX0D.js +6 -0
  1026. vibe_surf/backend/frontend/assets/mail-1Br8NAMK.js +6 -0
  1027. vibe_surf/backend/frontend/assets/mail-check-DFwD0fvI.js +6 -0
  1028. vibe_surf/backend/frontend/assets/mail-minus-B_KovqmT.js +6 -0
  1029. vibe_surf/backend/frontend/assets/mail-open-VEmMVybi.js +6 -0
  1030. vibe_surf/backend/frontend/assets/mail-plus-D-1Wacj7.js +6 -0
  1031. vibe_surf/backend/frontend/assets/mail-question-CJK96wre.js +6 -0
  1032. vibe_surf/backend/frontend/assets/mail-search-Du6F72Wj.js +6 -0
  1033. vibe_surf/backend/frontend/assets/mail-warning-BI87_kvG.js +6 -0
  1034. vibe_surf/backend/frontend/assets/mail-x-DU415vbZ.js +6 -0
  1035. vibe_surf/backend/frontend/assets/mailbox-CMHDAMVZ.js +6 -0
  1036. vibe_surf/backend/frontend/assets/mails-CUDj41Cn.js +6 -0
  1037. vibe_surf/backend/frontend/assets/map-D2I0g3OZ.js +6 -0
  1038. vibe_surf/backend/frontend/assets/map-pin-CiM6iB2r.js +6 -0
  1039. vibe_surf/backend/frontend/assets/map-pin-check-BQWCC6Uv.js +6 -0
  1040. vibe_surf/backend/frontend/assets/map-pin-check-inside-CVhhgPHY.js +6 -0
  1041. vibe_surf/backend/frontend/assets/map-pin-house-CXbXX8w-.js +6 -0
  1042. vibe_surf/backend/frontend/assets/map-pin-minus-D0dRHvgd.js +6 -0
  1043. vibe_surf/backend/frontend/assets/map-pin-minus-inside-DGpPZYAi.js +6 -0
  1044. vibe_surf/backend/frontend/assets/map-pin-off-EbFPnlZq.js +6 -0
  1045. vibe_surf/backend/frontend/assets/map-pin-plus-BLD0VcG5.js +6 -0
  1046. vibe_surf/backend/frontend/assets/map-pin-plus-inside-CapcP3Yk.js +6 -0
  1047. vibe_surf/backend/frontend/assets/map-pin-x-DrNWALEC.js +6 -0
  1048. vibe_surf/backend/frontend/assets/map-pin-x-inside-9DqM8z-J.js +6 -0
  1049. vibe_surf/backend/frontend/assets/map-pinned-DHMQpBhr.js +6 -0
  1050. vibe_surf/backend/frontend/assets/map-plus-CQm0KS9c.js +6 -0
  1051. vibe_surf/backend/frontend/assets/mars-CcweinsF.js +6 -0
  1052. vibe_surf/backend/frontend/assets/mars-stroke-OWTfhzV5.js +6 -0
  1053. vibe_surf/backend/frontend/assets/martini-DGORgxbx.js +6 -0
  1054. vibe_surf/backend/frontend/assets/maximize-2-CN4UuSQb.js +6 -0
  1055. vibe_surf/backend/frontend/assets/maximize-DOYuzVqB.js +6 -0
  1056. vibe_surf/backend/frontend/assets/medal-DZT2ADyJ.js +6 -0
  1057. vibe_surf/backend/frontend/assets/megaphone-DN4B6I5c.js +6 -0
  1058. vibe_surf/backend/frontend/assets/megaphone-off-DRAddUqF.js +6 -0
  1059. vibe_surf/backend/frontend/assets/meh-CTX3Y793.js +6 -0
  1060. vibe_surf/backend/frontend/assets/memory-stick-CSG08PuA.js +6 -0
  1061. vibe_surf/backend/frontend/assets/menu-BUvQ8bhy.js +6 -0
  1062. vibe_surf/backend/frontend/assets/merge-xkPPWyBJ.js +6 -0
  1063. vibe_surf/backend/frontend/assets/message-circle-BSqs77ZY.js +6 -0
  1064. vibe_surf/backend/frontend/assets/message-circle-code-EW46-KUX.js +6 -0
  1065. vibe_surf/backend/frontend/assets/message-circle-dashed-BOxWD8kE.js +6 -0
  1066. vibe_surf/backend/frontend/assets/message-circle-heart-CBhiUXeV.js +6 -0
  1067. vibe_surf/backend/frontend/assets/message-circle-more-DqfUhx6W.js +6 -0
  1068. vibe_surf/backend/frontend/assets/message-circle-off-DrsP7VV_.js +6 -0
  1069. vibe_surf/backend/frontend/assets/message-circle-plus-IixbN-s-.js +6 -0
  1070. vibe_surf/backend/frontend/assets/message-circle-question-DsMgtwwS.js +6 -0
  1071. vibe_surf/backend/frontend/assets/message-circle-reply-D_Eog9Yc.js +6 -0
  1072. vibe_surf/backend/frontend/assets/message-circle-warning-D656cL7l.js +6 -0
  1073. vibe_surf/backend/frontend/assets/message-circle-x-CXWR4BBb.js +6 -0
  1074. vibe_surf/backend/frontend/assets/message-square-DKWryKVG.js +6 -0
  1075. vibe_surf/backend/frontend/assets/message-square-code-0ANFU-JW.js +6 -0
  1076. vibe_surf/backend/frontend/assets/message-square-dashed-DaZwp2x1.js +6 -0
  1077. vibe_surf/backend/frontend/assets/message-square-diff-DpJLi_UX.js +6 -0
  1078. vibe_surf/backend/frontend/assets/message-square-dot-OcgwyxZC.js +6 -0
  1079. vibe_surf/backend/frontend/assets/message-square-heart-CKfZOSw8.js +6 -0
  1080. vibe_surf/backend/frontend/assets/message-square-lock-BnNy_yw5.js +6 -0
  1081. vibe_surf/backend/frontend/assets/message-square-more-D2WGFzms.js +6 -0
  1082. vibe_surf/backend/frontend/assets/message-square-off-DV5974j6.js +6 -0
  1083. vibe_surf/backend/frontend/assets/message-square-plus-7icA5g-P.js +6 -0
  1084. vibe_surf/backend/frontend/assets/message-square-quote-DdAvA-a_.js +6 -0
  1085. vibe_surf/backend/frontend/assets/message-square-reply-Cg9Dlls7.js +6 -0
  1086. vibe_surf/backend/frontend/assets/message-square-share-BptAhOEV.js +6 -0
  1087. vibe_surf/backend/frontend/assets/message-square-text-Cu-Ycwsi.js +6 -0
  1088. vibe_surf/backend/frontend/assets/message-square-warning-DxIzJ5bt.js +6 -0
  1089. vibe_surf/backend/frontend/assets/message-square-x-BF9akIp2.js +6 -0
  1090. vibe_surf/backend/frontend/assets/messages-square-AjrRNZXQ.js +6 -0
  1091. vibe_surf/backend/frontend/assets/mic-BXU1SRXR.js +6 -0
  1092. vibe_surf/backend/frontend/assets/mic-off-BUQ1-6-l.js +6 -0
  1093. vibe_surf/backend/frontend/assets/mic-vocal-CG4Yw8We.js +6 -0
  1094. vibe_surf/backend/frontend/assets/microchip-CodKB7m1.js +6 -0
  1095. vibe_surf/backend/frontend/assets/microscope-BY57GHi1.js +6 -0
  1096. vibe_surf/backend/frontend/assets/microwave-KuJ1X2CX.js +6 -0
  1097. vibe_surf/backend/frontend/assets/milestone-D_ToDu31.js +6 -0
  1098. vibe_surf/backend/frontend/assets/milk-C4Nq829F.js +6 -0
  1099. vibe_surf/backend/frontend/assets/milk-off-BPCtdIks.js +6 -0
  1100. vibe_surf/backend/frontend/assets/minimize-2-DeAs1S78.js +6 -0
  1101. vibe_surf/backend/frontend/assets/minimize-DKOGyuzf.js +6 -0
  1102. vibe_surf/backend/frontend/assets/monitor-Cjm4ELo4.js +6 -0
  1103. vibe_surf/backend/frontend/assets/monitor-check-CrckmDk_.js +6 -0
  1104. vibe_surf/backend/frontend/assets/monitor-cog-DIPYXk5z.js +6 -0
  1105. vibe_surf/backend/frontend/assets/monitor-dot-Cl_ZGBvp.js +6 -0
  1106. vibe_surf/backend/frontend/assets/monitor-down-DCSynbhm.js +6 -0
  1107. vibe_surf/backend/frontend/assets/monitor-off-Bxqkes47.js +6 -0
  1108. vibe_surf/backend/frontend/assets/monitor-pause-B2ogwlXq.js +6 -0
  1109. vibe_surf/backend/frontend/assets/monitor-play-w2CTvWQx.js +6 -0
  1110. vibe_surf/backend/frontend/assets/monitor-smartphone-DYQb-VQa.js +6 -0
  1111. vibe_surf/backend/frontend/assets/monitor-speaker-CruyWIOw.js +6 -0
  1112. vibe_surf/backend/frontend/assets/monitor-stop-D2cot7wP.js +6 -0
  1113. vibe_surf/backend/frontend/assets/monitor-up-Bo4VFUGK.js +6 -0
  1114. vibe_surf/backend/frontend/assets/monitor-x-yhFSw0Zo.js +6 -0
  1115. vibe_surf/backend/frontend/assets/moon-CZFTmFVS.js +6 -0
  1116. vibe_surf/backend/frontend/assets/moon-star-X8Pb6SAO.js +6 -0
  1117. vibe_surf/backend/frontend/assets/mountain-_tKRhauQ.js +6 -0
  1118. vibe_surf/backend/frontend/assets/mountain-snow-COLjUpoc.js +6 -0
  1119. vibe_surf/backend/frontend/assets/mouse-C62B_4i7.js +6 -0
  1120. vibe_surf/backend/frontend/assets/mouse-off-NO65wsqy.js +6 -0
  1121. vibe_surf/backend/frontend/assets/mouse-pointer-2-vvokJ-v-.js +6 -0
  1122. vibe_surf/backend/frontend/assets/mouse-pointer-IHoLB1Ii.js +6 -0
  1123. vibe_surf/backend/frontend/assets/mouse-pointer-ban-BGxlXS_f.js +6 -0
  1124. vibe_surf/backend/frontend/assets/mouse-pointer-click-C7N7cKxT.js +6 -0
  1125. vibe_surf/backend/frontend/assets/move-3d-CQO0qR5b.js +6 -0
  1126. vibe_surf/backend/frontend/assets/move-Bp3oIgRK.js +6 -0
  1127. vibe_surf/backend/frontend/assets/move-diagonal-2-CQ3Gqa4B.js +6 -0
  1128. vibe_surf/backend/frontend/assets/move-diagonal-BkUx0iYA.js +6 -0
  1129. vibe_surf/backend/frontend/assets/move-down-B4dxMy_p.js +6 -0
  1130. vibe_surf/backend/frontend/assets/move-down-left-NxvLep64.js +6 -0
  1131. vibe_surf/backend/frontend/assets/move-down-right-CxcsF1yI.js +6 -0
  1132. vibe_surf/backend/frontend/assets/move-horizontal-or6vuyOq.js +6 -0
  1133. vibe_surf/backend/frontend/assets/move-left-Tcae9tGG.js +6 -0
  1134. vibe_surf/backend/frontend/assets/move-right-jY3F431H.js +6 -0
  1135. vibe_surf/backend/frontend/assets/move-up-Dk8sPbRD.js +6 -0
  1136. vibe_surf/backend/frontend/assets/move-up-left-CD7NRvhF.js +6 -0
  1137. vibe_surf/backend/frontend/assets/move-up-right-BAOhHbBw.js +6 -0
  1138. vibe_surf/backend/frontend/assets/move-vertical-BxWj9bDO.js +6 -0
  1139. vibe_surf/backend/frontend/assets/music-2-DQL5lOH_.js +6 -0
  1140. vibe_surf/backend/frontend/assets/music-3-wkxjpooD.js +6 -0
  1141. vibe_surf/backend/frontend/assets/music-4-CgUN2PUO.js +6 -0
  1142. vibe_surf/backend/frontend/assets/music-YxXwq9fN.js +6 -0
  1143. vibe_surf/backend/frontend/assets/navigation-2-Ba4Z-jSq.js +6 -0
  1144. vibe_surf/backend/frontend/assets/navigation-2-off-C_LfeWvW.js +6 -0
  1145. vibe_surf/backend/frontend/assets/navigation-BEChOEsi.js +6 -0
  1146. vibe_surf/backend/frontend/assets/navigation-off-BehyOyE3.js +6 -0
  1147. vibe_surf/backend/frontend/assets/network-CwJLOq3T.js +6 -0
  1148. vibe_surf/backend/frontend/assets/newspaper-ELrHeGRI.js +6 -0
  1149. vibe_surf/backend/frontend/assets/nfc-B_3XFb34.js +6 -0
  1150. vibe_surf/backend/frontend/assets/non-binary-BsgU9v43.js +6 -0
  1151. vibe_surf/backend/frontend/assets/notebook-j-nq3SkT.js +6 -0
  1152. vibe_surf/backend/frontend/assets/notebook-pen-D9-IPVfi.js +6 -0
  1153. vibe_surf/backend/frontend/assets/notebook-tabs-B8RN5vFZ.js +6 -0
  1154. vibe_surf/backend/frontend/assets/notebook-text-9VvE4wV2.js +6 -0
  1155. vibe_surf/backend/frontend/assets/notepad-text-CtRuOWM5.js +6 -0
  1156. vibe_surf/backend/frontend/assets/notepad-text-dashed-BKDJS1oq.js +6 -0
  1157. vibe_surf/backend/frontend/assets/nut-MLKrgO4r.js +6 -0
  1158. vibe_surf/backend/frontend/assets/nut-off-CX5f1ggv.js +6 -0
  1159. vibe_surf/backend/frontend/assets/octagon-Dm5tdLTK.js +6 -0
  1160. vibe_surf/backend/frontend/assets/octagon-alert-THvRb-wV.js +6 -0
  1161. vibe_surf/backend/frontend/assets/octagon-minus-BIN-9swI.js +6 -0
  1162. vibe_surf/backend/frontend/assets/octagon-pause-BvRAlpaV.js +6 -0
  1163. vibe_surf/backend/frontend/assets/octagon-x-DeRG_Ls0.js +6 -0
  1164. vibe_surf/backend/frontend/assets/omega-CVAxeKBK.js +6 -0
  1165. vibe_surf/backend/frontend/assets/option-14pftykg.js +6 -0
  1166. vibe_surf/backend/frontend/assets/orbit-CfewrZaI.js +6 -0
  1167. vibe_surf/backend/frontend/assets/origami-BT1VriUJ.js +6 -0
  1168. vibe_surf/backend/frontend/assets/package-2-D11kpXq5.js +6 -0
  1169. vibe_surf/backend/frontend/assets/package-BegS59es.js +6 -0
  1170. vibe_surf/backend/frontend/assets/package-check-DOLq4x6S.js +6 -0
  1171. vibe_surf/backend/frontend/assets/package-minus-BFgP752B.js +6 -0
  1172. vibe_surf/backend/frontend/assets/package-open-D2nk_ytU.js +6 -0
  1173. vibe_surf/backend/frontend/assets/package-plus-Va8EoLSt.js +6 -0
  1174. vibe_surf/backend/frontend/assets/package-search-cGv3F3Yi.js +6 -0
  1175. vibe_surf/backend/frontend/assets/package-x-BFCKCrAT.js +6 -0
  1176. vibe_surf/backend/frontend/assets/paint-bucket-C1nh-Go_.js +6 -0
  1177. vibe_surf/backend/frontend/assets/paint-roller-C9vy4fuD.js +6 -0
  1178. vibe_surf/backend/frontend/assets/paintbrush-Bo4L8Hqc.js +6 -0
  1179. vibe_surf/backend/frontend/assets/paintbrush-vertical-DqUyy2UU.js +6 -0
  1180. vibe_surf/backend/frontend/assets/palette-DddGrkXJ.js +6 -0
  1181. vibe_surf/backend/frontend/assets/panel-bottom-DPSx8I79.js +6 -0
  1182. vibe_surf/backend/frontend/assets/panel-bottom-close-D0SBNVCx.js +6 -0
  1183. vibe_surf/backend/frontend/assets/panel-bottom-dashed-CR6jKyB5.js +6 -0
  1184. vibe_surf/backend/frontend/assets/panel-bottom-open-BA8uHJ1f.js +6 -0
  1185. vibe_surf/backend/frontend/assets/panel-left-close-HWzVGhEN.js +6 -0
  1186. vibe_surf/backend/frontend/assets/panel-left-dashed-C8CvEMus.js +6 -0
  1187. vibe_surf/backend/frontend/assets/panel-left-open-DZtgeJky.js +6 -0
  1188. vibe_surf/backend/frontend/assets/panel-right-BIGpcNCD.js +6 -0
  1189. vibe_surf/backend/frontend/assets/panel-right-close-D6I6nB-8.js +6 -0
  1190. vibe_surf/backend/frontend/assets/panel-right-dashed-Dt-tZyfJ.js +6 -0
  1191. vibe_surf/backend/frontend/assets/panel-right-open-Cso_cmr4.js +6 -0
  1192. vibe_surf/backend/frontend/assets/panel-top-DxQozLLO.js +6 -0
  1193. vibe_surf/backend/frontend/assets/panel-top-close-21p_Iy4Q.js +6 -0
  1194. vibe_surf/backend/frontend/assets/panel-top-dashed-BLLvCUcW.js +6 -0
  1195. vibe_surf/backend/frontend/assets/panel-top-open-DOpjqeXN.js +6 -0
  1196. vibe_surf/backend/frontend/assets/panels-left-bottom-Dgc_Zml-.js +6 -0
  1197. vibe_surf/backend/frontend/assets/panels-right-bottom-DBl33v5J.js +6 -0
  1198. vibe_surf/backend/frontend/assets/panels-top-left-Bh9Km2t_.js +6 -0
  1199. vibe_surf/backend/frontend/assets/paperclip-DwNdWjNs.js +6 -0
  1200. vibe_surf/backend/frontend/assets/parentheses-Bv3x0v0d.js +6 -0
  1201. vibe_surf/backend/frontend/assets/parking-meter-CaAUYem8.js +6 -0
  1202. vibe_surf/backend/frontend/assets/party-popper-o676ndwa.js +6 -0
  1203. vibe_surf/backend/frontend/assets/pause-DofdcFyf.js +6 -0
  1204. vibe_surf/backend/frontend/assets/paw-print-CsCZTGwP.js +6 -0
  1205. vibe_surf/backend/frontend/assets/pc-case-ChHKP8Bs.js +6 -0
  1206. vibe_surf/backend/frontend/assets/pen-BJrA5W2j.js +6 -0
  1207. vibe_surf/backend/frontend/assets/pen-line-Cn_-SNuM.js +6 -0
  1208. vibe_surf/backend/frontend/assets/pen-off-vpS9creP.js +6 -0
  1209. vibe_surf/backend/frontend/assets/pen-tool-BHi1klDG.js +6 -0
  1210. vibe_surf/backend/frontend/assets/pencil-Wem_VEVg.js +6 -0
  1211. vibe_surf/backend/frontend/assets/pencil-line-CpG7egII.js +6 -0
  1212. vibe_surf/backend/frontend/assets/pencil-off-DNbfjOTs.js +6 -0
  1213. vibe_surf/backend/frontend/assets/pencil-ruler-BQdaeQqI.js +6 -0
  1214. vibe_surf/backend/frontend/assets/pentagon-BNe4mDhm.js +6 -0
  1215. vibe_surf/backend/frontend/assets/percent-CDhexNCT.js +6 -0
  1216. vibe_surf/backend/frontend/assets/person-standing-DxYpZiGV.js +6 -0
  1217. vibe_surf/backend/frontend/assets/philippine-peso-B7FAFSBd.js +6 -0
  1218. vibe_surf/backend/frontend/assets/phone-CTiWkAUx.js +6 -0
  1219. vibe_surf/backend/frontend/assets/phone-call-CWavZZ8W.js +6 -0
  1220. vibe_surf/backend/frontend/assets/phone-forwarded-CLaEebEE.js +6 -0
  1221. vibe_surf/backend/frontend/assets/phone-incoming-Cv2OCBfT.js +6 -0
  1222. vibe_surf/backend/frontend/assets/phone-missed-DNNjfxVz.js +6 -0
  1223. vibe_surf/backend/frontend/assets/phone-off-ClVQWi0g.js +6 -0
  1224. vibe_surf/backend/frontend/assets/phone-outgoing-CY2TxKXl.js +6 -0
  1225. vibe_surf/backend/frontend/assets/pi-DNqBWxfj.js +6 -0
  1226. vibe_surf/backend/frontend/assets/piano-MiPm47Ma.js +6 -0
  1227. vibe_surf/backend/frontend/assets/pickaxe-YqkOBnCJ.js +6 -0
  1228. vibe_surf/backend/frontend/assets/picture-in-picture-2-BIKggEXM.js +6 -0
  1229. vibe_surf/backend/frontend/assets/picture-in-picture-QAMxgJMO.js +6 -0
  1230. vibe_surf/backend/frontend/assets/piggy-bank-DVE6nzj5.js +6 -0
  1231. vibe_surf/backend/frontend/assets/pilcrow-CIhZWZVN.js +6 -0
  1232. vibe_surf/backend/frontend/assets/pilcrow-left-Ca9XTMpA.js +6 -0
  1233. vibe_surf/backend/frontend/assets/pilcrow-right-CLd68jMN.js +6 -0
  1234. vibe_surf/backend/frontend/assets/pill-CBiMEkPj.js +6 -0
  1235. vibe_surf/backend/frontend/assets/pill-bottle-CJ3pejac.js +6 -0
  1236. vibe_surf/backend/frontend/assets/pin-Oo2Sku7X.js +6 -0
  1237. vibe_surf/backend/frontend/assets/pin-off-DG48ZMV_.js +6 -0
  1238. vibe_surf/backend/frontend/assets/pipette-BzvHUOUt.js +6 -0
  1239. vibe_surf/backend/frontend/assets/pizza-B5z39oy-.js +6 -0
  1240. vibe_surf/backend/frontend/assets/plane-eU326jPg.js +6 -0
  1241. vibe_surf/backend/frontend/assets/plane-landing-gxcqSKOA.js +6 -0
  1242. vibe_surf/backend/frontend/assets/plane-takeoff-CFmuOAfX.js +6 -0
  1243. vibe_surf/backend/frontend/assets/play-CaCbaWdR.js +6 -0
  1244. vibe_surf/backend/frontend/assets/plug-2-CaihODHc.js +6 -0
  1245. vibe_surf/backend/frontend/assets/plug-DrN0weqI.js +6 -0
  1246. vibe_surf/backend/frontend/assets/plug-zap-BT2sgwQy.js +6 -0
  1247. vibe_surf/backend/frontend/assets/pocket-DNEPJJmg.js +6 -0
  1248. vibe_surf/backend/frontend/assets/pocket-knife-1CI1aqMD.js +6 -0
  1249. vibe_surf/backend/frontend/assets/podcast-BsGsWn3h.js +6 -0
  1250. vibe_surf/backend/frontend/assets/pointer-B8T5gv-x.js +6 -0
  1251. vibe_surf/backend/frontend/assets/pointer-off-C2DXzg5S.js +6 -0
  1252. vibe_surf/backend/frontend/assets/popcorn-Bi10K8Em.js +6 -0
  1253. vibe_surf/backend/frontend/assets/popsicle-CxLa9bz8.js +6 -0
  1254. vibe_surf/backend/frontend/assets/pound-sterling-BFXPyyYU.js +6 -0
  1255. vibe_surf/backend/frontend/assets/power-BmqAlXVz.js +6 -0
  1256. vibe_surf/backend/frontend/assets/power-off-CT70n2O0.js +6 -0
  1257. vibe_surf/backend/frontend/assets/presentation-DVhaCvt0.js +6 -0
  1258. vibe_surf/backend/frontend/assets/printer-D7NgKQZm.js +6 -0
  1259. vibe_surf/backend/frontend/assets/printer-check-BYDiSYD3.js +6 -0
  1260. vibe_surf/backend/frontend/assets/projector-BFMEAUGw.js +6 -0
  1261. vibe_surf/backend/frontend/assets/proportions-CUypjhWs.js +6 -0
  1262. vibe_surf/backend/frontend/assets/puzzle-lPcRsrCP.js +6 -0
  1263. vibe_surf/backend/frontend/assets/pyramid-bX_YtvHu.js +6 -0
  1264. vibe_surf/backend/frontend/assets/qr-code-CMBq06CH.js +6 -0
  1265. vibe_surf/backend/frontend/assets/quote-BkFwr2wo.js +6 -0
  1266. vibe_surf/backend/frontend/assets/rabbit-CEyfAR1t.js +6 -0
  1267. vibe_surf/backend/frontend/assets/radar-bMcLs_bP.js +6 -0
  1268. vibe_surf/backend/frontend/assets/radiation-NMlxufHZ.js +6 -0
  1269. vibe_surf/backend/frontend/assets/radical-C3CE5pot.js +6 -0
  1270. vibe_surf/backend/frontend/assets/radio-DQMhSWLz.js +6 -0
  1271. vibe_surf/backend/frontend/assets/radio-receiver-Cwtiayz1.js +6 -0
  1272. vibe_surf/backend/frontend/assets/radio-tower-ngCBBDuR.js +6 -0
  1273. vibe_surf/backend/frontend/assets/radius-CB1vpl4-.js +6 -0
  1274. vibe_surf/backend/frontend/assets/rail-symbol-CWT8jn79.js +6 -0
  1275. vibe_surf/backend/frontend/assets/rainbow-eG2Z6xdv.js +6 -0
  1276. vibe_surf/backend/frontend/assets/rat-CjjmSgkE.js +6 -0
  1277. vibe_surf/backend/frontend/assets/ratio-Ck9TZd6C.js +6 -0
  1278. vibe_surf/backend/frontend/assets/receipt-QzIALZKN.js +6 -0
  1279. vibe_surf/backend/frontend/assets/receipt-cent-wAd12yx1.js +6 -0
  1280. vibe_surf/backend/frontend/assets/receipt-euro-BG_rS29_.js +6 -0
  1281. vibe_surf/backend/frontend/assets/receipt-indian-rupee-DlF7wlqh.js +6 -0
  1282. vibe_surf/backend/frontend/assets/receipt-japanese-yen-GDNnE_Bl.js +6 -0
  1283. vibe_surf/backend/frontend/assets/receipt-pound-sterling-CczRTrHu.js +6 -0
  1284. vibe_surf/backend/frontend/assets/receipt-russian-ruble-CP8qhoZV.js +6 -0
  1285. vibe_surf/backend/frontend/assets/receipt-swiss-franc-B1FjnBVT.js +6 -0
  1286. vibe_surf/backend/frontend/assets/receipt-text-Df0EAqK2.js +6 -0
  1287. vibe_surf/backend/frontend/assets/rectangle-ellipsis-BeZ5b8q2.js +6 -0
  1288. vibe_surf/backend/frontend/assets/rectangle-goggles-B0pWs5f6.js +6 -0
  1289. vibe_surf/backend/frontend/assets/rectangle-horizontal-5D8nW5zN.js +6 -0
  1290. vibe_surf/backend/frontend/assets/rectangle-vertical-D6iXTP5O.js +6 -0
  1291. vibe_surf/backend/frontend/assets/recycle-cePWNqck.js +6 -0
  1292. vibe_surf/backend/frontend/assets/redo-2-DflPUgVL.js +6 -0
  1293. vibe_surf/backend/frontend/assets/redo-C8hJqzAq.js +6 -0
  1294. vibe_surf/backend/frontend/assets/redo-dot-JyZC910i.js +6 -0
  1295. vibe_surf/backend/frontend/assets/refresh-ccw-QGOuU93p.js +6 -0
  1296. vibe_surf/backend/frontend/assets/refresh-ccw-dot-BVfOSZg8.js +6 -0
  1297. vibe_surf/backend/frontend/assets/refresh-cw-DttAl3PC.js +6 -0
  1298. vibe_surf/backend/frontend/assets/refresh-cw-off-1m7CD9nm.js +6 -0
  1299. vibe_surf/backend/frontend/assets/refrigerator-BGk6q_hL.js +6 -0
  1300. vibe_surf/backend/frontend/assets/regex-C-txrNUs.js +6 -0
  1301. vibe_surf/backend/frontend/assets/remove-formatting-CVxREpGZ.js +6 -0
  1302. vibe_surf/backend/frontend/assets/repeat-1-ChFj2WK-.js +6 -0
  1303. vibe_surf/backend/frontend/assets/repeat-2-ViBvoa4W.js +6 -0
  1304. vibe_surf/backend/frontend/assets/repeat-GoYG4svo.js +6 -0
  1305. vibe_surf/backend/frontend/assets/replace-GFcv_X_V.js +6 -0
  1306. vibe_surf/backend/frontend/assets/replace-all-zAC7UUp9.js +6 -0
  1307. vibe_surf/backend/frontend/assets/reply-C2IH8Yvz.js +6 -0
  1308. vibe_surf/backend/frontend/assets/reply-all-CXYDFlBb.js +6 -0
  1309. vibe_surf/backend/frontend/assets/rewind-Bmv_DtI_.js +6 -0
  1310. vibe_surf/backend/frontend/assets/ribbon-B4MeTNUc.js +6 -0
  1311. vibe_surf/backend/frontend/assets/robot-BsccFpqT.png +0 -0
  1312. vibe_surf/backend/frontend/assets/rocket-Ch2Sc43k.js +6 -0
  1313. vibe_surf/backend/frontend/assets/rocking-chair-Pcx0Ex8j.js +6 -0
  1314. vibe_surf/backend/frontend/assets/roller-coaster-DpdZyHU4.js +6 -0
  1315. vibe_surf/backend/frontend/assets/rotate-3d-CAlCCDrS.js +6 -0
  1316. vibe_surf/backend/frontend/assets/rotate-ccw-Dl5IeMD0.js +6 -0
  1317. vibe_surf/backend/frontend/assets/rotate-ccw-key-CbcFcY_X.js +6 -0
  1318. vibe_surf/backend/frontend/assets/rotate-ccw-square-B6dXtMGF.js +6 -0
  1319. vibe_surf/backend/frontend/assets/rotate-cw-D9QBD3w1.js +6 -0
  1320. vibe_surf/backend/frontend/assets/rotate-cw-square-BTb_LCYt.js +6 -0
  1321. vibe_surf/backend/frontend/assets/route-BY8OMdE6.js +6 -0
  1322. vibe_surf/backend/frontend/assets/route-off-DBPZSjij.js +6 -0
  1323. vibe_surf/backend/frontend/assets/router-Cj5pK344.js +6 -0
  1324. vibe_surf/backend/frontend/assets/rows-2-DQikFZXW.js +6 -0
  1325. vibe_surf/backend/frontend/assets/rows-3-CgpwLjBs.js +6 -0
  1326. vibe_surf/backend/frontend/assets/rows-4-DHLpJgeW.js +6 -0
  1327. vibe_surf/backend/frontend/assets/rss-B2J7l-Sb.js +6 -0
  1328. vibe_surf/backend/frontend/assets/ruler-D-fe4o6e.js +6 -0
  1329. vibe_surf/backend/frontend/assets/ruler-dimension-line-COrwkuXi.js +6 -0
  1330. vibe_surf/backend/frontend/assets/russian-ruble-Bk9zdT2J.js +6 -0
  1331. vibe_surf/backend/frontend/assets/sailboat-DMPxVbdm.js +6 -0
  1332. vibe_surf/backend/frontend/assets/salad-D20azVGZ.js +6 -0
  1333. vibe_surf/backend/frontend/assets/sandwich-Z_d-MQ5t.js +6 -0
  1334. vibe_surf/backend/frontend/assets/satellite-7zgZRaOF.js +6 -0
  1335. vibe_surf/backend/frontend/assets/satellite-dish-Cy6FmD_T.js +6 -0
  1336. vibe_surf/backend/frontend/assets/saudi-riyal-C9ZvxnL2.js +6 -0
  1337. vibe_surf/backend/frontend/assets/save-LkAkHS7W.js +6 -0
  1338. vibe_surf/backend/frontend/assets/save-all-D_-zYl71.js +6 -0
  1339. vibe_surf/backend/frontend/assets/save-off-B0KWQYIj.js +6 -0
  1340. vibe_surf/backend/frontend/assets/scale-3d-FnesJ3yp.js +6 -0
  1341. vibe_surf/backend/frontend/assets/scale-CfDNIDpX.js +6 -0
  1342. vibe_surf/backend/frontend/assets/scaling-D7_wGXPp.js +6 -0
  1343. vibe_surf/backend/frontend/assets/scan-CXtftKWt.js +6 -0
  1344. vibe_surf/backend/frontend/assets/scan-barcode-DMzKInA0.js +6 -0
  1345. vibe_surf/backend/frontend/assets/scan-eye-BNOyXXj8.js +6 -0
  1346. vibe_surf/backend/frontend/assets/scan-face-wv0t4zeq.js +6 -0
  1347. vibe_surf/backend/frontend/assets/scan-heart-BeBWR3xV.js +6 -0
  1348. vibe_surf/backend/frontend/assets/scan-line-CvQpOukb.js +6 -0
  1349. vibe_surf/backend/frontend/assets/scan-qr-code-BQ-Oqt9e.js +6 -0
  1350. vibe_surf/backend/frontend/assets/scan-search-DeDxyjP7.js +6 -0
  1351. vibe_surf/backend/frontend/assets/scan-text-Du5B26Lp.js +6 -0
  1352. vibe_surf/backend/frontend/assets/school-XPbcFxvs.js +6 -0
  1353. vibe_surf/backend/frontend/assets/scissors-C82MxyXF.js +6 -0
  1354. vibe_surf/backend/frontend/assets/scissors-line-dashed-BiIj8ZEF.js +6 -0
  1355. vibe_surf/backend/frontend/assets/screen-share-4rpy_bSP.js +6 -0
  1356. vibe_surf/backend/frontend/assets/screen-share-off-DisAsCVo.js +6 -0
  1357. vibe_surf/backend/frontend/assets/scroll-D3FgdMu9.js +6 -0
  1358. vibe_surf/backend/frontend/assets/scroll-text-BolUgv8k.js +6 -0
  1359. vibe_surf/backend/frontend/assets/search-check-BqDsbYzT.js +6 -0
  1360. vibe_surf/backend/frontend/assets/search-code-BAngOAWT.js +6 -0
  1361. vibe_surf/backend/frontend/assets/search-slash-DGpGjVDh.js +6 -0
  1362. vibe_surf/backend/frontend/assets/search-x-hbEhC-Ks.js +6 -0
  1363. vibe_surf/backend/frontend/assets/section-CZdebDRa.js +6 -0
  1364. vibe_surf/backend/frontend/assets/send-BY6RRvoS.js +6 -0
  1365. vibe_surf/backend/frontend/assets/send-horizontal-ByJf1GwO.js +6 -0
  1366. vibe_surf/backend/frontend/assets/send-to-back-CqeJ0x7-.js +6 -0
  1367. vibe_surf/backend/frontend/assets/separator-horizontal-CyHVE869.js +6 -0
  1368. vibe_surf/backend/frontend/assets/separator-vertical-CHEXvAuG.js +6 -0
  1369. vibe_surf/backend/frontend/assets/server-DPj6-qpq.js +6 -0
  1370. vibe_surf/backend/frontend/assets/server-cog-Dc-mlMR8.js +6 -0
  1371. vibe_surf/backend/frontend/assets/server-crash-CXsISMNW.js +6 -0
  1372. vibe_surf/backend/frontend/assets/server-off-Y_lfL7-w.js +6 -0
  1373. vibe_surf/backend/frontend/assets/settings-2-DZ9wvd5i.js +6 -0
  1374. vibe_surf/backend/frontend/assets/settings-DO_W46zj.js +6 -0
  1375. vibe_surf/backend/frontend/assets/shapes-CIsUods8.js +6 -0
  1376. vibe_surf/backend/frontend/assets/share-0y8A7A5E.js +6 -0
  1377. vibe_surf/backend/frontend/assets/share-2-TSy7pnEx.js +6 -0
  1378. vibe_surf/backend/frontend/assets/sheet-DagiH4ve.js +6 -0
  1379. vibe_surf/backend/frontend/assets/shell-4uq5QK2w.js +6 -0
  1380. vibe_surf/backend/frontend/assets/shield-DSmxKeAX.js +6 -0
  1381. vibe_surf/backend/frontend/assets/shield-alert-2BHG6ofb.js +6 -0
  1382. vibe_surf/backend/frontend/assets/shield-ban-BcQOFFCO.js +6 -0
  1383. vibe_surf/backend/frontend/assets/shield-check-IssT1y70.js +6 -0
  1384. vibe_surf/backend/frontend/assets/shield-ellipsis-B_k2GJZe.js +6 -0
  1385. vibe_surf/backend/frontend/assets/shield-half-Ce9mZY66.js +6 -0
  1386. vibe_surf/backend/frontend/assets/shield-minus-Cm9SRYz3.js +6 -0
  1387. vibe_surf/backend/frontend/assets/shield-off-Di-Txcsi.js +6 -0
  1388. vibe_surf/backend/frontend/assets/shield-plus-Cbd8tnos.js +6 -0
  1389. vibe_surf/backend/frontend/assets/shield-question-5hf3zAb8.js +6 -0
  1390. vibe_surf/backend/frontend/assets/shield-user-D2XuthCx.js +6 -0
  1391. vibe_surf/backend/frontend/assets/shield-x-BTJiGLGc.js +6 -0
  1392. vibe_surf/backend/frontend/assets/ship-DkhgC4pB.js +6 -0
  1393. vibe_surf/backend/frontend/assets/ship-wheel-C-7_Y35l.js +6 -0
  1394. vibe_surf/backend/frontend/assets/shirt-vuhl9SGI.js +6 -0
  1395. vibe_surf/backend/frontend/assets/shopping-bag-DvQ2pPfQ.js +6 -0
  1396. vibe_surf/backend/frontend/assets/shopping-basket-D9s56Xw7.js +6 -0
  1397. vibe_surf/backend/frontend/assets/shopping-cart-ZmbJuTVy.js +6 -0
  1398. vibe_surf/backend/frontend/assets/shovel-L2fbM_rD.js +6 -0
  1399. vibe_surf/backend/frontend/assets/shower-head-DE9aHmtW.js +6 -0
  1400. vibe_surf/backend/frontend/assets/shredder-DadDP-UJ.js +6 -0
  1401. vibe_surf/backend/frontend/assets/shrimp-DycqoQZ3.js +6 -0
  1402. vibe_surf/backend/frontend/assets/shrink-B8aylxOx.js +6 -0
  1403. vibe_surf/backend/frontend/assets/shrub-DF1hbXW3.js +6 -0
  1404. vibe_surf/backend/frontend/assets/shuffle-BuIBx3Jr.js +6 -0
  1405. vibe_surf/backend/frontend/assets/sigma-Do2EOGrK.js +6 -0
  1406. vibe_surf/backend/frontend/assets/signal-D4HUxctG.js +6 -0
  1407. vibe_surf/backend/frontend/assets/signal-high-D4XjnPRT.js +6 -0
  1408. vibe_surf/backend/frontend/assets/signal-low-CbpCiGEn.js +6 -0
  1409. vibe_surf/backend/frontend/assets/signal-medium-DenP3lw7.js +6 -0
  1410. vibe_surf/backend/frontend/assets/signal-zero-CHgcs844.js +6 -0
  1411. vibe_surf/backend/frontend/assets/signature-DK8I0wlU.js +6 -0
  1412. vibe_surf/backend/frontend/assets/signpost-1ES-i9fp.js +6 -0
  1413. vibe_surf/backend/frontend/assets/signpost-big-BSozSaes.js +6 -0
  1414. vibe_surf/backend/frontend/assets/siren-wlABVP_H.js +6 -0
  1415. vibe_surf/backend/frontend/assets/skip-back-Bu_s_NAd.js +6 -0
  1416. vibe_surf/backend/frontend/assets/skip-forward-B_5w_2GT.js +6 -0
  1417. vibe_surf/backend/frontend/assets/skull-BEu1YCxD.js +6 -0
  1418. vibe_surf/backend/frontend/assets/slack-D9649ln8.js +6 -0
  1419. vibe_surf/backend/frontend/assets/slash-DojcavQ9.js +6 -0
  1420. vibe_surf/backend/frontend/assets/slice-CRmKxhnX.js +6 -0
  1421. vibe_surf/backend/frontend/assets/sliders-horizontal-B5g_t8uv.js +6 -0
  1422. vibe_surf/backend/frontend/assets/sliders-vertical-CLBL1buf.js +6 -0
  1423. vibe_surf/backend/frontend/assets/smartphone-D-ep_7qQ.js +6 -0
  1424. vibe_surf/backend/frontend/assets/smartphone-charging-CRPRIfJL.js +6 -0
  1425. vibe_surf/backend/frontend/assets/smartphone-nfc-CmXWPjB7.js +6 -0
  1426. vibe_surf/backend/frontend/assets/smile-C8NQBJ3w.js +6 -0
  1427. vibe_surf/backend/frontend/assets/smile-plus-BXiCkryt.js +6 -0
  1428. vibe_surf/backend/frontend/assets/snail-C4InLnJK.js +6 -0
  1429. vibe_surf/backend/frontend/assets/snowflake-CkOWmqpH.js +6 -0
  1430. vibe_surf/backend/frontend/assets/sofa-C5SFUETc.js +6 -0
  1431. vibe_surf/backend/frontend/assets/soup-BPK9i9Mq.js +6 -0
  1432. vibe_surf/backend/frontend/assets/space-B_AibqtW.js +6 -0
  1433. vibe_surf/backend/frontend/assets/spade-DOYQwKmE.js +6 -0
  1434. vibe_surf/backend/frontend/assets/sparkle-Bgy0TYRq.js +6 -0
  1435. vibe_surf/backend/frontend/assets/sparkles-COXnCZbi.js +6 -0
  1436. vibe_surf/backend/frontend/assets/speaker-CaUol58E.js +6 -0
  1437. vibe_surf/backend/frontend/assets/speech-SU2fqOX1.js +6 -0
  1438. vibe_surf/backend/frontend/assets/spell-check-2-C0X3GG0W.js +6 -0
  1439. vibe_surf/backend/frontend/assets/spell-check-BwnI8rNb.js +6 -0
  1440. vibe_surf/backend/frontend/assets/spline-ByNmiFVd.js +6 -0
  1441. vibe_surf/backend/frontend/assets/spline-pointer-B6jrA3VA.js +6 -0
  1442. vibe_surf/backend/frontend/assets/split-uo1Igb0N.js +6 -0
  1443. vibe_surf/backend/frontend/assets/spray-can-D37CFDNB.js +6 -0
  1444. vibe_surf/backend/frontend/assets/sprout-B25Lx6nK.js +6 -0
  1445. vibe_surf/backend/frontend/assets/square-KfK1ngG3.js +6 -0
  1446. vibe_surf/backend/frontend/assets/square-activity-BGQluYc5.js +6 -0
  1447. vibe_surf/backend/frontend/assets/square-arrow-down-CqlT37VO.js +6 -0
  1448. vibe_surf/backend/frontend/assets/square-arrow-down-left-CR2Go22d.js +6 -0
  1449. vibe_surf/backend/frontend/assets/square-arrow-down-right-rGAHLIaS.js +6 -0
  1450. vibe_surf/backend/frontend/assets/square-arrow-left-CvWu8_9d.js +6 -0
  1451. vibe_surf/backend/frontend/assets/square-arrow-out-down-left-K0v7hlb0.js +6 -0
  1452. vibe_surf/backend/frontend/assets/square-arrow-out-down-right-f74Yq8Hb.js +6 -0
  1453. vibe_surf/backend/frontend/assets/square-arrow-out-up-left-CdBSNScA.js +6 -0
  1454. vibe_surf/backend/frontend/assets/square-arrow-out-up-right-8PNP-37C.js +6 -0
  1455. vibe_surf/backend/frontend/assets/square-arrow-right-DZ3-0COG.js +6 -0
  1456. vibe_surf/backend/frontend/assets/square-arrow-up-CefwAldY.js +6 -0
  1457. vibe_surf/backend/frontend/assets/square-arrow-up-left-Dt6pY6y2.js +6 -0
  1458. vibe_surf/backend/frontend/assets/square-arrow-up-right-C-bPYXZE.js +6 -0
  1459. vibe_surf/backend/frontend/assets/square-asterisk-BIEu0Wq-.js +6 -0
  1460. vibe_surf/backend/frontend/assets/square-bottom-dashed-scissors-DFln2i7A.js +6 -0
  1461. vibe_surf/backend/frontend/assets/square-chart-gantt-VCoGr7j5.js +6 -0
  1462. vibe_surf/backend/frontend/assets/square-check-big-DdTm65g2.js +6 -0
  1463. vibe_surf/backend/frontend/assets/square-check-tJdFPLB4.js +6 -0
  1464. vibe_surf/backend/frontend/assets/square-chevron-down-DV0aFQxC.js +6 -0
  1465. vibe_surf/backend/frontend/assets/square-chevron-left-CdGd5MQB.js +6 -0
  1466. vibe_surf/backend/frontend/assets/square-chevron-right-D_aqBwe_.js +6 -0
  1467. vibe_surf/backend/frontend/assets/square-chevron-up-DBzeLhdp.js +6 -0
  1468. vibe_surf/backend/frontend/assets/square-code-DtSsDKtH.js +6 -0
  1469. vibe_surf/backend/frontend/assets/square-dashed-DSG0Ash0.js +6 -0
  1470. vibe_surf/backend/frontend/assets/square-dashed-bottom-BrkR2d57.js +6 -0
  1471. vibe_surf/backend/frontend/assets/square-dashed-bottom-code-CMTH1TbL.js +6 -0
  1472. vibe_surf/backend/frontend/assets/square-dashed-kanban-961FMGlN.js +6 -0
  1473. vibe_surf/backend/frontend/assets/square-dashed-mouse-pointer-BWcK5KqH.js +6 -0
  1474. vibe_surf/backend/frontend/assets/square-divide-B8EfzsLW.js +6 -0
  1475. vibe_surf/backend/frontend/assets/square-dot-CFXkGNxl.js +6 -0
  1476. vibe_surf/backend/frontend/assets/square-equal-DNzUS5Xu.js +6 -0
  1477. vibe_surf/backend/frontend/assets/square-function-mVVWlGqH.js +6 -0
  1478. vibe_surf/backend/frontend/assets/square-kanban-gbxgvYAs.js +6 -0
  1479. vibe_surf/backend/frontend/assets/square-library-LB-mLfoV.js +6 -0
  1480. vibe_surf/backend/frontend/assets/square-m-DR4vWmvF.js +6 -0
  1481. vibe_surf/backend/frontend/assets/square-menu-wrD_3b1X.js +6 -0
  1482. vibe_surf/backend/frontend/assets/square-minus-C8LvWB0i.js +6 -0
  1483. vibe_surf/backend/frontend/assets/square-mouse-pointer-BWIOG0ej.js +6 -0
  1484. vibe_surf/backend/frontend/assets/square-parking-Cwf1smWS.js +6 -0
  1485. vibe_surf/backend/frontend/assets/square-parking-off-B7fLGIII.js +6 -0
  1486. vibe_surf/backend/frontend/assets/square-pen-D-KRx-pf.js +6 -0
  1487. vibe_surf/backend/frontend/assets/square-percent-DEPHZN1U.js +6 -0
  1488. vibe_surf/backend/frontend/assets/square-pi-D3ZoGA8y.js +6 -0
  1489. vibe_surf/backend/frontend/assets/square-pilcrow-CU7h7mYC.js +6 -0
  1490. vibe_surf/backend/frontend/assets/square-play-BJID6hok.js +6 -0
  1491. vibe_surf/backend/frontend/assets/square-plus-B_MofyMZ.js +6 -0
  1492. vibe_surf/backend/frontend/assets/square-power-CnNfm3SK.js +6 -0
  1493. vibe_surf/backend/frontend/assets/square-radical-Bb91fkyO.js +6 -0
  1494. vibe_surf/backend/frontend/assets/square-round-corner-DSNwBkrZ.js +6 -0
  1495. vibe_surf/backend/frontend/assets/square-scissors-Q-Hew_gd.js +6 -0
  1496. vibe_surf/backend/frontend/assets/square-sigma-Dvqecf-2.js +6 -0
  1497. vibe_surf/backend/frontend/assets/square-slash-TFALqbOX.js +6 -0
  1498. vibe_surf/backend/frontend/assets/square-split-horizontal-CbPy5mPi.js +6 -0
  1499. vibe_surf/backend/frontend/assets/square-split-vertical-CwEHVK6t.js +6 -0
  1500. vibe_surf/backend/frontend/assets/square-square-BgBRe8Sy.js +6 -0
  1501. vibe_surf/backend/frontend/assets/square-stack-CQOObCB-.js +6 -0
  1502. vibe_surf/backend/frontend/assets/square-terminal-DTCYsALs.js +6 -0
  1503. vibe_surf/backend/frontend/assets/square-user-BtoHpGAf.js +6 -0
  1504. vibe_surf/backend/frontend/assets/square-user-round-DYhk3lBR.js +6 -0
  1505. vibe_surf/backend/frontend/assets/square-x-BxVfvmxy.js +6 -0
  1506. vibe_surf/backend/frontend/assets/squares-exclude-xFnGRjrW.js +6 -0
  1507. vibe_surf/backend/frontend/assets/squares-intersect-CJ3onkar.js +6 -0
  1508. vibe_surf/backend/frontend/assets/squares-subtract-DHkmEhbq.js +6 -0
  1509. vibe_surf/backend/frontend/assets/squares-unite-VTPchsN_.js +6 -0
  1510. vibe_surf/backend/frontend/assets/squircle-BeRgB4CX.js +6 -0
  1511. vibe_surf/backend/frontend/assets/squirrel-CXpCofHU.js +6 -0
  1512. vibe_surf/backend/frontend/assets/stamp-CBKYJLk-.js +6 -0
  1513. vibe_surf/backend/frontend/assets/star-g394tQMa.js +6 -0
  1514. vibe_surf/backend/frontend/assets/star-half-DMNuOefd.js +6 -0
  1515. vibe_surf/backend/frontend/assets/star-off-D_I13W97.js +6 -0
  1516. vibe_surf/backend/frontend/assets/step-back-Ba3vvS1b.js +6 -0
  1517. vibe_surf/backend/frontend/assets/step-forward-tf6_dmSk.js +6 -0
  1518. vibe_surf/backend/frontend/assets/stethoscope-kEGj4Hk2.js +6 -0
  1519. vibe_surf/backend/frontend/assets/sticker-BMrXBzQi.js +6 -0
  1520. vibe_surf/backend/frontend/assets/sticky-note-B6_-_Vk7.js +6 -0
  1521. vibe_surf/backend/frontend/assets/store-ClCC8VsS.js +6 -0
  1522. vibe_surf/backend/frontend/assets/stretch-horizontal-Dfdn4d_v.js +6 -0
  1523. vibe_surf/backend/frontend/assets/stretch-vertical-G91F9Wl8.js +6 -0
  1524. vibe_surf/backend/frontend/assets/strikethrough-DQ1eMtzE.js +6 -0
  1525. vibe_surf/backend/frontend/assets/subscript-B1v5cruw.js +6 -0
  1526. vibe_surf/backend/frontend/assets/sun-Drd6gJu4.js +6 -0
  1527. vibe_surf/backend/frontend/assets/sun-dim-CSbGIP11.js +6 -0
  1528. vibe_surf/backend/frontend/assets/sun-medium-Cownz0gJ.js +6 -0
  1529. vibe_surf/backend/frontend/assets/sun-moon-BgCDmhlw.js +6 -0
  1530. vibe_surf/backend/frontend/assets/sun-snow-B0xowfvd.js +6 -0
  1531. vibe_surf/backend/frontend/assets/sunrise-DkTO7zEY.js +6 -0
  1532. vibe_surf/backend/frontend/assets/sunset-DkKYK75e.js +6 -0
  1533. vibe_surf/backend/frontend/assets/superscript-CBfgJuGP.js +6 -0
  1534. vibe_surf/backend/frontend/assets/swatch-book-DrsAphD2.js +6 -0
  1535. vibe_surf/backend/frontend/assets/swiss-franc-DAYyAzPc.js +6 -0
  1536. vibe_surf/backend/frontend/assets/switch-camera-C7hTq-mz.js +6 -0
  1537. vibe_surf/backend/frontend/assets/sword-BDecpboX.js +6 -0
  1538. vibe_surf/backend/frontend/assets/swords-BjWa4kCQ.js +6 -0
  1539. vibe_surf/backend/frontend/assets/syringe-ClPPE8yd.js +6 -0
  1540. vibe_surf/backend/frontend/assets/table-2-DIGnaXY7.js +6 -0
  1541. vibe_surf/backend/frontend/assets/table-CHxmnA-B.js +6 -0
  1542. vibe_surf/backend/frontend/assets/table-cells-merge-D1zNRVrG.js +6 -0
  1543. vibe_surf/backend/frontend/assets/table-cells-split-CdEYW1Su.js +6 -0
  1544. vibe_surf/backend/frontend/assets/table-columns-split-JoiaUKz3.js +6 -0
  1545. vibe_surf/backend/frontend/assets/table-of-contents-BSpkdcFt.js +6 -0
  1546. vibe_surf/backend/frontend/assets/table-properties-CmoYqW5E.js +6 -0
  1547. vibe_surf/backend/frontend/assets/table-rows-split-B-06ZKqE.js +6 -0
  1548. vibe_surf/backend/frontend/assets/tablet-YvP4PBQR.js +6 -0
  1549. vibe_surf/backend/frontend/assets/tablet-smartphone-BG7aS4OL.js +6 -0
  1550. vibe_surf/backend/frontend/assets/tablets-BVvSHnaS.js +6 -0
  1551. vibe_surf/backend/frontend/assets/tag-Bs9C2NWs.js +6 -0
  1552. vibe_surf/backend/frontend/assets/tags-DEvGZIIh.js +6 -0
  1553. vibe_surf/backend/frontend/assets/tally-1-BjNjbWUj.js +6 -0
  1554. vibe_surf/backend/frontend/assets/tally-2-Bd0nQcFC.js +6 -0
  1555. vibe_surf/backend/frontend/assets/tally-3-DHrPKvJg.js +6 -0
  1556. vibe_surf/backend/frontend/assets/tally-4-DAUwA2aR.js +6 -0
  1557. vibe_surf/backend/frontend/assets/tally-5-CgAN8Y91.js +6 -0
  1558. vibe_surf/backend/frontend/assets/tangent-CRznV78Q.js +6 -0
  1559. vibe_surf/backend/frontend/assets/target-Bj2MJlO6.js +6 -0
  1560. vibe_surf/backend/frontend/assets/telescope-CyRzgTg4.js +6 -0
  1561. vibe_surf/backend/frontend/assets/temp-pat-1-BDqu2wpz.png +0 -0
  1562. vibe_surf/backend/frontend/assets/temp-pat-2-C_RVvOE_.png +0 -0
  1563. vibe_surf/backend/frontend/assets/temp-pat-3-Ci-rp5-q.png +0 -0
  1564. vibe_surf/backend/frontend/assets/temp-pat-m-1-D-qJT-j4.png +0 -0
  1565. vibe_surf/backend/frontend/assets/temp-pat-m-2-BFhrICvh.png +0 -0
  1566. vibe_surf/backend/frontend/assets/temp-pat-m-3-BJIIbDxb.png +0 -0
  1567. vibe_surf/backend/frontend/assets/tent-D1boPMJ_.js +6 -0
  1568. vibe_surf/backend/frontend/assets/tent-tree-DlMlV5UT.js +6 -0
  1569. vibe_surf/backend/frontend/assets/terminal-ByKLrVXr.js +6 -0
  1570. vibe_surf/backend/frontend/assets/test-tube-DjNpqEvy.js +6 -0
  1571. vibe_surf/backend/frontend/assets/test-tube-diagonal-kvKWvVpD.js +6 -0
  1572. vibe_surf/backend/frontend/assets/test-tubes-BUVuvPYq.js +6 -0
  1573. vibe_surf/backend/frontend/assets/text-BaPUPrRB.js +6 -0
  1574. vibe_surf/backend/frontend/assets/text-cursor-DjiJAhIO.js +6 -0
  1575. vibe_surf/backend/frontend/assets/text-cursor-input-DmFbkVcG.js +6 -0
  1576. vibe_surf/backend/frontend/assets/text-quote-DbZhBhba.js +6 -0
  1577. vibe_surf/backend/frontend/assets/text-search-D81mgubi.js +6 -0
  1578. vibe_surf/backend/frontend/assets/text-select-BCYAwryE.js +6 -0
  1579. vibe_surf/backend/frontend/assets/theater-BF8yCQZ3.js +6 -0
  1580. vibe_surf/backend/frontend/assets/thermometer-Dz0qc69z.js +6 -0
  1581. vibe_surf/backend/frontend/assets/thermometer-snowflake-BZ8Fol5x.js +6 -0
  1582. vibe_surf/backend/frontend/assets/thermometer-sun-DgmdNSSx.js +6 -0
  1583. vibe_surf/backend/frontend/assets/thumbs-down-6gCm1bFP.js +6 -0
  1584. vibe_surf/backend/frontend/assets/thumbs-up-BpkAnOkj.js +6 -0
  1585. vibe_surf/backend/frontend/assets/ticket-CZ6VZCic.js +6 -0
  1586. vibe_surf/backend/frontend/assets/ticket-check-CwERJSTS.js +6 -0
  1587. vibe_surf/backend/frontend/assets/ticket-minus-CJ8o42r1.js +6 -0
  1588. vibe_surf/backend/frontend/assets/ticket-percent-D9mgrzai.js +6 -0
  1589. vibe_surf/backend/frontend/assets/ticket-plus-Bf_MplVa.js +6 -0
  1590. vibe_surf/backend/frontend/assets/ticket-slash-CNukz3dP.js +6 -0
  1591. vibe_surf/backend/frontend/assets/ticket-x-DAGtm4Nf.js +6 -0
  1592. vibe_surf/backend/frontend/assets/tickets-Dlm-Pd3N.js +6 -0
  1593. vibe_surf/backend/frontend/assets/tickets-plane-C4lmqLQq.js +6 -0
  1594. vibe_surf/backend/frontend/assets/timer-0lTpmgXp.js +6 -0
  1595. vibe_surf/backend/frontend/assets/timer-off-BGqRyv1S.js +6 -0
  1596. vibe_surf/backend/frontend/assets/timer-reset-DdhKPXcy.js +6 -0
  1597. vibe_surf/backend/frontend/assets/toggle-left-De2ASTKW.js +6 -0
  1598. vibe_surf/backend/frontend/assets/toggle-right-NfpJqTaq.js +6 -0
  1599. vibe_surf/backend/frontend/assets/toilet-DcJuMKzv.js +6 -0
  1600. vibe_surf/backend/frontend/assets/tornado-BannseS-.js +6 -0
  1601. vibe_surf/backend/frontend/assets/torus-CxsKBH8D.js +6 -0
  1602. vibe_surf/backend/frontend/assets/touchpad-ENZl5mwQ.js +6 -0
  1603. vibe_surf/backend/frontend/assets/touchpad-off-Bs9XazIZ.js +6 -0
  1604. vibe_surf/backend/frontend/assets/tower-control-DOH63Gyd.js +6 -0
  1605. vibe_surf/backend/frontend/assets/toy-brick-CK9szegV.js +6 -0
  1606. vibe_surf/backend/frontend/assets/tractor-C4edkneR.js +6 -0
  1607. vibe_surf/backend/frontend/assets/traffic-cone-B7xJNOdC.js +6 -0
  1608. vibe_surf/backend/frontend/assets/train-front-DPkfW4fH.js +6 -0
  1609. vibe_surf/backend/frontend/assets/train-front-tunnel-Dc6i8ZmW.js +6 -0
  1610. vibe_surf/backend/frontend/assets/train-track-DFRUcPF4.js +6 -0
  1611. vibe_surf/backend/frontend/assets/tram-front-DnSEWr26.js +6 -0
  1612. vibe_surf/backend/frontend/assets/transgender-CwbUC-T0.js +6 -0
  1613. vibe_surf/backend/frontend/assets/trash-DSMPsj08.js +6 -0
  1614. vibe_surf/backend/frontend/assets/tree-deciduous-CMyD2rgs.js +6 -0
  1615. vibe_surf/backend/frontend/assets/tree-palm-ClbWCueR.js +6 -0
  1616. vibe_surf/backend/frontend/assets/tree-pine-CxCMH7RZ.js +6 -0
  1617. vibe_surf/backend/frontend/assets/trees-DeERVvec.js +6 -0
  1618. vibe_surf/backend/frontend/assets/trello-DwQeyG2C.js +6 -0
  1619. vibe_surf/backend/frontend/assets/trending-down-CuQxq0A3.js +6 -0
  1620. vibe_surf/backend/frontend/assets/trending-up-BDSGIJWY.js +6 -0
  1621. vibe_surf/backend/frontend/assets/trending-up-down-CSb_7X-_.js +6 -0
  1622. vibe_surf/backend/frontend/assets/triangle-Cc8gzj2X.js +6 -0
  1623. vibe_surf/backend/frontend/assets/triangle-alert-CzfSlrIp.js +6 -0
  1624. vibe_surf/backend/frontend/assets/triangle-dashed-CSlIdQSl.js +6 -0
  1625. vibe_surf/backend/frontend/assets/triangle-right-BIlbKFDC.js +6 -0
  1626. vibe_surf/backend/frontend/assets/trophy-CIFZUGnX.js +6 -0
  1627. vibe_surf/backend/frontend/assets/truck-Id_mHUOq.js +6 -0
  1628. vibe_surf/backend/frontend/assets/truck-electric-WgMKZnOH.js +6 -0
  1629. vibe_surf/backend/frontend/assets/turtle-0ek05Orw.js +6 -0
  1630. vibe_surf/backend/frontend/assets/tv-DLVWDmzW.js +6 -0
  1631. vibe_surf/backend/frontend/assets/tv-minimal-E0w-pb-R.js +6 -0
  1632. vibe_surf/backend/frontend/assets/tv-minimal-play-C8eivgTI.js +6 -0
  1633. vibe_surf/backend/frontend/assets/twitch-D6updjnG.js +6 -0
  1634. vibe_surf/backend/frontend/assets/twitter-Der_Ih7y.js +6 -0
  1635. vibe_surf/backend/frontend/assets/type-BZeEwGKH.js +6 -0
  1636. vibe_surf/backend/frontend/assets/type-outline-WvuVShMD.js +6 -0
  1637. vibe_surf/backend/frontend/assets/umbrella-BFiE5bFk.js +6 -0
  1638. vibe_surf/backend/frontend/assets/umbrella-off-CQKtt_HS.js +6 -0
  1639. vibe_surf/backend/frontend/assets/underline-eH-gfEgl.js +6 -0
  1640. vibe_surf/backend/frontend/assets/undo-2-CGpVoxxS.js +6 -0
  1641. vibe_surf/backend/frontend/assets/undo-BAkkNYmN.js +6 -0
  1642. vibe_surf/backend/frontend/assets/undo-dot-fxz9ZoUf.js +6 -0
  1643. vibe_surf/backend/frontend/assets/unfold-horizontal-Bz6GASed.js +6 -0
  1644. vibe_surf/backend/frontend/assets/unfold-vertical-DVuawiHD.js +6 -0
  1645. vibe_surf/backend/frontend/assets/ungroup-DZlCBfu8.js +6 -0
  1646. vibe_surf/backend/frontend/assets/university-DQQJPlHM.js +6 -0
  1647. vibe_surf/backend/frontend/assets/unlink-2-Bbf62oJC.js +6 -0
  1648. vibe_surf/backend/frontend/assets/unlink-rRnEYNBH.js +6 -0
  1649. vibe_surf/backend/frontend/assets/unplug-BE6bAKlE.js +6 -0
  1650. vibe_surf/backend/frontend/assets/upload-DgbNBlk6.js +6 -0
  1651. vibe_surf/backend/frontend/assets/usb-BsbOhQkP.js +6 -0
  1652. vibe_surf/backend/frontend/assets/use-post-add-user-s3pEdarP.js +1 -0
  1653. vibe_surf/backend/frontend/assets/user-C7_N9vjw.js +6 -0
  1654. vibe_surf/backend/frontend/assets/user-check-D85AcwGt.js +6 -0
  1655. vibe_surf/backend/frontend/assets/user-cog-BUSZoKWO.js +6 -0
  1656. vibe_surf/backend/frontend/assets/user-lock-DrG5znDk.js +6 -0
  1657. vibe_surf/backend/frontend/assets/user-minus-CjVZSxhC.js +6 -0
  1658. vibe_surf/backend/frontend/assets/user-pen-BllWYNRg.js +6 -0
  1659. vibe_surf/backend/frontend/assets/user-plus-Ct840ALN.js +6 -0
  1660. vibe_surf/backend/frontend/assets/user-round-D6DnOG0E.js +6 -0
  1661. vibe_surf/backend/frontend/assets/user-round-check-Ci15Wbid.js +6 -0
  1662. vibe_surf/backend/frontend/assets/user-round-cog-SrRmnnrG.js +6 -0
  1663. vibe_surf/backend/frontend/assets/user-round-minus-CZKo0fkN.js +6 -0
  1664. vibe_surf/backend/frontend/assets/user-round-pen-DQ88K1gY.js +6 -0
  1665. vibe_surf/backend/frontend/assets/user-round-plus-BtBHwnQH.js +6 -0
  1666. vibe_surf/backend/frontend/assets/user-round-search-mZx8k3ks.js +6 -0
  1667. vibe_surf/backend/frontend/assets/user-round-x-4MvMTCpy.js +6 -0
  1668. vibe_surf/backend/frontend/assets/user-search-CkEhATdm.js +6 -0
  1669. vibe_surf/backend/frontend/assets/user-x-DufZCLiX.js +6 -0
  1670. vibe_surf/backend/frontend/assets/users-DgOAHdb7.js +6 -0
  1671. vibe_surf/backend/frontend/assets/users-round-Bj4Zqvjj.js +6 -0
  1672. vibe_surf/backend/frontend/assets/utensils-CcfYVeqi.js +6 -0
  1673. vibe_surf/backend/frontend/assets/utensils-crossed-Daq7-gMB.js +6 -0
  1674. vibe_surf/backend/frontend/assets/utility-pole-BRYxk_9o.js +6 -0
  1675. vibe_surf/backend/frontend/assets/vanilla-picker-B6E6ObS_.js +8 -0
  1676. vibe_surf/backend/frontend/assets/variable-CQb_DxMu.js +6 -0
  1677. vibe_surf/backend/frontend/assets/vault-D7etPPcB.js +6 -0
  1678. vibe_surf/backend/frontend/assets/vegan-DhjhKnZM.js +6 -0
  1679. vibe_surf/backend/frontend/assets/venetian-mask-DGDNvUAT.js +6 -0
  1680. vibe_surf/backend/frontend/assets/venus-and-mars-BEW94wvT.js +6 -0
  1681. vibe_surf/backend/frontend/assets/venus-u9B-gdcz.js +6 -0
  1682. vibe_surf/backend/frontend/assets/vibrate-off-GMm1P59r.js +6 -0
  1683. vibe_surf/backend/frontend/assets/vibrate-ztsKQUo9.js +6 -0
  1684. vibe_surf/backend/frontend/assets/video-BRU-KCdj.js +6 -0
  1685. vibe_surf/backend/frontend/assets/video-off-UBhDkXSa.js +6 -0
  1686. vibe_surf/backend/frontend/assets/videotape-BnpqC2PU.js +6 -0
  1687. vibe_surf/backend/frontend/assets/view-SPlXqa2E.js +6 -0
  1688. vibe_surf/backend/frontend/assets/voicemail-CslFUibB.js +6 -0
  1689. vibe_surf/backend/frontend/assets/volleyball-YmSfEYj0.js +6 -0
  1690. vibe_surf/backend/frontend/assets/volume-1-DzSvYJXy.js +6 -0
  1691. vibe_surf/backend/frontend/assets/volume-2-CKYHuo73.js +6 -0
  1692. vibe_surf/backend/frontend/assets/volume-D2WpTg4b.js +6 -0
  1693. vibe_surf/backend/frontend/assets/volume-off-CXmQvaUO.js +6 -0
  1694. vibe_surf/backend/frontend/assets/volume-x-Dl4xNI1D.js +6 -0
  1695. vibe_surf/backend/frontend/assets/vote-DVUnQCxF.js +6 -0
  1696. vibe_surf/backend/frontend/assets/wallet-D9F1dFbt.js +6 -0
  1697. vibe_surf/backend/frontend/assets/wallet-cards-DkIuM2Gu.js +6 -0
  1698. vibe_surf/backend/frontend/assets/wallet-minimal-CUUsXAfP.js +6 -0
  1699. vibe_surf/backend/frontend/assets/wallpaper-BHliG6AQ.js +6 -0
  1700. vibe_surf/backend/frontend/assets/wand-sparkles-BA8i-2_I.js +6 -0
  1701. vibe_surf/backend/frontend/assets/wand-u2EI2dL2.js +6 -0
  1702. vibe_surf/backend/frontend/assets/warehouse-CxDEgPyp.js +6 -0
  1703. vibe_surf/backend/frontend/assets/washing-machine-CYoqAbT7.js +6 -0
  1704. vibe_surf/backend/frontend/assets/watch-eNq5oUsh.js +6 -0
  1705. vibe_surf/backend/frontend/assets/waves-Bs6o5G71.js +6 -0
  1706. vibe_surf/backend/frontend/assets/waves-ladder-0t2iIHt8.js +6 -0
  1707. vibe_surf/backend/frontend/assets/waypoints-DyScJk3j.js +6 -0
  1708. vibe_surf/backend/frontend/assets/webcam-BFZUWYUw.js +6 -0
  1709. vibe_surf/backend/frontend/assets/webhook-CMDaI4yk.js +6 -0
  1710. vibe_surf/backend/frontend/assets/webhook-off-DQzE1oMX.js +6 -0
  1711. vibe_surf/backend/frontend/assets/weight-g0EeSmAx.js +6 -0
  1712. vibe_surf/backend/frontend/assets/wheat-hvVtAPlc.js +6 -0
  1713. vibe_surf/backend/frontend/assets/wheat-off-6d_oRYIW.js +6 -0
  1714. vibe_surf/backend/frontend/assets/whole-word-CMHbYgQ-.js +6 -0
  1715. vibe_surf/backend/frontend/assets/wifi-CRHAo2Lb.js +6 -0
  1716. vibe_surf/backend/frontend/assets/wifi-high-BTElqamm.js +6 -0
  1717. vibe_surf/backend/frontend/assets/wifi-low-BFBJvE2C.js +6 -0
  1718. vibe_surf/backend/frontend/assets/wifi-off-DL1S7f79.js +6 -0
  1719. vibe_surf/backend/frontend/assets/wifi-pen-FkLT18-y.js +6 -0
  1720. vibe_surf/backend/frontend/assets/wifi-zero-koQAfMYN.js +6 -0
  1721. vibe_surf/backend/frontend/assets/wind-CgQDM8yC.js +6 -0
  1722. vibe_surf/backend/frontend/assets/wind-arrow-down-ByQJVZNf.js +6 -0
  1723. vibe_surf/backend/frontend/assets/wine-kngKIYWK.js +6 -0
  1724. vibe_surf/backend/frontend/assets/wine-off-DaVVtkyG.js +6 -0
  1725. vibe_surf/backend/frontend/assets/workflow-BBHA5vqf.js +6 -0
  1726. vibe_surf/backend/frontend/assets/worm-D8rJAL-s.js +6 -0
  1727. vibe_surf/backend/frontend/assets/wrap-text-s4fkGxHY.js +6 -0
  1728. vibe_surf/backend/frontend/assets/wrench-CYzg6B-q.js +6 -0
  1729. vibe_surf/backend/frontend/assets/youtube-BIzMVpJA.js +6 -0
  1730. vibe_surf/backend/frontend/assets/zap-nyAdqt4o.js +6 -0
  1731. vibe_surf/backend/frontend/assets/zap-off-Aii1CEgj.js +6 -0
  1732. vibe_surf/backend/frontend/assets/zoom-in-BNWeSenu.js +6 -0
  1733. vibe_surf/backend/frontend/assets/zoom-out-Bd2vIq2c.js +6 -0
  1734. vibe_surf/backend/frontend/favicon.ico +0 -0
  1735. vibe_surf/backend/frontend/index.html +24 -0
  1736. vibe_surf/backend/frontend/manifest.json +31 -0
  1737. vibe_surf/backend/llm_config.py +20 -4
  1738. vibe_surf/backend/main.py +705 -158
  1739. vibe_surf/backend/shared_state.py +366 -25
  1740. vibe_surf/backend/utils/llm_factory.py +8 -0
  1741. vibe_surf/backend/utils/utils.py +1 -1
  1742. vibe_surf/browser/agen_browser_profile.py +5 -5
  1743. vibe_surf/browser/agent_browser_session.py +87 -98
  1744. vibe_surf/browser/browser_manager.py +5 -4
  1745. vibe_surf/browser/find_page_element.py +1100 -0
  1746. vibe_surf/browser/page_operations.py +222 -0
  1747. vibe_surf/browser/watchdogs/dom_watchdog.py +11 -2
  1748. vibe_surf/chrome_extension/background.js +15 -5
  1749. vibe_surf/chrome_extension/config.js +3 -2
  1750. vibe_surf/chrome_extension/manifest.json +23 -8
  1751. vibe_surf/chrome_extension/scripts/api-client.js +134 -11
  1752. vibe_surf/chrome_extension/scripts/settings-general.js +513 -0
  1753. vibe_surf/chrome_extension/scripts/settings-integrations.js +998 -0
  1754. vibe_surf/chrome_extension/scripts/settings-manager.js +96 -2707
  1755. vibe_surf/chrome_extension/scripts/settings-profiles.js +1330 -0
  1756. vibe_surf/chrome_extension/scripts/settings-workflow.js +2911 -0
  1757. vibe_surf/chrome_extension/scripts/ui-manager.js +631 -506
  1758. vibe_surf/chrome_extension/scripts/version.js +3 -0
  1759. vibe_surf/chrome_extension/sidepanel.html +512 -7
  1760. vibe_surf/chrome_extension/styles/components.css +146 -0
  1761. vibe_surf/chrome_extension/styles/layout.css +2 -0
  1762. vibe_surf/chrome_extension/styles/settings-integrations.css +35 -17
  1763. vibe_surf/chrome_extension/styles/settings-workflow.css +2347 -0
  1764. vibe_surf/cli.py +3 -0
  1765. vibe_surf/langflow/__init__.py +0 -0
  1766. vibe_surf/langflow/__main__.py +954 -0
  1767. vibe_surf/langflow/alembic/README +1 -0
  1768. vibe_surf/langflow/alembic/env.py +124 -0
  1769. vibe_surf/langflow/alembic/script.py.mako +31 -0
  1770. vibe_surf/langflow/alembic/versions/006b3990db50_add_unique_constraints.py +66 -0
  1771. vibe_surf/langflow/alembic/versions/012fb73ac359_add_folder_table.py +82 -0
  1772. vibe_surf/langflow/alembic/versions/0882f9657f22_encrypt_existing_mcp_auth_settings_.py +122 -0
  1773. vibe_surf/langflow/alembic/versions/0ae3a2674f32_update_the_columns_that_need_to_change_.py +71 -0
  1774. vibe_surf/langflow/alembic/versions/0b8757876a7c_.py +32 -0
  1775. vibe_surf/langflow/alembic/versions/0d60fcbd4e8e_create_vertex_builds_table.py +51 -0
  1776. vibe_surf/langflow/alembic/versions/1a110b568907_replace_credential_table_with_variable.py +66 -0
  1777. vibe_surf/langflow/alembic/versions/1b8b740a6fa3_remove_fk_constraint_in_message_.py +337 -0
  1778. vibe_surf/langflow/alembic/versions/1c79524817ed_add_unique_constraints_per_user_in_.py +43 -0
  1779. vibe_surf/langflow/alembic/versions/1cb603706752_modify_uniqueness_constraint_on_file_.py +279 -0
  1780. vibe_surf/langflow/alembic/versions/1d90f8a0efe1_update_description_columns_type.py +71 -0
  1781. vibe_surf/langflow/alembic/versions/1eab2c3eb45e_event_error.py +53 -0
  1782. vibe_surf/langflow/alembic/versions/1ef9c4f3765d_.py +54 -0
  1783. vibe_surf/langflow/alembic/versions/1f4d6df60295_add_default_fields_column.py +43 -0
  1784. vibe_surf/langflow/alembic/versions/260dbcc8b680_adds_tables.py +151 -0
  1785. vibe_surf/langflow/alembic/versions/29fe8f1f806b_add_missing_index.py +44 -0
  1786. vibe_surf/langflow/alembic/versions/2ac71eb9c3ae_adds_credential_table.py +55 -0
  1787. vibe_surf/langflow/alembic/versions/3162e83e485f_add_auth_settings_to_folder_and_merge.py +58 -0
  1788. vibe_surf/langflow/alembic/versions/3bb0ddf32dfb_add_unique_constraints_per_user_in_flow_.py +55 -0
  1789. vibe_surf/langflow/alembic/versions/4e5980a44eaa_fix_date_times_again.py +124 -0
  1790. vibe_surf/langflow/alembic/versions/58b28437a398_modify_nullable.py +66 -0
  1791. vibe_surf/langflow/alembic/versions/5ace73a7f223_new_remove_table_upgrade_op.py +39 -0
  1792. vibe_surf/langflow/alembic/versions/631faacf5da2_add_webhook_columns.py +45 -0
  1793. vibe_surf/langflow/alembic/versions/63b9c451fd30_add_icon_and_icon_bg_color_to_flow.py +50 -0
  1794. vibe_surf/langflow/alembic/versions/66f72f04a1de_add_mcp_support_with_project_settings_.py +54 -0
  1795. vibe_surf/langflow/alembic/versions/67cc006d50bf_add_profile_image_column.py +57 -0
  1796. vibe_surf/langflow/alembic/versions/6e7b581b5648_fix_nullable.py +59 -0
  1797. vibe_surf/langflow/alembic/versions/7843803a87b5_store_updates.py +55 -0
  1798. vibe_surf/langflow/alembic/versions/79e675cb6752_change_datetime_type.py +124 -0
  1799. vibe_surf/langflow/alembic/versions/7d2162acc8b2_adds_updated_at_and_folder_cols.py +74 -0
  1800. vibe_surf/langflow/alembic/versions/90be8e2ed91e_create_transactions_table.py +51 -0
  1801. vibe_surf/langflow/alembic/versions/93e2705fa8d6_add_column_save_path_to_flow.py +43 -0
  1802. vibe_surf/langflow/alembic/versions/a72f5cf9c2f9_add_endpoint_name_col.py +52 -0
  1803. vibe_surf/langflow/alembic/versions/b2fa308044b5_add_unique_constraints.py +101 -0
  1804. vibe_surf/langflow/alembic/versions/bc2f01c40e4a_new_fixes.py +73 -0
  1805. vibe_surf/langflow/alembic/versions/c153816fd85f_set_name_and_value_to_not_nullable.py +52 -0
  1806. vibe_surf/langflow/alembic/versions/d066bfd22890_add_message_table.py +52 -0
  1807. vibe_surf/langflow/alembic/versions/d2d475a1f7c0_add_tags_column_to_flow.py +41 -0
  1808. vibe_surf/langflow/alembic/versions/d37bc4322900_drop_single_constraint_on_files_name_.py +169 -0
  1809. vibe_surf/langflow/alembic/versions/d3dbf656a499_add_gradient_column_in_flow.py +41 -0
  1810. vibe_surf/langflow/alembic/versions/d9a6ea21edcd_rename_default_folder.py +75 -0
  1811. vibe_surf/langflow/alembic/versions/dd9e0804ebd1_add_v2_file_table.py +49 -0
  1812. vibe_surf/langflow/alembic/versions/e3162c1804e6_add_persistent_locked_state.py +43 -0
  1813. vibe_surf/langflow/alembic/versions/e3bc869fa272_fix_nullable.py +68 -0
  1814. vibe_surf/langflow/alembic/versions/e56d87f8994a_add_optins_column_to_user.py +38 -0
  1815. vibe_surf/langflow/alembic/versions/e5a65ecff2cd_nullable_in_vertex_build.py +49 -0
  1816. vibe_surf/langflow/alembic/versions/eb5866d51fd2_change_columns_to_be_nullable.py +31 -0
  1817. vibe_surf/langflow/alembic/versions/eb5e72293a8e_add_error_and_edit_flags_to_message.py +49 -0
  1818. vibe_surf/langflow/alembic/versions/f3b2d1f1002d_add_column_access_type_to_flow.py +37 -0
  1819. vibe_surf/langflow/alembic/versions/f5ee9749d1a6_user_id_can_be_null_in_flow.py +42 -0
  1820. vibe_surf/langflow/alembic/versions/fd531f8868b1_fix_credential_table.py +60 -0
  1821. vibe_surf/langflow/alembic.ini +113 -0
  1822. vibe_surf/langflow/api/__init__.py +5 -0
  1823. vibe_surf/langflow/api/build.py +557 -0
  1824. vibe_surf/langflow/api/disconnect.py +31 -0
  1825. vibe_surf/langflow/api/health_check_router.py +65 -0
  1826. vibe_surf/langflow/api/limited_background_tasks.py +29 -0
  1827. vibe_surf/langflow/api/log_router.py +103 -0
  1828. vibe_surf/langflow/api/router.py +63 -0
  1829. vibe_surf/langflow/api/schemas.py +14 -0
  1830. vibe_surf/langflow/api/utils.py +381 -0
  1831. vibe_surf/langflow/api/v1/__init__.py +41 -0
  1832. vibe_surf/langflow/api/v1/api_key.py +88 -0
  1833. vibe_surf/langflow/api/v1/auth_helpers.py +75 -0
  1834. vibe_surf/langflow/api/v1/base.py +50 -0
  1835. vibe_surf/langflow/api/v1/callback.py +136 -0
  1836. vibe_surf/langflow/api/v1/chat.py +675 -0
  1837. vibe_surf/langflow/api/v1/endpoints.py +800 -0
  1838. vibe_surf/langflow/api/v1/files.py +193 -0
  1839. vibe_surf/langflow/api/v1/flows.py +579 -0
  1840. vibe_surf/langflow/api/v1/folders.py +95 -0
  1841. vibe_surf/langflow/api/v1/knowledge_bases.py +452 -0
  1842. vibe_surf/langflow/api/v1/login.py +166 -0
  1843. vibe_surf/langflow/api/v1/mcp.py +137 -0
  1844. vibe_surf/langflow/api/v1/mcp_projects.py +1230 -0
  1845. vibe_surf/langflow/api/v1/mcp_utils.py +348 -0
  1846. vibe_surf/langflow/api/v1/monitor.py +203 -0
  1847. vibe_surf/langflow/api/v1/openai_responses.py +561 -0
  1848. vibe_surf/langflow/api/v1/projects.py +447 -0
  1849. vibe_surf/langflow/api/v1/schemas.py +488 -0
  1850. vibe_surf/langflow/api/v1/starter_projects.py +17 -0
  1851. vibe_surf/langflow/api/v1/store.py +182 -0
  1852. vibe_surf/langflow/api/v1/users.py +146 -0
  1853. vibe_surf/langflow/api/v1/validate.py +48 -0
  1854. vibe_surf/langflow/api/v1/variable.py +106 -0
  1855. vibe_surf/langflow/api/v1/voice_mode.py +1375 -0
  1856. vibe_surf/langflow/api/v2/__init__.py +7 -0
  1857. vibe_surf/langflow/api/v2/files.py +532 -0
  1858. vibe_surf/langflow/api/v2/mcp.py +330 -0
  1859. vibe_surf/langflow/base/__init__.py +0 -0
  1860. vibe_surf/langflow/base/agents/__init__.py +0 -0
  1861. vibe_surf/langflow/base/agents/agent.py +267 -0
  1862. vibe_surf/langflow/base/agents/callback.py +130 -0
  1863. vibe_surf/langflow/base/agents/context.py +109 -0
  1864. vibe_surf/langflow/base/agents/crewai/__init__.py +0 -0
  1865. vibe_surf/langflow/base/agents/crewai/crew.py +231 -0
  1866. vibe_surf/langflow/base/agents/crewai/tasks.py +12 -0
  1867. vibe_surf/langflow/base/agents/default_prompts.py +23 -0
  1868. vibe_surf/langflow/base/agents/errors.py +15 -0
  1869. vibe_surf/langflow/base/agents/events.py +346 -0
  1870. vibe_surf/langflow/base/agents/utils.py +205 -0
  1871. vibe_surf/langflow/base/astra_assistants/__init__.py +0 -0
  1872. vibe_surf/langflow/base/astra_assistants/util.py +171 -0
  1873. vibe_surf/langflow/base/chains/__init__.py +0 -0
  1874. vibe_surf/langflow/base/chains/model.py +19 -0
  1875. vibe_surf/langflow/base/composio/__init__.py +0 -0
  1876. vibe_surf/langflow/base/composio/composio_base.py +1301 -0
  1877. vibe_surf/langflow/base/compressors/__init__.py +0 -0
  1878. vibe_surf/langflow/base/compressors/model.py +60 -0
  1879. vibe_surf/langflow/base/constants.py +46 -0
  1880. vibe_surf/langflow/base/curl/__init__.py +0 -0
  1881. vibe_surf/langflow/base/curl/parse.py +188 -0
  1882. vibe_surf/langflow/base/data/__init__.py +5 -0
  1883. vibe_surf/langflow/base/data/base_file.py +698 -0
  1884. vibe_surf/langflow/base/data/docling_utils.py +280 -0
  1885. vibe_surf/langflow/base/data/utils.py +198 -0
  1886. vibe_surf/langflow/base/document_transformers/__init__.py +0 -0
  1887. vibe_surf/langflow/base/document_transformers/model.py +43 -0
  1888. vibe_surf/langflow/base/embeddings/__init__.py +0 -0
  1889. vibe_surf/langflow/base/embeddings/aiml_embeddings.py +62 -0
  1890. vibe_surf/langflow/base/embeddings/model.py +26 -0
  1891. vibe_surf/langflow/base/flow_processing/__init__.py +0 -0
  1892. vibe_surf/langflow/base/flow_processing/utils.py +86 -0
  1893. vibe_surf/langflow/base/huggingface/__init__.py +0 -0
  1894. vibe_surf/langflow/base/huggingface/model_bridge.py +133 -0
  1895. vibe_surf/langflow/base/io/__init__.py +0 -0
  1896. vibe_surf/langflow/base/io/chat.py +20 -0
  1897. vibe_surf/langflow/base/io/text.py +22 -0
  1898. vibe_surf/langflow/base/knowledge_bases/__init__.py +0 -0
  1899. vibe_surf/langflow/base/knowledge_bases/knowledge_base_utils.py +137 -0
  1900. vibe_surf/langflow/base/langchain_utilities/__init__.py +0 -0
  1901. vibe_surf/langflow/base/langchain_utilities/model.py +35 -0
  1902. vibe_surf/langflow/base/langchain_utilities/spider_constants.py +1 -0
  1903. vibe_surf/langflow/base/langwatch/__init__.py +0 -0
  1904. vibe_surf/langflow/base/langwatch/utils.py +18 -0
  1905. vibe_surf/langflow/base/mcp/__init__.py +0 -0
  1906. vibe_surf/langflow/base/mcp/constants.py +2 -0
  1907. vibe_surf/langflow/base/mcp/util.py +1544 -0
  1908. vibe_surf/langflow/base/memory/__init__.py +0 -0
  1909. vibe_surf/langflow/base/memory/memory.py +49 -0
  1910. vibe_surf/langflow/base/memory/model.py +38 -0
  1911. vibe_surf/langflow/base/models/__init__.py +3 -0
  1912. vibe_surf/langflow/base/models/aiml_constants.py +51 -0
  1913. vibe_surf/langflow/base/models/anthropic_constants.py +49 -0
  1914. vibe_surf/langflow/base/models/aws_constants.py +151 -0
  1915. vibe_surf/langflow/base/models/chat_result.py +76 -0
  1916. vibe_surf/langflow/base/models/google_generative_ai_constants.py +70 -0
  1917. vibe_surf/langflow/base/models/groq_constants.py +134 -0
  1918. vibe_surf/langflow/base/models/model.py +375 -0
  1919. vibe_surf/langflow/base/models/model_input_constants.py +299 -0
  1920. vibe_surf/langflow/base/models/model_metadata.py +41 -0
  1921. vibe_surf/langflow/base/models/model_utils.py +8 -0
  1922. vibe_surf/langflow/base/models/novita_constants.py +35 -0
  1923. vibe_surf/langflow/base/models/ollama_constants.py +49 -0
  1924. vibe_surf/langflow/base/models/openai_constants.py +121 -0
  1925. vibe_surf/langflow/base/models/sambanova_constants.py +18 -0
  1926. vibe_surf/langflow/base/processing/__init__.py +0 -0
  1927. vibe_surf/langflow/base/prompts/__init__.py +0 -0
  1928. vibe_surf/langflow/base/prompts/api_utils.py +224 -0
  1929. vibe_surf/langflow/base/prompts/utils.py +61 -0
  1930. vibe_surf/langflow/base/textsplitters/__init__.py +0 -0
  1931. vibe_surf/langflow/base/textsplitters/model.py +28 -0
  1932. vibe_surf/langflow/base/tools/__init__.py +0 -0
  1933. vibe_surf/langflow/base/tools/base.py +26 -0
  1934. vibe_surf/langflow/base/tools/component_tool.py +324 -0
  1935. vibe_surf/langflow/base/tools/constants.py +49 -0
  1936. vibe_surf/langflow/base/tools/flow_tool.py +131 -0
  1937. vibe_surf/langflow/base/tools/run_flow.py +227 -0
  1938. vibe_surf/langflow/base/vectorstores/__init__.py +0 -0
  1939. vibe_surf/langflow/base/vectorstores/model.py +193 -0
  1940. vibe_surf/langflow/base/vectorstores/utils.py +22 -0
  1941. vibe_surf/langflow/base/vectorstores/vector_store_connection_decorator.py +52 -0
  1942. vibe_surf/langflow/cli/__init__.py +0 -0
  1943. vibe_surf/langflow/cli/progress.py +233 -0
  1944. vibe_surf/langflow/components/FAISS/__init__.py +34 -0
  1945. vibe_surf/langflow/components/FAISS/faiss.py +111 -0
  1946. vibe_surf/langflow/components/Notion/__init__.py +19 -0
  1947. vibe_surf/langflow/components/Notion/add_content_to_page.py +269 -0
  1948. vibe_surf/langflow/components/Notion/create_page.py +94 -0
  1949. vibe_surf/langflow/components/Notion/list_database_properties.py +68 -0
  1950. vibe_surf/langflow/components/Notion/list_pages.py +122 -0
  1951. vibe_surf/langflow/components/Notion/list_users.py +77 -0
  1952. vibe_surf/langflow/components/Notion/page_content_viewer.py +93 -0
  1953. vibe_surf/langflow/components/Notion/search.py +111 -0
  1954. vibe_surf/langflow/components/Notion/update_page_property.py +114 -0
  1955. vibe_surf/langflow/components/__init__.py +270 -0
  1956. vibe_surf/langflow/components/_importing.py +37 -0
  1957. vibe_surf/langflow/components/agentql/__init__.py +3 -0
  1958. vibe_surf/langflow/components/agentql/agentql_api.py +151 -0
  1959. vibe_surf/langflow/components/agents/__init__.py +4 -0
  1960. vibe_surf/langflow/components/agents/agent.py +608 -0
  1961. vibe_surf/langflow/components/agents/mcp_component.py +511 -0
  1962. vibe_surf/langflow/components/aiml/__init__.py +37 -0
  1963. vibe_surf/langflow/components/aiml/aiml.py +115 -0
  1964. vibe_surf/langflow/components/aiml/aiml_embeddings.py +37 -0
  1965. vibe_surf/langflow/components/amazon/__init__.py +36 -0
  1966. vibe_surf/langflow/components/amazon/amazon_bedrock_embedding.py +109 -0
  1967. vibe_surf/langflow/components/amazon/amazon_bedrock_model.py +124 -0
  1968. vibe_surf/langflow/components/amazon/s3_bucket_uploader.py +211 -0
  1969. vibe_surf/langflow/components/anthropic/__init__.py +34 -0
  1970. vibe_surf/langflow/components/anthropic/anthropic.py +187 -0
  1971. vibe_surf/langflow/components/apify/__init__.py +5 -0
  1972. vibe_surf/langflow/components/apify/apify_actor.py +325 -0
  1973. vibe_surf/langflow/components/arxiv/__init__.py +3 -0
  1974. vibe_surf/langflow/components/arxiv/arxiv.py +163 -0
  1975. vibe_surf/langflow/components/assemblyai/__init__.py +46 -0
  1976. vibe_surf/langflow/components/assemblyai/assemblyai_get_subtitles.py +83 -0
  1977. vibe_surf/langflow/components/assemblyai/assemblyai_lemur.py +183 -0
  1978. vibe_surf/langflow/components/assemblyai/assemblyai_list_transcripts.py +95 -0
  1979. vibe_surf/langflow/components/assemblyai/assemblyai_poll_transcript.py +72 -0
  1980. vibe_surf/langflow/components/assemblyai/assemblyai_start_transcript.py +188 -0
  1981. vibe_surf/langflow/components/azure/__init__.py +37 -0
  1982. vibe_surf/langflow/components/azure/azure_openai.py +95 -0
  1983. vibe_surf/langflow/components/azure/azure_openai_embeddings.py +83 -0
  1984. vibe_surf/langflow/components/baidu/__init__.py +32 -0
  1985. vibe_surf/langflow/components/baidu/baidu_qianfan_chat.py +113 -0
  1986. vibe_surf/langflow/components/bing/__init__.py +3 -0
  1987. vibe_surf/langflow/components/bing/bing_search_api.py +61 -0
  1988. vibe_surf/langflow/components/cassandra/__init__.py +40 -0
  1989. vibe_surf/langflow/components/cassandra/cassandra.py +264 -0
  1990. vibe_surf/langflow/components/cassandra/cassandra_chat.py +92 -0
  1991. vibe_surf/langflow/components/cassandra/cassandra_graph.py +238 -0
  1992. vibe_surf/langflow/components/chains/__init__.py +0 -0
  1993. vibe_surf/langflow/components/chroma/__init__.py +34 -0
  1994. vibe_surf/langflow/components/chroma/chroma.py +169 -0
  1995. vibe_surf/langflow/components/cleanlab/__init__.py +40 -0
  1996. vibe_surf/langflow/components/cleanlab/cleanlab_evaluator.py +157 -0
  1997. vibe_surf/langflow/components/cleanlab/cleanlab_rag_evaluator.py +254 -0
  1998. vibe_surf/langflow/components/cleanlab/cleanlab_remediator.py +131 -0
  1999. vibe_surf/langflow/components/clickhouse/__init__.py +34 -0
  2000. vibe_surf/langflow/components/clickhouse/clickhouse.py +135 -0
  2001. vibe_surf/langflow/components/cloudflare/__init__.py +32 -0
  2002. vibe_surf/langflow/components/cloudflare/cloudflare.py +81 -0
  2003. vibe_surf/langflow/components/cohere/__init__.py +40 -0
  2004. vibe_surf/langflow/components/cohere/cohere_embeddings.py +81 -0
  2005. vibe_surf/langflow/components/cohere/cohere_models.py +46 -0
  2006. vibe_surf/langflow/components/cohere/cohere_rerank.py +51 -0
  2007. vibe_surf/langflow/components/composio/__init__.py +73 -0
  2008. vibe_surf/langflow/components/composio/composio_api.py +279 -0
  2009. vibe_surf/langflow/components/composio/dropbox_compnent.py +11 -0
  2010. vibe_surf/langflow/components/composio/github_composio.py +11 -0
  2011. vibe_surf/langflow/components/composio/gmail_composio.py +38 -0
  2012. vibe_surf/langflow/components/composio/googlecalendar_composio.py +11 -0
  2013. vibe_surf/langflow/components/composio/googlemeet_composio.py +11 -0
  2014. vibe_surf/langflow/components/composio/googletasks_composio.py +8 -0
  2015. vibe_surf/langflow/components/composio/linear_composio.py +11 -0
  2016. vibe_surf/langflow/components/composio/outlook_composio.py +11 -0
  2017. vibe_surf/langflow/components/composio/reddit_composio.py +11 -0
  2018. vibe_surf/langflow/components/composio/slack_composio.py +11 -0
  2019. vibe_surf/langflow/components/composio/slackbot_composio.py +11 -0
  2020. vibe_surf/langflow/components/composio/supabase_composio.py +11 -0
  2021. vibe_surf/langflow/components/composio/todoist_composio.py +11 -0
  2022. vibe_surf/langflow/components/composio/youtube_composio.py +11 -0
  2023. vibe_surf/langflow/components/confluence/__init__.py +3 -0
  2024. vibe_surf/langflow/components/confluence/confluence.py +84 -0
  2025. vibe_surf/langflow/components/couchbase/__init__.py +34 -0
  2026. vibe_surf/langflow/components/couchbase/couchbase.py +102 -0
  2027. vibe_surf/langflow/components/crewai/__init__.py +49 -0
  2028. vibe_surf/langflow/components/crewai/crewai.py +108 -0
  2029. vibe_surf/langflow/components/crewai/hierarchical_crew.py +47 -0
  2030. vibe_surf/langflow/components/crewai/hierarchical_task.py +45 -0
  2031. vibe_surf/langflow/components/crewai/sequential_crew.py +53 -0
  2032. vibe_surf/langflow/components/crewai/sequential_task.py +74 -0
  2033. vibe_surf/langflow/components/crewai/sequential_task_agent.py +144 -0
  2034. vibe_surf/langflow/components/custom_component/__init__.py +34 -0
  2035. vibe_surf/langflow/components/custom_component/custom_component.py +31 -0
  2036. vibe_surf/langflow/components/data/__init__.py +25 -0
  2037. vibe_surf/langflow/components/data/api_request.py +555 -0
  2038. vibe_surf/langflow/components/data/csv_to_data.py +96 -0
  2039. vibe_surf/langflow/components/data/directory.py +113 -0
  2040. vibe_surf/langflow/components/data/file.py +632 -0
  2041. vibe_surf/langflow/components/data/json_to_data.py +99 -0
  2042. vibe_surf/langflow/components/data/news_search.py +164 -0
  2043. vibe_surf/langflow/components/data/rss.py +69 -0
  2044. vibe_surf/langflow/components/data/sql_executor.py +99 -0
  2045. vibe_surf/langflow/components/data/url.py +299 -0
  2046. vibe_surf/langflow/components/data/web_search.py +112 -0
  2047. vibe_surf/langflow/components/data/webhook.py +56 -0
  2048. vibe_surf/langflow/components/datastax/__init__.py +70 -0
  2049. vibe_surf/langflow/components/datastax/astra_assistant_manager.py +306 -0
  2050. vibe_surf/langflow/components/datastax/astra_db.py +68 -0
  2051. vibe_surf/langflow/components/datastax/astra_vectorize.py +122 -0
  2052. vibe_surf/langflow/components/datastax/astradb_cql.py +314 -0
  2053. vibe_surf/langflow/components/datastax/astradb_graph.py +326 -0
  2054. vibe_surf/langflow/components/datastax/astradb_tool.py +418 -0
  2055. vibe_surf/langflow/components/datastax/astradb_vectorstore.py +1292 -0
  2056. vibe_surf/langflow/components/datastax/create_assistant.py +58 -0
  2057. vibe_surf/langflow/components/datastax/create_thread.py +32 -0
  2058. vibe_surf/langflow/components/datastax/dotenv.py +35 -0
  2059. vibe_surf/langflow/components/datastax/get_assistant.py +37 -0
  2060. vibe_surf/langflow/components/datastax/getenvvar.py +30 -0
  2061. vibe_surf/langflow/components/datastax/graph_rag.py +141 -0
  2062. vibe_surf/langflow/components/datastax/hcd.py +314 -0
  2063. vibe_surf/langflow/components/datastax/list_assistants.py +25 -0
  2064. vibe_surf/langflow/components/datastax/run.py +89 -0
  2065. vibe_surf/langflow/components/deactivated/__init__.py +19 -0
  2066. vibe_surf/langflow/components/deactivated/amazon_kendra.py +66 -0
  2067. vibe_surf/langflow/components/deactivated/chat_litellm_model.py +158 -0
  2068. vibe_surf/langflow/components/deactivated/code_block_extractor.py +26 -0
  2069. vibe_surf/langflow/components/deactivated/documents_to_data.py +22 -0
  2070. vibe_surf/langflow/components/deactivated/embed.py +16 -0
  2071. vibe_surf/langflow/components/deactivated/extract_key_from_data.py +46 -0
  2072. vibe_surf/langflow/components/deactivated/json_document_builder.py +59 -0
  2073. vibe_surf/langflow/components/deactivated/list_flows.py +20 -0
  2074. vibe_surf/langflow/components/deactivated/merge_data.py +93 -0
  2075. vibe_surf/langflow/components/deactivated/message.py +37 -0
  2076. vibe_surf/langflow/components/deactivated/metal.py +54 -0
  2077. vibe_surf/langflow/components/deactivated/multi_query.py +59 -0
  2078. vibe_surf/langflow/components/deactivated/retriever.py +43 -0
  2079. vibe_surf/langflow/components/deactivated/selective_passthrough.py +77 -0
  2080. vibe_surf/langflow/components/deactivated/should_run_next.py +40 -0
  2081. vibe_surf/langflow/components/deactivated/split_text.py +63 -0
  2082. vibe_surf/langflow/components/deactivated/store_message.py +24 -0
  2083. vibe_surf/langflow/components/deactivated/sub_flow.py +124 -0
  2084. vibe_surf/langflow/components/deactivated/vectara_self_query.py +76 -0
  2085. vibe_surf/langflow/components/deactivated/vector_store.py +24 -0
  2086. vibe_surf/langflow/components/deepseek/__init__.py +34 -0
  2087. vibe_surf/langflow/components/deepseek/deepseek.py +136 -0
  2088. vibe_surf/langflow/components/docling/__init__.py +43 -0
  2089. vibe_surf/langflow/components/docling/chunk_docling_document.py +186 -0
  2090. vibe_surf/langflow/components/docling/docling_inline.py +249 -0
  2091. vibe_surf/langflow/components/docling/docling_remote.py +192 -0
  2092. vibe_surf/langflow/components/docling/export_docling_document.py +117 -0
  2093. vibe_surf/langflow/components/documentloaders/__init__.py +0 -0
  2094. vibe_surf/langflow/components/duckduckgo/__init__.py +3 -0
  2095. vibe_surf/langflow/components/duckduckgo/duck_duck_go_search_run.py +92 -0
  2096. vibe_surf/langflow/components/elastic/__init__.py +37 -0
  2097. vibe_surf/langflow/components/elastic/elasticsearch.py +267 -0
  2098. vibe_surf/langflow/components/elastic/opensearch.py +243 -0
  2099. vibe_surf/langflow/components/embeddings/__init__.py +37 -0
  2100. vibe_surf/langflow/components/embeddings/similarity.py +77 -0
  2101. vibe_surf/langflow/components/embeddings/text_embedder.py +65 -0
  2102. vibe_surf/langflow/components/exa/__init__.py +3 -0
  2103. vibe_surf/langflow/components/exa/exa_search.py +68 -0
  2104. vibe_surf/langflow/components/firecrawl/__init__.py +43 -0
  2105. vibe_surf/langflow/components/firecrawl/firecrawl_crawl_api.py +88 -0
  2106. vibe_surf/langflow/components/firecrawl/firecrawl_extract_api.py +136 -0
  2107. vibe_surf/langflow/components/firecrawl/firecrawl_map_api.py +89 -0
  2108. vibe_surf/langflow/components/firecrawl/firecrawl_scrape_api.py +73 -0
  2109. vibe_surf/langflow/components/git/__init__.py +4 -0
  2110. vibe_surf/langflow/components/git/git.py +262 -0
  2111. vibe_surf/langflow/components/git/gitextractor.py +196 -0
  2112. vibe_surf/langflow/components/glean/__init__.py +3 -0
  2113. vibe_surf/langflow/components/glean/glean_search_api.py +173 -0
  2114. vibe_surf/langflow/components/google/__init__.py +17 -0
  2115. vibe_surf/langflow/components/google/gmail.py +193 -0
  2116. vibe_surf/langflow/components/google/google_bq_sql_executor.py +157 -0
  2117. vibe_surf/langflow/components/google/google_drive.py +92 -0
  2118. vibe_surf/langflow/components/google/google_drive_search.py +152 -0
  2119. vibe_surf/langflow/components/google/google_generative_ai.py +147 -0
  2120. vibe_surf/langflow/components/google/google_generative_ai_embeddings.py +141 -0
  2121. vibe_surf/langflow/components/google/google_oauth_token.py +89 -0
  2122. vibe_surf/langflow/components/google/google_search_api_core.py +68 -0
  2123. vibe_surf/langflow/components/groq/__init__.py +34 -0
  2124. vibe_surf/langflow/components/groq/groq.py +140 -0
  2125. vibe_surf/langflow/components/helpers/__init__.py +52 -0
  2126. vibe_surf/langflow/components/helpers/calculator_core.py +89 -0
  2127. vibe_surf/langflow/components/helpers/create_list.py +40 -0
  2128. vibe_surf/langflow/components/helpers/current_date.py +42 -0
  2129. vibe_surf/langflow/components/helpers/id_generator.py +42 -0
  2130. vibe_surf/langflow/components/helpers/memory.py +253 -0
  2131. vibe_surf/langflow/components/helpers/output_parser.py +46 -0
  2132. vibe_surf/langflow/components/helpers/store_message.py +91 -0
  2133. vibe_surf/langflow/components/homeassistant/__init__.py +7 -0
  2134. vibe_surf/langflow/components/homeassistant/home_assistant_control.py +152 -0
  2135. vibe_surf/langflow/components/homeassistant/list_home_assistant_states.py +137 -0
  2136. vibe_surf/langflow/components/huggingface/__init__.py +37 -0
  2137. vibe_surf/langflow/components/huggingface/huggingface.py +199 -0
  2138. vibe_surf/langflow/components/huggingface/huggingface_inference_api.py +106 -0
  2139. vibe_surf/langflow/components/ibm/__init__.py +34 -0
  2140. vibe_surf/langflow/components/ibm/watsonx.py +203 -0
  2141. vibe_surf/langflow/components/ibm/watsonx_embeddings.py +135 -0
  2142. vibe_surf/langflow/components/icosacomputing/__init__.py +5 -0
  2143. vibe_surf/langflow/components/icosacomputing/combinatorial_reasoner.py +84 -0
  2144. vibe_surf/langflow/components/input_output/__init__.py +38 -0
  2145. vibe_surf/langflow/components/input_output/chat.py +99 -0
  2146. vibe_surf/langflow/components/input_output/chat_output.py +169 -0
  2147. vibe_surf/langflow/components/input_output/text.py +27 -0
  2148. vibe_surf/langflow/components/input_output/text_output.py +29 -0
  2149. vibe_surf/langflow/components/jigsawstack/__init__.py +23 -0
  2150. vibe_surf/langflow/components/jigsawstack/ai_scrape.py +126 -0
  2151. vibe_surf/langflow/components/jigsawstack/ai_web_search.py +136 -0
  2152. vibe_surf/langflow/components/jigsawstack/file_read.py +115 -0
  2153. vibe_surf/langflow/components/jigsawstack/file_upload.py +94 -0
  2154. vibe_surf/langflow/components/jigsawstack/image_generation.py +205 -0
  2155. vibe_surf/langflow/components/jigsawstack/nsfw.py +60 -0
  2156. vibe_surf/langflow/components/jigsawstack/object_detection.py +124 -0
  2157. vibe_surf/langflow/components/jigsawstack/sentiment.py +112 -0
  2158. vibe_surf/langflow/components/jigsawstack/text_to_sql.py +90 -0
  2159. vibe_surf/langflow/components/jigsawstack/text_translate.py +77 -0
  2160. vibe_surf/langflow/components/jigsawstack/vocr.py +107 -0
  2161. vibe_surf/langflow/components/knowledge_bases/__init__.py +34 -0
  2162. vibe_surf/langflow/components/knowledge_bases/ingestion.py +697 -0
  2163. vibe_surf/langflow/components/knowledge_bases/retrieval.py +264 -0
  2164. vibe_surf/langflow/components/langchain_utilities/__init__.py +109 -0
  2165. vibe_surf/langflow/components/langchain_utilities/character.py +53 -0
  2166. vibe_surf/langflow/components/langchain_utilities/conversation.py +52 -0
  2167. vibe_surf/langflow/components/langchain_utilities/csv_agent.py +107 -0
  2168. vibe_surf/langflow/components/langchain_utilities/fake_embeddings.py +26 -0
  2169. vibe_surf/langflow/components/langchain_utilities/html_link_extractor.py +35 -0
  2170. vibe_surf/langflow/components/langchain_utilities/json_agent.py +45 -0
  2171. vibe_surf/langflow/components/langchain_utilities/langchain_hub.py +126 -0
  2172. vibe_surf/langflow/components/langchain_utilities/language_recursive.py +49 -0
  2173. vibe_surf/langflow/components/langchain_utilities/language_semantic.py +138 -0
  2174. vibe_surf/langflow/components/langchain_utilities/llm_checker.py +39 -0
  2175. vibe_surf/langflow/components/langchain_utilities/llm_math.py +42 -0
  2176. vibe_surf/langflow/components/langchain_utilities/natural_language.py +61 -0
  2177. vibe_surf/langflow/components/langchain_utilities/openai_tools.py +53 -0
  2178. vibe_surf/langflow/components/langchain_utilities/openapi.py +48 -0
  2179. vibe_surf/langflow/components/langchain_utilities/recursive_character.py +60 -0
  2180. vibe_surf/langflow/components/langchain_utilities/retrieval_qa.py +83 -0
  2181. vibe_surf/langflow/components/langchain_utilities/runnable_executor.py +137 -0
  2182. vibe_surf/langflow/components/langchain_utilities/self_query.py +80 -0
  2183. vibe_surf/langflow/components/langchain_utilities/spider.py +142 -0
  2184. vibe_surf/langflow/components/langchain_utilities/sql.py +40 -0
  2185. vibe_surf/langflow/components/langchain_utilities/sql_database.py +35 -0
  2186. vibe_surf/langflow/components/langchain_utilities/sql_generator.py +78 -0
  2187. vibe_surf/langflow/components/langchain_utilities/tool_calling.py +59 -0
  2188. vibe_surf/langflow/components/langchain_utilities/vector_store_info.py +49 -0
  2189. vibe_surf/langflow/components/langchain_utilities/vector_store_router.py +33 -0
  2190. vibe_surf/langflow/components/langchain_utilities/xml_agent.py +71 -0
  2191. vibe_surf/langflow/components/langwatch/__init__.py +3 -0
  2192. vibe_surf/langflow/components/langwatch/langwatch.py +278 -0
  2193. vibe_surf/langflow/components/link_extractors/__init__.py +0 -0
  2194. vibe_surf/langflow/components/lmstudio/__init__.py +34 -0
  2195. vibe_surf/langflow/components/lmstudio/lmstudioembeddings.py +89 -0
  2196. vibe_surf/langflow/components/lmstudio/lmstudiomodel.py +129 -0
  2197. vibe_surf/langflow/components/logic/__init__.py +52 -0
  2198. vibe_surf/langflow/components/logic/conditional_router.py +208 -0
  2199. vibe_surf/langflow/components/logic/data_conditional_router.py +126 -0
  2200. vibe_surf/langflow/components/logic/flow_tool.py +111 -0
  2201. vibe_surf/langflow/components/logic/listen.py +29 -0
  2202. vibe_surf/langflow/components/logic/loop.py +125 -0
  2203. vibe_surf/langflow/components/logic/notify.py +88 -0
  2204. vibe_surf/langflow/components/logic/pass_message.py +36 -0
  2205. vibe_surf/langflow/components/logic/run_flow.py +71 -0
  2206. vibe_surf/langflow/components/logic/sub_flow.py +115 -0
  2207. vibe_surf/langflow/components/maritalk/__init__.py +32 -0
  2208. vibe_surf/langflow/components/maritalk/maritalk.py +52 -0
  2209. vibe_surf/langflow/components/mem0/__init__.py +3 -0
  2210. vibe_surf/langflow/components/mem0/mem0_chat_memory.py +136 -0
  2211. vibe_surf/langflow/components/milvus/__init__.py +34 -0
  2212. vibe_surf/langflow/components/milvus/milvus.py +115 -0
  2213. vibe_surf/langflow/components/mistral/__init__.py +37 -0
  2214. vibe_surf/langflow/components/mistral/mistral.py +114 -0
  2215. vibe_surf/langflow/components/mistral/mistral_embeddings.py +58 -0
  2216. vibe_surf/langflow/components/models/__init__.py +34 -0
  2217. vibe_surf/langflow/components/models/embedding_model.py +114 -0
  2218. vibe_surf/langflow/components/models/language_model.py +144 -0
  2219. vibe_surf/langflow/components/mongodb/__init__.py +34 -0
  2220. vibe_surf/langflow/components/mongodb/mongodb_atlas.py +213 -0
  2221. vibe_surf/langflow/components/needle/__init__.py +3 -0
  2222. vibe_surf/langflow/components/needle/needle.py +104 -0
  2223. vibe_surf/langflow/components/notdiamond/__init__.py +36 -0
  2224. vibe_surf/langflow/components/notdiamond/notdiamond.py +228 -0
  2225. vibe_surf/langflow/components/novita/__init__.py +32 -0
  2226. vibe_surf/langflow/components/novita/novita.py +130 -0
  2227. vibe_surf/langflow/components/nvidia/__init__.py +57 -0
  2228. vibe_surf/langflow/components/nvidia/nvidia.py +151 -0
  2229. vibe_surf/langflow/components/nvidia/nvidia_embedding.py +77 -0
  2230. vibe_surf/langflow/components/nvidia/nvidia_ingest.py +317 -0
  2231. vibe_surf/langflow/components/nvidia/nvidia_rerank.py +63 -0
  2232. vibe_surf/langflow/components/nvidia/system_assist.py +65 -0
  2233. vibe_surf/langflow/components/olivya/__init__.py +3 -0
  2234. vibe_surf/langflow/components/olivya/olivya.py +116 -0
  2235. vibe_surf/langflow/components/ollama/__init__.py +37 -0
  2236. vibe_surf/langflow/components/ollama/ollama.py +330 -0
  2237. vibe_surf/langflow/components/ollama/ollama_embeddings.py +106 -0
  2238. vibe_surf/langflow/components/openai/__init__.py +37 -0
  2239. vibe_surf/langflow/components/openai/openai.py +100 -0
  2240. vibe_surf/langflow/components/openai/openai_chat_model.py +158 -0
  2241. vibe_surf/langflow/components/openrouter/__init__.py +32 -0
  2242. vibe_surf/langflow/components/openrouter/openrouter.py +202 -0
  2243. vibe_surf/langflow/components/output_parsers/__init__.py +0 -0
  2244. vibe_surf/langflow/components/perplexity/__init__.py +34 -0
  2245. vibe_surf/langflow/components/perplexity/perplexity.py +75 -0
  2246. vibe_surf/langflow/components/pgvector/__init__.py +34 -0
  2247. vibe_surf/langflow/components/pgvector/pgvector.py +72 -0
  2248. vibe_surf/langflow/components/pinecone/__init__.py +34 -0
  2249. vibe_surf/langflow/components/pinecone/pinecone.py +134 -0
  2250. vibe_surf/langflow/components/processing/__init__.py +117 -0
  2251. vibe_surf/langflow/components/processing/alter_metadata.py +109 -0
  2252. vibe_surf/langflow/components/processing/batch_run.py +205 -0
  2253. vibe_surf/langflow/components/processing/combine_text.py +40 -0
  2254. vibe_surf/langflow/components/processing/converter.py +150 -0
  2255. vibe_surf/langflow/components/processing/create_data.py +111 -0
  2256. vibe_surf/langflow/components/processing/data_operations.py +438 -0
  2257. vibe_surf/langflow/components/processing/data_to_dataframe.py +71 -0
  2258. vibe_surf/langflow/components/processing/dataframe_operations.py +310 -0
  2259. vibe_surf/langflow/components/processing/extract_key.py +54 -0
  2260. vibe_surf/langflow/components/processing/filter_data.py +43 -0
  2261. vibe_surf/langflow/components/processing/filter_data_values.py +89 -0
  2262. vibe_surf/langflow/components/processing/json_cleaner.py +104 -0
  2263. vibe_surf/langflow/components/processing/lambda_filter.py +154 -0
  2264. vibe_surf/langflow/components/processing/llm_router.py +499 -0
  2265. vibe_surf/langflow/components/processing/merge_data.py +91 -0
  2266. vibe_surf/langflow/components/processing/message_to_data.py +37 -0
  2267. vibe_surf/langflow/components/processing/parse_data.py +71 -0
  2268. vibe_surf/langflow/components/processing/parse_dataframe.py +69 -0
  2269. vibe_surf/langflow/components/processing/parse_json_data.py +91 -0
  2270. vibe_surf/langflow/components/processing/parser.py +143 -0
  2271. vibe_surf/langflow/components/processing/prompt.py +67 -0
  2272. vibe_surf/langflow/components/processing/python_repl_core.py +98 -0
  2273. vibe_surf/langflow/components/processing/regex.py +83 -0
  2274. vibe_surf/langflow/components/processing/save_file.py +208 -0
  2275. vibe_surf/langflow/components/processing/select_data.py +49 -0
  2276. vibe_surf/langflow/components/processing/split_text.py +141 -0
  2277. vibe_surf/langflow/components/processing/structured_output.py +206 -0
  2278. vibe_surf/langflow/components/processing/update_data.py +161 -0
  2279. vibe_surf/langflow/components/qdrant/__init__.py +34 -0
  2280. vibe_surf/langflow/components/qdrant/qdrant.py +109 -0
  2281. vibe_surf/langflow/components/redis/__init__.py +37 -0
  2282. vibe_surf/langflow/components/redis/redis.py +89 -0
  2283. vibe_surf/langflow/components/redis/redis_chat.py +43 -0
  2284. vibe_surf/langflow/components/sambanova/__init__.py +32 -0
  2285. vibe_surf/langflow/components/sambanova/sambanova.py +84 -0
  2286. vibe_surf/langflow/components/scrapegraph/__init__.py +40 -0
  2287. vibe_surf/langflow/components/scrapegraph/scrapegraph_markdownify_api.py +64 -0
  2288. vibe_surf/langflow/components/scrapegraph/scrapegraph_search_api.py +64 -0
  2289. vibe_surf/langflow/components/scrapegraph/scrapegraph_smart_scraper_api.py +71 -0
  2290. vibe_surf/langflow/components/searchapi/__init__.py +36 -0
  2291. vibe_surf/langflow/components/searchapi/search.py +79 -0
  2292. vibe_surf/langflow/components/serpapi/__init__.py +3 -0
  2293. vibe_surf/langflow/components/serpapi/serp.py +115 -0
  2294. vibe_surf/langflow/components/serper/__init__.py +3 -0
  2295. vibe_surf/langflow/components/serper/google_serper_api_core.py +74 -0
  2296. vibe_surf/langflow/components/supabase/__init__.py +37 -0
  2297. vibe_surf/langflow/components/supabase/supabase.py +76 -0
  2298. vibe_surf/langflow/components/tavily/__init__.py +4 -0
  2299. vibe_surf/langflow/components/tavily/tavily_extract.py +117 -0
  2300. vibe_surf/langflow/components/tavily/tavily_search.py +212 -0
  2301. vibe_surf/langflow/components/textsplitters/__init__.py +0 -0
  2302. vibe_surf/langflow/components/toolkits/__init__.py +0 -0
  2303. vibe_surf/langflow/components/tools/__init__.py +66 -0
  2304. vibe_surf/langflow/components/tools/calculator.py +104 -0
  2305. vibe_surf/langflow/components/tools/python_code_structured_tool.py +328 -0
  2306. vibe_surf/langflow/components/tools/python_repl.py +98 -0
  2307. vibe_surf/langflow/components/tools/search_api.py +88 -0
  2308. vibe_surf/langflow/components/tools/searxng.py +145 -0
  2309. vibe_surf/langflow/components/tools/serp_api.py +120 -0
  2310. vibe_surf/langflow/components/tools/tavily_search_tool.py +345 -0
  2311. vibe_surf/langflow/components/tools/wikidata_api.py +103 -0
  2312. vibe_surf/langflow/components/tools/wikipedia_api.py +50 -0
  2313. vibe_surf/langflow/components/tools/yahoo_finance.py +125 -0
  2314. vibe_surf/langflow/components/twelvelabs/__init__.py +52 -0
  2315. vibe_surf/langflow/components/twelvelabs/convert_astra_results.py +84 -0
  2316. vibe_surf/langflow/components/twelvelabs/pegasus_index.py +311 -0
  2317. vibe_surf/langflow/components/twelvelabs/split_video.py +291 -0
  2318. vibe_surf/langflow/components/twelvelabs/text_embeddings.py +57 -0
  2319. vibe_surf/langflow/components/twelvelabs/twelvelabs_pegasus.py +408 -0
  2320. vibe_surf/langflow/components/twelvelabs/video_embeddings.py +100 -0
  2321. vibe_surf/langflow/components/twelvelabs/video_file.py +179 -0
  2322. vibe_surf/langflow/components/unstructured/__init__.py +3 -0
  2323. vibe_surf/langflow/components/unstructured/unstructured.py +121 -0
  2324. vibe_surf/langflow/components/upstash/__init__.py +34 -0
  2325. vibe_surf/langflow/components/upstash/upstash.py +124 -0
  2326. vibe_surf/langflow/components/vectara/__init__.py +37 -0
  2327. vibe_surf/langflow/components/vectara/vectara.py +97 -0
  2328. vibe_surf/langflow/components/vectara/vectara_rag.py +164 -0
  2329. vibe_surf/langflow/components/vectorstores/__init__.py +34 -0
  2330. vibe_surf/langflow/components/vectorstores/local_db.py +262 -0
  2331. vibe_surf/langflow/components/vertexai/__init__.py +37 -0
  2332. vibe_surf/langflow/components/vertexai/vertexai.py +71 -0
  2333. vibe_surf/langflow/components/vertexai/vertexai_embeddings.py +67 -0
  2334. vibe_surf/langflow/components/weaviate/__init__.py +34 -0
  2335. vibe_surf/langflow/components/weaviate/weaviate.py +89 -0
  2336. vibe_surf/langflow/components/wikipedia/__init__.py +4 -0
  2337. vibe_surf/langflow/components/wikipedia/wikidata.py +86 -0
  2338. vibe_surf/langflow/components/wikipedia/wikipedia.py +53 -0
  2339. vibe_surf/langflow/components/wolframalpha/__init__.py +3 -0
  2340. vibe_surf/langflow/components/wolframalpha/wolfram_alpha_api.py +54 -0
  2341. vibe_surf/langflow/components/xai/__init__.py +32 -0
  2342. vibe_surf/langflow/components/xai/xai.py +167 -0
  2343. vibe_surf/langflow/components/youtube/__init__.py +52 -0
  2344. vibe_surf/langflow/components/youtube/channel.py +227 -0
  2345. vibe_surf/langflow/components/youtube/comments.py +231 -0
  2346. vibe_surf/langflow/components/youtube/playlist.py +33 -0
  2347. vibe_surf/langflow/components/youtube/search.py +120 -0
  2348. vibe_surf/langflow/components/youtube/trending.py +285 -0
  2349. vibe_surf/langflow/components/youtube/video_details.py +263 -0
  2350. vibe_surf/langflow/components/youtube/youtube_transcripts.py +118 -0
  2351. vibe_surf/langflow/components/zep/__init__.py +3 -0
  2352. vibe_surf/langflow/components/zep/zep.py +45 -0
  2353. vibe_surf/langflow/core/__init__.py +0 -0
  2354. vibe_surf/langflow/core/celery_app.py +11 -0
  2355. vibe_surf/langflow/core/celeryconfig.py +18 -0
  2356. vibe_surf/langflow/custom/__init__.py +4 -0
  2357. vibe_surf/langflow/custom/attributes.py +87 -0
  2358. vibe_surf/langflow/custom/code_parser/__init__.py +3 -0
  2359. vibe_surf/langflow/custom/code_parser/code_parser.py +361 -0
  2360. vibe_surf/langflow/custom/custom_component/__init__.py +0 -0
  2361. vibe_surf/langflow/custom/custom_component/base_component.py +118 -0
  2362. vibe_surf/langflow/custom/custom_component/component.py +1742 -0
  2363. vibe_surf/langflow/custom/custom_component/component_with_cache.py +8 -0
  2364. vibe_surf/langflow/custom/custom_component/custom_component.py +552 -0
  2365. vibe_surf/langflow/custom/dependency_analyzer.py +165 -0
  2366. vibe_surf/langflow/custom/directory_reader/__init__.py +3 -0
  2367. vibe_surf/langflow/custom/directory_reader/directory_reader.py +359 -0
  2368. vibe_surf/langflow/custom/directory_reader/utils.py +171 -0
  2369. vibe_surf/langflow/custom/eval.py +12 -0
  2370. vibe_surf/langflow/custom/schema.py +32 -0
  2371. vibe_surf/langflow/custom/tree_visitor.py +21 -0
  2372. vibe_surf/langflow/custom/utils.py +868 -0
  2373. vibe_surf/langflow/events/__init__.py +0 -0
  2374. vibe_surf/langflow/events/event_manager.py +108 -0
  2375. vibe_surf/langflow/exceptions/__init__.py +0 -0
  2376. vibe_surf/langflow/exceptions/api.py +34 -0
  2377. vibe_surf/langflow/exceptions/component.py +17 -0
  2378. vibe_surf/langflow/exceptions/serialization.py +56 -0
  2379. vibe_surf/langflow/field_typing/__init__.py +91 -0
  2380. vibe_surf/langflow/field_typing/constants.py +137 -0
  2381. vibe_surf/langflow/field_typing/range_spec.py +33 -0
  2382. vibe_surf/langflow/graph/__init__.py +6 -0
  2383. vibe_surf/langflow/graph/edge/__init__.py +0 -0
  2384. vibe_surf/langflow/graph/edge/base.py +277 -0
  2385. vibe_surf/langflow/graph/edge/schema.py +119 -0
  2386. vibe_surf/langflow/graph/edge/utils.py +0 -0
  2387. vibe_surf/langflow/graph/graph/__init__.py +0 -0
  2388. vibe_surf/langflow/graph/graph/ascii.py +202 -0
  2389. vibe_surf/langflow/graph/graph/base.py +2242 -0
  2390. vibe_surf/langflow/graph/graph/constants.py +58 -0
  2391. vibe_surf/langflow/graph/graph/runnable_vertices_manager.py +133 -0
  2392. vibe_surf/langflow/graph/graph/schema.py +53 -0
  2393. vibe_surf/langflow/graph/graph/state_model.py +66 -0
  2394. vibe_surf/langflow/graph/graph/utils.py +1024 -0
  2395. vibe_surf/langflow/graph/schema.py +75 -0
  2396. vibe_surf/langflow/graph/state/__init__.py +0 -0
  2397. vibe_surf/langflow/graph/state/model.py +237 -0
  2398. vibe_surf/langflow/graph/utils.py +229 -0
  2399. vibe_surf/langflow/graph/vertex/__init__.py +0 -0
  2400. vibe_surf/langflow/graph/vertex/base.py +811 -0
  2401. vibe_surf/langflow/graph/vertex/constants.py +0 -0
  2402. vibe_surf/langflow/graph/vertex/exceptions.py +4 -0
  2403. vibe_surf/langflow/graph/vertex/param_handler.py +255 -0
  2404. vibe_surf/langflow/graph/vertex/schema.py +26 -0
  2405. vibe_surf/langflow/graph/vertex/utils.py +19 -0
  2406. vibe_surf/langflow/graph/vertex/vertex_types.py +489 -0
  2407. vibe_surf/langflow/helpers/__init__.py +3 -0
  2408. vibe_surf/langflow/helpers/base_model.py +71 -0
  2409. vibe_surf/langflow/helpers/custom.py +13 -0
  2410. vibe_surf/langflow/helpers/data.py +206 -0
  2411. vibe_surf/langflow/helpers/flow.py +359 -0
  2412. vibe_surf/langflow/helpers/folders.py +26 -0
  2413. vibe_surf/langflow/helpers/user.py +27 -0
  2414. vibe_surf/langflow/initial_setup/__init__.py +0 -0
  2415. vibe_surf/langflow/initial_setup/constants.py +2 -0
  2416. vibe_surf/langflow/initial_setup/load.py +21 -0
  2417. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-01.svg +102 -0
  2418. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-02.svg +135 -0
  2419. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-03.svg +126 -0
  2420. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-04.svg +132 -0
  2421. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-05.svg +151 -0
  2422. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-06.svg +132 -0
  2423. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-07.svg +138 -0
  2424. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-08.svg +125 -0
  2425. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-09.svg +137 -0
  2426. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-10.svg +109 -0
  2427. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-11.svg +140 -0
  2428. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-12.svg +99 -0
  2429. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-13.svg +118 -0
  2430. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-14.svg +99 -0
  2431. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-15.svg +90 -0
  2432. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-16.svg +106 -0
  2433. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-17.svg +97 -0
  2434. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-18.svg +128 -0
  2435. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-19.svg +100 -0
  2436. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-20.svg +101 -0
  2437. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-21.svg +134 -0
  2438. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-22.svg +127 -0
  2439. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-23.svg +120 -0
  2440. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-24.svg +110 -0
  2441. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-25.svg +79 -0
  2442. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-26.svg +98 -0
  2443. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-27.svg +113 -0
  2444. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-01.svg +113 -0
  2445. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-02.svg +167 -0
  2446. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-03.svg +91 -0
  2447. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-04.svg +114 -0
  2448. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-05.svg +71 -0
  2449. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-06.svg +105 -0
  2450. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-07.svg +101 -0
  2451. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-08.svg +92 -0
  2452. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-09.svg +91 -0
  2453. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-10.svg +110 -0
  2454. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-11.svg +102 -0
  2455. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-12.svg +92 -0
  2456. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-13.svg +77 -0
  2457. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-14.svg +99 -0
  2458. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-15.svg +81 -0
  2459. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-16.svg +91 -0
  2460. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-17.svg +100 -0
  2461. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-18.svg +99 -0
  2462. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-19.svg +155 -0
  2463. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-20.svg +110 -0
  2464. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-21.svg +128 -0
  2465. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-22.svg +90 -0
  2466. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-23.svg +117 -0
  2467. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-24.svg +100 -0
  2468. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-25.svg +97 -0
  2469. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-26.svg +105 -0
  2470. vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-27.svg +82 -0
  2471. vibe_surf/langflow/initial_setup/profile_pictures/Space/026-alien.svg +1 -0
  2472. vibe_surf/langflow/initial_setup/profile_pictures/Space/027-satellite.svg +1 -0
  2473. vibe_surf/langflow/initial_setup/profile_pictures/Space/028-alien.svg +1 -0
  2474. vibe_surf/langflow/initial_setup/profile_pictures/Space/029-telescope.svg +1 -0
  2475. vibe_surf/langflow/initial_setup/profile_pictures/Space/030-books.svg +1 -0
  2476. vibe_surf/langflow/initial_setup/profile_pictures/Space/031-planet.svg +1 -0
  2477. vibe_surf/langflow/initial_setup/profile_pictures/Space/032-constellation.svg +1 -0
  2478. vibe_surf/langflow/initial_setup/profile_pictures/Space/033-planet.svg +1 -0
  2479. vibe_surf/langflow/initial_setup/profile_pictures/Space/034-alien.svg +1 -0
  2480. vibe_surf/langflow/initial_setup/profile_pictures/Space/035-globe.svg +1 -0
  2481. vibe_surf/langflow/initial_setup/profile_pictures/Space/036-eclipse.svg +1 -0
  2482. vibe_surf/langflow/initial_setup/profile_pictures/Space/037-meteor.svg +1 -0
  2483. vibe_surf/langflow/initial_setup/profile_pictures/Space/038-eclipse.svg +1 -0
  2484. vibe_surf/langflow/initial_setup/profile_pictures/Space/039-Asteroid.svg +1 -0
  2485. vibe_surf/langflow/initial_setup/profile_pictures/Space/040-mission.svg +1 -0
  2486. vibe_surf/langflow/initial_setup/profile_pictures/Space/041-spaceship.svg +1 -0
  2487. vibe_surf/langflow/initial_setup/profile_pictures/Space/042-space shuttle.svg +1 -0
  2488. vibe_surf/langflow/initial_setup/profile_pictures/Space/043-space shuttle.svg +1 -0
  2489. vibe_surf/langflow/initial_setup/profile_pictures/Space/044-rocket.svg +1 -0
  2490. vibe_surf/langflow/initial_setup/profile_pictures/Space/045-astronaut.svg +1 -0
  2491. vibe_surf/langflow/initial_setup/profile_pictures/Space/046-rocket.svg +1 -0
  2492. vibe_surf/langflow/initial_setup/profile_pictures/Space/047-computer.svg +1 -0
  2493. vibe_surf/langflow/initial_setup/profile_pictures/Space/048-satellite.svg +1 -0
  2494. vibe_surf/langflow/initial_setup/profile_pictures/Space/049-astronaut.svg +1 -0
  2495. vibe_surf/langflow/initial_setup/profile_pictures/Space/050-space robot.svg +1 -0
  2496. vibe_surf/langflow/initial_setup/setup.py +1108 -0
  2497. vibe_surf/langflow/initial_setup/starter_projects/Basic Prompt Chaining.json +1976 -0
  2498. vibe_surf/langflow/initial_setup/starter_projects/Basic Prompting.json +1051 -0
  2499. vibe_surf/langflow/initial_setup/starter_projects/Blog Writer.json +1529 -0
  2500. vibe_surf/langflow/initial_setup/starter_projects/Custom Component Generator.json +2671 -0
  2501. vibe_surf/langflow/initial_setup/starter_projects/Document Q&A.json +1522 -0
  2502. vibe_surf/langflow/initial_setup/starter_projects/Financial Report Parser.json +1418 -0
  2503. vibe_surf/langflow/initial_setup/starter_projects/Hybrid Search RAG.json +2718 -0
  2504. vibe_surf/langflow/initial_setup/starter_projects/Image Sentiment Analysis.json +1884 -0
  2505. vibe_surf/langflow/initial_setup/starter_projects/Instagram Copywriter.json +3069 -0
  2506. vibe_surf/langflow/initial_setup/starter_projects/Invoice Summarizer.json +1666 -0
  2507. vibe_surf/langflow/initial_setup/starter_projects/Knowledge Ingestion.json +1042 -0
  2508. vibe_surf/langflow/initial_setup/starter_projects/Knowledge Retrieval.json +630 -0
  2509. vibe_surf/langflow/initial_setup/starter_projects/Market Research.json +2532 -0
  2510. vibe_surf/langflow/initial_setup/starter_projects/Meeting Summary.json +3263 -0
  2511. vibe_surf/langflow/initial_setup/starter_projects/Memory Chatbot.json +1419 -0
  2512. vibe_surf/langflow/initial_setup/starter_projects/News Aggregator.json +1835 -0
  2513. vibe_surf/langflow/initial_setup/starter_projects/Nvidia Remix.json +4866 -0
  2514. vibe_surf/langflow/initial_setup/starter_projects/Pok/303/251dex Agent.json" +1739 -0
  2515. vibe_surf/langflow/initial_setup/starter_projects/Portfolio Website Code Generator.json +2243 -0
  2516. vibe_surf/langflow/initial_setup/starter_projects/Price Deal Finder.json +2099 -0
  2517. vibe_surf/langflow/initial_setup/starter_projects/Research Agent.json +3032 -0
  2518. vibe_surf/langflow/initial_setup/starter_projects/Research Translation Loop.json +1580 -0
  2519. vibe_surf/langflow/initial_setup/starter_projects/SEO Keyword Generator.json +1091 -0
  2520. vibe_surf/langflow/initial_setup/starter_projects/SaaS Pricing.json +1416 -0
  2521. vibe_surf/langflow/initial_setup/starter_projects/Search agent.json +1455 -0
  2522. vibe_surf/langflow/initial_setup/starter_projects/Sequential Tasks Agents.json +4101 -0
  2523. vibe_surf/langflow/initial_setup/starter_projects/Simple Agent.json +1841 -0
  2524. vibe_surf/langflow/initial_setup/starter_projects/Social Media Agent.json +1759 -0
  2525. vibe_surf/langflow/initial_setup/starter_projects/Text Sentiment Analysis.json +2557 -0
  2526. vibe_surf/langflow/initial_setup/starter_projects/Travel Planning Agents.json +3448 -0
  2527. vibe_surf/langflow/initial_setup/starter_projects/Twitter Thread Generator.json +1978 -0
  2528. vibe_surf/langflow/initial_setup/starter_projects/Vector Store RAG.json +4850 -0
  2529. vibe_surf/langflow/initial_setup/starter_projects/Youtube Analysis.json +2734 -0
  2530. vibe_surf/langflow/initial_setup/starter_projects/__init__.py +19 -0
  2531. vibe_surf/langflow/initial_setup/starter_projects/basic_prompting.py +28 -0
  2532. vibe_surf/langflow/initial_setup/starter_projects/blog_writer.py +46 -0
  2533. vibe_surf/langflow/initial_setup/starter_projects/complex_agent.py +96 -0
  2534. vibe_surf/langflow/initial_setup/starter_projects/document_qa.py +39 -0
  2535. vibe_surf/langflow/initial_setup/starter_projects/hierarchical_tasks_agent.py +69 -0
  2536. vibe_surf/langflow/initial_setup/starter_projects/memory_chatbot.py +31 -0
  2537. vibe_surf/langflow/initial_setup/starter_projects/sequential_tasks_agent.py +97 -0
  2538. vibe_surf/langflow/initial_setup/starter_projects/vector_store_rag.py +61 -0
  2539. vibe_surf/langflow/inputs/__init__.py +68 -0
  2540. vibe_surf/langflow/inputs/constants.py +2 -0
  2541. vibe_surf/langflow/inputs/input_mixin.py +312 -0
  2542. vibe_surf/langflow/inputs/inputs.py +706 -0
  2543. vibe_surf/langflow/inputs/utils.py +32 -0
  2544. vibe_surf/langflow/inputs/validators.py +19 -0
  2545. vibe_surf/langflow/interface/__init__.py +0 -0
  2546. vibe_surf/langflow/interface/components.py +496 -0
  2547. vibe_surf/langflow/interface/importing/__init__.py +5 -0
  2548. vibe_surf/langflow/interface/importing/utils.py +39 -0
  2549. vibe_surf/langflow/interface/initialize/__init__.py +3 -0
  2550. vibe_surf/langflow/interface/initialize/loading.py +200 -0
  2551. vibe_surf/langflow/interface/listing.py +26 -0
  2552. vibe_surf/langflow/interface/run.py +45 -0
  2553. vibe_surf/langflow/interface/utils.py +112 -0
  2554. vibe_surf/langflow/io/__init__.py +63 -0
  2555. vibe_surf/langflow/io/schema.py +304 -0
  2556. vibe_surf/langflow/langflow_launcher.py +51 -0
  2557. vibe_surf/langflow/legacy_custom/__init__.py +0 -0
  2558. vibe_surf/langflow/legacy_custom/customs.py +16 -0
  2559. vibe_surf/langflow/load/__init__.py +12 -0
  2560. vibe_surf/langflow/load/load.py +250 -0
  2561. vibe_surf/langflow/load/utils.py +126 -0
  2562. vibe_surf/langflow/logging/__init__.py +4 -0
  2563. vibe_surf/langflow/logging/logger.py +407 -0
  2564. vibe_surf/langflow/logging/setup.py +16 -0
  2565. vibe_surf/langflow/main.py +550 -0
  2566. vibe_surf/langflow/memory.py +326 -0
  2567. vibe_surf/langflow/middleware.py +59 -0
  2568. vibe_surf/langflow/processing/__init__.py +0 -0
  2569. vibe_surf/langflow/processing/process.py +216 -0
  2570. vibe_surf/langflow/processing/utils.py +25 -0
  2571. vibe_surf/langflow/py.typed +0 -0
  2572. vibe_surf/langflow/schema/__init__.py +6 -0
  2573. vibe_surf/langflow/schema/artifact.py +82 -0
  2574. vibe_surf/langflow/schema/content_block.py +62 -0
  2575. vibe_surf/langflow/schema/content_types.py +91 -0
  2576. vibe_surf/langflow/schema/data.py +306 -0
  2577. vibe_surf/langflow/schema/dataframe.py +206 -0
  2578. vibe_surf/langflow/schema/dotdict.py +71 -0
  2579. vibe_surf/langflow/schema/encoders.py +13 -0
  2580. vibe_surf/langflow/schema/graph.py +47 -0
  2581. vibe_surf/langflow/schema/image.py +128 -0
  2582. vibe_surf/langflow/schema/log.py +33 -0
  2583. vibe_surf/langflow/schema/message.py +483 -0
  2584. vibe_surf/langflow/schema/openai_responses_schemas.py +74 -0
  2585. vibe_surf/langflow/schema/playground_events.py +182 -0
  2586. vibe_surf/langflow/schema/properties.py +39 -0
  2587. vibe_surf/langflow/schema/schema.py +121 -0
  2588. vibe_surf/langflow/schema/serialize.py +14 -0
  2589. vibe_surf/langflow/schema/table.py +140 -0
  2590. vibe_surf/langflow/schema/validators.py +114 -0
  2591. vibe_surf/langflow/serialization/__init__.py +3 -0
  2592. vibe_surf/langflow/serialization/constants.py +2 -0
  2593. vibe_surf/langflow/serialization/serialization.py +320 -0
  2594. vibe_surf/langflow/server.py +70 -0
  2595. vibe_surf/langflow/services/__init__.py +4 -0
  2596. vibe_surf/langflow/services/auth/__init__.py +0 -0
  2597. vibe_surf/langflow/services/auth/factory.py +15 -0
  2598. vibe_surf/langflow/services/auth/mcp_encryption.py +120 -0
  2599. vibe_surf/langflow/services/auth/service.py +15 -0
  2600. vibe_surf/langflow/services/auth/utils.py +583 -0
  2601. vibe_surf/langflow/services/base.py +28 -0
  2602. vibe_surf/langflow/services/cache/__init__.py +12 -0
  2603. vibe_surf/langflow/services/cache/base.py +183 -0
  2604. vibe_surf/langflow/services/cache/disk.py +95 -0
  2605. vibe_surf/langflow/services/cache/factory.py +44 -0
  2606. vibe_surf/langflow/services/cache/service.py +355 -0
  2607. vibe_surf/langflow/services/cache/utils.py +169 -0
  2608. vibe_surf/langflow/services/chat/__init__.py +0 -0
  2609. vibe_surf/langflow/services/chat/cache.py +150 -0
  2610. vibe_surf/langflow/services/chat/config.py +2 -0
  2611. vibe_surf/langflow/services/chat/factory.py +11 -0
  2612. vibe_surf/langflow/services/chat/schema.py +10 -0
  2613. vibe_surf/langflow/services/chat/service.py +67 -0
  2614. vibe_surf/langflow/services/database/__init__.py +0 -0
  2615. vibe_surf/langflow/services/database/factory.py +21 -0
  2616. vibe_surf/langflow/services/database/models/__init__.py +19 -0
  2617. vibe_surf/langflow/services/database/models/api_key/__init__.py +3 -0
  2618. vibe_surf/langflow/services/database/models/api_key/crud.py +74 -0
  2619. vibe_surf/langflow/services/database/models/api_key/model.py +66 -0
  2620. vibe_surf/langflow/services/database/models/base.py +17 -0
  2621. vibe_surf/langflow/services/database/models/file/__init__.py +5 -0
  2622. vibe_surf/langflow/services/database/models/file/crud.py +14 -0
  2623. vibe_surf/langflow/services/database/models/file/model.py +19 -0
  2624. vibe_surf/langflow/services/database/models/flow/__init__.py +3 -0
  2625. vibe_surf/langflow/services/database/models/flow/model.py +283 -0
  2626. vibe_surf/langflow/services/database/models/flow/schema.py +6 -0
  2627. vibe_surf/langflow/services/database/models/flow/utils.py +42 -0
  2628. vibe_surf/langflow/services/database/models/folder/__init__.py +3 -0
  2629. vibe_surf/langflow/services/database/models/folder/constants.py +2 -0
  2630. vibe_surf/langflow/services/database/models/folder/model.py +61 -0
  2631. vibe_surf/langflow/services/database/models/folder/pagination_model.py +10 -0
  2632. vibe_surf/langflow/services/database/models/folder/utils.py +45 -0
  2633. vibe_surf/langflow/services/database/models/message/__init__.py +3 -0
  2634. vibe_surf/langflow/services/database/models/message/crud.py +26 -0
  2635. vibe_surf/langflow/services/database/models/message/model.py +182 -0
  2636. vibe_surf/langflow/services/database/models/transactions/__init__.py +3 -0
  2637. vibe_surf/langflow/services/database/models/transactions/crud.py +82 -0
  2638. vibe_surf/langflow/services/database/models/transactions/model.py +65 -0
  2639. vibe_surf/langflow/services/database/models/user/__init__.py +8 -0
  2640. vibe_surf/langflow/services/database/models/user/crud.py +69 -0
  2641. vibe_surf/langflow/services/database/models/user/model.py +82 -0
  2642. vibe_surf/langflow/services/database/models/variable/__init__.py +3 -0
  2643. vibe_surf/langflow/services/database/models/variable/model.py +73 -0
  2644. vibe_surf/langflow/services/database/models/vertex_builds/__init__.py +3 -0
  2645. vibe_surf/langflow/services/database/models/vertex_builds/crud.py +145 -0
  2646. vibe_surf/langflow/services/database/models/vertex_builds/model.py +83 -0
  2647. vibe_surf/langflow/services/database/service.py +485 -0
  2648. vibe_surf/langflow/services/database/session.py +62 -0
  2649. vibe_surf/langflow/services/database/utils.py +88 -0
  2650. vibe_surf/langflow/services/deps.py +259 -0
  2651. vibe_surf/langflow/services/factory.py +88 -0
  2652. vibe_surf/langflow/services/flow/__init__.py +0 -0
  2653. vibe_surf/langflow/services/flow/flow_runner.py +265 -0
  2654. vibe_surf/langflow/services/job_queue/__init__.py +0 -0
  2655. vibe_surf/langflow/services/job_queue/factory.py +11 -0
  2656. vibe_surf/langflow/services/job_queue/service.py +328 -0
  2657. vibe_surf/langflow/services/manager.py +149 -0
  2658. vibe_surf/langflow/services/mcp_composer/__init__.py +6 -0
  2659. vibe_surf/langflow/services/mcp_composer/factory.py +15 -0
  2660. vibe_surf/langflow/services/mcp_composer/service.py +591 -0
  2661. vibe_surf/langflow/services/schema.py +23 -0
  2662. vibe_surf/langflow/services/session/__init__.py +0 -0
  2663. vibe_surf/langflow/services/session/factory.py +18 -0
  2664. vibe_surf/langflow/services/session/service.py +63 -0
  2665. vibe_surf/langflow/services/session/utils.py +18 -0
  2666. vibe_surf/langflow/services/settings/__init__.py +3 -0
  2667. vibe_surf/langflow/services/settings/auth.py +147 -0
  2668. vibe_surf/langflow/services/settings/base.py +587 -0
  2669. vibe_surf/langflow/services/settings/constants.py +34 -0
  2670. vibe_surf/langflow/services/settings/factory.py +22 -0
  2671. vibe_surf/langflow/services/settings/feature_flags.py +11 -0
  2672. vibe_surf/langflow/services/settings/manager.py +49 -0
  2673. vibe_surf/langflow/services/settings/service.py +32 -0
  2674. vibe_surf/langflow/services/settings/utils.py +40 -0
  2675. vibe_surf/langflow/services/shared_component_cache/__init__.py +0 -0
  2676. vibe_surf/langflow/services/shared_component_cache/factory.py +18 -0
  2677. vibe_surf/langflow/services/shared_component_cache/service.py +7 -0
  2678. vibe_surf/langflow/services/socket/__init__.py +0 -0
  2679. vibe_surf/langflow/services/socket/factory.py +20 -0
  2680. vibe_surf/langflow/services/socket/service.py +84 -0
  2681. vibe_surf/langflow/services/socket/utils.py +112 -0
  2682. vibe_surf/langflow/services/state/__init__.py +0 -0
  2683. vibe_surf/langflow/services/state/factory.py +16 -0
  2684. vibe_surf/langflow/services/state/service.py +82 -0
  2685. vibe_surf/langflow/services/storage/__init__.py +0 -0
  2686. vibe_surf/langflow/services/storage/constants.py +28 -0
  2687. vibe_surf/langflow/services/storage/factory.py +30 -0
  2688. vibe_surf/langflow/services/storage/local.py +127 -0
  2689. vibe_surf/langflow/services/storage/s3.py +105 -0
  2690. vibe_surf/langflow/services/storage/service.py +51 -0
  2691. vibe_surf/langflow/services/storage/utils.py +5 -0
  2692. vibe_surf/langflow/services/store/__init__.py +0 -0
  2693. vibe_surf/langflow/services/store/exceptions.py +25 -0
  2694. vibe_surf/langflow/services/store/factory.py +20 -0
  2695. vibe_surf/langflow/services/store/schema.py +74 -0
  2696. vibe_surf/langflow/services/store/service.py +600 -0
  2697. vibe_surf/langflow/services/store/utils.py +67 -0
  2698. vibe_surf/langflow/services/task/__init__.py +0 -0
  2699. vibe_surf/langflow/services/task/backends/__init__.py +0 -0
  2700. vibe_surf/langflow/services/task/backends/anyio.py +117 -0
  2701. vibe_surf/langflow/services/task/backends/base.py +15 -0
  2702. vibe_surf/langflow/services/task/backends/celery.py +29 -0
  2703. vibe_surf/langflow/services/task/factory.py +14 -0
  2704. vibe_surf/langflow/services/task/service.py +40 -0
  2705. vibe_surf/langflow/services/task/temp_flow_cleanup.py +136 -0
  2706. vibe_surf/langflow/services/task/utils.py +23 -0
  2707. vibe_surf/langflow/services/telemetry/__init__.py +0 -0
  2708. vibe_surf/langflow/services/telemetry/factory.py +20 -0
  2709. vibe_surf/langflow/services/telemetry/opentelemetry.py +253 -0
  2710. vibe_surf/langflow/services/telemetry/schema.py +45 -0
  2711. vibe_surf/langflow/services/telemetry/service.py +281 -0
  2712. vibe_surf/langflow/services/tracing/__init__.py +0 -0
  2713. vibe_surf/langflow/services/tracing/arize_phoenix.py +375 -0
  2714. vibe_surf/langflow/services/tracing/base.py +71 -0
  2715. vibe_surf/langflow/services/tracing/factory.py +20 -0
  2716. vibe_surf/langflow/services/tracing/langfuse.py +170 -0
  2717. vibe_surf/langflow/services/tracing/langsmith.py +208 -0
  2718. vibe_surf/langflow/services/tracing/langwatch.py +185 -0
  2719. vibe_surf/langflow/services/tracing/opik.py +235 -0
  2720. vibe_surf/langflow/services/tracing/schema.py +20 -0
  2721. vibe_surf/langflow/services/tracing/service.py +460 -0
  2722. vibe_surf/langflow/services/tracing/traceloop.py +244 -0
  2723. vibe_surf/langflow/services/tracing/utils.py +29 -0
  2724. vibe_surf/langflow/services/utils.py +246 -0
  2725. vibe_surf/langflow/services/variable/__init__.py +0 -0
  2726. vibe_surf/langflow/services/variable/base.py +119 -0
  2727. vibe_surf/langflow/services/variable/constants.py +2 -0
  2728. vibe_surf/langflow/services/variable/factory.py +28 -0
  2729. vibe_surf/langflow/services/variable/kubernetes.py +204 -0
  2730. vibe_surf/langflow/services/variable/kubernetes_secrets.py +193 -0
  2731. vibe_surf/langflow/services/variable/service.py +195 -0
  2732. vibe_surf/langflow/settings.py +12 -0
  2733. vibe_surf/langflow/template/__init__.py +10 -0
  2734. vibe_surf/langflow/template/field/__init__.py +0 -0
  2735. vibe_surf/langflow/template/field/base.py +257 -0
  2736. vibe_surf/langflow/template/field/prompt.py +2 -0
  2737. vibe_surf/langflow/template/frontend_node/__init__.py +6 -0
  2738. vibe_surf/langflow/template/frontend_node/base.py +214 -0
  2739. vibe_surf/langflow/template/frontend_node/constants.py +65 -0
  2740. vibe_surf/langflow/template/frontend_node/custom_components.py +97 -0
  2741. vibe_surf/langflow/template/template/__init__.py +0 -0
  2742. vibe_surf/langflow/template/template/base.py +99 -0
  2743. vibe_surf/langflow/template/utils.py +217 -0
  2744. vibe_surf/langflow/type_extraction/__init__.py +0 -0
  2745. vibe_surf/langflow/type_extraction/type_extraction.py +78 -0
  2746. vibe_surf/langflow/utils/__init__.py +0 -0
  2747. vibe_surf/langflow/utils/async_helpers.py +42 -0
  2748. vibe_surf/langflow/utils/component_utils.py +147 -0
  2749. vibe_surf/langflow/utils/compression.py +19 -0
  2750. vibe_surf/langflow/utils/concurrency.py +60 -0
  2751. vibe_surf/langflow/utils/connection_string_parser.py +8 -0
  2752. vibe_surf/langflow/utils/constants.py +205 -0
  2753. vibe_surf/langflow/utils/data_structure.py +212 -0
  2754. vibe_surf/langflow/utils/image.py +102 -0
  2755. vibe_surf/langflow/utils/lazy_load.py +15 -0
  2756. vibe_surf/langflow/utils/migration.py +61 -0
  2757. vibe_surf/langflow/utils/payload.py +84 -0
  2758. vibe_surf/langflow/utils/schemas.py +117 -0
  2759. vibe_surf/langflow/utils/template_validation.py +284 -0
  2760. vibe_surf/langflow/utils/util.py +479 -0
  2761. vibe_surf/langflow/utils/util_strings.py +56 -0
  2762. vibe_surf/langflow/utils/validate.py +489 -0
  2763. vibe_surf/langflow/utils/version.py +72 -0
  2764. vibe_surf/langflow/utils/voice_utils.py +92 -0
  2765. vibe_surf/langflow/worker.py +37 -0
  2766. vibe_surf/logger.py +3 -3
  2767. vibe_surf/telemetry/service.py +2 -1
  2768. vibe_surf/tools/browser_use_tools.py +0 -18
  2769. vibe_surf/tools/composio_client.py +4 -2
  2770. vibe_surf/tools/file_system.py +2 -1
  2771. vibe_surf/tools/utils.py +1423 -1
  2772. vibe_surf/tools/vibesurf_tools.py +359 -845
  2773. vibe_surf/tools/views.py +33 -7
  2774. vibe_surf/tools/website_api/douyin/client.py +20 -4
  2775. vibe_surf/tools/website_api/weibo/client.py +13 -82
  2776. vibe_surf/tools/website_api/xhs/client.py +49 -42
  2777. vibe_surf/tools/website_api/xhs/helpers.py +3 -2
  2778. vibe_surf/tools/website_api/youtube/client.py +13 -4
  2779. vibe_surf/utils.py +22 -1
  2780. vibe_surf/workflows/Browser/browser_click_element.py +189 -0
  2781. vibe_surf/workflows/Browser/browser_drag_drop.py +81 -0
  2782. vibe_surf/workflows/Browser/browser_evaluate_js.py +178 -0
  2783. vibe_surf/workflows/Browser/browser_extract_content.py +197 -0
  2784. vibe_surf/workflows/Browser/browser_focus_element.py +153 -0
  2785. vibe_surf/workflows/Browser/browser_generate_js.py +85 -0
  2786. vibe_surf/workflows/Browser/browser_go_back.py +45 -0
  2787. vibe_surf/workflows/Browser/browser_go_forward.py +44 -0
  2788. vibe_surf/workflows/Browser/browser_hover_element.py +154 -0
  2789. vibe_surf/workflows/Browser/browser_html_content.py +73 -0
  2790. vibe_surf/workflows/Browser/browser_input_text.py +169 -0
  2791. vibe_surf/workflows/Browser/browser_navigate.py +50 -0
  2792. vibe_surf/workflows/Browser/browser_new_tab.py +50 -0
  2793. vibe_surf/workflows/Browser/browser_page_info.py +67 -0
  2794. vibe_surf/workflows/Browser/browser_press_key.py +51 -0
  2795. vibe_surf/workflows/Browser/browser_reload.py +44 -0
  2796. vibe_surf/workflows/Browser/browser_scroll.py +99 -0
  2797. vibe_surf/workflows/Browser/browser_search.py +88 -0
  2798. vibe_surf/workflows/Browser/browser_select_options.py +94 -0
  2799. vibe_surf/workflows/Browser/browser_session.py +54 -0
  2800. vibe_surf/workflows/Browser/browser_take_screenshot.py +76 -0
  2801. vibe_surf/workflows/Browser/browser_upload_file.py +178 -0
  2802. vibe_surf/workflows/Browser/browser_wait.py +46 -0
  2803. vibe_surf/workflows/Browser/close_browser_session.py +51 -0
  2804. vibe_surf/workflows/FileSystem/extract_content_from_file.py +112 -0
  2805. vibe_surf/workflows/FileSystem/load_json.py +136 -0
  2806. vibe_surf/workflows/Integrations/composio_api.py +279 -0
  2807. vibe_surf/workflows/Integrations/douyin.py +232 -0
  2808. vibe_surf/workflows/Integrations/dropbox_compnent.py +11 -0
  2809. vibe_surf/workflows/Integrations/github_composio.py +11 -0
  2810. vibe_surf/workflows/Integrations/gmail_composio.py +38 -0
  2811. vibe_surf/workflows/Integrations/googlecalendar_composio.py +11 -0
  2812. vibe_surf/workflows/Integrations/googlemeet_composio.py +11 -0
  2813. vibe_surf/workflows/Integrations/googletasks_composio.py +8 -0
  2814. vibe_surf/workflows/Integrations/linear_composio.py +11 -0
  2815. vibe_surf/workflows/Integrations/outlook_composio.py +11 -0
  2816. vibe_surf/workflows/Integrations/reddit_composio.py +11 -0
  2817. vibe_surf/workflows/Integrations/slack_composio.py +11 -0
  2818. vibe_surf/workflows/Integrations/slackbot_composio.py +11 -0
  2819. vibe_surf/workflows/Integrations/supabase_composio.py +11 -0
  2820. vibe_surf/workflows/Integrations/todoist_composio.py +11 -0
  2821. vibe_surf/workflows/Integrations/weibo.py +244 -0
  2822. vibe_surf/workflows/Integrations/xiaohongshu.py +229 -0
  2823. vibe_surf/workflows/Integrations/yahoo.py +103 -0
  2824. vibe_surf/workflows/Integrations/youtube.py +251 -0
  2825. vibe_surf/workflows/Integrations/youtube_composio.py +11 -0
  2826. vibe_surf/workflows/VibeSurf/advanced_search.py +166 -0
  2827. vibe_surf/workflows/VibeSurf/browser_use_agent.py +150 -0
  2828. vibe_surf/workflows/VibeSurf/llm_profiles.py +103 -0
  2829. vibe_surf/workflows/VibeSurf/select_dataframe.py +44 -0
  2830. vibe_surf/workflows/VibeSurf/variable_manager.py +140 -0
  2831. vibe_surf/workflows/VibeSurf/vibesurf_agent.py +113 -0
  2832. vibesurf-0.2.9a2.dist-info/METADATA +406 -0
  2833. vibesurf-0.2.9a2.dist-info/RECORD +2916 -0
  2834. vibesurf-0.1.37.dist-info/METADATA +0 -192
  2835. vibesurf-0.1.37.dist-info/RECORD +0 -128
  2836. {vibesurf-0.1.37.dist-info → vibesurf-0.2.9a2.dist-info}/WHEEL +0 -0
  2837. {vibesurf-0.1.37.dist-info → vibesurf-0.2.9a2.dist-info}/entry_points.txt +0 -0
  2838. {vibesurf-0.1.37.dist-info → vibesurf-0.2.9a2.dist-info}/licenses/LICENSE +0 -0
  2839. {vibesurf-0.1.37.dist-info → vibesurf-0.2.9a2.dist-info}/top_level.txt +0 -0
@@ -1,23 +1,11 @@
1
- // Settings Manager - Handles settings UI, profiles, and environment variables
2
- // Manages LLM profiles, MCP profiles, and application settings
1
+ // Settings Manager - Handles settings UI coordination and delegates to specialized modules
2
+ // Manages coordination between general settings, profiles, integrations, and workflow
3
3
 
4
4
  class VibeSurfSettingsManager {
5
5
  constructor(apiClient) {
6
6
  this.apiClient = apiClient;
7
7
  this.state = {
8
- llmProfiles: [],
9
- mcpProfiles: [],
10
- voiceProfiles: [],
11
- settings: {},
12
- currentProfileForm: null,
13
- // Integrations state
14
- composioApiKey: null,
15
- composioKeyValid: false,
16
- toolkits: [],
17
- filteredToolkits: [],
18
- currentToolkit: null,
19
- searchQuery: '',
20
- filterStatus: 'all'
8
+ // State is now managed by individual modules
21
9
  };
22
10
  this.elements = {};
23
11
  this.eventListeners = new Map();
@@ -25,6 +13,12 @@ class VibeSurfSettingsManager {
25
13
  // Initialize user settings storage
26
14
  this.userSettingsStorage = new VibeSurfUserSettingsStorage();
27
15
 
16
+ // Initialize specialized managers
17
+ this.settingsGeneral = new VibeSurfSettingsGeneral(this.apiClient, this.userSettingsStorage, this.emit.bind(this));
18
+ this.settingsProfiles = new VibeSurfSettingsProfiles(this.apiClient, this.emit.bind(this));
19
+ this.settingsIntegrations = new VibeSurfSettingsIntegrations(this.apiClient, this.emit.bind(this));
20
+ this.settingsWorkflow = new VibeSurfSettingsWorkflow(this.apiClient, this.emit.bind(this), this.userSettingsStorage);
21
+
28
22
  this.bindElements();
29
23
  this.bindEvents();
30
24
  this.initializeUserSettings();
@@ -35,77 +29,13 @@ class VibeSurfSettingsManager {
35
29
  // Settings Modal
36
30
  settingsModal: document.getElementById('settings-modal'),
37
31
  settingsTabs: document.querySelectorAll('.settings-tab'),
38
- settingsTabContents: document.querySelectorAll('.settings-tab-content'),
39
-
40
- // General Settings
41
- themeSelect: document.getElementById('theme-select'),
42
- defaultAsrSelect: document.getElementById('default-asr-select'),
43
- defaultTtsSelect: document.getElementById('default-tts-select'),
44
-
45
- // LLM Profiles
46
- llmProfilesContainer: document.getElementById('llm-profiles-container'),
47
- addLlmProfileBtn: document.getElementById('add-llm-profile-btn'),
48
-
49
- // MCP Profiles
50
- mcpProfilesContainer: document.getElementById('mcp-profiles-container'),
51
- addMcpProfileBtn: document.getElementById('add-mcp-profile-btn'),
52
-
53
- // Voice Profiles
54
- voiceProfilesContainer: document.getElementById('voice-profiles-container'),
55
- addVoiceProfileBtn: document.getElementById('add-voice-profile-btn'),
56
-
57
- // Integrations
58
- integrationsContainer: document.getElementById('integrations-container'),
59
- setupApiKeyBtn: document.getElementById('setup-api-key-btn'),
60
- composioStatus: document.getElementById('composio-status'),
61
- apiKeySetup: document.getElementById('api-key-setup'),
62
- toolkitsSection: document.getElementById('toolkits-section'),
63
- toolkitSearch: document.getElementById('toolkit-search'),
64
- toolkitFilter: document.getElementById('toolkit-filter'),
65
- toolkitsList: document.getElementById('toolkits-list'),
66
- toolkitsLoading: document.getElementById('toolkits-loading'),
67
-
68
- // Composio API Key Modal
69
- composioApiKeyModal: document.getElementById('composio-api-key-modal'),
70
- composioApiKeyInput: document.getElementById('composio-api-key-input'),
71
- openComposioLink: document.getElementById('open-composio-link'),
72
- apiKeyCancel: document.getElementById('api-key-cancel'),
73
- apiKeyConfirm: document.getElementById('api-key-confirm'),
74
- apiKeyValidation: document.getElementById('api-key-validation'),
75
-
76
- // Tools Management Modal
77
- toolsManagementModal: document.getElementById('tools-management-modal'),
78
- toolsModalTitle: document.getElementById('tools-modal-title'),
79
- toolkitLogo: document.getElementById('toolkit-logo-img'),
80
- toolkitName: document.getElementById('toolkit-name'),
81
- toolkitDescription: document.getElementById('toolkit-description'),
82
- toolsList: document.getElementById('tools-list'),
83
- toolsLoading: document.getElementById('tools-loading'),
84
- selectAllTools: document.getElementById('select-all-tools'),
85
- deselectAllTools: document.getElementById('deselect-all-tools'),
86
- toolsCancel: document.getElementById('tools-cancel'),
87
- toolsSave: document.getElementById('tools-save'),
88
-
89
- // OAuth Confirmation Modal
90
- oauthConfirmationModal: document.getElementById('oauth-confirmation-modal'),
91
- oauthNotCompleted: document.getElementById('oauth-not-completed'),
92
- oauthCompleted: document.getElementById('oauth-completed'),
93
-
94
- // Profile Form Modal
95
- profileFormModal: document.getElementById('profile-form-modal'),
96
- profileFormTitle: document.getElementById('profile-form-title'),
97
- profileForm: document.getElementById('profile-form'),
98
- profileFormCancel: document.getElementById('profile-form-cancel'),
99
- profileFormSubmit: document.getElementById('profile-form-submit'),
100
- profileFormClose: document.querySelector('.profile-form-close'),
101
-
102
- // Environment Variables
103
- envVariablesList: document.getElementById('env-variables-list'),
104
- saveEnvVarsBtn: document.getElementById('save-env-vars-btn'),
105
-
106
- // Backend URL
107
- backendUrl: document.getElementById('backend-url')
32
+ settingsTabContents: document.querySelectorAll('.settings-tab-content')
108
33
  };
34
+
35
+ // Delegate element binding to specialized managers
36
+ this.settingsGeneral.bindElements();
37
+ this.settingsProfiles.bindElements();
38
+ // Integrations and workflow managers handle their own elements
109
39
  }
110
40
 
111
41
  bindEvents() {
@@ -120,73 +50,13 @@ class VibeSurfSettingsManager {
120
50
  tab.addEventListener('click', this.handleTabSwitch.bind(this));
121
51
  });
122
52
 
123
- // Profile management
124
- this.elements.addLlmProfileBtn?.addEventListener('click', () => this.handleAddProfile('llm'));
125
- this.elements.addMcpProfileBtn?.addEventListener('click', () => this.handleAddProfile('mcp'));
126
- this.elements.addVoiceProfileBtn?.addEventListener('click', () => this.handleAddProfile('voice'));
127
-
128
- // Profile form modal
129
- this.elements.profileFormCancel?.addEventListener('click', this.closeProfileForm.bind(this));
130
- this.elements.profileFormClose?.addEventListener('click', this.closeProfileForm.bind(this));
131
-
132
- // Profile form submission
133
- if (this.elements.profileForm) {
134
- this.elements.profileForm.addEventListener('submit', this.handleProfileFormSubmit.bind(this));
135
- }
136
-
137
- if (this.elements.profileFormSubmit) {
138
- this.elements.profileFormSubmit.addEventListener('click', this.handleProfileFormSubmitClick.bind(this));
139
- }
140
-
141
- // General settings
142
- this.elements.themeSelect?.addEventListener('change', this.handleThemeChange.bind(this));
143
- this.elements.defaultAsrSelect?.addEventListener('change', this.handleDefaultAsrChange.bind(this));
144
- this.elements.defaultTtsSelect?.addEventListener('change', this.handleDefaultTtsChange.bind(this));
145
-
146
- // Environment variables
147
- this.elements.saveEnvVarsBtn?.addEventListener('click', this.handleSaveEnvironmentVariables.bind(this));
148
-
149
- // Backend URL
150
- this.elements.backendUrl?.addEventListener('change', this.handleBackendUrlChange.bind(this));
151
-
152
- // Integrations
153
- this.elements.setupApiKeyBtn?.addEventListener('click', this.handleSetupApiKey.bind(this));
154
- this.elements.openComposioLink?.addEventListener('click', this.handleOpenComposioLink.bind(this));
155
- this.elements.apiKeyCancel?.addEventListener('click', this.hideApiKeyModal.bind(this));
156
- this.elements.apiKeyConfirm?.addEventListener('click', this.handleApiKeyConfirm.bind(this));
157
- this.elements.toolkitSearch?.addEventListener('input', this.handleToolkitSearch.bind(this));
158
- this.elements.toolkitFilter?.addEventListener('change', this.handleToolkitFilter.bind(this));
159
-
160
- // Tools Management Modal
161
- this.elements.selectAllTools?.addEventListener('click', this.handleSelectAllTools.bind(this));
162
- this.elements.deselectAllTools?.addEventListener('click', this.handleDeselectAllTools.bind(this));
163
- this.elements.toolsCancel?.addEventListener('click', this.hideToolsModal.bind(this));
164
- this.elements.toolsSave?.addEventListener('click', this.handleToolsSave.bind(this));
165
-
166
- // OAuth Confirmation Modal
167
- this.elements.oauthNotCompleted?.addEventListener('click', this.hideOAuthModal.bind(this));
168
- this.elements.oauthCompleted?.addEventListener('click', this.handleOAuthCompleted.bind(this));
53
+ // Delegate event binding to specialized managers
54
+ this.settingsGeneral.bindEvents();
55
+ this.settingsProfiles.bindEvents();
169
56
 
170
- // API key toggle visibility
171
- const apiKeyToggle = this.elements.composioApiKeyModal?.querySelector('.api-key-toggle');
172
- if (apiKeyToggle) {
173
- apiKeyToggle.addEventListener('click', this.handleApiKeyToggle.bind(this));
174
- }
175
-
176
- // Modal close buttons for integrations modals
177
- const composioModalClose = this.elements.composioApiKeyModal?.querySelector('.modal-close');
178
- if (composioModalClose) {
179
- composioModalClose.addEventListener('click', this.hideApiKeyModal.bind(this));
180
- }
181
-
182
- const toolsModalClose = this.elements.toolsManagementModal?.querySelector('.modal-close');
183
- if (toolsModalClose) {
184
- toolsModalClose.addEventListener('click', this.hideToolsModal.bind(this));
185
- }
186
-
187
- const oauthModalClose = this.elements.oauthConfirmationModal?.querySelector('.modal-close');
188
- if (oauthModalClose) {
189
- oauthModalClose.addEventListener('click', this.hideOAuthModal.bind(this));
57
+ // Workflow events are now handled by VibeSurfSettingsWorkflow
58
+ if (this.settingsWorkflow) {
59
+ this.settingsWorkflow.bindEvents();
190
60
  }
191
61
 
192
62
  // Global keyboard shortcuts
@@ -207,49 +77,14 @@ class VibeSurfSettingsManager {
207
77
  }
208
78
  }
209
79
 
210
- // Handle individual setting changes from storage
80
+ // Handle individual setting changes from storage - delegate to general settings
211
81
  handleStorageSettingChanged(data) {
212
-
213
- // Apply setting changes to UI if needed
214
- switch (data.key) {
215
- case 'theme':
216
- this.applyTheme(data.value);
217
- if (this.elements.themeSelect) {
218
- this.elements.themeSelect.value = data.value;
219
- }
220
- break;
221
- case 'defaultAsr':
222
- if (this.elements.defaultAsrSelect) {
223
- this.elements.defaultAsrSelect.value = data.value;
224
- }
225
- break;
226
- case 'defaultTts':
227
- if (this.elements.defaultTtsSelect) {
228
- this.elements.defaultTtsSelect.value = data.value;
229
- }
230
- break;
231
- }
82
+ this.settingsGeneral.handleStorageSettingChanged(data);
232
83
  }
233
84
 
234
- // Handle bulk settings changes from storage
85
+ // Handle bulk settings changes from storage - delegate to general settings
235
86
  handleStorageSettingsChanged(allSettings) {
236
- console.log('[SettingsManager] Storage settings changed (bulk):', allSettings);
237
-
238
- // Apply bulk setting changes to UI if needed
239
- if (allSettings.theme) {
240
- this.applyTheme(allSettings.theme);
241
- if (this.elements.themeSelect) {
242
- this.elements.themeSelect.value = allSettings.theme;
243
- }
244
- }
245
-
246
- if (allSettings.defaultAsr && this.elements.defaultAsrSelect) {
247
- this.elements.defaultAsrSelect.value = allSettings.defaultAsr;
248
- }
249
-
250
- if (allSettings.defaultTts && this.elements.defaultTtsSelect) {
251
- this.elements.defaultTtsSelect.value = allSettings.defaultTts;
252
- }
87
+ this.settingsGeneral.handleStorageSettingsChanged(allSettings);
253
88
  }
254
89
 
255
90
  handleKeydown(event) {
@@ -259,8 +94,8 @@ class VibeSurfSettingsManager {
259
94
  this.hideModal();
260
95
  }
261
96
  // Close profile form modal on Escape key
262
- if (this.elements.profileFormModal && !this.elements.profileFormModal.classList.contains('hidden')) {
263
- this.closeProfileForm();
97
+ if (this.settingsProfiles.elements.profileFormModal && !this.settingsProfiles.elements.profileFormModal.classList.contains('hidden')) {
98
+ this.settingsProfiles.closeProfileForm();
264
99
  }
265
100
  }
266
101
  }
@@ -307,42 +142,45 @@ class VibeSurfSettingsManager {
307
142
 
308
143
  // If switching to general tab, ensure environment variables are loaded
309
144
  if (targetTabId === 'general') {
310
- this.loadEnvironmentVariables();
145
+ this.settingsGeneral.loadEnvironmentVariables();
311
146
  }
312
147
 
313
148
  // If switching to integrations tab, load integrations data
314
149
  if (targetTabId === 'integrations') {
315
- this.loadIntegrationsData();
150
+ if (this.settingsIntegrations) {
151
+ this.settingsIntegrations.loadIntegrationsData();
152
+ }
153
+ }
154
+
155
+ // If switching to workflow tab, load workflow content
156
+ if (targetTabId === 'workflow') {
157
+ if (this.settingsWorkflow) {
158
+ this.settingsWorkflow.loadWorkflowContent();
159
+ }
316
160
  }
317
161
  }
318
162
 
319
- // Data Loading
163
+ // Data Loading - delegate to specialized managers
320
164
  async loadSettingsData() {
321
165
  try {
322
- // Load LLM profiles
323
- await this.loadLLMProfiles();
324
-
325
- // Load MCP profiles
326
- await this.loadMCPProfiles();
327
-
328
- // Load Voice profiles
329
- await this.loadVoiceProfiles();
330
-
331
- // Load environment variables
332
- await this.loadEnvironmentVariables();
166
+ // Load profiles data
167
+ await this.settingsProfiles.loadAllProfiles();
333
168
 
334
169
  // Load general settings
335
- await this.loadGeneralSettings();
170
+ await this.settingsGeneral.loadGeneralSettings();
336
171
 
337
172
  // Load voice profiles for general settings dropdowns
338
- await this.loadVoiceProfilesForGeneral();
173
+ await this.settingsGeneral.loadVoiceProfilesForGeneral();
174
+
175
+ // Load environment variables
176
+ await this.settingsGeneral.loadEnvironmentVariables();
339
177
 
340
178
  // Emit event to update LLM profile select dropdown
341
179
  // This should happen AFTER all data is loaded but BEFORE user selections are restored
342
180
  this.emit('profilesUpdated', {
343
- llmProfiles: this.state.llmProfiles,
344
- mcpProfiles: this.state.mcpProfiles,
345
- voiceProfiles: this.state.voiceProfiles
181
+ llmProfiles: this.settingsProfiles.getLLMProfiles(),
182
+ mcpProfiles: this.settingsProfiles.getMCPProfiles(),
183
+ voiceProfiles: this.settingsProfiles.getVoiceProfiles()
346
184
  });
347
185
 
348
186
  } catch (error) {
@@ -351,2535 +189,86 @@ class VibeSurfSettingsManager {
351
189
  }
352
190
  }
353
191
 
354
- async loadLLMProfiles() {
355
- try {
356
- const response = await this.apiClient.getLLMProfiles(false); // Load all profiles, not just active
357
- console.log('[SettingsManager] LLM profiles loaded:', response);
358
-
359
- // Handle different response structures
360
- let profiles = [];
361
- if (Array.isArray(response)) {
362
- profiles = response;
363
- } else if (response.profiles && Array.isArray(response.profiles)) {
364
- profiles = response.profiles;
365
- } else if (response.data && Array.isArray(response.data)) {
366
- profiles = response.data;
367
- }
368
-
369
- this.state.llmProfiles = profiles;
370
- this.renderLLMProfiles(profiles);
371
- } catch (error) {
372
- console.error('[SettingsManager] Failed to load LLM profiles:', error);
373
- this.state.llmProfiles = [];
374
- this.renderLLMProfiles([]);
375
- }
376
- }
377
-
378
- async loadMCPProfiles() {
379
- try {
380
- const response = await this.apiClient.getMCPProfiles(false); // Load all profiles, not just active
381
- console.log('[SettingsManager] MCP profiles loaded:', response);
382
-
383
- // Handle different response structures
384
- let profiles = [];
385
- if (Array.isArray(response)) {
386
- profiles = response;
387
- } else if (response.profiles && Array.isArray(response.profiles)) {
388
- profiles = response.profiles;
389
- } else if (response.data && Array.isArray(response.data)) {
390
- profiles = response.data;
391
- }
392
-
393
- this.state.mcpProfiles = profiles;
394
- this.renderMCPProfiles(profiles);
395
- } catch (error) {
396
- console.error('[SettingsManager] Failed to load MCP profiles:', error);
397
- this.state.mcpProfiles = [];
398
- this.renderMCPProfiles([]);
399
- }
400
- }
401
-
402
- async loadVoiceProfiles() {
403
- try {
404
- const response = await this.apiClient.getVoiceProfiles(false); // Load all profiles, not just active
405
- console.log('[SettingsManager] Voice profiles loaded:', response);
406
-
407
- // Handle different response structures
408
- let profiles = [];
409
- if (Array.isArray(response)) {
410
- profiles = response;
411
- } else if (response.profiles && Array.isArray(response.profiles)) {
412
- profiles = response.profiles;
413
- } else if (response.data && Array.isArray(response.data)) {
414
- profiles = response.data;
415
- }
416
-
417
- this.state.voiceProfiles = profiles;
418
- this.renderVoiceProfiles(profiles);
419
- } catch (error) {
420
- console.error('[SettingsManager] Failed to load Voice profiles:', error);
421
- this.state.voiceProfiles = [];
422
- this.renderVoiceProfiles([]);
423
- }
424
- }
425
-
426
- async loadEnvironmentVariables() {
427
- try {
428
- const response = await this.apiClient.getEnvironmentVariables();
429
- console.log('[SettingsManager] Environment variables loaded:', response);
430
- const envVars = response.environments || response || {};
431
- this.renderEnvironmentVariables(envVars);
432
- } catch (error) {
433
- console.error('[SettingsManager] Failed to load environment variables:', error);
434
- this.renderEnvironmentVariables({});
435
- }
436
- }
437
-
438
- async loadGeneralSettings() {
439
- try {
440
- // Load and apply theme setting from user settings storage
441
- const savedTheme = await this.userSettingsStorage.getTheme();
442
- if (this.elements.themeSelect) {
443
- this.elements.themeSelect.value = savedTheme;
444
- }
445
- this.applyTheme(savedTheme);
446
-
447
- // Voice profile defaults will be handled by autoSelectLatestVoiceProfiles
448
- // after voice profiles are loaded in loadVoiceProfilesForGeneral
449
-
450
- console.log('[SettingsManager] General settings loaded successfully');
451
- } catch (error) {
452
- console.error('[SettingsManager] Failed to load general settings:', error);
453
- }
192
+ // Delegate profile management to profiles module
193
+ async handleAddProfile(type) {
194
+ return this.settingsProfiles.handleAddProfile(type);
454
195
  }
455
196
 
456
- async loadVoiceProfilesForGeneral() {
457
- try {
458
- // Load voice profiles for ASR and TTS dropdowns in general settings
459
- const response = await this.apiClient.getVoiceProfiles(false);
460
-
461
- // Handle different response structures
462
- let profiles = [];
463
- if (Array.isArray(response)) {
464
- profiles = response;
465
- } else if (response.profiles && Array.isArray(response.profiles)) {
466
- profiles = response.profiles;
467
- } else if (response.data && Array.isArray(response.data)) {
468
- profiles = response.data;
469
- }
470
-
471
- // Filter profiles by type
472
- const asrProfiles = profiles.filter(p => p.voice_model_type === 'asr' && p.is_active);
473
- const ttsProfiles = profiles.filter(p => p.voice_model_type === 'tts' && p.is_active);
474
-
475
- // Populate ASR dropdown
476
- if (this.elements.defaultAsrSelect) {
477
- this.elements.defaultAsrSelect.innerHTML = '<option value="">No ASR profile selected</option>';
478
- asrProfiles.forEach(profile => {
479
- const option = document.createElement('option');
480
- option.value = profile.voice_profile_name;
481
- option.textContent = profile.voice_profile_name;
482
- this.elements.defaultAsrSelect.appendChild(option);
483
- });
484
- }
485
-
486
- // Populate TTS dropdown
487
- if (this.elements.defaultTtsSelect) {
488
- this.elements.defaultTtsSelect.innerHTML = '<option value="">No TTS profile selected</option>';
489
- ttsProfiles.forEach(profile => {
490
- const option = document.createElement('option');
491
- option.value = profile.voice_profile_name;
492
- option.textContent = profile.voice_profile_name;
493
- this.elements.defaultTtsSelect.appendChild(option);
494
- });
495
- }
496
-
497
- // Auto-select latest updated profiles if no defaults are set
498
- await this.autoSelectLatestVoiceProfiles(asrProfiles, ttsProfiles);
499
-
500
- } catch (error) {
501
- console.error('[SettingsManager] Failed to load voice profiles for general settings:', error);
502
- // Populate with empty options on error
503
- if (this.elements.defaultAsrSelect) {
504
- this.elements.defaultAsrSelect.innerHTML = '<option value="">Failed to load ASR profiles</option>';
505
- }
506
- if (this.elements.defaultTtsSelect) {
507
- this.elements.defaultTtsSelect.innerHTML = '<option value="">Failed to load TTS profiles</option>';
508
- }
509
- }
197
+ async showProfileForm(type, profile = null) {
198
+ return this.settingsProfiles.showProfileForm(type, profile);
510
199
  }
511
200
 
512
- async autoSelectLatestVoiceProfiles(asrProfiles, ttsProfiles) {
513
- try {
514
- // Get current saved defaults
515
- const savedAsrProfile = await this.userSettingsStorage.getDefaultAsr();
516
- const savedTtsProfile = await this.userSettingsStorage.getDefaultTts();
517
-
518
- // Check ASR profile
519
- if (!savedAsrProfile || !asrProfiles.find(p => p.voice_profile_name === savedAsrProfile)) {
520
- // No ASR profile selected or saved profile doesn't exist, select latest updated
521
- if (asrProfiles.length > 0) {
522
- // Sort by updated_at desc to get the latest updated profile
523
- const latestAsrProfile = asrProfiles.sort((a, b) => {
524
- const dateA = new Date(a.updated_at || a.created_at);
525
- const dateB = new Date(b.updated_at || b.created_at);
526
- return dateB - dateA; // DESC order
527
- })[0];
528
-
529
- console.log('[SettingsManager] Auto-selecting latest ASR profile:', latestAsrProfile.voice_profile_name);
530
-
531
- // Set as default in storage
532
- await this.userSettingsStorage.setDefaultAsr(latestAsrProfile.voice_profile_name);
533
-
534
- // Update UI
535
- if (this.elements.defaultAsrSelect) {
536
- this.elements.defaultAsrSelect.value = latestAsrProfile.voice_profile_name;
537
- }
538
-
539
- this.emit('notification', {
540
- message: `Auto-selected latest ASR profile: ${latestAsrProfile.voice_profile_name}`,
541
- type: 'info'
542
- });
543
- }
544
- } else {
545
- // Saved ASR profile exists and is valid - restore it to UI
546
- console.log('[SettingsManager] Restoring saved ASR profile to UI:', savedAsrProfile);
547
- if (this.elements.defaultAsrSelect) {
548
- this.elements.defaultAsrSelect.value = savedAsrProfile;
549
- }
550
- }
551
-
552
- // Check TTS profile
553
- if (!savedTtsProfile || !ttsProfiles.find(p => p.voice_profile_name === savedTtsProfile)) {
554
- // No TTS profile selected or saved profile doesn't exist, select latest updated
555
- if (ttsProfiles.length > 0) {
556
- // Sort by updated_at desc to get the latest updated profile
557
- const latestTtsProfile = ttsProfiles.sort((a, b) => {
558
- const dateA = new Date(a.updated_at || a.created_at);
559
- const dateB = new Date(b.updated_at || b.created_at);
560
- return dateB - dateA; // DESC order
561
- })[0];
562
-
563
- console.log('[SettingsManager] Auto-selecting latest TTS profile:', latestTtsProfile.voice_profile_name);
564
-
565
- // Set as default in storage
566
- await this.userSettingsStorage.setDefaultTts(latestTtsProfile.voice_profile_name);
567
-
568
- // Update UI
569
- if (this.elements.defaultTtsSelect) {
570
- this.elements.defaultTtsSelect.value = latestTtsProfile.voice_profile_name;
571
- }
572
-
573
- this.emit('notification', {
574
- message: `Auto-selected latest TTS profile: ${latestTtsProfile.voice_profile_name}`,
575
- type: 'info'
576
- });
577
- }
578
- } else {
579
- // Saved TTS profile exists and is valid - restore it to UI
580
- console.log('[SettingsManager] Restoring saved TTS profile to UI:', savedTtsProfile);
581
- if (this.elements.defaultTtsSelect) {
582
- this.elements.defaultTtsSelect.value = savedTtsProfile;
583
- }
584
- }
585
-
586
- } catch (error) {
587
- console.error('[SettingsManager] Failed to auto-select latest voice profiles:', error);
588
- }
201
+ closeProfileForm() {
202
+ return this.settingsProfiles.closeProfileForm();
589
203
  }
590
204
 
591
- async handleDefaultAsrChange(event) {
592
- const selectedProfile = event.target.value;
593
-
594
- try {
595
- // Store ASR profile preference in user settings storage
596
- await this.userSettingsStorage.setDefaultAsr(selectedProfile);
597
-
598
- if (selectedProfile) {
599
- this.emit('notification', {
600
- message: `Default ASR profile set to ${selectedProfile}`,
601
- type: 'success'
602
- });
603
- } else {
604
- this.emit('notification', {
605
- message: 'Default ASR profile cleared',
606
- type: 'info'
607
- });
608
- }
609
-
610
- } catch (error) {
611
- console.error('[SettingsManager] Failed to change default ASR profile:', error);
612
- this.emit('notification', {
613
- message: 'Failed to change default ASR profile',
614
- type: 'error'
615
- });
616
- }
205
+ // Delegate profile deletion to profiles module
206
+ async handleDeleteProfile(type, profileId) {
207
+ return this.settingsProfiles.handleDeleteProfile(type, profileId);
617
208
  }
618
209
 
619
- async handleDefaultTtsChange(event) {
620
- const selectedProfile = event.target.value;
621
-
622
- try {
623
- // Store TTS profile preference in user settings storage
624
- await this.userSettingsStorage.setDefaultTts(selectedProfile);
625
-
626
- if (selectedProfile) {
627
- this.emit('notification', {
628
- message: `Default TTS profile set to ${selectedProfile}`,
629
- type: 'success'
630
- });
631
- } else {
632
- this.emit('notification', {
633
- message: 'Default TTS profile cleared',
634
- type: 'info'
635
- });
636
- }
637
-
638
- } catch (error) {
639
- console.error('[SettingsManager] Failed to change default TTS profile:', error);
640
- this.emit('notification', {
641
- message: 'Failed to change default TTS profile',
642
- type: 'error'
643
- });
644
- }
210
+ // Public interface - delegate to modules
211
+ getState() {
212
+ return {
213
+ llmProfiles: this.settingsProfiles.getLLMProfiles(),
214
+ mcpProfiles: this.settingsProfiles.getMCPProfiles(),
215
+ voiceProfiles: this.settingsProfiles.getVoiceProfiles()
216
+ };
645
217
  }
646
218
 
647
- // Profile Management
648
- async handleAddProfile(type) {
649
- try {
650
- this.showProfileForm(type);
651
- } catch (error) {
652
- console.error(`[SettingsManager] Failed to show ${type} profile form:`, error);
653
- this.emit('error', { message: `Failed to show ${type} profile form` });
654
- }
219
+ getLLMProfiles() {
220
+ return this.settingsProfiles.getLLMProfiles();
655
221
  }
656
222
 
657
- async showProfileForm(type, profile = null) {
658
- const isEdit = profile !== null;
659
- const title = isEdit ? `Edit ${type.toUpperCase()}` : `Add ${type.toUpperCase()}`;
660
-
661
- if (this.elements.profileFormTitle) {
662
- this.elements.profileFormTitle.textContent = title;
663
- }
664
-
665
- // Generate form content based on type
666
- let formHTML = '';
667
- if (type === 'llm') {
668
- formHTML = await this.generateLLMProfileForm(profile);
669
- } else if (type === 'mcp') {
670
- formHTML = this.generateMCPProfileForm(profile);
671
- } else if (type === 'voice') {
672
- formHTML = await this.generateVoiceProfileForm(profile);
673
- }
674
-
675
- if (this.elements.profileForm) {
676
- this.elements.profileForm.innerHTML = formHTML;
677
- this.elements.profileForm.dataset.type = type;
678
- this.elements.profileForm.dataset.mode = isEdit ? 'edit' : 'create';
679
- if (isEdit && profile) {
680
- this.elements.profileForm.dataset.profileId = profile.profile_name || profile.mcp_id || profile.voice_profile_name;
681
- }
682
- }
683
-
684
- // Setup form event listeners
685
- this.setupProfileFormEvents();
686
-
687
- // Show modal
688
- if (this.elements.profileFormModal) {
689
- this.elements.profileFormModal.classList.remove('hidden');
690
- }
223
+ getMCPProfiles() {
224
+ return this.settingsProfiles.getMCPProfiles();
691
225
  }
692
226
 
693
- async generateLLMProfileForm(profile = null) {
694
- // Fetch available providers
695
- let providers = [];
696
- try {
697
- const response = await this.apiClient.getLLMProviders();
698
- providers = response.providers || response || [];
699
- } catch (error) {
700
- console.error('[SettingsManager] Failed to fetch LLM providers:', error);
701
- }
702
-
703
- const providersOptions = providers.map(p =>
704
- `<option value="${p.name}" ${profile?.provider === p.name ? 'selected' : ''}>${p.display_name}</option>`
705
- ).join('');
706
-
707
- const selectedProvider = profile?.provider || (providers.length > 0 ? providers[0].name : '');
708
- const selectedProviderData = providers.find(p => p.name === selectedProvider);
709
- const models = selectedProviderData?.models || [];
710
-
711
- return `
712
- <div class="form-group">
713
- <label class="form-label required">Profile Name</label>
714
- <input type="text" name="profile_name" class="form-input" value="${profile?.profile_name || ''}"
715
- placeholder="Enter a unique name for this profile" required ${profile ? 'readonly' : ''}>
716
- <div class="form-help">A unique identifier for this LLM configuration</div>
717
- </div>
718
-
719
- <div class="form-group">
720
- <label class="form-label required">Provider</label>
721
- <select name="provider" class="form-select" required>
722
- <option value="">Select a provider</option>
723
- ${providersOptions}
724
- </select>
725
- <div class="form-help">Choose your LLM provider (OpenAI, Anthropic, etc.)</div>
726
- </div>
727
-
728
- <div class="form-group">
729
- <label class="form-label required">Model</label>
730
- <input type="text" name="model" class="form-input model-input" value="${profile?.model || ''}"
731
- list="model-options" placeholder="Select a model or type custom model name" required
732
- autocomplete="off">
733
- <datalist id="model-options">
734
- ${models.map(model => `<option value="${model}">${model}</option>`).join('')}
735
- </datalist>
736
- <div class="form-help">Choose from the list or enter a custom model name</div>
737
- </div>
738
-
739
- <div class="form-group api-key-field">
740
- <label class="form-label required">API Key</label>
741
- <input type="password" name="api_key" class="form-input api-key-input"
742
- placeholder="${profile ? 'Leave empty to keep existing key' : 'Enter your API key'}"
743
- ${profile ? '' : 'required'}>
744
- <button type="button" class="api-key-toggle" title="Toggle visibility">
745
- <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
746
- <path d="M1 12S5 4 12 4S23 12 23 12S19 20 12 20S1 12 1 12Z" stroke="currentColor" stroke-width="2"/>
747
- <circle cx="12" cy="12" r="3" stroke="currentColor" stroke-width="2"/>
748
- </svg>
749
- </button>
750
- <div class="form-help">Your provider's API key for authentication</div>
751
- </div>
752
-
753
- <div class="form-group">
754
- <label class="form-label">Base URL</label>
755
- <input type="url" name="base_url" class="form-input" value="${profile?.base_url || ''}"
756
- placeholder="https://api.openai.com/v1">
757
- <div class="form-help">Custom API endpoint (leave empty for provider default)</div>
758
- </div>
759
-
760
- <div class="form-group">
761
- <label class="form-label">Temperature</label>
762
- <input type="number" name="temperature" class="form-input" value="${profile?.temperature || ''}"
763
- min="0" max="2" step="0.1" placeholder="0.7">
764
- <div class="form-help">Controls randomness (0.0-2.0, lower = more focused)</div>
765
- </div>
766
-
767
- <div class="form-group">
768
- <label class="form-label">Max Tokens</label>
769
- <input type="number" name="max_tokens" class="form-input" value="${profile?.max_tokens || ''}"
770
- min="1" max="128000" placeholder="4096">
771
- <div class="form-help">Maximum tokens in the response</div>
772
- </div>
773
-
774
- <div class="form-group">
775
- <label class="form-label">Description</label>
776
- <textarea name="description" class="form-textarea" placeholder="Optional description for this profile">${profile?.description || ''}</textarea>
777
- <div class="form-help">Optional description to help identify this profile</div>
778
- </div>
779
-
780
- <div class="form-group">
781
- <label style="display: flex; align-items: center; gap: 8px; cursor: pointer;">
782
- <input type="checkbox" name="is_default" ${profile?.is_default ? 'checked' : ''}>
783
- <span class="form-label" style="margin: 0;">Set as default profile</span>
784
- </label>
785
- <div class="form-help">This profile will be selected by default for new tasks</div>
786
- </div>
787
- `;
227
+ getVoiceProfiles() {
228
+ return this.settingsProfiles.getVoiceProfiles();
788
229
  }
789
230
 
790
- async generateVoiceProfileForm(profile = null) {
791
- // Fetch available voice models
792
- let models = [];
793
- try {
794
- const response = await this.apiClient.getVoiceModels();
795
- models = response.models || response || [];
796
- } catch (error) {
797
- console.error('[SettingsManager] Failed to fetch voice models:', error);
798
- }
799
-
800
- // Group models by type
801
- const asrModels = models.filter(m => m.model_type === 'asr');
802
- const ttsModels = models.filter(m => m.model_type === 'tts');
803
-
804
- const selectedModelType = profile?.voice_model_type || 'asr';
805
- const availableModels = selectedModelType === 'asr' ? asrModels : ttsModels;
806
-
807
- const modelsOptions = availableModels.map(m =>
808
- `<option value="${m.model_name}" ${profile?.voice_model_name === m.model_name ? 'selected' : ''}>${m.model_name}</option>`
809
- ).join('');
810
-
811
- // Convert existing meta params to JSON for editing
812
- let defaultMetaJson = '{}';
813
- if (profile?.voice_meta_params) {
814
- try {
815
- defaultMetaJson = JSON.stringify(profile.voice_meta_params, null, 2);
816
- } catch (error) {
817
- console.warn('[SettingsManager] Failed to stringify existing voice_meta_params:', error);
818
- }
231
+ showModal() {
232
+ if (this.elements.settingsModal) {
233
+ this.elements.settingsModal.classList.remove('hidden');
819
234
  }
820
-
821
- return `
822
- <div class="form-group">
823
- <label class="form-label required">Profile Name</label>
824
- <input type="text" name="voice_profile_name" class="form-input" value="${profile?.voice_profile_name || ''}"
825
- placeholder="Enter a unique name for this profile" required ${profile ? 'readonly' : ''}>
826
- <div class="form-help">A unique identifier for this voice configuration</div>
827
- </div>
828
-
829
- <div class="form-group">
830
- <label class="form-label required">Model Type</label>
831
- <select name="voice_model_type" class="form-select" required>
832
- <option value="asr" ${selectedModelType === 'asr' ? 'selected' : ''}>ASR (Speech Recognition)</option>
833
- <option value="tts" ${selectedModelType === 'tts' ? 'selected' : ''}>TTS (Text to Speech)</option>
834
- </select>
835
- <div class="form-help">Choose the type of voice model</div>
836
- </div>
837
-
838
- <div class="form-group">
839
- <label class="form-label required">Voice Model</label>
840
- <select name="voice_model_name" class="form-select voice-model-select" required>
841
- <option value="">Select a model</option>
842
- ${modelsOptions}
843
- </select>
844
- <div class="form-help">Choose your voice model</div>
845
- </div>
846
-
847
- <div class="form-group api-key-field">
848
- <label class="form-label required">API Key</label>
849
- <input type="password" name="api_key" class="form-input api-key-input"
850
- placeholder="${profile ? 'Leave empty to keep existing key' : 'Enter your API key'}"
851
- ${profile ? '' : 'required'}>
852
- <button type="button" class="api-key-toggle" title="Toggle visibility">
853
- <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
854
- <path d="M1 12S5 4 12 4S23 12 23 12S19 20 12 20S1 12 1 12Z" stroke="currentColor" stroke-width="2"/>
855
- <circle cx="12" cy="12" r="3" stroke="currentColor" stroke-width="2"/>
856
- </svg>
857
- </button>
858
- <div class="form-help">Your voice provider's API key for authentication</div>
859
- </div>
860
-
861
- <div class="form-group">
862
- <label class="form-label">Model Parameters (JSON)</label>
863
- <textarea name="voice_meta_params_json" class="form-textarea json-input" rows="4"
864
- placeholder="Enter JSON configuration for model parameters (optional)">${defaultMetaJson}</textarea>
865
- <div class="json-validation-feedback"></div>
866
- <div class="form-help">
867
- Optional JSON configuration for model-specific parameters. Example:
868
- <br><code>{"language": "zh", "sample_rate": 16000}</code>
869
- </div>
870
- </div>
871
-
872
- <div class="form-group">
873
- <label class="form-label">Description</label>
874
- <textarea name="description" class="form-textarea" placeholder="Optional description for this profile">${profile?.description || ''}</textarea>
875
- <div class="form-help">Optional description to help identify this profile</div>
876
- </div>
877
-
878
- <div class="form-group">
879
- <label style="display: flex; align-items: center; gap: 8px; cursor: pointer;">
880
- <input type="checkbox" name="is_active" ${profile?.is_active !== false ? 'checked' : ''}>
881
- <span class="form-label" style="margin: 0;">Active</span>
882
- </label>
883
- <div class="form-help">Whether this voice profile is active and available for use</div>
884
- </div>
885
- `;
886
235
  }
887
236
 
888
- generateMCPProfileForm(profile = null) {
889
- // Convert existing profile to JSON for editing
890
- let defaultJson = '{\n "command": "npx",\n "args": [\n "-y",\n "@modelcontextprotocol/server-filesystem",\n "/path/to/directory"\n ]\n}';
891
-
892
- if (profile?.mcp_server_params) {
893
- try {
894
- defaultJson = JSON.stringify(profile.mcp_server_params, null, 2);
895
- } catch (error) {
896
- console.warn('[SettingsManager] Failed to stringify existing mcp_server_params:', error);
897
- }
898
- }
899
-
900
- return `
901
- <div class="form-group">
902
- <label class="form-label required">Display Name</label>
903
- <input type="text" name="display_name" class="form-input" value="${profile?.display_name || ''}"
904
- placeholder="Enter a friendly name for this MCP profile" required ${profile ? 'readonly' : ''}>
905
- <div class="form-help">A user-friendly name for this MCP configuration</div>
906
- </div>
907
-
908
- <div class="form-group">
909
- <label class="form-label required">Server Name</label>
910
- <input type="text" name="mcp_server_name" class="form-input" value="${profile?.mcp_server_name || ''}"
911
- placeholder="e.g., filesystem, markitdown, brave-search" required>
912
- <div class="form-help">The MCP server identifier</div>
913
- </div>
914
-
915
- <div class="form-group">
916
- <label class="form-label required">MCP Server Parameters (JSON)</label>
917
- <textarea name="mcp_server_params_json" class="form-textarea json-input" rows="8"
918
- placeholder="Enter JSON configuration for MCP server parameters" required>${defaultJson}</textarea>
919
- <div class="json-validation-feedback"></div>
920
- <div class="form-help">
921
- JSON configuration including command and arguments. Example:
922
- <br><code>{"command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "/path"]}</code>
923
- </div>
924
- </div>
925
-
926
- <div class="form-group">
927
- <label class="form-label">Description</label>
928
- <textarea name="description" class="form-textarea" placeholder="Optional description for this MCP profile">${profile?.description || ''}</textarea>
929
- <div class="form-help">Optional description to help identify this profile</div>
930
- </div>
931
-
932
- <div class="form-group">
933
- <label style="display: flex; align-items: center; gap: 8px; cursor: pointer;">
934
- <input type="checkbox" name="is_active" ${profile?.is_active !== false ? 'checked' : ''}>
935
- <span class="form-label" style="margin: 0;">Active</span>
936
- </label>
937
- <div class="form-help">Whether this MCP profile is active and available for use</div>
938
- </div>
939
- `;
237
+ showSettings() {
238
+ this.showModal();
940
239
  }
941
240
 
942
- setupProfileFormEvents() {
943
- console.log('[SettingsManager] Setting up profile form events');
944
-
945
- // Provider change handler for LLM profiles
946
- const providerSelect = this.elements.profileForm?.querySelector('select[name="provider"]');
947
- if (providerSelect) {
948
- providerSelect.addEventListener('change', this.handleProviderChange.bind(this));
949
- }
950
-
951
- // Voice model type change handler for Voice profiles
952
- const voiceModelTypeSelect = this.elements.profileForm?.querySelector('select[name="voice_model_type"]');
953
- if (voiceModelTypeSelect) {
954
- voiceModelTypeSelect.addEventListener('change', this.handleVoiceModelTypeChange.bind(this));
955
- }
956
-
957
- // API key toggle handler
958
- const apiKeyToggle = this.elements.profileForm?.querySelector('.api-key-toggle');
959
- const apiKeyInput = this.elements.profileForm?.querySelector('.api-key-input');
960
- if (apiKeyToggle && apiKeyInput) {
961
- apiKeyToggle.addEventListener('click', () => {
962
- const isPassword = apiKeyInput.type === 'password';
963
- apiKeyInput.type = isPassword ? 'text' : 'password';
964
-
965
- // Update icon
966
- const svg = apiKeyToggle.querySelector('svg');
967
- if (svg) {
968
- svg.innerHTML = isPassword ?
969
- '<path d="M17.94 17.94A10.07 10.07 0 0 1 12 20C7 20 2.73 16.39 1 12A18.45 18.45 0 0 1 5.06 5.06L17.94 17.94ZM9.9 4.24A9.12 9.12 0 0 1 12 4C17 4 21.27 7.61 23 12A18.5 18.5 0 0 1 19.42 16.42" stroke="currentColor" stroke-width="2" fill="none"/><path d="M1 1L23 23" stroke="currentColor" stroke-width="2"/><circle cx="12" cy="12" r="3" stroke="currentColor" stroke-width="2" fill="none"/>' :
970
- '<path d="M1 12S5 4 12 4S23 12 23 12S19 20 12 20S1 12 1 12Z" stroke="currentColor" stroke-width="2"/><circle cx="12" cy="12" r="3" stroke="currentColor" stroke-width="2"/>';
971
- }
972
- });
973
- }
974
-
975
- // JSON validation handler for MCP profiles
976
- const jsonInput = this.elements.profileForm?.querySelector('textarea[name="mcp_server_params_json"]');
977
- if (jsonInput) {
978
- jsonInput.addEventListener('input', this.handleJsonInputValidation.bind(this));
979
- jsonInput.addEventListener('blur', this.handleJsonInputValidation.bind(this));
980
-
981
- // Trigger initial validation
982
- this.handleJsonInputValidation({ target: jsonInput });
983
- }
984
-
985
- // JSON validation handler for Voice meta params
986
- const voiceJsonInput = this.elements.profileForm?.querySelector('textarea[name="voice_meta_params_json"]');
987
- if (voiceJsonInput) {
988
- voiceJsonInput.addEventListener('input', this.handleVoiceJsonInputValidation.bind(this));
989
- voiceJsonInput.addEventListener('blur', this.handleVoiceJsonInputValidation.bind(this));
990
-
991
- // Trigger initial validation
992
- this.handleVoiceJsonInputValidation({ target: voiceJsonInput });
241
+ hideModal() {
242
+ if (this.elements.settingsModal) {
243
+ this.elements.settingsModal.classList.add('hidden');
993
244
  }
994
245
  }
995
246
 
996
- handleJsonInputValidation(event) {
997
- const textarea = event.target;
998
- const feedbackElement = textarea.parentElement.querySelector('.json-validation-feedback');
999
-
1000
- if (!feedbackElement) return;
1001
-
1002
- const jsonText = textarea.value.trim();
1003
-
1004
- if (!jsonText) {
1005
- feedbackElement.innerHTML = '';
1006
- textarea.classList.remove('json-valid', 'json-invalid');
1007
- return;
1008
- }
1009
-
1010
- try {
1011
- const parsed = JSON.parse(jsonText);
1012
-
1013
- // Validate that it's an object (not array, string, etc.)
1014
- if (typeof parsed !== 'object' || Array.isArray(parsed) || parsed === null) {
1015
- throw new Error('MCP server parameters must be a JSON object');
1016
- }
1017
-
1018
- // Validate required fields
1019
- if (!parsed.command || typeof parsed.command !== 'string') {
1020
- throw new Error('Missing or invalid "command" field (must be a string)');
1021
- }
1022
-
1023
- // Validate args if present
1024
- if (parsed.args && !Array.isArray(parsed.args)) {
1025
- throw new Error('"args" field must be an array if provided');
1026
- }
1027
-
1028
- // Success
1029
- feedbackElement.innerHTML = '<span class="json-success">✓ Valid JSON configuration</span>';
1030
- textarea.classList.remove('json-invalid');
1031
- textarea.classList.add('json-valid');
1032
-
1033
- // Store valid state for form submission
1034
- textarea.dataset.isValid = 'true';
1035
-
1036
- } catch (error) {
1037
- const errorMessage = error.message;
1038
- feedbackElement.innerHTML = `<span class="json-error">✗ Invalid JSON: ${errorMessage}</span>`;
1039
- textarea.classList.remove('json-valid');
1040
- textarea.classList.add('json-invalid');
1041
-
1042
- // Store invalid state for form submission
1043
- textarea.dataset.isValid = 'false';
1044
- textarea.dataset.errorMessage = errorMessage;
1045
- }
247
+ updateBackendUrl(url) {
248
+ this.settingsGeneral.updateBackendUrl(url);
1046
249
  }
1047
250
 
1048
- handleVoiceJsonInputValidation(event) {
1049
- const textarea = event.target;
1050
- const feedbackElement = textarea.parentElement.querySelector('.json-validation-feedback');
1051
-
1052
- if (!feedbackElement) return;
251
+ // Navigate to specific LLM profile for editing
252
+ async navigateToLLMProfile(profileName) {
253
+ console.log('[SettingsManager] Navigating to LLM profile:', profileName);
1053
254
 
1054
- const jsonText = textarea.value.trim();
255
+ // First show the settings modal
256
+ this.showSettings();
1055
257
 
1056
- if (!jsonText) {
1057
- feedbackElement.innerHTML = '';
1058
- textarea.classList.remove('json-valid', 'json-invalid');
1059
- return;
258
+ // Switch to LLM profiles tab
259
+ const llmTab = document.querySelector('.settings-tab[data-tab="llm-profiles"]');
260
+ if (llmTab) {
261
+ llmTab.click(); // This will trigger handleTabSwitch
1060
262
  }
1061
263
 
1062
- try {
1063
- const parsed = JSON.parse(jsonText);
1064
-
1065
- // Validate that it's an object (not array, string, etc.)
1066
- if (typeof parsed !== 'object' || Array.isArray(parsed) || parsed === null) {
1067
- throw new Error('Voice meta parameters must be a JSON object');
1068
- }
1069
-
1070
- // Success - no specific validation required for voice meta params (flexible structure)
1071
- feedbackElement.innerHTML = '<span class="json-success">✓ Valid JSON configuration</span>';
1072
- textarea.classList.remove('json-invalid');
1073
- textarea.classList.add('json-valid');
1074
-
1075
- // Store valid state for form submission
1076
- textarea.dataset.isValid = 'true';
1077
-
1078
- } catch (error) {
1079
- const errorMessage = error.message;
1080
- feedbackElement.innerHTML = `<span class="json-error">✗ Invalid JSON: ${errorMessage}</span>`;
1081
- textarea.classList.remove('json-valid');
1082
- textarea.classList.add('json-invalid');
1083
-
1084
- // Store invalid state for form submission
1085
- textarea.dataset.isValid = 'false';
1086
- textarea.dataset.errorMessage = errorMessage;
1087
- }
264
+ // Wait a moment for tab switching to complete
265
+ setTimeout(async () => {
266
+ // Delegate to profiles module
267
+ await this.settingsProfiles.navigateToLLMProfile(profileName);
268
+ }, 100);
1088
269
  }
1089
-
1090
- handleProfileFormSubmitClick(event) {
1091
- console.log('[SettingsManager] Profile form submit button clicked');
1092
- event.preventDefault();
1093
-
1094
- // Find the form and trigger submit
1095
- const form = this.elements.profileForm;
1096
- if (form) {
1097
- const submitEvent = new Event('submit', { cancelable: true, bubbles: true });
1098
- form.dispatchEvent(submitEvent);
1099
- }
1100
270
  }
1101
271
 
1102
- async handleVoiceModelTypeChange(event) {
1103
- const selectedType = event.target.value;
1104
- const modelSelect = this.elements.profileForm?.querySelector('select[name="voice_model_name"]');
1105
-
1106
- if (!selectedType || !modelSelect) {
1107
- return;
1108
- }
1109
-
1110
- // Clear current options
1111
- modelSelect.innerHTML = '<option value="">Loading...</option>';
1112
-
1113
- try {
1114
- const response = await this.apiClient.getVoiceModels(selectedType);
1115
- const models = response.models || response || [];
1116
-
1117
- // Models are already filtered by the API, no need to filter again
1118
-
1119
- // Update select options
1120
- modelSelect.innerHTML = '<option value="">Select a model</option>' +
1121
- models.map(model =>
1122
- `<option value="${model.model_name}">${model.model_name}</option>`
1123
- ).join('');
1124
-
1125
- } catch (error) {
1126
- console.error('[SettingsManager] Failed to fetch voice models for type:', error);
1127
- modelSelect.innerHTML = '<option value="">Failed to load models</option>';
1128
-
1129
- // Show user-friendly error notification
1130
- this.emit('notification', {
1131
- message: `Failed to load models for ${selectedType}. Please try again.`,
1132
- type: 'warning'
1133
- });
1134
- }
1135
- }
1136
-
1137
- async handleProviderChange(event) {
1138
- const selectedProvider = event.target.value;
1139
- const modelInput = this.elements.profileForm?.querySelector('input[name="model"]');
1140
- const modelDatalist = this.elements.profileForm?.querySelector('#model-options');
1141
-
1142
- if (!selectedProvider || !modelInput || !modelDatalist) {
1143
- return;
1144
- }
1145
-
1146
- // Always clear the model input when provider changes
1147
- modelInput.value = '';
1148
- modelInput.placeholder = `Loading ${selectedProvider} models...`;
1149
- modelDatalist.innerHTML = '<option value="">Loading...</option>';
1150
-
1151
- try {
1152
- const response = await this.apiClient.getLLMProviderModels(selectedProvider);
1153
- const models = response.models || response || [];
1154
-
1155
- // Update datalist options
1156
- modelDatalist.innerHTML = models.map(model =>
1157
- `<option value="${model}">${model}</option>`
1158
- ).join('');
1159
-
1160
- // Update placeholder to reflect the new provider
1161
- modelInput.placeholder = models.length > 0
1162
- ? `Select a ${selectedProvider} model or type custom model name`
1163
- : `Enter ${selectedProvider} model name`;
1164
-
1165
- } catch (error) {
1166
- console.error('[SettingsManager] Failed to fetch models for provider:', error);
1167
- modelDatalist.innerHTML = '<option value="">Failed to load models</option>';
1168
- modelInput.placeholder = `Enter ${selectedProvider} model name manually`;
1169
-
1170
- // Show user-friendly error notification
1171
- this.emit('notification', {
1172
- message: `Failed to load models for ${selectedProvider}. You can enter the model name manually.`,
1173
- type: 'warning'
1174
- });
1175
- }
1176
- }
1177
-
1178
- closeProfileForm() {
1179
- if (this.elements.profileFormModal) {
1180
- this.elements.profileFormModal.classList.add('hidden');
1181
- }
1182
- }
1183
-
1184
- async handleProfileFormSubmit(event) {
1185
- event.preventDefault();
1186
- console.log('[SettingsManager] Profile form submit triggered');
1187
-
1188
- const form = event.target;
1189
-
1190
- // Prevent multiple submissions
1191
- if (form.dataset.submitting === 'true') {
1192
- return;
1193
- }
1194
-
1195
- const formData = new FormData(form);
1196
- const type = form.dataset.type;
1197
- const mode = form.dataset.mode;
1198
- const profileId = form.dataset.profileId;
1199
-
1200
- // Set submitting state and disable form
1201
- form.dataset.submitting = 'true';
1202
- this.setProfileFormSubmitting(true);
1203
-
1204
- // Convert FormData to object
1205
- const data = {};
1206
-
1207
- // Handle checkbox fields explicitly first
1208
- const checkboxFields = ['is_default', 'is_active'];
1209
- checkboxFields.forEach(fieldName => {
1210
- const checkbox = form.querySelector(`input[name="${fieldName}"]`);
1211
- if (checkbox) {
1212
- data[fieldName] = checkbox.checked;
1213
- }
1214
- });
1215
-
1216
- for (const [key, value] of formData.entries()) {
1217
- if (value.trim() !== '') {
1218
- if (key === 'is_default' || key === 'is_active') {
1219
- // Skip - already handled above
1220
- continue;
1221
- } else if (key === 'temperature') {
1222
- const num = parseFloat(value);
1223
- if (!isNaN(num) && num >= 0) {
1224
- data[key] = num;
1225
- }
1226
- } else if (key === 'max_tokens') {
1227
- const num = parseInt(value);
1228
- if (!isNaN(num) && num > 0) {
1229
- data[key] = num;
1230
- }
1231
- } else {
1232
- data[key] = value;
1233
- }
1234
- }
1235
- }
1236
-
1237
- // Handle Voice profile meta params structure - parse JSON input
1238
- if (type === 'voice') {
1239
- const jsonInput = data.voice_meta_params_json;
1240
-
1241
- if (jsonInput && jsonInput.trim()) {
1242
- try {
1243
- const parsedParams = JSON.parse(jsonInput);
1244
-
1245
- // Validate that it's an object (not array, string, etc.)
1246
- if (typeof parsedParams !== 'object' || Array.isArray(parsedParams) || parsedParams === null) {
1247
- throw new Error('Voice meta parameters must be a JSON object');
1248
- }
1249
-
1250
- // Set the parsed parameters
1251
- data.voice_meta_params = parsedParams;
1252
-
1253
- } catch (error) {
1254
- console.error('[SettingsManager] Failed to parse Voice meta params JSON:', error);
1255
- this.emit('error', { message: error.message });
1256
- form.dataset.submitting = 'false';
1257
- this.setProfileFormSubmitting(false);
1258
- return;
1259
- }
1260
- }
1261
-
1262
- // Remove the JSON field as it's not needed in the API request
1263
- delete data.voice_meta_params_json;
1264
- }
1265
-
1266
- // Handle MCP server params structure - parse JSON input
1267
- if (type === 'mcp') {
1268
- const jsonInput = data.mcp_server_params_json;
1269
-
1270
- // Check if JSON was pre-validated
1271
- const jsonTextarea = form.querySelector('textarea[name="mcp_server_params_json"]');
1272
- if (jsonTextarea && jsonTextarea.dataset.isValid === 'false') {
1273
- console.error('[SettingsManager] JSON validation failed during form submission');
1274
- this.emit('error', {
1275
- message: jsonTextarea.dataset.errorMessage || 'Invalid JSON format'
1276
- });
1277
- form.dataset.submitting = 'false';
1278
- this.setProfileFormSubmitting(false);
1279
- return;
1280
- }
1281
-
1282
- if (jsonInput) {
1283
- try {
1284
- const parsedParams = JSON.parse(jsonInput);
1285
-
1286
- // Validate the parsed JSON structure
1287
- if (typeof parsedParams !== 'object' || Array.isArray(parsedParams) || parsedParams === null) {
1288
- throw new Error('MCP server parameters must be a JSON object');
1289
- }
1290
-
1291
- if (!parsedParams.command || typeof parsedParams.command !== 'string') {
1292
- throw new Error('Missing or invalid "command" field (must be a string)');
1293
- }
1294
-
1295
- if (parsedParams.args && !Array.isArray(parsedParams.args)) {
1296
- throw new Error('"args" field must be an array if provided');
1297
- }
1298
-
1299
- // Set the parsed parameters
1300
- data.mcp_server_params = parsedParams;
1301
-
1302
- } catch (error) {
1303
- console.error('[SettingsManager] Failed to parse MCP server params JSON:', error);
1304
- this.emit('error', { message: error.message });
1305
- form.dataset.submitting = 'false';
1306
- this.setProfileFormSubmitting(false);
1307
- return;
1308
- }
1309
- }
1310
-
1311
- // Remove the JSON field as it's not needed in the API request
1312
- delete data.mcp_server_params_json;
1313
- }
1314
-
1315
- try {
1316
- console.log(`[SettingsManager] Starting ${mode} operation for ${type} profile`);
1317
- let response;
1318
-
1319
- if (mode === 'create') {
1320
- if (type === 'llm') {
1321
- response = await this.apiClient.createLLMProfile(data);
1322
- } else if (type === 'voice') {
1323
- response = await this.apiClient.createVoiceProfile(data);
1324
- } else {
1325
- response = await this.apiClient.createMCPProfile(data);
1326
- }
1327
- } else {
1328
- if (type === 'llm') {
1329
- response = await this.apiClient.updateLLMProfile(profileId, data);
1330
- } else if (type === 'voice') {
1331
- response = await this.apiClient.updateVoiceProfile(profileId, data);
1332
- } else {
1333
- response = await this.apiClient.updateMCPProfile(profileId, data);
1334
- }
1335
- }
1336
-
1337
- this.closeProfileForm();
1338
- this.emit('notification', {
1339
- message: `${type.toUpperCase()} profile ${mode === 'create' ? 'created' : 'updated'} successfully`,
1340
- type: 'success'
1341
- });
1342
-
1343
- // Refresh the settings data
1344
- await this.loadSettingsData();
1345
-
1346
- } catch (error) {
1347
- console.error(`[SettingsManager] Failed to ${mode} ${type} profile:`, error);
1348
-
1349
- // Handle specific error types for better user experience
1350
- let errorMessage = error.message || 'Unknown error occurred';
1351
-
1352
- if (errorMessage.includes('already exists') || errorMessage.includes('already in use')) {
1353
- this.highlightProfileNameError(errorMessage);
1354
- } else if (errorMessage.includes('UNIQUE constraint')) {
1355
- errorMessage = `Profile name '${data.profile_name || data.display_name}' already exists. Please choose a different name.`;
1356
- this.highlightProfileNameError(errorMessage);
1357
- }
1358
-
1359
- this.emit('notification', {
1360
- message: `Failed to ${mode} ${type} profile: ${errorMessage}`,
1361
- type: 'error'
1362
- });
1363
- } finally {
1364
- // Reset form state
1365
- form.dataset.submitting = 'false';
1366
- this.setProfileFormSubmitting(false);
1367
- }
1368
- }
1369
-
1370
- setProfileFormSubmitting(isSubmitting) {
1371
- const form = this.elements.profileForm;
1372
- const submitButton = this.elements.profileFormSubmit;
1373
- const cancelButton = this.elements.profileFormCancel;
1374
-
1375
- if (!form) return;
1376
-
1377
- // Disable/enable form inputs
1378
- const inputs = form.querySelectorAll('input, select, textarea');
1379
- inputs.forEach(input => {
1380
- input.disabled = isSubmitting;
1381
- });
1382
-
1383
- // Update submit button
1384
- if (submitButton) {
1385
- submitButton.disabled = isSubmitting;
1386
- submitButton.textContent = isSubmitting ? 'Saving...' : 'Save Profile';
1387
- }
1388
-
1389
- // Update cancel button
1390
- if (cancelButton) {
1391
- cancelButton.disabled = isSubmitting;
1392
- }
1393
- }
1394
-
1395
- highlightProfileNameError(errorMessage) {
1396
- const nameInput = this.elements.profileForm?.querySelector('input[name="profile_name"], input[name="display_name"]');
1397
-
1398
- if (nameInput) {
1399
- // Add error styling
1400
- nameInput.classList.add('form-error');
1401
- nameInput.focus();
1402
-
1403
- // Create or update error message
1404
- let errorElement = nameInput.parentElement.querySelector('.profile-name-error');
1405
- if (!errorElement) {
1406
- errorElement = document.createElement('div');
1407
- errorElement.className = 'form-error-message profile-name-error';
1408
- nameInput.parentElement.appendChild(errorElement);
1409
- }
1410
-
1411
- errorElement.textContent = errorMessage;
1412
-
1413
- // Remove error styling after user starts typing
1414
- const removeError = () => {
1415
- nameInput.classList.remove('form-error');
1416
- if (errorElement) {
1417
- errorElement.remove();
1418
- }
1419
- nameInput.removeEventListener('input', removeError);
1420
- };
1421
-
1422
- nameInput.addEventListener('input', removeError);
1423
- }
1424
- }
1425
-
1426
- async handleThemeChange(event) {
1427
- const selectedTheme = event.target.value;
1428
-
1429
- try {
1430
- // Store theme preference in user settings storage
1431
- await this.userSettingsStorage.setTheme(selectedTheme);
1432
-
1433
- // Apply theme to document
1434
- this.applyTheme(selectedTheme);
1435
-
1436
- this.emit('notification', {
1437
- message: `Theme changed to ${selectedTheme}`,
1438
- type: 'success'
1439
- });
1440
-
1441
- } catch (error) {
1442
- console.error('[SettingsManager] Failed to change theme:', error);
1443
- this.emit('notification', {
1444
- message: 'Failed to change theme',
1445
- type: 'error'
1446
- });
1447
- }
1448
- }
1449
-
1450
-
1451
- applyTheme(theme) {
1452
- const root = document.documentElement;
1453
-
1454
- if (theme === 'dark') {
1455
- root.setAttribute('data-theme', 'dark');
1456
- root.classList.add('dark-theme');
1457
- root.classList.remove('light-theme');
1458
- } else if (theme === 'light') {
1459
- root.setAttribute('data-theme', 'light');
1460
- root.classList.add('light-theme');
1461
- root.classList.remove('dark-theme');
1462
- } else { // auto
1463
- root.classList.remove('dark-theme', 'light-theme');
1464
- // Let system preference take over
1465
- if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
1466
- root.setAttribute('data-theme', 'dark');
1467
- root.classList.add('dark-theme');
1468
- } else {
1469
- root.setAttribute('data-theme', 'light');
1470
- root.classList.add('light-theme');
1471
- }
1472
- }
1473
-
1474
- // Force a repaint to ensure theme changes are applied immediately
1475
- document.body.style.display = 'none';
1476
- document.body.offsetHeight; // trigger reflow
1477
- document.body.style.display = '';
1478
- }
1479
-
1480
- async handleBackendUrlChange(event) {
1481
- const newUrl = event.target.value.trim();
1482
-
1483
- if (!newUrl) {
1484
- this.emit('notification', {
1485
- message: 'Backend URL cannot be empty',
1486
- type: 'warning'
1487
- });
1488
- return;
1489
- }
1490
-
1491
- try {
1492
- // Validate URL format
1493
- new URL(newUrl);
1494
-
1495
- // Update API client
1496
- this.apiClient.setBaseURL(newUrl);
1497
-
1498
- // Emit event to update settings
1499
- this.emit('settingsUpdated', { backendUrl: newUrl });
1500
-
1501
- this.emit('notification', {
1502
- message: 'Backend URL updated successfully',
1503
- type: 'success'
1504
- });
1505
-
1506
- } catch (error) {
1507
- this.emit('notification', {
1508
- message: `Invalid backend URL: ${error.message}`,
1509
- type: 'error'
1510
- });
1511
- }
1512
- }
1513
-
1514
- async handleSaveEnvironmentVariables() {
1515
- if (!this.elements.envVariablesList) return;
1516
-
1517
- const envVarItems = this.elements.envVariablesList.querySelectorAll('.env-var-item');
1518
- const envVars = {};
1519
-
1520
- // Backend URL related keys that should be skipped during save
1521
- const backendUrlKeys = [
1522
- 'BACKEND_URL',
1523
- 'VIBESURF_BACKEND_URL',
1524
- 'API_URL',
1525
- 'BASE_URL',
1526
- 'API_BASE_URL',
1527
- 'BACKEND_API_URL'
1528
- ];
1529
-
1530
- envVarItems.forEach(item => {
1531
- const keyInput = item.querySelector('.env-var-key input');
1532
- const valueInput = item.querySelector('.env-var-value input');
1533
-
1534
- if (keyInput && valueInput && keyInput.value.trim()) {
1535
- const key = keyInput.value.trim();
1536
- const value = valueInput.value.trim();
1537
-
1538
- // Skip backend URL variables (they are readonly)
1539
- if (!backendUrlKeys.includes(key.toUpperCase())) {
1540
- envVars[key] = value;
1541
- }
1542
- }
1543
- });
1544
-
1545
- try {
1546
- await this.apiClient.updateEnvironmentVariables(envVars);
1547
- this.emit('notification', {
1548
- message: 'Environment variables updated successfully (backend URL variables are read-only)',
1549
- type: 'success'
1550
- });
1551
- } catch (error) {
1552
- console.error('[SettingsManager] Failed to update environment variables:', error);
1553
- this.emit('notification', {
1554
- message: `Failed to update environment variables: ${error.message}`,
1555
- type: 'error'
1556
- });
1557
- }
1558
- }
1559
-
1560
- // Rendering Methods
1561
- renderLLMProfiles(profiles) {
1562
- const container = document.getElementById('llm-profiles-list');
1563
- if (!container) return;
1564
-
1565
- if (profiles.length === 0) {
1566
- container.innerHTML = `
1567
- <div class="empty-state">
1568
- <svg width="48" height="48" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
1569
- <path d="M12 2L2 7L12 12L22 7L12 2Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
1570
- <path d="M2 17L12 22L22 17" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
1571
- <path d="M2 12L12 17L22 12" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
1572
- </svg>
1573
- <h3>No LLM Profiles</h3>
1574
- <p>Create your first LLM profile to get started</p>
1575
- </div>
1576
- `;
1577
- return;
1578
- }
1579
-
1580
- const profilesHTML = profiles.map(profile => `
1581
- <div class="profile-card ${profile.is_default ? 'default' : ''}" data-profile-id="${profile.profile_name}">
1582
- ${profile.is_default ? '<div class="profile-badge">Default</div>' : ''}
1583
- <div class="profile-header">
1584
- <div class="profile-title">
1585
- <h3>${this.escapeHtml(profile.profile_name)}</h3>
1586
- <span class="profile-provider">${this.escapeHtml(profile.provider)}</span>
1587
- </div>
1588
- <div class="profile-actions">
1589
- <button class="profile-action-btn edit" title="Edit Profile" data-profile='${JSON.stringify(profile)}'>
1590
- <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
1591
- <path d="M11 4H4C3.46957 4 2.96086 4.21071 2.58579 4.58579C2.21071 4.96086 2 5.46957 2 6V20C2 20.5304 2.21071 21.0391 2.58579 21.4142C2.96086 21.7893 3.46957 22 4 22H18C18.5304 22 19.0391 21.7893 19.4142 21.4142C19.7893 21.0391 20 20.5304 20 20V13" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
1592
- <path d="M18.5 2.5C18.8978 2.10217 19.4374 1.87868 20 1.87868C20.5626 1.87868 21.1022 2.10217 21.5 2.5C21.8978 2.89783 22.1213 3.43739 22.1213 4C22.1213 4.56261 21.8978 5.10217 21.5 5.5L12 15L8 16L9 12L18.5 2.5Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
1593
- </svg>
1594
- </button>
1595
- <button class="profile-action-btn delete" title="Delete Profile" data-profile-id="${profile.profile_name}">
1596
- <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
1597
- <path d="M3 6H5H21" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
1598
- <path d="M8 6V4C8 3.46957 8.21071 2.96086 8.58579 2.58579C8.96086 2.21071 9.46957 2 10 2H14C14.5304 2 15.0391 2.21071 15.4142 2.58579C15.7893 2.96086 16 3.46957 16 4V6M19 6V20C19 20.5304 18.7893 21.0391 18.4142 21.4142C18.0391 21.7893 17.5304 22 17 22H7C6.46957 22 5.96086 21.7893 5.58579 21.4142C5.21071 21.0391 5 20.5304 5 20V6H19Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
1599
- </svg>
1600
- </button>
1601
- </div>
1602
- </div>
1603
- <div class="profile-content">
1604
- <div class="profile-info">
1605
- <span class="profile-model">${this.escapeHtml(profile.model)}</span>
1606
- ${profile.description ? `<p class="profile-description">${this.escapeHtml(profile.description)}</p>` : ''}
1607
- </div>
1608
- <div class="profile-details">
1609
- ${profile.base_url ? `<div class="profile-detail"><strong>Base URL:</strong> ${this.escapeHtml(profile.base_url)}</div>` : ''}
1610
- ${profile.temperature !== undefined ? `<div class="profile-detail"><strong>Temperature:</strong> ${profile.temperature}</div>` : ''}
1611
- ${profile.max_tokens ? `<div class="profile-detail"><strong>Max Tokens:</strong> ${profile.max_tokens}</div>` : ''}
1612
- </div>
1613
- </div>
1614
- </div>
1615
- `).join('');
1616
-
1617
- container.innerHTML = profilesHTML;
1618
-
1619
- // Add event listeners for profile actions
1620
- container.querySelectorAll('.edit').forEach(btn => {
1621
- btn.addEventListener('click', (e) => {
1622
- e.stopPropagation();
1623
- const profile = JSON.parse(btn.dataset.profile);
1624
- this.showProfileForm('llm', profile);
1625
- });
1626
- });
1627
-
1628
- container.querySelectorAll('.delete').forEach(btn => {
1629
- btn.addEventListener('click', async (e) => {
1630
- e.stopPropagation();
1631
- await this.handleDeleteProfile('llm', btn.dataset.profileId);
1632
- });
1633
- });
1634
- }
1635
-
1636
- renderMCPProfiles(profiles) {
1637
- const container = document.getElementById('mcp-profiles-list');
1638
- if (!container) return;
1639
-
1640
- if (profiles.length === 0) {
1641
- container.innerHTML = `
1642
- <div class="empty-state">
1643
- <svg width="48" height="48" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
1644
- <path d="M8 2V8M16 2V8M3 10H21M5 4H19C20.1046 4 21 4.89543 21 6V20C21 21.1046 20.1046 22 19 22H5C3.89543 22 3 21.1046 3 20V6C3 4.89543 3.89543 4 5 4Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
1645
- </svg>
1646
- <h3>No MCP Profiles</h3>
1647
- <p>Create your first MCP profile to enable server integrations</p>
1648
- </div>
1649
- `;
1650
- return;
1651
- }
1652
-
1653
- const profilesHTML = profiles.map(profile => `
1654
- <div class="profile-card ${profile.is_active ? 'active' : 'inactive'}" data-profile-id="${profile.mcp_id}">
1655
- <div class="profile-status ${profile.is_active ? 'active' : 'inactive'}">
1656
- ${profile.is_active ? 'Active' : 'Inactive'}
1657
- </div>
1658
- <div class="profile-header">
1659
- <div class="profile-title">
1660
- <h3>${this.escapeHtml(profile.display_name)}</h3>
1661
- <span class="profile-provider">${this.escapeHtml(profile.mcp_server_name)}</span>
1662
- </div>
1663
- <div class="profile-actions">
1664
- <button class="profile-action-btn edit" title="Edit Profile" data-profile='${JSON.stringify(profile)}'>
1665
- <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
1666
- <path d="M11 4H4C3.46957 4 2.96086 4.21071 2.58579 4.58579C2.21071 4.96086 2 5.46957 2 6V20C2 20.5304 2.21071 21.0391 2.58579 21.4142C2.96086 21.7893 3.46957 22 4 22H18C18.5304 22 19.0391 21.7893 19.4142 21.4142C19.7893 21.0391 20 20.5304 20 20V13" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
1667
- <path d="M18.5 2.5C18.8978 2.10217 19.4374 1.87868 20 1.87868C20.5626 1.87868 21.1022 2.10217 21.5 2.5C21.8978 2.89783 22.1213 3.43739 22.1213 4C22.1213 4.56261 21.8978 5.10217 21.5 5.5L12 15L8 16L9 12L18.5 2.5Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
1668
- </svg>
1669
- </button>
1670
- <button class="profile-action-btn delete" title="Delete Profile" data-profile-id="${profile.mcp_id}">
1671
- <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
1672
- <path d="M3 6H5H21" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
1673
- <path d="M8 6V4C8 3.46957 8.21071 2.96086 8.58579 2.58579C8.96086 2.21071 9.46957 2 10 2H14C14.5304 2 15.0391 2.21071 15.4142 2.58579C15.7893 2.96086 16 3.46957 16 4V6M19 6V20C19 20.5304 18.7893 21.0391 18.4142 21.4142C18.0391 21.7893 17.5304 22 17 22H7C6.46957 22 5.96086 21.7893 5.58579 21.4142C5.21071 21.0391 5 20.5304 5 20V6H19Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
1674
- </svg>
1675
- </button>
1676
- </div>
1677
- </div>
1678
- <div class="profile-content">
1679
- ${profile.description ? `<p class="profile-description">${this.escapeHtml(profile.description)}</p>` : ''}
1680
- <div class="profile-details">
1681
- <div class="profile-detail"><strong>Command:</strong> ${this.escapeHtml(profile.mcp_server_params?.command || 'N/A')}</div>
1682
- ${profile.mcp_server_params?.args?.length ? `<div class="profile-detail"><strong>Args:</strong> ${profile.mcp_server_params.args.join(', ')}</div>` : ''}
1683
- </div>
1684
- </div>
1685
- </div>
1686
- `).join('');
1687
-
1688
- container.innerHTML = profilesHTML;
1689
-
1690
- // Add event listeners for profile actions
1691
- container.querySelectorAll('.edit').forEach(btn => {
1692
- btn.addEventListener('click', (e) => {
1693
- e.stopPropagation();
1694
- const profile = JSON.parse(btn.dataset.profile);
1695
- this.showProfileForm('mcp', profile);
1696
- });
1697
- });
1698
-
1699
- container.querySelectorAll('.delete').forEach(btn => {
1700
- btn.addEventListener('click', async (e) => {
1701
- e.stopPropagation();
1702
- await this.handleDeleteProfile('mcp', btn.dataset.profileId);
1703
- });
1704
- });
1705
- }
1706
-
1707
- renderVoiceProfiles(profiles) {
1708
- const container = document.getElementById('voice-profiles-list');
1709
- if (!container) return;
1710
-
1711
- if (profiles.length === 0) {
1712
- container.innerHTML = `
1713
- <div class="empty-state">
1714
- <svg width="48" height="48" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
1715
- <path d="M19 14C19 18.5 15.5 22 11 22C6.5 22 3 18.5 3 14V12C3 7.5 6.5 4 11 4S19 7.5 19 12V14ZM11 8C8.8 8 7 9.8 7 12V14C7 16.2 8.8 18 11 18S15 16.2 15 14V12C15 9.8 13.2 8 11 8Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
1716
- <circle cx="11" cy="11" r="2" stroke="currentColor" stroke-width="2"/>
1717
- </svg>
1718
- <h3>No Voice Profiles</h3>
1719
- <p>Create your first voice profile to enable speech features</p>
1720
- </div>
1721
- `;
1722
- return;
1723
- }
1724
-
1725
- const profilesHTML = profiles.map(profile => `
1726
- <div class="profile-card ${profile.is_active ? 'active' : 'inactive'}" data-profile-id="${profile.voice_profile_name}">
1727
- <div class="profile-status ${profile.is_active ? 'active' : 'inactive'}">
1728
- ${profile.is_active ? 'Active' : 'Inactive'}
1729
- </div>
1730
- <div class="profile-header">
1731
- <div class="profile-title">
1732
- <h3>${this.escapeHtml(profile.voice_profile_name)}</h3>
1733
- <span class="profile-provider">${this.escapeHtml(profile.voice_model_name)} (${profile.voice_model_type.toUpperCase()})</span>
1734
- </div>
1735
- <div class="profile-actions">
1736
- <button class="profile-action-btn edit" title="Edit Profile" data-profile='${JSON.stringify(profile)}'>
1737
- <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
1738
- <path d="M11 4H4C3.46957 4 2.96086 4.21071 2.58579 4.58579C2.21071 4.96086 2 5.46957 2 6V20C2 20.5304 2.21071 21.0391 2.58579 21.4142C2.96086 21.7893 3.46957 22 4 22H18C18.5304 22 19.0391 21.7893 19.4142 21.4142C19.7893 21.0391 20 20.5304 20 20V13" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
1739
- <path d="M18.5 2.5C18.8978 2.10217 19.4374 1.87868 20 1.87868C20.5626 1.87868 21.1022 2.10217 21.5 2.5C21.8978 2.89783 22.1213 3.43739 22.1213 4C22.1213 4.56261 21.8978 5.10217 21.5 5.5L12 15L8 16L9 12L18.5 2.5Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
1740
- </svg>
1741
- </button>
1742
- <button class="profile-action-btn delete" title="Delete Profile" data-profile-id="${profile.voice_profile_name}">
1743
- <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
1744
- <path d="M3 6H5H21" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
1745
- <path d="M8 6V4C8 3.46957 8.21071 2.96086 8.58579 2.58579C8.96086 2.21071 9.46957 2 10 2H14C14.5304 2 15.0391 2.21071 15.4142 2.58579C15.7893 2.96086 16 3.46957 16 4V6M19 6V20C19 20.5304 18.7893 21.0391 18.4142 21.4142C18.0391 21.7893 17.5304 22 17 22H7C6.46957 22 5.96086 21.7893 5.58579 21.4142C5.21071 21.0391 5 20.5304 5 20V6H19Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
1746
- </svg>
1747
- </button>
1748
- </div>
1749
- </div>
1750
- <div class="profile-content">
1751
- ${profile.description ? `<p class="profile-description">${this.escapeHtml(profile.description)}</p>` : ''}
1752
- <div class="profile-details">
1753
- <div class="profile-detail"><strong>Model:</strong> ${this.escapeHtml(profile.voice_model_name)}</div>
1754
- <div class="profile-detail"><strong>Type:</strong> ${profile.voice_model_type.toUpperCase()}</div>
1755
- ${profile.voice_meta_params ? `<div class="profile-detail"><strong>Parameters:</strong> ${Object.keys(profile.voice_meta_params).length} custom settings</div>` : ''}
1756
- </div>
1757
- </div>
1758
- </div>
1759
- `).join('');
1760
-
1761
- container.innerHTML = profilesHTML;
1762
-
1763
- // Add event listeners for profile actions
1764
- container.querySelectorAll('.edit').forEach(btn => {
1765
- btn.addEventListener('click', (e) => {
1766
- e.stopPropagation();
1767
- const profile = JSON.parse(btn.dataset.profile);
1768
- this.showProfileForm('voice', profile);
1769
- });
1770
- });
1771
-
1772
- container.querySelectorAll('.delete').forEach(btn => {
1773
- btn.addEventListener('click', async (e) => {
1774
- e.stopPropagation();
1775
- await this.handleDeleteProfile('voice', btn.dataset.profileId);
1776
- });
1777
- });
1778
- }
1779
-
1780
- renderEnvironmentVariables(envVars) {
1781
- const container = this.elements.envVariablesList;
1782
- if (!container) return;
1783
-
1784
- // Clear existing content
1785
- container.innerHTML = '';
1786
-
1787
- // Check if there are any environment variables to display
1788
- if (Object.keys(envVars).length === 0) {
1789
- container.innerHTML = `
1790
- <div class="empty-state">
1791
- <div class="empty-state-icon">🔧</div>
1792
- <div class="empty-state-title">No Environment Variables</div>
1793
- <div class="empty-state-description">Environment variables are configured on the backend. Only updates to existing variables are allowed.</div>
1794
- </div>
1795
- `;
1796
- return;
1797
- }
1798
-
1799
- // Backend URL related keys that should be readonly
1800
- const backendUrlKeys = [
1801
- 'BACKEND_URL',
1802
- 'VIBESURF_BACKEND_URL',
1803
- 'API_URL',
1804
- 'BASE_URL',
1805
- 'API_BASE_URL',
1806
- 'BACKEND_API_URL'
1807
- ];
1808
-
1809
- // Add existing environment variables (read-only keys, editable/readonly values based on type)
1810
- Object.entries(envVars).forEach(([key, value]) => {
1811
- const envVarItem = document.createElement('div');
1812
- envVarItem.className = 'env-var-item';
1813
-
1814
- // Check if this is a backend URL variable
1815
- const isBackendUrl = backendUrlKeys.includes(key.toUpperCase());
1816
- const valueReadonly = isBackendUrl ? 'readonly' : '';
1817
- const valueClass = isBackendUrl ? 'form-input readonly-input' : 'form-input';
1818
- const valueTitle = isBackendUrl ? 'Backend URL is not editable from settings' : '';
1819
-
1820
- envVarItem.innerHTML = `
1821
- <div class="env-var-key">
1822
- <input type="text" class="form-input" placeholder="Variable name" value="${this.escapeHtml(key)}" readonly>
1823
- </div>
1824
- <div class="env-var-value">
1825
- <input type="text" class="${valueClass}" placeholder="Variable value" value="${this.escapeHtml(value)}" ${valueReadonly} title="${valueTitle}">
1826
- </div>
1827
- `;
1828
-
1829
- container.appendChild(envVarItem);
1830
- });
1831
- }
1832
-
1833
- async handleDeleteProfile(type, profileId) {
1834
- // Check if this is a default LLM profile
1835
- if (type === 'llm') {
1836
- const profile = this.state.llmProfiles.find(p => p.profile_name === profileId);
1837
- if (profile && profile.is_default) {
1838
- // Handle default profile deletion differently
1839
- return await this.handleDeleteDefaultProfile(profileId);
1840
- }
1841
- }
1842
-
1843
- // Emit confirmation request to main UI manager
1844
- this.emit('confirmDeletion', {
1845
- type,
1846
- profileId,
1847
- callback: () => this.performDeleteProfile(type, profileId)
1848
- });
1849
- }
1850
-
1851
- async handleDeleteDefaultProfile(profileId) {
1852
- // Get other available profiles
1853
- const otherProfiles = this.state.llmProfiles.filter(p => p.profile_name !== profileId);
1854
-
1855
- if (otherProfiles.length === 0) {
1856
- // No other profiles available - cannot delete
1857
- this.emit('error', {
1858
- message: 'This is the only LLM profile configured. You cannot delete it without having at least one other profile.',
1859
- details: 'Please create another LLM profile first, then you can delete this one.',
1860
- buttons: [
1861
- {
1862
- text: 'Create New Profile',
1863
- action: () => this.handleAddProfile('llm')
1864
- }
1865
- ]
1866
- });
1867
- return false;
1868
- }
1869
-
1870
- // Show modal to select new default profile
1871
- this.emit('selectNewDefault', {
1872
- profileId,
1873
- otherProfiles,
1874
- callback: (newDefaultProfileId) => this.setNewDefaultAndDelete(newDefaultProfileId, profileId)
1875
- });
1876
- }
1877
-
1878
- async setNewDefaultAndDelete(newDefaultProfileId, profileToDelete) {
1879
- try {
1880
- this.emit('loading', { message: 'Updating default profile...' });
1881
-
1882
- // First, set the new default profile
1883
- await this.apiClient.updateLLMProfile(newDefaultProfileId, { is_default: true });
1884
-
1885
- this.emit('loading', { message: 'Deleting profile...' });
1886
-
1887
- // Then delete the old default profile
1888
- await this.apiClient.deleteLLMProfile(profileToDelete);
1889
-
1890
- this.emit('notification', {
1891
- message: `Profile "${profileToDelete}" deleted and "${newDefaultProfileId}" set as default`,
1892
- type: 'success'
1893
- });
1894
-
1895
- // Refresh the settings data
1896
- await this.loadSettingsData();
1897
-
1898
- this.emit('loading', { hide: true });
1899
- } catch (error) {
1900
- this.emit('loading', { hide: true });
1901
- console.error('[SettingsManager] Failed to set new default and delete profile:', error);
1902
- this.emit('notification', {
1903
- message: `Failed to update profiles: ${error.message}`,
1904
- type: 'error'
1905
- });
1906
- throw error;
1907
- }
1908
- }
1909
-
1910
- async performDeleteProfile(type, profileId) {
1911
- try {
1912
- this.emit('loading', { message: `Deleting ${type} profile...` });
1913
-
1914
- if (type === 'llm') {
1915
- await this.apiClient.deleteLLMProfile(profileId);
1916
- } else if (type === 'voice') {
1917
- await this.apiClient.deleteVoiceProfile(profileId);
1918
- } else {
1919
- await this.apiClient.deleteMCPProfile(profileId);
1920
- }
1921
-
1922
- this.emit('notification', {
1923
- message: `${type.toUpperCase()} profile deleted successfully`,
1924
- type: 'success'
1925
- });
1926
-
1927
- // Refresh the settings data
1928
- await this.loadSettingsData();
1929
-
1930
- this.emit('loading', { hide: true });
1931
- } catch (error) {
1932
- this.emit('loading', { hide: true });
1933
- console.error(`[SettingsManager] Failed to delete ${type} profile:`, error);
1934
- this.emit('notification', {
1935
- message: `Failed to delete ${type} profile: ${error.message}`,
1936
- type: 'error'
1937
- });
1938
- }
1939
- }
1940
-
1941
- escapeHtml(text) {
1942
- if (typeof text !== 'string') return '';
1943
- const div = document.createElement('div');
1944
- div.textContent = text;
1945
- return div.innerHTML;
1946
- }
1947
-
1948
- // Public interface
1949
- getState() {
1950
- return { ...this.state };
1951
- }
1952
-
1953
- getLLMProfiles() {
1954
- return this.state.llmProfiles || [];
1955
- }
1956
-
1957
- getMCPProfiles() {
1958
- return this.state.mcpProfiles || [];
1959
- }
1960
-
1961
- getVoiceProfiles() {
1962
- return this.state.voiceProfiles || [];
1963
- }
1964
-
1965
- showModal() {
1966
- if (this.elements.settingsModal) {
1967
- this.elements.settingsModal.classList.remove('hidden');
1968
- }
1969
- }
1970
-
1971
- showSettings() {
1972
- this.showModal();
1973
- }
1974
-
1975
- hideModal() {
1976
- if (this.elements.settingsModal) {
1977
- this.elements.settingsModal.classList.add('hidden');
1978
- }
1979
- }
1980
-
1981
- updateBackendUrl(url) {
1982
- if (this.elements.backendUrl) {
1983
- this.elements.backendUrl.value = url;
1984
- }
1985
- }
1986
-
1987
- // Navigate to specific LLM profile for editing
1988
- async navigateToLLMProfile(profileName) {
1989
- console.log('[SettingsManager] Navigating to LLM profile:', profileName);
1990
-
1991
- // First show the settings modal
1992
- this.showSettings();
1993
-
1994
- // Switch to LLM profiles tab
1995
- const llmTab = document.querySelector('.settings-tab[data-tab="llm-profiles"]');
1996
- if (llmTab) {
1997
- llmTab.click(); // This will trigger handleTabSwitch
1998
- }
1999
-
2000
- // Wait a moment for tab switching to complete
2001
- setTimeout(async () => {
2002
- // Find the profile in the current state
2003
- const profile = this.state.llmProfiles.find(p => p.profile_name === profileName);
2004
-
2005
- if (profile) {
2006
- // Show the edit form for this profile
2007
- await this.showProfileForm('llm', profile);
2008
- console.log('[SettingsManager] LLM profile edit form shown for:', profileName);
2009
- } else {
2010
- console.warn('[SettingsManager] Profile not found:', profileName);
2011
- this.emit('notification', {
2012
- message: `LLM profile "${profileName}" not found. Please check if it still exists.`,
2013
- type: 'warning'
2014
- });
2015
- }
2016
- }, 100);
2017
- }
2018
-
2019
- // === INTEGRATIONS FUNCTIONALITY ===
2020
-
2021
- // Load integrations data when tab is opened
2022
- async loadIntegrationsData() {
2023
- try {
2024
- console.log('[SettingsManager] Loading integrations data...');
2025
- console.log('[SettingsManager] API client available:', !!this.apiClient);
2026
-
2027
- // Show loading state immediately
2028
- this.showIntegrationsLoading();
2029
-
2030
- // Check Composio status (which will handle instance restoration if needed)
2031
- const status = await this.checkComposioStatus();
2032
-
2033
- console.log('[SettingsManager] Status check result:', status);
2034
-
2035
- if (status && status.connected && status.key_valid) {
2036
- console.log('[SettingsManager] Valid Composio connection found, loading toolkits from database...');
2037
- // Load toolkits from database (no sync by default for faster loading)
2038
- await this.loadToolkits(false);
2039
- console.log('[SettingsManager] Toolkits loaded, showing integrations content...');
2040
- this.showIntegrationsContent();
2041
- console.log('[SettingsManager] Integrations content shown');
2042
- } else {
2043
- console.log('[SettingsManager] No valid Composio connection, showing setup modal automatically');
2044
- console.log('[SettingsManager] Status details - connected:', status?.connected, 'key_valid:', status?.key_valid);
2045
- // Automatically show setup modal instead of setup UI
2046
- this.hideIntegrationsLoading();
2047
- this.showApiKeyModal();
2048
- }
2049
- } catch (error) {
2050
- console.error('[SettingsManager] Failed to load integrations data:', error);
2051
- this.hideIntegrationsLoading();
2052
- this.emit('notification', {
2053
- message: 'Failed to load integrations data',
2054
- type: 'error'
2055
- });
2056
- }
2057
- }
2058
-
2059
- // Check Composio API key status
2060
- async checkComposioStatus() {
2061
- try {
2062
- console.log('[SettingsManager] Checking Composio status...');
2063
- const response = await this.apiClient.getComposioStatus();
2064
- console.log('[SettingsManager] Composio status response:', response);
2065
-
2066
- // Use the new response format
2067
- this.state.composioKeyValid = response.connected && response.key_valid;
2068
- this.state.composioApiKey = response.has_key ? '***' : null;
2069
-
2070
- console.log('[SettingsManager] Composio state updated:', {
2071
- connected: response.connected,
2072
- keyValid: response.key_valid,
2073
- hasKey: response.has_key,
2074
- instanceAvailable: response.instance_available,
2075
- message: response.message
2076
- });
2077
-
2078
- return response;
2079
- } catch (error) {
2080
- console.error('[SettingsManager] Failed to check Composio status:', error);
2081
- this.state.composioKeyValid = false;
2082
- this.state.composioApiKey = null;
2083
- return {
2084
- connected: false,
2085
- key_valid: false,
2086
- has_key: false,
2087
- instance_available: false,
2088
- message: 'Status check failed'
2089
- };
2090
- }
2091
- }
2092
-
2093
- // Show integrations loading state
2094
- showIntegrationsLoading() {
2095
- if (this.elements.composioStatus) {
2096
- this.elements.composioStatus.innerHTML = `
2097
- <div class="status-item info">
2098
- <div class="status-icon loading-spinner">⟳</div>
2099
- <div class="status-content">
2100
- <div class="status-title">Checking Connection</div>
2101
- <div class="status-description">Verifying Composio integration status...</div>
2102
- </div>
2103
- </div>
2104
- `;
2105
- }
2106
-
2107
- if (this.elements.apiKeySetup) {
2108
- this.elements.apiKeySetup.style.display = 'none';
2109
- }
2110
-
2111
- if (this.elements.toolkitsSection) {
2112
- this.elements.toolkitsSection.style.display = 'none';
2113
- }
2114
- }
2115
-
2116
- // Hide integrations loading state
2117
- hideIntegrationsLoading() {
2118
- // Loading state will be replaced by either connected status or setup modal
2119
- }
2120
-
2121
- // Show integrations main content
2122
- showIntegrationsContent() {
2123
- console.log('[SettingsManager] showIntegrationsContent called');
2124
- console.log('[SettingsManager] composioStatus element exists:', !!this.elements.composioStatus);
2125
- console.log('[SettingsManager] toolkitsSection element exists:', !!this.elements.toolkitsSection);
2126
-
2127
- if (this.elements.composioStatus) {
2128
- this.elements.composioStatus.innerHTML = `
2129
- <div class="status-item success">
2130
- <div class="status-icon">✓</div>
2131
- <div class="status-content">
2132
- <div class="status-title">Composio Connected</div>
2133
- <div class="status-description">API key is valid and ready to use</div>
2134
- </div>
2135
- <button id="update-api-key-btn" class="btn btn-secondary btn-sm">
2136
- Update Key
2137
- </button>
2138
- </div>
2139
- `;
2140
-
2141
- // Re-bind the update button event
2142
- const updateBtn = document.getElementById('update-api-key-btn');
2143
- if (updateBtn) {
2144
- updateBtn.addEventListener('click', this.handleSetupApiKey.bind(this));
2145
- }
2146
- }
2147
-
2148
- if (this.elements.apiKeySetup) {
2149
- this.elements.apiKeySetup.style.display = 'none';
2150
- }
2151
-
2152
- if (this.elements.toolkitsSection) {
2153
- this.elements.toolkitsSection.classList.remove('hidden');
2154
- this.elements.toolkitsSection.style.display = 'block';
2155
- console.log('[SettingsManager] toolkitsSection display set to block and hidden class removed');
2156
- } else {
2157
- console.error('[SettingsManager] toolkitsSection element not found!');
2158
- }
2159
- }
2160
-
2161
- // Handle API key setup button click
2162
- handleSetupApiKey() {
2163
- console.log('[SettingsManager] Setup API key button clicked');
2164
- this.showApiKeyModal();
2165
- }
2166
-
2167
- // Show API key modal
2168
- showApiKeyModal() {
2169
- console.log('[SettingsManager] Showing API key modal');
2170
- console.log('[SettingsManager] Modal element exists:', !!this.elements.composioApiKeyModal);
2171
-
2172
- if (this.elements.composioApiKeyModal) {
2173
- this.elements.composioApiKeyModal.classList.remove('hidden');
2174
-
2175
- // Clear previous input and validation
2176
- if (this.elements.composioApiKeyInput) {
2177
- this.elements.composioApiKeyInput.value = '';
2178
- }
2179
- this.hideApiKeyValidation();
2180
-
2181
- // Focus on input
2182
- setTimeout(() => {
2183
- if (this.elements.composioApiKeyInput) {
2184
- this.elements.composioApiKeyInput.focus();
2185
- }
2186
- }, 100);
2187
-
2188
- console.log('[SettingsManager] API key modal shown successfully');
2189
- } else {
2190
- console.error('[SettingsManager] API key modal element not found!');
2191
- }
2192
- }
2193
-
2194
- // Hide API key modal
2195
- hideApiKeyModal() {
2196
- if (this.elements.composioApiKeyModal) {
2197
- this.elements.composioApiKeyModal.classList.add('hidden');
2198
- }
2199
- }
2200
-
2201
- // Handle Composio link open
2202
- handleOpenComposioLink() {
2203
- // Open Composio website in new tab using Chrome extension API
2204
- if (typeof chrome !== 'undefined' && chrome.tabs) {
2205
- chrome.tabs.create({ url: 'https://composio.dev/' });
2206
- } else {
2207
- // Fallback for non-extension context
2208
- window.open('https://composio.dev/', '_blank');
2209
- }
2210
- }
2211
-
2212
- // Handle API key confirm
2213
- async handleApiKeyConfirm() {
2214
- const apiKey = this.elements.composioApiKeyInput?.value?.trim();
2215
-
2216
- if (!apiKey) {
2217
- this.showApiKeyValidation('Please enter an API key', 'error');
2218
- return;
2219
- }
2220
-
2221
- try {
2222
- this.showApiKeyValidation('Validating API key...', 'info');
2223
-
2224
- const response = await this.apiClient.verifyComposioKey(apiKey);
2225
-
2226
- if (response.valid) {
2227
- this.showApiKeyValidation('API key is valid!', 'success');
2228
-
2229
- // Update state
2230
- this.state.composioKeyValid = true;
2231
- this.state.composioApiKey = '***';
2232
-
2233
- // Show integrations content and load toolkits
2234
- this.showIntegrationsContent();
2235
- await this.loadToolkits(false);
2236
-
2237
- // Close modal after short delay
2238
- setTimeout(() => {
2239
- this.hideApiKeyModal();
2240
- }, 1000);
2241
-
2242
- this.emit('notification', {
2243
- message: 'Composio API key validated and saved successfully',
2244
- type: 'success'
2245
- });
2246
-
2247
- } else {
2248
- this.showApiKeyValidation('Invalid API key. Please check and try again.', 'error');
2249
- }
2250
-
2251
- } catch (error) {
2252
- console.error('[SettingsManager] Failed to verify API key:', error);
2253
- this.showApiKeyValidation(`Failed to verify API key: ${error.message}`, 'error');
2254
- }
2255
- }
2256
-
2257
- // Show API key validation message
2258
- showApiKeyValidation(message, type) {
2259
- if (!this.elements.apiKeyValidation) return;
2260
-
2261
- const className = type === 'success' ? 'success' : type === 'error' ? 'error' : 'info';
2262
- this.elements.apiKeyValidation.innerHTML = `
2263
- <div class="validation-message ${className}">
2264
- ${this.escapeHtml(message)}
2265
- </div>
2266
- `;
2267
- this.elements.apiKeyValidation.style.display = 'block';
2268
- }
2269
-
2270
- // Hide API key validation message
2271
- hideApiKeyValidation() {
2272
- if (this.elements.apiKeyValidation) {
2273
- this.elements.apiKeyValidation.style.display = 'none';
2274
- this.elements.apiKeyValidation.innerHTML = '';
2275
- }
2276
- }
2277
-
2278
- // Handle API key toggle visibility
2279
- handleApiKeyToggle() {
2280
- const input = this.elements.composioApiKeyInput;
2281
- if (!input) return;
2282
-
2283
- const toggle = this.elements.composioApiKeyModal?.querySelector('.api-key-toggle');
2284
- if (!toggle) return;
2285
-
2286
- const isPassword = input.type === 'password';
2287
- input.type = isPassword ? 'text' : 'password';
2288
-
2289
- // Update icon
2290
- const svg = toggle.querySelector('svg');
2291
- if (svg) {
2292
- svg.innerHTML = isPassword ?
2293
- '<path d="M17.94 17.94A10.07 10.07 0 0 1 12 20C7 20 2.73 16.39 1 12A18.45 18.45 0 0 1 5.06 5.06L17.94 17.94ZM9.9 4.24A9.12 9.12 0 0 1 12 4C17 4 21.27 7.61 23 12A18.5 18.5 0 0 1 19.42 16.42" stroke="currentColor" stroke-width="2" fill="none"/><path d="M1 1L23 23" stroke="currentColor" stroke-width="2"/><circle cx="12" cy="12" r="3" stroke="currentColor" stroke-width="2" fill="none"/>' :
2294
- '<path d="M1 12S5 4 12 4S23 12 23 12S19 20 12 20S1 12 1 12Z" stroke="currentColor" stroke-width="2"/><circle cx="12" cy="12" r="3" stroke="currentColor" stroke-width="2"/>';
2295
- }
2296
- }
2297
-
2298
- // Load toolkits from API
2299
- async loadToolkits(forceSync = false) {
2300
- try {
2301
- console.log('[SettingsManager] Loading Composio toolkits...');
2302
-
2303
- if (this.elements.toolkitsLoading) {
2304
- this.elements.toolkitsLoading.style.display = 'block';
2305
- }
2306
-
2307
- // Load toolkits from database first (no API sync by default)
2308
- const params = forceSync ? { sync_with_api: true } : { sync_with_api: false };
2309
- const response = await this.apiClient.getComposioToolkits(params);
2310
-
2311
- // Handle different response structures
2312
- this.state.toolkits = response.toolkits || response || [];
2313
-
2314
- // Convert toolkit data to frontend format with connection status
2315
- this.state.toolkits = this.state.toolkits.map(toolkit => ({
2316
- id: toolkit.id,
2317
- name: toolkit.name,
2318
- slug: toolkit.slug,
2319
- description: toolkit.description || '',
2320
- logo: toolkit.logo || '',
2321
- app_url: toolkit.app_url || '',
2322
- enabled: toolkit.enabled || false,
2323
- tools: toolkit.tools || {},
2324
- connected: false, // Will be updated by connection status check
2325
- connection_status: toolkit.connection_status || 'unknown'
2326
- }));
2327
-
2328
- // Check connection status for enabled toolkits
2329
- await this.updateToolkitConnectionStatuses();
2330
-
2331
- // Apply current search and filter
2332
- this.filterToolkits();
2333
-
2334
- console.log('[SettingsManager] Loaded toolkits:', this.state.toolkits.length);
2335
- console.log('[SettingsManager] Filtered toolkits:', this.state.filteredToolkits.length);
2336
-
2337
- if (forceSync && response.synced_count > 0) {
2338
- this.emit('notification', {
2339
- message: `Synced ${response.synced_count} new toolkits from Composio`,
2340
- type: 'success'
2341
- });
2342
- }
2343
-
2344
- } catch (error) {
2345
- console.error('[SettingsManager] Failed to load toolkits:', error);
2346
- this.state.toolkits = [];
2347
- this.state.filteredToolkits = [];
2348
- this.renderToolkits();
2349
-
2350
- this.emit('notification', {
2351
- message: 'Failed to load Composio toolkits',
2352
- type: 'error'
2353
- });
2354
- } finally {
2355
- if (this.elements.toolkitsLoading) {
2356
- this.elements.toolkitsLoading.style.display = 'none';
2357
- }
2358
- }
2359
- }
2360
-
2361
- // Handle toolkit search
2362
- handleToolkitSearch(event) {
2363
- this.state.searchQuery = event.target.value.toLowerCase().trim();
2364
- this.filterToolkits();
2365
- }
2366
-
2367
- // Handle toolkit filter
2368
- handleToolkitFilter(event) {
2369
- this.state.filterStatus = event.target.value;
2370
- this.filterToolkits();
2371
- }
2372
-
2373
- // Filter toolkits based on search and filter
2374
- filterToolkits() {
2375
- let filtered = [...this.state.toolkits];
2376
-
2377
- // Apply search filter
2378
- if (this.state.searchQuery) {
2379
- filtered = filtered.filter(toolkit =>
2380
- toolkit.name.toLowerCase().includes(this.state.searchQuery) ||
2381
- toolkit.description.toLowerCase().includes(this.state.searchQuery)
2382
- );
2383
- }
2384
-
2385
- // Apply status filter
2386
- if (this.state.filterStatus !== 'all') {
2387
- if (this.state.filterStatus === 'enabled') {
2388
- filtered = filtered.filter(toolkit => toolkit.enabled === true);
2389
- } else if (this.state.filterStatus === 'disabled') {
2390
- filtered = filtered.filter(toolkit => toolkit.enabled === false);
2391
- } else if (this.state.filterStatus === 'connected') {
2392
- filtered = filtered.filter(toolkit => toolkit.connected === true);
2393
- } else if (this.state.filterStatus === 'unconnected') {
2394
- filtered = filtered.filter(toolkit => toolkit.connected === false);
2395
- }
2396
- }
2397
-
2398
- this.state.filteredToolkits = filtered;
2399
- console.log('[SettingsManager] Filtered toolkits for rendering:', filtered.length);
2400
- this.renderToolkits();
2401
- }
2402
-
2403
- // Render toolkits list
2404
- renderToolkits() {
2405
- console.log('[SettingsManager] renderToolkits called');
2406
- console.log('[SettingsManager] toolkitsList element exists:', !!this.elements.toolkitsList);
2407
-
2408
- if (!this.elements.toolkitsList) {
2409
- console.error('[SettingsManager] toolkitsList element not found!');
2410
- return;
2411
- }
2412
-
2413
- const toolkits = this.state.filteredToolkits;
2414
- console.log('[SettingsManager] Rendering toolkits:', toolkits.length);
2415
-
2416
- if (toolkits.length === 0) {
2417
- const isEmpty = this.state.toolkits.length === 0;
2418
- this.elements.toolkitsList.innerHTML = `
2419
- <div class="empty-state">
2420
- <div class="empty-state-icon">🔧</div>
2421
- <div class="empty-state-title">${isEmpty ? 'No Toolkits Available' : 'No Matching Toolkits'}</div>
2422
- <div class="empty-state-description">
2423
- ${isEmpty ? 'No toolkits are available at the moment.' : 'Try adjusting your search or filter criteria.'}
2424
- </div>
2425
- </div>
2426
- `;
2427
- return;
2428
- }
2429
-
2430
- const toolkitsHTML = toolkits.map(toolkit => `
2431
- <div class="toolkit-card" data-toolkit-slug="${toolkit.slug}">
2432
- <div class="toolkit-header">
2433
- <div class="toolkit-logo">
2434
- <img src="${toolkit.logo || 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTEyIDJMMiA3TDEyIDEyTDIyIDdMMTIgMloiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8cGF0aCBkPSJNMiAxN0wxMiAyMkwyMiAxNyIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+CjxwYXRoIGQ9Ik0yIDEyTDEyIDE3TDIyIDEyIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9zdmc+'}" alt="${this.escapeHtml(toolkit.name)}" class="toolkit-logo-img">
2435
- </div>
2436
- <div class="toolkit-info">
2437
- <div class="toolkit-name">${this.escapeHtml(toolkit.name)}</div>
2438
- <div class="toolkit-description">${this.escapeHtml(toolkit.description)}</div>
2439
- </div>
2440
- <div class="toolkit-actions">
2441
- <label class="toolkit-toggle">
2442
- <input type="checkbox" ${toolkit.enabled ? 'checked' : ''}
2443
- data-toolkit-slug="${toolkit.slug}"
2444
- class="toolkit-toggle-input">
2445
- <span class="toggle-slider"></span>
2446
- </label>
2447
- </div>
2448
- </div>
2449
- <div class="toolkit-footer">
2450
- <button class="btn btn-secondary btn-sm toolkit-tools-btn"
2451
- data-toolkit-slug="${toolkit.slug}"
2452
- ${!toolkit.connected ? 'disabled' : ''}>
2453
- <svg width="16" height="16" viewBox="0 0 24 24" fill="none">
2454
- <path d="M12 2L2 7L12 12L22 7L12 2Z" stroke="currentColor" stroke-width="2"/>
2455
- <path d="M2 17L12 22L22 17" stroke="currentColor" stroke-width="2"/>
2456
- <path d="M2 12L12 17L22 12" stroke="currentColor" stroke-width="2"/>
2457
- </svg>
2458
- Manage Tools
2459
- </button>
2460
- <div class="toolkit-status ${toolkit.connected ? 'connected' : 'disconnected'}">
2461
- ${toolkit.connected ? 'Connected' : 'Not Connected'}
2462
- </div>
2463
- </div>
2464
- </div>
2465
- `).join('');
2466
-
2467
- console.log('[SettingsManager] Setting toolkits HTML, length:', toolkitsHTML.length);
2468
- this.elements.toolkitsList.innerHTML = toolkitsHTML;
2469
- console.log('[SettingsManager] HTML set successfully');
2470
-
2471
- // Bind event listeners for toolkit interactions
2472
- this.bindToolkitEvents();
2473
- console.log('[SettingsManager] Event binding completed');
2474
- }
2475
-
2476
- // Bind toolkit event listeners
2477
- bindToolkitEvents() {
2478
- if (!this.elements.toolkitsList) return;
2479
-
2480
- // Bind toggle inputs
2481
- const toggleInputs = this.elements.toolkitsList.querySelectorAll('.toolkit-toggle-input');
2482
- toggleInputs.forEach(input => {
2483
- input.addEventListener('change', this.handleToolkitToggle.bind(this));
2484
- });
2485
-
2486
- // Bind manage tools buttons
2487
- const toolsButtons = this.elements.toolkitsList.querySelectorAll('.toolkit-tools-btn');
2488
- toolsButtons.forEach(button => {
2489
- button.addEventListener('click', (e) => {
2490
- const toolkitSlug = e.target.dataset.toolkitSlug;
2491
- if (toolkitSlug && !e.target.disabled) {
2492
- this.handleManageTools(toolkitSlug);
2493
- }
2494
- });
2495
- });
2496
-
2497
- // Bind image error handlers to replace CSP-blocked onerror attributes
2498
- const logoImages = this.elements.toolkitsList.querySelectorAll('.toolkit-logo-img');
2499
- logoImages.forEach(img => {
2500
- img.addEventListener('error', () => {
2501
- img.src = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTEyIDJMMiA3TDEyIDEyTDIyIDdMMTIgMloiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8cGF0aCBkPSJNMiAxN0wxMiAyMkwyMiAxNyIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+CjxwYXRoIGQ9Ik0yIDEyTDEyIDE3TDIyIDEyIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9zdmc+';
2502
- });
2503
- });
2504
- }
2505
-
2506
- // Handle toolkit toggle
2507
- async handleToolkitToggle(event) {
2508
- const checkbox = event.target;
2509
- const toolkitSlug = checkbox.dataset.toolkitSlug;
2510
- const isEnabled = checkbox.checked;
2511
-
2512
- try {
2513
- console.log(`[SettingsManager] Toggling toolkit ${toolkitSlug}: ${isEnabled}`);
2514
-
2515
- const response = await this.apiClient.toggleComposioToolkit(toolkitSlug, isEnabled);
2516
-
2517
- if (response.requires_oauth && !response.connected) {
2518
- // OAuth flow required
2519
- console.log(`[SettingsManager] OAuth required for ${toolkitSlug}, URL:`, response.oauth_url);
2520
- await this.handleOAuthFlow(toolkitSlug, response.oauth_url);
2521
-
2522
- // Revert toggle until OAuth is complete
2523
- checkbox.checked = !isEnabled;
2524
- return;
2525
- }
2526
-
2527
- // Update toolkit state
2528
- const toolkit = this.state.toolkits.find(t => t.slug === toolkitSlug);
2529
- if (toolkit) {
2530
- toolkit.enabled = response.enabled;
2531
- toolkit.connected = response.connected;
2532
- }
2533
-
2534
- // Re-filter and render
2535
- this.filterToolkits();
2536
-
2537
- this.emit('notification', {
2538
- message: `Toolkit ${toolkit?.name || toolkitSlug} ${isEnabled ? 'enabled' : 'disabled'}`,
2539
- type: 'success'
2540
- });
2541
-
2542
- } catch (error) {
2543
- console.error('[SettingsManager] Failed to toggle toolkit:', error);
2544
-
2545
- // Revert checkbox state
2546
- checkbox.checked = !isEnabled;
2547
-
2548
- this.emit('notification', {
2549
- message: `Failed to ${isEnabled ? 'enable' : 'disable'} toolkit: ${error.message}`,
2550
- type: 'error'
2551
- });
2552
- }
2553
- }
2554
-
2555
- // Handle OAuth flow
2556
- async handleOAuthFlow(toolkitSlug, oauthUrl) {
2557
- try {
2558
- console.log(`[SettingsManager] Starting OAuth flow for ${toolkitSlug}`);
2559
-
2560
- // Open OAuth URL in new tab using Chrome extension API
2561
- if (typeof chrome !== 'undefined' && chrome.tabs) {
2562
- chrome.tabs.create({ url: oauthUrl });
2563
- } else {
2564
- // Fallback for non-extension context
2565
- window.open(oauthUrl, '_blank');
2566
- }
2567
-
2568
- // Show OAuth confirmation modal
2569
- this.showOAuthModal(toolkitSlug);
2570
-
2571
- } catch (error) {
2572
- console.error('[SettingsManager] Failed to handle OAuth flow:', error);
2573
- this.emit('notification', {
2574
- message: 'Failed to start OAuth flow',
2575
- type: 'error'
2576
- });
2577
- }
2578
- }
2579
-
2580
- // Show OAuth confirmation modal
2581
- showOAuthModal(toolkitSlug) {
2582
- this.state.currentToolkit = toolkitSlug;
2583
-
2584
- if (this.elements.oauthConfirmationModal) {
2585
- this.elements.oauthConfirmationModal.classList.remove('hidden');
2586
- }
2587
- }
2588
-
2589
- // Hide OAuth confirmation modal
2590
- hideOAuthModal() {
2591
- if (this.elements.oauthConfirmationModal) {
2592
- this.elements.oauthConfirmationModal.classList.add('hidden');
2593
- }
2594
- this.state.currentToolkit = null;
2595
- }
2596
-
2597
- // Handle OAuth completed
2598
- async handleOAuthCompleted() {
2599
- if (!this.state.currentToolkit) {
2600
- this.hideOAuthModal();
2601
- return;
2602
- }
2603
-
2604
- try {
2605
- console.log(`[SettingsManager] Checking OAuth completion for ${this.state.currentToolkit}`);
2606
-
2607
- // Check connection status for the specific toolkit
2608
- const statusResponse = await this.apiClient.getComposioToolkitConnectionStatus(this.state.currentToolkit);
2609
-
2610
- if (statusResponse.connected) {
2611
- // Update state
2612
- const stateToolkit = this.state.toolkits.find(t => t.slug === this.state.currentToolkit);
2613
- if (stateToolkit) {
2614
- stateToolkit.connected = true;
2615
- stateToolkit.enabled = true;
2616
- }
2617
-
2618
- // Re-load toolkits to get latest state
2619
- await this.loadToolkits();
2620
-
2621
- this.emit('notification', {
2622
- message: `${stateToolkit?.name || this.state.currentToolkit} connected successfully!`,
2623
- type: 'success'
2624
- });
2625
- } else {
2626
- this.emit('notification', {
2627
- message: 'OAuth connection not detected. Please try again.',
2628
- type: 'warning'
2629
- });
2630
- }
2631
-
2632
- } catch (error) {
2633
- console.error('[SettingsManager] Failed to check OAuth completion:', error);
2634
- this.emit('notification', {
2635
- message: 'Failed to verify OAuth connection',
2636
- type: 'error'
2637
- });
2638
- } finally {
2639
- this.hideOAuthModal();
2640
- }
2641
- }
2642
-
2643
- // Handle manage tools
2644
- async handleManageTools(toolkitSlug) {
2645
- this.state.currentToolkit = toolkitSlug;
2646
-
2647
- try {
2648
- const toolkit = this.state.toolkits.find(t => t.slug === toolkitSlug);
2649
- if (!toolkit) {
2650
- throw new Error('Toolkit not found');
2651
- }
2652
-
2653
- this.showToolsModal(toolkit);
2654
- await this.loadToolkitTools(toolkitSlug);
2655
-
2656
- } catch (error) {
2657
- console.error('[SettingsManager] Failed to manage tools:', error);
2658
- this.emit('notification', {
2659
- message: 'Failed to load toolkit tools',
2660
- type: 'error'
2661
- });
2662
- }
2663
- }
2664
-
2665
- // Show tools management modal
2666
- showToolsModal(toolkit) {
2667
- if (!this.elements.toolsManagementModal) return;
2668
-
2669
- // Update modal title and info
2670
- if (this.elements.toolsModalTitle) {
2671
- this.elements.toolsModalTitle.textContent = `Manage ${toolkit.name} Tools`;
2672
- }
2673
-
2674
- if (this.elements.toolkitLogo) {
2675
- this.elements.toolkitLogo.src = toolkit.logo || '/default-toolkit-logo.svg';
2676
- this.elements.toolkitLogo.alt = toolkit.name;
2677
- }
2678
-
2679
- if (this.elements.toolkitName) {
2680
- this.elements.toolkitName.textContent = toolkit.name;
2681
- }
2682
-
2683
- // Show modal
2684
- this.elements.toolsManagementModal.classList.remove('hidden');
2685
- }
2686
-
2687
- // Hide tools management modal
2688
- hideToolsModal() {
2689
- if (this.elements.toolsManagementModal) {
2690
- this.elements.toolsManagementModal.classList.add('hidden');
2691
- }
2692
- this.state.currentToolkit = null;
2693
- }
2694
-
2695
- // Load toolkit tools
2696
- async loadToolkitTools(toolkitSlug) {
2697
- if (!this.elements.toolsList || !this.elements.toolsLoading) return;
2698
-
2699
- try {
2700
- this.elements.toolsLoading.style.display = 'block';
2701
- this.elements.toolsList.innerHTML = '';
2702
-
2703
- const response = await this.apiClient.getComposioToolkitTools(toolkitSlug);
2704
- const tools = response.tools || response || [];
2705
-
2706
- this.renderTools(tools);
2707
-
2708
- } catch (error) {
2709
- console.error('[SettingsManager] Failed to load toolkit tools:', error);
2710
- this.elements.toolsList.innerHTML = `
2711
- <div class="empty-state">
2712
- <div class="empty-state-icon">⚠</div>
2713
- <div class="empty-state-title">Failed to Load Tools</div>
2714
- <div class="empty-state-description">Unable to fetch tools for this toolkit.</div>
2715
- </div>
2716
- `;
2717
- } finally {
2718
- this.elements.toolsLoading.style.display = 'none';
2719
- }
2720
- }
2721
-
2722
- // Render tools list
2723
- renderTools(tools) {
2724
- if (!this.elements.toolsList) return;
2725
-
2726
- if (tools.length === 0) {
2727
- this.elements.toolsList.innerHTML = `
2728
- <div class="empty-state">
2729
- <div class="empty-state-icon">🔧</div>
2730
- <div class="empty-state-title">No Tools Available</div>
2731
- <div class="empty-state-description">This toolkit has no tools available.</div>
2732
- </div>
2733
- `;
2734
- return;
2735
- }
2736
-
2737
- const toolsHTML = `
2738
- <div class="tools-table">
2739
- <div class="tools-header">
2740
- <div class="tool-cell tool-checkbox">
2741
- <input type="checkbox" id="select-all-tools-checkbox">
2742
- </div>
2743
- <div class="tool-cell tool-name">Tool Name</div>
2744
- <div class="tool-cell tool-description">Description</div>
2745
- </div>
2746
- <div class="tools-body">
2747
- ${tools.map(tool => `
2748
- <div class="tool-row">
2749
- <div class="tool-cell tool-checkbox">
2750
- <input type="checkbox" class="tool-checkbox-input"
2751
- data-tool-name="${tool.name}"
2752
- ${tool.enabled ? 'checked' : ''}>
2753
- </div>
2754
- <div class="tool-cell tool-name">${this.escapeHtml(tool.name)}</div>
2755
- <div class="tool-cell tool-description">${this.escapeHtml(tool.description || 'No description available')}</div>
2756
- </div>
2757
- `).join('')}
2758
- </div>
2759
- </div>
2760
- `;
2761
-
2762
- this.elements.toolsList.innerHTML = toolsHTML;
2763
-
2764
- // Setup select all functionality
2765
- const selectAllCheckbox = this.elements.toolsList.querySelector('#select-all-tools-checkbox');
2766
- if (selectAllCheckbox) {
2767
- selectAllCheckbox.addEventListener('change', (e) => {
2768
- const toolCheckboxes = this.elements.toolsList.querySelectorAll('.tool-checkbox-input');
2769
- toolCheckboxes.forEach(checkbox => {
2770
- checkbox.checked = e.target.checked;
2771
- });
2772
- });
2773
- }
2774
- }
2775
-
2776
- // Handle select all tools
2777
- handleSelectAllTools() {
2778
- const toolCheckboxes = this.elements.toolsList?.querySelectorAll('.tool-checkbox-input');
2779
- if (toolCheckboxes) {
2780
- toolCheckboxes.forEach(checkbox => {
2781
- checkbox.checked = true;
2782
- });
2783
- }
2784
- }
2785
-
2786
- // Handle deselect all tools
2787
- handleDeselectAllTools() {
2788
- const toolCheckboxes = this.elements.toolsList?.querySelectorAll('.tool-checkbox-input');
2789
- if (toolCheckboxes) {
2790
- toolCheckboxes.forEach(checkbox => {
2791
- checkbox.checked = false;
2792
- });
2793
- }
2794
- }
2795
-
2796
- // Handle tools save
2797
- async handleToolsSave() {
2798
- if (!this.state.currentToolkit) {
2799
- console.error('[SettingsManager] No current toolkit selected for save');
2800
- return;
2801
- }
2802
-
2803
- try {
2804
- console.log(`[SettingsManager] Saving tools for ${this.state.currentToolkit}`);
2805
-
2806
- // Get all tools with their selection status as dictionary
2807
- const toolCheckboxes = this.elements.toolsList?.querySelectorAll('.tool-checkbox-input');
2808
- const selectedTools = {};
2809
-
2810
- if (toolCheckboxes) {
2811
- console.log(`[SettingsManager] Found ${toolCheckboxes.length} tool checkboxes`);
2812
- toolCheckboxes.forEach(checkbox => {
2813
- const toolName = checkbox.dataset.toolName;
2814
- const isSelected = checkbox.checked;
2815
- selectedTools[toolName] = isSelected;
2816
- console.log(`[SettingsManager] Tool ${toolName}: ${isSelected ? 'selected' : 'not selected'}`);
2817
- });
2818
- } else {
2819
- console.warn('[SettingsManager] No tool checkboxes found');
2820
- }
2821
-
2822
- console.log(`[SettingsManager] Selected tools:`, selectedTools);
2823
-
2824
- // Save tools selection
2825
- const response = await this.apiClient.updateComposioToolkitTools(this.state.currentToolkit, selectedTools);
2826
- console.log(`[SettingsManager] Save response:`, response);
2827
-
2828
- this.emit('notification', {
2829
- message: 'Tools configuration saved successfully',
2830
- type: 'success'
2831
- });
2832
-
2833
- // Close modal
2834
- this.hideToolsModal();
2835
-
2836
- } catch (error) {
2837
- console.error('[SettingsManager] Failed to save tools:', error);
2838
- this.emit('notification', {
2839
- message: `Failed to save tools configuration: ${error.message}`,
2840
- type: 'error'
2841
- });
2842
- }
2843
- }
2844
-
2845
- // Update connection status for all enabled toolkits
2846
- async updateToolkitConnectionStatuses() {
2847
- try {
2848
- const enabledToolkits = this.state.toolkits.filter(toolkit => toolkit.enabled);
2849
-
2850
- if (enabledToolkits.length === 0) {
2851
- return;
2852
- }
2853
-
2854
- // Check connection status for each enabled toolkit
2855
- const connectionPromises = enabledToolkits.map(async (toolkit) => {
2856
- try {
2857
- const statusResponse = await this.apiClient.getComposioToolkitConnectionStatus(toolkit.slug);
2858
-
2859
- // Update toolkit connection status
2860
- const toolkitIndex = this.state.toolkits.findIndex(t => t.slug === toolkit.slug);
2861
- if (toolkitIndex !== -1) {
2862
- this.state.toolkits[toolkitIndex].connected = statusResponse.connected;
2863
- this.state.toolkits[toolkitIndex].connection_status = statusResponse.status;
2864
- }
2865
-
2866
- return { slug: toolkit.slug, connected: statusResponse.connected, status: statusResponse.status };
2867
- } catch (error) {
2868
- console.error(`[SettingsManager] Failed to check connection status for ${toolkit.slug}:`, error);
2869
- // Keep as disconnected on error
2870
- return { slug: toolkit.slug, connected: false, status: 'error' };
2871
- }
2872
- });
2873
-
2874
- const results = await Promise.all(connectionPromises);
2875
- console.log('[SettingsManager] Connection status check results:', results);
2876
-
2877
- } catch (error) {
2878
- console.error('[SettingsManager] Failed to update toolkit connection statuses:', error);
2879
- }
2880
- }
2881
- }
2882
-
2883
272
  // Export for use in other modules
2884
273
  if (typeof window !== 'undefined') {
2885
274
  window.VibeSurfSettingsManager = VibeSurfSettingsManager;