vibesurf 0.1.26__py3-none-any.whl → 0.2.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of vibesurf might be problematic. Click here for more details.
- vibe_surf/_version.py +2 -2
- vibe_surf/agents/browser_use_agent.py +15 -353
- vibe_surf/agents/prompts/vibe_surf_prompt.py +35 -1
- vibe_surf/agents/report_writer_agent.py +71 -21
- vibe_surf/agents/vibe_surf_agent.py +232 -120
- vibe_surf/agents/views.py +6 -15
- vibe_surf/backend/api/composio.py +1047 -0
- vibe_surf/backend/api/schedule.py +331 -0
- vibe_surf/backend/api/vibesurf.py +449 -0
- vibe_surf/backend/database/migrations/v005_add_composio_integration.sql +33 -0
- vibe_surf/backend/database/migrations/v006_add_credentials_table.sql +26 -0
- vibe_surf/backend/database/migrations/v007_add_schedule_table.sql +29 -0
- vibe_surf/backend/database/models.py +86 -1
- vibe_surf/backend/database/queries.py +565 -2
- vibe_surf/backend/frontend/assets/MCPLangflow-Bzb6g6Zx.png +0 -0
- vibe_surf/backend/frontend/assets/SlackIcon-DH9MFXnM.js +1 -0
- vibe_surf/backend/frontend/assets/Wikipedia-MKjlsFhR.js +1 -0
- vibe_surf/backend/frontend/assets/Wolfram-DZjh94KW.js +1 -0
- vibe_surf/backend/frontend/assets/__vite-browser-external-BIHI7g3E.js +1 -0
- vibe_surf/backend/frontend/assets/a-arrow-down-M5pMOHfz.js +6 -0
- vibe_surf/backend/frontend/assets/a-arrow-up-Bhux1P9g.js +6 -0
- vibe_surf/backend/frontend/assets/a-large-small-CxpoIZ2k.js +6 -0
- vibe_surf/backend/frontend/assets/accessibility-DIOswxup.js +6 -0
- vibe_surf/backend/frontend/assets/activity-Cgoj6BfB.js +6 -0
- vibe_surf/backend/frontend/assets/air-vent-BRuCRSP-.js +6 -0
- vibe_surf/backend/frontend/assets/airplay-D6ddOHpT.js +6 -0
- vibe_surf/backend/frontend/assets/alarm-clock-BswE0svo.js +6 -0
- vibe_surf/backend/frontend/assets/alarm-clock-check-CMKnL746.js +6 -0
- vibe_surf/backend/frontend/assets/alarm-clock-minus-Cmry03T1.js +6 -0
- vibe_surf/backend/frontend/assets/alarm-clock-off-ByCGR7KD.js +6 -0
- vibe_surf/backend/frontend/assets/alarm-clock-plus-D80NSz4S.js +6 -0
- vibe_surf/backend/frontend/assets/alarm-smoke-DyUVOJUh.js +6 -0
- vibe_surf/backend/frontend/assets/album-CGIJADgR.js +6 -0
- vibe_surf/backend/frontend/assets/align-center-Cb9nxg1u.js +6 -0
- vibe_surf/backend/frontend/assets/align-center-horizontal-DunWyH8w.js +6 -0
- vibe_surf/backend/frontend/assets/align-center-vertical-COWbwf4r.js +6 -0
- vibe_surf/backend/frontend/assets/align-end-horizontal-BXGWZnJg.js +6 -0
- vibe_surf/backend/frontend/assets/align-end-vertical-DsDprlL7.js +6 -0
- vibe_surf/backend/frontend/assets/align-horizontal-distribute-center-fSZ29QkE.js +6 -0
- vibe_surf/backend/frontend/assets/align-horizontal-distribute-end-C3BFRnLg.js +6 -0
- vibe_surf/backend/frontend/assets/align-horizontal-distribute-start-DqYzU1-w.js +6 -0
- vibe_surf/backend/frontend/assets/align-horizontal-justify-center-2iNXkDKh.js +6 -0
- vibe_surf/backend/frontend/assets/align-horizontal-justify-end-COPIkT0U.js +6 -0
- vibe_surf/backend/frontend/assets/align-horizontal-justify-start-DoS3Jrzb.js +6 -0
- vibe_surf/backend/frontend/assets/align-horizontal-space-around-k9yEGjMh.js +6 -0
- vibe_surf/backend/frontend/assets/align-horizontal-space-between-C6RzmtkD.js +6 -0
- vibe_surf/backend/frontend/assets/align-justify-BvD3xtAK.js +6 -0
- vibe_surf/backend/frontend/assets/align-left-BP84nxXJ.js +6 -0
- vibe_surf/backend/frontend/assets/align-right-6z3k9YVj.js +6 -0
- vibe_surf/backend/frontend/assets/align-start-horizontal-DRihqJTg.js +6 -0
- vibe_surf/backend/frontend/assets/align-start-vertical-Bs-ISVmy.js +6 -0
- vibe_surf/backend/frontend/assets/align-vertical-distribute-center-CU82VWLq.js +6 -0
- vibe_surf/backend/frontend/assets/align-vertical-distribute-end-IrubG5LP.js +6 -0
- vibe_surf/backend/frontend/assets/align-vertical-distribute-start-BgBu3t8X.js +6 -0
- vibe_surf/backend/frontend/assets/align-vertical-justify-center-e7psKZ4D.js +6 -0
- vibe_surf/backend/frontend/assets/align-vertical-justify-end-CncIBU5b.js +6 -0
- vibe_surf/backend/frontend/assets/align-vertical-justify-start-21_MQReA.js +6 -0
- vibe_surf/backend/frontend/assets/align-vertical-space-around-NJNn7zPP.js +6 -0
- vibe_surf/backend/frontend/assets/align-vertical-space-between-LYs4c5i9.js +6 -0
- vibe_surf/backend/frontend/assets/ambulance-jMfwSVYH.js +6 -0
- vibe_surf/backend/frontend/assets/ampersand-B1-1HYj1.js +6 -0
- vibe_surf/backend/frontend/assets/ampersands-DVVxe50v.js +6 -0
- vibe_surf/backend/frontend/assets/amphora-B12bYdql.js +6 -0
- vibe_surf/backend/frontend/assets/anchor-C_JuZyO5.js +6 -0
- vibe_surf/backend/frontend/assets/angry-KqzvbAxB.js +6 -0
- vibe_surf/backend/frontend/assets/annoyed-CZXUdq0q.js +6 -0
- vibe_surf/backend/frontend/assets/antenna-CFlKnuEE.js +6 -0
- vibe_surf/backend/frontend/assets/anvil-ObmOBzcW.js +6 -0
- vibe_surf/backend/frontend/assets/aperture-CU6mXxj8.js +6 -0
- vibe_surf/backend/frontend/assets/apify_white-uCJdZkTU.png +0 -0
- vibe_surf/backend/frontend/assets/app-window-D5iSiHiS.js +6 -0
- vibe_surf/backend/frontend/assets/app-window-mac-QOaPWoGX.js +6 -0
- vibe_surf/backend/frontend/assets/apple-D7ZsI-et.js +6 -0
- vibe_surf/backend/frontend/assets/archive-FLn_d8Ny.js +6 -0
- vibe_surf/backend/frontend/assets/archive-restore-C668KwvC.js +6 -0
- vibe_surf/backend/frontend/assets/archive-x-DJJed9T2.js +6 -0
- vibe_surf/backend/frontend/assets/armchair-DfXLs0Nj.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-big-down-DU2dtkeu.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-big-down-dash-CzsIOlhF.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-big-left-CCeUj8q9.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-big-left-dash-CFpRtORj.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-big-right-C1QE56k7.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-big-right-dash-D6H2wruv.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-big-up-0f0CsejQ.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-big-up-dash-Dz-Sbw66.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-down-0-1-B1PGN6BJ.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-down-1-0-Bcl1KrrL.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-down-DZKzcieL.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-down-a-z-DurN_xiR.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-down-from-line-D2i9DDA0.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-down-left-Pid0zUYj.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-down-narrow-wide-DtnDCgZY.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-down-right-BgepY9bM.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-down-to-dot-C5rQ12yn.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-down-to-line-DovZ64L0.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-down-up-D5-v7CDC.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-down-wide-narrow-CGAsRLvP.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-down-z-a-DOGHwUgR.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-left-from-line-DwY8iDxY.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-left-hKr3yGVm.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-left-right-Be5fvvG0.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-left-to-line-DKHIypu3.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-right-BaRZuB8W.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-right-from-line-D3jqt4-q.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-right-left-BKRuMAR-.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-right-to-line-rtWVy_CC.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-up-0-1-yF8Nt_KM.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-up-1-0-WRlLFmSw.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-up-BKnAmgTC.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-up-a-z-COXfk41y.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-up-down-Dtw4v35K.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-up-from-dot-B1XSjc2P.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-up-from-line-C-lHvDpd.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-up-left-CYojov8T.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-up-narrow-wide-B54CYEHs.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-up-right-Bdo9Z-7A.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-up-to-line-DS_I-9Vp.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-up-wide-narrow-B3GeXj9O.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-up-z-a-CdyZuD75.js +6 -0
- vibe_surf/backend/frontend/assets/arrows-up-from-line-0sYhsLRw.js +6 -0
- vibe_surf/backend/frontend/assets/asterisk-CQWlVYDB.js +6 -0
- vibe_surf/backend/frontend/assets/at-sign-Dug8NlWL.js +6 -0
- vibe_surf/backend/frontend/assets/atom-Cx1vCOFb.js +6 -0
- vibe_surf/backend/frontend/assets/audio-lines-Cimsj6_f.js +6 -0
- vibe_surf/backend/frontend/assets/audio-waveform-BxCl1LyQ.js +6 -0
- vibe_surf/backend/frontend/assets/award-dRU3xhJ7.js +6 -0
- vibe_surf/backend/frontend/assets/axe-B8CCMGTD.js +6 -0
- vibe_surf/backend/frontend/assets/axis-3d-D2ZIjjx3.js +6 -0
- vibe_surf/backend/frontend/assets/baby-DWh5CwfC.js +6 -0
- vibe_surf/backend/frontend/assets/backpack-D9rjYWvf.js +6 -0
- vibe_surf/backend/frontend/assets/badge-C0r2CPAV.js +6 -0
- vibe_surf/backend/frontend/assets/badge-alert-Do89zN-s.js +6 -0
- vibe_surf/backend/frontend/assets/badge-cent-Dmv_cqc-.js +6 -0
- vibe_surf/backend/frontend/assets/badge-check--_Rese0X.js +6 -0
- vibe_surf/backend/frontend/assets/badge-dollar-sign-BHnNL8ma.js +6 -0
- vibe_surf/backend/frontend/assets/badge-euro-CKNQv-oO.js +6 -0
- vibe_surf/backend/frontend/assets/badge-help-BlZAHEa-.js +6 -0
- vibe_surf/backend/frontend/assets/badge-indian-rupee-BNIUcLaI.js +6 -0
- vibe_surf/backend/frontend/assets/badge-info-CrX5KTPR.js +6 -0
- vibe_surf/backend/frontend/assets/badge-japanese-yen-0mdbiK5f.js +6 -0
- vibe_surf/backend/frontend/assets/badge-minus-BX_scLIK.js +6 -0
- vibe_surf/backend/frontend/assets/badge-percent-BSJP3Okj.js +6 -0
- vibe_surf/backend/frontend/assets/badge-plus-DhlqCq3Z.js +6 -0
- vibe_surf/backend/frontend/assets/badge-pound-sterling-QpnkBN56.js +6 -0
- vibe_surf/backend/frontend/assets/badge-russian-ruble-L30Ncxnh.js +6 -0
- vibe_surf/backend/frontend/assets/badge-swiss-franc-BQrLli-C.js +6 -0
- vibe_surf/backend/frontend/assets/badge-x-DDXVSWE5.js +6 -0
- vibe_surf/backend/frontend/assets/baggage-claim-Nd9Qw4rX.js +6 -0
- vibe_surf/backend/frontend/assets/ban-fSKv80ss.js +6 -0
- vibe_surf/backend/frontend/assets/banana-DTClkW0x.js +6 -0
- vibe_surf/backend/frontend/assets/bandage-DLyvBCvf.js +6 -0
- vibe_surf/backend/frontend/assets/banknote-ArlwGdT1.js +6 -0
- vibe_surf/backend/frontend/assets/banknote-arrow-down-Dx9vP7KP.js +6 -0
- vibe_surf/backend/frontend/assets/banknote-arrow-up-CZNOWrKW.js +6 -0
- vibe_surf/backend/frontend/assets/banknote-x-y8ot0KXI.js +6 -0
- vibe_surf/backend/frontend/assets/barcode-U3mgwXvC.js +6 -0
- vibe_surf/backend/frontend/assets/baseline-Bb17nsNt.js +6 -0
- vibe_surf/backend/frontend/assets/bath-Fu-10Xqv.js +6 -0
- vibe_surf/backend/frontend/assets/battery-D2ng6PHz.js +6 -0
- vibe_surf/backend/frontend/assets/battery-charging-BBA_U97U.js +6 -0
- vibe_surf/backend/frontend/assets/battery-full-D74R09iv.js +6 -0
- vibe_surf/backend/frontend/assets/battery-low-BMeJBmJp.js +6 -0
- vibe_surf/backend/frontend/assets/battery-medium-clKHZw71.js +6 -0
- vibe_surf/backend/frontend/assets/battery-plus-DxtzU1bB.js +6 -0
- vibe_surf/backend/frontend/assets/battery-warning-1NEZ4eCa.js +6 -0
- vibe_surf/backend/frontend/assets/beaker-Br0pnmtw.js +6 -0
- vibe_surf/backend/frontend/assets/bean-B04lfjZo.js +6 -0
- vibe_surf/backend/frontend/assets/bean-off-C6H6plJJ.js +6 -0
- vibe_surf/backend/frontend/assets/bed-B7xWDlGQ.js +6 -0
- vibe_surf/backend/frontend/assets/bed-double-We8EVOE6.js +6 -0
- vibe_surf/backend/frontend/assets/bed-single-C-tVm75i.js +6 -0
- vibe_surf/backend/frontend/assets/beef-BzzCqLUx.js +6 -0
- vibe_surf/backend/frontend/assets/beer-B1aIU5Wp.js +6 -0
- vibe_surf/backend/frontend/assets/beer-off-T9p0sUQ_.js +6 -0
- vibe_surf/backend/frontend/assets/bell-BiEY08q7.js +6 -0
- vibe_surf/backend/frontend/assets/bell-dot-D6ZHJmF9.js +6 -0
- vibe_surf/backend/frontend/assets/bell-electric-BjP0O4kE.js +6 -0
- vibe_surf/backend/frontend/assets/bell-minus-Cw2KMMsV.js +6 -0
- vibe_surf/backend/frontend/assets/bell-off-JUGEvepv.js +6 -0
- vibe_surf/backend/frontend/assets/bell-plus-BtwPCtO5.js +6 -0
- vibe_surf/backend/frontend/assets/bell-ring-B_RAFBbK.js +6 -0
- vibe_surf/backend/frontend/assets/between-horizontal-end-DG9RojRP.js +6 -0
- vibe_surf/backend/frontend/assets/between-horizontal-start-BNuWKIUb.js +6 -0
- vibe_surf/backend/frontend/assets/between-vertical-end-CUvl7S4G.js +6 -0
- vibe_surf/backend/frontend/assets/between-vertical-start-tYvnZE7k.js +6 -0
- vibe_surf/backend/frontend/assets/biceps-flexed-D2zMmbhv.js +6 -0
- vibe_surf/backend/frontend/assets/bike-DPdpsZIt.js +6 -0
- vibe_surf/backend/frontend/assets/binary-DnnraEVk.js +6 -0
- vibe_surf/backend/frontend/assets/binoculars-BXc-CFA4.js +6 -0
- vibe_surf/backend/frontend/assets/biohazard-D-6PF7OA.js +6 -0
- vibe_surf/backend/frontend/assets/bird-CYNkrqM5.js +6 -0
- vibe_surf/backend/frontend/assets/bitcoin-DG6PDKEk.js +6 -0
- vibe_surf/backend/frontend/assets/blend-COR-wQIS.js +6 -0
- vibe_surf/backend/frontend/assets/blinds-_pD0AjwU.js +6 -0
- vibe_surf/backend/frontend/assets/blocks-C0goFnXe.js +6 -0
- vibe_surf/backend/frontend/assets/bluetooth-BFH9HCot.js +6 -0
- vibe_surf/backend/frontend/assets/bluetooth-connected-C9JKQLmC.js +6 -0
- vibe_surf/backend/frontend/assets/bluetooth-off-ka-F7ZnG.js +6 -0
- vibe_surf/backend/frontend/assets/bluetooth-searching-BdyfX9rD.js +6 -0
- vibe_surf/backend/frontend/assets/bold-CZSxbQF9.js +6 -0
- vibe_surf/backend/frontend/assets/bolt-BjrrPChn.js +6 -0
- vibe_surf/backend/frontend/assets/bomb-CMlcm4r9.js +6 -0
- vibe_surf/backend/frontend/assets/bone-qWIxHNfL.js +6 -0
- vibe_surf/backend/frontend/assets/book-BfRvOdc3.js +6 -0
- vibe_surf/backend/frontend/assets/book-a-CpoCb7Zv.js +6 -0
- vibe_surf/backend/frontend/assets/book-audio-cBKWAq-p.js +6 -0
- vibe_surf/backend/frontend/assets/book-check-CqwOgoOp.js +6 -0
- vibe_surf/backend/frontend/assets/book-copy-ORHl4yqI.js +6 -0
- vibe_surf/backend/frontend/assets/book-dashed-BrJdSa-D.js +6 -0
- vibe_surf/backend/frontend/assets/book-down-Bj4JV-P-.js +6 -0
- vibe_surf/backend/frontend/assets/book-headphones-BYuIU1gj.js +6 -0
- vibe_surf/backend/frontend/assets/book-heart-DCUxVJaU.js +6 -0
- vibe_surf/backend/frontend/assets/book-image-BPpCKv6n.js +6 -0
- vibe_surf/backend/frontend/assets/book-key-Ca_EtM6h.js +6 -0
- vibe_surf/backend/frontend/assets/book-lock-Bldzz1aF.js +6 -0
- vibe_surf/backend/frontend/assets/book-marked-BCleXwJ3.js +6 -0
- vibe_surf/backend/frontend/assets/book-minus-XoJOGZOx.js +6 -0
- vibe_surf/backend/frontend/assets/book-open-DUlI5XCY.js +6 -0
- vibe_surf/backend/frontend/assets/book-open-check-BEksHFoQ.js +6 -0
- vibe_surf/backend/frontend/assets/book-open-text-CiKyiRt-.js +6 -0
- vibe_surf/backend/frontend/assets/book-plus-DuUfSKu2.js +6 -0
- vibe_surf/backend/frontend/assets/book-text-TTfLk4-M.js +6 -0
- vibe_surf/backend/frontend/assets/book-type-CMV326FZ.js +6 -0
- vibe_surf/backend/frontend/assets/book-up-2-CGiuKI0n.js +6 -0
- vibe_surf/backend/frontend/assets/book-up-d2hb8aDq.js +6 -0
- vibe_surf/backend/frontend/assets/book-user-BsZySUGG.js +6 -0
- vibe_surf/backend/frontend/assets/book-x-CoSA25As.js +6 -0
- vibe_surf/backend/frontend/assets/bookmark-CVx8aFGk.js +6 -0
- vibe_surf/backend/frontend/assets/bookmark-check-Zh_1fqo_.js +6 -0
- vibe_surf/backend/frontend/assets/bookmark-minus---KmRSON.js +6 -0
- vibe_surf/backend/frontend/assets/bookmark-plus-ZY-aQ6r5.js +6 -0
- vibe_surf/backend/frontend/assets/bookmark-x-DnEKBdZC.js +6 -0
- vibe_surf/backend/frontend/assets/boom-box-D5cJf4pI.js +6 -0
- vibe_surf/backend/frontend/assets/bot-BbS7VJ5s.js +6 -0
- vibe_surf/backend/frontend/assets/bot-message-square-Bm4hBAbI.js +6 -0
- vibe_surf/backend/frontend/assets/bot-off-CFjG1wx4.js +6 -0
- vibe_surf/backend/frontend/assets/bow-arrow-Bupk8VJM.js +6 -0
- vibe_surf/backend/frontend/assets/box-CyVAC5Vv.js +6 -0
- vibe_surf/backend/frontend/assets/boxes-B3xCa_UA.js +6 -0
- vibe_surf/backend/frontend/assets/braces-QLXt2h0B.js +6 -0
- vibe_surf/backend/frontend/assets/brackets-CEy7gs9d.js +6 -0
- vibe_surf/backend/frontend/assets/brain-circuit-WmeDjyy5.js +6 -0
- vibe_surf/backend/frontend/assets/brain-cog-DKDdpxNn.js +6 -0
- vibe_surf/backend/frontend/assets/brain-ziGJYeS1.js +6 -0
- vibe_surf/backend/frontend/assets/brick-wall-DXer5s5J.js +6 -0
- vibe_surf/backend/frontend/assets/brick-wall-fire-CfXr8Krv.js +6 -0
- vibe_surf/backend/frontend/assets/briefcase-C2YbssAg.js +6 -0
- vibe_surf/backend/frontend/assets/briefcase-business-CJCpJSkU.js +6 -0
- vibe_surf/backend/frontend/assets/briefcase-conveyor-belt-B0jqiIT4.js +6 -0
- vibe_surf/backend/frontend/assets/briefcase-medical-BBH0C6ZQ.js +6 -0
- vibe_surf/backend/frontend/assets/bring-to-front-ywT72zy-.js +6 -0
- vibe_surf/backend/frontend/assets/brush-_uc9w_j1.js +6 -0
- vibe_surf/backend/frontend/assets/bubbles-ggRrvDQI.js +6 -0
- vibe_surf/backend/frontend/assets/bug-6l9frAXO.js +6 -0
- vibe_surf/backend/frontend/assets/bug-off-BmK1mJ7T.js +6 -0
- vibe_surf/backend/frontend/assets/bug-play-DbXJeqOa.js +6 -0
- vibe_surf/backend/frontend/assets/building-2-Cf9gYIvy.js +6 -0
- vibe_surf/backend/frontend/assets/building-D9eMVeBu.js +6 -0
- vibe_surf/backend/frontend/assets/bus-COrhWbdv.js +6 -0
- vibe_surf/backend/frontend/assets/bus-front-Csav5OG_.js +6 -0
- vibe_surf/backend/frontend/assets/cable-BPG7O6tf.js +6 -0
- vibe_surf/backend/frontend/assets/cable-car-ChPtZlze.js +6 -0
- vibe_surf/backend/frontend/assets/cake-DnmMZhI2.js +6 -0
- vibe_surf/backend/frontend/assets/cake-slice-Clc5mDPW.js +6 -0
- vibe_surf/backend/frontend/assets/calculator-C77I3XPN.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-1-BMs-t7Zd.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-DuLRS-6L.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-arrow-down-DoVsOnV0.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-arrow-up-Ca_1_rkT.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-check-2-0JmvXRsb.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-check-DtTDIbPE.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-clock-39XA2NxZ.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-cog-B3elAX8P.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-days-B_4sd_nS.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-fold-1GZdJiY5.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-heart-C20Gu6Pq.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-minus-2-C2uYA9Xy.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-minus-Bf9ZhUgX.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-off-oqUiDnlM.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-plus-2-D5AF7K6Z.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-plus-DFRLvp48.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-range-BtbX_u86.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-search-DKFr3oFg.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-sync-J6s1mjVg.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-x-16dHXmS-.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-x-2-DASXeIpI.js +6 -0
- vibe_surf/backend/frontend/assets/camera-C73rx5T7.js +6 -0
- vibe_surf/backend/frontend/assets/camera-off-lYXrg8Ab.js +6 -0
- vibe_surf/backend/frontend/assets/candy-DHin-JSi.js +6 -0
- vibe_surf/backend/frontend/assets/candy-cane-BrFztxP3.js +6 -0
- vibe_surf/backend/frontend/assets/candy-off-C6p9RmsL.js +6 -0
- vibe_surf/backend/frontend/assets/cannabis-BIomtlTh.js +6 -0
- vibe_surf/backend/frontend/assets/captions-CU9AD1HN.js +6 -0
- vibe_surf/backend/frontend/assets/captions-off-BQabz_7T.js +6 -0
- vibe_surf/backend/frontend/assets/car-CIepr4l8.js +6 -0
- vibe_surf/backend/frontend/assets/car-front-BvC3NXIU.js +6 -0
- vibe_surf/backend/frontend/assets/car-taxi-front-D6kk_vUY.js +6 -0
- vibe_surf/backend/frontend/assets/caravan-B4YvOfvY.js +6 -0
- vibe_surf/backend/frontend/assets/carrot-DScNmGFZ.js +6 -0
- vibe_surf/backend/frontend/assets/case-lower-iW8MijQ2.js +6 -0
- vibe_surf/backend/frontend/assets/case-sensitive-DggKI0Fh.js +6 -0
- vibe_surf/backend/frontend/assets/case-upper-BC22BC0q.js +6 -0
- vibe_surf/backend/frontend/assets/cassette-tape-PMwALept.js +6 -0
- vibe_surf/backend/frontend/assets/cast-Kq2v55CB.js +6 -0
- vibe_surf/backend/frontend/assets/castle-DJzhSlL6.js +6 -0
- vibe_surf/backend/frontend/assets/cat-Cszwi-0j.js +6 -0
- vibe_surf/backend/frontend/assets/cctv-4zeLHFGP.js +6 -0
- vibe_surf/backend/frontend/assets/chart-area-JyFaZNpl.js +6 -0
- vibe_surf/backend/frontend/assets/chart-bar-Bcnue-Eu.js +6 -0
- vibe_surf/backend/frontend/assets/chart-bar-big-dJ6tM8UP.js +6 -0
- vibe_surf/backend/frontend/assets/chart-bar-decreasing-jviD9Nka.js +6 -0
- vibe_surf/backend/frontend/assets/chart-bar-increasing-BcpuBWlQ.js +6 -0
- vibe_surf/backend/frontend/assets/chart-bar-stacked-DLxMM-a6.js +6 -0
- vibe_surf/backend/frontend/assets/chart-candlestick-BK5WOKib.js +6 -0
- vibe_surf/backend/frontend/assets/chart-column-BjT_DIge.js +6 -0
- vibe_surf/backend/frontend/assets/chart-column-big-BoOEhNxT.js +6 -0
- vibe_surf/backend/frontend/assets/chart-column-decreasing-B3PEhFWj.js +6 -0
- vibe_surf/backend/frontend/assets/chart-column-increasing-KTAFoIBT.js +6 -0
- vibe_surf/backend/frontend/assets/chart-column-stacked-Drci0FWY.js +6 -0
- vibe_surf/backend/frontend/assets/chart-gantt-CxLhKfws.js +6 -0
- vibe_surf/backend/frontend/assets/chart-line-Deh3i4SN.js +6 -0
- vibe_surf/backend/frontend/assets/chart-network-1nLETKIo.js +6 -0
- vibe_surf/backend/frontend/assets/chart-no-axes-column-BBUb9OL4.js +6 -0
- vibe_surf/backend/frontend/assets/chart-no-axes-column-decreasing-BNGTEmAA.js +6 -0
- vibe_surf/backend/frontend/assets/chart-no-axes-column-increasing-DYl5MpQr.js +6 -0
- vibe_surf/backend/frontend/assets/chart-no-axes-combined-Bwo9fVPi.js +6 -0
- vibe_surf/backend/frontend/assets/chart-no-axes-gantt-CIpwp7-G.js +6 -0
- vibe_surf/backend/frontend/assets/chart-pie-Brn9eScK.js +6 -0
- vibe_surf/backend/frontend/assets/chart-scatter-BFmfnF4I.js +6 -0
- vibe_surf/backend/frontend/assets/chart-spline-iPy-W03i.js +6 -0
- vibe_surf/backend/frontend/assets/check-check-CQEfDsmx.js +6 -0
- vibe_surf/backend/frontend/assets/chef-hat-DdOkr4i8.js +6 -0
- vibe_surf/backend/frontend/assets/cherry-XkD_QiBI.js +6 -0
- vibe_surf/backend/frontend/assets/chevron-first-muFwJevA.js +6 -0
- vibe_surf/backend/frontend/assets/chevron-last-Bn079TLv.js +6 -0
- vibe_surf/backend/frontend/assets/chevron-left-BhWYBFsk.js +6 -0
- vibe_surf/backend/frontend/assets/chevron-right-zm672Mdr.js +6 -0
- vibe_surf/backend/frontend/assets/chevrons-down-T3mOFRB2.js +6 -0
- vibe_surf/backend/frontend/assets/chevrons-down-up-BfWmsaYK.js +6 -0
- vibe_surf/backend/frontend/assets/chevrons-left-BLFCiP6g.js +6 -0
- vibe_surf/backend/frontend/assets/chevrons-left-right-Cgp4lAQF.js +6 -0
- vibe_surf/backend/frontend/assets/chevrons-left-right-ellipsis-BZSVxQ-x.js +6 -0
- vibe_surf/backend/frontend/assets/chevrons-right-DMKOjes0.js +6 -0
- vibe_surf/backend/frontend/assets/chevrons-right-left-Clwbiy09.js +6 -0
- vibe_surf/backend/frontend/assets/chevrons-up-CdrwLxmN.js +6 -0
- vibe_surf/backend/frontend/assets/chrome-46ygw5lK.js +6 -0
- vibe_surf/backend/frontend/assets/church-DQW3bkcl.js +6 -0
- vibe_surf/backend/frontend/assets/cigarette-CTvLdOLV.js +6 -0
- vibe_surf/backend/frontend/assets/cigarette-off-D0kR9lro.js +6 -0
- vibe_surf/backend/frontend/assets/circle-alert-QG2k6eWP.js +6 -0
- vibe_surf/backend/frontend/assets/circle-arrow-down-BHFs0Q9-.js +6 -0
- vibe_surf/backend/frontend/assets/circle-arrow-left-DQWeTJLw.js +6 -0
- vibe_surf/backend/frontend/assets/circle-arrow-out-down-left-B_oYI2Rn.js +6 -0
- vibe_surf/backend/frontend/assets/circle-arrow-out-down-right-BL4vxEs9.js +6 -0
- vibe_surf/backend/frontend/assets/circle-arrow-out-up-left-CFi1FNF-.js +6 -0
- vibe_surf/backend/frontend/assets/circle-arrow-out-up-right-CmMWk14E.js +6 -0
- vibe_surf/backend/frontend/assets/circle-arrow-right-dhHL8jIm.js +6 -0
- vibe_surf/backend/frontend/assets/circle-arrow-up-B8XWR9s_.js +6 -0
- vibe_surf/backend/frontend/assets/circle-check-CRm9QkNA.js +6 -0
- vibe_surf/backend/frontend/assets/circle-check-big-CPPNLArI.js +6 -0
- vibe_surf/backend/frontend/assets/circle-chevron-down-Cs4S5V03.js +6 -0
- vibe_surf/backend/frontend/assets/circle-chevron-left-V81BDvwB.js +6 -0
- vibe_surf/backend/frontend/assets/circle-chevron-right-CRa7Bkcz.js +6 -0
- vibe_surf/backend/frontend/assets/circle-chevron-up-FDxLxvSd.js +6 -0
- vibe_surf/backend/frontend/assets/circle-dashed-DD55_roy.js +6 -0
- vibe_surf/backend/frontend/assets/circle-divide-DKpocsWo.js +6 -0
- vibe_surf/backend/frontend/assets/circle-dollar-sign-p7_bVi5m.js +6 -0
- vibe_surf/backend/frontend/assets/circle-dot-Be13EypY.js +6 -0
- vibe_surf/backend/frontend/assets/circle-dot-dashed-KuVNkxEv.js +6 -0
- vibe_surf/backend/frontend/assets/circle-ellipsis-BSLpVL-C.js +6 -0
- vibe_surf/backend/frontend/assets/circle-equal-_Mfed9km.js +6 -0
- vibe_surf/backend/frontend/assets/circle-fading-arrow-up-D_E3BIXf.js +6 -0
- vibe_surf/backend/frontend/assets/circle-fading-plus-5ZA5Je_2.js +6 -0
- vibe_surf/backend/frontend/assets/circle-gauge-b41i9Azv.js +6 -0
- vibe_surf/backend/frontend/assets/circle-help-BOLgIUsf.js +6 -0
- vibe_surf/backend/frontend/assets/circle-minus-C41JxC_E.js +6 -0
- vibe_surf/backend/frontend/assets/circle-off-yuGaN1EU.js +6 -0
- vibe_surf/backend/frontend/assets/circle-parking-B-DnXhcd.js +6 -0
- vibe_surf/backend/frontend/assets/circle-parking-off-DsCM2b8j.js +6 -0
- vibe_surf/backend/frontend/assets/circle-pause-Dqufdu9m.js +6 -0
- vibe_surf/backend/frontend/assets/circle-percent-Dp8UwPQq.js +6 -0
- vibe_surf/backend/frontend/assets/circle-play-N8vi1Pcd.js +6 -0
- vibe_surf/backend/frontend/assets/circle-plus-wD1VqIgT.js +6 -0
- vibe_surf/backend/frontend/assets/circle-power-DBZAmaYW.js +6 -0
- vibe_surf/backend/frontend/assets/circle-slash-2-hdq8_Fp6.js +6 -0
- vibe_surf/backend/frontend/assets/circle-slash-CSrHLLP2.js +6 -0
- vibe_surf/backend/frontend/assets/circle-small-BQ6lrOIo.js +6 -0
- vibe_surf/backend/frontend/assets/circle-stop-xgLQ9Loi.js +6 -0
- vibe_surf/backend/frontend/assets/circle-user-CzvrnVH9.js +6 -0
- vibe_surf/backend/frontend/assets/circle-user-round-0JhYfAcs.js +6 -0
- vibe_surf/backend/frontend/assets/circuit-board-DpN-UUwV.js +6 -0
- vibe_surf/backend/frontend/assets/citrus-BGWHfGg3.js +6 -0
- vibe_surf/backend/frontend/assets/clapperboard-9m-99Aof.js +6 -0
- vibe_surf/backend/frontend/assets/clipboard-C-MVPhAy.js +6 -0
- vibe_surf/backend/frontend/assets/clipboard-check-Bonb2WoP.js +6 -0
- vibe_surf/backend/frontend/assets/clipboard-copy-CmRHdw5h.js +6 -0
- vibe_surf/backend/frontend/assets/clipboard-list-DEof2iPM.js +6 -0
- vibe_surf/backend/frontend/assets/clipboard-minus-DN2QuVOG.js +6 -0
- vibe_surf/backend/frontend/assets/clipboard-paste-B20nudiB.js +6 -0
- vibe_surf/backend/frontend/assets/clipboard-pen-BZJamOnq.js +6 -0
- vibe_surf/backend/frontend/assets/clipboard-pen-line-DScYxgpw.js +6 -0
- vibe_surf/backend/frontend/assets/clipboard-plus-DJb4TcvR.js +6 -0
- vibe_surf/backend/frontend/assets/clipboard-type-DaibEn_w.js +6 -0
- vibe_surf/backend/frontend/assets/clipboard-x-CebR2xkR.js +6 -0
- vibe_surf/backend/frontend/assets/clock-1-Cz0OEQH3.js +6 -0
- vibe_surf/backend/frontend/assets/clock-10-BMLTtzHQ.js +6 -0
- vibe_surf/backend/frontend/assets/clock-11-CZ6m52x1.js +6 -0
- vibe_surf/backend/frontend/assets/clock-12-BXZWDgbr.js +6 -0
- vibe_surf/backend/frontend/assets/clock-2-ElC7DzP5.js +6 -0
- vibe_surf/backend/frontend/assets/clock-3-DN86BONK.js +6 -0
- vibe_surf/backend/frontend/assets/clock-4-CV9eUVD9.js +6 -0
- vibe_surf/backend/frontend/assets/clock-5-DgMTU8BD.js +6 -0
- vibe_surf/backend/frontend/assets/clock-6-_RjAiNVz.js +6 -0
- vibe_surf/backend/frontend/assets/clock-7-DsWDnhwN.js +6 -0
- vibe_surf/backend/frontend/assets/clock-8-CY-eCfWq.js +6 -0
- vibe_surf/backend/frontend/assets/clock-9-D4aWNYpk.js +6 -0
- vibe_surf/backend/frontend/assets/clock-UtAbEQE0.js +6 -0
- vibe_surf/backend/frontend/assets/clock-alert-gi6h-zRT.js +6 -0
- vibe_surf/backend/frontend/assets/clock-arrow-down-CC9Qp0ac.js +6 -0
- vibe_surf/backend/frontend/assets/clock-arrow-up-Cjt2qN9V.js +6 -0
- vibe_surf/backend/frontend/assets/clock-fading-BJp0FFxY.js +6 -0
- vibe_surf/backend/frontend/assets/cloud-TYaHXSiL.js +6 -0
- vibe_surf/backend/frontend/assets/cloud-alert-Dp4WVua8.js +6 -0
- vibe_surf/backend/frontend/assets/cloud-cog-Dlyn4rqA.js +6 -0
- vibe_surf/backend/frontend/assets/cloud-download-DH8UN3eX.js +6 -0
- vibe_surf/backend/frontend/assets/cloud-drizzle-s8348ic3.js +6 -0
- vibe_surf/backend/frontend/assets/cloud-fog-DHRDnzsg.js +6 -0
- vibe_surf/backend/frontend/assets/cloud-hail-D7nJGZgB.js +6 -0
- vibe_surf/backend/frontend/assets/cloud-lightning-CscbfdPI.js +6 -0
- vibe_surf/backend/frontend/assets/cloud-moon-C6897Z5z.js +6 -0
- vibe_surf/backend/frontend/assets/cloud-moon-rain-B6pK_auO.js +6 -0
- vibe_surf/backend/frontend/assets/cloud-off-1kN_AD0k.js +6 -0
- vibe_surf/backend/frontend/assets/cloud-rain-Dj6B4fBD.js +6 -0
- vibe_surf/backend/frontend/assets/cloud-rain-wind-BJrdBUd4.js +6 -0
- vibe_surf/backend/frontend/assets/cloud-snow-LK6lpCkZ.js +6 -0
- vibe_surf/backend/frontend/assets/cloud-sun-CRH8EQEJ.js +6 -0
- vibe_surf/backend/frontend/assets/cloud-sun-rain-7IssqnpA.js +6 -0
- vibe_surf/backend/frontend/assets/cloud-upload-tI3Dz1zd.js +6 -0
- vibe_surf/backend/frontend/assets/cloudy-okUc5uOM.js +6 -0
- vibe_surf/backend/frontend/assets/clover-O6CtUOhV.js +6 -0
- vibe_surf/backend/frontend/assets/club-SnWEwVMR.js +6 -0
- vibe_surf/backend/frontend/assets/code-xml-CYTnIdXN.js +6 -0
- vibe_surf/backend/frontend/assets/codepen-UxBTFH8q.js +6 -0
- vibe_surf/backend/frontend/assets/codesandbox-CSRpmotF.js +6 -0
- vibe_surf/backend/frontend/assets/coffee-BTr4K8Gn.js +6 -0
- vibe_surf/backend/frontend/assets/cog-C7RMqAcW.js +6 -0
- vibe_surf/backend/frontend/assets/coins-D7gWOtE7.js +6 -0
- vibe_surf/backend/frontend/assets/columns-2-WBM3YpNL.js +6 -0
- vibe_surf/backend/frontend/assets/columns-3-DyAMu-k8.js +6 -0
- vibe_surf/backend/frontend/assets/columns-3-cog-zfUPAOg0.js +6 -0
- vibe_surf/backend/frontend/assets/columns-4-Qz-B3Dvq.js +6 -0
- vibe_surf/backend/frontend/assets/combine-CLZvnf8j.js +6 -0
- vibe_surf/backend/frontend/assets/command-D8ymLYGG.js +6 -0
- vibe_surf/backend/frontend/assets/compass-DGYgNSVa.js +6 -0
- vibe_surf/backend/frontend/assets/component-CwL9ER1Q.js +6 -0
- vibe_surf/backend/frontend/assets/computer-QNTojt_5.js +6 -0
- vibe_surf/backend/frontend/assets/concierge-bell-C7jm8QJd.js +6 -0
- vibe_surf/backend/frontend/assets/cone-C9TQbkDB.js +6 -0
- vibe_surf/backend/frontend/assets/construction-CSyYpaz5.js +6 -0
- vibe_surf/backend/frontend/assets/contact-CFldvJVP.js +6 -0
- vibe_surf/backend/frontend/assets/contact-round-DA1kjclM.js +6 -0
- vibe_surf/backend/frontend/assets/container-BfGJKo0o.js +6 -0
- vibe_surf/backend/frontend/assets/contrast-DmYhTvN3.js +6 -0
- vibe_surf/backend/frontend/assets/cookie-Cw70purP.js +6 -0
- vibe_surf/backend/frontend/assets/cooking-pot-WzjjWZaR.js +6 -0
- vibe_surf/backend/frontend/assets/copy-BPjnY3ea.js +6 -0
- vibe_surf/backend/frontend/assets/copy-check-B6hqPf9B.js +6 -0
- vibe_surf/backend/frontend/assets/copy-minus-DMGhawAT.js +6 -0
- vibe_surf/backend/frontend/assets/copy-plus-DcW4_i4R.js +6 -0
- vibe_surf/backend/frontend/assets/copy-slash-Cn_xel6o.js +6 -0
- vibe_surf/backend/frontend/assets/copy-x-Dmf3jckJ.js +6 -0
- vibe_surf/backend/frontend/assets/copyleft-CJDbqV_Y.js +6 -0
- vibe_surf/backend/frontend/assets/copyright-Buw-D4Xa.js +6 -0
- vibe_surf/backend/frontend/assets/corner-down-left-BhPTW3SL.js +6 -0
- vibe_surf/backend/frontend/assets/corner-down-right-B_Md48mW.js +6 -0
- vibe_surf/backend/frontend/assets/corner-left-down-DDc0LvYT.js +6 -0
- vibe_surf/backend/frontend/assets/corner-left-up-C_EIQYvd.js +6 -0
- vibe_surf/backend/frontend/assets/corner-right-down-Bipz7-p6.js +6 -0
- vibe_surf/backend/frontend/assets/corner-right-up-euSAC3Mi.js +6 -0
- vibe_surf/backend/frontend/assets/corner-up-left-CRvdJT3E.js +6 -0
- vibe_surf/backend/frontend/assets/corner-up-right-CCK7dhVV.js +6 -0
- vibe_surf/backend/frontend/assets/cpu-DB-52VKi.js +6 -0
- vibe_surf/backend/frontend/assets/creative-commons-CXWueat0.js +6 -0
- vibe_surf/backend/frontend/assets/credit-card-CR5swmPL.js +6 -0
- vibe_surf/backend/frontend/assets/croissant-ClZbIF3L.js +6 -0
- vibe_surf/backend/frontend/assets/crop-DSXkvq6D.js +6 -0
- vibe_surf/backend/frontend/assets/cross-CkHV6YOi.js +6 -0
- vibe_surf/backend/frontend/assets/crosshair-C3tcoYxo.js +6 -0
- vibe_surf/backend/frontend/assets/crown-0LB9DCRa.js +6 -0
- vibe_surf/backend/frontend/assets/cuboid-CidkVtLJ.js +6 -0
- vibe_surf/backend/frontend/assets/cup-soda-DG_5s6Ma.js +6 -0
- vibe_surf/backend/frontend/assets/currency-AEQeyk_J.js +6 -0
- vibe_surf/backend/frontend/assets/cylinder-Da7lV5Pc.js +6 -0
- vibe_surf/backend/frontend/assets/dam-BIFS7P89.js +6 -0
- vibe_surf/backend/frontend/assets/database-Dx9euHTJ.js +6 -0
- vibe_surf/backend/frontend/assets/database-backup-Bbbt7mXt.js +6 -0
- vibe_surf/backend/frontend/assets/database-zap-CJC7IfdF.js +6 -0
- vibe_surf/backend/frontend/assets/decimals-arrow-left-BrRd8_vb.js +6 -0
- vibe_surf/backend/frontend/assets/decimals-arrow-right-Cglo48c9.js +6 -0
- vibe_surf/backend/frontend/assets/delete-C9qTL0sD.js +6 -0
- vibe_surf/backend/frontend/assets/dessert-7PTt5JJ0.js +6 -0
- vibe_surf/backend/frontend/assets/diameter-oheO2UGD.js +6 -0
- vibe_surf/backend/frontend/assets/diamond-DhBpDMNy.js +6 -0
- vibe_surf/backend/frontend/assets/diamond-minus-BqTULDvb.js +6 -0
- vibe_surf/backend/frontend/assets/diamond-percent-D1Ck8xGc.js +6 -0
- vibe_surf/backend/frontend/assets/diamond-plus-DfSf7Xoq.js +6 -0
- vibe_surf/backend/frontend/assets/dice-1-CIRG2xPK.js +6 -0
- vibe_surf/backend/frontend/assets/dice-2-r7s36USZ.js +6 -0
- vibe_surf/backend/frontend/assets/dice-3-Cl7FLe3x.js +6 -0
- vibe_surf/backend/frontend/assets/dice-4-D-yJWiku.js +6 -0
- vibe_surf/backend/frontend/assets/dice-5-Ci09NYyS.js +6 -0
- vibe_surf/backend/frontend/assets/dice-6-CC2FLvLo.js +6 -0
- vibe_surf/backend/frontend/assets/dices-CmB6hNUU.js +6 -0
- vibe_surf/backend/frontend/assets/diff-oCWjvY-c.js +6 -0
- vibe_surf/backend/frontend/assets/disc-2-DpUl7fl6.js +6 -0
- vibe_surf/backend/frontend/assets/disc-3-BugUAszu.js +6 -0
- vibe_surf/backend/frontend/assets/disc-DUbtGdHe.js +6 -0
- vibe_surf/backend/frontend/assets/disc-album-CXJRMctz.js +6 -0
- vibe_surf/backend/frontend/assets/divide-CY1K-HT7.js +6 -0
- vibe_surf/backend/frontend/assets/dna-CeE8ObeE.js +6 -0
- vibe_surf/backend/frontend/assets/dna-off-BviJKT3C.js +6 -0
- vibe_surf/backend/frontend/assets/dock-eIe8zGWk.js +6 -0
- vibe_surf/backend/frontend/assets/dog-CSlDDqxp.js +6 -0
- vibe_surf/backend/frontend/assets/dollar-sign-5U68U397.js +6 -0
- vibe_surf/backend/frontend/assets/donut-BeawTrlI.js +6 -0
- vibe_surf/backend/frontend/assets/door-closed-CwY8Mg15.js +6 -0
- vibe_surf/backend/frontend/assets/door-open-DFgi7N5B.js +6 -0
- vibe_surf/backend/frontend/assets/dot-fPF_etdO.js +6 -0
- vibe_surf/backend/frontend/assets/download-gSwRRqnX.js +6 -0
- vibe_surf/backend/frontend/assets/drafting-compass-Dj_7EFRc.js +6 -0
- vibe_surf/backend/frontend/assets/drama-BlDJuZEs.js +6 -0
- vibe_surf/backend/frontend/assets/dribbble-C0k3dpAi.js +6 -0
- vibe_surf/backend/frontend/assets/drill-COJcLBB4.js +6 -0
- vibe_surf/backend/frontend/assets/droplet-5wuLGLgZ.js +6 -0
- vibe_surf/backend/frontend/assets/droplet-off-Bra_6Oh9.js +6 -0
- vibe_surf/backend/frontend/assets/droplets-BE8PR1pM.js +6 -0
- vibe_surf/backend/frontend/assets/drum-DnJ1RUvq.js +6 -0
- vibe_surf/backend/frontend/assets/drumstick-JGiBDDwZ.js +6 -0
- vibe_surf/backend/frontend/assets/dumbbell-BEtc4tyd.js +6 -0
- vibe_surf/backend/frontend/assets/ear-DAqeJjkr.js +6 -0
- vibe_surf/backend/frontend/assets/ear-off-BA7gp4ie.js +6 -0
- vibe_surf/backend/frontend/assets/earth-CUlUl7Bp.js +6 -0
- vibe_surf/backend/frontend/assets/earth-lock-sl59Ywm7.js +6 -0
- vibe_surf/backend/frontend/assets/eclipse-DY7fC5N3.js +6 -0
- vibe_surf/backend/frontend/assets/egg-DxfY2UB8.js +6 -0
- vibe_surf/backend/frontend/assets/egg-fried-D2Eo3APu.js +6 -0
- vibe_surf/backend/frontend/assets/egg-off-DqYobjwG.js +6 -0
- vibe_surf/backend/frontend/assets/ellipsis-DgOuKLdR.js +6 -0
- vibe_surf/backend/frontend/assets/ellipsis-vertical--sr8F_UD.js +6 -0
- vibe_surf/backend/frontend/assets/equal-DS1qMZhi.js +6 -0
- vibe_surf/backend/frontend/assets/equal-approximately-mgMMBVF_.js +6 -0
- vibe_surf/backend/frontend/assets/equal-not-1Alw8lqE.js +6 -0
- vibe_surf/backend/frontend/assets/eraser-IStMo8nh.js +6 -0
- vibe_surf/backend/frontend/assets/ethernet-port-B6SRY0d8.js +6 -0
- vibe_surf/backend/frontend/assets/euro-S1kGUYTE.js +6 -0
- vibe_surf/backend/frontend/assets/expand-Cj8IQccm.js +6 -0
- vibe_surf/backend/frontend/assets/eye-DrnoCeKD.js +6 -0
- vibe_surf/backend/frontend/assets/eye-closed-B0cNIHJN.js +6 -0
- vibe_surf/backend/frontend/assets/eye-off-DIIh42Ws.js +6 -0
- vibe_surf/backend/frontend/assets/facebook-Df9Fpfnn.js +6 -0
- vibe_surf/backend/frontend/assets/factory-BLKvR2Z1.js +6 -0
- vibe_surf/backend/frontend/assets/fan-C-xRuGdo.js +6 -0
- vibe_surf/backend/frontend/assets/fast-forward-Bae5V83y.js +6 -0
- vibe_surf/backend/frontend/assets/feather-DTPfgED2.js +6 -0
- vibe_surf/backend/frontend/assets/fence-Mr7VQ0O9.js +6 -0
- vibe_surf/backend/frontend/assets/ferris-wheel-D82pDMqi.js +6 -0
- vibe_surf/backend/frontend/assets/figma-DBFJo9L2.js +6 -0
- vibe_surf/backend/frontend/assets/file-DvuZsaUg.js +6 -0
- vibe_surf/backend/frontend/assets/file-archive-DRtB2ivb.js +6 -0
- vibe_surf/backend/frontend/assets/file-audio-2-JE5iEkL9.js +6 -0
- vibe_surf/backend/frontend/assets/file-audio-C4RwC1BT.js +6 -0
- vibe_surf/backend/frontend/assets/file-axis-3d-DQSHzEo4.js +6 -0
- vibe_surf/backend/frontend/assets/file-badge-2-P__XKUXn.js +6 -0
- vibe_surf/backend/frontend/assets/file-badge-CejYglxU.js +6 -0
- vibe_surf/backend/frontend/assets/file-box-CgFMY7Rp.js +6 -0
- vibe_surf/backend/frontend/assets/file-chart-column-Bq5PyMwY.js +6 -0
- vibe_surf/backend/frontend/assets/file-chart-column-increasing-t_d1wCSV.js +6 -0
- vibe_surf/backend/frontend/assets/file-chart-line-Df6iedBR.js +6 -0
- vibe_surf/backend/frontend/assets/file-chart-pie-YH23adPM.js +6 -0
- vibe_surf/backend/frontend/assets/file-check-2-CKcRkU0L.js +6 -0
- vibe_surf/backend/frontend/assets/file-check-BYZznME9.js +6 -0
- vibe_surf/backend/frontend/assets/file-clock-8rD4-Bqt.js +6 -0
- vibe_surf/backend/frontend/assets/file-code-2-BjV8KhR4.js +6 -0
- vibe_surf/backend/frontend/assets/file-code-CXS3YUpM.js +6 -0
- vibe_surf/backend/frontend/assets/file-cog-GKLng0Qf.js +6 -0
- vibe_surf/backend/frontend/assets/file-diff-B_7HXPkJ.js +6 -0
- vibe_surf/backend/frontend/assets/file-digit-AtVulYi7.js +6 -0
- vibe_surf/backend/frontend/assets/file-down-CJIG5dHj.js +6 -0
- vibe_surf/backend/frontend/assets/file-heart-B8jWzdG5.js +6 -0
- vibe_surf/backend/frontend/assets/file-image-CXtDt3N3.js +6 -0
- vibe_surf/backend/frontend/assets/file-input-B-0mgcKT.js +6 -0
- vibe_surf/backend/frontend/assets/file-json-2-DQHJM93o.js +6 -0
- vibe_surf/backend/frontend/assets/file-json-BmrGDLh2.js +6 -0
- vibe_surf/backend/frontend/assets/file-key-2-DnpQ1dTj.js +6 -0
- vibe_surf/backend/frontend/assets/file-key-D3lJXveQ.js +6 -0
- vibe_surf/backend/frontend/assets/file-lock-2-DWdLzoF7.js +6 -0
- vibe_surf/backend/frontend/assets/file-lock-ZMZB3U4I.js +6 -0
- vibe_surf/backend/frontend/assets/file-minus-2-CsTsio0s.js +6 -0
- vibe_surf/backend/frontend/assets/file-minus-CtfRmVme.js +6 -0
- vibe_surf/backend/frontend/assets/file-music-DHhVu2aK.js +6 -0
- vibe_surf/backend/frontend/assets/file-output-CjQ-FMg0.js +6 -0
- vibe_surf/backend/frontend/assets/file-pen-C9S_u4U9.js +6 -0
- vibe_surf/backend/frontend/assets/file-pen-line-niZF4quE.js +6 -0
- vibe_surf/backend/frontend/assets/file-plus-2-DzIiS2EM.js +6 -0
- vibe_surf/backend/frontend/assets/file-plus-Bloe0E45.js +6 -0
- vibe_surf/backend/frontend/assets/file-question-BBTjP9h0.js +6 -0
- vibe_surf/backend/frontend/assets/file-scan-B3Bn2EZN.js +6 -0
- vibe_surf/backend/frontend/assets/file-search-2-DnC8d9OD.js +6 -0
- vibe_surf/backend/frontend/assets/file-search-DzPGZllw.js +6 -0
- vibe_surf/backend/frontend/assets/file-sliders-BHYXa9jQ.js +6 -0
- vibe_surf/backend/frontend/assets/file-spreadsheet-DvjPpK9G.js +6 -0
- vibe_surf/backend/frontend/assets/file-stack-yJR4id_3.js +6 -0
- vibe_surf/backend/frontend/assets/file-symlink-BWQBdrEp.js +6 -0
- vibe_surf/backend/frontend/assets/file-terminal-CvhcKgiv.js +6 -0
- vibe_surf/backend/frontend/assets/file-text-tuxzZhRs.js +6 -0
- vibe_surf/backend/frontend/assets/file-type-2-Dgantaer.js +6 -0
- vibe_surf/backend/frontend/assets/file-type-DfZBPqmH.js +6 -0
- vibe_surf/backend/frontend/assets/file-up-GXfnonbH.js +6 -0
- vibe_surf/backend/frontend/assets/file-user-N7Fan7ao.js +6 -0
- vibe_surf/backend/frontend/assets/file-video-2-B4JBmAcG.js +6 -0
- vibe_surf/backend/frontend/assets/file-video-Fsp8g5kU.js +6 -0
- vibe_surf/backend/frontend/assets/file-volume-2-Cg1A9z8S.js +6 -0
- vibe_surf/backend/frontend/assets/file-volume-xzVZMKW0.js +6 -0
- vibe_surf/backend/frontend/assets/file-warning-CS2F3Xr2.js +6 -0
- vibe_surf/backend/frontend/assets/file-x-2-BNUgAQH8.js +6 -0
- vibe_surf/backend/frontend/assets/file-x-DTK5Zfd-.js +6 -0
- vibe_surf/backend/frontend/assets/files-CNx4yvup.js +6 -0
- vibe_surf/backend/frontend/assets/film-Dec7cGCL.js +6 -0
- vibe_surf/backend/frontend/assets/fingerprint-B_IGMLcp.js +6 -0
- vibe_surf/backend/frontend/assets/fire-extinguisher-CjZilrfE.js +6 -0
- vibe_surf/backend/frontend/assets/fish-CXs3XpVQ.js +6 -0
- vibe_surf/backend/frontend/assets/fish-off-BfYutBG_.js +6 -0
- vibe_surf/backend/frontend/assets/fish-symbol-DFoA8GWJ.js +6 -0
- vibe_surf/backend/frontend/assets/flag-cx37QYSs.js +6 -0
- vibe_surf/backend/frontend/assets/flag-off-DyXYguA1.js +6 -0
- vibe_surf/backend/frontend/assets/flag-triangle-left-Dvsg9XUg.js +6 -0
- vibe_surf/backend/frontend/assets/flag-triangle-right-CluL18qS.js +6 -0
- vibe_surf/backend/frontend/assets/flame-DwjoBypP.js +6 -0
- vibe_surf/backend/frontend/assets/flame-kindling-DFbZUxx1.js +6 -0
- vibe_surf/backend/frontend/assets/flashlight-eSCrcAU_.js +6 -0
- vibe_surf/backend/frontend/assets/flashlight-off-C6ZnSGnv.js +6 -0
- vibe_surf/backend/frontend/assets/flask-conical-CqZXJFUg.js +6 -0
- vibe_surf/backend/frontend/assets/flask-conical-off-DLnkLxdX.js +6 -0
- vibe_surf/backend/frontend/assets/flask-round-Dukzlk12.js +6 -0
- vibe_surf/backend/frontend/assets/flip-horizontal-2-DPCHT9Se.js +6 -0
- vibe_surf/backend/frontend/assets/flip-horizontal-B27Zih29.js +6 -0
- vibe_surf/backend/frontend/assets/flip-vertical-2-BLZ7P_e7.js +6 -0
- vibe_surf/backend/frontend/assets/flip-vertical-BKIxHZUr.js +6 -0
- vibe_surf/backend/frontend/assets/flower-2-C3USolHO.js +6 -0
- vibe_surf/backend/frontend/assets/flower-MuZltbIo.js +6 -0
- vibe_surf/backend/frontend/assets/focus-42uZfpdQ.js +6 -0
- vibe_surf/backend/frontend/assets/fold-horizontal-Di0iHFys.js +6 -0
- vibe_surf/backend/frontend/assets/fold-vertical-DTaNfFgW.js +6 -0
- vibe_surf/backend/frontend/assets/folder-CZZJq_yO.js +6 -0
- vibe_surf/backend/frontend/assets/folder-archive-B9gmPXfh.js +6 -0
- vibe_surf/backend/frontend/assets/folder-check-D8RNiC0h.js +6 -0
- vibe_surf/backend/frontend/assets/folder-clock-xJeq54e5.js +6 -0
- vibe_surf/backend/frontend/assets/folder-closed-J_oj7irx.js +6 -0
- vibe_surf/backend/frontend/assets/folder-code-sdeNF88C.js +6 -0
- vibe_surf/backend/frontend/assets/folder-cog-DaxTyB8x.js +6 -0
- vibe_surf/backend/frontend/assets/folder-dot-CcddM8ht.js +6 -0
- vibe_surf/backend/frontend/assets/folder-down-B6ibnVRy.js +6 -0
- vibe_surf/backend/frontend/assets/folder-git-2-C1s592lv.js +6 -0
- vibe_surf/backend/frontend/assets/folder-git-DT6ZCpGc.js +6 -0
- vibe_surf/backend/frontend/assets/folder-heart-_fpvnFcA.js +6 -0
- vibe_surf/backend/frontend/assets/folder-input-OCjNnVk-.js +6 -0
- vibe_surf/backend/frontend/assets/folder-kanban-DgbGiYl_.js +6 -0
- vibe_surf/backend/frontend/assets/folder-key-6dl4vOVJ.js +6 -0
- vibe_surf/backend/frontend/assets/folder-lock-C0FPUNUM.js +6 -0
- vibe_surf/backend/frontend/assets/folder-minus-CnnUrRgx.js +6 -0
- vibe_surf/backend/frontend/assets/folder-open-B6qoyzo4.js +6 -0
- vibe_surf/backend/frontend/assets/folder-open-dot-vcn79EAq.js +6 -0
- vibe_surf/backend/frontend/assets/folder-output-aqyTbjq1.js +6 -0
- vibe_surf/backend/frontend/assets/folder-pen-DONbvY-M.js +6 -0
- vibe_surf/backend/frontend/assets/folder-plus-B1CMWyUH.js +6 -0
- vibe_surf/backend/frontend/assets/folder-root-CO03ueMD.js +6 -0
- vibe_surf/backend/frontend/assets/folder-search-2-vXSwPDsr.js +6 -0
- vibe_surf/backend/frontend/assets/folder-search-CqRRhEYi.js +6 -0
- vibe_surf/backend/frontend/assets/folder-symlink-CyG26ZIM.js +6 -0
- vibe_surf/backend/frontend/assets/folder-sync-D7kc3Qv9.js +6 -0
- vibe_surf/backend/frontend/assets/folder-tree-B_kJAFgg.js +6 -0
- vibe_surf/backend/frontend/assets/folder-up-CPWWXuBL.js +6 -0
- vibe_surf/backend/frontend/assets/folder-x-BgWBu65a.js +6 -0
- vibe_surf/backend/frontend/assets/folders-BqIxqB0_.js +6 -0
- vibe_surf/backend/frontend/assets/footprints-U_DOce2V.js +6 -0
- vibe_surf/backend/frontend/assets/forklift-HwzIz7aw.js +6 -0
- vibe_surf/backend/frontend/assets/forward-DjYLGiCR.js +6 -0
- vibe_surf/backend/frontend/assets/frame-poMkf2ta.js +6 -0
- vibe_surf/backend/frontend/assets/framer-DNQvf86-.js +6 -0
- vibe_surf/backend/frontend/assets/frown-BnHOvtLa.js +6 -0
- vibe_surf/backend/frontend/assets/fuel-Cm_lHCJg.js +6 -0
- vibe_surf/backend/frontend/assets/fullscreen-COEG0zVc.js +6 -0
- vibe_surf/backend/frontend/assets/funnel-BKREn55d.js +6 -0
- vibe_surf/backend/frontend/assets/funnel-plus-B1RbFoZ4.js +6 -0
- vibe_surf/backend/frontend/assets/funnel-x-z3lufNFJ.js +6 -0
- vibe_surf/backend/frontend/assets/gallery-horizontal-CZQKmb1v.js +6 -0
- vibe_surf/backend/frontend/assets/gallery-horizontal-end-rt0pNZmd.js +6 -0
- vibe_surf/backend/frontend/assets/gallery-thumbnails-BawPOO5E.js +6 -0
- vibe_surf/backend/frontend/assets/gallery-vertical-DHlqWz-O.js +6 -0
- vibe_surf/backend/frontend/assets/gallery-vertical-end-1UBU5tP0.js +6 -0
- vibe_surf/backend/frontend/assets/gamepad-2-CGlBaPJy.js +6 -0
- vibe_surf/backend/frontend/assets/gamepad-B7EN8TXy.js +6 -0
- vibe_surf/backend/frontend/assets/gauge-CkJyJpYu.js +6 -0
- vibe_surf/backend/frontend/assets/gavel-BXOFsfyc.js +6 -0
- vibe_surf/backend/frontend/assets/gem-DJaoJhpp.js +6 -0
- vibe_surf/backend/frontend/assets/ghost-5jDlD5mv.js +6 -0
- vibe_surf/backend/frontend/assets/gift-DTuN9n1d.js +6 -0
- vibe_surf/backend/frontend/assets/git-branch-CAxiUjEF.js +6 -0
- vibe_surf/backend/frontend/assets/git-branch-plus-BcouIUD3.js +6 -0
- vibe_surf/backend/frontend/assets/git-commit-horizontal-DqOnbX0A.js +6 -0
- vibe_surf/backend/frontend/assets/git-commit-vertical-DEAmtVm7.js +6 -0
- vibe_surf/backend/frontend/assets/git-compare-8F4A8hf8.js +6 -0
- vibe_surf/backend/frontend/assets/git-compare-arrows-BCgbMQBd.js +6 -0
- vibe_surf/backend/frontend/assets/git-fork-UmnYpjac.js +6 -0
- vibe_surf/backend/frontend/assets/git-graph-MIRVcG3s.js +6 -0
- vibe_surf/backend/frontend/assets/git-merge-1ccPZB0a.js +6 -0
- vibe_surf/backend/frontend/assets/git-pull-request-BAmJjoSf.js +6 -0
- vibe_surf/backend/frontend/assets/git-pull-request-arrow-hDbG9s0T.js +6 -0
- vibe_surf/backend/frontend/assets/git-pull-request-closed-DZVF4_75.js +6 -0
- vibe_surf/backend/frontend/assets/git-pull-request-create-B_ikGAua.js +6 -0
- vibe_surf/backend/frontend/assets/git-pull-request-create-arrow-OlDcvuiA.js +6 -0
- vibe_surf/backend/frontend/assets/git-pull-request-draft-CfvzgQz4.js +6 -0
- vibe_surf/backend/frontend/assets/github-DlTWmBTt.js +6 -0
- vibe_surf/backend/frontend/assets/gitlab-DquWeR50.js +6 -0
- vibe_surf/backend/frontend/assets/glass-water-yuqxiPgK.js +6 -0
- vibe_surf/backend/frontend/assets/glasses-DPTQtusr.js +6 -0
- vibe_surf/backend/frontend/assets/globe-D1X1kv-g.js +6 -0
- vibe_surf/backend/frontend/assets/globe-lock-miWknHfI.js +6 -0
- vibe_surf/backend/frontend/assets/goal-BY1nb-LN.js +6 -0
- vibe_surf/backend/frontend/assets/grab-CnmpLOMH.js +6 -0
- vibe_surf/backend/frontend/assets/graduation-cap-CcH89wnV.js +6 -0
- vibe_surf/backend/frontend/assets/grape-CIiMFgS_.js +6 -0
- vibe_surf/backend/frontend/assets/grid-2x2-DyXR6Owe.js +6 -0
- vibe_surf/backend/frontend/assets/grid-2x2-check-D2GIuWpl.js +6 -0
- vibe_surf/backend/frontend/assets/grid-2x2-plus-D89B7CNh.js +6 -0
- vibe_surf/backend/frontend/assets/grid-2x2-x-CMeekq27.js +6 -0
- vibe_surf/backend/frontend/assets/grid-3x3-qKjElxaz.js +6 -0
- vibe_surf/backend/frontend/assets/grip--SsS48b-.js +6 -0
- vibe_surf/backend/frontend/assets/grip-horizontal-DapWkFjo.js +6 -0
- vibe_surf/backend/frontend/assets/grip-vertical-vn3rXQIt.js +6 -0
- vibe_surf/backend/frontend/assets/group-XhzCMXdw.js +6 -0
- vibe_surf/backend/frontend/assets/guitar-But8OLt2.js +6 -0
- vibe_surf/backend/frontend/assets/ham-_9G65W_I.js +6 -0
- vibe_surf/backend/frontend/assets/hammer-C2AZqVnX.js +6 -0
- vibe_surf/backend/frontend/assets/hand-DXuxSiOo.js +6 -0
- vibe_surf/backend/frontend/assets/hand-coins-mma7__lh.js +6 -0
- vibe_surf/backend/frontend/assets/hand-heart-DNtq1bnS.js +6 -0
- vibe_surf/backend/frontend/assets/hand-helping-Cdw7lKNu.js +6 -0
- vibe_surf/backend/frontend/assets/hand-metal-CcoWdRUV.js +6 -0
- vibe_surf/backend/frontend/assets/hand-platter-DoQTVTFx.js +6 -0
- vibe_surf/backend/frontend/assets/handshake-CJyspjIU.js +6 -0
- vibe_surf/backend/frontend/assets/hard-drive-ZduQuJtY.js +6 -0
- vibe_surf/backend/frontend/assets/hard-drive-download-D_hUh11c.js +6 -0
- vibe_surf/backend/frontend/assets/hard-drive-upload-BBPLIyZo.js +6 -0
- vibe_surf/backend/frontend/assets/hard-hat-OlmGevRI.js +6 -0
- vibe_surf/backend/frontend/assets/hash-COjLjaYu.js +6 -0
- vibe_surf/backend/frontend/assets/haze-Vf7OsAWn.js +6 -0
- vibe_surf/backend/frontend/assets/hdmi-port-B3C9bYX1.js +6 -0
- vibe_surf/backend/frontend/assets/heading-1-Dyyb72R2.js +6 -0
- vibe_surf/backend/frontend/assets/heading-2-ClF7vOi5.js +6 -0
- vibe_surf/backend/frontend/assets/heading-3-DPRazJfc.js +6 -0
- vibe_surf/backend/frontend/assets/heading-4-3e6Zii5g.js +6 -0
- vibe_surf/backend/frontend/assets/heading-5-GEVsfo30.js +6 -0
- vibe_surf/backend/frontend/assets/heading-6-CtX8dWYy.js +6 -0
- vibe_surf/backend/frontend/assets/heading-C_c5dBtC.js +6 -0
- vibe_surf/backend/frontend/assets/headphone-off-VkuNIw42.js +6 -0
- vibe_surf/backend/frontend/assets/headphones-BdMKOmhg.js +6 -0
- vibe_surf/backend/frontend/assets/headset-CGOllUmf.js +6 -0
- vibe_surf/backend/frontend/assets/heart-J_dfRIZ7.js +6 -0
- vibe_surf/backend/frontend/assets/heart-crack-BDNXXAjd.js +6 -0
- vibe_surf/backend/frontend/assets/heart-handshake-BhQLIVaj.js +6 -0
- vibe_surf/backend/frontend/assets/heart-minus-Dgexi3zQ.js +6 -0
- vibe_surf/backend/frontend/assets/heart-off-DF68jDRm.js +6 -0
- vibe_surf/backend/frontend/assets/heart-plus-D3LX6R_l.js +6 -0
- vibe_surf/backend/frontend/assets/heart-pulse-DnwkpqSJ.js +6 -0
- vibe_surf/backend/frontend/assets/heater-Bilq_TPS.js +6 -0
- vibe_surf/backend/frontend/assets/hexagon-BEvfIIaV.js +6 -0
- vibe_surf/backend/frontend/assets/highlighter-CNa8UVQD.js +6 -0
- vibe_surf/backend/frontend/assets/history-BggOc8wP.js +6 -0
- vibe_surf/backend/frontend/assets/hop-BCUHAdeR.js +6 -0
- vibe_surf/backend/frontend/assets/hop-off-B5f9Fr80.js +6 -0
- vibe_surf/backend/frontend/assets/hospital-Dk0tqXu9.js +6 -0
- vibe_surf/backend/frontend/assets/hotel-CXl-yW7B.js +6 -0
- vibe_surf/backend/frontend/assets/hourglass-DSRXQwTc.js +6 -0
- vibe_surf/backend/frontend/assets/house-Bhp2WF4v.js +6 -0
- vibe_surf/backend/frontend/assets/house-plug-DXm5j2Xq.js +6 -0
- vibe_surf/backend/frontend/assets/house-plus-KMp_x4hA.js +6 -0
- vibe_surf/backend/frontend/assets/house-wifi-Ccrar5-8.js +6 -0
- vibe_surf/backend/frontend/assets/ice-cream-bowl-j3qet3-o.js +6 -0
- vibe_surf/backend/frontend/assets/ice-cream-cone-XtpMBOSu.js +6 -0
- vibe_surf/backend/frontend/assets/id-card-BqzQOrR_.js +6 -0
- vibe_surf/backend/frontend/assets/image-B3lEwdvu.js +6 -0
- vibe_surf/backend/frontend/assets/image-down-sVdzbwfm.js +6 -0
- vibe_surf/backend/frontend/assets/image-minus-BdddBiyu.js +6 -0
- vibe_surf/backend/frontend/assets/image-off-CCZ9kVWH.js +6 -0
- vibe_surf/backend/frontend/assets/image-play-LNuKchCO.js +6 -0
- vibe_surf/backend/frontend/assets/image-plus-B4GTKJ6Z.js +6 -0
- vibe_surf/backend/frontend/assets/image-up-BfxmsdpY.js +6 -0
- vibe_surf/backend/frontend/assets/image-upscale-CexWZ50d.js +6 -0
- vibe_surf/backend/frontend/assets/images-C8Wp1eOg.js +6 -0
- vibe_surf/backend/frontend/assets/import-ec27SWYy.js +6 -0
- vibe_surf/backend/frontend/assets/inbox-YvwvpFKi.js +6 -0
- vibe_surf/backend/frontend/assets/indent-decrease-Dp0BVsoQ.js +6 -0
- vibe_surf/backend/frontend/assets/indent-increase-D3BuYj2n.js +6 -0
- vibe_surf/backend/frontend/assets/index-2CcQW4OZ.js +13 -0
- vibe_surf/backend/frontend/assets/index-4vq5awkV.js +1 -0
- vibe_surf/backend/frontend/assets/index-5ZZlgfo-.js +1 -0
- vibe_surf/backend/frontend/assets/index-6dxAUV6Y.js +1 -0
- vibe_surf/backend/frontend/assets/index-AzcZQWVx.js +2723 -0
- vibe_surf/backend/frontend/assets/index-B-IDFsd0.js +1 -0
- vibe_surf/backend/frontend/assets/index-B-ohDVDe.js +1 -0
- vibe_surf/backend/frontend/assets/index-B1Q4y1qa.js +1 -0
- vibe_surf/backend/frontend/assets/index-B1SY6fah.js +1 -0
- vibe_surf/backend/frontend/assets/index-B2ljcLYu.js +1 -0
- vibe_surf/backend/frontend/assets/index-B4-H1yfm.js +108 -0
- vibe_surf/backend/frontend/assets/index-B6MKztQU.js +1 -0
- vibe_surf/backend/frontend/assets/index-B7i2Q-3O.js +1 -0
- vibe_surf/backend/frontend/assets/index-B9Wx-Ii0.js +1 -0
- vibe_surf/backend/frontend/assets/index-BFzpTaXY.js +1 -0
- vibe_surf/backend/frontend/assets/index-BIBNbmyC.js +1 -0
- vibe_surf/backend/frontend/assets/index-BL_hoToU.js +1 -0
- vibe_surf/backend/frontend/assets/index-BOeI-zQ9.js +1 -0
- vibe_surf/backend/frontend/assets/index-BPEpFAuc.js +1 -0
- vibe_surf/backend/frontend/assets/index-BQ1eB4fC.js +1 -0
- vibe_surf/backend/frontend/assets/index-BQ2H2d3f.js +1 -0
- vibe_surf/backend/frontend/assets/index-BR-8IPV4.js +205 -0
- vibe_surf/backend/frontend/assets/index-BV8ArFsA.js +1 -0
- vibe_surf/backend/frontend/assets/index-BWwASCq5.js +1 -0
- vibe_surf/backend/frontend/assets/index-BWwglY3I.js +1 -0
- vibe_surf/backend/frontend/assets/index-B_Qz_foX.js +1 -0
- vibe_surf/backend/frontend/assets/index-BaoW7GZH.js +1 -0
- vibe_surf/backend/frontend/assets/index-BcrHz-y8.js +1 -0
- vibe_surf/backend/frontend/assets/index-BdSzkc1f.js +20 -0
- vibe_surf/backend/frontend/assets/index-BeLkvqxv.js +1 -0
- vibe_surf/backend/frontend/assets/index-Beq_etUM.js +1 -0
- vibe_surf/backend/frontend/assets/index-BgzQso9y.js +1 -0
- vibe_surf/backend/frontend/assets/index-BiNrEY13.js +1 -0
- vibe_surf/backend/frontend/assets/index-Bja3ZEZo.js +1 -0
- vibe_surf/backend/frontend/assets/index-BmcD7XCM.js +1 -0
- vibe_surf/backend/frontend/assets/index-BmnwJzsA.js +1 -0
- vibe_surf/backend/frontend/assets/index-BssAenIo.js +1 -0
- vibe_surf/backend/frontend/assets/index-BvEZ1ywS.js +1 -0
- vibe_surf/backend/frontend/assets/index-BwO1owi8.js +1 -0
- vibe_surf/backend/frontend/assets/index-BwXsJbuu.js +21 -0
- vibe_surf/backend/frontend/assets/index-BwlG2DdK.js +1 -0
- vibe_surf/backend/frontend/assets/index-BzjC6B6I.js +1 -0
- vibe_surf/backend/frontend/assets/index-C0BOag_5.js +1 -0
- vibe_surf/backend/frontend/assets/index-C0EsaEHC.js +1 -0
- vibe_surf/backend/frontend/assets/index-C0IGIaTE.js +1 -0
- vibe_surf/backend/frontend/assets/index-C0IdY_9F.js +1 -0
- vibe_surf/backend/frontend/assets/index-C1DABLwl.js +1 -0
- vibe_surf/backend/frontend/assets/index-C1JE4AZB.js +1 -0
- vibe_surf/backend/frontend/assets/index-C1Rkl2Ur.js +1 -0
- vibe_surf/backend/frontend/assets/index-C2YWu5t8.js +1 -0
- vibe_surf/backend/frontend/assets/index-C2_4AcrM.js +1 -0
- vibe_surf/backend/frontend/assets/index-C48IE5LT.js +1 -0
- vibe_surf/backend/frontend/assets/index-C4JqQnzd.js +1 -0
- vibe_surf/backend/frontend/assets/index-C5QqjjEO.js +1 -0
- vibe_surf/backend/frontend/assets/index-C6ZyrgxW.js +1 -0
- vibe_surf/backend/frontend/assets/index-C9n9R8Ob.js +1 -0
- vibe_surf/backend/frontend/assets/index-CATPt8gz.js +1 -0
- vibe_surf/backend/frontend/assets/index-CAc6KlCl.js +1 -0
- vibe_surf/backend/frontend/assets/index-CAeE91z_.js +1 -0
- vibe_surf/backend/frontend/assets/index-CBLrD5S8.js +1 -0
- vibe_surf/backend/frontend/assets/index-CEx7_efn.js +1 -0
- vibe_surf/backend/frontend/assets/index-CGNwvjd6.js +1 -0
- vibe_surf/backend/frontend/assets/index-CJIkyYuu.js +1 -0
- vibe_surf/backend/frontend/assets/index-CL8YNknR.js +1 -0
- vibe_surf/backend/frontend/assets/index-CQ4c4zmh.js +1 -0
- vibe_surf/backend/frontend/assets/index-CSKpbeRU.js +1 -0
- vibe_surf/backend/frontend/assets/index-CTJUto70.js +1 -0
- vibe_surf/backend/frontend/assets/index-CUm8t_3-.js +1 -0
- vibe_surf/backend/frontend/assets/index-CWaG8YQf.js +1 -0
- vibe_surf/backend/frontend/assets/index-CWqCL2_S.js +1 -0
- vibe_surf/backend/frontend/assets/index-CZKjLvxC.js +1 -0
- vibe_surf/backend/frontend/assets/index-C_a_gjJ3.js +7382 -0
- vibe_surf/backend/frontend/assets/index-C_gjztJA.js +1 -0
- vibe_surf/backend/frontend/assets/index-Cd394DZ3.js +1 -0
- vibe_surf/backend/frontend/assets/index-Ch_ENQTO.js +1 -0
- vibe_surf/backend/frontend/assets/index-CjDauRtw.js +1 -0
- vibe_surf/backend/frontend/assets/index-Cjsyudia.js +1 -0
- vibe_surf/backend/frontend/assets/index-Ck0Rk7OE.js +1 -0
- vibe_surf/backend/frontend/assets/index-Ct1jT_zG.js +1 -0
- vibe_surf/backend/frontend/assets/index-CtZOHuJR.js +1 -0
- vibe_surf/backend/frontend/assets/index-CwylYZIy.js +1 -0
- vibe_surf/backend/frontend/assets/index-CxGAIJCD.js +1 -0
- vibe_surf/backend/frontend/assets/index-D-6VXnmQ.js +1 -0
- vibe_surf/backend/frontend/assets/index-D-_pq5D8.js +1 -0
- vibe_surf/backend/frontend/assets/index-D-oTsuqV.js +1 -0
- vibe_surf/backend/frontend/assets/index-D8iHrvl3.js +1 -0
- vibe_surf/backend/frontend/assets/index-DDYB0tod.js +1 -0
- vibe_surf/backend/frontend/assets/index-DDtHdtyM.js +1 -0
- vibe_surf/backend/frontend/assets/index-DH3R0iod.js +1 -0
- vibe_surf/backend/frontend/assets/index-DJAmqieX.js +1 -0
- vibe_surf/backend/frontend/assets/index-DJYhOcBD.js +1 -0
- vibe_surf/backend/frontend/assets/index-DQKxDe4Q.js +1 -0
- vibe_surf/backend/frontend/assets/index-DS9glxiF.js +1 -0
- vibe_surf/backend/frontend/assets/index-DUjF6qus.js +2 -0
- vibe_surf/backend/frontend/assets/index-DXYmUzC_.css +1 -0
- vibe_surf/backend/frontend/assets/index-D_wRbh5r.js +1 -0
- vibe_surf/backend/frontend/assets/index-Db4BfmcT.js +1 -0
- vibe_surf/backend/frontend/assets/index-DfZGZYcK.js +1 -0
- vibe_surf/backend/frontend/assets/index-DlDGYPf2.js +1 -0
- vibe_surf/backend/frontend/assets/index-DlFy5Gok.js +1 -0
- vibe_surf/backend/frontend/assets/index-DmVpDlko.js +1 -0
- vibe_surf/backend/frontend/assets/index-Dpc9wHta.js +1 -0
- vibe_surf/backend/frontend/assets/index-DvcAIETO.js +1 -0
- vibe_surf/backend/frontend/assets/index-Dwi-X1Od.js +1 -0
- vibe_surf/backend/frontend/assets/index-FMPFv3Wf.js +1 -0
- vibe_surf/backend/frontend/assets/index-H3Uskc2o.js +1 -0
- vibe_surf/backend/frontend/assets/index-JWfrTs_0.js +1 -0
- vibe_surf/backend/frontend/assets/index-LX3KOMfj.js +1 -0
- vibe_surf/backend/frontend/assets/index-LXWgTVf4.js +1 -0
- vibe_surf/backend/frontend/assets/index-WJ6PviAq.js +1 -0
- vibe_surf/backend/frontend/assets/index-WrqFIXAC.js +1 -0
- vibe_surf/backend/frontend/assets/index-Yoj1a8xs.js +1 -0
- vibe_surf/backend/frontend/assets/index-YxTPhodS.js +1 -0
- vibe_surf/backend/frontend/assets/index-_8LB3oNa.js +1 -0
- vibe_surf/backend/frontend/assets/index-bNhROe-x.js +1 -0
- vibe_surf/backend/frontend/assets/index-cQAtXO5d.js +1 -0
- vibe_surf/backend/frontend/assets/index-hIdlDvEv.js +1 -0
- vibe_surf/backend/frontend/assets/index-hxJwU1-s.js +1 -0
- vibe_surf/backend/frontend/assets/index-iA_X3O5r.js +1 -0
- vibe_surf/backend/frontend/assets/index-iW93REva.js +1 -0
- vibe_surf/backend/frontend/assets/index-k2RdCBHb.js +1 -0
- vibe_surf/backend/frontend/assets/index-kJKg9EzG.js +1 -0
- vibe_surf/backend/frontend/assets/index-mX6ATl2n.js +1 -0
- vibe_surf/backend/frontend/assets/index-muCxPdjC.js +1 -0
- vibe_surf/backend/frontend/assets/index-nd1f74Wi.js +1 -0
- vibe_surf/backend/frontend/assets/index-qGbEX4n3.js +1 -0
- vibe_surf/backend/frontend/assets/index-qOd-CLaR.js +1 -0
- vibe_surf/backend/frontend/assets/index-sguRseYw.js +1 -0
- vibe_surf/backend/frontend/assets/index-vd7ILFrg.js +1 -0
- vibe_surf/backend/frontend/assets/index-we6mCAhv.js +1 -0
- vibe_surf/backend/frontend/assets/index-x0VA7yzX.js +1 -0
- vibe_surf/backend/frontend/assets/index-yCVeNkNd.js +1 -0
- vibe_surf/backend/frontend/assets/indian-rupee-ClaZI0Dh.js +6 -0
- vibe_surf/backend/frontend/assets/infinity-LKjcIaZa.js +6 -0
- vibe_surf/backend/frontend/assets/info-DFBdB7_c.js +6 -0
- vibe_surf/backend/frontend/assets/inspection-panel-DGzE6245.js +6 -0
- vibe_surf/backend/frontend/assets/instagram-CJj5AWOV.js +6 -0
- vibe_surf/backend/frontend/assets/italic-CKFB3the.js +6 -0
- vibe_surf/backend/frontend/assets/iteration-ccw-YnfylsKm.js +6 -0
- vibe_surf/backend/frontend/assets/iteration-cw-DTHRwCcy.js +6 -0
- vibe_surf/backend/frontend/assets/japanese-yen-BG_Inyh_.js +6 -0
- vibe_surf/backend/frontend/assets/joystick-bJVSvZlL.js +6 -0
- vibe_surf/backend/frontend/assets/kanban-KP-K8pC9.js +6 -0
- vibe_surf/backend/frontend/assets/key-CNaiqe5q.js +6 -0
- vibe_surf/backend/frontend/assets/key-round-RTYFDTCa.js +6 -0
- vibe_surf/backend/frontend/assets/key-square-C7EKR-zE.js +6 -0
- vibe_surf/backend/frontend/assets/keyboard-DaM0Dl19.js +6 -0
- vibe_surf/backend/frontend/assets/keyboard-music-CzJZiHzS.js +6 -0
- vibe_surf/backend/frontend/assets/keyboard-off-C9Jl7GZs.js +6 -0
- vibe_surf/backend/frontend/assets/lamp-DK_3DJnO.js +6 -0
- vibe_surf/backend/frontend/assets/lamp-ceiling-B8sGjZ8c.js +6 -0
- vibe_surf/backend/frontend/assets/lamp-desk-CxWpiNas.js +6 -0
- vibe_surf/backend/frontend/assets/lamp-floor-EUFzRKf7.js +6 -0
- vibe_surf/backend/frontend/assets/lamp-wall-down-BV84JTWM.js +6 -0
- vibe_surf/backend/frontend/assets/lamp-wall-up-BqpaYZN9.js +6 -0
- vibe_surf/backend/frontend/assets/land-plot-Dly_Debw.js +6 -0
- vibe_surf/backend/frontend/assets/landmark-W6MewilS.js +6 -0
- vibe_surf/backend/frontend/assets/languages-BQghN4Gu.js +6 -0
- vibe_surf/backend/frontend/assets/laptop-BysYcdO1.js +6 -0
- vibe_surf/backend/frontend/assets/laptop-minimal-CUViKl_u.js +6 -0
- vibe_surf/backend/frontend/assets/laptop-minimal-check-BZNY8l54.js +6 -0
- vibe_surf/backend/frontend/assets/lasso-CBTyEbGH.js +6 -0
- vibe_surf/backend/frontend/assets/lasso-select-D9j71vtb.js +6 -0
- vibe_surf/backend/frontend/assets/laugh-fkxJEAC6.js +6 -0
- vibe_surf/backend/frontend/assets/layers-2-B3mnroGJ.js +6 -0
- vibe_surf/backend/frontend/assets/layers-CLO8Qj7V.js +6 -0
- vibe_surf/backend/frontend/assets/layout-dashboard-BCgC4-j3.js +6 -0
- vibe_surf/backend/frontend/assets/layout-grid-DQlh6Dv5.js +6 -0
- vibe_surf/backend/frontend/assets/layout-list-BK2Y57B-.js +6 -0
- vibe_surf/backend/frontend/assets/layout-panel-left-BzdjKizu.js +6 -0
- vibe_surf/backend/frontend/assets/layout-panel-top-CmMnqmez.js +6 -0
- vibe_surf/backend/frontend/assets/layout-template-DkuzhO5B.js +6 -0
- vibe_surf/backend/frontend/assets/lazyIconImports-Cbxc-ykm.js +2 -0
- vibe_surf/backend/frontend/assets/leaf-D1Z4WxA8.js +6 -0
- vibe_surf/backend/frontend/assets/leafy-green-C7IHTNVi.js +6 -0
- vibe_surf/backend/frontend/assets/lectern-BpswhiFV.js +6 -0
- vibe_surf/backend/frontend/assets/letter-text-B_mZgzJ7.js +6 -0
- vibe_surf/backend/frontend/assets/library-BEQ0EBja.js +6 -0
- vibe_surf/backend/frontend/assets/library-big-C32jLDwT.js +6 -0
- vibe_surf/backend/frontend/assets/life-buoy-AWdXr4CQ.js +6 -0
- vibe_surf/backend/frontend/assets/ligature-DRsGqV7j.js +6 -0
- vibe_surf/backend/frontend/assets/lightbulb-D3KZbCQp.js +6 -0
- vibe_surf/backend/frontend/assets/lightbulb-off-iSDmy8d6.js +6 -0
- vibe_surf/backend/frontend/assets/link-2-CCZYGxDI.js +6 -0
- vibe_surf/backend/frontend/assets/link-2-off-BWpEKUCS.js +6 -0
- vibe_surf/backend/frontend/assets/link-Diw-YZ8t.js +6 -0
- vibe_surf/backend/frontend/assets/linkedin-CExn9EK5.js +6 -0
- vibe_surf/backend/frontend/assets/list-CB9zDbEv.js +6 -0
- vibe_surf/backend/frontend/assets/list-check-CCdijvLD.js +6 -0
- vibe_surf/backend/frontend/assets/list-checks-B1EQ8oeV.js +6 -0
- vibe_surf/backend/frontend/assets/list-collapse-B_Nyhn3U.js +6 -0
- vibe_surf/backend/frontend/assets/list-end-BRGFPR4T.js +6 -0
- vibe_surf/backend/frontend/assets/list-filter-DR4JqPVX.js +6 -0
- vibe_surf/backend/frontend/assets/list-filter-plus-Q7j2JYzP.js +6 -0
- vibe_surf/backend/frontend/assets/list-minus-DrLtfmEG.js +6 -0
- vibe_surf/backend/frontend/assets/list-music-C6MOQHoL.js +6 -0
- vibe_surf/backend/frontend/assets/list-ordered-Db8L0lqU.js +6 -0
- vibe_surf/backend/frontend/assets/list-plus-C1dade1Z.js +6 -0
- vibe_surf/backend/frontend/assets/list-restart-CyRkF6Xo.js +6 -0
- vibe_surf/backend/frontend/assets/list-start-CAn16QHF.js +6 -0
- vibe_surf/backend/frontend/assets/list-todo-giJ3EaBY.js +6 -0
- vibe_surf/backend/frontend/assets/list-tree-ZTTp4tz8.js +6 -0
- vibe_surf/backend/frontend/assets/list-video-SNqnTTmu.js +6 -0
- vibe_surf/backend/frontend/assets/list-x-XeDairuR.js +6 -0
- vibe_surf/backend/frontend/assets/loader-RYX0GikH.js +6 -0
- vibe_surf/backend/frontend/assets/loader-circle-CjMVhyrE.js +6 -0
- vibe_surf/backend/frontend/assets/loader-pinwheel-Dv08mzUX.js +6 -0
- vibe_surf/backend/frontend/assets/locate-DcqAXVyu.js +6 -0
- vibe_surf/backend/frontend/assets/locate-fixed-BgaqK3FM.js +6 -0
- vibe_surf/backend/frontend/assets/locate-off-1UN8A6fK.js +6 -0
- vibe_surf/backend/frontend/assets/location-edit-DFbMZW6i.js +6 -0
- vibe_surf/backend/frontend/assets/lock-DWN4LH3Q.js +6 -0
- vibe_surf/backend/frontend/assets/lock-keyhole-aeS26SmF.js +6 -0
- vibe_surf/backend/frontend/assets/lock-keyhole-open-CoXzZLpr.js +6 -0
- vibe_surf/backend/frontend/assets/lock-open-CBPubokC.js +6 -0
- vibe_surf/backend/frontend/assets/log-in-BW8pmSIu.js +6 -0
- vibe_surf/backend/frontend/assets/log-out-D-d0DczA.js +6 -0
- vibe_surf/backend/frontend/assets/logo_dark-_nccwgMn.png +0 -0
- vibe_surf/backend/frontend/assets/logo_light-DKZjS8CD.png +0 -0
- vibe_surf/backend/frontend/assets/logs-AXuVwIE_.js +6 -0
- vibe_surf/backend/frontend/assets/lollipop-CxugcHkj.js +6 -0
- vibe_surf/backend/frontend/assets/luggage-CFtS088O.js +6 -0
- vibe_surf/backend/frontend/assets/magnet-BpIqKX0D.js +6 -0
- vibe_surf/backend/frontend/assets/mail-1Br8NAMK.js +6 -0
- vibe_surf/backend/frontend/assets/mail-check-DFwD0fvI.js +6 -0
- vibe_surf/backend/frontend/assets/mail-minus-B_KovqmT.js +6 -0
- vibe_surf/backend/frontend/assets/mail-open-VEmMVybi.js +6 -0
- vibe_surf/backend/frontend/assets/mail-plus-D-1Wacj7.js +6 -0
- vibe_surf/backend/frontend/assets/mail-question-CJK96wre.js +6 -0
- vibe_surf/backend/frontend/assets/mail-search-Du6F72Wj.js +6 -0
- vibe_surf/backend/frontend/assets/mail-warning-BI87_kvG.js +6 -0
- vibe_surf/backend/frontend/assets/mail-x-DU415vbZ.js +6 -0
- vibe_surf/backend/frontend/assets/mailbox-CMHDAMVZ.js +6 -0
- vibe_surf/backend/frontend/assets/mails-CUDj41Cn.js +6 -0
- vibe_surf/backend/frontend/assets/map-D2I0g3OZ.js +6 -0
- vibe_surf/backend/frontend/assets/map-pin-CiM6iB2r.js +6 -0
- vibe_surf/backend/frontend/assets/map-pin-check-BQWCC6Uv.js +6 -0
- vibe_surf/backend/frontend/assets/map-pin-check-inside-CVhhgPHY.js +6 -0
- vibe_surf/backend/frontend/assets/map-pin-house-CXbXX8w-.js +6 -0
- vibe_surf/backend/frontend/assets/map-pin-minus-D0dRHvgd.js +6 -0
- vibe_surf/backend/frontend/assets/map-pin-minus-inside-DGpPZYAi.js +6 -0
- vibe_surf/backend/frontend/assets/map-pin-off-EbFPnlZq.js +6 -0
- vibe_surf/backend/frontend/assets/map-pin-plus-BLD0VcG5.js +6 -0
- vibe_surf/backend/frontend/assets/map-pin-plus-inside-CapcP3Yk.js +6 -0
- vibe_surf/backend/frontend/assets/map-pin-x-DrNWALEC.js +6 -0
- vibe_surf/backend/frontend/assets/map-pin-x-inside-9DqM8z-J.js +6 -0
- vibe_surf/backend/frontend/assets/map-pinned-DHMQpBhr.js +6 -0
- vibe_surf/backend/frontend/assets/map-plus-CQm0KS9c.js +6 -0
- vibe_surf/backend/frontend/assets/mars-CcweinsF.js +6 -0
- vibe_surf/backend/frontend/assets/mars-stroke-OWTfhzV5.js +6 -0
- vibe_surf/backend/frontend/assets/martini-DGORgxbx.js +6 -0
- vibe_surf/backend/frontend/assets/maximize-2-CN4UuSQb.js +6 -0
- vibe_surf/backend/frontend/assets/maximize-DOYuzVqB.js +6 -0
- vibe_surf/backend/frontend/assets/medal-DZT2ADyJ.js +6 -0
- vibe_surf/backend/frontend/assets/megaphone-DN4B6I5c.js +6 -0
- vibe_surf/backend/frontend/assets/megaphone-off-DRAddUqF.js +6 -0
- vibe_surf/backend/frontend/assets/meh-CTX3Y793.js +6 -0
- vibe_surf/backend/frontend/assets/memory-stick-CSG08PuA.js +6 -0
- vibe_surf/backend/frontend/assets/menu-BUvQ8bhy.js +6 -0
- vibe_surf/backend/frontend/assets/merge-xkPPWyBJ.js +6 -0
- vibe_surf/backend/frontend/assets/message-circle-BSqs77ZY.js +6 -0
- vibe_surf/backend/frontend/assets/message-circle-code-EW46-KUX.js +6 -0
- vibe_surf/backend/frontend/assets/message-circle-dashed-BOxWD8kE.js +6 -0
- vibe_surf/backend/frontend/assets/message-circle-heart-CBhiUXeV.js +6 -0
- vibe_surf/backend/frontend/assets/message-circle-more-DqfUhx6W.js +6 -0
- vibe_surf/backend/frontend/assets/message-circle-off-DrsP7VV_.js +6 -0
- vibe_surf/backend/frontend/assets/message-circle-plus-IixbN-s-.js +6 -0
- vibe_surf/backend/frontend/assets/message-circle-question-DsMgtwwS.js +6 -0
- vibe_surf/backend/frontend/assets/message-circle-reply-D_Eog9Yc.js +6 -0
- vibe_surf/backend/frontend/assets/message-circle-warning-D656cL7l.js +6 -0
- vibe_surf/backend/frontend/assets/message-circle-x-CXWR4BBb.js +6 -0
- vibe_surf/backend/frontend/assets/message-square-DKWryKVG.js +6 -0
- vibe_surf/backend/frontend/assets/message-square-code-0ANFU-JW.js +6 -0
- vibe_surf/backend/frontend/assets/message-square-dashed-DaZwp2x1.js +6 -0
- vibe_surf/backend/frontend/assets/message-square-diff-DpJLi_UX.js +6 -0
- vibe_surf/backend/frontend/assets/message-square-dot-OcgwyxZC.js +6 -0
- vibe_surf/backend/frontend/assets/message-square-heart-CKfZOSw8.js +6 -0
- vibe_surf/backend/frontend/assets/message-square-lock-BnNy_yw5.js +6 -0
- vibe_surf/backend/frontend/assets/message-square-more-D2WGFzms.js +6 -0
- vibe_surf/backend/frontend/assets/message-square-off-DV5974j6.js +6 -0
- vibe_surf/backend/frontend/assets/message-square-plus-7icA5g-P.js +6 -0
- vibe_surf/backend/frontend/assets/message-square-quote-DdAvA-a_.js +6 -0
- vibe_surf/backend/frontend/assets/message-square-reply-Cg9Dlls7.js +6 -0
- vibe_surf/backend/frontend/assets/message-square-share-BptAhOEV.js +6 -0
- vibe_surf/backend/frontend/assets/message-square-text-Cu-Ycwsi.js +6 -0
- vibe_surf/backend/frontend/assets/message-square-warning-DxIzJ5bt.js +6 -0
- vibe_surf/backend/frontend/assets/message-square-x-BF9akIp2.js +6 -0
- vibe_surf/backend/frontend/assets/messages-square-AjrRNZXQ.js +6 -0
- vibe_surf/backend/frontend/assets/mic-BXU1SRXR.js +6 -0
- vibe_surf/backend/frontend/assets/mic-off-BUQ1-6-l.js +6 -0
- vibe_surf/backend/frontend/assets/mic-vocal-CG4Yw8We.js +6 -0
- vibe_surf/backend/frontend/assets/microchip-CodKB7m1.js +6 -0
- vibe_surf/backend/frontend/assets/microscope-BY57GHi1.js +6 -0
- vibe_surf/backend/frontend/assets/microwave-KuJ1X2CX.js +6 -0
- vibe_surf/backend/frontend/assets/milestone-D_ToDu31.js +6 -0
- vibe_surf/backend/frontend/assets/milk-C4Nq829F.js +6 -0
- vibe_surf/backend/frontend/assets/milk-off-BPCtdIks.js +6 -0
- vibe_surf/backend/frontend/assets/minimize-2-DeAs1S78.js +6 -0
- vibe_surf/backend/frontend/assets/minimize-DKOGyuzf.js +6 -0
- vibe_surf/backend/frontend/assets/monitor-Cjm4ELo4.js +6 -0
- vibe_surf/backend/frontend/assets/monitor-check-CrckmDk_.js +6 -0
- vibe_surf/backend/frontend/assets/monitor-cog-DIPYXk5z.js +6 -0
- vibe_surf/backend/frontend/assets/monitor-dot-Cl_ZGBvp.js +6 -0
- vibe_surf/backend/frontend/assets/monitor-down-DCSynbhm.js +6 -0
- vibe_surf/backend/frontend/assets/monitor-off-Bxqkes47.js +6 -0
- vibe_surf/backend/frontend/assets/monitor-pause-B2ogwlXq.js +6 -0
- vibe_surf/backend/frontend/assets/monitor-play-w2CTvWQx.js +6 -0
- vibe_surf/backend/frontend/assets/monitor-smartphone-DYQb-VQa.js +6 -0
- vibe_surf/backend/frontend/assets/monitor-speaker-CruyWIOw.js +6 -0
- vibe_surf/backend/frontend/assets/monitor-stop-D2cot7wP.js +6 -0
- vibe_surf/backend/frontend/assets/monitor-up-Bo4VFUGK.js +6 -0
- vibe_surf/backend/frontend/assets/monitor-x-yhFSw0Zo.js +6 -0
- vibe_surf/backend/frontend/assets/moon-CZFTmFVS.js +6 -0
- vibe_surf/backend/frontend/assets/moon-star-X8Pb6SAO.js +6 -0
- vibe_surf/backend/frontend/assets/mountain-_tKRhauQ.js +6 -0
- vibe_surf/backend/frontend/assets/mountain-snow-COLjUpoc.js +6 -0
- vibe_surf/backend/frontend/assets/mouse-C62B_4i7.js +6 -0
- vibe_surf/backend/frontend/assets/mouse-off-NO65wsqy.js +6 -0
- vibe_surf/backend/frontend/assets/mouse-pointer-2-vvokJ-v-.js +6 -0
- vibe_surf/backend/frontend/assets/mouse-pointer-IHoLB1Ii.js +6 -0
- vibe_surf/backend/frontend/assets/mouse-pointer-ban-BGxlXS_f.js +6 -0
- vibe_surf/backend/frontend/assets/mouse-pointer-click-C7N7cKxT.js +6 -0
- vibe_surf/backend/frontend/assets/move-3d-CQO0qR5b.js +6 -0
- vibe_surf/backend/frontend/assets/move-Bp3oIgRK.js +6 -0
- vibe_surf/backend/frontend/assets/move-diagonal-2-CQ3Gqa4B.js +6 -0
- vibe_surf/backend/frontend/assets/move-diagonal-BkUx0iYA.js +6 -0
- vibe_surf/backend/frontend/assets/move-down-B4dxMy_p.js +6 -0
- vibe_surf/backend/frontend/assets/move-down-left-NxvLep64.js +6 -0
- vibe_surf/backend/frontend/assets/move-down-right-CxcsF1yI.js +6 -0
- vibe_surf/backend/frontend/assets/move-horizontal-or6vuyOq.js +6 -0
- vibe_surf/backend/frontend/assets/move-left-Tcae9tGG.js +6 -0
- vibe_surf/backend/frontend/assets/move-right-jY3F431H.js +6 -0
- vibe_surf/backend/frontend/assets/move-up-Dk8sPbRD.js +6 -0
- vibe_surf/backend/frontend/assets/move-up-left-CD7NRvhF.js +6 -0
- vibe_surf/backend/frontend/assets/move-up-right-BAOhHbBw.js +6 -0
- vibe_surf/backend/frontend/assets/move-vertical-BxWj9bDO.js +6 -0
- vibe_surf/backend/frontend/assets/music-2-DQL5lOH_.js +6 -0
- vibe_surf/backend/frontend/assets/music-3-wkxjpooD.js +6 -0
- vibe_surf/backend/frontend/assets/music-4-CgUN2PUO.js +6 -0
- vibe_surf/backend/frontend/assets/music-YxXwq9fN.js +6 -0
- vibe_surf/backend/frontend/assets/navigation-2-Ba4Z-jSq.js +6 -0
- vibe_surf/backend/frontend/assets/navigation-2-off-C_LfeWvW.js +6 -0
- vibe_surf/backend/frontend/assets/navigation-BEChOEsi.js +6 -0
- vibe_surf/backend/frontend/assets/navigation-off-BehyOyE3.js +6 -0
- vibe_surf/backend/frontend/assets/network-CwJLOq3T.js +6 -0
- vibe_surf/backend/frontend/assets/newspaper-ELrHeGRI.js +6 -0
- vibe_surf/backend/frontend/assets/nfc-B_3XFb34.js +6 -0
- vibe_surf/backend/frontend/assets/non-binary-BsgU9v43.js +6 -0
- vibe_surf/backend/frontend/assets/notebook-j-nq3SkT.js +6 -0
- vibe_surf/backend/frontend/assets/notebook-pen-D9-IPVfi.js +6 -0
- vibe_surf/backend/frontend/assets/notebook-tabs-B8RN5vFZ.js +6 -0
- vibe_surf/backend/frontend/assets/notebook-text-9VvE4wV2.js +6 -0
- vibe_surf/backend/frontend/assets/notepad-text-CtRuOWM5.js +6 -0
- vibe_surf/backend/frontend/assets/notepad-text-dashed-BKDJS1oq.js +6 -0
- vibe_surf/backend/frontend/assets/nut-MLKrgO4r.js +6 -0
- vibe_surf/backend/frontend/assets/nut-off-CX5f1ggv.js +6 -0
- vibe_surf/backend/frontend/assets/octagon-Dm5tdLTK.js +6 -0
- vibe_surf/backend/frontend/assets/octagon-alert-THvRb-wV.js +6 -0
- vibe_surf/backend/frontend/assets/octagon-minus-BIN-9swI.js +6 -0
- vibe_surf/backend/frontend/assets/octagon-pause-BvRAlpaV.js +6 -0
- vibe_surf/backend/frontend/assets/octagon-x-DeRG_Ls0.js +6 -0
- vibe_surf/backend/frontend/assets/omega-CVAxeKBK.js +6 -0
- vibe_surf/backend/frontend/assets/option-14pftykg.js +6 -0
- vibe_surf/backend/frontend/assets/orbit-CfewrZaI.js +6 -0
- vibe_surf/backend/frontend/assets/origami-BT1VriUJ.js +6 -0
- vibe_surf/backend/frontend/assets/package-2-D11kpXq5.js +6 -0
- vibe_surf/backend/frontend/assets/package-BegS59es.js +6 -0
- vibe_surf/backend/frontend/assets/package-check-DOLq4x6S.js +6 -0
- vibe_surf/backend/frontend/assets/package-minus-BFgP752B.js +6 -0
- vibe_surf/backend/frontend/assets/package-open-D2nk_ytU.js +6 -0
- vibe_surf/backend/frontend/assets/package-plus-Va8EoLSt.js +6 -0
- vibe_surf/backend/frontend/assets/package-search-cGv3F3Yi.js +6 -0
- vibe_surf/backend/frontend/assets/package-x-BFCKCrAT.js +6 -0
- vibe_surf/backend/frontend/assets/paint-bucket-C1nh-Go_.js +6 -0
- vibe_surf/backend/frontend/assets/paint-roller-C9vy4fuD.js +6 -0
- vibe_surf/backend/frontend/assets/paintbrush-Bo4L8Hqc.js +6 -0
- vibe_surf/backend/frontend/assets/paintbrush-vertical-DqUyy2UU.js +6 -0
- vibe_surf/backend/frontend/assets/palette-DddGrkXJ.js +6 -0
- vibe_surf/backend/frontend/assets/panel-bottom-DPSx8I79.js +6 -0
- vibe_surf/backend/frontend/assets/panel-bottom-close-D0SBNVCx.js +6 -0
- vibe_surf/backend/frontend/assets/panel-bottom-dashed-CR6jKyB5.js +6 -0
- vibe_surf/backend/frontend/assets/panel-bottom-open-BA8uHJ1f.js +6 -0
- vibe_surf/backend/frontend/assets/panel-left-close-HWzVGhEN.js +6 -0
- vibe_surf/backend/frontend/assets/panel-left-dashed-C8CvEMus.js +6 -0
- vibe_surf/backend/frontend/assets/panel-left-open-DZtgeJky.js +6 -0
- vibe_surf/backend/frontend/assets/panel-right-BIGpcNCD.js +6 -0
- vibe_surf/backend/frontend/assets/panel-right-close-D6I6nB-8.js +6 -0
- vibe_surf/backend/frontend/assets/panel-right-dashed-Dt-tZyfJ.js +6 -0
- vibe_surf/backend/frontend/assets/panel-right-open-Cso_cmr4.js +6 -0
- vibe_surf/backend/frontend/assets/panel-top-DxQozLLO.js +6 -0
- vibe_surf/backend/frontend/assets/panel-top-close-21p_Iy4Q.js +6 -0
- vibe_surf/backend/frontend/assets/panel-top-dashed-BLLvCUcW.js +6 -0
- vibe_surf/backend/frontend/assets/panel-top-open-DOpjqeXN.js +6 -0
- vibe_surf/backend/frontend/assets/panels-left-bottom-Dgc_Zml-.js +6 -0
- vibe_surf/backend/frontend/assets/panels-right-bottom-DBl33v5J.js +6 -0
- vibe_surf/backend/frontend/assets/panels-top-left-Bh9Km2t_.js +6 -0
- vibe_surf/backend/frontend/assets/paperclip-DwNdWjNs.js +6 -0
- vibe_surf/backend/frontend/assets/parentheses-Bv3x0v0d.js +6 -0
- vibe_surf/backend/frontend/assets/parking-meter-CaAUYem8.js +6 -0
- vibe_surf/backend/frontend/assets/party-popper-o676ndwa.js +6 -0
- vibe_surf/backend/frontend/assets/pause-DofdcFyf.js +6 -0
- vibe_surf/backend/frontend/assets/paw-print-CsCZTGwP.js +6 -0
- vibe_surf/backend/frontend/assets/pc-case-ChHKP8Bs.js +6 -0
- vibe_surf/backend/frontend/assets/pen-BJrA5W2j.js +6 -0
- vibe_surf/backend/frontend/assets/pen-line-Cn_-SNuM.js +6 -0
- vibe_surf/backend/frontend/assets/pen-off-vpS9creP.js +6 -0
- vibe_surf/backend/frontend/assets/pen-tool-BHi1klDG.js +6 -0
- vibe_surf/backend/frontend/assets/pencil-Wem_VEVg.js +6 -0
- vibe_surf/backend/frontend/assets/pencil-line-CpG7egII.js +6 -0
- vibe_surf/backend/frontend/assets/pencil-off-DNbfjOTs.js +6 -0
- vibe_surf/backend/frontend/assets/pencil-ruler-BQdaeQqI.js +6 -0
- vibe_surf/backend/frontend/assets/pentagon-BNe4mDhm.js +6 -0
- vibe_surf/backend/frontend/assets/percent-CDhexNCT.js +6 -0
- vibe_surf/backend/frontend/assets/person-standing-DxYpZiGV.js +6 -0
- vibe_surf/backend/frontend/assets/philippine-peso-B7FAFSBd.js +6 -0
- vibe_surf/backend/frontend/assets/phone-CTiWkAUx.js +6 -0
- vibe_surf/backend/frontend/assets/phone-call-CWavZZ8W.js +6 -0
- vibe_surf/backend/frontend/assets/phone-forwarded-CLaEebEE.js +6 -0
- vibe_surf/backend/frontend/assets/phone-incoming-Cv2OCBfT.js +6 -0
- vibe_surf/backend/frontend/assets/phone-missed-DNNjfxVz.js +6 -0
- vibe_surf/backend/frontend/assets/phone-off-ClVQWi0g.js +6 -0
- vibe_surf/backend/frontend/assets/phone-outgoing-CY2TxKXl.js +6 -0
- vibe_surf/backend/frontend/assets/pi-DNqBWxfj.js +6 -0
- vibe_surf/backend/frontend/assets/piano-MiPm47Ma.js +6 -0
- vibe_surf/backend/frontend/assets/pickaxe-YqkOBnCJ.js +6 -0
- vibe_surf/backend/frontend/assets/picture-in-picture-2-BIKggEXM.js +6 -0
- vibe_surf/backend/frontend/assets/picture-in-picture-QAMxgJMO.js +6 -0
- vibe_surf/backend/frontend/assets/piggy-bank-DVE6nzj5.js +6 -0
- vibe_surf/backend/frontend/assets/pilcrow-CIhZWZVN.js +6 -0
- vibe_surf/backend/frontend/assets/pilcrow-left-Ca9XTMpA.js +6 -0
- vibe_surf/backend/frontend/assets/pilcrow-right-CLd68jMN.js +6 -0
- vibe_surf/backend/frontend/assets/pill-CBiMEkPj.js +6 -0
- vibe_surf/backend/frontend/assets/pill-bottle-CJ3pejac.js +6 -0
- vibe_surf/backend/frontend/assets/pin-Oo2Sku7X.js +6 -0
- vibe_surf/backend/frontend/assets/pin-off-DG48ZMV_.js +6 -0
- vibe_surf/backend/frontend/assets/pipette-BzvHUOUt.js +6 -0
- vibe_surf/backend/frontend/assets/pizza-B5z39oy-.js +6 -0
- vibe_surf/backend/frontend/assets/plane-eU326jPg.js +6 -0
- vibe_surf/backend/frontend/assets/plane-landing-gxcqSKOA.js +6 -0
- vibe_surf/backend/frontend/assets/plane-takeoff-CFmuOAfX.js +6 -0
- vibe_surf/backend/frontend/assets/play-CaCbaWdR.js +6 -0
- vibe_surf/backend/frontend/assets/plug-2-CaihODHc.js +6 -0
- vibe_surf/backend/frontend/assets/plug-DrN0weqI.js +6 -0
- vibe_surf/backend/frontend/assets/plug-zap-BT2sgwQy.js +6 -0
- vibe_surf/backend/frontend/assets/pocket-DNEPJJmg.js +6 -0
- vibe_surf/backend/frontend/assets/pocket-knife-1CI1aqMD.js +6 -0
- vibe_surf/backend/frontend/assets/podcast-BsGsWn3h.js +6 -0
- vibe_surf/backend/frontend/assets/pointer-B8T5gv-x.js +6 -0
- vibe_surf/backend/frontend/assets/pointer-off-C2DXzg5S.js +6 -0
- vibe_surf/backend/frontend/assets/popcorn-Bi10K8Em.js +6 -0
- vibe_surf/backend/frontend/assets/popsicle-CxLa9bz8.js +6 -0
- vibe_surf/backend/frontend/assets/pound-sterling-BFXPyyYU.js +6 -0
- vibe_surf/backend/frontend/assets/power-BmqAlXVz.js +6 -0
- vibe_surf/backend/frontend/assets/power-off-CT70n2O0.js +6 -0
- vibe_surf/backend/frontend/assets/presentation-DVhaCvt0.js +6 -0
- vibe_surf/backend/frontend/assets/printer-D7NgKQZm.js +6 -0
- vibe_surf/backend/frontend/assets/printer-check-BYDiSYD3.js +6 -0
- vibe_surf/backend/frontend/assets/projector-BFMEAUGw.js +6 -0
- vibe_surf/backend/frontend/assets/proportions-CUypjhWs.js +6 -0
- vibe_surf/backend/frontend/assets/puzzle-lPcRsrCP.js +6 -0
- vibe_surf/backend/frontend/assets/pyramid-bX_YtvHu.js +6 -0
- vibe_surf/backend/frontend/assets/qr-code-CMBq06CH.js +6 -0
- vibe_surf/backend/frontend/assets/quote-BkFwr2wo.js +6 -0
- vibe_surf/backend/frontend/assets/rabbit-CEyfAR1t.js +6 -0
- vibe_surf/backend/frontend/assets/radar-bMcLs_bP.js +6 -0
- vibe_surf/backend/frontend/assets/radiation-NMlxufHZ.js +6 -0
- vibe_surf/backend/frontend/assets/radical-C3CE5pot.js +6 -0
- vibe_surf/backend/frontend/assets/radio-DQMhSWLz.js +6 -0
- vibe_surf/backend/frontend/assets/radio-receiver-Cwtiayz1.js +6 -0
- vibe_surf/backend/frontend/assets/radio-tower-ngCBBDuR.js +6 -0
- vibe_surf/backend/frontend/assets/radius-CB1vpl4-.js +6 -0
- vibe_surf/backend/frontend/assets/rail-symbol-CWT8jn79.js +6 -0
- vibe_surf/backend/frontend/assets/rainbow-eG2Z6xdv.js +6 -0
- vibe_surf/backend/frontend/assets/rat-CjjmSgkE.js +6 -0
- vibe_surf/backend/frontend/assets/ratio-Ck9TZd6C.js +6 -0
- vibe_surf/backend/frontend/assets/receipt-QzIALZKN.js +6 -0
- vibe_surf/backend/frontend/assets/receipt-cent-wAd12yx1.js +6 -0
- vibe_surf/backend/frontend/assets/receipt-euro-BG_rS29_.js +6 -0
- vibe_surf/backend/frontend/assets/receipt-indian-rupee-DlF7wlqh.js +6 -0
- vibe_surf/backend/frontend/assets/receipt-japanese-yen-GDNnE_Bl.js +6 -0
- vibe_surf/backend/frontend/assets/receipt-pound-sterling-CczRTrHu.js +6 -0
- vibe_surf/backend/frontend/assets/receipt-russian-ruble-CP8qhoZV.js +6 -0
- vibe_surf/backend/frontend/assets/receipt-swiss-franc-B1FjnBVT.js +6 -0
- vibe_surf/backend/frontend/assets/receipt-text-Df0EAqK2.js +6 -0
- vibe_surf/backend/frontend/assets/rectangle-ellipsis-BeZ5b8q2.js +6 -0
- vibe_surf/backend/frontend/assets/rectangle-goggles-B0pWs5f6.js +6 -0
- vibe_surf/backend/frontend/assets/rectangle-horizontal-5D8nW5zN.js +6 -0
- vibe_surf/backend/frontend/assets/rectangle-vertical-D6iXTP5O.js +6 -0
- vibe_surf/backend/frontend/assets/recycle-cePWNqck.js +6 -0
- vibe_surf/backend/frontend/assets/redo-2-DflPUgVL.js +6 -0
- vibe_surf/backend/frontend/assets/redo-C8hJqzAq.js +6 -0
- vibe_surf/backend/frontend/assets/redo-dot-JyZC910i.js +6 -0
- vibe_surf/backend/frontend/assets/refresh-ccw-QGOuU93p.js +6 -0
- vibe_surf/backend/frontend/assets/refresh-ccw-dot-BVfOSZg8.js +6 -0
- vibe_surf/backend/frontend/assets/refresh-cw-DttAl3PC.js +6 -0
- vibe_surf/backend/frontend/assets/refresh-cw-off-1m7CD9nm.js +6 -0
- vibe_surf/backend/frontend/assets/refrigerator-BGk6q_hL.js +6 -0
- vibe_surf/backend/frontend/assets/regex-C-txrNUs.js +6 -0
- vibe_surf/backend/frontend/assets/remove-formatting-CVxREpGZ.js +6 -0
- vibe_surf/backend/frontend/assets/repeat-1-ChFj2WK-.js +6 -0
- vibe_surf/backend/frontend/assets/repeat-2-ViBvoa4W.js +6 -0
- vibe_surf/backend/frontend/assets/repeat-GoYG4svo.js +6 -0
- vibe_surf/backend/frontend/assets/replace-GFcv_X_V.js +6 -0
- vibe_surf/backend/frontend/assets/replace-all-zAC7UUp9.js +6 -0
- vibe_surf/backend/frontend/assets/reply-C2IH8Yvz.js +6 -0
- vibe_surf/backend/frontend/assets/reply-all-CXYDFlBb.js +6 -0
- vibe_surf/backend/frontend/assets/rewind-Bmv_DtI_.js +6 -0
- vibe_surf/backend/frontend/assets/ribbon-B4MeTNUc.js +6 -0
- vibe_surf/backend/frontend/assets/robot-BsccFpqT.png +0 -0
- vibe_surf/backend/frontend/assets/rocket-Ch2Sc43k.js +6 -0
- vibe_surf/backend/frontend/assets/rocking-chair-Pcx0Ex8j.js +6 -0
- vibe_surf/backend/frontend/assets/roller-coaster-DpdZyHU4.js +6 -0
- vibe_surf/backend/frontend/assets/rotate-3d-CAlCCDrS.js +6 -0
- vibe_surf/backend/frontend/assets/rotate-ccw-Dl5IeMD0.js +6 -0
- vibe_surf/backend/frontend/assets/rotate-ccw-key-CbcFcY_X.js +6 -0
- vibe_surf/backend/frontend/assets/rotate-ccw-square-B6dXtMGF.js +6 -0
- vibe_surf/backend/frontend/assets/rotate-cw-D9QBD3w1.js +6 -0
- vibe_surf/backend/frontend/assets/rotate-cw-square-BTb_LCYt.js +6 -0
- vibe_surf/backend/frontend/assets/route-BY8OMdE6.js +6 -0
- vibe_surf/backend/frontend/assets/route-off-DBPZSjij.js +6 -0
- vibe_surf/backend/frontend/assets/router-Cj5pK344.js +6 -0
- vibe_surf/backend/frontend/assets/rows-2-DQikFZXW.js +6 -0
- vibe_surf/backend/frontend/assets/rows-3-CgpwLjBs.js +6 -0
- vibe_surf/backend/frontend/assets/rows-4-DHLpJgeW.js +6 -0
- vibe_surf/backend/frontend/assets/rss-B2J7l-Sb.js +6 -0
- vibe_surf/backend/frontend/assets/ruler-D-fe4o6e.js +6 -0
- vibe_surf/backend/frontend/assets/ruler-dimension-line-COrwkuXi.js +6 -0
- vibe_surf/backend/frontend/assets/russian-ruble-Bk9zdT2J.js +6 -0
- vibe_surf/backend/frontend/assets/sailboat-DMPxVbdm.js +6 -0
- vibe_surf/backend/frontend/assets/salad-D20azVGZ.js +6 -0
- vibe_surf/backend/frontend/assets/sandwich-Z_d-MQ5t.js +6 -0
- vibe_surf/backend/frontend/assets/satellite-7zgZRaOF.js +6 -0
- vibe_surf/backend/frontend/assets/satellite-dish-Cy6FmD_T.js +6 -0
- vibe_surf/backend/frontend/assets/saudi-riyal-C9ZvxnL2.js +6 -0
- vibe_surf/backend/frontend/assets/save-LkAkHS7W.js +6 -0
- vibe_surf/backend/frontend/assets/save-all-D_-zYl71.js +6 -0
- vibe_surf/backend/frontend/assets/save-off-B0KWQYIj.js +6 -0
- vibe_surf/backend/frontend/assets/scale-3d-FnesJ3yp.js +6 -0
- vibe_surf/backend/frontend/assets/scale-CfDNIDpX.js +6 -0
- vibe_surf/backend/frontend/assets/scaling-D7_wGXPp.js +6 -0
- vibe_surf/backend/frontend/assets/scan-CXtftKWt.js +6 -0
- vibe_surf/backend/frontend/assets/scan-barcode-DMzKInA0.js +6 -0
- vibe_surf/backend/frontend/assets/scan-eye-BNOyXXj8.js +6 -0
- vibe_surf/backend/frontend/assets/scan-face-wv0t4zeq.js +6 -0
- vibe_surf/backend/frontend/assets/scan-heart-BeBWR3xV.js +6 -0
- vibe_surf/backend/frontend/assets/scan-line-CvQpOukb.js +6 -0
- vibe_surf/backend/frontend/assets/scan-qr-code-BQ-Oqt9e.js +6 -0
- vibe_surf/backend/frontend/assets/scan-search-DeDxyjP7.js +6 -0
- vibe_surf/backend/frontend/assets/scan-text-Du5B26Lp.js +6 -0
- vibe_surf/backend/frontend/assets/school-XPbcFxvs.js +6 -0
- vibe_surf/backend/frontend/assets/scissors-C82MxyXF.js +6 -0
- vibe_surf/backend/frontend/assets/scissors-line-dashed-BiIj8ZEF.js +6 -0
- vibe_surf/backend/frontend/assets/screen-share-4rpy_bSP.js +6 -0
- vibe_surf/backend/frontend/assets/screen-share-off-DisAsCVo.js +6 -0
- vibe_surf/backend/frontend/assets/scroll-D3FgdMu9.js +6 -0
- vibe_surf/backend/frontend/assets/scroll-text-BolUgv8k.js +6 -0
- vibe_surf/backend/frontend/assets/search-check-BqDsbYzT.js +6 -0
- vibe_surf/backend/frontend/assets/search-code-BAngOAWT.js +6 -0
- vibe_surf/backend/frontend/assets/search-slash-DGpGjVDh.js +6 -0
- vibe_surf/backend/frontend/assets/search-x-hbEhC-Ks.js +6 -0
- vibe_surf/backend/frontend/assets/section-CZdebDRa.js +6 -0
- vibe_surf/backend/frontend/assets/send-BY6RRvoS.js +6 -0
- vibe_surf/backend/frontend/assets/send-horizontal-ByJf1GwO.js +6 -0
- vibe_surf/backend/frontend/assets/send-to-back-CqeJ0x7-.js +6 -0
- vibe_surf/backend/frontend/assets/separator-horizontal-CyHVE869.js +6 -0
- vibe_surf/backend/frontend/assets/separator-vertical-CHEXvAuG.js +6 -0
- vibe_surf/backend/frontend/assets/server-DPj6-qpq.js +6 -0
- vibe_surf/backend/frontend/assets/server-cog-Dc-mlMR8.js +6 -0
- vibe_surf/backend/frontend/assets/server-crash-CXsISMNW.js +6 -0
- vibe_surf/backend/frontend/assets/server-off-Y_lfL7-w.js +6 -0
- vibe_surf/backend/frontend/assets/settings-2-DZ9wvd5i.js +6 -0
- vibe_surf/backend/frontend/assets/settings-DO_W46zj.js +6 -0
- vibe_surf/backend/frontend/assets/shapes-CIsUods8.js +6 -0
- vibe_surf/backend/frontend/assets/share-0y8A7A5E.js +6 -0
- vibe_surf/backend/frontend/assets/share-2-TSy7pnEx.js +6 -0
- vibe_surf/backend/frontend/assets/sheet-DagiH4ve.js +6 -0
- vibe_surf/backend/frontend/assets/shell-4uq5QK2w.js +6 -0
- vibe_surf/backend/frontend/assets/shield-DSmxKeAX.js +6 -0
- vibe_surf/backend/frontend/assets/shield-alert-2BHG6ofb.js +6 -0
- vibe_surf/backend/frontend/assets/shield-ban-BcQOFFCO.js +6 -0
- vibe_surf/backend/frontend/assets/shield-check-IssT1y70.js +6 -0
- vibe_surf/backend/frontend/assets/shield-ellipsis-B_k2GJZe.js +6 -0
- vibe_surf/backend/frontend/assets/shield-half-Ce9mZY66.js +6 -0
- vibe_surf/backend/frontend/assets/shield-minus-Cm9SRYz3.js +6 -0
- vibe_surf/backend/frontend/assets/shield-off-Di-Txcsi.js +6 -0
- vibe_surf/backend/frontend/assets/shield-plus-Cbd8tnos.js +6 -0
- vibe_surf/backend/frontend/assets/shield-question-5hf3zAb8.js +6 -0
- vibe_surf/backend/frontend/assets/shield-user-D2XuthCx.js +6 -0
- vibe_surf/backend/frontend/assets/shield-x-BTJiGLGc.js +6 -0
- vibe_surf/backend/frontend/assets/ship-DkhgC4pB.js +6 -0
- vibe_surf/backend/frontend/assets/ship-wheel-C-7_Y35l.js +6 -0
- vibe_surf/backend/frontend/assets/shirt-vuhl9SGI.js +6 -0
- vibe_surf/backend/frontend/assets/shopping-bag-DvQ2pPfQ.js +6 -0
- vibe_surf/backend/frontend/assets/shopping-basket-D9s56Xw7.js +6 -0
- vibe_surf/backend/frontend/assets/shopping-cart-ZmbJuTVy.js +6 -0
- vibe_surf/backend/frontend/assets/shovel-L2fbM_rD.js +6 -0
- vibe_surf/backend/frontend/assets/shower-head-DE9aHmtW.js +6 -0
- vibe_surf/backend/frontend/assets/shredder-DadDP-UJ.js +6 -0
- vibe_surf/backend/frontend/assets/shrimp-DycqoQZ3.js +6 -0
- vibe_surf/backend/frontend/assets/shrink-B8aylxOx.js +6 -0
- vibe_surf/backend/frontend/assets/shrub-DF1hbXW3.js +6 -0
- vibe_surf/backend/frontend/assets/shuffle-BuIBx3Jr.js +6 -0
- vibe_surf/backend/frontend/assets/sigma-Do2EOGrK.js +6 -0
- vibe_surf/backend/frontend/assets/signal-D4HUxctG.js +6 -0
- vibe_surf/backend/frontend/assets/signal-high-D4XjnPRT.js +6 -0
- vibe_surf/backend/frontend/assets/signal-low-CbpCiGEn.js +6 -0
- vibe_surf/backend/frontend/assets/signal-medium-DenP3lw7.js +6 -0
- vibe_surf/backend/frontend/assets/signal-zero-CHgcs844.js +6 -0
- vibe_surf/backend/frontend/assets/signature-DK8I0wlU.js +6 -0
- vibe_surf/backend/frontend/assets/signpost-1ES-i9fp.js +6 -0
- vibe_surf/backend/frontend/assets/signpost-big-BSozSaes.js +6 -0
- vibe_surf/backend/frontend/assets/siren-wlABVP_H.js +6 -0
- vibe_surf/backend/frontend/assets/skip-back-Bu_s_NAd.js +6 -0
- vibe_surf/backend/frontend/assets/skip-forward-B_5w_2GT.js +6 -0
- vibe_surf/backend/frontend/assets/skull-BEu1YCxD.js +6 -0
- vibe_surf/backend/frontend/assets/slack-D9649ln8.js +6 -0
- vibe_surf/backend/frontend/assets/slash-DojcavQ9.js +6 -0
- vibe_surf/backend/frontend/assets/slice-CRmKxhnX.js +6 -0
- vibe_surf/backend/frontend/assets/sliders-horizontal-B5g_t8uv.js +6 -0
- vibe_surf/backend/frontend/assets/sliders-vertical-CLBL1buf.js +6 -0
- vibe_surf/backend/frontend/assets/smartphone-D-ep_7qQ.js +6 -0
- vibe_surf/backend/frontend/assets/smartphone-charging-CRPRIfJL.js +6 -0
- vibe_surf/backend/frontend/assets/smartphone-nfc-CmXWPjB7.js +6 -0
- vibe_surf/backend/frontend/assets/smile-C8NQBJ3w.js +6 -0
- vibe_surf/backend/frontend/assets/smile-plus-BXiCkryt.js +6 -0
- vibe_surf/backend/frontend/assets/snail-C4InLnJK.js +6 -0
- vibe_surf/backend/frontend/assets/snowflake-CkOWmqpH.js +6 -0
- vibe_surf/backend/frontend/assets/sofa-C5SFUETc.js +6 -0
- vibe_surf/backend/frontend/assets/soup-BPK9i9Mq.js +6 -0
- vibe_surf/backend/frontend/assets/space-B_AibqtW.js +6 -0
- vibe_surf/backend/frontend/assets/spade-DOYQwKmE.js +6 -0
- vibe_surf/backend/frontend/assets/sparkle-Bgy0TYRq.js +6 -0
- vibe_surf/backend/frontend/assets/sparkles-COXnCZbi.js +6 -0
- vibe_surf/backend/frontend/assets/speaker-CaUol58E.js +6 -0
- vibe_surf/backend/frontend/assets/speech-SU2fqOX1.js +6 -0
- vibe_surf/backend/frontend/assets/spell-check-2-C0X3GG0W.js +6 -0
- vibe_surf/backend/frontend/assets/spell-check-BwnI8rNb.js +6 -0
- vibe_surf/backend/frontend/assets/spline-ByNmiFVd.js +6 -0
- vibe_surf/backend/frontend/assets/spline-pointer-B6jrA3VA.js +6 -0
- vibe_surf/backend/frontend/assets/split-uo1Igb0N.js +6 -0
- vibe_surf/backend/frontend/assets/spray-can-D37CFDNB.js +6 -0
- vibe_surf/backend/frontend/assets/sprout-B25Lx6nK.js +6 -0
- vibe_surf/backend/frontend/assets/square-KfK1ngG3.js +6 -0
- vibe_surf/backend/frontend/assets/square-activity-BGQluYc5.js +6 -0
- vibe_surf/backend/frontend/assets/square-arrow-down-CqlT37VO.js +6 -0
- vibe_surf/backend/frontend/assets/square-arrow-down-left-CR2Go22d.js +6 -0
- vibe_surf/backend/frontend/assets/square-arrow-down-right-rGAHLIaS.js +6 -0
- vibe_surf/backend/frontend/assets/square-arrow-left-CvWu8_9d.js +6 -0
- vibe_surf/backend/frontend/assets/square-arrow-out-down-left-K0v7hlb0.js +6 -0
- vibe_surf/backend/frontend/assets/square-arrow-out-down-right-f74Yq8Hb.js +6 -0
- vibe_surf/backend/frontend/assets/square-arrow-out-up-left-CdBSNScA.js +6 -0
- vibe_surf/backend/frontend/assets/square-arrow-out-up-right-8PNP-37C.js +6 -0
- vibe_surf/backend/frontend/assets/square-arrow-right-DZ3-0COG.js +6 -0
- vibe_surf/backend/frontend/assets/square-arrow-up-CefwAldY.js +6 -0
- vibe_surf/backend/frontend/assets/square-arrow-up-left-Dt6pY6y2.js +6 -0
- vibe_surf/backend/frontend/assets/square-arrow-up-right-C-bPYXZE.js +6 -0
- vibe_surf/backend/frontend/assets/square-asterisk-BIEu0Wq-.js +6 -0
- vibe_surf/backend/frontend/assets/square-bottom-dashed-scissors-DFln2i7A.js +6 -0
- vibe_surf/backend/frontend/assets/square-chart-gantt-VCoGr7j5.js +6 -0
- vibe_surf/backend/frontend/assets/square-check-big-DdTm65g2.js +6 -0
- vibe_surf/backend/frontend/assets/square-check-tJdFPLB4.js +6 -0
- vibe_surf/backend/frontend/assets/square-chevron-down-DV0aFQxC.js +6 -0
- vibe_surf/backend/frontend/assets/square-chevron-left-CdGd5MQB.js +6 -0
- vibe_surf/backend/frontend/assets/square-chevron-right-D_aqBwe_.js +6 -0
- vibe_surf/backend/frontend/assets/square-chevron-up-DBzeLhdp.js +6 -0
- vibe_surf/backend/frontend/assets/square-code-DtSsDKtH.js +6 -0
- vibe_surf/backend/frontend/assets/square-dashed-DSG0Ash0.js +6 -0
- vibe_surf/backend/frontend/assets/square-dashed-bottom-BrkR2d57.js +6 -0
- vibe_surf/backend/frontend/assets/square-dashed-bottom-code-CMTH1TbL.js +6 -0
- vibe_surf/backend/frontend/assets/square-dashed-kanban-961FMGlN.js +6 -0
- vibe_surf/backend/frontend/assets/square-dashed-mouse-pointer-BWcK5KqH.js +6 -0
- vibe_surf/backend/frontend/assets/square-divide-B8EfzsLW.js +6 -0
- vibe_surf/backend/frontend/assets/square-dot-CFXkGNxl.js +6 -0
- vibe_surf/backend/frontend/assets/square-equal-DNzUS5Xu.js +6 -0
- vibe_surf/backend/frontend/assets/square-function-mVVWlGqH.js +6 -0
- vibe_surf/backend/frontend/assets/square-kanban-gbxgvYAs.js +6 -0
- vibe_surf/backend/frontend/assets/square-library-LB-mLfoV.js +6 -0
- vibe_surf/backend/frontend/assets/square-m-DR4vWmvF.js +6 -0
- vibe_surf/backend/frontend/assets/square-menu-wrD_3b1X.js +6 -0
- vibe_surf/backend/frontend/assets/square-minus-C8LvWB0i.js +6 -0
- vibe_surf/backend/frontend/assets/square-mouse-pointer-BWIOG0ej.js +6 -0
- vibe_surf/backend/frontend/assets/square-parking-Cwf1smWS.js +6 -0
- vibe_surf/backend/frontend/assets/square-parking-off-B7fLGIII.js +6 -0
- vibe_surf/backend/frontend/assets/square-pen-D-KRx-pf.js +6 -0
- vibe_surf/backend/frontend/assets/square-percent-DEPHZN1U.js +6 -0
- vibe_surf/backend/frontend/assets/square-pi-D3ZoGA8y.js +6 -0
- vibe_surf/backend/frontend/assets/square-pilcrow-CU7h7mYC.js +6 -0
- vibe_surf/backend/frontend/assets/square-play-BJID6hok.js +6 -0
- vibe_surf/backend/frontend/assets/square-plus-B_MofyMZ.js +6 -0
- vibe_surf/backend/frontend/assets/square-power-CnNfm3SK.js +6 -0
- vibe_surf/backend/frontend/assets/square-radical-Bb91fkyO.js +6 -0
- vibe_surf/backend/frontend/assets/square-round-corner-DSNwBkrZ.js +6 -0
- vibe_surf/backend/frontend/assets/square-scissors-Q-Hew_gd.js +6 -0
- vibe_surf/backend/frontend/assets/square-sigma-Dvqecf-2.js +6 -0
- vibe_surf/backend/frontend/assets/square-slash-TFALqbOX.js +6 -0
- vibe_surf/backend/frontend/assets/square-split-horizontal-CbPy5mPi.js +6 -0
- vibe_surf/backend/frontend/assets/square-split-vertical-CwEHVK6t.js +6 -0
- vibe_surf/backend/frontend/assets/square-square-BgBRe8Sy.js +6 -0
- vibe_surf/backend/frontend/assets/square-stack-CQOObCB-.js +6 -0
- vibe_surf/backend/frontend/assets/square-terminal-DTCYsALs.js +6 -0
- vibe_surf/backend/frontend/assets/square-user-BtoHpGAf.js +6 -0
- vibe_surf/backend/frontend/assets/square-user-round-DYhk3lBR.js +6 -0
- vibe_surf/backend/frontend/assets/square-x-BxVfvmxy.js +6 -0
- vibe_surf/backend/frontend/assets/squares-exclude-xFnGRjrW.js +6 -0
- vibe_surf/backend/frontend/assets/squares-intersect-CJ3onkar.js +6 -0
- vibe_surf/backend/frontend/assets/squares-subtract-DHkmEhbq.js +6 -0
- vibe_surf/backend/frontend/assets/squares-unite-VTPchsN_.js +6 -0
- vibe_surf/backend/frontend/assets/squircle-BeRgB4CX.js +6 -0
- vibe_surf/backend/frontend/assets/squirrel-CXpCofHU.js +6 -0
- vibe_surf/backend/frontend/assets/stamp-CBKYJLk-.js +6 -0
- vibe_surf/backend/frontend/assets/star-g394tQMa.js +6 -0
- vibe_surf/backend/frontend/assets/star-half-DMNuOefd.js +6 -0
- vibe_surf/backend/frontend/assets/star-off-D_I13W97.js +6 -0
- vibe_surf/backend/frontend/assets/step-back-Ba3vvS1b.js +6 -0
- vibe_surf/backend/frontend/assets/step-forward-tf6_dmSk.js +6 -0
- vibe_surf/backend/frontend/assets/stethoscope-kEGj4Hk2.js +6 -0
- vibe_surf/backend/frontend/assets/sticker-BMrXBzQi.js +6 -0
- vibe_surf/backend/frontend/assets/sticky-note-B6_-_Vk7.js +6 -0
- vibe_surf/backend/frontend/assets/store-ClCC8VsS.js +6 -0
- vibe_surf/backend/frontend/assets/stretch-horizontal-Dfdn4d_v.js +6 -0
- vibe_surf/backend/frontend/assets/stretch-vertical-G91F9Wl8.js +6 -0
- vibe_surf/backend/frontend/assets/strikethrough-DQ1eMtzE.js +6 -0
- vibe_surf/backend/frontend/assets/subscript-B1v5cruw.js +6 -0
- vibe_surf/backend/frontend/assets/sun-Drd6gJu4.js +6 -0
- vibe_surf/backend/frontend/assets/sun-dim-CSbGIP11.js +6 -0
- vibe_surf/backend/frontend/assets/sun-medium-Cownz0gJ.js +6 -0
- vibe_surf/backend/frontend/assets/sun-moon-BgCDmhlw.js +6 -0
- vibe_surf/backend/frontend/assets/sun-snow-B0xowfvd.js +6 -0
- vibe_surf/backend/frontend/assets/sunrise-DkTO7zEY.js +6 -0
- vibe_surf/backend/frontend/assets/sunset-DkKYK75e.js +6 -0
- vibe_surf/backend/frontend/assets/superscript-CBfgJuGP.js +6 -0
- vibe_surf/backend/frontend/assets/swatch-book-DrsAphD2.js +6 -0
- vibe_surf/backend/frontend/assets/swiss-franc-DAYyAzPc.js +6 -0
- vibe_surf/backend/frontend/assets/switch-camera-C7hTq-mz.js +6 -0
- vibe_surf/backend/frontend/assets/sword-BDecpboX.js +6 -0
- vibe_surf/backend/frontend/assets/swords-BjWa4kCQ.js +6 -0
- vibe_surf/backend/frontend/assets/syringe-ClPPE8yd.js +6 -0
- vibe_surf/backend/frontend/assets/table-2-DIGnaXY7.js +6 -0
- vibe_surf/backend/frontend/assets/table-CHxmnA-B.js +6 -0
- vibe_surf/backend/frontend/assets/table-cells-merge-D1zNRVrG.js +6 -0
- vibe_surf/backend/frontend/assets/table-cells-split-CdEYW1Su.js +6 -0
- vibe_surf/backend/frontend/assets/table-columns-split-JoiaUKz3.js +6 -0
- vibe_surf/backend/frontend/assets/table-of-contents-BSpkdcFt.js +6 -0
- vibe_surf/backend/frontend/assets/table-properties-CmoYqW5E.js +6 -0
- vibe_surf/backend/frontend/assets/table-rows-split-B-06ZKqE.js +6 -0
- vibe_surf/backend/frontend/assets/tablet-YvP4PBQR.js +6 -0
- vibe_surf/backend/frontend/assets/tablet-smartphone-BG7aS4OL.js +6 -0
- vibe_surf/backend/frontend/assets/tablets-BVvSHnaS.js +6 -0
- vibe_surf/backend/frontend/assets/tag-Bs9C2NWs.js +6 -0
- vibe_surf/backend/frontend/assets/tags-DEvGZIIh.js +6 -0
- vibe_surf/backend/frontend/assets/tally-1-BjNjbWUj.js +6 -0
- vibe_surf/backend/frontend/assets/tally-2-Bd0nQcFC.js +6 -0
- vibe_surf/backend/frontend/assets/tally-3-DHrPKvJg.js +6 -0
- vibe_surf/backend/frontend/assets/tally-4-DAUwA2aR.js +6 -0
- vibe_surf/backend/frontend/assets/tally-5-CgAN8Y91.js +6 -0
- vibe_surf/backend/frontend/assets/tangent-CRznV78Q.js +6 -0
- vibe_surf/backend/frontend/assets/target-Bj2MJlO6.js +6 -0
- vibe_surf/backend/frontend/assets/telescope-CyRzgTg4.js +6 -0
- vibe_surf/backend/frontend/assets/temp-pat-1-BDqu2wpz.png +0 -0
- vibe_surf/backend/frontend/assets/temp-pat-2-C_RVvOE_.png +0 -0
- vibe_surf/backend/frontend/assets/temp-pat-3-Ci-rp5-q.png +0 -0
- vibe_surf/backend/frontend/assets/temp-pat-m-1-D-qJT-j4.png +0 -0
- vibe_surf/backend/frontend/assets/temp-pat-m-2-BFhrICvh.png +0 -0
- vibe_surf/backend/frontend/assets/temp-pat-m-3-BJIIbDxb.png +0 -0
- vibe_surf/backend/frontend/assets/tent-D1boPMJ_.js +6 -0
- vibe_surf/backend/frontend/assets/tent-tree-DlMlV5UT.js +6 -0
- vibe_surf/backend/frontend/assets/terminal-ByKLrVXr.js +6 -0
- vibe_surf/backend/frontend/assets/test-tube-DjNpqEvy.js +6 -0
- vibe_surf/backend/frontend/assets/test-tube-diagonal-kvKWvVpD.js +6 -0
- vibe_surf/backend/frontend/assets/test-tubes-BUVuvPYq.js +6 -0
- vibe_surf/backend/frontend/assets/text-BaPUPrRB.js +6 -0
- vibe_surf/backend/frontend/assets/text-cursor-DjiJAhIO.js +6 -0
- vibe_surf/backend/frontend/assets/text-cursor-input-DmFbkVcG.js +6 -0
- vibe_surf/backend/frontend/assets/text-quote-DbZhBhba.js +6 -0
- vibe_surf/backend/frontend/assets/text-search-D81mgubi.js +6 -0
- vibe_surf/backend/frontend/assets/text-select-BCYAwryE.js +6 -0
- vibe_surf/backend/frontend/assets/theater-BF8yCQZ3.js +6 -0
- vibe_surf/backend/frontend/assets/thermometer-Dz0qc69z.js +6 -0
- vibe_surf/backend/frontend/assets/thermometer-snowflake-BZ8Fol5x.js +6 -0
- vibe_surf/backend/frontend/assets/thermometer-sun-DgmdNSSx.js +6 -0
- vibe_surf/backend/frontend/assets/thumbs-down-6gCm1bFP.js +6 -0
- vibe_surf/backend/frontend/assets/thumbs-up-BpkAnOkj.js +6 -0
- vibe_surf/backend/frontend/assets/ticket-CZ6VZCic.js +6 -0
- vibe_surf/backend/frontend/assets/ticket-check-CwERJSTS.js +6 -0
- vibe_surf/backend/frontend/assets/ticket-minus-CJ8o42r1.js +6 -0
- vibe_surf/backend/frontend/assets/ticket-percent-D9mgrzai.js +6 -0
- vibe_surf/backend/frontend/assets/ticket-plus-Bf_MplVa.js +6 -0
- vibe_surf/backend/frontend/assets/ticket-slash-CNukz3dP.js +6 -0
- vibe_surf/backend/frontend/assets/ticket-x-DAGtm4Nf.js +6 -0
- vibe_surf/backend/frontend/assets/tickets-Dlm-Pd3N.js +6 -0
- vibe_surf/backend/frontend/assets/tickets-plane-C4lmqLQq.js +6 -0
- vibe_surf/backend/frontend/assets/timer-0lTpmgXp.js +6 -0
- vibe_surf/backend/frontend/assets/timer-off-BGqRyv1S.js +6 -0
- vibe_surf/backend/frontend/assets/timer-reset-DdhKPXcy.js +6 -0
- vibe_surf/backend/frontend/assets/toggle-left-De2ASTKW.js +6 -0
- vibe_surf/backend/frontend/assets/toggle-right-NfpJqTaq.js +6 -0
- vibe_surf/backend/frontend/assets/toilet-DcJuMKzv.js +6 -0
- vibe_surf/backend/frontend/assets/tornado-BannseS-.js +6 -0
- vibe_surf/backend/frontend/assets/torus-CxsKBH8D.js +6 -0
- vibe_surf/backend/frontend/assets/touchpad-ENZl5mwQ.js +6 -0
- vibe_surf/backend/frontend/assets/touchpad-off-Bs9XazIZ.js +6 -0
- vibe_surf/backend/frontend/assets/tower-control-DOH63Gyd.js +6 -0
- vibe_surf/backend/frontend/assets/toy-brick-CK9szegV.js +6 -0
- vibe_surf/backend/frontend/assets/tractor-C4edkneR.js +6 -0
- vibe_surf/backend/frontend/assets/traffic-cone-B7xJNOdC.js +6 -0
- vibe_surf/backend/frontend/assets/train-front-DPkfW4fH.js +6 -0
- vibe_surf/backend/frontend/assets/train-front-tunnel-Dc6i8ZmW.js +6 -0
- vibe_surf/backend/frontend/assets/train-track-DFRUcPF4.js +6 -0
- vibe_surf/backend/frontend/assets/tram-front-DnSEWr26.js +6 -0
- vibe_surf/backend/frontend/assets/transgender-CwbUC-T0.js +6 -0
- vibe_surf/backend/frontend/assets/trash-DSMPsj08.js +6 -0
- vibe_surf/backend/frontend/assets/tree-deciduous-CMyD2rgs.js +6 -0
- vibe_surf/backend/frontend/assets/tree-palm-ClbWCueR.js +6 -0
- vibe_surf/backend/frontend/assets/tree-pine-CxCMH7RZ.js +6 -0
- vibe_surf/backend/frontend/assets/trees-DeERVvec.js +6 -0
- vibe_surf/backend/frontend/assets/trello-DwQeyG2C.js +6 -0
- vibe_surf/backend/frontend/assets/trending-down-CuQxq0A3.js +6 -0
- vibe_surf/backend/frontend/assets/trending-up-BDSGIJWY.js +6 -0
- vibe_surf/backend/frontend/assets/trending-up-down-CSb_7X-_.js +6 -0
- vibe_surf/backend/frontend/assets/triangle-Cc8gzj2X.js +6 -0
- vibe_surf/backend/frontend/assets/triangle-alert-CzfSlrIp.js +6 -0
- vibe_surf/backend/frontend/assets/triangle-dashed-CSlIdQSl.js +6 -0
- vibe_surf/backend/frontend/assets/triangle-right-BIlbKFDC.js +6 -0
- vibe_surf/backend/frontend/assets/trophy-CIFZUGnX.js +6 -0
- vibe_surf/backend/frontend/assets/truck-Id_mHUOq.js +6 -0
- vibe_surf/backend/frontend/assets/truck-electric-WgMKZnOH.js +6 -0
- vibe_surf/backend/frontend/assets/turtle-0ek05Orw.js +6 -0
- vibe_surf/backend/frontend/assets/tv-DLVWDmzW.js +6 -0
- vibe_surf/backend/frontend/assets/tv-minimal-E0w-pb-R.js +6 -0
- vibe_surf/backend/frontend/assets/tv-minimal-play-C8eivgTI.js +6 -0
- vibe_surf/backend/frontend/assets/twitch-D6updjnG.js +6 -0
- vibe_surf/backend/frontend/assets/twitter-Der_Ih7y.js +6 -0
- vibe_surf/backend/frontend/assets/type-BZeEwGKH.js +6 -0
- vibe_surf/backend/frontend/assets/type-outline-WvuVShMD.js +6 -0
- vibe_surf/backend/frontend/assets/umbrella-BFiE5bFk.js +6 -0
- vibe_surf/backend/frontend/assets/umbrella-off-CQKtt_HS.js +6 -0
- vibe_surf/backend/frontend/assets/underline-eH-gfEgl.js +6 -0
- vibe_surf/backend/frontend/assets/undo-2-CGpVoxxS.js +6 -0
- vibe_surf/backend/frontend/assets/undo-BAkkNYmN.js +6 -0
- vibe_surf/backend/frontend/assets/undo-dot-fxz9ZoUf.js +6 -0
- vibe_surf/backend/frontend/assets/unfold-horizontal-Bz6GASed.js +6 -0
- vibe_surf/backend/frontend/assets/unfold-vertical-DVuawiHD.js +6 -0
- vibe_surf/backend/frontend/assets/ungroup-DZlCBfu8.js +6 -0
- vibe_surf/backend/frontend/assets/university-DQQJPlHM.js +6 -0
- vibe_surf/backend/frontend/assets/unlink-2-Bbf62oJC.js +6 -0
- vibe_surf/backend/frontend/assets/unlink-rRnEYNBH.js +6 -0
- vibe_surf/backend/frontend/assets/unplug-BE6bAKlE.js +6 -0
- vibe_surf/backend/frontend/assets/upload-DgbNBlk6.js +6 -0
- vibe_surf/backend/frontend/assets/usb-BsbOhQkP.js +6 -0
- vibe_surf/backend/frontend/assets/use-post-add-user-s3pEdarP.js +1 -0
- vibe_surf/backend/frontend/assets/user-C7_N9vjw.js +6 -0
- vibe_surf/backend/frontend/assets/user-check-D85AcwGt.js +6 -0
- vibe_surf/backend/frontend/assets/user-cog-BUSZoKWO.js +6 -0
- vibe_surf/backend/frontend/assets/user-lock-DrG5znDk.js +6 -0
- vibe_surf/backend/frontend/assets/user-minus-CjVZSxhC.js +6 -0
- vibe_surf/backend/frontend/assets/user-pen-BllWYNRg.js +6 -0
- vibe_surf/backend/frontend/assets/user-plus-Ct840ALN.js +6 -0
- vibe_surf/backend/frontend/assets/user-round-D6DnOG0E.js +6 -0
- vibe_surf/backend/frontend/assets/user-round-check-Ci15Wbid.js +6 -0
- vibe_surf/backend/frontend/assets/user-round-cog-SrRmnnrG.js +6 -0
- vibe_surf/backend/frontend/assets/user-round-minus-CZKo0fkN.js +6 -0
- vibe_surf/backend/frontend/assets/user-round-pen-DQ88K1gY.js +6 -0
- vibe_surf/backend/frontend/assets/user-round-plus-BtBHwnQH.js +6 -0
- vibe_surf/backend/frontend/assets/user-round-search-mZx8k3ks.js +6 -0
- vibe_surf/backend/frontend/assets/user-round-x-4MvMTCpy.js +6 -0
- vibe_surf/backend/frontend/assets/user-search-CkEhATdm.js +6 -0
- vibe_surf/backend/frontend/assets/user-x-DufZCLiX.js +6 -0
- vibe_surf/backend/frontend/assets/users-DgOAHdb7.js +6 -0
- vibe_surf/backend/frontend/assets/users-round-Bj4Zqvjj.js +6 -0
- vibe_surf/backend/frontend/assets/utensils-CcfYVeqi.js +6 -0
- vibe_surf/backend/frontend/assets/utensils-crossed-Daq7-gMB.js +6 -0
- vibe_surf/backend/frontend/assets/utility-pole-BRYxk_9o.js +6 -0
- vibe_surf/backend/frontend/assets/vanilla-picker-B6E6ObS_.js +8 -0
- vibe_surf/backend/frontend/assets/variable-CQb_DxMu.js +6 -0
- vibe_surf/backend/frontend/assets/vault-D7etPPcB.js +6 -0
- vibe_surf/backend/frontend/assets/vegan-DhjhKnZM.js +6 -0
- vibe_surf/backend/frontend/assets/venetian-mask-DGDNvUAT.js +6 -0
- vibe_surf/backend/frontend/assets/venus-and-mars-BEW94wvT.js +6 -0
- vibe_surf/backend/frontend/assets/venus-u9B-gdcz.js +6 -0
- vibe_surf/backend/frontend/assets/vibrate-off-GMm1P59r.js +6 -0
- vibe_surf/backend/frontend/assets/vibrate-ztsKQUo9.js +6 -0
- vibe_surf/backend/frontend/assets/video-BRU-KCdj.js +6 -0
- vibe_surf/backend/frontend/assets/video-off-UBhDkXSa.js +6 -0
- vibe_surf/backend/frontend/assets/videotape-BnpqC2PU.js +6 -0
- vibe_surf/backend/frontend/assets/view-SPlXqa2E.js +6 -0
- vibe_surf/backend/frontend/assets/voicemail-CslFUibB.js +6 -0
- vibe_surf/backend/frontend/assets/volleyball-YmSfEYj0.js +6 -0
- vibe_surf/backend/frontend/assets/volume-1-DzSvYJXy.js +6 -0
- vibe_surf/backend/frontend/assets/volume-2-CKYHuo73.js +6 -0
- vibe_surf/backend/frontend/assets/volume-D2WpTg4b.js +6 -0
- vibe_surf/backend/frontend/assets/volume-off-CXmQvaUO.js +6 -0
- vibe_surf/backend/frontend/assets/volume-x-Dl4xNI1D.js +6 -0
- vibe_surf/backend/frontend/assets/vote-DVUnQCxF.js +6 -0
- vibe_surf/backend/frontend/assets/wallet-D9F1dFbt.js +6 -0
- vibe_surf/backend/frontend/assets/wallet-cards-DkIuM2Gu.js +6 -0
- vibe_surf/backend/frontend/assets/wallet-minimal-CUUsXAfP.js +6 -0
- vibe_surf/backend/frontend/assets/wallpaper-BHliG6AQ.js +6 -0
- vibe_surf/backend/frontend/assets/wand-sparkles-BA8i-2_I.js +6 -0
- vibe_surf/backend/frontend/assets/wand-u2EI2dL2.js +6 -0
- vibe_surf/backend/frontend/assets/warehouse-CxDEgPyp.js +6 -0
- vibe_surf/backend/frontend/assets/washing-machine-CYoqAbT7.js +6 -0
- vibe_surf/backend/frontend/assets/watch-eNq5oUsh.js +6 -0
- vibe_surf/backend/frontend/assets/waves-Bs6o5G71.js +6 -0
- vibe_surf/backend/frontend/assets/waves-ladder-0t2iIHt8.js +6 -0
- vibe_surf/backend/frontend/assets/waypoints-DyScJk3j.js +6 -0
- vibe_surf/backend/frontend/assets/webcam-BFZUWYUw.js +6 -0
- vibe_surf/backend/frontend/assets/webhook-CMDaI4yk.js +6 -0
- vibe_surf/backend/frontend/assets/webhook-off-DQzE1oMX.js +6 -0
- vibe_surf/backend/frontend/assets/weight-g0EeSmAx.js +6 -0
- vibe_surf/backend/frontend/assets/wheat-hvVtAPlc.js +6 -0
- vibe_surf/backend/frontend/assets/wheat-off-6d_oRYIW.js +6 -0
- vibe_surf/backend/frontend/assets/whole-word-CMHbYgQ-.js +6 -0
- vibe_surf/backend/frontend/assets/wifi-CRHAo2Lb.js +6 -0
- vibe_surf/backend/frontend/assets/wifi-high-BTElqamm.js +6 -0
- vibe_surf/backend/frontend/assets/wifi-low-BFBJvE2C.js +6 -0
- vibe_surf/backend/frontend/assets/wifi-off-DL1S7f79.js +6 -0
- vibe_surf/backend/frontend/assets/wifi-pen-FkLT18-y.js +6 -0
- vibe_surf/backend/frontend/assets/wifi-zero-koQAfMYN.js +6 -0
- vibe_surf/backend/frontend/assets/wind-CgQDM8yC.js +6 -0
- vibe_surf/backend/frontend/assets/wind-arrow-down-ByQJVZNf.js +6 -0
- vibe_surf/backend/frontend/assets/wine-kngKIYWK.js +6 -0
- vibe_surf/backend/frontend/assets/wine-off-DaVVtkyG.js +6 -0
- vibe_surf/backend/frontend/assets/workflow-BBHA5vqf.js +6 -0
- vibe_surf/backend/frontend/assets/worm-D8rJAL-s.js +6 -0
- vibe_surf/backend/frontend/assets/wrap-text-s4fkGxHY.js +6 -0
- vibe_surf/backend/frontend/assets/wrench-CYzg6B-q.js +6 -0
- vibe_surf/backend/frontend/assets/youtube-BIzMVpJA.js +6 -0
- vibe_surf/backend/frontend/assets/zap-nyAdqt4o.js +6 -0
- vibe_surf/backend/frontend/assets/zap-off-Aii1CEgj.js +6 -0
- vibe_surf/backend/frontend/assets/zoom-in-BNWeSenu.js +6 -0
- vibe_surf/backend/frontend/assets/zoom-out-Bd2vIq2c.js +6 -0
- vibe_surf/backend/frontend/favicon.ico +0 -0
- vibe_surf/backend/frontend/index.html +24 -0
- vibe_surf/backend/frontend/manifest.json +31 -0
- vibe_surf/backend/llm_config.py +43 -0
- vibe_surf/backend/main.py +707 -132
- vibe_surf/backend/shared_state.py +482 -26
- vibe_surf/backend/utils/encryption.py +40 -4
- vibe_surf/backend/utils/llm_factory.py +24 -0
- vibe_surf/backend/utils/utils.py +42 -0
- vibe_surf/browser/agen_browser_profile.py +5 -0
- vibe_surf/browser/agent_browser_session.py +219 -113
- vibe_surf/browser/browser_manager.py +5 -4
- vibe_surf/browser/find_page_element.py +1100 -0
- vibe_surf/browser/page_operations.py +222 -0
- vibe_surf/browser/watchdogs/action_watchdog.py +1 -83
- vibe_surf/browser/watchdogs/dom_watchdog.py +17 -5
- vibe_surf/chrome_extension/background.js +15 -5
- vibe_surf/chrome_extension/config.js +10 -1
- vibe_surf/chrome_extension/manifest.json +23 -8
- vibe_surf/chrome_extension/scripts/api-client.js +166 -11
- vibe_surf/chrome_extension/scripts/settings-general.js +513 -0
- vibe_surf/chrome_extension/scripts/settings-integrations.js +998 -0
- vibe_surf/chrome_extension/scripts/settings-manager.js +72 -1730
- vibe_surf/chrome_extension/scripts/settings-profiles.js +1330 -0
- vibe_surf/chrome_extension/scripts/settings-workflow.js +2911 -0
- vibe_surf/chrome_extension/scripts/ui-manager.js +777 -506
- vibe_surf/chrome_extension/scripts/version.js +3 -0
- vibe_surf/chrome_extension/sidepanel.html +698 -17
- vibe_surf/chrome_extension/styles/components.css +146 -0
- vibe_surf/chrome_extension/styles/layout.css +2 -0
- vibe_surf/chrome_extension/styles/settings-integrations.css +945 -0
- vibe_surf/chrome_extension/styles/settings-modal.css +7 -3
- vibe_surf/chrome_extension/styles/settings-responsive.css +37 -5
- vibe_surf/chrome_extension/styles/settings-workflow.css +2347 -0
- vibe_surf/cli.py +153 -10
- vibe_surf/langflow/__init__.py +0 -0
- vibe_surf/langflow/__main__.py +954 -0
- vibe_surf/langflow/alembic/README +1 -0
- vibe_surf/langflow/alembic/env.py +124 -0
- vibe_surf/langflow/alembic/script.py.mako +31 -0
- vibe_surf/langflow/alembic/versions/006b3990db50_add_unique_constraints.py +66 -0
- vibe_surf/langflow/alembic/versions/012fb73ac359_add_folder_table.py +82 -0
- vibe_surf/langflow/alembic/versions/0882f9657f22_encrypt_existing_mcp_auth_settings_.py +122 -0
- vibe_surf/langflow/alembic/versions/0ae3a2674f32_update_the_columns_that_need_to_change_.py +71 -0
- vibe_surf/langflow/alembic/versions/0b8757876a7c_.py +32 -0
- vibe_surf/langflow/alembic/versions/0d60fcbd4e8e_create_vertex_builds_table.py +51 -0
- vibe_surf/langflow/alembic/versions/1a110b568907_replace_credential_table_with_variable.py +66 -0
- vibe_surf/langflow/alembic/versions/1b8b740a6fa3_remove_fk_constraint_in_message_.py +337 -0
- vibe_surf/langflow/alembic/versions/1c79524817ed_add_unique_constraints_per_user_in_.py +43 -0
- vibe_surf/langflow/alembic/versions/1cb603706752_modify_uniqueness_constraint_on_file_.py +279 -0
- vibe_surf/langflow/alembic/versions/1d90f8a0efe1_update_description_columns_type.py +71 -0
- vibe_surf/langflow/alembic/versions/1eab2c3eb45e_event_error.py +53 -0
- vibe_surf/langflow/alembic/versions/1ef9c4f3765d_.py +54 -0
- vibe_surf/langflow/alembic/versions/1f4d6df60295_add_default_fields_column.py +43 -0
- vibe_surf/langflow/alembic/versions/260dbcc8b680_adds_tables.py +151 -0
- vibe_surf/langflow/alembic/versions/29fe8f1f806b_add_missing_index.py +44 -0
- vibe_surf/langflow/alembic/versions/2ac71eb9c3ae_adds_credential_table.py +55 -0
- vibe_surf/langflow/alembic/versions/3162e83e485f_add_auth_settings_to_folder_and_merge.py +58 -0
- vibe_surf/langflow/alembic/versions/3bb0ddf32dfb_add_unique_constraints_per_user_in_flow_.py +55 -0
- vibe_surf/langflow/alembic/versions/4e5980a44eaa_fix_date_times_again.py +124 -0
- vibe_surf/langflow/alembic/versions/58b28437a398_modify_nullable.py +66 -0
- vibe_surf/langflow/alembic/versions/5ace73a7f223_new_remove_table_upgrade_op.py +39 -0
- vibe_surf/langflow/alembic/versions/631faacf5da2_add_webhook_columns.py +45 -0
- vibe_surf/langflow/alembic/versions/63b9c451fd30_add_icon_and_icon_bg_color_to_flow.py +50 -0
- vibe_surf/langflow/alembic/versions/66f72f04a1de_add_mcp_support_with_project_settings_.py +54 -0
- vibe_surf/langflow/alembic/versions/67cc006d50bf_add_profile_image_column.py +57 -0
- vibe_surf/langflow/alembic/versions/6e7b581b5648_fix_nullable.py +59 -0
- vibe_surf/langflow/alembic/versions/7843803a87b5_store_updates.py +55 -0
- vibe_surf/langflow/alembic/versions/79e675cb6752_change_datetime_type.py +124 -0
- vibe_surf/langflow/alembic/versions/7d2162acc8b2_adds_updated_at_and_folder_cols.py +74 -0
- vibe_surf/langflow/alembic/versions/90be8e2ed91e_create_transactions_table.py +51 -0
- vibe_surf/langflow/alembic/versions/93e2705fa8d6_add_column_save_path_to_flow.py +43 -0
- vibe_surf/langflow/alembic/versions/a72f5cf9c2f9_add_endpoint_name_col.py +52 -0
- vibe_surf/langflow/alembic/versions/b2fa308044b5_add_unique_constraints.py +101 -0
- vibe_surf/langflow/alembic/versions/bc2f01c40e4a_new_fixes.py +73 -0
- vibe_surf/langflow/alembic/versions/c153816fd85f_set_name_and_value_to_not_nullable.py +52 -0
- vibe_surf/langflow/alembic/versions/d066bfd22890_add_message_table.py +52 -0
- vibe_surf/langflow/alembic/versions/d2d475a1f7c0_add_tags_column_to_flow.py +41 -0
- vibe_surf/langflow/alembic/versions/d37bc4322900_drop_single_constraint_on_files_name_.py +169 -0
- vibe_surf/langflow/alembic/versions/d3dbf656a499_add_gradient_column_in_flow.py +41 -0
- vibe_surf/langflow/alembic/versions/d9a6ea21edcd_rename_default_folder.py +75 -0
- vibe_surf/langflow/alembic/versions/dd9e0804ebd1_add_v2_file_table.py +49 -0
- vibe_surf/langflow/alembic/versions/e3162c1804e6_add_persistent_locked_state.py +43 -0
- vibe_surf/langflow/alembic/versions/e3bc869fa272_fix_nullable.py +68 -0
- vibe_surf/langflow/alembic/versions/e56d87f8994a_add_optins_column_to_user.py +38 -0
- vibe_surf/langflow/alembic/versions/e5a65ecff2cd_nullable_in_vertex_build.py +49 -0
- vibe_surf/langflow/alembic/versions/eb5866d51fd2_change_columns_to_be_nullable.py +31 -0
- vibe_surf/langflow/alembic/versions/eb5e72293a8e_add_error_and_edit_flags_to_message.py +49 -0
- vibe_surf/langflow/alembic/versions/f3b2d1f1002d_add_column_access_type_to_flow.py +37 -0
- vibe_surf/langflow/alembic/versions/f5ee9749d1a6_user_id_can_be_null_in_flow.py +42 -0
- vibe_surf/langflow/alembic/versions/fd531f8868b1_fix_credential_table.py +60 -0
- vibe_surf/langflow/alembic.ini +113 -0
- vibe_surf/langflow/api/__init__.py +5 -0
- vibe_surf/langflow/api/build.py +557 -0
- vibe_surf/langflow/api/disconnect.py +31 -0
- vibe_surf/langflow/api/health_check_router.py +65 -0
- vibe_surf/langflow/api/limited_background_tasks.py +29 -0
- vibe_surf/langflow/api/log_router.py +103 -0
- vibe_surf/langflow/api/router.py +63 -0
- vibe_surf/langflow/api/schemas.py +14 -0
- vibe_surf/langflow/api/utils.py +381 -0
- vibe_surf/langflow/api/v1/__init__.py +41 -0
- vibe_surf/langflow/api/v1/api_key.py +88 -0
- vibe_surf/langflow/api/v1/auth_helpers.py +75 -0
- vibe_surf/langflow/api/v1/base.py +50 -0
- vibe_surf/langflow/api/v1/callback.py +136 -0
- vibe_surf/langflow/api/v1/chat.py +675 -0
- vibe_surf/langflow/api/v1/endpoints.py +800 -0
- vibe_surf/langflow/api/v1/files.py +193 -0
- vibe_surf/langflow/api/v1/flows.py +579 -0
- vibe_surf/langflow/api/v1/folders.py +95 -0
- vibe_surf/langflow/api/v1/knowledge_bases.py +452 -0
- vibe_surf/langflow/api/v1/login.py +166 -0
- vibe_surf/langflow/api/v1/mcp.py +137 -0
- vibe_surf/langflow/api/v1/mcp_projects.py +1230 -0
- vibe_surf/langflow/api/v1/mcp_utils.py +348 -0
- vibe_surf/langflow/api/v1/monitor.py +203 -0
- vibe_surf/langflow/api/v1/openai_responses.py +561 -0
- vibe_surf/langflow/api/v1/projects.py +447 -0
- vibe_surf/langflow/api/v1/schemas.py +488 -0
- vibe_surf/langflow/api/v1/starter_projects.py +17 -0
- vibe_surf/langflow/api/v1/store.py +182 -0
- vibe_surf/langflow/api/v1/users.py +146 -0
- vibe_surf/langflow/api/v1/validate.py +48 -0
- vibe_surf/langflow/api/v1/variable.py +106 -0
- vibe_surf/langflow/api/v1/voice_mode.py +1375 -0
- vibe_surf/langflow/api/v2/__init__.py +7 -0
- vibe_surf/langflow/api/v2/files.py +532 -0
- vibe_surf/langflow/api/v2/mcp.py +330 -0
- vibe_surf/langflow/base/__init__.py +0 -0
- vibe_surf/langflow/base/agents/__init__.py +0 -0
- vibe_surf/langflow/base/agents/agent.py +267 -0
- vibe_surf/langflow/base/agents/callback.py +130 -0
- vibe_surf/langflow/base/agents/context.py +109 -0
- vibe_surf/langflow/base/agents/crewai/__init__.py +0 -0
- vibe_surf/langflow/base/agents/crewai/crew.py +231 -0
- vibe_surf/langflow/base/agents/crewai/tasks.py +12 -0
- vibe_surf/langflow/base/agents/default_prompts.py +23 -0
- vibe_surf/langflow/base/agents/errors.py +15 -0
- vibe_surf/langflow/base/agents/events.py +346 -0
- vibe_surf/langflow/base/agents/utils.py +205 -0
- vibe_surf/langflow/base/astra_assistants/__init__.py +0 -0
- vibe_surf/langflow/base/astra_assistants/util.py +171 -0
- vibe_surf/langflow/base/chains/__init__.py +0 -0
- vibe_surf/langflow/base/chains/model.py +19 -0
- vibe_surf/langflow/base/composio/__init__.py +0 -0
- vibe_surf/langflow/base/composio/composio_base.py +1301 -0
- vibe_surf/langflow/base/compressors/__init__.py +0 -0
- vibe_surf/langflow/base/compressors/model.py +60 -0
- vibe_surf/langflow/base/constants.py +46 -0
- vibe_surf/langflow/base/curl/__init__.py +0 -0
- vibe_surf/langflow/base/curl/parse.py +188 -0
- vibe_surf/langflow/base/data/__init__.py +5 -0
- vibe_surf/langflow/base/data/base_file.py +698 -0
- vibe_surf/langflow/base/data/docling_utils.py +280 -0
- vibe_surf/langflow/base/data/utils.py +198 -0
- vibe_surf/langflow/base/document_transformers/__init__.py +0 -0
- vibe_surf/langflow/base/document_transformers/model.py +43 -0
- vibe_surf/langflow/base/embeddings/__init__.py +0 -0
- vibe_surf/langflow/base/embeddings/aiml_embeddings.py +62 -0
- vibe_surf/langflow/base/embeddings/model.py +26 -0
- vibe_surf/langflow/base/flow_processing/__init__.py +0 -0
- vibe_surf/langflow/base/flow_processing/utils.py +86 -0
- vibe_surf/langflow/base/huggingface/__init__.py +0 -0
- vibe_surf/langflow/base/huggingface/model_bridge.py +133 -0
- vibe_surf/langflow/base/io/__init__.py +0 -0
- vibe_surf/langflow/base/io/chat.py +20 -0
- vibe_surf/langflow/base/io/text.py +22 -0
- vibe_surf/langflow/base/knowledge_bases/__init__.py +0 -0
- vibe_surf/langflow/base/knowledge_bases/knowledge_base_utils.py +137 -0
- vibe_surf/langflow/base/langchain_utilities/__init__.py +0 -0
- vibe_surf/langflow/base/langchain_utilities/model.py +35 -0
- vibe_surf/langflow/base/langchain_utilities/spider_constants.py +1 -0
- vibe_surf/langflow/base/langwatch/__init__.py +0 -0
- vibe_surf/langflow/base/langwatch/utils.py +18 -0
- vibe_surf/langflow/base/mcp/__init__.py +0 -0
- vibe_surf/langflow/base/mcp/constants.py +2 -0
- vibe_surf/langflow/base/mcp/util.py +1544 -0
- vibe_surf/langflow/base/memory/__init__.py +0 -0
- vibe_surf/langflow/base/memory/memory.py +49 -0
- vibe_surf/langflow/base/memory/model.py +38 -0
- vibe_surf/langflow/base/models/__init__.py +3 -0
- vibe_surf/langflow/base/models/aiml_constants.py +51 -0
- vibe_surf/langflow/base/models/anthropic_constants.py +49 -0
- vibe_surf/langflow/base/models/aws_constants.py +151 -0
- vibe_surf/langflow/base/models/chat_result.py +76 -0
- vibe_surf/langflow/base/models/google_generative_ai_constants.py +70 -0
- vibe_surf/langflow/base/models/groq_constants.py +134 -0
- vibe_surf/langflow/base/models/model.py +375 -0
- vibe_surf/langflow/base/models/model_input_constants.py +299 -0
- vibe_surf/langflow/base/models/model_metadata.py +41 -0
- vibe_surf/langflow/base/models/model_utils.py +8 -0
- vibe_surf/langflow/base/models/novita_constants.py +35 -0
- vibe_surf/langflow/base/models/ollama_constants.py +49 -0
- vibe_surf/langflow/base/models/openai_constants.py +121 -0
- vibe_surf/langflow/base/models/sambanova_constants.py +18 -0
- vibe_surf/langflow/base/processing/__init__.py +0 -0
- vibe_surf/langflow/base/prompts/__init__.py +0 -0
- vibe_surf/langflow/base/prompts/api_utils.py +224 -0
- vibe_surf/langflow/base/prompts/utils.py +61 -0
- vibe_surf/langflow/base/textsplitters/__init__.py +0 -0
- vibe_surf/langflow/base/textsplitters/model.py +28 -0
- vibe_surf/langflow/base/tools/__init__.py +0 -0
- vibe_surf/langflow/base/tools/base.py +26 -0
- vibe_surf/langflow/base/tools/component_tool.py +324 -0
- vibe_surf/langflow/base/tools/constants.py +49 -0
- vibe_surf/langflow/base/tools/flow_tool.py +131 -0
- vibe_surf/langflow/base/tools/run_flow.py +227 -0
- vibe_surf/langflow/base/vectorstores/__init__.py +0 -0
- vibe_surf/langflow/base/vectorstores/model.py +193 -0
- vibe_surf/langflow/base/vectorstores/utils.py +22 -0
- vibe_surf/langflow/base/vectorstores/vector_store_connection_decorator.py +52 -0
- vibe_surf/langflow/cli/__init__.py +0 -0
- vibe_surf/langflow/cli/progress.py +233 -0
- vibe_surf/langflow/components/FAISS/__init__.py +34 -0
- vibe_surf/langflow/components/FAISS/faiss.py +111 -0
- vibe_surf/langflow/components/Notion/__init__.py +19 -0
- vibe_surf/langflow/components/Notion/add_content_to_page.py +269 -0
- vibe_surf/langflow/components/Notion/create_page.py +94 -0
- vibe_surf/langflow/components/Notion/list_database_properties.py +68 -0
- vibe_surf/langflow/components/Notion/list_pages.py +122 -0
- vibe_surf/langflow/components/Notion/list_users.py +77 -0
- vibe_surf/langflow/components/Notion/page_content_viewer.py +93 -0
- vibe_surf/langflow/components/Notion/search.py +111 -0
- vibe_surf/langflow/components/Notion/update_page_property.py +114 -0
- vibe_surf/langflow/components/__init__.py +270 -0
- vibe_surf/langflow/components/_importing.py +37 -0
- vibe_surf/langflow/components/agentql/__init__.py +3 -0
- vibe_surf/langflow/components/agentql/agentql_api.py +151 -0
- vibe_surf/langflow/components/agents/__init__.py +4 -0
- vibe_surf/langflow/components/agents/agent.py +608 -0
- vibe_surf/langflow/components/agents/mcp_component.py +511 -0
- vibe_surf/langflow/components/aiml/__init__.py +37 -0
- vibe_surf/langflow/components/aiml/aiml.py +115 -0
- vibe_surf/langflow/components/aiml/aiml_embeddings.py +37 -0
- vibe_surf/langflow/components/amazon/__init__.py +36 -0
- vibe_surf/langflow/components/amazon/amazon_bedrock_embedding.py +109 -0
- vibe_surf/langflow/components/amazon/amazon_bedrock_model.py +124 -0
- vibe_surf/langflow/components/amazon/s3_bucket_uploader.py +211 -0
- vibe_surf/langflow/components/anthropic/__init__.py +34 -0
- vibe_surf/langflow/components/anthropic/anthropic.py +187 -0
- vibe_surf/langflow/components/apify/__init__.py +5 -0
- vibe_surf/langflow/components/apify/apify_actor.py +325 -0
- vibe_surf/langflow/components/arxiv/__init__.py +3 -0
- vibe_surf/langflow/components/arxiv/arxiv.py +163 -0
- vibe_surf/langflow/components/assemblyai/__init__.py +46 -0
- vibe_surf/langflow/components/assemblyai/assemblyai_get_subtitles.py +83 -0
- vibe_surf/langflow/components/assemblyai/assemblyai_lemur.py +183 -0
- vibe_surf/langflow/components/assemblyai/assemblyai_list_transcripts.py +95 -0
- vibe_surf/langflow/components/assemblyai/assemblyai_poll_transcript.py +72 -0
- vibe_surf/langflow/components/assemblyai/assemblyai_start_transcript.py +188 -0
- vibe_surf/langflow/components/azure/__init__.py +37 -0
- vibe_surf/langflow/components/azure/azure_openai.py +95 -0
- vibe_surf/langflow/components/azure/azure_openai_embeddings.py +83 -0
- vibe_surf/langflow/components/baidu/__init__.py +32 -0
- vibe_surf/langflow/components/baidu/baidu_qianfan_chat.py +113 -0
- vibe_surf/langflow/components/bing/__init__.py +3 -0
- vibe_surf/langflow/components/bing/bing_search_api.py +61 -0
- vibe_surf/langflow/components/cassandra/__init__.py +40 -0
- vibe_surf/langflow/components/cassandra/cassandra.py +264 -0
- vibe_surf/langflow/components/cassandra/cassandra_chat.py +92 -0
- vibe_surf/langflow/components/cassandra/cassandra_graph.py +238 -0
- vibe_surf/langflow/components/chains/__init__.py +0 -0
- vibe_surf/langflow/components/chroma/__init__.py +34 -0
- vibe_surf/langflow/components/chroma/chroma.py +169 -0
- vibe_surf/langflow/components/cleanlab/__init__.py +40 -0
- vibe_surf/langflow/components/cleanlab/cleanlab_evaluator.py +157 -0
- vibe_surf/langflow/components/cleanlab/cleanlab_rag_evaluator.py +254 -0
- vibe_surf/langflow/components/cleanlab/cleanlab_remediator.py +131 -0
- vibe_surf/langflow/components/clickhouse/__init__.py +34 -0
- vibe_surf/langflow/components/clickhouse/clickhouse.py +135 -0
- vibe_surf/langflow/components/cloudflare/__init__.py +32 -0
- vibe_surf/langflow/components/cloudflare/cloudflare.py +81 -0
- vibe_surf/langflow/components/cohere/__init__.py +40 -0
- vibe_surf/langflow/components/cohere/cohere_embeddings.py +81 -0
- vibe_surf/langflow/components/cohere/cohere_models.py +46 -0
- vibe_surf/langflow/components/cohere/cohere_rerank.py +51 -0
- vibe_surf/langflow/components/composio/__init__.py +73 -0
- vibe_surf/langflow/components/composio/composio_api.py +279 -0
- vibe_surf/langflow/components/composio/dropbox_compnent.py +11 -0
- vibe_surf/langflow/components/composio/github_composio.py +11 -0
- vibe_surf/langflow/components/composio/gmail_composio.py +38 -0
- vibe_surf/langflow/components/composio/googlecalendar_composio.py +11 -0
- vibe_surf/langflow/components/composio/googlemeet_composio.py +11 -0
- vibe_surf/langflow/components/composio/googletasks_composio.py +8 -0
- vibe_surf/langflow/components/composio/linear_composio.py +11 -0
- vibe_surf/langflow/components/composio/outlook_composio.py +11 -0
- vibe_surf/langflow/components/composio/reddit_composio.py +11 -0
- vibe_surf/langflow/components/composio/slack_composio.py +11 -0
- vibe_surf/langflow/components/composio/slackbot_composio.py +11 -0
- vibe_surf/langflow/components/composio/supabase_composio.py +11 -0
- vibe_surf/langflow/components/composio/todoist_composio.py +11 -0
- vibe_surf/langflow/components/composio/youtube_composio.py +11 -0
- vibe_surf/langflow/components/confluence/__init__.py +3 -0
- vibe_surf/langflow/components/confluence/confluence.py +84 -0
- vibe_surf/langflow/components/couchbase/__init__.py +34 -0
- vibe_surf/langflow/components/couchbase/couchbase.py +102 -0
- vibe_surf/langflow/components/crewai/__init__.py +49 -0
- vibe_surf/langflow/components/crewai/crewai.py +108 -0
- vibe_surf/langflow/components/crewai/hierarchical_crew.py +47 -0
- vibe_surf/langflow/components/crewai/hierarchical_task.py +45 -0
- vibe_surf/langflow/components/crewai/sequential_crew.py +53 -0
- vibe_surf/langflow/components/crewai/sequential_task.py +74 -0
- vibe_surf/langflow/components/crewai/sequential_task_agent.py +144 -0
- vibe_surf/langflow/components/custom_component/__init__.py +34 -0
- vibe_surf/langflow/components/custom_component/custom_component.py +31 -0
- vibe_surf/langflow/components/data/__init__.py +25 -0
- vibe_surf/langflow/components/data/api_request.py +555 -0
- vibe_surf/langflow/components/data/csv_to_data.py +96 -0
- vibe_surf/langflow/components/data/directory.py +113 -0
- vibe_surf/langflow/components/data/file.py +632 -0
- vibe_surf/langflow/components/data/json_to_data.py +99 -0
- vibe_surf/langflow/components/data/news_search.py +164 -0
- vibe_surf/langflow/components/data/rss.py +69 -0
- vibe_surf/langflow/components/data/sql_executor.py +99 -0
- vibe_surf/langflow/components/data/url.py +299 -0
- vibe_surf/langflow/components/data/web_search.py +112 -0
- vibe_surf/langflow/components/data/webhook.py +56 -0
- vibe_surf/langflow/components/datastax/__init__.py +70 -0
- vibe_surf/langflow/components/datastax/astra_assistant_manager.py +306 -0
- vibe_surf/langflow/components/datastax/astra_db.py +68 -0
- vibe_surf/langflow/components/datastax/astra_vectorize.py +122 -0
- vibe_surf/langflow/components/datastax/astradb_cql.py +314 -0
- vibe_surf/langflow/components/datastax/astradb_graph.py +326 -0
- vibe_surf/langflow/components/datastax/astradb_tool.py +418 -0
- vibe_surf/langflow/components/datastax/astradb_vectorstore.py +1292 -0
- vibe_surf/langflow/components/datastax/create_assistant.py +58 -0
- vibe_surf/langflow/components/datastax/create_thread.py +32 -0
- vibe_surf/langflow/components/datastax/dotenv.py +35 -0
- vibe_surf/langflow/components/datastax/get_assistant.py +37 -0
- vibe_surf/langflow/components/datastax/getenvvar.py +30 -0
- vibe_surf/langflow/components/datastax/graph_rag.py +141 -0
- vibe_surf/langflow/components/datastax/hcd.py +314 -0
- vibe_surf/langflow/components/datastax/list_assistants.py +25 -0
- vibe_surf/langflow/components/datastax/run.py +89 -0
- vibe_surf/langflow/components/deactivated/__init__.py +19 -0
- vibe_surf/langflow/components/deactivated/amazon_kendra.py +66 -0
- vibe_surf/langflow/components/deactivated/chat_litellm_model.py +158 -0
- vibe_surf/langflow/components/deactivated/code_block_extractor.py +26 -0
- vibe_surf/langflow/components/deactivated/documents_to_data.py +22 -0
- vibe_surf/langflow/components/deactivated/embed.py +16 -0
- vibe_surf/langflow/components/deactivated/extract_key_from_data.py +46 -0
- vibe_surf/langflow/components/deactivated/json_document_builder.py +59 -0
- vibe_surf/langflow/components/deactivated/list_flows.py +20 -0
- vibe_surf/langflow/components/deactivated/merge_data.py +93 -0
- vibe_surf/langflow/components/deactivated/message.py +37 -0
- vibe_surf/langflow/components/deactivated/metal.py +54 -0
- vibe_surf/langflow/components/deactivated/multi_query.py +59 -0
- vibe_surf/langflow/components/deactivated/retriever.py +43 -0
- vibe_surf/langflow/components/deactivated/selective_passthrough.py +77 -0
- vibe_surf/langflow/components/deactivated/should_run_next.py +40 -0
- vibe_surf/langflow/components/deactivated/split_text.py +63 -0
- vibe_surf/langflow/components/deactivated/store_message.py +24 -0
- vibe_surf/langflow/components/deactivated/sub_flow.py +124 -0
- vibe_surf/langflow/components/deactivated/vectara_self_query.py +76 -0
- vibe_surf/langflow/components/deactivated/vector_store.py +24 -0
- vibe_surf/langflow/components/deepseek/__init__.py +34 -0
- vibe_surf/langflow/components/deepseek/deepseek.py +136 -0
- vibe_surf/langflow/components/docling/__init__.py +43 -0
- vibe_surf/langflow/components/docling/chunk_docling_document.py +186 -0
- vibe_surf/langflow/components/docling/docling_inline.py +249 -0
- vibe_surf/langflow/components/docling/docling_remote.py +192 -0
- vibe_surf/langflow/components/docling/export_docling_document.py +117 -0
- vibe_surf/langflow/components/documentloaders/__init__.py +0 -0
- vibe_surf/langflow/components/duckduckgo/__init__.py +3 -0
- vibe_surf/langflow/components/duckduckgo/duck_duck_go_search_run.py +92 -0
- vibe_surf/langflow/components/elastic/__init__.py +37 -0
- vibe_surf/langflow/components/elastic/elasticsearch.py +267 -0
- vibe_surf/langflow/components/elastic/opensearch.py +243 -0
- vibe_surf/langflow/components/embeddings/__init__.py +37 -0
- vibe_surf/langflow/components/embeddings/similarity.py +77 -0
- vibe_surf/langflow/components/embeddings/text_embedder.py +65 -0
- vibe_surf/langflow/components/exa/__init__.py +3 -0
- vibe_surf/langflow/components/exa/exa_search.py +68 -0
- vibe_surf/langflow/components/firecrawl/__init__.py +43 -0
- vibe_surf/langflow/components/firecrawl/firecrawl_crawl_api.py +88 -0
- vibe_surf/langflow/components/firecrawl/firecrawl_extract_api.py +136 -0
- vibe_surf/langflow/components/firecrawl/firecrawl_map_api.py +89 -0
- vibe_surf/langflow/components/firecrawl/firecrawl_scrape_api.py +73 -0
- vibe_surf/langflow/components/git/__init__.py +4 -0
- vibe_surf/langflow/components/git/git.py +262 -0
- vibe_surf/langflow/components/git/gitextractor.py +196 -0
- vibe_surf/langflow/components/glean/__init__.py +3 -0
- vibe_surf/langflow/components/glean/glean_search_api.py +173 -0
- vibe_surf/langflow/components/google/__init__.py +17 -0
- vibe_surf/langflow/components/google/gmail.py +193 -0
- vibe_surf/langflow/components/google/google_bq_sql_executor.py +157 -0
- vibe_surf/langflow/components/google/google_drive.py +92 -0
- vibe_surf/langflow/components/google/google_drive_search.py +152 -0
- vibe_surf/langflow/components/google/google_generative_ai.py +147 -0
- vibe_surf/langflow/components/google/google_generative_ai_embeddings.py +141 -0
- vibe_surf/langflow/components/google/google_oauth_token.py +89 -0
- vibe_surf/langflow/components/google/google_search_api_core.py +68 -0
- vibe_surf/langflow/components/groq/__init__.py +34 -0
- vibe_surf/langflow/components/groq/groq.py +140 -0
- vibe_surf/langflow/components/helpers/__init__.py +52 -0
- vibe_surf/langflow/components/helpers/calculator_core.py +89 -0
- vibe_surf/langflow/components/helpers/create_list.py +40 -0
- vibe_surf/langflow/components/helpers/current_date.py +42 -0
- vibe_surf/langflow/components/helpers/id_generator.py +42 -0
- vibe_surf/langflow/components/helpers/memory.py +253 -0
- vibe_surf/langflow/components/helpers/output_parser.py +46 -0
- vibe_surf/langflow/components/helpers/store_message.py +91 -0
- vibe_surf/langflow/components/homeassistant/__init__.py +7 -0
- vibe_surf/langflow/components/homeassistant/home_assistant_control.py +152 -0
- vibe_surf/langflow/components/homeassistant/list_home_assistant_states.py +137 -0
- vibe_surf/langflow/components/huggingface/__init__.py +37 -0
- vibe_surf/langflow/components/huggingface/huggingface.py +199 -0
- vibe_surf/langflow/components/huggingface/huggingface_inference_api.py +106 -0
- vibe_surf/langflow/components/ibm/__init__.py +34 -0
- vibe_surf/langflow/components/ibm/watsonx.py +203 -0
- vibe_surf/langflow/components/ibm/watsonx_embeddings.py +135 -0
- vibe_surf/langflow/components/icosacomputing/__init__.py +5 -0
- vibe_surf/langflow/components/icosacomputing/combinatorial_reasoner.py +84 -0
- vibe_surf/langflow/components/input_output/__init__.py +38 -0
- vibe_surf/langflow/components/input_output/chat.py +99 -0
- vibe_surf/langflow/components/input_output/chat_output.py +169 -0
- vibe_surf/langflow/components/input_output/text.py +27 -0
- vibe_surf/langflow/components/input_output/text_output.py +29 -0
- vibe_surf/langflow/components/jigsawstack/__init__.py +23 -0
- vibe_surf/langflow/components/jigsawstack/ai_scrape.py +126 -0
- vibe_surf/langflow/components/jigsawstack/ai_web_search.py +136 -0
- vibe_surf/langflow/components/jigsawstack/file_read.py +115 -0
- vibe_surf/langflow/components/jigsawstack/file_upload.py +94 -0
- vibe_surf/langflow/components/jigsawstack/image_generation.py +205 -0
- vibe_surf/langflow/components/jigsawstack/nsfw.py +60 -0
- vibe_surf/langflow/components/jigsawstack/object_detection.py +124 -0
- vibe_surf/langflow/components/jigsawstack/sentiment.py +112 -0
- vibe_surf/langflow/components/jigsawstack/text_to_sql.py +90 -0
- vibe_surf/langflow/components/jigsawstack/text_translate.py +77 -0
- vibe_surf/langflow/components/jigsawstack/vocr.py +107 -0
- vibe_surf/langflow/components/knowledge_bases/__init__.py +34 -0
- vibe_surf/langflow/components/knowledge_bases/ingestion.py +697 -0
- vibe_surf/langflow/components/knowledge_bases/retrieval.py +264 -0
- vibe_surf/langflow/components/langchain_utilities/__init__.py +109 -0
- vibe_surf/langflow/components/langchain_utilities/character.py +53 -0
- vibe_surf/langflow/components/langchain_utilities/conversation.py +52 -0
- vibe_surf/langflow/components/langchain_utilities/csv_agent.py +107 -0
- vibe_surf/langflow/components/langchain_utilities/fake_embeddings.py +26 -0
- vibe_surf/langflow/components/langchain_utilities/html_link_extractor.py +35 -0
- vibe_surf/langflow/components/langchain_utilities/json_agent.py +45 -0
- vibe_surf/langflow/components/langchain_utilities/langchain_hub.py +126 -0
- vibe_surf/langflow/components/langchain_utilities/language_recursive.py +49 -0
- vibe_surf/langflow/components/langchain_utilities/language_semantic.py +138 -0
- vibe_surf/langflow/components/langchain_utilities/llm_checker.py +39 -0
- vibe_surf/langflow/components/langchain_utilities/llm_math.py +42 -0
- vibe_surf/langflow/components/langchain_utilities/natural_language.py +61 -0
- vibe_surf/langflow/components/langchain_utilities/openai_tools.py +53 -0
- vibe_surf/langflow/components/langchain_utilities/openapi.py +48 -0
- vibe_surf/langflow/components/langchain_utilities/recursive_character.py +60 -0
- vibe_surf/langflow/components/langchain_utilities/retrieval_qa.py +83 -0
- vibe_surf/langflow/components/langchain_utilities/runnable_executor.py +137 -0
- vibe_surf/langflow/components/langchain_utilities/self_query.py +80 -0
- vibe_surf/langflow/components/langchain_utilities/spider.py +142 -0
- vibe_surf/langflow/components/langchain_utilities/sql.py +40 -0
- vibe_surf/langflow/components/langchain_utilities/sql_database.py +35 -0
- vibe_surf/langflow/components/langchain_utilities/sql_generator.py +78 -0
- vibe_surf/langflow/components/langchain_utilities/tool_calling.py +59 -0
- vibe_surf/langflow/components/langchain_utilities/vector_store_info.py +49 -0
- vibe_surf/langflow/components/langchain_utilities/vector_store_router.py +33 -0
- vibe_surf/langflow/components/langchain_utilities/xml_agent.py +71 -0
- vibe_surf/langflow/components/langwatch/__init__.py +3 -0
- vibe_surf/langflow/components/langwatch/langwatch.py +278 -0
- vibe_surf/langflow/components/link_extractors/__init__.py +0 -0
- vibe_surf/langflow/components/lmstudio/__init__.py +34 -0
- vibe_surf/langflow/components/lmstudio/lmstudioembeddings.py +89 -0
- vibe_surf/langflow/components/lmstudio/lmstudiomodel.py +129 -0
- vibe_surf/langflow/components/logic/__init__.py +52 -0
- vibe_surf/langflow/components/logic/conditional_router.py +208 -0
- vibe_surf/langflow/components/logic/data_conditional_router.py +126 -0
- vibe_surf/langflow/components/logic/flow_tool.py +111 -0
- vibe_surf/langflow/components/logic/listen.py +29 -0
- vibe_surf/langflow/components/logic/loop.py +125 -0
- vibe_surf/langflow/components/logic/notify.py +88 -0
- vibe_surf/langflow/components/logic/pass_message.py +36 -0
- vibe_surf/langflow/components/logic/run_flow.py +71 -0
- vibe_surf/langflow/components/logic/sub_flow.py +115 -0
- vibe_surf/langflow/components/maritalk/__init__.py +32 -0
- vibe_surf/langflow/components/maritalk/maritalk.py +52 -0
- vibe_surf/langflow/components/mem0/__init__.py +3 -0
- vibe_surf/langflow/components/mem0/mem0_chat_memory.py +136 -0
- vibe_surf/langflow/components/milvus/__init__.py +34 -0
- vibe_surf/langflow/components/milvus/milvus.py +115 -0
- vibe_surf/langflow/components/mistral/__init__.py +37 -0
- vibe_surf/langflow/components/mistral/mistral.py +114 -0
- vibe_surf/langflow/components/mistral/mistral_embeddings.py +58 -0
- vibe_surf/langflow/components/models/__init__.py +34 -0
- vibe_surf/langflow/components/models/embedding_model.py +114 -0
- vibe_surf/langflow/components/models/language_model.py +144 -0
- vibe_surf/langflow/components/mongodb/__init__.py +34 -0
- vibe_surf/langflow/components/mongodb/mongodb_atlas.py +213 -0
- vibe_surf/langflow/components/needle/__init__.py +3 -0
- vibe_surf/langflow/components/needle/needle.py +104 -0
- vibe_surf/langflow/components/notdiamond/__init__.py +36 -0
- vibe_surf/langflow/components/notdiamond/notdiamond.py +228 -0
- vibe_surf/langflow/components/novita/__init__.py +32 -0
- vibe_surf/langflow/components/novita/novita.py +130 -0
- vibe_surf/langflow/components/nvidia/__init__.py +57 -0
- vibe_surf/langflow/components/nvidia/nvidia.py +151 -0
- vibe_surf/langflow/components/nvidia/nvidia_embedding.py +77 -0
- vibe_surf/langflow/components/nvidia/nvidia_ingest.py +317 -0
- vibe_surf/langflow/components/nvidia/nvidia_rerank.py +63 -0
- vibe_surf/langflow/components/nvidia/system_assist.py +65 -0
- vibe_surf/langflow/components/olivya/__init__.py +3 -0
- vibe_surf/langflow/components/olivya/olivya.py +116 -0
- vibe_surf/langflow/components/ollama/__init__.py +37 -0
- vibe_surf/langflow/components/ollama/ollama.py +330 -0
- vibe_surf/langflow/components/ollama/ollama_embeddings.py +106 -0
- vibe_surf/langflow/components/openai/__init__.py +37 -0
- vibe_surf/langflow/components/openai/openai.py +100 -0
- vibe_surf/langflow/components/openai/openai_chat_model.py +158 -0
- vibe_surf/langflow/components/openrouter/__init__.py +32 -0
- vibe_surf/langflow/components/openrouter/openrouter.py +202 -0
- vibe_surf/langflow/components/output_parsers/__init__.py +0 -0
- vibe_surf/langflow/components/perplexity/__init__.py +34 -0
- vibe_surf/langflow/components/perplexity/perplexity.py +75 -0
- vibe_surf/langflow/components/pgvector/__init__.py +34 -0
- vibe_surf/langflow/components/pgvector/pgvector.py +72 -0
- vibe_surf/langflow/components/pinecone/__init__.py +34 -0
- vibe_surf/langflow/components/pinecone/pinecone.py +134 -0
- vibe_surf/langflow/components/processing/__init__.py +117 -0
- vibe_surf/langflow/components/processing/alter_metadata.py +109 -0
- vibe_surf/langflow/components/processing/batch_run.py +205 -0
- vibe_surf/langflow/components/processing/combine_text.py +40 -0
- vibe_surf/langflow/components/processing/converter.py +150 -0
- vibe_surf/langflow/components/processing/create_data.py +111 -0
- vibe_surf/langflow/components/processing/data_operations.py +438 -0
- vibe_surf/langflow/components/processing/data_to_dataframe.py +71 -0
- vibe_surf/langflow/components/processing/dataframe_operations.py +310 -0
- vibe_surf/langflow/components/processing/extract_key.py +54 -0
- vibe_surf/langflow/components/processing/filter_data.py +43 -0
- vibe_surf/langflow/components/processing/filter_data_values.py +89 -0
- vibe_surf/langflow/components/processing/json_cleaner.py +104 -0
- vibe_surf/langflow/components/processing/lambda_filter.py +154 -0
- vibe_surf/langflow/components/processing/llm_router.py +499 -0
- vibe_surf/langflow/components/processing/merge_data.py +91 -0
- vibe_surf/langflow/components/processing/message_to_data.py +37 -0
- vibe_surf/langflow/components/processing/parse_data.py +71 -0
- vibe_surf/langflow/components/processing/parse_dataframe.py +69 -0
- vibe_surf/langflow/components/processing/parse_json_data.py +91 -0
- vibe_surf/langflow/components/processing/parser.py +143 -0
- vibe_surf/langflow/components/processing/prompt.py +67 -0
- vibe_surf/langflow/components/processing/python_repl_core.py +98 -0
- vibe_surf/langflow/components/processing/regex.py +83 -0
- vibe_surf/langflow/components/processing/save_file.py +208 -0
- vibe_surf/langflow/components/processing/select_data.py +49 -0
- vibe_surf/langflow/components/processing/split_text.py +141 -0
- vibe_surf/langflow/components/processing/structured_output.py +206 -0
- vibe_surf/langflow/components/processing/update_data.py +161 -0
- vibe_surf/langflow/components/qdrant/__init__.py +34 -0
- vibe_surf/langflow/components/qdrant/qdrant.py +109 -0
- vibe_surf/langflow/components/redis/__init__.py +37 -0
- vibe_surf/langflow/components/redis/redis.py +89 -0
- vibe_surf/langflow/components/redis/redis_chat.py +43 -0
- vibe_surf/langflow/components/sambanova/__init__.py +32 -0
- vibe_surf/langflow/components/sambanova/sambanova.py +84 -0
- vibe_surf/langflow/components/scrapegraph/__init__.py +40 -0
- vibe_surf/langflow/components/scrapegraph/scrapegraph_markdownify_api.py +64 -0
- vibe_surf/langflow/components/scrapegraph/scrapegraph_search_api.py +64 -0
- vibe_surf/langflow/components/scrapegraph/scrapegraph_smart_scraper_api.py +71 -0
- vibe_surf/langflow/components/searchapi/__init__.py +36 -0
- vibe_surf/langflow/components/searchapi/search.py +79 -0
- vibe_surf/langflow/components/serpapi/__init__.py +3 -0
- vibe_surf/langflow/components/serpapi/serp.py +115 -0
- vibe_surf/langflow/components/serper/__init__.py +3 -0
- vibe_surf/langflow/components/serper/google_serper_api_core.py +74 -0
- vibe_surf/langflow/components/supabase/__init__.py +37 -0
- vibe_surf/langflow/components/supabase/supabase.py +76 -0
- vibe_surf/langflow/components/tavily/__init__.py +4 -0
- vibe_surf/langflow/components/tavily/tavily_extract.py +117 -0
- vibe_surf/langflow/components/tavily/tavily_search.py +212 -0
- vibe_surf/langflow/components/textsplitters/__init__.py +0 -0
- vibe_surf/langflow/components/toolkits/__init__.py +0 -0
- vibe_surf/langflow/components/tools/__init__.py +66 -0
- vibe_surf/langflow/components/tools/calculator.py +104 -0
- vibe_surf/langflow/components/tools/python_code_structured_tool.py +328 -0
- vibe_surf/langflow/components/tools/python_repl.py +98 -0
- vibe_surf/langflow/components/tools/search_api.py +88 -0
- vibe_surf/langflow/components/tools/searxng.py +145 -0
- vibe_surf/langflow/components/tools/serp_api.py +120 -0
- vibe_surf/langflow/components/tools/tavily_search_tool.py +345 -0
- vibe_surf/langflow/components/tools/wikidata_api.py +103 -0
- vibe_surf/langflow/components/tools/wikipedia_api.py +50 -0
- vibe_surf/langflow/components/tools/yahoo_finance.py +125 -0
- vibe_surf/langflow/components/twelvelabs/__init__.py +52 -0
- vibe_surf/langflow/components/twelvelabs/convert_astra_results.py +84 -0
- vibe_surf/langflow/components/twelvelabs/pegasus_index.py +311 -0
- vibe_surf/langflow/components/twelvelabs/split_video.py +291 -0
- vibe_surf/langflow/components/twelvelabs/text_embeddings.py +57 -0
- vibe_surf/langflow/components/twelvelabs/twelvelabs_pegasus.py +408 -0
- vibe_surf/langflow/components/twelvelabs/video_embeddings.py +100 -0
- vibe_surf/langflow/components/twelvelabs/video_file.py +179 -0
- vibe_surf/langflow/components/unstructured/__init__.py +3 -0
- vibe_surf/langflow/components/unstructured/unstructured.py +121 -0
- vibe_surf/langflow/components/upstash/__init__.py +34 -0
- vibe_surf/langflow/components/upstash/upstash.py +124 -0
- vibe_surf/langflow/components/vectara/__init__.py +37 -0
- vibe_surf/langflow/components/vectara/vectara.py +97 -0
- vibe_surf/langflow/components/vectara/vectara_rag.py +164 -0
- vibe_surf/langflow/components/vectorstores/__init__.py +34 -0
- vibe_surf/langflow/components/vectorstores/local_db.py +262 -0
- vibe_surf/langflow/components/vertexai/__init__.py +37 -0
- vibe_surf/langflow/components/vertexai/vertexai.py +71 -0
- vibe_surf/langflow/components/vertexai/vertexai_embeddings.py +67 -0
- vibe_surf/langflow/components/weaviate/__init__.py +34 -0
- vibe_surf/langflow/components/weaviate/weaviate.py +89 -0
- vibe_surf/langflow/components/wikipedia/__init__.py +4 -0
- vibe_surf/langflow/components/wikipedia/wikidata.py +86 -0
- vibe_surf/langflow/components/wikipedia/wikipedia.py +53 -0
- vibe_surf/langflow/components/wolframalpha/__init__.py +3 -0
- vibe_surf/langflow/components/wolframalpha/wolfram_alpha_api.py +54 -0
- vibe_surf/langflow/components/xai/__init__.py +32 -0
- vibe_surf/langflow/components/xai/xai.py +167 -0
- vibe_surf/langflow/components/youtube/__init__.py +52 -0
- vibe_surf/langflow/components/youtube/channel.py +227 -0
- vibe_surf/langflow/components/youtube/comments.py +231 -0
- vibe_surf/langflow/components/youtube/playlist.py +33 -0
- vibe_surf/langflow/components/youtube/search.py +120 -0
- vibe_surf/langflow/components/youtube/trending.py +285 -0
- vibe_surf/langflow/components/youtube/video_details.py +263 -0
- vibe_surf/langflow/components/youtube/youtube_transcripts.py +118 -0
- vibe_surf/langflow/components/zep/__init__.py +3 -0
- vibe_surf/langflow/components/zep/zep.py +45 -0
- vibe_surf/langflow/core/__init__.py +0 -0
- vibe_surf/langflow/core/celery_app.py +11 -0
- vibe_surf/langflow/core/celeryconfig.py +18 -0
- vibe_surf/langflow/custom/__init__.py +4 -0
- vibe_surf/langflow/custom/attributes.py +87 -0
- vibe_surf/langflow/custom/code_parser/__init__.py +3 -0
- vibe_surf/langflow/custom/code_parser/code_parser.py +361 -0
- vibe_surf/langflow/custom/custom_component/__init__.py +0 -0
- vibe_surf/langflow/custom/custom_component/base_component.py +118 -0
- vibe_surf/langflow/custom/custom_component/component.py +1742 -0
- vibe_surf/langflow/custom/custom_component/component_with_cache.py +8 -0
- vibe_surf/langflow/custom/custom_component/custom_component.py +552 -0
- vibe_surf/langflow/custom/dependency_analyzer.py +165 -0
- vibe_surf/langflow/custom/directory_reader/__init__.py +3 -0
- vibe_surf/langflow/custom/directory_reader/directory_reader.py +359 -0
- vibe_surf/langflow/custom/directory_reader/utils.py +171 -0
- vibe_surf/langflow/custom/eval.py +12 -0
- vibe_surf/langflow/custom/schema.py +32 -0
- vibe_surf/langflow/custom/tree_visitor.py +21 -0
- vibe_surf/langflow/custom/utils.py +868 -0
- vibe_surf/langflow/events/__init__.py +0 -0
- vibe_surf/langflow/events/event_manager.py +108 -0
- vibe_surf/langflow/exceptions/__init__.py +0 -0
- vibe_surf/langflow/exceptions/api.py +34 -0
- vibe_surf/langflow/exceptions/component.py +17 -0
- vibe_surf/langflow/exceptions/serialization.py +56 -0
- vibe_surf/langflow/field_typing/__init__.py +91 -0
- vibe_surf/langflow/field_typing/constants.py +137 -0
- vibe_surf/langflow/field_typing/range_spec.py +33 -0
- vibe_surf/langflow/graph/__init__.py +6 -0
- vibe_surf/langflow/graph/edge/__init__.py +0 -0
- vibe_surf/langflow/graph/edge/base.py +277 -0
- vibe_surf/langflow/graph/edge/schema.py +119 -0
- vibe_surf/langflow/graph/edge/utils.py +0 -0
- vibe_surf/langflow/graph/graph/__init__.py +0 -0
- vibe_surf/langflow/graph/graph/ascii.py +202 -0
- vibe_surf/langflow/graph/graph/base.py +2242 -0
- vibe_surf/langflow/graph/graph/constants.py +58 -0
- vibe_surf/langflow/graph/graph/runnable_vertices_manager.py +133 -0
- vibe_surf/langflow/graph/graph/schema.py +53 -0
- vibe_surf/langflow/graph/graph/state_model.py +66 -0
- vibe_surf/langflow/graph/graph/utils.py +1024 -0
- vibe_surf/langflow/graph/schema.py +75 -0
- vibe_surf/langflow/graph/state/__init__.py +0 -0
- vibe_surf/langflow/graph/state/model.py +237 -0
- vibe_surf/langflow/graph/utils.py +229 -0
- vibe_surf/langflow/graph/vertex/__init__.py +0 -0
- vibe_surf/langflow/graph/vertex/base.py +811 -0
- vibe_surf/langflow/graph/vertex/constants.py +0 -0
- vibe_surf/langflow/graph/vertex/exceptions.py +4 -0
- vibe_surf/langflow/graph/vertex/param_handler.py +255 -0
- vibe_surf/langflow/graph/vertex/schema.py +26 -0
- vibe_surf/langflow/graph/vertex/utils.py +19 -0
- vibe_surf/langflow/graph/vertex/vertex_types.py +489 -0
- vibe_surf/langflow/helpers/__init__.py +3 -0
- vibe_surf/langflow/helpers/base_model.py +71 -0
- vibe_surf/langflow/helpers/custom.py +13 -0
- vibe_surf/langflow/helpers/data.py +206 -0
- vibe_surf/langflow/helpers/flow.py +359 -0
- vibe_surf/langflow/helpers/folders.py +26 -0
- vibe_surf/langflow/helpers/user.py +27 -0
- vibe_surf/langflow/initial_setup/__init__.py +0 -0
- vibe_surf/langflow/initial_setup/constants.py +2 -0
- vibe_surf/langflow/initial_setup/load.py +21 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-01.svg +102 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-02.svg +135 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-03.svg +126 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-04.svg +132 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-05.svg +151 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-06.svg +132 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-07.svg +138 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-08.svg +125 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-09.svg +137 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-10.svg +109 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-11.svg +140 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-12.svg +99 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-13.svg +118 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-14.svg +99 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-15.svg +90 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-16.svg +106 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-17.svg +97 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-18.svg +128 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-19.svg +100 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-20.svg +101 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-21.svg +134 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-22.svg +127 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-23.svg +120 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-24.svg +110 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-25.svg +79 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-26.svg +98 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-01-27.svg +113 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-01.svg +113 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-02.svg +167 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-03.svg +91 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-04.svg +114 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-05.svg +71 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-06.svg +105 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-07.svg +101 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-08.svg +92 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-09.svg +91 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-10.svg +110 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-11.svg +102 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-12.svg +92 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-13.svg +77 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-14.svg +99 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-15.svg +81 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-16.svg +91 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-17.svg +100 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-18.svg +99 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-19.svg +155 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-20.svg +110 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-21.svg +128 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-22.svg +90 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-23.svg +117 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-24.svg +100 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-25.svg +97 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-26.svg +105 -0
- vibe_surf/langflow/initial_setup/profile_pictures/People/People Avatar-02-27.svg +82 -0
- vibe_surf/langflow/initial_setup/profile_pictures/Space/026-alien.svg +1 -0
- vibe_surf/langflow/initial_setup/profile_pictures/Space/027-satellite.svg +1 -0
- vibe_surf/langflow/initial_setup/profile_pictures/Space/028-alien.svg +1 -0
- vibe_surf/langflow/initial_setup/profile_pictures/Space/029-telescope.svg +1 -0
- vibe_surf/langflow/initial_setup/profile_pictures/Space/030-books.svg +1 -0
- vibe_surf/langflow/initial_setup/profile_pictures/Space/031-planet.svg +1 -0
- vibe_surf/langflow/initial_setup/profile_pictures/Space/032-constellation.svg +1 -0
- vibe_surf/langflow/initial_setup/profile_pictures/Space/033-planet.svg +1 -0
- vibe_surf/langflow/initial_setup/profile_pictures/Space/034-alien.svg +1 -0
- vibe_surf/langflow/initial_setup/profile_pictures/Space/035-globe.svg +1 -0
- vibe_surf/langflow/initial_setup/profile_pictures/Space/036-eclipse.svg +1 -0
- vibe_surf/langflow/initial_setup/profile_pictures/Space/037-meteor.svg +1 -0
- vibe_surf/langflow/initial_setup/profile_pictures/Space/038-eclipse.svg +1 -0
- vibe_surf/langflow/initial_setup/profile_pictures/Space/039-Asteroid.svg +1 -0
- vibe_surf/langflow/initial_setup/profile_pictures/Space/040-mission.svg +1 -0
- vibe_surf/langflow/initial_setup/profile_pictures/Space/041-spaceship.svg +1 -0
- vibe_surf/langflow/initial_setup/profile_pictures/Space/042-space shuttle.svg +1 -0
- vibe_surf/langflow/initial_setup/profile_pictures/Space/043-space shuttle.svg +1 -0
- vibe_surf/langflow/initial_setup/profile_pictures/Space/044-rocket.svg +1 -0
- vibe_surf/langflow/initial_setup/profile_pictures/Space/045-astronaut.svg +1 -0
- vibe_surf/langflow/initial_setup/profile_pictures/Space/046-rocket.svg +1 -0
- vibe_surf/langflow/initial_setup/profile_pictures/Space/047-computer.svg +1 -0
- vibe_surf/langflow/initial_setup/profile_pictures/Space/048-satellite.svg +1 -0
- vibe_surf/langflow/initial_setup/profile_pictures/Space/049-astronaut.svg +1 -0
- vibe_surf/langflow/initial_setup/profile_pictures/Space/050-space robot.svg +1 -0
- vibe_surf/langflow/initial_setup/setup.py +1108 -0
- vibe_surf/langflow/initial_setup/starter_projects/Basic Prompt Chaining.json +1976 -0
- vibe_surf/langflow/initial_setup/starter_projects/Basic Prompting.json +1051 -0
- vibe_surf/langflow/initial_setup/starter_projects/Blog Writer.json +1529 -0
- vibe_surf/langflow/initial_setup/starter_projects/Custom Component Generator.json +2671 -0
- vibe_surf/langflow/initial_setup/starter_projects/Document Q&A.json +1522 -0
- vibe_surf/langflow/initial_setup/starter_projects/Financial Report Parser.json +1418 -0
- vibe_surf/langflow/initial_setup/starter_projects/Hybrid Search RAG.json +2718 -0
- vibe_surf/langflow/initial_setup/starter_projects/Image Sentiment Analysis.json +1884 -0
- vibe_surf/langflow/initial_setup/starter_projects/Instagram Copywriter.json +3069 -0
- vibe_surf/langflow/initial_setup/starter_projects/Invoice Summarizer.json +1666 -0
- vibe_surf/langflow/initial_setup/starter_projects/Knowledge Ingestion.json +1042 -0
- vibe_surf/langflow/initial_setup/starter_projects/Knowledge Retrieval.json +630 -0
- vibe_surf/langflow/initial_setup/starter_projects/Market Research.json +2532 -0
- vibe_surf/langflow/initial_setup/starter_projects/Meeting Summary.json +3263 -0
- vibe_surf/langflow/initial_setup/starter_projects/Memory Chatbot.json +1419 -0
- vibe_surf/langflow/initial_setup/starter_projects/News Aggregator.json +1835 -0
- vibe_surf/langflow/initial_setup/starter_projects/Nvidia Remix.json +4866 -0
- vibe_surf/langflow/initial_setup/starter_projects/Pok/303/251dex Agent.json" +1739 -0
- vibe_surf/langflow/initial_setup/starter_projects/Portfolio Website Code Generator.json +2243 -0
- vibe_surf/langflow/initial_setup/starter_projects/Price Deal Finder.json +2099 -0
- vibe_surf/langflow/initial_setup/starter_projects/Research Agent.json +3032 -0
- vibe_surf/langflow/initial_setup/starter_projects/Research Translation Loop.json +1580 -0
- vibe_surf/langflow/initial_setup/starter_projects/SEO Keyword Generator.json +1091 -0
- vibe_surf/langflow/initial_setup/starter_projects/SaaS Pricing.json +1416 -0
- vibe_surf/langflow/initial_setup/starter_projects/Search agent.json +1455 -0
- vibe_surf/langflow/initial_setup/starter_projects/Sequential Tasks Agents.json +4101 -0
- vibe_surf/langflow/initial_setup/starter_projects/Simple Agent.json +1841 -0
- vibe_surf/langflow/initial_setup/starter_projects/Social Media Agent.json +1759 -0
- vibe_surf/langflow/initial_setup/starter_projects/Text Sentiment Analysis.json +2557 -0
- vibe_surf/langflow/initial_setup/starter_projects/Travel Planning Agents.json +3448 -0
- vibe_surf/langflow/initial_setup/starter_projects/Twitter Thread Generator.json +1978 -0
- vibe_surf/langflow/initial_setup/starter_projects/Vector Store RAG.json +4850 -0
- vibe_surf/langflow/initial_setup/starter_projects/Youtube Analysis.json +2734 -0
- vibe_surf/langflow/initial_setup/starter_projects/__init__.py +19 -0
- vibe_surf/langflow/initial_setup/starter_projects/basic_prompting.py +28 -0
- vibe_surf/langflow/initial_setup/starter_projects/blog_writer.py +46 -0
- vibe_surf/langflow/initial_setup/starter_projects/complex_agent.py +96 -0
- vibe_surf/langflow/initial_setup/starter_projects/document_qa.py +39 -0
- vibe_surf/langflow/initial_setup/starter_projects/hierarchical_tasks_agent.py +69 -0
- vibe_surf/langflow/initial_setup/starter_projects/memory_chatbot.py +31 -0
- vibe_surf/langflow/initial_setup/starter_projects/sequential_tasks_agent.py +97 -0
- vibe_surf/langflow/initial_setup/starter_projects/vector_store_rag.py +61 -0
- vibe_surf/langflow/inputs/__init__.py +68 -0
- vibe_surf/langflow/inputs/constants.py +2 -0
- vibe_surf/langflow/inputs/input_mixin.py +312 -0
- vibe_surf/langflow/inputs/inputs.py +706 -0
- vibe_surf/langflow/inputs/utils.py +32 -0
- vibe_surf/langflow/inputs/validators.py +19 -0
- vibe_surf/langflow/interface/__init__.py +0 -0
- vibe_surf/langflow/interface/components.py +496 -0
- vibe_surf/langflow/interface/importing/__init__.py +5 -0
- vibe_surf/langflow/interface/importing/utils.py +39 -0
- vibe_surf/langflow/interface/initialize/__init__.py +3 -0
- vibe_surf/langflow/interface/initialize/loading.py +200 -0
- vibe_surf/langflow/interface/listing.py +26 -0
- vibe_surf/langflow/interface/run.py +45 -0
- vibe_surf/langflow/interface/utils.py +112 -0
- vibe_surf/langflow/io/__init__.py +63 -0
- vibe_surf/langflow/io/schema.py +304 -0
- vibe_surf/langflow/langflow_launcher.py +51 -0
- vibe_surf/langflow/legacy_custom/__init__.py +0 -0
- vibe_surf/langflow/legacy_custom/customs.py +16 -0
- vibe_surf/langflow/load/__init__.py +12 -0
- vibe_surf/langflow/load/load.py +250 -0
- vibe_surf/langflow/load/utils.py +126 -0
- vibe_surf/langflow/logging/__init__.py +4 -0
- vibe_surf/langflow/logging/logger.py +407 -0
- vibe_surf/langflow/logging/setup.py +16 -0
- vibe_surf/langflow/main.py +550 -0
- vibe_surf/langflow/memory.py +326 -0
- vibe_surf/langflow/middleware.py +59 -0
- vibe_surf/langflow/processing/__init__.py +0 -0
- vibe_surf/langflow/processing/process.py +216 -0
- vibe_surf/langflow/processing/utils.py +25 -0
- vibe_surf/langflow/py.typed +0 -0
- vibe_surf/langflow/schema/__init__.py +6 -0
- vibe_surf/langflow/schema/artifact.py +82 -0
- vibe_surf/langflow/schema/content_block.py +62 -0
- vibe_surf/langflow/schema/content_types.py +91 -0
- vibe_surf/langflow/schema/data.py +306 -0
- vibe_surf/langflow/schema/dataframe.py +206 -0
- vibe_surf/langflow/schema/dotdict.py +71 -0
- vibe_surf/langflow/schema/encoders.py +13 -0
- vibe_surf/langflow/schema/graph.py +47 -0
- vibe_surf/langflow/schema/image.py +128 -0
- vibe_surf/langflow/schema/log.py +33 -0
- vibe_surf/langflow/schema/message.py +483 -0
- vibe_surf/langflow/schema/openai_responses_schemas.py +74 -0
- vibe_surf/langflow/schema/playground_events.py +182 -0
- vibe_surf/langflow/schema/properties.py +39 -0
- vibe_surf/langflow/schema/schema.py +121 -0
- vibe_surf/langflow/schema/serialize.py +14 -0
- vibe_surf/langflow/schema/table.py +140 -0
- vibe_surf/langflow/schema/validators.py +114 -0
- vibe_surf/langflow/serialization/__init__.py +3 -0
- vibe_surf/langflow/serialization/constants.py +2 -0
- vibe_surf/langflow/serialization/serialization.py +320 -0
- vibe_surf/langflow/server.py +70 -0
- vibe_surf/langflow/services/__init__.py +4 -0
- vibe_surf/langflow/services/auth/__init__.py +0 -0
- vibe_surf/langflow/services/auth/factory.py +15 -0
- vibe_surf/langflow/services/auth/mcp_encryption.py +120 -0
- vibe_surf/langflow/services/auth/service.py +15 -0
- vibe_surf/langflow/services/auth/utils.py +583 -0
- vibe_surf/langflow/services/base.py +28 -0
- vibe_surf/langflow/services/cache/__init__.py +12 -0
- vibe_surf/langflow/services/cache/base.py +183 -0
- vibe_surf/langflow/services/cache/disk.py +95 -0
- vibe_surf/langflow/services/cache/factory.py +44 -0
- vibe_surf/langflow/services/cache/service.py +355 -0
- vibe_surf/langflow/services/cache/utils.py +169 -0
- vibe_surf/langflow/services/chat/__init__.py +0 -0
- vibe_surf/langflow/services/chat/cache.py +150 -0
- vibe_surf/langflow/services/chat/config.py +2 -0
- vibe_surf/langflow/services/chat/factory.py +11 -0
- vibe_surf/langflow/services/chat/schema.py +10 -0
- vibe_surf/langflow/services/chat/service.py +67 -0
- vibe_surf/langflow/services/database/__init__.py +0 -0
- vibe_surf/langflow/services/database/factory.py +21 -0
- vibe_surf/langflow/services/database/models/__init__.py +19 -0
- vibe_surf/langflow/services/database/models/api_key/__init__.py +3 -0
- vibe_surf/langflow/services/database/models/api_key/crud.py +74 -0
- vibe_surf/langflow/services/database/models/api_key/model.py +66 -0
- vibe_surf/langflow/services/database/models/base.py +17 -0
- vibe_surf/langflow/services/database/models/file/__init__.py +5 -0
- vibe_surf/langflow/services/database/models/file/crud.py +14 -0
- vibe_surf/langflow/services/database/models/file/model.py +19 -0
- vibe_surf/langflow/services/database/models/flow/__init__.py +3 -0
- vibe_surf/langflow/services/database/models/flow/model.py +283 -0
- vibe_surf/langflow/services/database/models/flow/schema.py +6 -0
- vibe_surf/langflow/services/database/models/flow/utils.py +42 -0
- vibe_surf/langflow/services/database/models/folder/__init__.py +3 -0
- vibe_surf/langflow/services/database/models/folder/constants.py +2 -0
- vibe_surf/langflow/services/database/models/folder/model.py +61 -0
- vibe_surf/langflow/services/database/models/folder/pagination_model.py +10 -0
- vibe_surf/langflow/services/database/models/folder/utils.py +45 -0
- vibe_surf/langflow/services/database/models/message/__init__.py +3 -0
- vibe_surf/langflow/services/database/models/message/crud.py +26 -0
- vibe_surf/langflow/services/database/models/message/model.py +182 -0
- vibe_surf/langflow/services/database/models/transactions/__init__.py +3 -0
- vibe_surf/langflow/services/database/models/transactions/crud.py +82 -0
- vibe_surf/langflow/services/database/models/transactions/model.py +65 -0
- vibe_surf/langflow/services/database/models/user/__init__.py +8 -0
- vibe_surf/langflow/services/database/models/user/crud.py +69 -0
- vibe_surf/langflow/services/database/models/user/model.py +82 -0
- vibe_surf/langflow/services/database/models/variable/__init__.py +3 -0
- vibe_surf/langflow/services/database/models/variable/model.py +73 -0
- vibe_surf/langflow/services/database/models/vertex_builds/__init__.py +3 -0
- vibe_surf/langflow/services/database/models/vertex_builds/crud.py +145 -0
- vibe_surf/langflow/services/database/models/vertex_builds/model.py +83 -0
- vibe_surf/langflow/services/database/service.py +485 -0
- vibe_surf/langflow/services/database/session.py +62 -0
- vibe_surf/langflow/services/database/utils.py +88 -0
- vibe_surf/langflow/services/deps.py +259 -0
- vibe_surf/langflow/services/factory.py +88 -0
- vibe_surf/langflow/services/flow/__init__.py +0 -0
- vibe_surf/langflow/services/flow/flow_runner.py +265 -0
- vibe_surf/langflow/services/job_queue/__init__.py +0 -0
- vibe_surf/langflow/services/job_queue/factory.py +11 -0
- vibe_surf/langflow/services/job_queue/service.py +328 -0
- vibe_surf/langflow/services/manager.py +149 -0
- vibe_surf/langflow/services/mcp_composer/__init__.py +6 -0
- vibe_surf/langflow/services/mcp_composer/factory.py +15 -0
- vibe_surf/langflow/services/mcp_composer/service.py +591 -0
- vibe_surf/langflow/services/schema.py +23 -0
- vibe_surf/langflow/services/session/__init__.py +0 -0
- vibe_surf/langflow/services/session/factory.py +18 -0
- vibe_surf/langflow/services/session/service.py +63 -0
- vibe_surf/langflow/services/session/utils.py +18 -0
- vibe_surf/langflow/services/settings/__init__.py +3 -0
- vibe_surf/langflow/services/settings/auth.py +147 -0
- vibe_surf/langflow/services/settings/base.py +587 -0
- vibe_surf/langflow/services/settings/constants.py +34 -0
- vibe_surf/langflow/services/settings/factory.py +22 -0
- vibe_surf/langflow/services/settings/feature_flags.py +11 -0
- vibe_surf/langflow/services/settings/manager.py +49 -0
- vibe_surf/langflow/services/settings/service.py +32 -0
- vibe_surf/langflow/services/settings/utils.py +40 -0
- vibe_surf/langflow/services/shared_component_cache/__init__.py +0 -0
- vibe_surf/langflow/services/shared_component_cache/factory.py +18 -0
- vibe_surf/langflow/services/shared_component_cache/service.py +7 -0
- vibe_surf/langflow/services/socket/__init__.py +0 -0
- vibe_surf/langflow/services/socket/factory.py +20 -0
- vibe_surf/langflow/services/socket/service.py +84 -0
- vibe_surf/langflow/services/socket/utils.py +112 -0
- vibe_surf/langflow/services/state/__init__.py +0 -0
- vibe_surf/langflow/services/state/factory.py +16 -0
- vibe_surf/langflow/services/state/service.py +82 -0
- vibe_surf/langflow/services/storage/__init__.py +0 -0
- vibe_surf/langflow/services/storage/constants.py +28 -0
- vibe_surf/langflow/services/storage/factory.py +30 -0
- vibe_surf/langflow/services/storage/local.py +127 -0
- vibe_surf/langflow/services/storage/s3.py +105 -0
- vibe_surf/langflow/services/storage/service.py +51 -0
- vibe_surf/langflow/services/storage/utils.py +5 -0
- vibe_surf/langflow/services/store/__init__.py +0 -0
- vibe_surf/langflow/services/store/exceptions.py +25 -0
- vibe_surf/langflow/services/store/factory.py +20 -0
- vibe_surf/langflow/services/store/schema.py +74 -0
- vibe_surf/langflow/services/store/service.py +600 -0
- vibe_surf/langflow/services/store/utils.py +67 -0
- vibe_surf/langflow/services/task/__init__.py +0 -0
- vibe_surf/langflow/services/task/backends/__init__.py +0 -0
- vibe_surf/langflow/services/task/backends/anyio.py +117 -0
- vibe_surf/langflow/services/task/backends/base.py +15 -0
- vibe_surf/langflow/services/task/backends/celery.py +29 -0
- vibe_surf/langflow/services/task/factory.py +14 -0
- vibe_surf/langflow/services/task/service.py +40 -0
- vibe_surf/langflow/services/task/temp_flow_cleanup.py +136 -0
- vibe_surf/langflow/services/task/utils.py +23 -0
- vibe_surf/langflow/services/telemetry/__init__.py +0 -0
- vibe_surf/langflow/services/telemetry/factory.py +20 -0
- vibe_surf/langflow/services/telemetry/opentelemetry.py +253 -0
- vibe_surf/langflow/services/telemetry/schema.py +45 -0
- vibe_surf/langflow/services/telemetry/service.py +281 -0
- vibe_surf/langflow/services/tracing/__init__.py +0 -0
- vibe_surf/langflow/services/tracing/arize_phoenix.py +375 -0
- vibe_surf/langflow/services/tracing/base.py +71 -0
- vibe_surf/langflow/services/tracing/factory.py +20 -0
- vibe_surf/langflow/services/tracing/langfuse.py +170 -0
- vibe_surf/langflow/services/tracing/langsmith.py +208 -0
- vibe_surf/langflow/services/tracing/langwatch.py +185 -0
- vibe_surf/langflow/services/tracing/opik.py +235 -0
- vibe_surf/langflow/services/tracing/schema.py +20 -0
- vibe_surf/langflow/services/tracing/service.py +460 -0
- vibe_surf/langflow/services/tracing/traceloop.py +244 -0
- vibe_surf/langflow/services/tracing/utils.py +29 -0
- vibe_surf/langflow/services/utils.py +246 -0
- vibe_surf/langflow/services/variable/__init__.py +0 -0
- vibe_surf/langflow/services/variable/base.py +119 -0
- vibe_surf/langflow/services/variable/constants.py +2 -0
- vibe_surf/langflow/services/variable/factory.py +28 -0
- vibe_surf/langflow/services/variable/kubernetes.py +204 -0
- vibe_surf/langflow/services/variable/kubernetes_secrets.py +193 -0
- vibe_surf/langflow/services/variable/service.py +195 -0
- vibe_surf/langflow/settings.py +12 -0
- vibe_surf/langflow/template/__init__.py +10 -0
- vibe_surf/langflow/template/field/__init__.py +0 -0
- vibe_surf/langflow/template/field/base.py +257 -0
- vibe_surf/langflow/template/field/prompt.py +2 -0
- vibe_surf/langflow/template/frontend_node/__init__.py +6 -0
- vibe_surf/langflow/template/frontend_node/base.py +214 -0
- vibe_surf/langflow/template/frontend_node/constants.py +65 -0
- vibe_surf/langflow/template/frontend_node/custom_components.py +97 -0
- vibe_surf/langflow/template/template/__init__.py +0 -0
- vibe_surf/langflow/template/template/base.py +99 -0
- vibe_surf/langflow/template/utils.py +217 -0
- vibe_surf/langflow/type_extraction/__init__.py +0 -0
- vibe_surf/langflow/type_extraction/type_extraction.py +78 -0
- vibe_surf/langflow/utils/__init__.py +0 -0
- vibe_surf/langflow/utils/async_helpers.py +42 -0
- vibe_surf/langflow/utils/component_utils.py +147 -0
- vibe_surf/langflow/utils/compression.py +19 -0
- vibe_surf/langflow/utils/concurrency.py +60 -0
- vibe_surf/langflow/utils/connection_string_parser.py +8 -0
- vibe_surf/langflow/utils/constants.py +205 -0
- vibe_surf/langflow/utils/data_structure.py +212 -0
- vibe_surf/langflow/utils/image.py +102 -0
- vibe_surf/langflow/utils/lazy_load.py +15 -0
- vibe_surf/langflow/utils/migration.py +61 -0
- vibe_surf/langflow/utils/payload.py +84 -0
- vibe_surf/langflow/utils/schemas.py +117 -0
- vibe_surf/langflow/utils/template_validation.py +284 -0
- vibe_surf/langflow/utils/util.py +479 -0
- vibe_surf/langflow/utils/util_strings.py +56 -0
- vibe_surf/langflow/utils/validate.py +489 -0
- vibe_surf/langflow/utils/version.py +72 -0
- vibe_surf/langflow/utils/voice_utils.py +92 -0
- vibe_surf/langflow/worker.py +37 -0
- vibe_surf/llm/openai_compatible.py +2 -9
- vibe_surf/logger.py +3 -3
- vibe_surf/telemetry/__init__.py +60 -0
- vibe_surf/telemetry/service.py +113 -0
- vibe_surf/telemetry/views.py +188 -0
- vibe_surf/tools/browser_use_tools.py +206 -44
- vibe_surf/tools/composio_client.py +458 -0
- vibe_surf/tools/file_system.py +7 -3
- vibe_surf/tools/mcp_client.py +21 -2
- vibe_surf/tools/utils.py +1540 -0
- vibe_surf/tools/vibesurf_tools.py +980 -975
- vibe_surf/tools/views.py +126 -8
- vibe_surf/tools/website_api/__init__.py +0 -0
- vibe_surf/tools/website_api/douyin/__init__.py +0 -0
- vibe_surf/tools/website_api/douyin/client.py +861 -0
- vibe_surf/tools/website_api/douyin/helpers.py +239 -0
- vibe_surf/tools/website_api/weibo/__init__.py +0 -0
- vibe_surf/tools/website_api/weibo/client.py +777 -0
- vibe_surf/tools/website_api/weibo/helpers.py +997 -0
- vibe_surf/tools/website_api/xhs/__init__.py +0 -0
- vibe_surf/tools/website_api/xhs/client.py +814 -0
- vibe_surf/tools/website_api/xhs/helpers.py +302 -0
- vibe_surf/tools/website_api/youtube/__init__.py +32 -0
- vibe_surf/tools/website_api/youtube/client.py +1267 -0
- vibe_surf/tools/website_api/youtube/helpers.py +420 -0
- vibe_surf/utils.py +34 -0
- vibe_surf/workflows/Browser/browser_click_element.py +189 -0
- vibe_surf/workflows/Browser/browser_drag_drop.py +81 -0
- vibe_surf/workflows/Browser/browser_evaluate_js.py +178 -0
- vibe_surf/workflows/Browser/browser_extract_content.py +197 -0
- vibe_surf/workflows/Browser/browser_focus_element.py +153 -0
- vibe_surf/workflows/Browser/browser_generate_js.py +85 -0
- vibe_surf/workflows/Browser/browser_go_back.py +45 -0
- vibe_surf/workflows/Browser/browser_go_forward.py +44 -0
- vibe_surf/workflows/Browser/browser_hover_element.py +154 -0
- vibe_surf/workflows/Browser/browser_html_content.py +73 -0
- vibe_surf/workflows/Browser/browser_input_text.py +169 -0
- vibe_surf/workflows/Browser/browser_navigate.py +50 -0
- vibe_surf/workflows/Browser/browser_new_tab.py +50 -0
- vibe_surf/workflows/Browser/browser_page_info.py +67 -0
- vibe_surf/workflows/Browser/browser_press_key.py +51 -0
- vibe_surf/workflows/Browser/browser_reload.py +44 -0
- vibe_surf/workflows/Browser/browser_scroll.py +99 -0
- vibe_surf/workflows/Browser/browser_search.py +88 -0
- vibe_surf/workflows/Browser/browser_select_options.py +94 -0
- vibe_surf/workflows/Browser/browser_session.py +54 -0
- vibe_surf/workflows/Browser/browser_take_screenshot.py +76 -0
- vibe_surf/workflows/Browser/browser_upload_file.py +178 -0
- vibe_surf/workflows/Browser/browser_wait.py +46 -0
- vibe_surf/workflows/Browser/close_browser_session.py +51 -0
- vibe_surf/workflows/FileSystem/extract_content_from_file.py +112 -0
- vibe_surf/workflows/FileSystem/load_json.py +136 -0
- vibe_surf/workflows/Integrations/composio_api.py +279 -0
- vibe_surf/workflows/Integrations/douyin.py +232 -0
- vibe_surf/workflows/Integrations/dropbox_compnent.py +11 -0
- vibe_surf/workflows/Integrations/github_composio.py +11 -0
- vibe_surf/workflows/Integrations/gmail_composio.py +38 -0
- vibe_surf/workflows/Integrations/googlecalendar_composio.py +11 -0
- vibe_surf/workflows/Integrations/googlemeet_composio.py +11 -0
- vibe_surf/workflows/Integrations/googletasks_composio.py +8 -0
- vibe_surf/workflows/Integrations/linear_composio.py +11 -0
- vibe_surf/workflows/Integrations/outlook_composio.py +11 -0
- vibe_surf/workflows/Integrations/reddit_composio.py +11 -0
- vibe_surf/workflows/Integrations/slack_composio.py +11 -0
- vibe_surf/workflows/Integrations/slackbot_composio.py +11 -0
- vibe_surf/workflows/Integrations/supabase_composio.py +11 -0
- vibe_surf/workflows/Integrations/todoist_composio.py +11 -0
- vibe_surf/workflows/Integrations/weibo.py +244 -0
- vibe_surf/workflows/Integrations/xiaohongshu.py +229 -0
- vibe_surf/workflows/Integrations/yahoo.py +103 -0
- vibe_surf/workflows/Integrations/youtube.py +251 -0
- vibe_surf/workflows/Integrations/youtube_composio.py +11 -0
- vibe_surf/workflows/VibeSurf/advanced_search.py +166 -0
- vibe_surf/workflows/VibeSurf/browser_use_agent.py +150 -0
- vibe_surf/workflows/VibeSurf/llm_profiles.py +103 -0
- vibe_surf/workflows/VibeSurf/select_dataframe.py +44 -0
- vibe_surf/workflows/VibeSurf/variable_manager.py +140 -0
- vibe_surf/workflows/VibeSurf/vibesurf_agent.py +113 -0
- vibesurf-0.2.6.dist-info/METADATA +406 -0
- vibesurf-0.2.6.dist-info/RECORD +2916 -0
- vibesurf-0.2.6.dist-info/licenses/LICENSE +22 -0
- vibesurf-0.1.26.dist-info/METADATA +0 -126
- vibesurf-0.1.26.dist-info/RECORD +0 -104
- vibesurf-0.1.26.dist-info/licenses/LICENSE +0 -201
- {vibesurf-0.1.26.dist-info → vibesurf-0.2.6.dist-info}/WHEEL +0 -0
- {vibesurf-0.1.26.dist-info → vibesurf-0.2.6.dist-info}/entry_points.txt +0 -0
- {vibesurf-0.1.26.dist-info → vibesurf-0.2.6.dist-info}/top_level.txt +0 -0
|
@@ -31,14 +31,19 @@ from browser_use.tools.views import NoParamsAction
|
|
|
31
31
|
from vibe_surf.browser.agent_browser_session import AgentBrowserSession
|
|
32
32
|
from vibe_surf.tools.views import HoverAction, ExtractionAction, FileExtractionAction, BrowserUseAgentExecution, \
|
|
33
33
|
ReportWriterTask, TodoGenerateAction, TodoModifyAction, VibeSurfDoneAction, SkillSearchAction, SkillCrawlAction, \
|
|
34
|
-
SkillSummaryAction, SkillTakeScreenshotAction, SkillDeepResearchAction, SkillCodeAction, SkillFinanceAction
|
|
34
|
+
SkillSummaryAction, SkillTakeScreenshotAction, SkillDeepResearchAction, SkillCodeAction, SkillFinanceAction, \
|
|
35
|
+
SkillXhsAction, SkillDouyinAction, SkillYoutubeAction, SkillWeiboAction, GrepContentAction, \
|
|
36
|
+
SearchToolAction, GetToolInfoAction, ExecuteExtraToolAction
|
|
35
37
|
from vibe_surf.tools.finance_tools import FinanceDataRetriever, FinanceMarkdownFormatter, FinanceMethod
|
|
36
38
|
from vibe_surf.tools.mcp_client import CustomMCPClient
|
|
39
|
+
from vibe_surf.tools.composio_client import ComposioClient
|
|
37
40
|
from vibe_surf.tools.file_system import CustomFileSystem
|
|
38
41
|
from vibe_surf.browser.browser_manager import BrowserManager
|
|
39
42
|
from vibe_surf.tools.vibesurf_registry import VibeSurfRegistry
|
|
40
43
|
from bs4 import BeautifulSoup
|
|
41
44
|
from vibe_surf.logger import get_logger
|
|
45
|
+
from vibe_surf.tools.utils import clean_html_basic
|
|
46
|
+
from vibe_surf.tools.utils import _extract_structured_content, _rank_search_results_with_llm, extract_file_content_with_llm
|
|
42
47
|
|
|
43
48
|
logger = get_logger(__name__)
|
|
44
49
|
|
|
@@ -47,125 +52,9 @@ Context = TypeVar('Context')
|
|
|
47
52
|
T = TypeVar('T', bound=BaseModel)
|
|
48
53
|
|
|
49
54
|
|
|
50
|
-
def clean_html_basic(page_html_content, max_text_length=100):
|
|
51
|
-
soup = BeautifulSoup(page_html_content, 'html.parser')
|
|
52
|
-
|
|
53
|
-
for script in soup(["script", "style"]):
|
|
54
|
-
script.decompose()
|
|
55
|
-
|
|
56
|
-
from bs4 import Comment
|
|
57
|
-
comments = soup.findAll(text=lambda text: isinstance(text, Comment))
|
|
58
|
-
for comment in comments:
|
|
59
|
-
comment.extract()
|
|
60
|
-
|
|
61
|
-
for text_node in soup.find_all(string=True):
|
|
62
|
-
if text_node.parent.name not in ['script', 'style']:
|
|
63
|
-
clean_text = ' '.join(text_node.split())
|
|
64
|
-
|
|
65
|
-
if len(clean_text) > max_text_length:
|
|
66
|
-
clean_text = clean_text[:max_text_length].rstrip() + "..."
|
|
67
|
-
|
|
68
|
-
if clean_text != text_node:
|
|
69
|
-
text_node.replace_with(clean_text)
|
|
70
|
-
|
|
71
|
-
important_attrs = ['id', 'class', 'name', 'role', 'type',
|
|
72
|
-
'colspan', 'rowspan', 'headers', 'scope',
|
|
73
|
-
'href', 'src', 'alt', 'title']
|
|
74
|
-
|
|
75
|
-
for tag in soup.find_all():
|
|
76
|
-
attrs_to_keep = {}
|
|
77
|
-
for attr in list(tag.attrs.keys()):
|
|
78
|
-
if (attr in important_attrs or
|
|
79
|
-
attr.startswith('data-') or
|
|
80
|
-
attr.startswith('aria-')):
|
|
81
|
-
attrs_to_keep[attr] = tag.attrs[attr]
|
|
82
|
-
tag.attrs = attrs_to_keep
|
|
83
|
-
|
|
84
|
-
return str(soup)
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
def get_sibling_position(node: EnhancedDOMTreeNode) -> int:
|
|
88
|
-
"""Get the position of node among its siblings with the same tag"""
|
|
89
|
-
if not node.parent_node:
|
|
90
|
-
return 1
|
|
91
|
-
|
|
92
|
-
tag_name = node.tag_name
|
|
93
|
-
position = 1
|
|
94
|
-
|
|
95
|
-
# Find siblings with same tag name before this node
|
|
96
|
-
for sibling in node.parent_node.children:
|
|
97
|
-
if sibling == node:
|
|
98
|
-
break
|
|
99
|
-
if sibling.tag_name == tag_name:
|
|
100
|
-
position += 1
|
|
101
|
-
|
|
102
|
-
return position
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
def extract_css_hints(node: EnhancedDOMTreeNode) -> dict:
|
|
106
|
-
"""Extract CSS selector construction hints"""
|
|
107
|
-
hints = {}
|
|
108
|
-
|
|
109
|
-
if "id" in node.attributes:
|
|
110
|
-
hints["id"] = f"#{node.attributes['id']}"
|
|
111
|
-
|
|
112
|
-
if "class" in node.attributes:
|
|
113
|
-
classes = node.attributes["class"].split()
|
|
114
|
-
hints["class"] = f".{'.'.join(classes[:3])}" # Limit class count
|
|
115
|
-
|
|
116
|
-
# Attribute selector hints
|
|
117
|
-
for attr in ["name", "data-testid", "type"]:
|
|
118
|
-
if attr in node.attributes:
|
|
119
|
-
hints[f"attr_{attr}"] = f"[{attr}='{node.attributes[attr]}']"
|
|
120
|
-
|
|
121
|
-
return hints
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
def convert_selector_map_for_llm(selector_map) -> dict:
|
|
125
|
-
"""
|
|
126
|
-
Convert complex selector_map to simplified format suitable for LLM understanding and JS code writing
|
|
127
|
-
"""
|
|
128
|
-
simplified_elements = []
|
|
129
|
-
|
|
130
|
-
for element_index, node in selector_map.items():
|
|
131
|
-
if node.is_visible and node.element_index is not None: # Only include visible interactive elements
|
|
132
|
-
element_info = {
|
|
133
|
-
"tag": node.tag_name,
|
|
134
|
-
"text": node.get_meaningful_text_for_llm()[:200], # Limit text length
|
|
135
|
-
|
|
136
|
-
# Selector information - most needed for JS code
|
|
137
|
-
"selectors": {
|
|
138
|
-
"xpath": node.xpath,
|
|
139
|
-
"css_hints": extract_css_hints(node), # Extract id, class etc
|
|
140
|
-
},
|
|
141
|
-
|
|
142
|
-
# Element semantics
|
|
143
|
-
"role": node.ax_node.role if node.ax_node else None,
|
|
144
|
-
"type": node.attributes.get("type"),
|
|
145
|
-
"aria_label": node.attributes.get("aria-label"),
|
|
146
|
-
|
|
147
|
-
# Key attributes
|
|
148
|
-
"attributes": {k: v for k, v in node.attributes.items()
|
|
149
|
-
if k in ["id", "class", "name", "href", "src", "value", "placeholder", "data-testid"]},
|
|
150
|
-
|
|
151
|
-
# Interactivity
|
|
152
|
-
"is_clickable": node.snapshot_node.is_clickable if node.snapshot_node else False,
|
|
153
|
-
"is_input": node.tag_name.lower() in ["input", "textarea", "select"],
|
|
154
|
-
|
|
155
|
-
# Structure information
|
|
156
|
-
"parent_tag": node.parent_node.tag_name if node.parent_node else None,
|
|
157
|
-
"position_info": f"{node.tag_name}[{get_sibling_position(node)}]"
|
|
158
|
-
}
|
|
159
|
-
simplified_elements.append(element_info)
|
|
160
|
-
|
|
161
|
-
return {
|
|
162
|
-
"page_elements": simplified_elements,
|
|
163
|
-
"total_elements": len(simplified_elements)
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
|
|
167
55
|
class VibeSurfTools:
|
|
168
|
-
def __init__(self, exclude_actions: list[str] = [], mcp_server_config: Optional[Dict[str, Any]] = None
|
|
56
|
+
def __init__(self, exclude_actions: list[str] = [], mcp_server_config: Optional[Dict[str, Any]] = None,
|
|
57
|
+
composio_client: ComposioClient = None):
|
|
169
58
|
self.registry = VibeSurfRegistry(exclude_actions)
|
|
170
59
|
self._register_file_actions()
|
|
171
60
|
self._register_browser_use_agent()
|
|
@@ -173,12 +62,27 @@ class VibeSurfTools:
|
|
|
173
62
|
self._register_todo_actions()
|
|
174
63
|
self._register_done_action()
|
|
175
64
|
self._register_skills()
|
|
65
|
+
self._register_extra_tools()
|
|
176
66
|
self.mcp_server_config = mcp_server_config
|
|
177
67
|
self.mcp_clients: Dict[str, MCPClient] = {}
|
|
68
|
+
self.composio_toolkits: Dict[str, Any] = {}
|
|
69
|
+
self.composio_client: ComposioClient = composio_client
|
|
70
|
+
|
|
71
|
+
def get_all_action_names(self, exclude_actions: Optional[list] = None) -> list[str]:
|
|
72
|
+
action_names = []
|
|
73
|
+
for action_name in self.registry.registry.actions:
|
|
74
|
+
add_flag = True
|
|
75
|
+
for ex_action_name in exclude_actions:
|
|
76
|
+
if action_name.startswith(ex_action_name) or ex_action_name in action_name:
|
|
77
|
+
add_flag = False
|
|
78
|
+
break
|
|
79
|
+
if add_flag:
|
|
80
|
+
action_names.append(action_name)
|
|
81
|
+
return action_names
|
|
178
82
|
|
|
179
83
|
def _register_skills(self):
|
|
180
84
|
@self.registry.action(
|
|
181
|
-
'
|
|
85
|
+
'Advanced search',
|
|
182
86
|
param_model=SkillSearchAction,
|
|
183
87
|
)
|
|
184
88
|
async def skill_search(
|
|
@@ -187,187 +91,109 @@ class VibeSurfTools:
|
|
|
187
91
|
page_extraction_llm: BaseChatModel
|
|
188
92
|
):
|
|
189
93
|
"""
|
|
190
|
-
|
|
94
|
+
Advanced search skill that uses Google AI model search as primary method,
|
|
95
|
+
with fallback to parallel search across all/news/videos tabs.
|
|
96
|
+
|
|
97
|
+
Primary Method: Google AI model search (udm=50) with "show more" button click
|
|
98
|
+
Fallback Method: Parallel search across all, news, and videos tabs
|
|
99
|
+
|
|
100
|
+
Args:
|
|
101
|
+
params: SkillSearchAction containing query and rank parameters
|
|
102
|
+
browser_manager: Browser manager for creating browser sessions
|
|
103
|
+
page_extraction_llm: LLM for ranking results when rank=True
|
|
104
|
+
|
|
105
|
+
Returns:
|
|
106
|
+
ActionResult with formatted search results
|
|
191
107
|
"""
|
|
192
|
-
|
|
108
|
+
from vibe_surf.tools.utils import google_ai_model_search, fallback_parallel_search
|
|
109
|
+
|
|
193
110
|
agent_ids = []
|
|
194
111
|
try:
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
# Step 1: Use LLM to analyze user intent and generate different search tasks
|
|
199
|
-
query_num = 6
|
|
200
|
-
from datetime import datetime
|
|
201
|
-
analysis_prompt = f"""
|
|
202
|
-
Analyze the user query and generate 5 different Google search strategies to comprehensively find relevant information.
|
|
112
|
+
# Step 1: Try Google AI model search first (primary method)
|
|
113
|
+
logger.info(f'🔍 Starting Google AI model search for: {params.query}')
|
|
203
114
|
|
|
204
|
-
|
|
115
|
+
# Attempt Google AI model search with udm=50
|
|
116
|
+
ai_search_results = await google_ai_model_search(browser_manager, params.query, max_results=15)
|
|
205
117
|
|
|
206
|
-
|
|
118
|
+
# Step 2: If AI search fails or returns insufficient results, use fallback method
|
|
119
|
+
if not ai_search_results or len(ai_search_results) == 0:
|
|
120
|
+
logger.info(f'🔄 Google AI search returned no results, using fallback parallel search')
|
|
207
121
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
Example format: ["query 1", "query 2", "query 3", "query 4", "query 5", "query 6"]
|
|
215
|
-
"""
|
|
216
|
-
|
|
217
|
-
from browser_use.llm.messages import SystemMessage, UserMessage
|
|
218
|
-
response = await llm.ainvoke([
|
|
219
|
-
SystemMessage(content="You are an expert at generating comprehensive search strategies."),
|
|
220
|
-
UserMessage(content=analysis_prompt)
|
|
221
|
-
])
|
|
222
|
-
|
|
223
|
-
# Parse the search queries
|
|
224
|
-
import json
|
|
225
|
-
try:
|
|
226
|
-
search_queries = json.loads(response.completion.strip())
|
|
227
|
-
if not isinstance(search_queries, list):
|
|
228
|
-
raise ValueError("Invalid search queries format")
|
|
229
|
-
search_queries = search_queries[:query_num]
|
|
230
|
-
except (json.JSONDecodeError, ValueError):
|
|
231
|
-
# Fallback to simple queries if parsing fails
|
|
232
|
-
try:
|
|
233
|
-
from json_repair import repair_json
|
|
234
|
-
search_queries_s = repair_json(response.completion.strip())
|
|
235
|
-
search_queries = json.loads(search_queries_s)
|
|
236
|
-
search_queries = search_queries[:query_num]
|
|
237
|
-
except Exception as e:
|
|
238
|
-
search_queries = [
|
|
239
|
-
params.query,
|
|
240
|
-
f"{params.query} guide",
|
|
241
|
-
f"{params.query} best practices",
|
|
242
|
-
f"{params.query} examples",
|
|
243
|
-
f"{params.query} latest news"
|
|
244
|
-
]
|
|
245
|
-
|
|
246
|
-
# Step 2: Create browser sessions for parallel searching
|
|
247
|
-
register_sessions = []
|
|
248
|
-
|
|
249
|
-
for i, query in enumerate(search_queries[:query_num]):
|
|
250
|
-
agent_id = f"search_agent_{i + 1:03d}"
|
|
251
|
-
register_sessions.append(
|
|
252
|
-
browser_manager.register_agent(agent_id, target_id=None)
|
|
253
|
-
)
|
|
254
|
-
agent_ids.append(agent_id)
|
|
255
|
-
|
|
256
|
-
agent_browser_sessions = await asyncio.gather(*register_sessions)
|
|
257
|
-
|
|
258
|
-
# Step 3: Perform parallel Google searches
|
|
259
|
-
search_tasks = []
|
|
260
|
-
for i, (browser_session, query) in enumerate(zip(agent_browser_sessions, search_queries)):
|
|
261
|
-
search_tasks.append(self._perform_google_search(browser_session, query, llm))
|
|
262
|
-
|
|
263
|
-
search_results = await asyncio.gather(*search_tasks, return_exceptions=True)
|
|
264
|
-
# Step 4: Aggregate and filter results
|
|
265
|
-
all_results = []
|
|
266
|
-
for i, result in enumerate(search_results):
|
|
267
|
-
if isinstance(result, Exception):
|
|
268
|
-
logger.error(f"Search task {i + 1} failed: {result}")
|
|
269
|
-
continue
|
|
270
|
-
if result:
|
|
271
|
-
all_results.extend(result)
|
|
272
|
-
|
|
273
|
-
# Step 4.5: Rule-based deduplication to reduce LLM processing load
|
|
274
|
-
# if all_results:
|
|
275
|
-
# deduplicated_results = self._rule_based_deduplication(all_results)
|
|
276
|
-
# logger.info(f"Rule-based deduplication: {len(all_results)} -> {len(deduplicated_results)} results")
|
|
277
|
-
# else:
|
|
278
|
-
# deduplicated_results = []
|
|
279
|
-
|
|
280
|
-
# Step 5: Use LLM only for final ranking and selection (much smaller dataset now)
|
|
281
|
-
if all_results and len(all_results) > 10:
|
|
282
|
-
# Only use LLM if we have more than 10 results to rank
|
|
283
|
-
# Create indexed results for LLM prompt
|
|
284
|
-
indexed_results = []
|
|
285
|
-
for i, result in enumerate(all_results):
|
|
286
|
-
indexed_results.append({
|
|
287
|
-
"index": i,
|
|
288
|
-
"title": result.get('title', 'Unknown Title'),
|
|
289
|
-
"url": result.get('url', 'No URL'),
|
|
290
|
-
"summary": result.get('summary', 'No summary available')
|
|
291
|
-
})
|
|
292
|
-
|
|
293
|
-
ranking_prompt = f"""
|
|
294
|
-
Rank these search results for the query "{params.query}" by relevance and value.
|
|
295
|
-
Select the TOP 10 most relevant and valuable results.
|
|
296
|
-
|
|
297
|
-
Search Results ({len(indexed_results)} total):
|
|
298
|
-
{json.dumps(indexed_results, indent=2, ensure_ascii=False)}
|
|
299
|
-
|
|
300
|
-
Return ONLY the indices of the top 10 results as a JSON array of numbers.
|
|
301
|
-
For example: [0, 5, 2, 8, 1, 9, 3, 7, 4, 6]
|
|
302
|
-
|
|
303
|
-
Format: [index1, index2, index3, ...]
|
|
304
|
-
"""
|
|
122
|
+
# Use parallel search across all, news, and videos tabs
|
|
123
|
+
fallback_results = await fallback_parallel_search(browser_manager, params.query, max_results=15)
|
|
124
|
+
all_results = fallback_results
|
|
125
|
+
else:
|
|
126
|
+
logger.info(f'✅ Google AI search found {len(ai_search_results)} results')
|
|
127
|
+
all_results = ai_search_results
|
|
305
128
|
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
UserMessage(content=ranking_prompt)
|
|
310
|
-
])
|
|
129
|
+
# Step 3: Process results based on rank parameter
|
|
130
|
+
if params.rank and all_results and len(all_results) > 10:
|
|
131
|
+
logger.info(f'🔄 Using LLM ranking for {len(all_results)} results')
|
|
311
132
|
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
#
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
try:
|
|
324
|
-
selected_indices_s = repair_json(ranking_response.completion.strip())
|
|
325
|
-
selected_indices = json.loads(selected_indices_s)
|
|
326
|
-
if isinstance(selected_indices, list):
|
|
327
|
-
valid_indices = [i for i in selected_indices if isinstance(i, int) and 0 <= i < len(all_results)][:10]
|
|
328
|
-
if valid_indices:
|
|
329
|
-
top_results = [all_results[i] for i in valid_indices]
|
|
330
|
-
else:
|
|
331
|
-
top_results = all_results[:10]
|
|
332
|
-
else:
|
|
333
|
-
top_results = all_results[:10]
|
|
334
|
-
except Exception:
|
|
335
|
-
# Fallback to first 10 results
|
|
336
|
-
top_results = all_results[:10]
|
|
337
|
-
elif all_results:
|
|
338
|
-
# If we have 10 or fewer results, skip LLM ranking
|
|
339
|
-
top_results = all_results[:10]
|
|
340
|
-
logger.info(f"Skipping LLM ranking for {len(all_results)} results (≤10)")
|
|
133
|
+
if not page_extraction_llm:
|
|
134
|
+
logger.warning("LLM not available for ranking, returning unranked results")
|
|
135
|
+
top_results = all_results[:15]
|
|
136
|
+
else:
|
|
137
|
+
# Use LLM ranking when rank=True and we have many results
|
|
138
|
+
top_results = await _rank_search_results_with_llm(
|
|
139
|
+
all_results, params.query, page_extraction_llm
|
|
140
|
+
)
|
|
141
|
+
elif params.rank and all_results and len(all_results) <= 10:
|
|
142
|
+
logger.info(f'⭐ Skipping LLM ranking for {len(all_results)} results (≤10)')
|
|
143
|
+
top_results = all_results
|
|
341
144
|
else:
|
|
342
|
-
|
|
145
|
+
# When rank=False, return results from different tabs (5 each from all, news, videos)
|
|
146
|
+
if hasattr(all_results, '__iter__') and all_results:
|
|
147
|
+
# Group results by source_tab if available, otherwise take first 15
|
|
148
|
+
tab_groups = {'all': [], 'news': [], 'videos': [], 'other': []}
|
|
149
|
+
|
|
150
|
+
for result in all_results:
|
|
151
|
+
source_tab = result.get('source_tab', 'other')
|
|
152
|
+
tab_groups[source_tab].append(result)
|
|
153
|
+
|
|
154
|
+
# Take up to 5 results from each tab
|
|
155
|
+
top_results = []
|
|
156
|
+
for tab_name in ['all', 'news', 'videos', 'other']:
|
|
157
|
+
top_results.extend(tab_groups[tab_name][:5])
|
|
158
|
+
|
|
159
|
+
# If we don't have enough results from tabs, take the first 15 overall
|
|
160
|
+
if len(top_results) < 15:
|
|
161
|
+
top_results = all_results[:15]
|
|
162
|
+
else:
|
|
163
|
+
top_results = all_results[:15] if all_results else []
|
|
343
164
|
|
|
344
|
-
# Format results for display
|
|
165
|
+
# Step 4: Format results for display
|
|
345
166
|
if top_results:
|
|
346
|
-
results_text = f"🔍
|
|
347
|
-
for i, result in enumerate(top_results
|
|
167
|
+
results_text = f"🔍 Search Results for '{params.query}':\n\n"
|
|
168
|
+
for i, result in enumerate(top_results):
|
|
348
169
|
title = result.get('title', 'Unknown Title')
|
|
349
170
|
url = result.get('url', 'No URL')
|
|
350
|
-
summary = result.get('summary', 'No
|
|
351
|
-
|
|
171
|
+
summary = result.get('summary', 'No description available')
|
|
172
|
+
|
|
173
|
+
results_text += f"{i + 1}. **{title}**\n URL: {url}\n Summary: {summary}\n\n"
|
|
352
174
|
else:
|
|
353
175
|
results_text = f"No results found for query: {params.query}"
|
|
354
176
|
|
|
355
|
-
logger.info(f'🔍 Skill Search completed for: {params.query}')
|
|
177
|
+
logger.info(f'🔍 Skill Search completed for: {params.query}, found {len(top_results)} results')
|
|
356
178
|
return ActionResult(
|
|
357
179
|
extracted_content=results_text,
|
|
358
180
|
include_extracted_content_only_once=True,
|
|
359
|
-
long_term_memory=f'
|
|
181
|
+
long_term_memory=f'Search completed for: {params.query}, found {len(top_results)} relevant results using {"AI model search" if ai_search_results else "fallback search"}'
|
|
360
182
|
)
|
|
361
183
|
|
|
362
184
|
except Exception as e:
|
|
363
185
|
logger.error(f'❌ Skill Search failed: {e}')
|
|
364
186
|
return ActionResult(error=f'Skill search failed: {str(e)}')
|
|
365
187
|
finally:
|
|
366
|
-
|
|
367
|
-
|
|
188
|
+
# Clean up browser sessions
|
|
189
|
+
for agent_id in agent_ids:
|
|
190
|
+
try:
|
|
191
|
+
await browser_manager.unregister_agent(agent_id, close_tabs=True)
|
|
192
|
+
except Exception as cleanup_error:
|
|
193
|
+
logger.warning(f"Failed to cleanup agent {agent_id}: {cleanup_error}")
|
|
368
194
|
|
|
369
195
|
@self.registry.action(
|
|
370
|
-
'
|
|
196
|
+
'',
|
|
371
197
|
param_model=SkillCrawlAction,
|
|
372
198
|
)
|
|
373
199
|
async def skill_crawl(
|
|
@@ -387,13 +213,22 @@ Format: [index1, index2, index3, ...]
|
|
|
387
213
|
browser_session = browser_manager.main_browser_session
|
|
388
214
|
|
|
389
215
|
# If tab_id is provided, switch to that tab
|
|
216
|
+
target_id = None
|
|
390
217
|
if params.tab_id:
|
|
391
218
|
target_id = await browser_session.get_target_id_from_tab_id(params.tab_id)
|
|
219
|
+
url = await browser_session.get_current_page_url()
|
|
220
|
+
current_target_id = None
|
|
221
|
+
current_url = None
|
|
222
|
+
if browser_session._dom_watchdog and browser_session._dom_watchdog.enhanced_dom_tree:
|
|
223
|
+
current_target_id = browser_session._dom_watchdog.enhanced_dom_tree.target_id
|
|
224
|
+
current_url = browser_session._dom_watchdog.enhanced_dom_tree.current_url
|
|
225
|
+
if current_target_id != target_id or url != current_url:
|
|
226
|
+
browser_session._dom_watchdog.clear_cache()
|
|
392
227
|
await browser_session.get_or_create_cdp_session(target_id, focus=True)
|
|
393
228
|
|
|
394
229
|
# Extract structured content using the existing method
|
|
395
|
-
extracted_content = await
|
|
396
|
-
browser_session, params.query, llm
|
|
230
|
+
extracted_content = await _extract_structured_content(
|
|
231
|
+
browser_session, params.query, llm, target_id=target_id
|
|
397
232
|
)
|
|
398
233
|
|
|
399
234
|
current_url = await browser_session.get_current_page_url()
|
|
@@ -420,7 +255,7 @@ Format: [index1, index2, index3, ...]
|
|
|
420
255
|
return ActionResult(error=f'Skill crawl failed: {str(e)}')
|
|
421
256
|
|
|
422
257
|
@self.registry.action(
|
|
423
|
-
'
|
|
258
|
+
'',
|
|
424
259
|
param_model=SkillSummaryAction,
|
|
425
260
|
)
|
|
426
261
|
async def skill_summary(
|
|
@@ -440,13 +275,22 @@ Format: [index1, index2, index3, ...]
|
|
|
440
275
|
browser_session = browser_manager.main_browser_session
|
|
441
276
|
|
|
442
277
|
# If tab_id is provided, switch to that tab
|
|
278
|
+
target_id = None
|
|
443
279
|
if params.tab_id:
|
|
444
280
|
target_id = await browser_session.get_target_id_from_tab_id(params.tab_id)
|
|
281
|
+
url = await browser_session.get_current_page_url()
|
|
282
|
+
current_target_id = None
|
|
283
|
+
current_url = None
|
|
284
|
+
if browser_session._dom_watchdog and browser_session._dom_watchdog.enhanced_dom_tree:
|
|
285
|
+
current_target_id = browser_session._dom_watchdog.enhanced_dom_tree.target_id
|
|
286
|
+
current_url = browser_session._dom_watchdog.enhanced_dom_tree.current_url
|
|
287
|
+
if current_target_id != target_id or url != current_url:
|
|
288
|
+
browser_session._dom_watchdog.clear_cache()
|
|
445
289
|
await browser_session.get_or_create_cdp_session(target_id, focus=True)
|
|
446
290
|
|
|
447
291
|
# Extract and summarize content
|
|
448
|
-
summary = await
|
|
449
|
-
browser_session, "Provide a comprehensive summary of this webpage", llm
|
|
292
|
+
summary = await _extract_structured_content(
|
|
293
|
+
browser_session, "Provide a comprehensive summary of this webpage", llm, target_id=target_id
|
|
450
294
|
)
|
|
451
295
|
|
|
452
296
|
current_url = await browser_session.get_current_page_url()
|
|
@@ -473,7 +317,7 @@ Format: [index1, index2, index3, ...]
|
|
|
473
317
|
return ActionResult(error=f'Skill summary failed: {str(e)}')
|
|
474
318
|
|
|
475
319
|
@self.registry.action(
|
|
476
|
-
'
|
|
320
|
+
'',
|
|
477
321
|
param_model=SkillTakeScreenshotAction,
|
|
478
322
|
)
|
|
479
323
|
async def skill_screenshot(
|
|
@@ -494,7 +338,7 @@ Format: [index1, index2, index3, ...]
|
|
|
494
338
|
await browser_session.get_or_create_cdp_session(target_id, focus=True)
|
|
495
339
|
|
|
496
340
|
# Take screenshot using browser session
|
|
497
|
-
|
|
341
|
+
screenshot_bytes = await browser_session.take_screenshot()
|
|
498
342
|
|
|
499
343
|
# Generate timestamp for filename
|
|
500
344
|
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
@@ -514,9 +358,9 @@ Format: [index1, index2, index3, ...]
|
|
|
514
358
|
filepath = screenshots_dir / filename
|
|
515
359
|
|
|
516
360
|
with open(filepath, "wb") as f:
|
|
517
|
-
f.write(
|
|
361
|
+
f.write(screenshot_bytes)
|
|
518
362
|
|
|
519
|
-
msg = f'📸 Screenshot saved to path: {str(filepath.relative_to(fs_dir))}'
|
|
363
|
+
msg = f'📸 Screenshot saved to path: [{filename}]({str(filepath.relative_to(fs_dir))})'
|
|
520
364
|
logger.info(msg)
|
|
521
365
|
return ActionResult(
|
|
522
366
|
extracted_content=msg,
|
|
@@ -530,7 +374,7 @@ Format: [index1, index2, index3, ...]
|
|
|
530
374
|
return ActionResult(error=error_msg)
|
|
531
375
|
|
|
532
376
|
@self.registry.action(
|
|
533
|
-
'
|
|
377
|
+
'Execute JavaScript code on webpage',
|
|
534
378
|
param_model=SkillCodeAction,
|
|
535
379
|
)
|
|
536
380
|
async def skill_code(
|
|
@@ -555,261 +399,23 @@ Format: [index1, index2, index3, ...]
|
|
|
555
399
|
target_id = await browser_session.get_target_id_from_tab_id(params.tab_id)
|
|
556
400
|
await browser_session.get_or_create_cdp_session(target_id, focus=True)
|
|
557
401
|
|
|
558
|
-
|
|
559
|
-
# browser_state = await browser_session.get_browser_state_summary()
|
|
560
|
-
# web_page_description = browser_state.dom_state.llm_representation()
|
|
561
|
-
|
|
562
|
-
page_html_content = await browser_session.get_html_content()
|
|
563
|
-
web_page_html = clean_html_basic(page_html_content)
|
|
564
|
-
if len(web_page_html) > 30000:
|
|
565
|
-
web_page_html = web_page_html[:24000] + "..." + web_page_html[-6000:]
|
|
566
|
-
|
|
567
|
-
# Get current page URL for context
|
|
568
|
-
current_url = await browser_session.get_current_page_url()
|
|
569
|
-
|
|
570
|
-
# Create base system prompt for JavaScript code generation
|
|
571
|
-
base_system_prompt = """You are an expert JavaScript developer specializing in browser automation and DOM manipulation.
|
|
572
|
-
|
|
573
|
-
You will be given a functional requirement or code prompt, along with the current page's DOM structure information.
|
|
574
|
-
Your task is to generate valid, executable JavaScript code that accomplishes the specified requirement.
|
|
575
|
-
|
|
576
|
-
IMPORTANT GUIDELINES:
|
|
577
|
-
This JavaScript code gets executed with Runtime.evaluate and 'returnByValue': True, 'awaitPromise': True
|
|
578
|
-
|
|
579
|
-
SYNTAX RULES - FAILURE TO FOLLOW CAUSES "Uncaught at line 0" ERRORS:
|
|
580
|
-
- ALWAYS wrap your code in IIFE: (function(){ ... })() or (async function(){ ... })() for async code
|
|
581
|
-
- ALWAYS add try-catch blocks to prevent execution errors
|
|
582
|
-
- ALWAYS use proper semicolons and valid JavaScript syntax
|
|
583
|
-
- NEVER write multiline code without proper IIFE wrapping
|
|
584
|
-
- ALWAYS validate elements exist before accessing them
|
|
585
|
-
|
|
586
|
-
EXAMPLES:
|
|
587
|
-
Use this tool when other tools do not work on the first try as expected or when a more general tool is needed, e.g. for filling a form all at once, hovering, dragging, extracting only links, extracting content from the page, press and hold, hovering, clicking on coordinates, zooming, use this if the user provides custom selectors which you can otherwise not interact with ....
|
|
588
|
-
You can also use it to explore the website.
|
|
589
|
-
- Write code to solve problems you could not solve with other tools.
|
|
590
|
-
- Don't write comments in here, no human reads that.
|
|
591
|
-
- Write only valid js code.
|
|
592
|
-
- use this to e.g. extract + filter links, convert the page to json into the format you need etc...
|
|
593
|
-
|
|
594
|
-
- limit the output otherwise your context will explode
|
|
595
|
-
- think if you deal with special elements like iframes / shadow roots etc
|
|
596
|
-
- Adopt your strategy for React Native Web, React, Angular, Vue, MUI pages etc.
|
|
597
|
-
- e.g. with synthetic events, keyboard simulation, shadow DOM, etc.
|
|
598
|
-
|
|
599
|
-
PROPER SYNTAX EXAMPLES:
|
|
600
|
-
CORRECT: (function(){ try { const el = document.querySelector('#id'); return el ? el.value : 'not found'; } catch(e) { return 'Error: ' + e.message; } })()
|
|
601
|
-
CORRECT: (async function(){ try { await new Promise(r => setTimeout(r, 100)); return 'done'; } catch(e) { return 'Error: ' + e.message; } })()
|
|
602
|
-
|
|
603
|
-
WRONG: const el = document.querySelector('#id'); el ? el.value : '';
|
|
604
|
-
WRONG: document.querySelector('#id').value
|
|
605
|
-
WRONG: Multiline code without IIFE wrapping
|
|
606
|
-
|
|
607
|
-
SHADOW DOM ACCESS EXAMPLE:
|
|
608
|
-
(function(){
|
|
609
|
-
try {
|
|
610
|
-
const hosts = document.querySelectorAll('*');
|
|
611
|
-
for (let host of hosts) {
|
|
612
|
-
if (host.shadowRoot) {
|
|
613
|
-
const el = host.shadowRoot.querySelector('#target');
|
|
614
|
-
if (el) return el.textContent;
|
|
615
|
-
}
|
|
616
|
-
}
|
|
617
|
-
return 'Not found';
|
|
618
|
-
} catch(e) {
|
|
619
|
-
return 'Error: ' + e.message;
|
|
620
|
-
}
|
|
621
|
-
})()
|
|
622
|
-
|
|
623
|
-
## Return values:
|
|
624
|
-
- Async functions (with await, promises, timeouts) are automatically handled
|
|
625
|
-
- Returns strings, numbers, booleans, and serialized objects/arrays
|
|
626
|
-
- Use JSON.stringify() for complex objects: JSON.stringify(Array.from(document.querySelectorAll('a')).map(el => el.textContent.trim()))
|
|
627
|
-
|
|
628
|
-
OUTPUT FORMAT:
|
|
629
|
-
Return ONLY the JavaScript code, no explanations or markdown formatting."""
|
|
630
|
-
|
|
631
|
-
# Initialize message history for iterative prompting
|
|
632
|
-
from browser_use.llm.messages import SystemMessage, UserMessage
|
|
633
|
-
message_history = [SystemMessage(content=base_system_prompt)]
|
|
634
|
-
|
|
635
|
-
# Initial user prompt
|
|
636
|
-
initial_user_prompt = f"""Current Page URL: {current_url}
|
|
637
|
-
|
|
638
|
-
USER REQUIREMENT: {params.code_requirement}
|
|
639
|
-
|
|
640
|
-
Web Page Html Content:
|
|
641
|
-
{web_page_html}
|
|
642
|
-
|
|
643
|
-
Generate JavaScript code to fulfill the requirement:"""
|
|
644
|
-
|
|
645
|
-
message_history.append(UserMessage(content=initial_user_prompt))
|
|
646
|
-
|
|
647
|
-
# Get CDP session for JavaScript execution
|
|
648
|
-
cdp_session = await browser_session.get_or_create_cdp_session()
|
|
649
|
-
|
|
650
|
-
# Iterative code generation and execution
|
|
651
|
-
for iteration in range(1, MAX_ITERATIONS + 1):
|
|
652
|
-
try:
|
|
653
|
-
logger.info(f'🔄 Skill Code iteration {iteration}/{MAX_ITERATIONS}')
|
|
654
|
-
|
|
655
|
-
# Generate JavaScript code using LLM with message history
|
|
656
|
-
response = await asyncio.wait_for(
|
|
657
|
-
page_extraction_llm.ainvoke(message_history),
|
|
658
|
-
timeout=60.0,
|
|
659
|
-
)
|
|
660
|
-
|
|
661
|
-
generated_js_code = response.completion.strip()
|
|
662
|
-
message_history.append(AssistantMessage(content=generated_js_code))
|
|
663
|
-
|
|
664
|
-
# Clean up the generated code (remove markdown if present)
|
|
665
|
-
if generated_js_code.startswith('```javascript'):
|
|
666
|
-
generated_js_code = generated_js_code.replace('```javascript', '').replace('```',
|
|
667
|
-
'').strip()
|
|
668
|
-
elif generated_js_code.startswith('```js'):
|
|
669
|
-
generated_js_code = generated_js_code.replace('```js', '').replace('```', '').strip()
|
|
670
|
-
elif generated_js_code.startswith('```'):
|
|
671
|
-
generated_js_code = generated_js_code.replace('```', '').strip()
|
|
672
|
-
|
|
673
|
-
# Execute the generated JavaScript code
|
|
674
|
-
try:
|
|
675
|
-
logger.info(generated_js_code)
|
|
676
|
-
# Always use awaitPromise=True - it's ignored for non-promises
|
|
677
|
-
result = await cdp_session.cdp_client.send.Runtime.evaluate(
|
|
678
|
-
params={'expression': generated_js_code, 'returnByValue': True, 'awaitPromise': True},
|
|
679
|
-
session_id=cdp_session.session_id,
|
|
680
|
-
)
|
|
402
|
+
from vibe_surf.tools.utils import generate_java_script_code
|
|
681
403
|
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
# Add error feedback to message history for next iteration
|
|
691
|
-
if iteration < MAX_ITERATIONS:
|
|
692
|
-
error_feedback = f"""The previous JavaScript code failed with error:
|
|
693
|
-
{error_msg}
|
|
694
|
-
|
|
695
|
-
Please fix the error and generate corrected JavaScript code:"""
|
|
696
|
-
message_history.append(UserMessage(content=error_feedback))
|
|
697
|
-
continue # Try next iteration
|
|
698
|
-
else:
|
|
699
|
-
# Final iteration, return error
|
|
700
|
-
msg = f'Requirement: {params.code_requirement}\n\nFinal Generated Code (Iteration {iteration}): {generated_js_code}\n\nError: {error_msg}'
|
|
701
|
-
logger.info(msg)
|
|
702
|
-
return ActionResult(error=msg)
|
|
703
|
-
|
|
704
|
-
# Get the result data
|
|
705
|
-
result_data = result.get('result', {})
|
|
706
|
-
|
|
707
|
-
# Check for wasThrown flag (backup error detection)
|
|
708
|
-
if result_data.get('wasThrown'):
|
|
709
|
-
error_msg = 'JavaScript execution failed (wasThrown=true)'
|
|
710
|
-
|
|
711
|
-
# Add error feedback to message history for next iteration
|
|
712
|
-
if iteration < MAX_ITERATIONS:
|
|
713
|
-
error_feedback = f"""The previous JavaScript code failed with error:
|
|
714
|
-
{error_msg}
|
|
715
|
-
|
|
716
|
-
Please fix the error and generate corrected JavaScript code:"""
|
|
717
|
-
message_history.append(UserMessage(content=error_feedback))
|
|
718
|
-
continue # Try next iteration
|
|
719
|
-
else:
|
|
720
|
-
# Final iteration, return error
|
|
721
|
-
msg = f'Requirement: {params.code_requirement}\n\nFinal Generated Code (Iteration {iteration}): {generated_js_code}\n\nError: {error_msg}'
|
|
722
|
-
logger.info(msg)
|
|
723
|
-
return ActionResult(error=msg)
|
|
724
|
-
|
|
725
|
-
# Get the actual value
|
|
726
|
-
value = result_data.get('value')
|
|
727
|
-
|
|
728
|
-
# Handle different value types
|
|
729
|
-
if value is None:
|
|
730
|
-
# Could be legitimate null/undefined result
|
|
731
|
-
result_text = str(value) if 'value' in result_data else 'undefined'
|
|
732
|
-
elif isinstance(value, (dict, list)):
|
|
733
|
-
# Complex objects - should be serialized by returnByValue
|
|
734
|
-
try:
|
|
735
|
-
result_text = json.dumps(value, ensure_ascii=False, indent=2)
|
|
736
|
-
except (TypeError, ValueError):
|
|
737
|
-
# Fallback for non-serializable objects
|
|
738
|
-
result_text = str(value)
|
|
739
|
-
else:
|
|
740
|
-
# Primitive values (string, number, boolean)
|
|
741
|
-
result_text = str(value)
|
|
742
|
-
|
|
743
|
-
# Check if result is empty or meaningless
|
|
744
|
-
if (not result_text or
|
|
745
|
-
result_text.strip() in ['', 'null', 'undefined', '[]', '{}'] or
|
|
746
|
-
len(result_text.strip()) == 0):
|
|
747
|
-
|
|
748
|
-
# Add empty result feedback to message history for next iteration
|
|
749
|
-
if iteration < MAX_ITERATIONS:
|
|
750
|
-
empty_feedback = f"""The previous JavaScript code executed successfully but returned empty/meaningless result:
|
|
751
|
-
Result: {result_text}
|
|
752
|
-
|
|
753
|
-
The result is empty or not useful. Please generate improved JavaScript code that returns meaningful data:"""
|
|
754
|
-
message_history.append(UserMessage(content=empty_feedback))
|
|
755
|
-
continue # Try next iteration
|
|
756
|
-
else:
|
|
757
|
-
# Final iteration, return empty result with warning
|
|
758
|
-
msg = f'Requirement: {params.code_requirement}\n\nFinal Generated Code (Iteration {iteration}): {generated_js_code}\n\nWarning: Empty or meaningless result: {result_text}'
|
|
759
|
-
logger.info(msg)
|
|
760
|
-
return ActionResult(
|
|
761
|
-
extracted_content=msg,
|
|
762
|
-
long_term_memory=f'Generated JavaScript code (iteration {iteration}) for requirement: {params.code_requirement} - Empty result warning',
|
|
763
|
-
)
|
|
764
|
-
|
|
765
|
-
# Apply length limit with better truncation
|
|
766
|
-
if len(result_text) > 30000:
|
|
767
|
-
result_text = result_text[:30000] + '\n... [Truncated after 30000 characters]'
|
|
768
|
-
|
|
769
|
-
# Success! Return the result
|
|
770
|
-
msg = f'Generated Code (Iteration {iteration}): \n```javascript\n{generated_js_code}\n```\nResult:\n```json\n {result_text}\n```\n'
|
|
771
|
-
logger.info(f'✅ Skill Code succeeded on iteration {iteration}')
|
|
772
|
-
|
|
773
|
-
return ActionResult(
|
|
774
|
-
extracted_content=msg,
|
|
775
|
-
long_term_memory=f'Generated and executed JavaScript code (iteration {iteration}) for requirement: {params.code_requirement}',
|
|
776
|
-
)
|
|
777
|
-
|
|
778
|
-
except Exception as e:
|
|
779
|
-
# CDP communication or other system errors
|
|
780
|
-
error_msg = f'Failed to execute JavaScript: {type(e).__name__}: {e}'
|
|
781
|
-
|
|
782
|
-
# Add system error feedback to message history for next iteration
|
|
783
|
-
if iteration < MAX_ITERATIONS:
|
|
784
|
-
system_error_feedback = f"""The previous JavaScript code failed to execute due to system error:
|
|
785
|
-
{error_msg}
|
|
786
|
-
|
|
787
|
-
Please generate alternative JavaScript code that avoids this system error:"""
|
|
788
|
-
message_history.append(UserMessage(content=system_error_feedback))
|
|
789
|
-
continue # Try next iteration
|
|
790
|
-
else:
|
|
791
|
-
# Final iteration, return system error
|
|
792
|
-
error_msg = f'Requirement: {params.code_requirement}\n\nFinal Generated Code (Iteration {iteration}): {generated_js_code}\n\nError: {error_msg}'
|
|
793
|
-
logger.info(error_msg)
|
|
794
|
-
return ActionResult(error=error_msg)
|
|
795
|
-
|
|
796
|
-
except Exception as e:
|
|
797
|
-
# LLM generation error
|
|
798
|
-
logger.error(f'❌ LLM generation failed on iteration {iteration}: {e}')
|
|
799
|
-
if iteration == MAX_ITERATIONS:
|
|
800
|
-
return ActionResult(
|
|
801
|
-
error=f'LLM generation failed after {MAX_ITERATIONS} iterations: {str(e)}')
|
|
802
|
-
continue # Try next iteration with same message history
|
|
803
|
-
|
|
804
|
-
# Should not reach here, but just in case
|
|
805
|
-
return ActionResult(error=f'Skill code failed after {MAX_ITERATIONS} iterations')
|
|
404
|
+
success, execute_result, js_code = await generate_java_script_code(params.code_requirement,
|
|
405
|
+
page_extraction_llm, browser_session,
|
|
406
|
+
MAX_ITERATIONS=5)
|
|
407
|
+
msg = f'```javascript\n{js_code}\n```\nResult:\n```json\n {execute_result}\n```\n'
|
|
408
|
+
if success:
|
|
409
|
+
return ActionResult(extracted_content=msg)
|
|
410
|
+
else:
|
|
411
|
+
return ActionResult(error=msg)
|
|
806
412
|
|
|
807
413
|
except Exception as e:
|
|
808
414
|
logger.error(f'❌ Skill Code failed: {e}')
|
|
809
415
|
return ActionResult(error=f'Skill code failed: {str(e)}')
|
|
810
416
|
|
|
811
417
|
@self.registry.action(
|
|
812
|
-
'
|
|
418
|
+
'Return the guideline for deep research. Please follow the guideline to do real deep research actions.',
|
|
813
419
|
param_model=NoParamsAction,
|
|
814
420
|
)
|
|
815
421
|
async def skill_deep_research(
|
|
@@ -860,7 +466,7 @@ Please generate alternative JavaScript code that avoids this system error:"""
|
|
|
860
466
|
)
|
|
861
467
|
|
|
862
468
|
@self.registry.action(
|
|
863
|
-
'
|
|
469
|
+
'Get comprehensive financial data for stocks - retrieve company information, historical prices, news, earnings, dividends, analyst recommendations and other financial data using Yahoo Finance.',
|
|
864
470
|
param_model=SkillFinanceAction,
|
|
865
471
|
)
|
|
866
472
|
async def skill_finance(
|
|
@@ -896,7 +502,7 @@ Please generate alternative JavaScript code that avoids this system error:"""
|
|
|
896
502
|
try:
|
|
897
503
|
# Default to get_info if no methods specified
|
|
898
504
|
methods = params.methods if params.methods else [FinanceMethod.GET_INFO]
|
|
899
|
-
|
|
505
|
+
|
|
900
506
|
# Convert string methods to FinanceMethod enum if needed
|
|
901
507
|
if methods and isinstance(methods[0], str):
|
|
902
508
|
try:
|
|
@@ -906,13 +512,13 @@ Please generate alternative JavaScript code that avoids this system error:"""
|
|
|
906
512
|
return ActionResult(
|
|
907
513
|
error=f'Invalid method in {methods}. Available methods: {available_methods}'
|
|
908
514
|
)
|
|
909
|
-
|
|
515
|
+
|
|
910
516
|
# Create data retriever with symbol
|
|
911
517
|
retriever = FinanceDataRetriever(params.symbol)
|
|
912
|
-
|
|
518
|
+
|
|
913
519
|
# Convert FinanceMethod enum values to strings for the retriever
|
|
914
520
|
method_strings = [method.value for method in methods]
|
|
915
|
-
|
|
521
|
+
|
|
916
522
|
# Retrieve financial data
|
|
917
523
|
financial_data = retriever.get_finance_data(
|
|
918
524
|
methods=method_strings,
|
|
@@ -922,429 +528,684 @@ Please generate alternative JavaScript code that avoids this system error:"""
|
|
|
922
528
|
interval=getattr(params, 'interval', '1d'),
|
|
923
529
|
num_news=getattr(params, 'num_news', 5)
|
|
924
530
|
)
|
|
925
|
-
|
|
531
|
+
|
|
926
532
|
# Format as markdown using the static method
|
|
927
533
|
markdown_content = FinanceMarkdownFormatter.format_finance_data(
|
|
928
534
|
symbol=params.symbol,
|
|
929
535
|
results=financial_data,
|
|
930
536
|
methods=method_strings
|
|
931
537
|
)
|
|
932
|
-
|
|
538
|
+
|
|
933
539
|
method_names = [method.value for method in methods]
|
|
934
540
|
logger.info(f'💹 Comprehensive finance data retrieved for {params.symbol} with methods: {method_names}')
|
|
935
|
-
|
|
541
|
+
|
|
936
542
|
return ActionResult(
|
|
937
543
|
extracted_content=markdown_content,
|
|
938
544
|
include_extracted_content_only_once=True,
|
|
939
545
|
long_term_memory=f'Retrieved comprehensive financial data for {params.symbol} using methods: {", ".join(method_names)}',
|
|
940
546
|
)
|
|
941
|
-
|
|
547
|
+
|
|
942
548
|
except Exception as e:
|
|
943
549
|
error_msg = f'❌ Failed to retrieve financial data for {params.symbol}: {str(e)}'
|
|
944
550
|
logger.error(error_msg)
|
|
945
|
-
return ActionResult(error=error_msg)
|
|
946
|
-
|
|
551
|
+
return ActionResult(error=error_msg, extracted_content=error_msg)
|
|
947
552
|
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
// Multiple selector strategies for different Google layouts
|
|
960
|
-
const selectors = [
|
|
961
|
-
'div[data-sokoban-container] div[data-sokoban-feature]', // Standard results
|
|
962
|
-
'div.g:not(.g-blk)', // Classic results container
|
|
963
|
-
'.tF2Cxc', // Modern result container
|
|
964
|
-
'div[data-ved] h3', // Result titles
|
|
965
|
-
];
|
|
966
|
-
|
|
967
|
-
let resultElements = [];
|
|
968
|
-
|
|
969
|
-
// Try each selector until we find results
|
|
970
|
-
for (const selector of selectors) {
|
|
971
|
-
const elements = document.querySelectorAll(selector);
|
|
972
|
-
if (elements.length > 0) {
|
|
973
|
-
resultElements = Array.from(elements).slice(0, 10); // Get up to 10 results
|
|
974
|
-
break;
|
|
975
|
-
}
|
|
976
|
-
}
|
|
977
|
-
|
|
978
|
-
// If no results found with specific selectors, try broader search
|
|
979
|
-
if (resultElements.length === 0) {
|
|
980
|
-
// Look for any divs containing h3 elements (likely search results)
|
|
981
|
-
const h3Elements = document.querySelectorAll('h3');
|
|
982
|
-
resultElements = Array.from(h3Elements)
|
|
983
|
-
.map(h3 => h3.closest('div'))
|
|
984
|
-
.filter(div => div && div.querySelector('a[href]'))
|
|
985
|
-
.slice(0, 10);
|
|
986
|
-
}
|
|
987
|
-
|
|
988
|
-
for (let i = 0; i < Math.min(resultElements.length, 10); i++) {
|
|
989
|
-
const element = resultElements[i];
|
|
990
|
-
|
|
991
|
-
// Extract title
|
|
992
|
-
let title = '';
|
|
993
|
-
const titleSelectors = ['h3', '[role="heading"]', 'a > span', '.LC20lb'];
|
|
994
|
-
for (const sel of titleSelectors) {
|
|
995
|
-
const titleEl = element.querySelector(sel);
|
|
996
|
-
if (titleEl && titleEl.textContent.trim()) {
|
|
997
|
-
title = titleEl.textContent.trim();
|
|
998
|
-
break;
|
|
999
|
-
}
|
|
1000
|
-
}
|
|
1001
|
-
|
|
1002
|
-
// Extract URL
|
|
1003
|
-
let url = '';
|
|
1004
|
-
const linkSelectors = ['a[href^="http"]', 'a[href^="/url?q="]', 'a[href]'];
|
|
1005
|
-
for (const sel of linkSelectors) {
|
|
1006
|
-
const linkEl = element.querySelector(sel);
|
|
1007
|
-
if (linkEl && linkEl.href) {
|
|
1008
|
-
url = linkEl.href;
|
|
1009
|
-
// Clean Google redirect URLs
|
|
1010
|
-
if (url.includes('/url?q=')) {
|
|
1011
|
-
const urlMatch = url.match(/[?&]q=([^&]*)/);
|
|
1012
|
-
if (urlMatch) {
|
|
1013
|
-
url = decodeURIComponent(urlMatch[1]);
|
|
1014
|
-
}
|
|
1015
|
-
}
|
|
1016
|
-
break;
|
|
1017
|
-
}
|
|
1018
|
-
}
|
|
1019
|
-
|
|
1020
|
-
// Extract summary/description
|
|
1021
|
-
let summary = '';
|
|
1022
|
-
const summarySelectors = [
|
|
1023
|
-
'.VwiC3b', // Description text
|
|
1024
|
-
'.yXK7lf', // Snippet text
|
|
1025
|
-
'[data-content-feature="1"] span',
|
|
1026
|
-
'.s', // Classic description
|
|
1027
|
-
'span:not(:has(a))'
|
|
1028
|
-
];
|
|
1029
|
-
for (const sel of summarySelectors) {
|
|
1030
|
-
const summaryEl = element.querySelector(sel);
|
|
1031
|
-
if (summaryEl && summaryEl.textContent.trim() && summaryEl.textContent.length > 10) {
|
|
1032
|
-
summary = summaryEl.textContent.trim();
|
|
1033
|
-
break;
|
|
1034
|
-
}
|
|
1035
|
-
}
|
|
1036
|
-
|
|
1037
|
-
// Only add if we have at least title or URL
|
|
1038
|
-
if (title || url) {
|
|
1039
|
-
results.push({
|
|
1040
|
-
title: title || 'No title',
|
|
1041
|
-
url: url || 'No URL',
|
|
1042
|
-
summary: summary || 'No description available'
|
|
1043
|
-
});
|
|
1044
|
-
}
|
|
1045
|
-
}
|
|
1046
|
-
|
|
1047
|
-
return JSON.stringify(results);
|
|
1048
|
-
|
|
1049
|
-
} catch (e) {
|
|
1050
|
-
return JSON.stringify([{
|
|
1051
|
-
title: 'Error extracting results',
|
|
1052
|
-
url: window.location.href,
|
|
1053
|
-
summary: 'JavaScript extraction failed: ' + e.message
|
|
1054
|
-
}]);
|
|
1055
|
-
}
|
|
1056
|
-
})()
|
|
1057
|
-
"""
|
|
1058
|
-
|
|
1059
|
-
# Execute JavaScript to extract results
|
|
1060
|
-
result = await cdp_session.cdp_client.send.Runtime.evaluate(
|
|
1061
|
-
params={'expression': js_extraction_code, 'returnByValue': True, 'awaitPromise': True},
|
|
1062
|
-
session_id=cdp_session.session_id,
|
|
1063
|
-
)
|
|
1064
|
-
|
|
1065
|
-
if result.get('exceptionDetails'):
|
|
1066
|
-
logger.warning(f"JavaScript extraction failed: {result['exceptionDetails']}")
|
|
1067
|
-
return []
|
|
1068
|
-
|
|
1069
|
-
result_data = result.get('result', {})
|
|
1070
|
-
value = result_data.get('value', '[]')
|
|
553
|
+
@self.registry.action(
|
|
554
|
+
'',
|
|
555
|
+
param_model=SkillXhsAction,
|
|
556
|
+
)
|
|
557
|
+
async def skill_xhs(
|
|
558
|
+
params: SkillXhsAction,
|
|
559
|
+
browser_manager: BrowserManager,
|
|
560
|
+
file_system: CustomFileSystem
|
|
561
|
+
):
|
|
562
|
+
"""
|
|
563
|
+
Skill: Xiaohongshu API integration
|
|
1071
564
|
|
|
565
|
+
Available methods:
|
|
566
|
+
- search_content_by_keyword: Search content by keyword with sorting options
|
|
567
|
+
- fetch_content_details: Get detailed information about specific content
|
|
568
|
+
- fetch_all_content_comments: Get all comments for specific content
|
|
569
|
+
- get_user_profile: Get user profile information
|
|
570
|
+
- fetch_all_user_content: Get all content posted by a user
|
|
571
|
+
- get_home_recommendations: Get homepage recommended content
|
|
572
|
+
"""
|
|
1072
573
|
try:
|
|
1073
|
-
|
|
1074
|
-
return extracted_results if isinstance(extracted_results, list) else []
|
|
1075
|
-
except (json.JSONDecodeError, ValueError):
|
|
1076
|
-
logger.warning(f"Failed to parse extraction results: {value}")
|
|
1077
|
-
return []
|
|
1078
|
-
|
|
1079
|
-
except Exception as e:
|
|
1080
|
-
logger.error(f"Rule-based extraction failed: {e}")
|
|
1081
|
-
return []
|
|
574
|
+
from vibe_surf.tools.website_api.xhs.client import XiaoHongShuApiClient
|
|
1082
575
|
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
576
|
+
# Initialize client
|
|
577
|
+
xhs_client = XiaoHongShuApiClient(browser_session=browser_manager.main_browser_session)
|
|
578
|
+
await xhs_client.setup()
|
|
579
|
+
|
|
580
|
+
# Parse params JSON string
|
|
581
|
+
import json
|
|
582
|
+
from json_repair import repair_json
|
|
583
|
+
try:
|
|
584
|
+
method_params = json.loads(params.params)
|
|
585
|
+
except json.JSONDecodeError:
|
|
586
|
+
method_params = json.loads(repair_json(params.params))
|
|
587
|
+
|
|
588
|
+
# Execute the requested method
|
|
589
|
+
result = None
|
|
590
|
+
if params.method == "search_content_by_keyword":
|
|
591
|
+
result = await xhs_client.search_content_by_keyword(**method_params)
|
|
592
|
+
elif params.method == "fetch_content_details":
|
|
593
|
+
result = await xhs_client.fetch_content_details(**method_params)
|
|
594
|
+
elif params.method == "fetch_all_content_comments":
|
|
595
|
+
result = await xhs_client.fetch_all_content_comments(**method_params)
|
|
596
|
+
elif params.method == "get_user_profile":
|
|
597
|
+
result = await xhs_client.get_user_profile(**method_params)
|
|
598
|
+
elif params.method == "fetch_all_user_content":
|
|
599
|
+
result = await xhs_client.fetch_all_user_content(**method_params)
|
|
600
|
+
elif params.method == "get_home_recommendations":
|
|
601
|
+
result = await xhs_client.get_home_recommendations()
|
|
602
|
+
else:
|
|
603
|
+
return ActionResult(error=f"Unknown method: {params.method}")
|
|
1109
604
|
|
|
1110
|
-
|
|
1111
|
-
""
|
|
605
|
+
# Save result to file
|
|
606
|
+
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
607
|
+
filename = f"xhs_{params.method}_{timestamp}.json"
|
|
608
|
+
filepath = file_system.get_dir() / "data" / filename
|
|
609
|
+
filepath.parent.mkdir(exist_ok=True)
|
|
610
|
+
|
|
611
|
+
with open(filepath, "w", encoding="utf-8") as f:
|
|
612
|
+
json.dump(result, f, ensure_ascii=False, indent=2)
|
|
613
|
+
|
|
614
|
+
# Format result as markdown
|
|
615
|
+
if isinstance(result, list):
|
|
616
|
+
display_count = min(5, len(result))
|
|
617
|
+
md_content = f"## Xiaohongshu {params.method.replace('_', ' ').title()}\n\n"
|
|
618
|
+
md_content += f"Showing {display_count} of {len(result)} results:\n\n"
|
|
619
|
+
for i, item in enumerate(result[:display_count]):
|
|
620
|
+
md_content += f"### Result {i + 1}\n"
|
|
621
|
+
for key, value in item.items():
|
|
622
|
+
if not value:
|
|
623
|
+
continue
|
|
624
|
+
if isinstance(value, str) and len(value) > 200:
|
|
625
|
+
md_content += f"- **{key}**: {value[:200]}...\n"
|
|
626
|
+
else:
|
|
627
|
+
md_content += f"- **{key}**: {value}\n"
|
|
628
|
+
md_content += "\n"
|
|
629
|
+
else:
|
|
630
|
+
md_content = f"## Xiaohongshu {params.method.replace('_', ' ').title()}\n\n"
|
|
631
|
+
for key, value in result.items():
|
|
632
|
+
if isinstance(value, str) and len(value) > 200:
|
|
633
|
+
md_content += f"- **{key}**: {value[:200]}...\n"
|
|
634
|
+
else:
|
|
635
|
+
md_content += f"- **{key}**: {value}\n"
|
|
636
|
+
md_content += "\n"
|
|
637
|
+
|
|
638
|
+
# Add file path to markdown
|
|
639
|
+
relative_path = str(filepath.relative_to(file_system.get_dir()))
|
|
640
|
+
md_content += f"\n> 📁 Full data saved to: [{filename}]({relative_path})\n"
|
|
641
|
+
md_content += f"> 💡 Click the link above to view all results.\n"
|
|
642
|
+
|
|
643
|
+
logger.info(f'📕 Xiaohongshu data retrieved with method: {params.method}')
|
|
644
|
+
|
|
645
|
+
# Close client
|
|
646
|
+
await xhs_client.close()
|
|
647
|
+
|
|
648
|
+
return ActionResult(
|
|
649
|
+
extracted_content=md_content
|
|
650
|
+
)
|
|
1112
651
|
|
|
1113
|
-
|
|
652
|
+
except Exception as e:
|
|
653
|
+
error_msg = f'❌ Failed to retrieve Xiaohongshu data: {str(e)}'
|
|
654
|
+
logger.error(error_msg)
|
|
655
|
+
return ActionResult(error=error_msg, extracted_content=error_msg)
|
|
1114
656
|
|
|
1115
|
-
|
|
657
|
+
@self.registry.action(
|
|
658
|
+
'',
|
|
659
|
+
param_model=SkillWeiboAction,
|
|
660
|
+
)
|
|
661
|
+
async def skill_weibo(
|
|
662
|
+
params: SkillWeiboAction,
|
|
663
|
+
browser_manager: BrowserManager,
|
|
664
|
+
file_system: CustomFileSystem
|
|
665
|
+
):
|
|
666
|
+
"""
|
|
667
|
+
Skill: Weibo API integration
|
|
668
|
+
|
|
669
|
+
Available methods:
|
|
670
|
+
- search_posts_by_keyword: Search posts by keyword with sorting options
|
|
671
|
+
- get_post_detail: Get detailed information about specific post
|
|
672
|
+
- get_all_post_comments: Get all comments for specific post
|
|
673
|
+
- get_user_info: Get user profile information
|
|
674
|
+
- get_all_user_posts: Get all posts by a user
|
|
675
|
+
- get_hot_posts: Get hot posts
|
|
676
|
+
- get_trending_list: Get trending list
|
|
677
|
+
"""
|
|
1116
678
|
try:
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
679
|
+
from vibe_surf.tools.website_api.weibo.client import WeiboApiClient
|
|
680
|
+
|
|
681
|
+
# Initialize client
|
|
682
|
+
wb_client = WeiboApiClient(browser_session=browser_manager.main_browser_session)
|
|
683
|
+
await wb_client.setup()
|
|
684
|
+
|
|
685
|
+
# Parse params JSON string
|
|
686
|
+
import json
|
|
687
|
+
from json_repair import repair_json
|
|
1121
688
|
try:
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
689
|
+
method_params = json.loads(params.params)
|
|
690
|
+
except json.JSONDecodeError:
|
|
691
|
+
method_params = json.loads(repair_json(params.params))
|
|
692
|
+
|
|
693
|
+
# Execute the requested method
|
|
694
|
+
result = None
|
|
695
|
+
if params.method == "search_posts_by_keyword":
|
|
696
|
+
result = await wb_client.search_posts_by_keyword(**method_params)
|
|
697
|
+
elif params.method == "get_post_detail":
|
|
698
|
+
result = await wb_client.get_post_detail(**method_params)
|
|
699
|
+
elif params.method == "get_all_post_comments":
|
|
700
|
+
result = await wb_client.get_all_post_comments(**method_params)
|
|
701
|
+
elif params.method == "get_user_info":
|
|
702
|
+
result = await wb_client.get_user_info(**method_params)
|
|
703
|
+
elif params.method == "get_all_user_posts":
|
|
704
|
+
result = await wb_client.get_all_user_posts(**method_params)
|
|
705
|
+
elif params.method == "get_hot_posts":
|
|
706
|
+
result = await wb_client.get_hot_posts()
|
|
707
|
+
elif params.method == "get_trending_posts":
|
|
708
|
+
result = await wb_client.get_trending_posts()
|
|
709
|
+
else:
|
|
710
|
+
return ActionResult(error=f"Unknown method: {params.method}")
|
|
1127
711
|
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
712
|
+
# Save result to file
|
|
713
|
+
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
714
|
+
filename = f"weibo_{params.method}_{timestamp}.json"
|
|
715
|
+
filepath = file_system.get_dir() / "data" / filename
|
|
716
|
+
filepath.parent.mkdir(exist_ok=True)
|
|
717
|
+
|
|
718
|
+
with open(filepath, "w", encoding="utf-8") as f:
|
|
719
|
+
json.dump(result, f, ensure_ascii=False, indent=2)
|
|
720
|
+
# Format result as markdown
|
|
721
|
+
if isinstance(result, list):
|
|
722
|
+
display_count = min(5, len(result))
|
|
723
|
+
md_content = f"## Weibo {params.method.replace('_', ' ').title()}\n\n"
|
|
724
|
+
md_content += f"Showing {display_count} of {len(result)} results:\n\n"
|
|
725
|
+
for i, item in enumerate(result[:display_count]):
|
|
726
|
+
md_content += f"### Result {i + 1}\n"
|
|
727
|
+
for key, value in item.items():
|
|
728
|
+
if not value:
|
|
729
|
+
continue
|
|
730
|
+
if isinstance(value, str) and len(value) > 200:
|
|
731
|
+
md_content += f"- **{key}**: {value[:200]}...\n"
|
|
732
|
+
else:
|
|
733
|
+
md_content += f"- **{key}**: {value}\n"
|
|
734
|
+
md_content += "\n"
|
|
735
|
+
else:
|
|
736
|
+
md_content = f"## Weibo {params.method.replace('_', ' ').title()}\n\n"
|
|
737
|
+
for key, value in result.items():
|
|
738
|
+
if isinstance(value, str) and len(value) > 200:
|
|
739
|
+
md_content += f"- **{key}**: {value[:200]}...\n"
|
|
740
|
+
else:
|
|
741
|
+
md_content += f"- **{key}**: {value}\n"
|
|
742
|
+
md_content += "\n"
|
|
1135
743
|
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
744
|
+
# Add file path to markdown
|
|
745
|
+
relative_path = str(filepath.relative_to(file_system.get_dir()))
|
|
746
|
+
md_content += f"\n> 📁 Full data saved to: [{filename}]({relative_path})\n"
|
|
747
|
+
md_content += f"> 💡 Click the link above to view all results.\n"
|
|
1139
748
|
|
|
1140
|
-
|
|
1141
|
-
"""Rule-based deduplication to reduce dataset before LLM processing"""
|
|
1142
|
-
if not results:
|
|
1143
|
-
return []
|
|
1144
|
-
|
|
1145
|
-
deduplicated = []
|
|
1146
|
-
seen_urls = set()
|
|
1147
|
-
seen_titles = set()
|
|
1148
|
-
|
|
1149
|
-
for result in results:
|
|
1150
|
-
url = result.get('url', '').strip()
|
|
1151
|
-
title = result.get('title', '').strip().lower()
|
|
1152
|
-
|
|
1153
|
-
# Skip results with missing essential data
|
|
1154
|
-
if not url or not title or url == 'No URL' or title == 'no title':
|
|
1155
|
-
continue
|
|
1156
|
-
|
|
1157
|
-
# Normalize URL for comparison (remove fragments, query params for deduplication)
|
|
1158
|
-
normalized_url = url.split('#')[0].split('?')[0].lower()
|
|
1159
|
-
|
|
1160
|
-
# Check for duplicate URLs
|
|
1161
|
-
if normalized_url in seen_urls:
|
|
1162
|
-
continue
|
|
1163
|
-
|
|
1164
|
-
# Check for very similar titles (basic similarity)
|
|
1165
|
-
title_normalized = ''.join(c for c in title if c.isalnum()).lower()
|
|
1166
|
-
if len(title_normalized) > 10: # Only check titles with substantial content
|
|
1167
|
-
similar_found = False
|
|
1168
|
-
for seen_title in seen_titles:
|
|
1169
|
-
# Simple similarity check: if 80% of characters match
|
|
1170
|
-
if len(title_normalized) > 0 and len(seen_title) > 0:
|
|
1171
|
-
common_chars = sum(1 for c in title_normalized if c in seen_title)
|
|
1172
|
-
similarity = common_chars / max(len(title_normalized), len(seen_title))
|
|
1173
|
-
if similarity > 0.8:
|
|
1174
|
-
similar_found = True
|
|
1175
|
-
break
|
|
1176
|
-
|
|
1177
|
-
if similar_found:
|
|
1178
|
-
continue
|
|
1179
|
-
|
|
1180
|
-
# Add to deduplicated results
|
|
1181
|
-
seen_urls.add(normalized_url)
|
|
1182
|
-
seen_titles.add(title_normalized)
|
|
1183
|
-
deduplicated.append(result)
|
|
1184
|
-
|
|
1185
|
-
# Sort by relevance indicators (prioritize results with longer summaries, non-generic titles)
|
|
1186
|
-
def relevance_score(result):
|
|
1187
|
-
score = 0
|
|
1188
|
-
title = result.get('title', '')
|
|
1189
|
-
summary = result.get('summary', '')
|
|
1190
|
-
|
|
1191
|
-
# Longer summaries are typically more informative
|
|
1192
|
-
score += min(len(summary), 200) / 10
|
|
1193
|
-
|
|
1194
|
-
# Non-generic titles score higher
|
|
1195
|
-
generic_terms = ['search results', 'no title', 'error', 'loading']
|
|
1196
|
-
if not any(term in title.lower() for term in generic_terms):
|
|
1197
|
-
score += 10
|
|
1198
|
-
|
|
1199
|
-
# Prefer results with actual descriptions
|
|
1200
|
-
if summary and summary != 'No description available' and len(summary) > 20:
|
|
1201
|
-
score += 5
|
|
1202
|
-
|
|
1203
|
-
return score
|
|
1204
|
-
|
|
1205
|
-
deduplicated.sort(key=relevance_score, reverse=True)
|
|
1206
|
-
return deduplicated
|
|
749
|
+
logger.info(f'🐦 Weibo data retrieved with method: {params.method}')
|
|
1207
750
|
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
MAX_CHAR_LIMIT = 30000
|
|
751
|
+
# Close client
|
|
752
|
+
await wb_client.close()
|
|
1211
753
|
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
except Exception as e:
|
|
1216
|
-
raise RuntimeError(f'Could not extract clean markdown: {type(e).__name__}')
|
|
1217
|
-
|
|
1218
|
-
# Smart truncation with context preservation
|
|
1219
|
-
if len(content) > MAX_CHAR_LIMIT:
|
|
1220
|
-
# Try to truncate at a natural break point
|
|
1221
|
-
truncate_at = MAX_CHAR_LIMIT
|
|
1222
|
-
paragraph_break = content.rfind('\n\n', MAX_CHAR_LIMIT - 500, MAX_CHAR_LIMIT)
|
|
1223
|
-
if paragraph_break > 0:
|
|
1224
|
-
truncate_at = paragraph_break
|
|
1225
|
-
else:
|
|
1226
|
-
sentence_break = content.rfind('.', MAX_CHAR_LIMIT - 200, MAX_CHAR_LIMIT)
|
|
1227
|
-
if sentence_break > 0:
|
|
1228
|
-
truncate_at = sentence_break + 1
|
|
1229
|
-
content = content[:truncate_at]
|
|
754
|
+
return ActionResult(
|
|
755
|
+
extracted_content=md_content
|
|
756
|
+
)
|
|
1230
757
|
|
|
1231
|
-
|
|
1232
|
-
|
|
758
|
+
except Exception as e:
|
|
759
|
+
import traceback
|
|
760
|
+
traceback.print_exc()
|
|
761
|
+
error_msg = f'❌ Failed to retrieve Weibo data: {str(e)}. \nMost likely you are not login, please go to: [Weibo login page](https://passport.weibo.com/sso/signin?entry=miniblog&source=miniblog) and login.'
|
|
762
|
+
logger.error(error_msg)
|
|
763
|
+
return ActionResult(error=error_msg, extracted_content=error_msg)
|
|
1233
764
|
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
765
|
+
@self.registry.action(
|
|
766
|
+
'',
|
|
767
|
+
param_model=SkillDouyinAction,
|
|
768
|
+
)
|
|
769
|
+
async def skill_douyin(
|
|
770
|
+
params: SkillDouyinAction,
|
|
771
|
+
browser_manager: BrowserManager,
|
|
772
|
+
file_system: CustomFileSystem
|
|
773
|
+
):
|
|
774
|
+
"""
|
|
775
|
+
Skill: Douyin API integration
|
|
776
|
+
|
|
777
|
+
Available methods:
|
|
778
|
+
- search_content_by_keyword: Search content by keyword with filtering options
|
|
779
|
+
- fetch_video_details: Get detailed information about specific video
|
|
780
|
+
- fetch_all_video_comments: Get all comments for specific video
|
|
781
|
+
- fetch_user_info: Get user profile information
|
|
782
|
+
- fetch_all_user_videos: Get all videos by a user
|
|
783
|
+
"""
|
|
784
|
+
try:
|
|
785
|
+
from vibe_surf.tools.website_api.douyin.client import DouyinApiClient
|
|
1237
786
|
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
- If the information relevant to the query is not available in the page, your response should mention that.
|
|
1242
|
-
- If the query asks for all items, products, etc., make sure to directly list all of them.
|
|
1243
|
-
</instructions>
|
|
787
|
+
# Initialize client
|
|
788
|
+
dy_client = DouyinApiClient(browser_session=browser_manager.main_browser_session)
|
|
789
|
+
await dy_client.setup()
|
|
1244
790
|
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
791
|
+
# Parse params JSON string
|
|
792
|
+
import json
|
|
793
|
+
from json_repair import repair_json
|
|
794
|
+
try:
|
|
795
|
+
method_params = json.loads(params.params)
|
|
796
|
+
except json.JSONDecodeError:
|
|
797
|
+
method_params = json.loads(repair_json(params.params))
|
|
798
|
+
|
|
799
|
+
# Execute the requested method
|
|
800
|
+
result = None
|
|
801
|
+
if params.method == "search_content_by_keyword":
|
|
802
|
+
result = await dy_client.search_content_by_keyword(**method_params)
|
|
803
|
+
elif params.method == "fetch_video_details":
|
|
804
|
+
result = await dy_client.fetch_video_details(**method_params)
|
|
805
|
+
elif params.method == "fetch_all_video_comments":
|
|
806
|
+
result = await dy_client.fetch_all_video_comments(**method_params)
|
|
807
|
+
elif params.method == "fetch_user_info":
|
|
808
|
+
result = await dy_client.fetch_user_info(**method_params)
|
|
809
|
+
elif params.method == "fetch_all_user_videos":
|
|
810
|
+
result = await dy_client.fetch_all_user_videos(**method_params)
|
|
811
|
+
else:
|
|
812
|
+
return ActionResult(error=f"Unknown method: {params.method}")
|
|
1250
813
|
|
|
1251
|
-
|
|
814
|
+
# Save result to file
|
|
815
|
+
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
816
|
+
filename = f"douyin_{params.method}_{timestamp}.json"
|
|
817
|
+
filepath = file_system.get_dir() / "data" / filename
|
|
818
|
+
filepath.parent.mkdir(exist_ok=True)
|
|
819
|
+
|
|
820
|
+
with open(filepath, "w", encoding="utf-8") as f:
|
|
821
|
+
json.dump(result, f, ensure_ascii=False, indent=2)
|
|
822
|
+
|
|
823
|
+
# Format result as markdown
|
|
824
|
+
if isinstance(result, list):
|
|
825
|
+
display_count = min(5, len(result))
|
|
826
|
+
md_content = f"## Douyin {params.method.replace('_', ' ').title()}\n\n"
|
|
827
|
+
md_content += f"Showing {display_count} of {len(result)} results:\n\n"
|
|
828
|
+
for i, item in enumerate(result[:display_count]):
|
|
829
|
+
md_content += f"### Result {i + 1}\n"
|
|
830
|
+
for key, value in item.items():
|
|
831
|
+
if not value:
|
|
832
|
+
continue
|
|
833
|
+
if isinstance(value, str) and len(value) > 200:
|
|
834
|
+
md_content += f"- **{key}**: {value[:200]}...\n"
|
|
835
|
+
else:
|
|
836
|
+
md_content += f"- **{key}**: {value}\n"
|
|
837
|
+
md_content += "\n"
|
|
838
|
+
else:
|
|
839
|
+
md_content = f"## Douyin {params.method.replace('_', ' ').title()}\n\n"
|
|
840
|
+
for key, value in result.items():
|
|
841
|
+
if isinstance(value, str) and len(value) > 200:
|
|
842
|
+
md_content += f"- **{key}**: {value[:200]}...\n"
|
|
843
|
+
else:
|
|
844
|
+
md_content += f"- **{key}**: {value}\n"
|
|
845
|
+
md_content += "\n"
|
|
1252
846
|
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
timeout=120.0,
|
|
1258
|
-
)
|
|
1259
|
-
return response.completion
|
|
1260
|
-
except Exception as e:
|
|
1261
|
-
logger.debug(f'Error extracting content: {e}')
|
|
1262
|
-
raise RuntimeError(str(e))
|
|
847
|
+
# Add file path to markdown
|
|
848
|
+
relative_path = str(filepath.relative_to(file_system.get_dir()))
|
|
849
|
+
md_content += f"\n> 📁 Full data saved to: [{filename}]({relative_path})\n"
|
|
850
|
+
md_content += f"> 💡 Click the link above to view all results.\n"
|
|
1263
851
|
|
|
1264
|
-
|
|
1265
|
-
self, browser_session: BrowserSession, extract_links: bool = True
|
|
1266
|
-
) -> tuple[str, dict[str, Any]]:
|
|
1267
|
-
"""Extract clean markdown from the current page."""
|
|
1268
|
-
import re
|
|
852
|
+
logger.info(f'🎵 Douyin data retrieved with method: {params.method}')
|
|
1269
853
|
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
try:
|
|
1273
|
-
body_id = await cdp_session.cdp_client.send.DOM.getDocument(session_id=cdp_session.session_id)
|
|
1274
|
-
page_html_result = await cdp_session.cdp_client.send.DOM.getOuterHTML(
|
|
1275
|
-
params={'backendNodeId': body_id['root']['backendNodeId']}, session_id=cdp_session.session_id
|
|
1276
|
-
)
|
|
1277
|
-
page_html = page_html_result['outerHTML']
|
|
1278
|
-
current_url = await browser_session.get_current_page_url()
|
|
1279
|
-
except Exception as e:
|
|
1280
|
-
raise RuntimeError(f"Couldn't extract page content: {e}")
|
|
854
|
+
# Close client
|
|
855
|
+
await dy_client.close()
|
|
1281
856
|
|
|
1282
|
-
|
|
857
|
+
return ActionResult(
|
|
858
|
+
extracted_content=md_content
|
|
859
|
+
)
|
|
1283
860
|
|
|
1284
|
-
|
|
1285
|
-
|
|
861
|
+
except Exception as e:
|
|
862
|
+
error_msg = f'❌ Failed to retrieve Douyin data: {str(e)}'
|
|
863
|
+
logger.error(error_msg)
|
|
864
|
+
return ActionResult(error=error_msg, extracted_content=error_msg)
|
|
1286
865
|
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
866
|
+
@self.registry.action(
|
|
867
|
+
"""YouTube API - If users want to know the specific content of this video, please use get_video_transcript to get detailed video content first.""",
|
|
868
|
+
param_model=SkillYoutubeAction,
|
|
869
|
+
)
|
|
870
|
+
async def skill_youtube(
|
|
871
|
+
params: SkillYoutubeAction,
|
|
872
|
+
browser_manager: BrowserManager,
|
|
873
|
+
file_system: CustomFileSystem
|
|
874
|
+
):
|
|
875
|
+
"""
|
|
876
|
+
Skill: YouTube API integration
|
|
877
|
+
|
|
878
|
+
Available methods:
|
|
879
|
+
- search_videos: Search videos by keyword
|
|
880
|
+
- get_video_details: Get detailed information about specific video
|
|
881
|
+
- get_video_comments: Get comments for specific video
|
|
882
|
+
- get_channel_info: Get channel information
|
|
883
|
+
- get_channel_videos: Get videos from specific channel
|
|
884
|
+
- get_trending_videos: Get trending videos
|
|
885
|
+
- get_video_transcript: Get video transcript in multiple languages
|
|
886
|
+
"""
|
|
887
|
+
try:
|
|
888
|
+
from vibe_surf.tools.website_api.youtube.client import YouTubeApiClient
|
|
1295
889
|
|
|
1296
|
-
|
|
890
|
+
# Initialize client
|
|
891
|
+
yt_client = YouTubeApiClient(browser_session=browser_manager.main_browser_session)
|
|
892
|
+
await yt_client.setup()
|
|
1297
893
|
|
|
1298
|
-
|
|
1299
|
-
|
|
894
|
+
# Parse params JSON string
|
|
895
|
+
import json
|
|
896
|
+
from json_repair import repair_json
|
|
897
|
+
try:
|
|
898
|
+
method_params = json.loads(params.params)
|
|
899
|
+
except json.JSONDecodeError:
|
|
900
|
+
method_params = json.loads(repair_json(params.params))
|
|
901
|
+
|
|
902
|
+
# Execute the requested method
|
|
903
|
+
result = None
|
|
904
|
+
if params.method == "search_videos":
|
|
905
|
+
result = await yt_client.search_videos(**method_params)
|
|
906
|
+
elif params.method == "get_video_details":
|
|
907
|
+
result = await yt_client.get_video_details(**method_params)
|
|
908
|
+
elif params.method == "get_video_comments":
|
|
909
|
+
result = await yt_client.get_video_comments(**method_params)
|
|
910
|
+
elif params.method == "get_channel_info":
|
|
911
|
+
result = await yt_client.get_channel_info(**method_params)
|
|
912
|
+
elif params.method == "get_channel_videos":
|
|
913
|
+
result = await yt_client.get_channel_videos(**method_params)
|
|
914
|
+
elif params.method == "get_trending_videos":
|
|
915
|
+
result = await yt_client.get_trending_videos()
|
|
916
|
+
elif params.method == "get_video_transcript":
|
|
917
|
+
result = await yt_client.get_video_transcript(**method_params)
|
|
918
|
+
else:
|
|
919
|
+
return ActionResult(error=f"Unknown method: {params.method}")
|
|
1300
920
|
|
|
1301
|
-
|
|
1302
|
-
|
|
921
|
+
# Save result to file
|
|
922
|
+
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
923
|
+
filename = f"youtube_{params.method}_{timestamp}.json"
|
|
924
|
+
filepath = file_system.get_dir() / "data" / filename
|
|
925
|
+
filepath.parent.mkdir(exist_ok=True)
|
|
926
|
+
|
|
927
|
+
with open(filepath, "w", encoding="utf-8") as f:
|
|
928
|
+
json.dump(result, f, ensure_ascii=False, indent=2)
|
|
929
|
+
|
|
930
|
+
# Format result as markdown
|
|
931
|
+
if isinstance(result, list):
|
|
932
|
+
display_count = min(5, len(result))
|
|
933
|
+
md_content = f"## YouTube {params.method.replace('_', ' ').title()}\n\n"
|
|
934
|
+
md_content += f"Showing {display_count} of {len(result)} results:\n\n"
|
|
935
|
+
for i, item in enumerate(result[:display_count]):
|
|
936
|
+
md_content += f"### Result {i + 1}\n"
|
|
937
|
+
for key, value in item.items():
|
|
938
|
+
if not value:
|
|
939
|
+
continue
|
|
940
|
+
if isinstance(value, str) and len(value) > 200:
|
|
941
|
+
md_content += f"- **{key}**: {value[:200]}...\n"
|
|
942
|
+
else:
|
|
943
|
+
md_content += f"- **{key}**: {value}\n"
|
|
944
|
+
md_content += "\n"
|
|
945
|
+
else:
|
|
946
|
+
md_content = f"## YouTube {params.method.replace('_', ' ').title()}\n\n"
|
|
947
|
+
for key, value in result.items():
|
|
948
|
+
if isinstance(value, str) and len(value) > 200:
|
|
949
|
+
md_content += f"- **{key}**: {value[:200]}...\n"
|
|
950
|
+
else:
|
|
951
|
+
md_content += f"- **{key}**: {value}\n"
|
|
952
|
+
md_content += "\n"
|
|
1303
953
|
|
|
1304
|
-
|
|
954
|
+
# Add file path to markdown
|
|
955
|
+
relative_path = str(filepath.relative_to(file_system.get_dir()))
|
|
956
|
+
md_content += f"\n> 📁 Full data saved to: [{filename}]({relative_path})\n"
|
|
957
|
+
md_content += f"> 💡 Click the link above to view all results.\n"
|
|
1305
958
|
|
|
1306
|
-
|
|
1307
|
-
stats = {
|
|
1308
|
-
'url': current_url,
|
|
1309
|
-
'original_html_chars': original_html_length,
|
|
1310
|
-
'initial_markdown_chars': initial_markdown_length,
|
|
1311
|
-
'filtered_chars_removed': chars_filtered,
|
|
1312
|
-
'final_filtered_chars': final_filtered_length,
|
|
1313
|
-
}
|
|
959
|
+
logger.info(f'🎬 YouTube data retrieved with method: {params.method}')
|
|
1314
960
|
|
|
1315
|
-
|
|
961
|
+
# Close client
|
|
962
|
+
await yt_client.close()
|
|
1316
963
|
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
964
|
+
return ActionResult(
|
|
965
|
+
extracted_content=md_content
|
|
966
|
+
)
|
|
1320
967
|
|
|
1321
|
-
|
|
968
|
+
except Exception as e:
|
|
969
|
+
error_msg = f'❌ Failed to retrieve YouTube data: {str(e)}'
|
|
970
|
+
logger.error(error_msg)
|
|
971
|
+
return ActionResult(error=error_msg, extracted_content=error_msg)
|
|
1322
972
|
|
|
1323
|
-
|
|
1324
|
-
|
|
973
|
+
def _register_extra_tools(self):
|
|
974
|
+
"""
|
|
975
|
+
Register extra tools for dynamic toolkit and MCP tool access
|
|
976
|
+
"""
|
|
977
|
+
|
|
978
|
+
@self.registry.action(
|
|
979
|
+
'Get all available toolkit types from both Composio and MCP clients',
|
|
980
|
+
param_model=NoParamsAction,
|
|
981
|
+
)
|
|
982
|
+
async def get_all_toolkit_types():
|
|
983
|
+
"""
|
|
984
|
+
Get all toolkit types available in composio_toolkits and mcp_clients
|
|
985
|
+
|
|
986
|
+
Returns:
|
|
987
|
+
ActionResult with list of all toolkit type names
|
|
988
|
+
"""
|
|
989
|
+
try:
|
|
990
|
+
toolkit_types = []
|
|
991
|
+
|
|
992
|
+
# Add Composio toolkit types
|
|
993
|
+
if self.composio_toolkits:
|
|
994
|
+
toolkit_types.extend(list(self.composio_toolkits.keys()))
|
|
995
|
+
|
|
996
|
+
# Add MCP client types
|
|
997
|
+
if self.mcp_clients:
|
|
998
|
+
toolkit_types.extend(list(self.mcp_clients.keys()))
|
|
999
|
+
|
|
1000
|
+
result_text = f"Available toolkit types ({len(toolkit_types)} total):\n\n"
|
|
1001
|
+
|
|
1002
|
+
# Group by type
|
|
1003
|
+
composio_types = list(self.composio_toolkits.keys()) if self.composio_toolkits else []
|
|
1004
|
+
mcp_types = list(self.mcp_clients.keys()) if self.mcp_clients else []
|
|
1005
|
+
|
|
1006
|
+
if composio_types:
|
|
1007
|
+
result_text += f"**Composio Toolkits ({len(composio_types)}):**\n"
|
|
1008
|
+
for toolkit in composio_types:
|
|
1009
|
+
result_text += f"- {toolkit}\n"
|
|
1010
|
+
result_text += "\n"
|
|
1011
|
+
|
|
1012
|
+
if mcp_types:
|
|
1013
|
+
result_text += f"**MCP Clients ({len(mcp_types)}):**\n"
|
|
1014
|
+
for client in mcp_types:
|
|
1015
|
+
result_text += f"- {client}\n"
|
|
1016
|
+
result_text += "\n"
|
|
1017
|
+
|
|
1018
|
+
if not toolkit_types:
|
|
1019
|
+
result_text = "No toolkit types available. Please register Composio toolkits or MCP clients first."
|
|
1020
|
+
|
|
1021
|
+
logger.info(f'📋 Retrieved {len(toolkit_types)} toolkit types')
|
|
1022
|
+
return ActionResult(
|
|
1023
|
+
extracted_content=result_text,
|
|
1024
|
+
)
|
|
1025
|
+
|
|
1026
|
+
except Exception as e:
|
|
1027
|
+
logger.error(f'❌ Failed to get toolkit types: {e}')
|
|
1028
|
+
return ActionResult(error=f'Failed to get toolkit types: {str(e)}')
|
|
1325
1029
|
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1030
|
+
@self.registry.action(
|
|
1031
|
+
'Search tools within a specific toolkit type by name and description filters',
|
|
1032
|
+
param_model=SearchToolAction,
|
|
1033
|
+
)
|
|
1034
|
+
async def search_tool(params: SearchToolAction):
|
|
1035
|
+
"""
|
|
1036
|
+
Search tools by toolkit type and filters
|
|
1037
|
+
|
|
1038
|
+
Args:
|
|
1039
|
+
params: SearchToolAction containing toolkit_type and filters
|
|
1040
|
+
|
|
1041
|
+
Returns:
|
|
1042
|
+
ActionResult with matching tools and their descriptions
|
|
1043
|
+
"""
|
|
1044
|
+
try:
|
|
1045
|
+
toolkit_type = params.toolkit_type
|
|
1046
|
+
filters = [f.lower() for f in params.filters]
|
|
1047
|
+
|
|
1048
|
+
matching_tools = []
|
|
1049
|
+
|
|
1050
|
+
# Search in registry actions with prefixes
|
|
1051
|
+
for action_name, action in self.registry.registry.actions.items():
|
|
1052
|
+
# Check if this action belongs to the specified toolkit type
|
|
1053
|
+
if toolkit_type in self.composio_toolkits and action_name.startswith(f"cpo.{toolkit_type}."):
|
|
1054
|
+
# Get tool description from param_model
|
|
1055
|
+
try:
|
|
1056
|
+
param_dict = action.param_model.model_json_schema()
|
|
1057
|
+
description = param_dict.get('description', action_name)
|
|
1058
|
+
except:
|
|
1059
|
+
description = action_name
|
|
1060
|
+
|
|
1061
|
+
# Check if any filter matches tool name or description
|
|
1062
|
+
search_text = f"{action_name} {description}".lower()
|
|
1063
|
+
if any(filter_term in search_text for filter_term in filters):
|
|
1064
|
+
matching_tools.append({
|
|
1065
|
+
'tool_name': action_name,
|
|
1066
|
+
'description': description
|
|
1067
|
+
})
|
|
1068
|
+
|
|
1069
|
+
elif toolkit_type in self.mcp_clients and action_name.startswith(f"mcp.{toolkit_type}."):
|
|
1070
|
+
# Get tool description from param_model
|
|
1071
|
+
try:
|
|
1072
|
+
param_dict = action.param_model.model_json_schema()
|
|
1073
|
+
description = param_dict.get('description', action_name)
|
|
1074
|
+
except:
|
|
1075
|
+
description = action_name
|
|
1076
|
+
|
|
1077
|
+
# Check if any filter matches tool name or description
|
|
1078
|
+
search_text = f"{action_name} {description}".lower()
|
|
1079
|
+
if any(filter_term in search_text for filter_term in filters):
|
|
1080
|
+
matching_tools.append({
|
|
1081
|
+
'tool_name': action_name,
|
|
1082
|
+
'description': description
|
|
1083
|
+
})
|
|
1084
|
+
|
|
1085
|
+
# Format results
|
|
1086
|
+
if matching_tools:
|
|
1087
|
+
result_text = f"Found {len(matching_tools)} tools in '{toolkit_type}' matching filters {params.filters}:\n\n"
|
|
1088
|
+
for i, tool in enumerate(matching_tools, 1):
|
|
1089
|
+
result_text += f"{i}. **{tool['tool_name']}**\n"
|
|
1090
|
+
result_text += f" Description: {tool['description']}\n\n"
|
|
1091
|
+
else:
|
|
1092
|
+
result_text = f"No tools found in '{toolkit_type}' matching filters {params.filters}"
|
|
1093
|
+
|
|
1094
|
+
logger.info(f'🔍 Found {len(matching_tools)} tools in {toolkit_type} matching filters')
|
|
1095
|
+
return ActionResult(
|
|
1096
|
+
extracted_content=result_text,
|
|
1097
|
+
include_extracted_content_only_once=True,
|
|
1098
|
+
long_term_memory=f'Found {len(matching_tools)} tools in {toolkit_type} matching filters: {", ".join(params.filters)}'
|
|
1099
|
+
)
|
|
1100
|
+
|
|
1101
|
+
except Exception as e:
|
|
1102
|
+
logger.error(f'❌ Failed to search tools: {e}')
|
|
1103
|
+
return ActionResult(error=f'Failed to search tools: {str(e)}')
|
|
1334
1104
|
|
|
1335
|
-
|
|
1336
|
-
|
|
1105
|
+
@self.registry.action(
|
|
1106
|
+
'Get detailed information about a specific tool including its parameters',
|
|
1107
|
+
param_model=GetToolInfoAction,
|
|
1108
|
+
)
|
|
1109
|
+
async def get_tool_info(params: GetToolInfoAction):
|
|
1110
|
+
"""
|
|
1111
|
+
Get tool information including parameter model
|
|
1112
|
+
|
|
1113
|
+
Args:
|
|
1114
|
+
params: GetToolInfoAction containing tool_name
|
|
1115
|
+
|
|
1116
|
+
Returns:
|
|
1117
|
+
ActionResult with tool parameter information
|
|
1118
|
+
"""
|
|
1119
|
+
try:
|
|
1120
|
+
tool_name = params.tool_name
|
|
1121
|
+
|
|
1122
|
+
if tool_name not in self.registry.registry.actions:
|
|
1123
|
+
return ActionResult(error=f'Tool "{tool_name}" not found in registry')
|
|
1124
|
+
|
|
1125
|
+
action = self.registry.registry.actions[tool_name]
|
|
1126
|
+
|
|
1127
|
+
# Convert param_model to dict
|
|
1128
|
+
try:
|
|
1129
|
+
param_dict = action.param_model.model_json_schema()
|
|
1130
|
+
result_text = json.dumps(param_dict, indent=2, ensure_ascii=False)
|
|
1131
|
+
except Exception as e:
|
|
1132
|
+
result_text = f"Tool: {tool_name}\nError getting parameter info: {str(e)}"
|
|
1133
|
+
|
|
1134
|
+
logger.info(f'ℹ️ Retrieved tool info for: {tool_name}')
|
|
1135
|
+
return ActionResult(
|
|
1136
|
+
extracted_content=f"```json\n{result_text}\n```"
|
|
1137
|
+
)
|
|
1138
|
+
|
|
1139
|
+
except Exception as e:
|
|
1140
|
+
logger.error(f'❌ Failed to get tool info: {e}')
|
|
1141
|
+
return ActionResult(error=f'Failed to get tool info: {str(e)}')
|
|
1337
1142
|
|
|
1338
|
-
|
|
1339
|
-
|
|
1143
|
+
@self.registry.action(
|
|
1144
|
+
'Execute a specific extra tool with provided parameters',
|
|
1145
|
+
param_model=ExecuteExtraToolAction,
|
|
1146
|
+
)
|
|
1147
|
+
async def execute_extra_tool(
|
|
1148
|
+
params: ExecuteExtraToolAction,
|
|
1149
|
+
browser_manager: BrowserManager,
|
|
1150
|
+
page_extraction_llm: BaseChatModel,
|
|
1151
|
+
file_system: CustomFileSystem
|
|
1152
|
+
):
|
|
1153
|
+
"""
|
|
1154
|
+
Execute an extra tool with given parameters
|
|
1155
|
+
|
|
1156
|
+
Args:
|
|
1157
|
+
params: ExecuteExtraToolAction containing tool_name and tool_params
|
|
1158
|
+
browser_manager: Browser manager instance
|
|
1159
|
+
page_extraction_llm: LLM instance
|
|
1160
|
+
file_system: File system instance
|
|
1161
|
+
|
|
1162
|
+
Returns:
|
|
1163
|
+
ActionResult from the executed tool
|
|
1164
|
+
"""
|
|
1165
|
+
try:
|
|
1166
|
+
tool_name = params.tool_name
|
|
1167
|
+
|
|
1168
|
+
if tool_name not in self.registry.registry.actions:
|
|
1169
|
+
return ActionResult(error=f'Tool "{tool_name}" not found in registry')
|
|
1170
|
+
|
|
1171
|
+
# Parse tool parameters
|
|
1172
|
+
try:
|
|
1173
|
+
tool_params_dict = json.loads(params.tool_params)
|
|
1174
|
+
except json.JSONDecodeError:
|
|
1175
|
+
try:
|
|
1176
|
+
tool_params_dict = json.loads(repair_json(params.tool_params))
|
|
1177
|
+
except Exception as e:
|
|
1178
|
+
return ActionResult(error=f'Failed to parse tool parameters: {str(e)}')
|
|
1179
|
+
|
|
1180
|
+
# Get the action
|
|
1181
|
+
action = self.registry.registry.actions[tool_name]
|
|
1182
|
+
|
|
1183
|
+
# Create special context (same as in act method)
|
|
1184
|
+
special_context = {
|
|
1185
|
+
'browser_manager': browser_manager,
|
|
1186
|
+
'page_extraction_llm': page_extraction_llm,
|
|
1187
|
+
'file_system': file_system,
|
|
1188
|
+
}
|
|
1189
|
+
|
|
1190
|
+
# Validate parameters
|
|
1191
|
+
try:
|
|
1192
|
+
validated_params = action.param_model(**tool_params_dict)
|
|
1193
|
+
except Exception as e:
|
|
1194
|
+
return ActionResult(error=f'Invalid parameters {tool_params_dict} for action {tool_name}: {type(e)}: {e}')
|
|
1195
|
+
|
|
1196
|
+
# Execute the tool
|
|
1197
|
+
result = await action.function(params=validated_params, **special_context)
|
|
1198
|
+
|
|
1199
|
+
logger.info(f'🔧 Successfully executed extra tool: {tool_name}')
|
|
1200
|
+
return result
|
|
1201
|
+
|
|
1202
|
+
except Exception as e:
|
|
1203
|
+
logger.error(f'❌ Failed to execute extra tool: {e}')
|
|
1204
|
+
return ActionResult(error=f'Failed to execute extra tool: {str(e)}')
|
|
1340
1205
|
|
|
1341
1206
|
def _register_browser_use_agent(self):
|
|
1342
1207
|
@self.registry.action(
|
|
1343
|
-
'Execute browser_use agent tasks.
|
|
1344
|
-
'parallel execution of multiple tasks for improved efficiency. '
|
|
1345
|
-
'Accepts a list of tasks where each task can specify a tab_id (optional), '
|
|
1346
|
-
'task description (focusing on goals and expected returns), and task_files (optional). '
|
|
1347
|
-
'Browser_use agent has strong planning and execution capabilities, only needs task descriptions and desired outcomes.',
|
|
1208
|
+
'Execute browser_use agent tasks. Please specify a tab id to an agent, if you want to let agent work on this tab.',
|
|
1348
1209
|
param_model=BrowserUseAgentExecution,
|
|
1349
1210
|
)
|
|
1350
1211
|
async def execute_browser_use_agent(
|
|
@@ -1368,8 +1229,7 @@ You will be given a query and the markdown of a webpage that has been filtered t
|
|
|
1368
1229
|
|
|
1369
1230
|
def _register_report_writer_agent(self):
|
|
1370
1231
|
@self.registry.action(
|
|
1371
|
-
'Execute report writer agent to generate HTML reports. '
|
|
1372
|
-
'Task should describe report requirements, goals, insights observed, and any hints or tips for generating the report.',
|
|
1232
|
+
'Execute report writer agent to generate HTML reports. ',
|
|
1373
1233
|
param_model=ReportWriterTask,
|
|
1374
1234
|
)
|
|
1375
1235
|
async def execute_report_writer_agent(
|
|
@@ -1568,7 +1428,7 @@ You will be given a query and the markdown of a webpage that has been filtered t
|
|
|
1568
1428
|
|
|
1569
1429
|
def _register_file_actions(self):
|
|
1570
1430
|
@self.registry.action(
|
|
1571
|
-
'
|
|
1431
|
+
''
|
|
1572
1432
|
)
|
|
1573
1433
|
async def replace_file_str(file_name: str, old_str: str, new_str: str, file_system: CustomFileSystem):
|
|
1574
1434
|
result = await file_system.replace_file_str(file_name, old_str, new_str)
|
|
@@ -1624,71 +1484,13 @@ You will be given a query and the markdown of a webpage that has been filtered t
|
|
|
1624
1484
|
if not os.path.exists(full_file_path):
|
|
1625
1485
|
full_file_path = os.path.join(str(file_system.get_dir()), file_path)
|
|
1626
1486
|
|
|
1627
|
-
#
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
# Read image file and encode to base64
|
|
1635
|
-
with open(full_file_path, 'rb') as image_file:
|
|
1636
|
-
image_data = image_file.read()
|
|
1637
|
-
image_base64 = base64.b64encode(image_data).decode('utf-8')
|
|
1638
|
-
|
|
1639
|
-
# Create content parts similar to the user's example
|
|
1640
|
-
content_parts: list[ContentPartTextParam | ContentPartImageParam] = [
|
|
1641
|
-
ContentPartTextParam(text=f"Query: {params.query}")
|
|
1642
|
-
]
|
|
1643
|
-
|
|
1644
|
-
# Add the image
|
|
1645
|
-
content_parts.append(
|
|
1646
|
-
ContentPartImageParam(
|
|
1647
|
-
image_url=ImageURL(
|
|
1648
|
-
url=f'data:{mime_type};base64,{image_base64}',
|
|
1649
|
-
media_type=mime_type,
|
|
1650
|
-
detail='high',
|
|
1651
|
-
),
|
|
1652
|
-
)
|
|
1653
|
-
)
|
|
1654
|
-
|
|
1655
|
-
# Create user message and invoke LLM
|
|
1656
|
-
user_message = UserMessage(content=content_parts, cache=True)
|
|
1657
|
-
response = await asyncio.wait_for(
|
|
1658
|
-
page_extraction_llm.ainvoke([user_message]),
|
|
1659
|
-
timeout=120.0,
|
|
1660
|
-
)
|
|
1661
|
-
|
|
1662
|
-
extracted_content = f'File: {file_path}\nQuery: {params.query}\nExtracted Content:\n{response.completion}'
|
|
1663
|
-
|
|
1664
|
-
except Exception as e:
|
|
1665
|
-
raise Exception(f'Failed to process image file {file_path}: {str(e)}')
|
|
1666
|
-
|
|
1667
|
-
else:
|
|
1668
|
-
# Handle non-image files by reading content
|
|
1669
|
-
try:
|
|
1670
|
-
file_content = await file_system.read_file(full_file_path, external_file=True)
|
|
1671
|
-
|
|
1672
|
-
# Create a simple prompt for text extraction
|
|
1673
|
-
prompt = f"""Extract the requested information from this file content.
|
|
1674
|
-
|
|
1675
|
-
Query: {params.query}
|
|
1676
|
-
|
|
1677
|
-
File: {file_path}
|
|
1678
|
-
File Content:
|
|
1679
|
-
{file_content}
|
|
1680
|
-
|
|
1681
|
-
Provide the extracted information in a clear, structured format."""
|
|
1682
|
-
|
|
1683
|
-
response = await asyncio.wait_for(
|
|
1684
|
-
page_extraction_llm.ainvoke([UserMessage(content=prompt)]),
|
|
1685
|
-
timeout=120.0,
|
|
1686
|
-
)
|
|
1687
|
-
|
|
1688
|
-
extracted_content = f'File: {file_path}\nQuery: {params.query}\nExtracted Content:\n{response.completion}'
|
|
1689
|
-
|
|
1690
|
-
except Exception as e:
|
|
1691
|
-
raise Exception(f'Failed to read file {file_path}: {str(e)}')
|
|
1487
|
+
# Use the utility function to extract content from file
|
|
1488
|
+
extracted_content = await extract_file_content_with_llm(
|
|
1489
|
+
file_path=file_path,
|
|
1490
|
+
query=params.query,
|
|
1491
|
+
llm=page_extraction_llm,
|
|
1492
|
+
file_system=file_system
|
|
1493
|
+
)
|
|
1692
1494
|
|
|
1693
1495
|
# Handle memory storage
|
|
1694
1496
|
if len(extracted_content) < 1000:
|
|
@@ -1713,7 +1515,7 @@ You will be given a query and the markdown of a webpage that has been filtered t
|
|
|
1713
1515
|
raise RuntimeError(str(e))
|
|
1714
1516
|
|
|
1715
1517
|
@self.registry.action(
|
|
1716
|
-
'
|
|
1518
|
+
''
|
|
1717
1519
|
)
|
|
1718
1520
|
async def write_file(
|
|
1719
1521
|
file_path: str,
|
|
@@ -1735,7 +1537,7 @@ You will be given a query and the markdown of a webpage that has been filtered t
|
|
|
1735
1537
|
return ActionResult(extracted_content=result, long_term_memory=result)
|
|
1736
1538
|
|
|
1737
1539
|
@self.registry.action(
|
|
1738
|
-
'
|
|
1540
|
+
'Set external_src=True to copy from external file(absolute path)to FileSystem, False to copy within FileSystem.'
|
|
1739
1541
|
)
|
|
1740
1542
|
async def copy_file(src_file_path: str, dst_file_path: str, file_system: CustomFileSystem,
|
|
1741
1543
|
external_src: bool = False):
|
|
@@ -1792,7 +1594,7 @@ You will be given a query and the markdown of a webpage that has been filtered t
|
|
|
1792
1594
|
)
|
|
1793
1595
|
|
|
1794
1596
|
@self.registry.action(
|
|
1795
|
-
'List
|
|
1597
|
+
'List a directory within the FileSystem. Use empty string "" or "." to list the root FileSystem, or provide relative path for subdirectory.'
|
|
1796
1598
|
)
|
|
1797
1599
|
async def list_directory(directory_path: str, file_system: CustomFileSystem):
|
|
1798
1600
|
result = await file_system.list_directory(directory_path)
|
|
@@ -1803,6 +1605,143 @@ You will be given a query and the markdown of a webpage that has been filtered t
|
|
|
1803
1605
|
long_term_memory=result,
|
|
1804
1606
|
)
|
|
1805
1607
|
|
|
1608
|
+
@self.registry.action(
|
|
1609
|
+
'search for query or keywords and return surrounding context',
|
|
1610
|
+
param_model=GrepContentAction,
|
|
1611
|
+
)
|
|
1612
|
+
async def grep_content_from_file(
|
|
1613
|
+
params: GrepContentAction,
|
|
1614
|
+
page_extraction_llm: BaseChatModel,
|
|
1615
|
+
file_system: CustomFileSystem,
|
|
1616
|
+
):
|
|
1617
|
+
try:
|
|
1618
|
+
# Get file path
|
|
1619
|
+
file_path = params.file_path
|
|
1620
|
+
full_file_path = file_path
|
|
1621
|
+
# Check if file exists
|
|
1622
|
+
if not os.path.exists(full_file_path):
|
|
1623
|
+
full_file_path = os.path.join(str(file_system.get_dir()), file_path)
|
|
1624
|
+
|
|
1625
|
+
# Determine if file is an image based on MIME type
|
|
1626
|
+
mime_type, _ = mimetypes.guess_type(file_path)
|
|
1627
|
+
is_image = mime_type and mime_type.startswith('image/')
|
|
1628
|
+
|
|
1629
|
+
if is_image:
|
|
1630
|
+
# Handle image files with LLM vision for OCR
|
|
1631
|
+
try:
|
|
1632
|
+
# Read image file and encode to base64
|
|
1633
|
+
with open(full_file_path, 'rb') as image_file:
|
|
1634
|
+
image_data = image_file.read()
|
|
1635
|
+
image_base64 = base64.b64encode(image_data).decode('utf-8')
|
|
1636
|
+
|
|
1637
|
+
# Create content parts for OCR
|
|
1638
|
+
content_parts: list[ContentPartTextParam | ContentPartImageParam] = [
|
|
1639
|
+
ContentPartTextParam(
|
|
1640
|
+
text="Please extract all text content from this image for search purposes. Return only the extracted text, no additional explanations.")
|
|
1641
|
+
]
|
|
1642
|
+
|
|
1643
|
+
# Add the image
|
|
1644
|
+
content_parts.append(
|
|
1645
|
+
ContentPartImageParam(
|
|
1646
|
+
image_url=ImageURL(
|
|
1647
|
+
url=f'data:{mime_type};base64,{image_base64}',
|
|
1648
|
+
media_type=mime_type,
|
|
1649
|
+
detail='high',
|
|
1650
|
+
),
|
|
1651
|
+
)
|
|
1652
|
+
)
|
|
1653
|
+
|
|
1654
|
+
# Create user message and invoke LLM for OCR
|
|
1655
|
+
user_message = UserMessage(content=content_parts, cache=True)
|
|
1656
|
+
response = await asyncio.wait_for(
|
|
1657
|
+
page_extraction_llm.ainvoke([user_message]),
|
|
1658
|
+
timeout=120.0,
|
|
1659
|
+
)
|
|
1660
|
+
|
|
1661
|
+
file_content = response.completion
|
|
1662
|
+
|
|
1663
|
+
except Exception as e:
|
|
1664
|
+
raise Exception(f'Failed to process image file {file_path} for OCR: {str(e)}')
|
|
1665
|
+
|
|
1666
|
+
else:
|
|
1667
|
+
# Handle non-image files by reading content
|
|
1668
|
+
try:
|
|
1669
|
+
file_content = await file_system.read_file(full_file_path, external_file=True)
|
|
1670
|
+
except Exception as e:
|
|
1671
|
+
raise Exception(f'Failed to read file {file_path}: {str(e)}')
|
|
1672
|
+
|
|
1673
|
+
# Perform grep search
|
|
1674
|
+
search_query = params.query.lower()
|
|
1675
|
+
context_chars = params.context_chars
|
|
1676
|
+
|
|
1677
|
+
# Find all matches with context
|
|
1678
|
+
matches = []
|
|
1679
|
+
content_lower = file_content.lower()
|
|
1680
|
+
search_start = 0
|
|
1681
|
+
|
|
1682
|
+
while True:
|
|
1683
|
+
match_pos = content_lower.find(search_query, search_start)
|
|
1684
|
+
if match_pos == -1:
|
|
1685
|
+
break
|
|
1686
|
+
|
|
1687
|
+
# Calculate context boundaries
|
|
1688
|
+
start_pos = max(0, match_pos - context_chars)
|
|
1689
|
+
end_pos = min(len(file_content), match_pos + len(search_query) + context_chars)
|
|
1690
|
+
|
|
1691
|
+
# Extract context with the match
|
|
1692
|
+
context_before = file_content[start_pos:match_pos]
|
|
1693
|
+
matched_text = file_content[match_pos:match_pos + len(search_query)]
|
|
1694
|
+
context_after = file_content[match_pos + len(search_query):end_pos]
|
|
1695
|
+
|
|
1696
|
+
# Add ellipsis if truncated
|
|
1697
|
+
if start_pos > 0:
|
|
1698
|
+
context_before = "..." + context_before
|
|
1699
|
+
if end_pos < len(file_content):
|
|
1700
|
+
context_after = context_after + "..."
|
|
1701
|
+
|
|
1702
|
+
matches.append({
|
|
1703
|
+
'context_before': context_before,
|
|
1704
|
+
'matched_text': matched_text,
|
|
1705
|
+
'context_after': context_after,
|
|
1706
|
+
'position': match_pos
|
|
1707
|
+
})
|
|
1708
|
+
|
|
1709
|
+
search_start = match_pos + 1
|
|
1710
|
+
|
|
1711
|
+
# Format results
|
|
1712
|
+
if not matches:
|
|
1713
|
+
extracted_content = f'File: {file_path}\nQuery: "{params.query}"\nResult: No matches found'
|
|
1714
|
+
else:
|
|
1715
|
+
result_text = f'File: {file_path}\nQuery: "{params.query}"\nFound {len(matches)} match(es):\n\n'
|
|
1716
|
+
|
|
1717
|
+
for i, match in enumerate(matches, 1):
|
|
1718
|
+
result_text += f"Match {i} (position: {match['position']}):\n"
|
|
1719
|
+
result_text += f"{match['context_before']}[{match['matched_text']}]{match['context_after']}\n\n"
|
|
1720
|
+
|
|
1721
|
+
extracted_content = result_text.strip()
|
|
1722
|
+
|
|
1723
|
+
# Handle memory storage
|
|
1724
|
+
if len(extracted_content) < 1000:
|
|
1725
|
+
memory = extracted_content
|
|
1726
|
+
include_extracted_content_only_once = False
|
|
1727
|
+
else:
|
|
1728
|
+
save_result = await file_system.save_extracted_content(extracted_content)
|
|
1729
|
+
memory = (
|
|
1730
|
+
f'Grep search completed in file {file_path} for query: {params.query}\nFound {len(matches)} match(es)\nContent saved to file system: {save_result}'
|
|
1731
|
+
)
|
|
1732
|
+
include_extracted_content_only_once = True
|
|
1733
|
+
|
|
1734
|
+
logger.info(f'🔍 Grep search completed in file: {file_path}, found {len(matches)} match(es)')
|
|
1735
|
+
return ActionResult(
|
|
1736
|
+
extracted_content=extracted_content,
|
|
1737
|
+
include_extracted_content_only_once=include_extracted_content_only_once,
|
|
1738
|
+
long_term_memory=memory,
|
|
1739
|
+
)
|
|
1740
|
+
|
|
1741
|
+
except Exception as e:
|
|
1742
|
+
logger.debug(f'Error grep searching content from file: {e}')
|
|
1743
|
+
raise RuntimeError(str(e))
|
|
1744
|
+
|
|
1806
1745
|
@self.registry.action(
|
|
1807
1746
|
'Create a directory within the FileSystem.'
|
|
1808
1747
|
)
|
|
@@ -1898,6 +1837,72 @@ You will be given a query and the markdown of a webpage that has been filtered t
|
|
|
1898
1837
|
self.mcp_clients.clear()
|
|
1899
1838
|
logger.info('All MCP clients unregistered and disconnected')
|
|
1900
1839
|
|
|
1840
|
+
async def register_composio_clients(self, composio_instance: Optional[Any] = None,
|
|
1841
|
+
toolkit_tools_dict: Optional[Dict[str, Any]] = None):
|
|
1842
|
+
"""
|
|
1843
|
+
Register Composio tools to the registry.
|
|
1844
|
+
|
|
1845
|
+
Args:
|
|
1846
|
+
composio_instance: Composio instance (optional, can be None initially)
|
|
1847
|
+
toolkit_tools_dict: Dict of toolkit_slug -> tools list
|
|
1848
|
+
"""
|
|
1849
|
+
try:
|
|
1850
|
+
# Initialize Composio client if not exists
|
|
1851
|
+
if self.composio_client is None:
|
|
1852
|
+
self.composio_client = ComposioClient(composio_instance=composio_instance)
|
|
1853
|
+
else:
|
|
1854
|
+
# Update the composio instance
|
|
1855
|
+
self.composio_client.update_composio_instance(composio_instance)
|
|
1856
|
+
self.composio_toolkits = toolkit_tools_dict
|
|
1857
|
+
# Register tools if we have both instance and toolkit tools
|
|
1858
|
+
if composio_instance and toolkit_tools_dict:
|
|
1859
|
+
await self.composio_client.register_to_tools(
|
|
1860
|
+
tools=self,
|
|
1861
|
+
toolkit_tools_dict=toolkit_tools_dict,
|
|
1862
|
+
prefix="cpo."
|
|
1863
|
+
)
|
|
1864
|
+
logger.info(f'Successfully registered Composio tools from {len(toolkit_tools_dict)} toolkits')
|
|
1865
|
+
elif not composio_instance:
|
|
1866
|
+
logger.info("Composio client initialized without instance - will register tools later")
|
|
1867
|
+
elif not toolkit_tools_dict:
|
|
1868
|
+
logger.info("Composio client initialized without toolkit tools - will register tools later")
|
|
1869
|
+
|
|
1870
|
+
except Exception as e:
|
|
1871
|
+
logger.error(f'Failed to register Composio clients: {str(e)}')
|
|
1872
|
+
|
|
1873
|
+
async def unregister_composio_clients(self):
|
|
1874
|
+
"""
|
|
1875
|
+
Unregister all Composio tools from the registry.
|
|
1876
|
+
"""
|
|
1877
|
+
try:
|
|
1878
|
+
if self.composio_client:
|
|
1879
|
+
self.composio_client.unregister_all_tools(self)
|
|
1880
|
+
logger.info('All Composio tools unregistered')
|
|
1881
|
+
self.composio_toolkits.clear()
|
|
1882
|
+
except Exception as e:
|
|
1883
|
+
logger.error(f'Failed to unregister Composio clients: {str(e)}')
|
|
1884
|
+
|
|
1885
|
+
async def update_composio_tools(self, composio_instance: Optional[Any] = None,
|
|
1886
|
+
toolkit_tools_dict: Optional[Dict[str, Any]] = None):
|
|
1887
|
+
"""
|
|
1888
|
+
Update Composio tools by unregistering old ones and registering new ones.
|
|
1889
|
+
|
|
1890
|
+
Args:
|
|
1891
|
+
composio_instance: Composio instance
|
|
1892
|
+
toolkit_tools_dict: Dict of toolkit_slug -> tools list
|
|
1893
|
+
"""
|
|
1894
|
+
try:
|
|
1895
|
+
# Unregister existing tools
|
|
1896
|
+
await self.unregister_composio_clients()
|
|
1897
|
+
|
|
1898
|
+
# Register new tools
|
|
1899
|
+
await self.register_composio_clients(composio_instance, toolkit_tools_dict)
|
|
1900
|
+
self.composio_toolkits = toolkit_tools_dict
|
|
1901
|
+
logger.info('Composio tools updated successfully')
|
|
1902
|
+
|
|
1903
|
+
except Exception as e:
|
|
1904
|
+
logger.error(f'Failed to update Composio tools: {str(e)}')
|
|
1905
|
+
|
|
1901
1906
|
@time_execution_sync('--act')
|
|
1902
1907
|
async def act(
|
|
1903
1908
|
self,
|