vibesurf 0.2.40__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/__init__.py +12 -0
- vibe_surf/_version.py +34 -0
- vibe_surf/agents/__init__.py +0 -0
- vibe_surf/agents/browser_use_agent.py +820 -0
- vibe_surf/agents/prompts/__init__.py +1 -0
- vibe_surf/agents/prompts/report_writer_prompt.py +73 -0
- vibe_surf/agents/prompts/vibe_surf_prompt.py +218 -0
- vibe_surf/agents/report_writer_agent.py +580 -0
- vibe_surf/agents/vibe_surf_agent.py +1839 -0
- vibe_surf/agents/views.py +123 -0
- vibe_surf/backend/__init__.py +0 -0
- vibe_surf/backend/api/__init__.py +3 -0
- vibe_surf/backend/api/activity.py +245 -0
- vibe_surf/backend/api/agent.py +38 -0
- vibe_surf/backend/api/browser.py +70 -0
- vibe_surf/backend/api/composio.py +1047 -0
- vibe_surf/backend/api/config.py +762 -0
- vibe_surf/backend/api/files.py +331 -0
- vibe_surf/backend/api/models.py +260 -0
- vibe_surf/backend/api/schedule.py +331 -0
- vibe_surf/backend/api/task.py +378 -0
- vibe_surf/backend/api/vibesurf.py +681 -0
- vibe_surf/backend/api/voices.py +481 -0
- vibe_surf/backend/database/__init__.py +13 -0
- vibe_surf/backend/database/manager.py +318 -0
- vibe_surf/backend/database/migrations/v001_initial_schema.sql +118 -0
- vibe_surf/backend/database/migrations/v002_add_agent_mode.sql +6 -0
- vibe_surf/backend/database/migrations/v003_fix_task_status_case.sql +11 -0
- vibe_surf/backend/database/migrations/v004_add_voice_profiles.sql +35 -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 +289 -0
- vibe_surf/backend/database/queries.py +1682 -0
- vibe_surf/backend/database/schemas.py +100 -0
- vibe_surf/backend/frontend/assets/MCPLangflow-Bzb6g6Zx.png +0 -0
- vibe_surf/backend/frontend/assets/SlackIcon-CE-ahjQZ.js +1 -0
- vibe_surf/backend/frontend/assets/Wikipedia-BINJ6cJv.js +1 -0
- vibe_surf/backend/frontend/assets/Wolfram-sV3o4SbF.js +1 -0
- vibe_surf/backend/frontend/assets/__vite-browser-external-BIHI7g3E.js +1 -0
- vibe_surf/backend/frontend/assets/a-arrow-down-BcX59nU3.js +6 -0
- vibe_surf/backend/frontend/assets/a-arrow-up-CN8sc-6V.js +6 -0
- vibe_surf/backend/frontend/assets/a-large-small-D4z4tJYP.js +6 -0
- vibe_surf/backend/frontend/assets/accessibility-DPNGH_So.js +6 -0
- vibe_surf/backend/frontend/assets/activity-DBaIDOIU.js +6 -0
- vibe_surf/backend/frontend/assets/air-vent-Yxf9hR-e.js +6 -0
- vibe_surf/backend/frontend/assets/airplay-Cuvu9cUw.js +6 -0
- vibe_surf/backend/frontend/assets/alarm-clock-check-Du3BsRJ-.js +6 -0
- vibe_surf/backend/frontend/assets/alarm-clock-minus-BWB_dmGd.js +6 -0
- vibe_surf/backend/frontend/assets/alarm-clock-off-DtnpjTwW.js +6 -0
- vibe_surf/backend/frontend/assets/alarm-clock-plus-CSe6BTX8.js +6 -0
- vibe_surf/backend/frontend/assets/alarm-clock-qHQG131G.js +6 -0
- vibe_surf/backend/frontend/assets/alarm-smoke-D3HVdJHb.js +6 -0
- vibe_surf/backend/frontend/assets/album-CVutl5zk.js +6 -0
- vibe_surf/backend/frontend/assets/align-center-D3KadjPz.js +6 -0
- vibe_surf/backend/frontend/assets/align-center-horizontal-DGTmV9aA.js +6 -0
- vibe_surf/backend/frontend/assets/align-center-vertical-_5fvpuKY.js +6 -0
- vibe_surf/backend/frontend/assets/align-end-horizontal-DPltJfFM.js +6 -0
- vibe_surf/backend/frontend/assets/align-end-vertical-cv9XHMvE.js +6 -0
- vibe_surf/backend/frontend/assets/align-horizontal-distribute-center-QdrwS7dg.js +6 -0
- vibe_surf/backend/frontend/assets/align-horizontal-distribute-end-Bf9IacXs.js +6 -0
- vibe_surf/backend/frontend/assets/align-horizontal-distribute-start-CyGDfN90.js +6 -0
- vibe_surf/backend/frontend/assets/align-horizontal-justify-center-BBV_-6o5.js +6 -0
- vibe_surf/backend/frontend/assets/align-horizontal-justify-end-Bisjrtt3.js +6 -0
- vibe_surf/backend/frontend/assets/align-horizontal-justify-start-D6DNaBNY.js +6 -0
- vibe_surf/backend/frontend/assets/align-horizontal-space-around-DdeziFMB.js +6 -0
- vibe_surf/backend/frontend/assets/align-horizontal-space-between-Cifkmzuk.js +6 -0
- vibe_surf/backend/frontend/assets/align-justify-CaSlCgAY.js +6 -0
- vibe_surf/backend/frontend/assets/align-left-B2G3vNyc.js +6 -0
- vibe_surf/backend/frontend/assets/align-right-MCEgT99B.js +6 -0
- vibe_surf/backend/frontend/assets/align-start-horizontal-OfSL-vcz.js +6 -0
- vibe_surf/backend/frontend/assets/align-start-vertical-Dbqlci_F.js +6 -0
- vibe_surf/backend/frontend/assets/align-vertical-distribute-center-FcLPQFYH.js +6 -0
- vibe_surf/backend/frontend/assets/align-vertical-distribute-end-CUDa17Tj.js +6 -0
- vibe_surf/backend/frontend/assets/align-vertical-distribute-start-CrZvdfpE.js +6 -0
- vibe_surf/backend/frontend/assets/align-vertical-justify-center-BOp5aU8B.js +6 -0
- vibe_surf/backend/frontend/assets/align-vertical-justify-end-CYB_ypaq.js +6 -0
- vibe_surf/backend/frontend/assets/align-vertical-justify-start-DfClLh-A.js +6 -0
- vibe_surf/backend/frontend/assets/align-vertical-space-around-DNuIeWrp.js +6 -0
- vibe_surf/backend/frontend/assets/align-vertical-space-between-38joduqw.js +6 -0
- vibe_surf/backend/frontend/assets/ambulance-C_ROlhJD.js +6 -0
- vibe_surf/backend/frontend/assets/ampersand-DvScpWJk.js +6 -0
- vibe_surf/backend/frontend/assets/ampersands-Blzum23C.js +6 -0
- vibe_surf/backend/frontend/assets/amphora-DctGCu79.js +6 -0
- vibe_surf/backend/frontend/assets/anchor-BvYXuJxo.js +6 -0
- vibe_surf/backend/frontend/assets/angry-MKPx79NH.js +6 -0
- vibe_surf/backend/frontend/assets/annoyed-CfNKx2hK.js +6 -0
- vibe_surf/backend/frontend/assets/antenna-Dw3k5fr7.js +6 -0
- vibe_surf/backend/frontend/assets/anvil-C8prcEpZ.js +6 -0
- vibe_surf/backend/frontend/assets/aperture--Tp9qCvO.js +6 -0
- vibe_surf/backend/frontend/assets/apify_white-uCJdZkTU.png +0 -0
- vibe_surf/backend/frontend/assets/app-window-Bs6eiKRX.js +6 -0
- vibe_surf/backend/frontend/assets/app-window-mac-A6qCq1Wj.js +6 -0
- vibe_surf/backend/frontend/assets/apple-CENdsQC1.js +6 -0
- vibe_surf/backend/frontend/assets/archive-DoV6rkNe.js +6 -0
- vibe_surf/backend/frontend/assets/archive-restore-C4ruGNaP.js +6 -0
- vibe_surf/backend/frontend/assets/archive-x-FSNb8ZNO.js +6 -0
- vibe_surf/backend/frontend/assets/armchair-lkSJ2diV.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-big-down-CZfd7k5o.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-big-down-dash-DZh_9yfN.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-big-left-Dl76-6oW.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-big-left-dash-B38PvMCG.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-big-right-0TeLuAvG.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-big-right-dash-Br-Q2sOD.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-big-up-DjoHZ6em.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-big-up-dash-BDk2lJYm.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-down-0-1-DaONJclu.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-down-1-0-DRP7zCqR.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-down-CVHDaeIM.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-down-a-z-D3LHPEGP.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-down-from-line-CfhMT8rR.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-down-left-CDcXzsPn.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-down-narrow-wide-Dh2ydU3g.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-down-right-C1zfcmSn.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-down-to-dot-CBTjQ2b9.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-down-to-line-D7fITr7U.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-down-up-CQFDI11z.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-down-wide-narrow-BBX8pEpl.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-down-z-a-Cj5ts4gv.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-left-DFBlqjCJ.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-left-from-line-DlmghHsU.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-left-right-D2vJTioe.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-left-to-line-mHPr5GnP.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-right-BQgpMdFf.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-right-from-line-BpW80jQb.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-right-left-S3D3MTs3.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-right-to-line-C70Kx0FS.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-up-0-1-BVQDbCWQ.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-up-1-0-DyLpNpnM.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-up-Bt1icfmQ.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-up-a-z-Y80pIZ0a.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-up-down-BklRwaY-.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-up-from-dot-DEWl1PS1.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-up-from-line-B6KTMhpQ.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-up-left-DhrKWt_9.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-up-narrow-wide-Dip17kLc.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-up-right-Cqh04sEk.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-up-to-line-BEQShaIO.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-up-wide-narrow-DIneP_zC.js +6 -0
- vibe_surf/backend/frontend/assets/arrow-up-z-a-B9wbuYNl.js +6 -0
- vibe_surf/backend/frontend/assets/arrows-up-from-line-3AFYhAJM.js +6 -0
- vibe_surf/backend/frontend/assets/asterisk-W0pDx_Rn.js +6 -0
- vibe_surf/backend/frontend/assets/at-sign-DlBejcs3.js +6 -0
- vibe_surf/backend/frontend/assets/atom-OaWlLitB.js +6 -0
- vibe_surf/backend/frontend/assets/audio-lines-CjFpWvOi.js +6 -0
- vibe_surf/backend/frontend/assets/audio-waveform-DuNZMGXb.js +6 -0
- vibe_surf/backend/frontend/assets/award-BukkHO3C.js +6 -0
- vibe_surf/backend/frontend/assets/axe-BUKyB8rX.js +6 -0
- vibe_surf/backend/frontend/assets/axis-3d-D6v4MamZ.js +6 -0
- vibe_surf/backend/frontend/assets/baby-BOnXpUZv.js +6 -0
- vibe_surf/backend/frontend/assets/backpack-6S9rBoLi.js +6 -0
- vibe_surf/backend/frontend/assets/badge-Dm_XCo4W.js +6 -0
- vibe_surf/backend/frontend/assets/badge-alert-BvvmA4mG.js +6 -0
- vibe_surf/backend/frontend/assets/badge-cent-Q-epnYHs.js +6 -0
- vibe_surf/backend/frontend/assets/badge-check-36lbyNM_.js +6 -0
- vibe_surf/backend/frontend/assets/badge-dollar-sign-tj_oF0X-.js +6 -0
- vibe_surf/backend/frontend/assets/badge-euro-D8PbE0bv.js +6 -0
- vibe_surf/backend/frontend/assets/badge-help-BFD5BXO8.js +6 -0
- vibe_surf/backend/frontend/assets/badge-indian-rupee-5080RWGL.js +6 -0
- vibe_surf/backend/frontend/assets/badge-info-COz3SiCZ.js +6 -0
- vibe_surf/backend/frontend/assets/badge-japanese-yen-DFXPoz7u.js +6 -0
- vibe_surf/backend/frontend/assets/badge-minus-BsGaVL3Q.js +6 -0
- vibe_surf/backend/frontend/assets/badge-percent-B4cd7rtn.js +6 -0
- vibe_surf/backend/frontend/assets/badge-plus-Vecq1PGK.js +6 -0
- vibe_surf/backend/frontend/assets/badge-pound-sterling-DLYMYG8U.js +6 -0
- vibe_surf/backend/frontend/assets/badge-russian-ruble-BzNr--Mh.js +6 -0
- vibe_surf/backend/frontend/assets/badge-swiss-franc-Des6zCyZ.js +6 -0
- vibe_surf/backend/frontend/assets/badge-x-CSb9nfC0.js +6 -0
- vibe_surf/backend/frontend/assets/baggage-claim-DDwV8NEi.js +6 -0
- vibe_surf/backend/frontend/assets/ban-BYnCport.js +6 -0
- vibe_surf/backend/frontend/assets/banana-Dfi3HmlS.js +6 -0
- vibe_surf/backend/frontend/assets/bandage-CcKil-EC.js +6 -0
- vibe_surf/backend/frontend/assets/banknote-XCDTM0NN.js +6 -0
- vibe_surf/backend/frontend/assets/banknote-arrow-down-DjVb8CZD.js +6 -0
- vibe_surf/backend/frontend/assets/banknote-arrow-up-C4w7omsx.js +6 -0
- vibe_surf/backend/frontend/assets/banknote-x-CQPrNAnr.js +6 -0
- vibe_surf/backend/frontend/assets/barcode-B0ezXTca.js +6 -0
- vibe_surf/backend/frontend/assets/baseline-CA8GPr3n.js +6 -0
- vibe_surf/backend/frontend/assets/bath-BdiVnLCS.js +6 -0
- vibe_surf/backend/frontend/assets/battery-CvLfXslf.js +6 -0
- vibe_surf/backend/frontend/assets/battery-charging-Bin6EfKA.js +6 -0
- vibe_surf/backend/frontend/assets/battery-full-BNcpthdG.js +6 -0
- vibe_surf/backend/frontend/assets/battery-low-0acbM2TX.js +6 -0
- vibe_surf/backend/frontend/assets/battery-medium-CqQzYkr0.js +6 -0
- vibe_surf/backend/frontend/assets/battery-plus-CeXK9ubJ.js +6 -0
- vibe_surf/backend/frontend/assets/battery-warning-BX1_YAxk.js +6 -0
- vibe_surf/backend/frontend/assets/beaker-CvU60KJI.js +6 -0
- vibe_surf/backend/frontend/assets/bean-DXSFxjpW.js +6 -0
- vibe_surf/backend/frontend/assets/bean-off-C18fYQxg.js +6 -0
- vibe_surf/backend/frontend/assets/bed-BHNMrHmJ.js +6 -0
- vibe_surf/backend/frontend/assets/bed-double-CBJd1xUT.js +6 -0
- vibe_surf/backend/frontend/assets/bed-single-C2P2u_SW.js +6 -0
- vibe_surf/backend/frontend/assets/beef-DZ7YmxJ9.js +6 -0
- vibe_surf/backend/frontend/assets/beer-DoSAYmbT.js +6 -0
- vibe_surf/backend/frontend/assets/beer-off-D2D0Eidd.js +6 -0
- vibe_surf/backend/frontend/assets/bell-CZemSa0A.js +6 -0
- vibe_surf/backend/frontend/assets/bell-dot-2U18M7J_.js +6 -0
- vibe_surf/backend/frontend/assets/bell-electric-O_6RWZVP.js +6 -0
- vibe_surf/backend/frontend/assets/bell-minus-C5OFhKIv.js +6 -0
- vibe_surf/backend/frontend/assets/bell-off-DvNAvSV6.js +6 -0
- vibe_surf/backend/frontend/assets/bell-plus-CtbF4PY7.js +6 -0
- vibe_surf/backend/frontend/assets/bell-ring-2jzOxMlO.js +6 -0
- vibe_surf/backend/frontend/assets/between-horizontal-end-IrrEJxkg.js +6 -0
- vibe_surf/backend/frontend/assets/between-horizontal-start-DB4hrTYq.js +6 -0
- vibe_surf/backend/frontend/assets/between-vertical-end-DeC10NGd.js +6 -0
- vibe_surf/backend/frontend/assets/between-vertical-start-Byocansl.js +6 -0
- vibe_surf/backend/frontend/assets/biceps-flexed-ByGLeOXg.js +6 -0
- vibe_surf/backend/frontend/assets/bike-C2kR3eV7.js +6 -0
- vibe_surf/backend/frontend/assets/binary-ClycWsS0.js +6 -0
- vibe_surf/backend/frontend/assets/binoculars-DJ0HCEbV.js +6 -0
- vibe_surf/backend/frontend/assets/biohazard-DIYTxz4-.js +6 -0
- vibe_surf/backend/frontend/assets/bird-DStHDBlx.js +6 -0
- vibe_surf/backend/frontend/assets/bitcoin-CrUhJt55.js +6 -0
- vibe_surf/backend/frontend/assets/blend-Bf3c4w6z.js +6 -0
- vibe_surf/backend/frontend/assets/blinds-Ni4n5PSf.js +6 -0
- vibe_surf/backend/frontend/assets/blocks-B3WNZe2n.js +6 -0
- vibe_surf/backend/frontend/assets/bluetooth-Ccoiwmlv.js +6 -0
- vibe_surf/backend/frontend/assets/bluetooth-connected-DFiYewdk.js +6 -0
- vibe_surf/backend/frontend/assets/bluetooth-off-CWk55vIU.js +6 -0
- vibe_surf/backend/frontend/assets/bluetooth-searching-B7AZU8fL.js +6 -0
- vibe_surf/backend/frontend/assets/bold-DLSX_sXx.js +6 -0
- vibe_surf/backend/frontend/assets/bolt-BtrJOWZT.js +6 -0
- vibe_surf/backend/frontend/assets/bomb-qB5OKrmG.js +6 -0
- vibe_surf/backend/frontend/assets/bone-CwzjO8Q3.js +6 -0
- vibe_surf/backend/frontend/assets/book-CFsU8BHi.js +6 -0
- vibe_surf/backend/frontend/assets/book-a-CZdxqQip.js +6 -0
- vibe_surf/backend/frontend/assets/book-audio-C4vaYZSH.js +6 -0
- vibe_surf/backend/frontend/assets/book-check-Bcz9b-8J.js +6 -0
- vibe_surf/backend/frontend/assets/book-copy-CXk7oCU5.js +6 -0
- vibe_surf/backend/frontend/assets/book-dashed-emdeAmuI.js +6 -0
- vibe_surf/backend/frontend/assets/book-down-Blr3MxEN.js +6 -0
- vibe_surf/backend/frontend/assets/book-headphones-gUzmqrJf.js +6 -0
- vibe_surf/backend/frontend/assets/book-heart-D0TpFook.js +6 -0
- vibe_surf/backend/frontend/assets/book-image-CDh3XrAm.js +6 -0
- vibe_surf/backend/frontend/assets/book-key-DQV2MwOV.js +6 -0
- vibe_surf/backend/frontend/assets/book-lock-Df4Wh5kT.js +6 -0
- vibe_surf/backend/frontend/assets/book-marked-j4_WwgAf.js +6 -0
- vibe_surf/backend/frontend/assets/book-minus-DhTrzC1g.js +6 -0
- vibe_surf/backend/frontend/assets/book-open-BzAE9-Jg.js +6 -0
- vibe_surf/backend/frontend/assets/book-open-check-Uqc5cpgA.js +6 -0
- vibe_surf/backend/frontend/assets/book-open-text-BWiD6pH2.js +6 -0
- vibe_surf/backend/frontend/assets/book-plus-BSzMVarr.js +6 -0
- vibe_surf/backend/frontend/assets/book-text-CWHsjw1-.js +6 -0
- vibe_surf/backend/frontend/assets/book-type-9PjTGoqg.js +6 -0
- vibe_surf/backend/frontend/assets/book-up-2-B_62ZUyn.js +6 -0
- vibe_surf/backend/frontend/assets/book-up-BNLPeI--.js +6 -0
- vibe_surf/backend/frontend/assets/book-user-BGJrncKZ.js +6 -0
- vibe_surf/backend/frontend/assets/book-x-BIuvvbQ9.js +6 -0
- vibe_surf/backend/frontend/assets/bookmark-C6GKCgas.js +6 -0
- vibe_surf/backend/frontend/assets/bookmark-check-D2v52wS_.js +6 -0
- vibe_surf/backend/frontend/assets/bookmark-minus-5SruaRWe.js +6 -0
- vibe_surf/backend/frontend/assets/bookmark-plus-CDB4EbYF.js +6 -0
- vibe_surf/backend/frontend/assets/bookmark-x-DawiyeWt.js +6 -0
- vibe_surf/backend/frontend/assets/boom-box-CjxUDyUJ.js +6 -0
- vibe_surf/backend/frontend/assets/bot-BcNQyjDe.js +6 -0
- vibe_surf/backend/frontend/assets/bot-message-square-CJLeai4W.js +6 -0
- vibe_surf/backend/frontend/assets/bot-off-CYborYVu.js +6 -0
- vibe_surf/backend/frontend/assets/bow-arrow-DINnk6sV.js +6 -0
- vibe_surf/backend/frontend/assets/box-C8qv4POs.js +6 -0
- vibe_surf/backend/frontend/assets/boxes-C1Wz5G2m.js +6 -0
- vibe_surf/backend/frontend/assets/braces-BL19F0qy.js +6 -0
- vibe_surf/backend/frontend/assets/brackets-DXYKs2wJ.js +6 -0
- vibe_surf/backend/frontend/assets/brain-BuTeWcBr.js +6 -0
- vibe_surf/backend/frontend/assets/brain-circuit-DAr0c9Ig.js +6 -0
- vibe_surf/backend/frontend/assets/brain-cog-C-6ua_E5.js +6 -0
- vibe_surf/backend/frontend/assets/brick-wall-DiRdytpC.js +6 -0
- vibe_surf/backend/frontend/assets/brick-wall-fire-Df58-yW_.js +6 -0
- vibe_surf/backend/frontend/assets/briefcase-BCC8rhM-.js +6 -0
- vibe_surf/backend/frontend/assets/briefcase-business-11K02ygr.js +6 -0
- vibe_surf/backend/frontend/assets/briefcase-conveyor-belt-BGOeI8YI.js +6 -0
- vibe_surf/backend/frontend/assets/briefcase-medical-Cf5O_Vzv.js +6 -0
- vibe_surf/backend/frontend/assets/bring-to-front-DkBhdEDk.js +6 -0
- vibe_surf/backend/frontend/assets/brush-CwwHpx8w.js +6 -0
- vibe_surf/backend/frontend/assets/bubbles-BNDUSsoL.js +6 -0
- vibe_surf/backend/frontend/assets/bug-B-h4nltF.js +6 -0
- vibe_surf/backend/frontend/assets/bug-off-BsFDr1Kw.js +6 -0
- vibe_surf/backend/frontend/assets/bug-play-26tPYeYP.js +6 -0
- vibe_surf/backend/frontend/assets/building-2-B8a5eq3G.js +6 -0
- vibe_surf/backend/frontend/assets/building-D-y2htrY.js +6 -0
- vibe_surf/backend/frontend/assets/bus-eKi5tEc0.js +6 -0
- vibe_surf/backend/frontend/assets/bus-front-UgmZ3AhM.js +6 -0
- vibe_surf/backend/frontend/assets/cable-bgAMwTGl.js +6 -0
- vibe_surf/backend/frontend/assets/cable-car-D4-4YVV_.js +6 -0
- vibe_surf/backend/frontend/assets/cake-CsxUhj7B.js +6 -0
- vibe_surf/backend/frontend/assets/cake-slice-CDFVuMN9.js +6 -0
- vibe_surf/backend/frontend/assets/calculator-DgmhNoBI.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-1-BKz8ZI5j.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-arrow-down-CtgxtU04.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-arrow-up-xRCcun7L.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-check-2-CZSHjt45.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-check-4yXO0khM.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-clock-BakA-x1D.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-cog-CZljoOd5.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-days-ChE7Ny1-.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-fold-BkO7wfLY.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-heart-Dr-9lPi7.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-minus-2-qezZcq9-.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-minus-vz6lNpYY.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-off-BWz43ibw.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-plus-2-XgwhzxSM.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-plus-D3Dch9Uq.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-range-DNVYH5rE.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-search-Cu8Pf1i4.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-sync-CJShUCMN.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-uQc-0CwX.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-x-2-DKrkh_XF.js +6 -0
- vibe_surf/backend/frontend/assets/calendar-x-BAw2jejx.js +6 -0
- vibe_surf/backend/frontend/assets/camera-CeCtO8OS.js +6 -0
- vibe_surf/backend/frontend/assets/camera-off-Dn0VufPW.js +6 -0
- vibe_surf/backend/frontend/assets/candy-C8LKHyd9.js +6 -0
- vibe_surf/backend/frontend/assets/candy-cane-qdqDVt_H.js +6 -0
- vibe_surf/backend/frontend/assets/candy-off-DoNKmYDA.js +6 -0
- vibe_surf/backend/frontend/assets/cannabis-d1YIKR6M.js +6 -0
- vibe_surf/backend/frontend/assets/captions-DLcuaLjj.js +6 -0
- vibe_surf/backend/frontend/assets/captions-off-CSNnDqnT.js +6 -0
- vibe_surf/backend/frontend/assets/car-BNlBq1cc.js +6 -0
- vibe_surf/backend/frontend/assets/car-front-n1ZZ5Nji.js +6 -0
- vibe_surf/backend/frontend/assets/car-taxi-front-Da7GM3x6.js +6 -0
- vibe_surf/backend/frontend/assets/caravan-DNROe0a9.js +6 -0
- vibe_surf/backend/frontend/assets/carrot-ByVO2D43.js +6 -0
- vibe_surf/backend/frontend/assets/case-lower-BNX91uLr.js +6 -0
- vibe_surf/backend/frontend/assets/case-sensitive-QY839cid.js +6 -0
- vibe_surf/backend/frontend/assets/case-upper-DUDhnzhx.js +6 -0
- vibe_surf/backend/frontend/assets/cassette-tape-DnY7y11C.js +6 -0
- vibe_surf/backend/frontend/assets/cast-DL3Ri4Zn.js +6 -0
- vibe_surf/backend/frontend/assets/castle-DoI41Pkw.js +6 -0
- vibe_surf/backend/frontend/assets/cat-Xm6ynrXR.js +6 -0
- vibe_surf/backend/frontend/assets/cctv-DME6qRnE.js +6 -0
- vibe_surf/backend/frontend/assets/chart-area-BGI28u47.js +6 -0
- vibe_surf/backend/frontend/assets/chart-bar-DBV1hPM5.js +6 -0
- vibe_surf/backend/frontend/assets/chart-bar-big-CvJY7AHY.js +6 -0
- vibe_surf/backend/frontend/assets/chart-bar-decreasing-9uwKC-he.js +6 -0
- vibe_surf/backend/frontend/assets/chart-bar-increasing-F1gG2kkZ.js +6 -0
- vibe_surf/backend/frontend/assets/chart-bar-stacked-DbDlBSDo.js +6 -0
- vibe_surf/backend/frontend/assets/chart-candlestick-DTWO94r-.js +6 -0
- vibe_surf/backend/frontend/assets/chart-column-Cdh3ooHC.js +6 -0
- vibe_surf/backend/frontend/assets/chart-column-big-Eh8aDm6L.js +6 -0
- vibe_surf/backend/frontend/assets/chart-column-decreasing-BSuKP6Qc.js +6 -0
- vibe_surf/backend/frontend/assets/chart-column-increasing-BzEsRspx.js +6 -0
- vibe_surf/backend/frontend/assets/chart-column-stacked-Ca6vYEkF.js +6 -0
- vibe_surf/backend/frontend/assets/chart-gantt-BKdYU39i.js +6 -0
- vibe_surf/backend/frontend/assets/chart-line-DN7nBokI.js +6 -0
- vibe_surf/backend/frontend/assets/chart-network-B6aKwyxu.js +6 -0
- vibe_surf/backend/frontend/assets/chart-no-axes-column-BPUq1xmc.js +6 -0
- vibe_surf/backend/frontend/assets/chart-no-axes-column-decreasing-CtSuhRPr.js +6 -0
- vibe_surf/backend/frontend/assets/chart-no-axes-column-increasing-D9Z23RSe.js +6 -0
- vibe_surf/backend/frontend/assets/chart-no-axes-combined-BPIDpAUw.js +6 -0
- vibe_surf/backend/frontend/assets/chart-no-axes-gantt-mstaaDOy.js +6 -0
- vibe_surf/backend/frontend/assets/chart-pie-DHkYI2nd.js +6 -0
- vibe_surf/backend/frontend/assets/chart-scatter-BMUVsxxc.js +6 -0
- vibe_surf/backend/frontend/assets/chart-spline-BQYhzmbs.js +6 -0
- vibe_surf/backend/frontend/assets/check-check-DZ6-FF8V.js +6 -0
- vibe_surf/backend/frontend/assets/chef-hat-DI_R6N2N.js +6 -0
- vibe_surf/backend/frontend/assets/cherry-D00B4bwv.js +6 -0
- vibe_surf/backend/frontend/assets/chevron-first-D-sSlEK9.js +6 -0
- vibe_surf/backend/frontend/assets/chevron-last-AieZfpF5.js +6 -0
- vibe_surf/backend/frontend/assets/chevron-left-mfds1hqE.js +6 -0
- vibe_surf/backend/frontend/assets/chevron-right-Cjbrp9zy.js +6 -0
- vibe_surf/backend/frontend/assets/chevrons-down-D3_RigXr.js +6 -0
- vibe_surf/backend/frontend/assets/chevrons-down-up-CWJ3Bpey.js +6 -0
- vibe_surf/backend/frontend/assets/chevrons-left-DRqjvpLx.js +6 -0
- vibe_surf/backend/frontend/assets/chevrons-left-right-ellipsis-BzX-1Cdp.js +6 -0
- vibe_surf/backend/frontend/assets/chevrons-left-right-lA1Z637d.js +6 -0
- vibe_surf/backend/frontend/assets/chevrons-right-Ceh1Kykn.js +6 -0
- vibe_surf/backend/frontend/assets/chevrons-right-left-D0pOkKiz.js +6 -0
- vibe_surf/backend/frontend/assets/chevrons-up-CkJhDtkt.js +6 -0
- vibe_surf/backend/frontend/assets/chrome-B99nQ5T6.js +6 -0
- vibe_surf/backend/frontend/assets/church-CCtCcuUF.js +6 -0
- vibe_surf/backend/frontend/assets/cigarette-DHz-zWI5.js +6 -0
- vibe_surf/backend/frontend/assets/cigarette-off-CWKFWcz-.js +6 -0
- vibe_surf/backend/frontend/assets/circle-alert-BCdP7B9m.js +6 -0
- vibe_surf/backend/frontend/assets/circle-arrow-down-gjAb2XAQ.js +6 -0
- vibe_surf/backend/frontend/assets/circle-arrow-left-B8TL5s92.js +6 -0
- vibe_surf/backend/frontend/assets/circle-arrow-out-down-left-BDZ_mOB3.js +6 -0
- vibe_surf/backend/frontend/assets/circle-arrow-out-down-right-C31JwGaH.js +6 -0
- vibe_surf/backend/frontend/assets/circle-arrow-out-up-left-jLaU6DvQ.js +6 -0
- vibe_surf/backend/frontend/assets/circle-arrow-out-up-right-D2ixwYhA.js +6 -0
- vibe_surf/backend/frontend/assets/circle-arrow-right-C_cagsqv.js +6 -0
- vibe_surf/backend/frontend/assets/circle-arrow-up-Dx87_2P9.js +6 -0
- vibe_surf/backend/frontend/assets/circle-check-C5uPloQF.js +6 -0
- vibe_surf/backend/frontend/assets/circle-check-big-P_p4Wr1K.js +6 -0
- vibe_surf/backend/frontend/assets/circle-chevron-down-C2MiOrG4.js +6 -0
- vibe_surf/backend/frontend/assets/circle-chevron-left-DDuIXpi4.js +6 -0
- vibe_surf/backend/frontend/assets/circle-chevron-right-myMJ4pPe.js +6 -0
- vibe_surf/backend/frontend/assets/circle-chevron-up-De1WbdBl.js +6 -0
- vibe_surf/backend/frontend/assets/circle-dashed-Bl6JELwp.js +6 -0
- vibe_surf/backend/frontend/assets/circle-divide-3_AqIeYz.js +6 -0
- vibe_surf/backend/frontend/assets/circle-dollar-sign-BxcNzUBd.js +6 -0
- vibe_surf/backend/frontend/assets/circle-dot-BxsZo1Nv.js +6 -0
- vibe_surf/backend/frontend/assets/circle-dot-dashed-C9_3fDwg.js +6 -0
- vibe_surf/backend/frontend/assets/circle-ellipsis-y8IPhLQX.js +6 -0
- vibe_surf/backend/frontend/assets/circle-equal-CMS41nZX.js +6 -0
- vibe_surf/backend/frontend/assets/circle-fading-arrow-up-Ctl33k8e.js +6 -0
- vibe_surf/backend/frontend/assets/circle-fading-plus-DcIVZnCm.js +6 -0
- vibe_surf/backend/frontend/assets/circle-gauge-hli3GonG.js +6 -0
- vibe_surf/backend/frontend/assets/circle-help-DhBxmPfs.js +6 -0
- vibe_surf/backend/frontend/assets/circle-minus-DuzoP_Gr.js +6 -0
- vibe_surf/backend/frontend/assets/circle-off-CkMo-mEi.js +6 -0
- vibe_surf/backend/frontend/assets/circle-parking-DObllwiU.js +6 -0
- vibe_surf/backend/frontend/assets/circle-parking-off-Eu8OaFfX.js +6 -0
- vibe_surf/backend/frontend/assets/circle-pause-DWZvbXLh.js +6 -0
- vibe_surf/backend/frontend/assets/circle-percent-Gswg5Dmm.js +6 -0
- vibe_surf/backend/frontend/assets/circle-play-Cs7oMz5r.js +6 -0
- vibe_surf/backend/frontend/assets/circle-plus-BbT0XhZy.js +6 -0
- vibe_surf/backend/frontend/assets/circle-power-DJYAzMhA.js +6 -0
- vibe_surf/backend/frontend/assets/circle-slash-2-C6g9B1d4.js +6 -0
- vibe_surf/backend/frontend/assets/circle-slash-80HmVvSU.js +6 -0
- vibe_surf/backend/frontend/assets/circle-small-BplNmUKo.js +6 -0
- vibe_surf/backend/frontend/assets/circle-stop-X4XHzl3_.js +6 -0
- vibe_surf/backend/frontend/assets/circle-user-CBbX0YUx.js +6 -0
- vibe_surf/backend/frontend/assets/circle-user-round-BKiTCzXI.js +6 -0
- vibe_surf/backend/frontend/assets/circuit-board-DMnzBge-.js +6 -0
- vibe_surf/backend/frontend/assets/citrus-BXZMlaiu.js +6 -0
- vibe_surf/backend/frontend/assets/clapperboard-QI5DhvkW.js +6 -0
- vibe_surf/backend/frontend/assets/clipboard-DSAtTHqu.js +6 -0
- vibe_surf/backend/frontend/assets/clipboard-check-BZBI9pc5.js +6 -0
- vibe_surf/backend/frontend/assets/clipboard-copy-CSl6j3te.js +6 -0
- vibe_surf/backend/frontend/assets/clipboard-list-C8QFRlUw.js +6 -0
- vibe_surf/backend/frontend/assets/clipboard-minus-BuCbzuoq.js +6 -0
- vibe_surf/backend/frontend/assets/clipboard-paste-CQn0LMaW.js +6 -0
- vibe_surf/backend/frontend/assets/clipboard-pen-line-Bx0wm5dI.js +6 -0
- vibe_surf/backend/frontend/assets/clipboard-pen-q_cqsVmS.js +6 -0
- vibe_surf/backend/frontend/assets/clipboard-plus-DwQAo6_l.js +6 -0
- vibe_surf/backend/frontend/assets/clipboard-type-BNYyoI1_.js +6 -0
- vibe_surf/backend/frontend/assets/clipboard-x-DZYuwaaG.js +6 -0
- vibe_surf/backend/frontend/assets/clock-1-DgESaKSE.js +6 -0
- vibe_surf/backend/frontend/assets/clock-10-wIgrU8Yj.js +6 -0
- vibe_surf/backend/frontend/assets/clock-11-Buh5WHor.js +6 -0
- vibe_surf/backend/frontend/assets/clock-12-C2gsOQrL.js +6 -0
- vibe_surf/backend/frontend/assets/clock-2-D43KucqT.js +6 -0
- vibe_surf/backend/frontend/assets/clock-3-DYI1jraG.js +6 -0
- vibe_surf/backend/frontend/assets/clock-4-L4e4KHXv.js +6 -0
- vibe_surf/backend/frontend/assets/clock-5-CWJ5YkDs.js +6 -0
- vibe_surf/backend/frontend/assets/clock-6-CtaZof53.js +6 -0
- vibe_surf/backend/frontend/assets/clock-7-asCRJHjv.js +6 -0
- vibe_surf/backend/frontend/assets/clock-8-Cc2qbeiy.js +6 -0
- vibe_surf/backend/frontend/assets/clock-9-Dl4X0vFw.js +6 -0
- vibe_surf/backend/frontend/assets/clock-BYS3KG7-.js +6 -0
- vibe_surf/backend/frontend/assets/clock-alert-Cq_VQBiw.js +6 -0
- vibe_surf/backend/frontend/assets/clock-arrow-down-Bd1H68GK.js +6 -0
- vibe_surf/backend/frontend/assets/clock-arrow-up-BUYARFyu.js +6 -0
- vibe_surf/backend/frontend/assets/clock-fading-DdL2cNkM.js +6 -0
- vibe_surf/backend/frontend/assets/cloud-BMpvy1xk.js +6 -0
- vibe_surf/backend/frontend/assets/cloud-alert-D5XOu8YY.js +6 -0
- vibe_surf/backend/frontend/assets/cloud-cog-CMw4aVSH.js +6 -0
- vibe_surf/backend/frontend/assets/cloud-download-DU72C1pe.js +6 -0
- vibe_surf/backend/frontend/assets/cloud-drizzle-B0XQktr3.js +6 -0
- vibe_surf/backend/frontend/assets/cloud-fog-Bt7bjAbr.js +6 -0
- vibe_surf/backend/frontend/assets/cloud-hail-rqT8jB3i.js +6 -0
- vibe_surf/backend/frontend/assets/cloud-lightning-BBVTdh3m.js +6 -0
- vibe_surf/backend/frontend/assets/cloud-moon-R-fj3ojz.js +6 -0
- vibe_surf/backend/frontend/assets/cloud-moon-rain-yqxneI3M.js +6 -0
- vibe_surf/backend/frontend/assets/cloud-off-yg-ZE-_Q.js +6 -0
- vibe_surf/backend/frontend/assets/cloud-rain-ChHLGe1p.js +6 -0
- vibe_surf/backend/frontend/assets/cloud-rain-wind-JR4JcS7C.js +6 -0
- vibe_surf/backend/frontend/assets/cloud-snow-Cybax_co.js +6 -0
- vibe_surf/backend/frontend/assets/cloud-sun-DkBED-mU.js +6 -0
- vibe_surf/backend/frontend/assets/cloud-sun-rain-B5_9ukkr.js +6 -0
- vibe_surf/backend/frontend/assets/cloud-upload-Cu4ieVcA.js +6 -0
- vibe_surf/backend/frontend/assets/cloudy-BfAjnn1H.js +6 -0
- vibe_surf/backend/frontend/assets/clover-Nay_aOR-.js +6 -0
- vibe_surf/backend/frontend/assets/club-Wma0dWBT.js +6 -0
- vibe_surf/backend/frontend/assets/code-xml-JRyiBJKX.js +6 -0
- vibe_surf/backend/frontend/assets/codepen-Db89gVRb.js +6 -0
- vibe_surf/backend/frontend/assets/codesandbox-6Bi0nwFB.js +6 -0
- vibe_surf/backend/frontend/assets/coffee-BUZkk2WM.js +6 -0
- vibe_surf/backend/frontend/assets/cog-BlUy4pJ6.js +6 -0
- vibe_surf/backend/frontend/assets/coins-Bx_bjmVj.js +6 -0
- vibe_surf/backend/frontend/assets/columns-2-BQVZlGLr.js +6 -0
- vibe_surf/backend/frontend/assets/columns-3-SW5AYOfS.js +6 -0
- vibe_surf/backend/frontend/assets/columns-3-cog-etTCUk7U.js +6 -0
- vibe_surf/backend/frontend/assets/columns-4-BPpIDoQv.js +6 -0
- vibe_surf/backend/frontend/assets/combine-DAkv3eQ-.js +6 -0
- vibe_surf/backend/frontend/assets/command-BCh8jDkv.js +6 -0
- vibe_surf/backend/frontend/assets/compass-B9ZnFYhL.js +6 -0
- vibe_surf/backend/frontend/assets/component-B3rp8m52.js +6 -0
- vibe_surf/backend/frontend/assets/computer-DSXJ82Yq.js +6 -0
- vibe_surf/backend/frontend/assets/concierge-bell-08Utkgj4.js +6 -0
- vibe_surf/backend/frontend/assets/cone-CtuBXsg9.js +6 -0
- vibe_surf/backend/frontend/assets/construction-CW4jHft2.js +6 -0
- vibe_surf/backend/frontend/assets/contact-BEshHPpN.js +6 -0
- vibe_surf/backend/frontend/assets/contact-round-kvYdDXoY.js +6 -0
- vibe_surf/backend/frontend/assets/container-D0OTPthH.js +6 -0
- vibe_surf/backend/frontend/assets/contrast-DnkMkf-y.js +6 -0
- vibe_surf/backend/frontend/assets/cookie-CYld1ib8.js +6 -0
- vibe_surf/backend/frontend/assets/cooking-pot-r3byuDHj.js +6 -0
- vibe_surf/backend/frontend/assets/copy-BmO-mv3j.js +6 -0
- vibe_surf/backend/frontend/assets/copy-check-8SojR2n7.js +6 -0
- vibe_surf/backend/frontend/assets/copy-minus-BgbL-ezu.js +6 -0
- vibe_surf/backend/frontend/assets/copy-plus-pG8nJiZU.js +6 -0
- vibe_surf/backend/frontend/assets/copy-slash-7hvOeX3Q.js +6 -0
- vibe_surf/backend/frontend/assets/copy-x-DEPYUbh1.js +6 -0
- vibe_surf/backend/frontend/assets/copyleft-Ce67b9NQ.js +6 -0
- vibe_surf/backend/frontend/assets/copyright-BfKpdVBw.js +6 -0
- vibe_surf/backend/frontend/assets/corner-down-left-Dphkqh8j.js +6 -0
- vibe_surf/backend/frontend/assets/corner-down-right-Dq07c5k_.js +6 -0
- vibe_surf/backend/frontend/assets/corner-left-down-CxWh_26z.js +6 -0
- vibe_surf/backend/frontend/assets/corner-left-up-BLgQomz0.js +6 -0
- vibe_surf/backend/frontend/assets/corner-right-down-tYY2AfHr.js +6 -0
- vibe_surf/backend/frontend/assets/corner-right-up-Bj9fzWl1.js +6 -0
- vibe_surf/backend/frontend/assets/corner-up-left-m22RfGo1.js +6 -0
- vibe_surf/backend/frontend/assets/corner-up-right-CodaZCnS.js +6 -0
- vibe_surf/backend/frontend/assets/cpu-Bu0IGxWB.js +6 -0
- vibe_surf/backend/frontend/assets/creative-commons-j_bcx2B-.js +6 -0
- vibe_surf/backend/frontend/assets/credit-card-CIdSlGyt.js +6 -0
- vibe_surf/backend/frontend/assets/croissant-m9Tzpn6-.js +6 -0
- vibe_surf/backend/frontend/assets/crop-BT5n_BDw.js +6 -0
- vibe_surf/backend/frontend/assets/cross-WahXWLmu.js +6 -0
- vibe_surf/backend/frontend/assets/crosshair-Detaeusf.js +6 -0
- vibe_surf/backend/frontend/assets/crown-BIIqN4tU.js +6 -0
- vibe_surf/backend/frontend/assets/cuboid-COMWL8KE.js +6 -0
- vibe_surf/backend/frontend/assets/cup-soda-DHRt3-v6.js +6 -0
- vibe_surf/backend/frontend/assets/currency-B82qjXmb.js +6 -0
- vibe_surf/backend/frontend/assets/cylinder-CgY0_Sr-.js +6 -0
- vibe_surf/backend/frontend/assets/dam-TTB5VJyi.js +6 -0
- vibe_surf/backend/frontend/assets/database-CIFWjgNY.js +6 -0
- vibe_surf/backend/frontend/assets/database-backup-CvRH8XaW.js +6 -0
- vibe_surf/backend/frontend/assets/database-zap-CiKnHfeB.js +6 -0
- vibe_surf/backend/frontend/assets/decimals-arrow-left-BioOtsdm.js +6 -0
- vibe_surf/backend/frontend/assets/decimals-arrow-right-Cx4cszFW.js +6 -0
- vibe_surf/backend/frontend/assets/delete-BAdtbBtM.js +6 -0
- vibe_surf/backend/frontend/assets/dessert-DkIzBH7A.js +6 -0
- vibe_surf/backend/frontend/assets/diameter-CvVdrBrk.js +6 -0
- vibe_surf/backend/frontend/assets/diamond-BXgkzyFD.js +6 -0
- vibe_surf/backend/frontend/assets/diamond-minus-D79h5E4F.js +6 -0
- vibe_surf/backend/frontend/assets/diamond-percent-DFTgIUWX.js +6 -0
- vibe_surf/backend/frontend/assets/diamond-plus-C_6l6Egb.js +6 -0
- vibe_surf/backend/frontend/assets/dice-1-BYNZMiRy.js +6 -0
- vibe_surf/backend/frontend/assets/dice-2-BNbymABr.js +6 -0
- vibe_surf/backend/frontend/assets/dice-3-Dd1JuSvv.js +6 -0
- vibe_surf/backend/frontend/assets/dice-4-D8TCA-54.js +6 -0
- vibe_surf/backend/frontend/assets/dice-5-CUoUzy4y.js +6 -0
- vibe_surf/backend/frontend/assets/dice-6-B_kWm-vM.js +6 -0
- vibe_surf/backend/frontend/assets/dices-XLW7VfCr.js +6 -0
- vibe_surf/backend/frontend/assets/diff-R28hcSRc.js +6 -0
- vibe_surf/backend/frontend/assets/disc-2-C5DTPMUd.js +6 -0
- vibe_surf/backend/frontend/assets/disc-3-BtEvZMjh.js +6 -0
- vibe_surf/backend/frontend/assets/disc-CKAPWmCy.js +6 -0
- vibe_surf/backend/frontend/assets/disc-album-cuvuWfA9.js +6 -0
- vibe_surf/backend/frontend/assets/divide-BxQmQals.js +6 -0
- vibe_surf/backend/frontend/assets/dna-D0iYcnjp.js +6 -0
- vibe_surf/backend/frontend/assets/dna-off-ErTou38f.js +6 -0
- vibe_surf/backend/frontend/assets/dock-BkchtLNf.js +6 -0
- vibe_surf/backend/frontend/assets/dog-JA5MF7gp.js +6 -0
- vibe_surf/backend/frontend/assets/dollar-sign-S9eSDOrJ.js +6 -0
- vibe_surf/backend/frontend/assets/donut-BqRrNkvP.js +6 -0
- vibe_surf/backend/frontend/assets/door-closed-B-MrGb6q.js +6 -0
- vibe_surf/backend/frontend/assets/door-open-Br3vbfpG.js +6 -0
- vibe_surf/backend/frontend/assets/dot-DXfRbuM0.js +6 -0
- vibe_surf/backend/frontend/assets/drafting-compass-DMXHtO4G.js +6 -0
- vibe_surf/backend/frontend/assets/drama-Dubi2dNu.js +6 -0
- vibe_surf/backend/frontend/assets/dribbble-DOzityvb.js +6 -0
- vibe_surf/backend/frontend/assets/drill-BQ0EsUsX.js +6 -0
- vibe_surf/backend/frontend/assets/droplet-off-ButGxGdH.js +6 -0
- vibe_surf/backend/frontend/assets/droplet-son-_skj.js +6 -0
- vibe_surf/backend/frontend/assets/droplets-BZ2YfVSA.js +6 -0
- vibe_surf/backend/frontend/assets/drum-BQx6BFpe.js +6 -0
- vibe_surf/backend/frontend/assets/drumstick-3-rUtwNB.js +6 -0
- vibe_surf/backend/frontend/assets/dumbbell-BthFc0AJ.js +6 -0
- vibe_surf/backend/frontend/assets/ear-kW9YKHKv.js +6 -0
- vibe_surf/backend/frontend/assets/ear-off-C9aEMiZV.js +6 -0
- vibe_surf/backend/frontend/assets/earth-B5AfETae.js +6 -0
- vibe_surf/backend/frontend/assets/earth-lock-acG4NArC.js +6 -0
- vibe_surf/backend/frontend/assets/eclipse-JDjKYV0j.js +6 -0
- vibe_surf/backend/frontend/assets/egg-BJX5S-yO.js +6 -0
- vibe_surf/backend/frontend/assets/egg-fried-CzdJ94z0.js +6 -0
- vibe_surf/backend/frontend/assets/egg-off-DFZTyisV.js +6 -0
- vibe_surf/backend/frontend/assets/ellipsis-Do5QGxdF.js +6 -0
- vibe_surf/backend/frontend/assets/ellipsis-vertical-DL3lXNkl.js +6 -0
- vibe_surf/backend/frontend/assets/equal-CSbKMjR9.js +6 -0
- vibe_surf/backend/frontend/assets/equal-approximately-D-_zKTi0.js +6 -0
- vibe_surf/backend/frontend/assets/equal-not-BEN-hLun.js +6 -0
- vibe_surf/backend/frontend/assets/eraser-EqIxcp-G.js +6 -0
- vibe_surf/backend/frontend/assets/ethernet-port-Ctq9b8YM.js +6 -0
- vibe_surf/backend/frontend/assets/euro-CUlQSiXf.js +6 -0
- vibe_surf/backend/frontend/assets/expand-LQdF_-l7.js +6 -0
- vibe_surf/backend/frontend/assets/eye-B14urkBb.js +6 -0
- vibe_surf/backend/frontend/assets/eye-closed-BpcKXvvZ.js +6 -0
- vibe_surf/backend/frontend/assets/eye-off-B-I1bzN-.js +6 -0
- vibe_surf/backend/frontend/assets/facebook-DMySCi-p.js +6 -0
- vibe_surf/backend/frontend/assets/factory-Bd6MRr0-.js +6 -0
- vibe_surf/backend/frontend/assets/fan-tVwUdYtX.js +6 -0
- vibe_surf/backend/frontend/assets/fast-forward-CY4W38Jf.js +6 -0
- vibe_surf/backend/frontend/assets/feather-C553H-qS.js +6 -0
- vibe_surf/backend/frontend/assets/fence-BJNMd5m7.js +6 -0
- vibe_surf/backend/frontend/assets/ferris-wheel-oHPMJGEQ.js +6 -0
- vibe_surf/backend/frontend/assets/figma-C9tPiFb3.js +6 -0
- vibe_surf/backend/frontend/assets/file-AzAzVrMs.js +6 -0
- vibe_surf/backend/frontend/assets/file-archive-CIMp0jPK.js +6 -0
- vibe_surf/backend/frontend/assets/file-audio-2-D6PqsNui.js +6 -0
- vibe_surf/backend/frontend/assets/file-audio-B3MBbrsx.js +6 -0
- vibe_surf/backend/frontend/assets/file-axis-3d-CAs3JLL4.js +6 -0
- vibe_surf/backend/frontend/assets/file-badge-2-BigpxEa4.js +6 -0
- vibe_surf/backend/frontend/assets/file-badge-DxxBNe6I.js +6 -0
- vibe_surf/backend/frontend/assets/file-box-CFM_ZS8C.js +6 -0
- vibe_surf/backend/frontend/assets/file-chart-column-DW7tDtSF.js +6 -0
- vibe_surf/backend/frontend/assets/file-chart-column-increasing-Dqw2rkcp.js +6 -0
- vibe_surf/backend/frontend/assets/file-chart-line-B55e6iQr.js +6 -0
- vibe_surf/backend/frontend/assets/file-chart-pie-bx6xE3zh.js +6 -0
- vibe_surf/backend/frontend/assets/file-check-2-O19xL6zZ.js +6 -0
- vibe_surf/backend/frontend/assets/file-check-BW8E_U7M.js +6 -0
- vibe_surf/backend/frontend/assets/file-clock-CJ7TCW3g.js +6 -0
- vibe_surf/backend/frontend/assets/file-code-2-IWdjGkQV.js +6 -0
- vibe_surf/backend/frontend/assets/file-code-C8Cb2eAQ.js +6 -0
- vibe_surf/backend/frontend/assets/file-cog-D7zwEbXQ.js +6 -0
- vibe_surf/backend/frontend/assets/file-diff-Cd4QjfxS.js +6 -0
- vibe_surf/backend/frontend/assets/file-digit-D4o35Lws.js +6 -0
- vibe_surf/backend/frontend/assets/file-down-CvhBfQai.js +6 -0
- vibe_surf/backend/frontend/assets/file-heart-SAbeQl04.js +6 -0
- vibe_surf/backend/frontend/assets/file-image-n3F2ES2d.js +6 -0
- vibe_surf/backend/frontend/assets/file-input-BF2fJ0HZ.js +6 -0
- vibe_surf/backend/frontend/assets/file-json-2-CHFMlqRM.js +6 -0
- vibe_surf/backend/frontend/assets/file-json-GQx3fsvD.js +6 -0
- vibe_surf/backend/frontend/assets/file-key-2-D4vSersB.js +6 -0
- vibe_surf/backend/frontend/assets/file-key-DoCfAot9.js +6 -0
- vibe_surf/backend/frontend/assets/file-lock-2-D5yc4s9S.js +6 -0
- vibe_surf/backend/frontend/assets/file-lock-fbh0rbzY.js +6 -0
- vibe_surf/backend/frontend/assets/file-minus-2-jZ3pDR5C.js +6 -0
- vibe_surf/backend/frontend/assets/file-minus-uXOKmAYW.js +6 -0
- vibe_surf/backend/frontend/assets/file-music-YA3-0ItN.js +6 -0
- vibe_surf/backend/frontend/assets/file-output-CXDuHwjv.js +6 -0
- vibe_surf/backend/frontend/assets/file-pen-B16K0rIH.js +6 -0
- vibe_surf/backend/frontend/assets/file-pen-line-Dec_HNbe.js +6 -0
- vibe_surf/backend/frontend/assets/file-plus-2-Wj25GYBI.js +6 -0
- vibe_surf/backend/frontend/assets/file-plus-Bv2RaOy_.js +6 -0
- vibe_surf/backend/frontend/assets/file-question-CBnhbTUy.js +6 -0
- vibe_surf/backend/frontend/assets/file-scan-C4l__2lp.js +6 -0
- vibe_surf/backend/frontend/assets/file-search-2-B_BQLrOO.js +6 -0
- vibe_surf/backend/frontend/assets/file-search-igYKSOot.js +6 -0
- vibe_surf/backend/frontend/assets/file-sliders-BC6jqY7m.js +6 -0
- vibe_surf/backend/frontend/assets/file-spreadsheet-8zeuwOFy.js +6 -0
- vibe_surf/backend/frontend/assets/file-stack-CEbrflgS.js +6 -0
- vibe_surf/backend/frontend/assets/file-symlink-Ce64x_q-.js +6 -0
- vibe_surf/backend/frontend/assets/file-terminal-DEMjlYPH.js +6 -0
- vibe_surf/backend/frontend/assets/file-text-qsRAxrKg.js +6 -0
- vibe_surf/backend/frontend/assets/file-type-2-rdAUx0k-.js +6 -0
- vibe_surf/backend/frontend/assets/file-type-Bo0mvnlr.js +6 -0
- vibe_surf/backend/frontend/assets/file-up-ChCUFvtC.js +6 -0
- vibe_surf/backend/frontend/assets/file-user-DeJOcc6w.js +6 -0
- vibe_surf/backend/frontend/assets/file-video-2-NeLUHxWj.js +6 -0
- vibe_surf/backend/frontend/assets/file-video-M49YI2mS.js +6 -0
- vibe_surf/backend/frontend/assets/file-volume-2-Bde2Kb7U.js +6 -0
- vibe_surf/backend/frontend/assets/file-volume-up1R-zQ1.js +6 -0
- vibe_surf/backend/frontend/assets/file-warning-DNllVKxU.js +6 -0
- vibe_surf/backend/frontend/assets/file-x-2-CHaW7ofd.js +6 -0
- vibe_surf/backend/frontend/assets/file-x-Ct2jUMMo.js +6 -0
- vibe_surf/backend/frontend/assets/files-CvndfhQ4.js +6 -0
- vibe_surf/backend/frontend/assets/film-y1VzEOGa.js +6 -0
- vibe_surf/backend/frontend/assets/fingerprint-BI6dfzhE.js +6 -0
- vibe_surf/backend/frontend/assets/fire-extinguisher--s4lJQsf.js +6 -0
- vibe_surf/backend/frontend/assets/fish-off-D3GNjlTn.js +6 -0
- vibe_surf/backend/frontend/assets/fish-s2So_Zeq.js +6 -0
- vibe_surf/backend/frontend/assets/fish-symbol-CYjqO11h.js +6 -0
- vibe_surf/backend/frontend/assets/flag-C27BL99d.js +6 -0
- vibe_surf/backend/frontend/assets/flag-off-CMKWJ8l8.js +6 -0
- vibe_surf/backend/frontend/assets/flag-triangle-left-B0Zzobci.js +6 -0
- vibe_surf/backend/frontend/assets/flag-triangle-right-BYX5OyAO.js +6 -0
- vibe_surf/backend/frontend/assets/flame-BZdffZJx.js +6 -0
- vibe_surf/backend/frontend/assets/flame-kindling-B1qjw-qo.js +6 -0
- vibe_surf/backend/frontend/assets/flashlight-D7kNRs0V.js +6 -0
- vibe_surf/backend/frontend/assets/flashlight-off-Dc1MMZFO.js +6 -0
- vibe_surf/backend/frontend/assets/flask-conical-ChF2JmZu.js +6 -0
- vibe_surf/backend/frontend/assets/flask-conical-off-DegTh8gS.js +6 -0
- vibe_surf/backend/frontend/assets/flask-round-CK1-Ik6i.js +6 -0
- vibe_surf/backend/frontend/assets/flip-horizontal-2-Dn8i_KV0.js +6 -0
- vibe_surf/backend/frontend/assets/flip-horizontal-CuVvaraZ.js +6 -0
- vibe_surf/backend/frontend/assets/flip-vertical-2-rFYdErLA.js +6 -0
- vibe_surf/backend/frontend/assets/flip-vertical-B90WGgH0.js +6 -0
- vibe_surf/backend/frontend/assets/flower-2-C_TT89UG.js +6 -0
- vibe_surf/backend/frontend/assets/flower-CO6QACmS.js +6 -0
- vibe_surf/backend/frontend/assets/focus-D26Oa74J.js +6 -0
- vibe_surf/backend/frontend/assets/fold-horizontal-CBIHGZ0q.js +6 -0
- vibe_surf/backend/frontend/assets/fold-vertical-CD7tvqYt.js +6 -0
- vibe_surf/backend/frontend/assets/folder-Cf5LgRi0.js +6 -0
- vibe_surf/backend/frontend/assets/folder-archive-eaqS6DPc.js +6 -0
- vibe_surf/backend/frontend/assets/folder-check-BKYRcZZr.js +6 -0
- vibe_surf/backend/frontend/assets/folder-clock-DfstD_8t.js +6 -0
- vibe_surf/backend/frontend/assets/folder-closed-CQt1KGRd.js +6 -0
- vibe_surf/backend/frontend/assets/folder-code-D-UAjp3e.js +6 -0
- vibe_surf/backend/frontend/assets/folder-cog-8jmE8SgB.js +6 -0
- vibe_surf/backend/frontend/assets/folder-dot-BCaqBqPg.js +6 -0
- vibe_surf/backend/frontend/assets/folder-down-DRl1_ZDB.js +6 -0
- vibe_surf/backend/frontend/assets/folder-git-2-DctBKaC9.js +6 -0
- vibe_surf/backend/frontend/assets/folder-git-CgxiRK0t.js +6 -0
- vibe_surf/backend/frontend/assets/folder-heart-D6REuieU.js +6 -0
- vibe_surf/backend/frontend/assets/folder-input-C12iWWhu.js +6 -0
- vibe_surf/backend/frontend/assets/folder-kanban-GZtaS_8J.js +6 -0
- vibe_surf/backend/frontend/assets/folder-key-afzRqgkz.js +6 -0
- vibe_surf/backend/frontend/assets/folder-lock-BcLNHqg8.js +6 -0
- vibe_surf/backend/frontend/assets/folder-minus-CvtpPjpU.js +6 -0
- vibe_surf/backend/frontend/assets/folder-open-DupkgJt1.js +6 -0
- vibe_surf/backend/frontend/assets/folder-open-dot-Cxfuxe--.js +6 -0
- vibe_surf/backend/frontend/assets/folder-output-Cg4BpiEV.js +6 -0
- vibe_surf/backend/frontend/assets/folder-pen-DwS7aPNO.js +6 -0
- vibe_surf/backend/frontend/assets/folder-plus-2lTMhR3O.js +6 -0
- vibe_surf/backend/frontend/assets/folder-root-C8WxCnE2.js +6 -0
- vibe_surf/backend/frontend/assets/folder-search-2-Ci-RbLN6.js +6 -0
- vibe_surf/backend/frontend/assets/folder-search-DrXJcjXi.js +6 -0
- vibe_surf/backend/frontend/assets/folder-symlink-BnpH1nVs.js +6 -0
- vibe_surf/backend/frontend/assets/folder-sync-C8-HdePM.js +6 -0
- vibe_surf/backend/frontend/assets/folder-tree-CqSaz8mh.js +6 -0
- vibe_surf/backend/frontend/assets/folder-up-s-mV4gUm.js +6 -0
- vibe_surf/backend/frontend/assets/folder-x-DyHE15uU.js +6 -0
- vibe_surf/backend/frontend/assets/folders-BsPXE9jo.js +6 -0
- vibe_surf/backend/frontend/assets/footprints-D-XXhokZ.js +6 -0
- vibe_surf/backend/frontend/assets/forklift-MYwqGUlF.js +6 -0
- vibe_surf/backend/frontend/assets/forward-0FCU5gw7.js +6 -0
- vibe_surf/backend/frontend/assets/frame-D8alLdea.js +6 -0
- vibe_surf/backend/frontend/assets/framer-DNjQaa1J.js +6 -0
- vibe_surf/backend/frontend/assets/frown-BE0OTdKG.js +6 -0
- vibe_surf/backend/frontend/assets/fuel-mXmAr8TO.js +6 -0
- vibe_surf/backend/frontend/assets/fullscreen-NqXN2Xu7.js +6 -0
- vibe_surf/backend/frontend/assets/funnel-DC0c1Jih.js +6 -0
- vibe_surf/backend/frontend/assets/funnel-plus-Doo-nNYi.js +6 -0
- vibe_surf/backend/frontend/assets/funnel-x-BkmZkEbi.js +6 -0
- vibe_surf/backend/frontend/assets/gallery-horizontal-BaQJYKLC.js +6 -0
- vibe_surf/backend/frontend/assets/gallery-horizontal-end-BWNtYXQf.js +6 -0
- vibe_surf/backend/frontend/assets/gallery-thumbnails-4tJCu6Bt.js +6 -0
- vibe_surf/backend/frontend/assets/gallery-vertical-end-F0Ry7RoI.js +6 -0
- vibe_surf/backend/frontend/assets/gallery-vertical-gD2KGFqY.js +6 -0
- vibe_surf/backend/frontend/assets/gamepad-2-DBi5t2On.js +6 -0
- vibe_surf/backend/frontend/assets/gamepad-8df6ey2A.js +6 -0
- vibe_surf/backend/frontend/assets/gauge-BKZLQcLt.js +6 -0
- vibe_surf/backend/frontend/assets/gavel-CLgRmYF8.js +6 -0
- vibe_surf/backend/frontend/assets/gem-M00EoNdV.js +6 -0
- vibe_surf/backend/frontend/assets/ghost-CEfBnyKY.js +6 -0
- vibe_surf/backend/frontend/assets/gift-BjGURCYr.js +6 -0
- vibe_surf/backend/frontend/assets/git-branch-BOK0DnKM.js +6 -0
- vibe_surf/backend/frontend/assets/git-branch-plus-Duz02qvz.js +6 -0
- vibe_surf/backend/frontend/assets/git-commit-horizontal-DXh9abTq.js +6 -0
- vibe_surf/backend/frontend/assets/git-commit-vertical-8IUR92zC.js +6 -0
- vibe_surf/backend/frontend/assets/git-compare-Bbxv-OD3.js +6 -0
- vibe_surf/backend/frontend/assets/git-compare-arrows-ULo-Y57B.js +6 -0
- vibe_surf/backend/frontend/assets/git-fork-wi2CvjEp.js +6 -0
- vibe_surf/backend/frontend/assets/git-graph-CWjPQ35V.js +6 -0
- vibe_surf/backend/frontend/assets/git-merge-BhyoIeLJ.js +6 -0
- vibe_surf/backend/frontend/assets/git-pull-request-BLS97ZSf.js +6 -0
- vibe_surf/backend/frontend/assets/git-pull-request-arrow-DNZCE5xe.js +6 -0
- vibe_surf/backend/frontend/assets/git-pull-request-closed-8STT9TyU.js +6 -0
- vibe_surf/backend/frontend/assets/git-pull-request-create-DR3c4qrX.js +6 -0
- vibe_surf/backend/frontend/assets/git-pull-request-create-arrow-BOgAjTFS.js +6 -0
- vibe_surf/backend/frontend/assets/git-pull-request-draft-D_pN85AJ.js +6 -0
- vibe_surf/backend/frontend/assets/github-DB1aZt0L.js +6 -0
- vibe_surf/backend/frontend/assets/gitlab-BMP4NP3r.js +6 -0
- vibe_surf/backend/frontend/assets/glass-water-BEC0MS3z.js +6 -0
- vibe_surf/backend/frontend/assets/glasses-CfTHXtX7.js +6 -0
- vibe_surf/backend/frontend/assets/globe-Dqq-nhcy.js +6 -0
- vibe_surf/backend/frontend/assets/globe-lock-BfeWqRWO.js +6 -0
- vibe_surf/backend/frontend/assets/goal-C-PhIQ4S.js +6 -0
- vibe_surf/backend/frontend/assets/grab-DdIFtKhV.js +6 -0
- vibe_surf/backend/frontend/assets/graduation-cap-CwxzapTt.js +6 -0
- vibe_surf/backend/frontend/assets/grape-BrXELEz9.js +6 -0
- vibe_surf/backend/frontend/assets/grid-2x2-D8v9ysk4.js +6 -0
- vibe_surf/backend/frontend/assets/grid-2x2-check-CSZSWQ5C.js +6 -0
- vibe_surf/backend/frontend/assets/grid-2x2-plus-01llG4f2.js +6 -0
- vibe_surf/backend/frontend/assets/grid-2x2-x-D0_11tKc.js +6 -0
- vibe_surf/backend/frontend/assets/grid-3x3-CquAt5Fe.js +6 -0
- vibe_surf/backend/frontend/assets/grip-DzkE91_C.js +6 -0
- vibe_surf/backend/frontend/assets/grip-horizontal-9smTJuh8.js +6 -0
- vibe_surf/backend/frontend/assets/grip-vertical-BazF71zy.js +6 -0
- vibe_surf/backend/frontend/assets/group-DJPqVGM9.js +6 -0
- vibe_surf/backend/frontend/assets/guitar-Bj7040UW.js +6 -0
- vibe_surf/backend/frontend/assets/ham-DqF9nY3K.js +6 -0
- vibe_surf/backend/frontend/assets/hammer-D5nCkk93.js +6 -0
- vibe_surf/backend/frontend/assets/hand-D3aHt5Jp.js +6 -0
- vibe_surf/backend/frontend/assets/hand-coins-DgGrUIw3.js +6 -0
- vibe_surf/backend/frontend/assets/hand-heart-D-ejt1w9.js +6 -0
- vibe_surf/backend/frontend/assets/hand-helping-BJx7aYP8.js +6 -0
- vibe_surf/backend/frontend/assets/hand-metal-D_9PgLDn.js +6 -0
- vibe_surf/backend/frontend/assets/hand-platter-B6MPED_R.js +6 -0
- vibe_surf/backend/frontend/assets/handshake-5mCL50jm.js +6 -0
- vibe_surf/backend/frontend/assets/hard-drive-D06Pr4Fr.js +6 -0
- vibe_surf/backend/frontend/assets/hard-drive-download-DV7i6zaz.js +6 -0
- vibe_surf/backend/frontend/assets/hard-drive-upload-qc50ymdt.js +6 -0
- vibe_surf/backend/frontend/assets/hard-hat-BHAORALK.js +6 -0
- vibe_surf/backend/frontend/assets/hash-DTUBYWfA.js +6 -0
- vibe_surf/backend/frontend/assets/haze-VZL9k3sN.js +6 -0
- vibe_surf/backend/frontend/assets/hdmi-port-De943wKH.js +6 -0
- vibe_surf/backend/frontend/assets/heading-1-BYwnxWwH.js +6 -0
- vibe_surf/backend/frontend/assets/heading-2-CqPhfYl0.js +6 -0
- vibe_surf/backend/frontend/assets/heading-3-CANI8m_-.js +6 -0
- vibe_surf/backend/frontend/assets/heading-4-BeqLaVrS.js +6 -0
- vibe_surf/backend/frontend/assets/heading-5-EhtPwD0Y.js +6 -0
- vibe_surf/backend/frontend/assets/heading-6-CzA0Vq0D.js +6 -0
- vibe_surf/backend/frontend/assets/heading-COny31IM.js +6 -0
- vibe_surf/backend/frontend/assets/headphone-off-XcT4H0Th.js +6 -0
- vibe_surf/backend/frontend/assets/headphones-INSavdLi.js +6 -0
- vibe_surf/backend/frontend/assets/headset-D46LhOQp.js +6 -0
- vibe_surf/backend/frontend/assets/heart-CnQaegyS.js +6 -0
- vibe_surf/backend/frontend/assets/heart-crack-CSaApcMZ.js +6 -0
- vibe_surf/backend/frontend/assets/heart-handshake-gpn_t0P6.js +6 -0
- vibe_surf/backend/frontend/assets/heart-minus-ByA4Xc3z.js +6 -0
- vibe_surf/backend/frontend/assets/heart-off-BaAxT8OM.js +6 -0
- vibe_surf/backend/frontend/assets/heart-plus-DsNgHyPq.js +6 -0
- vibe_surf/backend/frontend/assets/heart-pulse-mu0bRWr9.js +6 -0
- vibe_surf/backend/frontend/assets/heater-BZJRpXix.js +6 -0
- vibe_surf/backend/frontend/assets/hexagon-BOkIK8t8.js +6 -0
- vibe_surf/backend/frontend/assets/highlighter-BFjuqmg3.js +6 -0
- vibe_surf/backend/frontend/assets/history-Dc5zUj7o.js +6 -0
- vibe_surf/backend/frontend/assets/hop-BP2c2w0o.js +6 -0
- vibe_surf/backend/frontend/assets/hop-off-DvtutUIk.js +6 -0
- vibe_surf/backend/frontend/assets/hospital-CnB07zSL.js +6 -0
- vibe_surf/backend/frontend/assets/hotel-DcrYKMCA.js +6 -0
- vibe_surf/backend/frontend/assets/hourglass-5XoIreir.js +6 -0
- vibe_surf/backend/frontend/assets/house-7K0Log2X.js +6 -0
- vibe_surf/backend/frontend/assets/house-plug-BpGlsdom.js +6 -0
- vibe_surf/backend/frontend/assets/house-plus-CZa5w2xG.js +6 -0
- vibe_surf/backend/frontend/assets/house-wifi-D7WgCkxh.js +6 -0
- vibe_surf/backend/frontend/assets/ice-cream-bowl-CVO-vDDu.js +6 -0
- vibe_surf/backend/frontend/assets/ice-cream-cone-Be2L7luj.js +6 -0
- vibe_surf/backend/frontend/assets/id-card-DuJWEfZ1.js +6 -0
- vibe_surf/backend/frontend/assets/image-BHKjD-UF.js +6 -0
- vibe_surf/backend/frontend/assets/image-down-BxsvaSTP.js +6 -0
- vibe_surf/backend/frontend/assets/image-minus-BTyo6N_c.js +6 -0
- vibe_surf/backend/frontend/assets/image-off-CYgis6fN.js +6 -0
- vibe_surf/backend/frontend/assets/image-play-BH02lW6y.js +6 -0
- vibe_surf/backend/frontend/assets/image-plus-_CPkoXgl.js +6 -0
- vibe_surf/backend/frontend/assets/image-up-Ck7H6ALp.js +6 -0
- vibe_surf/backend/frontend/assets/image-upscale-BKY8Ql1Y.js +6 -0
- vibe_surf/backend/frontend/assets/images-C7PaOMX8.js +6 -0
- vibe_surf/backend/frontend/assets/import-XtX00yjR.js +6 -0
- vibe_surf/backend/frontend/assets/inbox-CHp1G1Tn.js +6 -0
- vibe_surf/backend/frontend/assets/indent-decrease-DTtNKMfY.js +6 -0
- vibe_surf/backend/frontend/assets/indent-increase-DInW8D_x.js +6 -0
- vibe_surf/backend/frontend/assets/index-1QRDbRlx.js +1 -0
- vibe_surf/backend/frontend/assets/index-2WLZ-LFU.js +1 -0
- vibe_surf/backend/frontend/assets/index-41veksKc.js +1 -0
- vibe_surf/backend/frontend/assets/index-9d3lQ4Wj.js +1 -0
- vibe_surf/backend/frontend/assets/index-A-NnAKzY.js +1 -0
- vibe_surf/backend/frontend/assets/index-B0uEIchy.js +1 -0
- vibe_surf/backend/frontend/assets/index-B6ckts6e.js +1 -0
- vibe_surf/backend/frontend/assets/index-B8eJzoCm.js +1 -0
- vibe_surf/backend/frontend/assets/index-BAjcuT2A.js +1 -0
- vibe_surf/backend/frontend/assets/index-BDpVuW9l.js +1 -0
- vibe_surf/backend/frontend/assets/index-BEzSx8JL.js +1 -0
- vibe_surf/backend/frontend/assets/index-BFZ6c4-2.js +1 -0
- vibe_surf/backend/frontend/assets/index-BHwpyLDU.js +1 -0
- vibe_surf/backend/frontend/assets/index-BJzwrRH0.js +1 -0
- vibe_surf/backend/frontend/assets/index-BKwrPgkD.js +1 -0
- vibe_surf/backend/frontend/assets/index-BLAOHAiB.js +1 -0
- vibe_surf/backend/frontend/assets/index-BMJN1BeZ.js +1 -0
- vibe_surf/backend/frontend/assets/index-BM_pQz6b.js +1 -0
- vibe_surf/backend/frontend/assets/index-BNGDVeR7.js +1 -0
- vibe_surf/backend/frontend/assets/index-BO1wzOz3.js +1 -0
- vibe_surf/backend/frontend/assets/index-BPwUN4EA.js +1 -0
- vibe_surf/backend/frontend/assets/index-BUpWUGFt.js +1 -0
- vibe_surf/backend/frontend/assets/index-BVOgCkqk.js +1 -0
- vibe_surf/backend/frontend/assets/index-BX8uYJvf.js +1 -0
- vibe_surf/backend/frontend/assets/index-BXwmSa5j.js +1 -0
- vibe_surf/backend/frontend/assets/index-BY5nAT18.js +1 -0
- vibe_surf/backend/frontend/assets/index-BZsjXFd9.js +1 -0
- vibe_surf/backend/frontend/assets/index-BaQ12pVy.js +1 -0
- vibe_surf/backend/frontend/assets/index-Bdh85PFk.js +1 -0
- vibe_surf/backend/frontend/assets/index-BdxAovDe.js +1 -0
- vibe_surf/backend/frontend/assets/index-BevOJcfm.js +1 -0
- vibe_surf/backend/frontend/assets/index-BhbPDv-7.js +20 -0
- vibe_surf/backend/frontend/assets/index-Bi2_nzSq.js +1 -0
- vibe_surf/backend/frontend/assets/index-BjuAKp39.js +1 -0
- vibe_surf/backend/frontend/assets/index-BkWReKus.js +1 -0
- vibe_surf/backend/frontend/assets/index-BlT0iN5E.css +1 -0
- vibe_surf/backend/frontend/assets/index-Bn_YwEX1.js +1 -0
- vibe_surf/backend/frontend/assets/index-BopyFI9_.js +1 -0
- vibe_surf/backend/frontend/assets/index-Bq-mBfcp.js +205 -0
- vibe_surf/backend/frontend/assets/index-BtNGro4J.js +1 -0
- vibe_surf/backend/frontend/assets/index-BtRUEqM8.js +1 -0
- vibe_surf/backend/frontend/assets/index-BvcS9R2I.js +1 -0
- vibe_surf/backend/frontend/assets/index-ByRMlFrn.js +1 -0
- vibe_surf/backend/frontend/assets/index-ByweJ-ba.js +1 -0
- vibe_surf/backend/frontend/assets/index-C-CvySwp.js +1 -0
- vibe_surf/backend/frontend/assets/index-C3Yoqcx6.js +2 -0
- vibe_surf/backend/frontend/assets/index-C3xUW7lX.js +1 -0
- vibe_surf/backend/frontend/assets/index-C6oR7Fin.js +1 -0
- vibe_surf/backend/frontend/assets/index-C6punO8E.js +1 -0
- vibe_surf/backend/frontend/assets/index-C7fGwI5N.js +1 -0
- vibe_surf/backend/frontend/assets/index-C9339APM.js +7427 -0
- vibe_surf/backend/frontend/assets/index-CAFKIjNb.js +1 -0
- vibe_surf/backend/frontend/assets/index-CEGDW591.js +1 -0
- vibe_surf/backend/frontend/assets/index-CGzeT9Yq.js +1 -0
- vibe_surf/backend/frontend/assets/index-CH-Snzdw.js +1 -0
- vibe_surf/backend/frontend/assets/index-CIFNJDFM.js +2723 -0
- vibe_surf/backend/frontend/assets/index-CNHcFn3X.js +1 -0
- vibe_surf/backend/frontend/assets/index-CP_bbwDH.js +1 -0
- vibe_surf/backend/frontend/assets/index-CQVSfKD9.js +1 -0
- vibe_surf/backend/frontend/assets/index-CaWx5V5s.js +1 -0
- vibe_surf/backend/frontend/assets/index-Cb0tGz07.js +1 -0
- vibe_surf/backend/frontend/assets/index-CbHKDInE.js +1 -0
- vibe_surf/backend/frontend/assets/index-CePGA63r.js +1 -0
- vibe_surf/backend/frontend/assets/index-CfUNPxF7.js +1 -0
- vibe_surf/backend/frontend/assets/index-CpUW-lWU.js +1 -0
- vibe_surf/backend/frontend/assets/index-Cscpd5G3.js +1 -0
- vibe_surf/backend/frontend/assets/index-Ct7oS9uE.js +1 -0
- vibe_surf/backend/frontend/assets/index-Cx_W-gua.js +1 -0
- vibe_surf/backend/frontend/assets/index-D-gd0ZjH.js +1 -0
- vibe_surf/backend/frontend/assets/index-D1366-Ey.js +1 -0
- vibe_surf/backend/frontend/assets/index-D1Rf-jZG.js +1 -0
- vibe_surf/backend/frontend/assets/index-D2RFrg2r.js +1 -0
- vibe_surf/backend/frontend/assets/index-D3_azQSf.js +108 -0
- vibe_surf/backend/frontend/assets/index-D5eASxXP.js +1 -0
- vibe_surf/backend/frontend/assets/index-D9fl0TdK.js +1 -0
- vibe_surf/backend/frontend/assets/index-DCiLjNmU.js +1 -0
- vibe_surf/backend/frontend/assets/index-DCxdgdvG.js +1 -0
- vibe_surf/backend/frontend/assets/index-DGXaF1oB.js +1 -0
- vibe_surf/backend/frontend/assets/index-DHy7kSom.js +1 -0
- vibe_surf/backend/frontend/assets/index-DKH6KC9o.js +1 -0
- vibe_surf/backend/frontend/assets/index-DKjZ06Bc.js +1 -0
- vibe_surf/backend/frontend/assets/index-DQ5b8TQ5.js +1 -0
- vibe_surf/backend/frontend/assets/index-DQPs4Zqk.js +1 -0
- vibe_surf/backend/frontend/assets/index-DSykqFxk.js +13 -0
- vibe_surf/backend/frontend/assets/index-DVXnylY4.js +1 -0
- vibe_surf/backend/frontend/assets/index-DWberIXV.js +1 -0
- vibe_surf/backend/frontend/assets/index-DWq2xFSF.js +1 -0
- vibe_surf/backend/frontend/assets/index-DWrrUV4U.js +1 -0
- vibe_surf/backend/frontend/assets/index-DXK7n3cr.js +1 -0
- vibe_surf/backend/frontend/assets/index-DYtHFNkM.js +1 -0
- vibe_surf/backend/frontend/assets/index-D_v35WKd.js +1 -0
- vibe_surf/backend/frontend/assets/index-Dbs5qCFv.js +1 -0
- vibe_surf/backend/frontend/assets/index-DcdjKErJ.js +1 -0
- vibe_surf/backend/frontend/assets/index-DeGB92Vc.js +1 -0
- vibe_surf/backend/frontend/assets/index-DfkDcbqO.js +1 -0
- vibe_surf/backend/frontend/assets/index-Dg5uvyoa.js +1 -0
- vibe_surf/backend/frontend/assets/index-DjuYMrz5.js +1 -0
- vibe_surf/backend/frontend/assets/index-Djz3krhV.js +1 -0
- vibe_surf/backend/frontend/assets/index-DtEKUsaA.js +1 -0
- vibe_surf/backend/frontend/assets/index-DtKEeqjg.js +1 -0
- vibe_surf/backend/frontend/assets/index-DtO-Tei2.js +1 -0
- vibe_surf/backend/frontend/assets/index-DuMKqLcc.js +1 -0
- vibe_surf/backend/frontend/assets/index-DwqWXmr0.js +1 -0
- vibe_surf/backend/frontend/assets/index-Dxb4Fp5u.js +1 -0
- vibe_surf/backend/frontend/assets/index-ElUTfe6y.js +1 -0
- vibe_surf/backend/frontend/assets/index-F4DPTTmW.js +21 -0
- vibe_surf/backend/frontend/assets/index-F7N4-tp0.js +1 -0
- vibe_surf/backend/frontend/assets/index-FM3NE49p.js +1 -0
- vibe_surf/backend/frontend/assets/index-HXgxnl2q.js +1 -0
- vibe_surf/backend/frontend/assets/index-HY6HZeH-.js +1 -0
- vibe_surf/backend/frontend/assets/index-JU1gFC-s.js +1 -0
- vibe_surf/backend/frontend/assets/index-PsRZzqdR.js +1 -0
- vibe_surf/backend/frontend/assets/index-Q9VIxKEz.js +1 -0
- vibe_surf/backend/frontend/assets/index-RroJUq2p.js +1 -0
- vibe_surf/backend/frontend/assets/index-UE8QCPYd.js +1 -0
- vibe_surf/backend/frontend/assets/index-VdxoDWfx.js +1 -0
- vibe_surf/backend/frontend/assets/index-YIS8NPcp.js +1 -0
- vibe_surf/backend/frontend/assets/index-ZBnWfhuO.js +1 -0
- vibe_surf/backend/frontend/assets/index-_00eK0dx.js +1 -0
- vibe_surf/backend/frontend/assets/index-ciR61sXL.js +1 -0
- vibe_surf/backend/frontend/assets/index-hvkkGC_C.js +1 -0
- vibe_surf/backend/frontend/assets/index-iirYVAS4.js +1 -0
- vibe_surf/backend/frontend/assets/index-irsZgDst.js +1 -0
- vibe_surf/backend/frontend/assets/index-lJyWjBrf.js +1 -0
- vibe_surf/backend/frontend/assets/index-lpqC0HtC.js +1 -0
- vibe_surf/backend/frontend/assets/index-lr6s8TRd.js +1 -0
- vibe_surf/backend/frontend/assets/index-nikO1i2M.js +1 -0
- vibe_surf/backend/frontend/assets/index-rOe1xSiI.js +1 -0
- vibe_surf/backend/frontend/assets/index-tWBGHnad.js +1 -0
- vibe_surf/backend/frontend/assets/index-tsFLmLrl.js +1 -0
- vibe_surf/backend/frontend/assets/index-u-It3BPJ.js +1 -0
- vibe_surf/backend/frontend/assets/index-u7tDY3oQ.js +1 -0
- vibe_surf/backend/frontend/assets/indian-rupee-rcG3I_ik.js +6 -0
- vibe_surf/backend/frontend/assets/infinity-D2vde04W.js +6 -0
- vibe_surf/backend/frontend/assets/info-DCBxRgu8.js +6 -0
- vibe_surf/backend/frontend/assets/inspection-panel-D1NHUrhL.js +6 -0
- vibe_surf/backend/frontend/assets/instagram-CJjKKid7.js +6 -0
- vibe_surf/backend/frontend/assets/italic-4Xc96EXs.js +6 -0
- vibe_surf/backend/frontend/assets/iteration-ccw-Bv46VJuw.js +6 -0
- vibe_surf/backend/frontend/assets/iteration-cw-D1aiWDvA.js +6 -0
- vibe_surf/backend/frontend/assets/japanese-yen-iCW2ETCz.js +6 -0
- vibe_surf/backend/frontend/assets/joystick-DpYFj9GD.js +6 -0
- vibe_surf/backend/frontend/assets/kanban-Bi2WetF9.js +6 -0
- vibe_surf/backend/frontend/assets/key-CVsuJN4n.js +6 -0
- vibe_surf/backend/frontend/assets/key-round-DnXQqmxg.js +6 -0
- vibe_surf/backend/frontend/assets/key-square-C923Z847.js +6 -0
- vibe_surf/backend/frontend/assets/keyboard-CbihMjR7.js +6 -0
- vibe_surf/backend/frontend/assets/keyboard-music-z9LKvpAM.js +6 -0
- vibe_surf/backend/frontend/assets/keyboard-off-7iFjxyhx.js +6 -0
- vibe_surf/backend/frontend/assets/lamp-BtrnuKcM.js +6 -0
- vibe_surf/backend/frontend/assets/lamp-ceiling-BC1utsWI.js +6 -0
- vibe_surf/backend/frontend/assets/lamp-desk-pkAXfQ8j.js +6 -0
- vibe_surf/backend/frontend/assets/lamp-floor-vTmpCx0w.js +6 -0
- vibe_surf/backend/frontend/assets/lamp-wall-down-lOG8ziR3.js +6 -0
- vibe_surf/backend/frontend/assets/lamp-wall-up-CZPE8AI2.js +6 -0
- vibe_surf/backend/frontend/assets/land-plot-C8hHfhfO.js +6 -0
- vibe_surf/backend/frontend/assets/landmark-f1Ab1l9u.js +6 -0
- vibe_surf/backend/frontend/assets/languages-CRCZA8-s.js +6 -0
- vibe_surf/backend/frontend/assets/laptop-DSbK7NcM.js +6 -0
- vibe_surf/backend/frontend/assets/laptop-minimal-DasoCoN2.js +6 -0
- vibe_surf/backend/frontend/assets/laptop-minimal-check-lZ_bsJ5w.js +6 -0
- vibe_surf/backend/frontend/assets/lasso-DlJ-otu7.js +6 -0
- vibe_surf/backend/frontend/assets/lasso-select-BYwDXrvF.js +6 -0
- vibe_surf/backend/frontend/assets/laugh-C4s0yYY7.js +6 -0
- vibe_surf/backend/frontend/assets/layers-2-37YpnxFQ.js +6 -0
- vibe_surf/backend/frontend/assets/layers-DE4bYq54.js +6 -0
- vibe_surf/backend/frontend/assets/layout-dashboard-BwQq8lH9.js +6 -0
- vibe_surf/backend/frontend/assets/layout-grid-D3mog0PH.js +6 -0
- vibe_surf/backend/frontend/assets/layout-list-hbueXQMH.js +6 -0
- vibe_surf/backend/frontend/assets/layout-panel-left-DqWFlQAM.js +6 -0
- vibe_surf/backend/frontend/assets/layout-panel-top-CTffvfmV.js +6 -0
- vibe_surf/backend/frontend/assets/layout-template-DGqYJhgj.js +6 -0
- vibe_surf/backend/frontend/assets/lazyIconImports-Dp0wlOKL.js +2 -0
- vibe_surf/backend/frontend/assets/leaf-DmquW3E7.js +6 -0
- vibe_surf/backend/frontend/assets/leafy-green-BznFobCL.js +6 -0
- vibe_surf/backend/frontend/assets/lectern-DqoFltAf.js +6 -0
- vibe_surf/backend/frontend/assets/letter-text-DO4JCJop.js +6 -0
- vibe_surf/backend/frontend/assets/library-CIMhvcn4.js +6 -0
- vibe_surf/backend/frontend/assets/library-big-CZ8lXboA.js +6 -0
- vibe_surf/backend/frontend/assets/life-buoy-7TSJy9Vb.js +6 -0
- vibe_surf/backend/frontend/assets/ligature-DBcaOHJh.js +6 -0
- vibe_surf/backend/frontend/assets/lightbulb-off-DbjjujiQ.js +6 -0
- vibe_surf/backend/frontend/assets/lightbulb-qkF0YBSU.js +6 -0
- vibe_surf/backend/frontend/assets/link-2-DcH4c4Zc.js +6 -0
- vibe_surf/backend/frontend/assets/link-2-off-DZtuwC5E.js +6 -0
- vibe_surf/backend/frontend/assets/link-DESoaZbo.js +6 -0
- vibe_surf/backend/frontend/assets/linkedin-JjhHmfb4.js +6 -0
- vibe_surf/backend/frontend/assets/list-BrsM64GA.js +6 -0
- vibe_surf/backend/frontend/assets/list-check-CtjFfEK5.js +6 -0
- vibe_surf/backend/frontend/assets/list-checks-DxI2RAHU.js +6 -0
- vibe_surf/backend/frontend/assets/list-collapse-D36HfFAg.js +6 -0
- vibe_surf/backend/frontend/assets/list-end-CnJtPKq2.js +6 -0
- vibe_surf/backend/frontend/assets/list-filter-DQxcz9Im.js +6 -0
- vibe_surf/backend/frontend/assets/list-filter-plus-1zWKh3Nm.js +6 -0
- vibe_surf/backend/frontend/assets/list-minus-CyVCCiP_.js +6 -0
- vibe_surf/backend/frontend/assets/list-music-D2HdEP57.js +6 -0
- vibe_surf/backend/frontend/assets/list-ordered-CI7Q_Z9U.js +6 -0
- vibe_surf/backend/frontend/assets/list-plus-I-ukKH95.js +6 -0
- vibe_surf/backend/frontend/assets/list-restart-BOmwZvpJ.js +6 -0
- vibe_surf/backend/frontend/assets/list-start-s5mFyIxZ.js +6 -0
- vibe_surf/backend/frontend/assets/list-todo-D3I3apKU.js +6 -0
- vibe_surf/backend/frontend/assets/list-tree-dyo6CmDo.js +6 -0
- vibe_surf/backend/frontend/assets/list-video-CDQAsx2G.js +6 -0
- vibe_surf/backend/frontend/assets/list-x-D9NZrtY3.js +6 -0
- vibe_surf/backend/frontend/assets/loader-CZ21EXUH.js +6 -0
- vibe_surf/backend/frontend/assets/loader-circle-BAGc2Gyq.js +6 -0
- vibe_surf/backend/frontend/assets/loader-pinwheel-oc0KDAfx.js +6 -0
- vibe_surf/backend/frontend/assets/locate-fixed-D_gZAi7M.js +6 -0
- vibe_surf/backend/frontend/assets/locate-off-BguB-1e7.js +6 -0
- vibe_surf/backend/frontend/assets/locate-zrCi8zTL.js +6 -0
- vibe_surf/backend/frontend/assets/location-edit-DUKBaV8w.js +6 -0
- vibe_surf/backend/frontend/assets/lock-BIBTiJVb.js +6 -0
- vibe_surf/backend/frontend/assets/lock-keyhole-DfdvlImE.js +6 -0
- vibe_surf/backend/frontend/assets/lock-keyhole-open-BipWMyE2.js +6 -0
- vibe_surf/backend/frontend/assets/lock-open-hTIIUDhX.js +6 -0
- vibe_surf/backend/frontend/assets/log-in-MUY14PK3.js +6 -0
- vibe_surf/backend/frontend/assets/log-out-N9vOM_hV.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-xWQAk8xE.js +6 -0
- vibe_surf/backend/frontend/assets/lollipop-BfATjFdL.js +6 -0
- vibe_surf/backend/frontend/assets/luggage-C1usgXJA.js +6 -0
- vibe_surf/backend/frontend/assets/magnet-D4uLriLI.js +6 -0
- vibe_surf/backend/frontend/assets/mail-D1FO7Cd4.js +6 -0
- vibe_surf/backend/frontend/assets/mail-check-Ci8WpRcY.js +6 -0
- vibe_surf/backend/frontend/assets/mail-minus-BLSsQTLT.js +6 -0
- vibe_surf/backend/frontend/assets/mail-open-CDCHTm4u.js +6 -0
- vibe_surf/backend/frontend/assets/mail-plus-B7daS-9R.js +6 -0
- vibe_surf/backend/frontend/assets/mail-question-BOoY5VoI.js +6 -0
- vibe_surf/backend/frontend/assets/mail-search-lWL0T5KM.js +6 -0
- vibe_surf/backend/frontend/assets/mail-warning-C1kPMLkO.js +6 -0
- vibe_surf/backend/frontend/assets/mail-x-BbCGpB0U.js +6 -0
- vibe_surf/backend/frontend/assets/mailbox-BelIMLh1.js +6 -0
- vibe_surf/backend/frontend/assets/mails-XSNGLIg6.js +6 -0
- vibe_surf/backend/frontend/assets/map-BPfRs5M-.js +6 -0
- vibe_surf/backend/frontend/assets/map-pin-Bo9rjzwT.js +6 -0
- vibe_surf/backend/frontend/assets/map-pin-check-inside-BOCQ9hdx.js +6 -0
- vibe_surf/backend/frontend/assets/map-pin-check-lZYfidYB.js +6 -0
- vibe_surf/backend/frontend/assets/map-pin-house-BAzpMjxM.js +6 -0
- vibe_surf/backend/frontend/assets/map-pin-minus-e1pq_tox.js +6 -0
- vibe_surf/backend/frontend/assets/map-pin-minus-inside-bYTcKr95.js +6 -0
- vibe_surf/backend/frontend/assets/map-pin-off-COQWPB1x.js +6 -0
- vibe_surf/backend/frontend/assets/map-pin-plus-BkWI2rar.js +6 -0
- vibe_surf/backend/frontend/assets/map-pin-plus-inside-BROwcC6D.js +6 -0
- vibe_surf/backend/frontend/assets/map-pin-x-D2Ku6Hux.js +6 -0
- vibe_surf/backend/frontend/assets/map-pin-x-inside-BgzSyApf.js +6 -0
- vibe_surf/backend/frontend/assets/map-pinned-BujJSPdd.js +6 -0
- vibe_surf/backend/frontend/assets/map-plus-B6j30feS.js +6 -0
- vibe_surf/backend/frontend/assets/mars-DYINnF77.js +6 -0
- vibe_surf/backend/frontend/assets/mars-stroke-CBsC9ZKU.js +6 -0
- vibe_surf/backend/frontend/assets/martini-CXUAUOfs.js +6 -0
- vibe_surf/backend/frontend/assets/maximize-BFF7J1ik.js +6 -0
- vibe_surf/backend/frontend/assets/medal-DgHUWfiy.js +6 -0
- vibe_surf/backend/frontend/assets/megaphone-ChknVYgu.js +6 -0
- vibe_surf/backend/frontend/assets/megaphone-off-B2DuwOZL.js +6 -0
- vibe_surf/backend/frontend/assets/meh-BkI_z7Fm.js +6 -0
- vibe_surf/backend/frontend/assets/memory-stick-jnV8BZ8U.js +6 -0
- vibe_surf/backend/frontend/assets/menu-BGWdm1VM.js +6 -0
- vibe_surf/backend/frontend/assets/merge-0CrgnCFa.js +6 -0
- vibe_surf/backend/frontend/assets/message-circle-Nfutonhc.js +6 -0
- vibe_surf/backend/frontend/assets/message-circle-code-eh8g5zEn.js +6 -0
- vibe_surf/backend/frontend/assets/message-circle-dashed-134APd-i.js +6 -0
- vibe_surf/backend/frontend/assets/message-circle-heart-CCfEj0L4.js +6 -0
- vibe_surf/backend/frontend/assets/message-circle-more-NvNEYrao.js +6 -0
- vibe_surf/backend/frontend/assets/message-circle-off-D9JSF2R5.js +6 -0
- vibe_surf/backend/frontend/assets/message-circle-plus-CxUrzbkE.js +6 -0
- vibe_surf/backend/frontend/assets/message-circle-question-B1AjvIzW.js +6 -0
- vibe_surf/backend/frontend/assets/message-circle-reply-Cq_LGdpm.js +6 -0
- vibe_surf/backend/frontend/assets/message-circle-warning-CJZzVFuj.js +6 -0
- vibe_surf/backend/frontend/assets/message-circle-x-CFaT7HUf.js +6 -0
- vibe_surf/backend/frontend/assets/message-square-TdNl2hum.js +6 -0
- vibe_surf/backend/frontend/assets/message-square-code-HRbe8Bot.js +6 -0
- vibe_surf/backend/frontend/assets/message-square-dashed-DV41vJ2v.js +6 -0
- vibe_surf/backend/frontend/assets/message-square-diff-D1P5SKIl.js +6 -0
- vibe_surf/backend/frontend/assets/message-square-dot-CLfBOSjb.js +6 -0
- vibe_surf/backend/frontend/assets/message-square-heart-Cx9wpKea.js +6 -0
- vibe_surf/backend/frontend/assets/message-square-lock-CGv0fUwZ.js +6 -0
- vibe_surf/backend/frontend/assets/message-square-more-BTf56lQh.js +6 -0
- vibe_surf/backend/frontend/assets/message-square-off-CAuO9gJt.js +6 -0
- vibe_surf/backend/frontend/assets/message-square-plus-DIt_XzdR.js +6 -0
- vibe_surf/backend/frontend/assets/message-square-quote-BpZpFxZD.js +6 -0
- vibe_surf/backend/frontend/assets/message-square-reply-CJyI4MAQ.js +6 -0
- vibe_surf/backend/frontend/assets/message-square-share-DARwiA0s.js +6 -0
- vibe_surf/backend/frontend/assets/message-square-text-huSgEB4l.js +6 -0
- vibe_surf/backend/frontend/assets/message-square-warning-BW-imgi9.js +6 -0
- vibe_surf/backend/frontend/assets/message-square-x-DlDleCY5.js +6 -0
- vibe_surf/backend/frontend/assets/messages-square-BdxEbF0a.js +6 -0
- vibe_surf/backend/frontend/assets/mic-B4lpPP8o.js +6 -0
- vibe_surf/backend/frontend/assets/mic-off-BDjkMW2k.js +6 -0
- vibe_surf/backend/frontend/assets/mic-vocal-DjTJgrSN.js +6 -0
- vibe_surf/backend/frontend/assets/microchip-D9WgoQgG.js +6 -0
- vibe_surf/backend/frontend/assets/microscope-DhRdwj9u.js +6 -0
- vibe_surf/backend/frontend/assets/microwave-Cx-cktmw.js +6 -0
- vibe_surf/backend/frontend/assets/milestone-Bn4J2gZ5.js +6 -0
- vibe_surf/backend/frontend/assets/milk-BwNuvCod.js +6 -0
- vibe_surf/backend/frontend/assets/milk-off-B7Czys2l.js +6 -0
- vibe_surf/backend/frontend/assets/minimize-2-Dyq0b2X5.js +6 -0
- vibe_surf/backend/frontend/assets/minimize-DpN4-eh5.js +6 -0
- vibe_surf/backend/frontend/assets/monitor-BMDueoJx.js +6 -0
- vibe_surf/backend/frontend/assets/monitor-check-B0ttZdSb.js +6 -0
- vibe_surf/backend/frontend/assets/monitor-cog-DSEVRX-K.js +6 -0
- vibe_surf/backend/frontend/assets/monitor-dot-C1rbXtsC.js +6 -0
- vibe_surf/backend/frontend/assets/monitor-down-UsHNCHWw.js +6 -0
- vibe_surf/backend/frontend/assets/monitor-off-BWHYFnFW.js +6 -0
- vibe_surf/backend/frontend/assets/monitor-pause-VlURf6A2.js +6 -0
- vibe_surf/backend/frontend/assets/monitor-play-CtvDdBj_.js +6 -0
- vibe_surf/backend/frontend/assets/monitor-smartphone-BVRCMILq.js +6 -0
- vibe_surf/backend/frontend/assets/monitor-speaker-DaVpljSK.js +6 -0
- vibe_surf/backend/frontend/assets/monitor-stop-B1XZqOHJ.js +6 -0
- vibe_surf/backend/frontend/assets/monitor-up-6o6KBdRy.js +6 -0
- vibe_surf/backend/frontend/assets/monitor-x-DkPYSebu.js +6 -0
- vibe_surf/backend/frontend/assets/moon-BxM64e9B.js +6 -0
- vibe_surf/backend/frontend/assets/moon-star-Bn6pq89P.js +6 -0
- vibe_surf/backend/frontend/assets/mountain-Dn-Uh29Q.js +6 -0
- vibe_surf/backend/frontend/assets/mountain-snow-DDguiGic.js +6 -0
- vibe_surf/backend/frontend/assets/mouse-Ccu5uzLi.js +6 -0
- vibe_surf/backend/frontend/assets/mouse-off-DyDEs3d2.js +6 -0
- vibe_surf/backend/frontend/assets/mouse-pointer-2-D09hD9PW.js +6 -0
- vibe_surf/backend/frontend/assets/mouse-pointer-Cv_qu4W9.js +6 -0
- vibe_surf/backend/frontend/assets/mouse-pointer-ban-CyBqBoaN.js +6 -0
- vibe_surf/backend/frontend/assets/mouse-pointer-click-DjkLOlDc.js +6 -0
- vibe_surf/backend/frontend/assets/move-3d-CWvVC7tH.js +6 -0
- vibe_surf/backend/frontend/assets/move-CbFVB4UI.js +6 -0
- vibe_surf/backend/frontend/assets/move-diagonal-2-BJhYv952.js +6 -0
- vibe_surf/backend/frontend/assets/move-diagonal-BpdDHzBj.js +6 -0
- vibe_surf/backend/frontend/assets/move-down-CnVNMo5w.js +6 -0
- vibe_surf/backend/frontend/assets/move-down-left-Cm2dVHob.js +6 -0
- vibe_surf/backend/frontend/assets/move-down-right-DgtW1zsA.js +6 -0
- vibe_surf/backend/frontend/assets/move-horizontal-DEZvvuZ9.js +6 -0
- vibe_surf/backend/frontend/assets/move-left-Bsp9OXAN.js +6 -0
- vibe_surf/backend/frontend/assets/move-right-b3MvEDOZ.js +6 -0
- vibe_surf/backend/frontend/assets/move-up-left-CyLKc6_v.js +6 -0
- vibe_surf/backend/frontend/assets/move-up-q3QjQGGI.js +6 -0
- vibe_surf/backend/frontend/assets/move-up-right-CVzYXW8M.js +6 -0
- vibe_surf/backend/frontend/assets/move-vertical-BLDKghbu.js +6 -0
- vibe_surf/backend/frontend/assets/music-2-Cv7wxsen.js +6 -0
- vibe_surf/backend/frontend/assets/music-3-BAMkh7cd.js +6 -0
- vibe_surf/backend/frontend/assets/music-4-CxEbsNyP.js +6 -0
- vibe_surf/backend/frontend/assets/music-DI2LJ1pr.js +6 -0
- vibe_surf/backend/frontend/assets/navigation-2-CN7e4Syo.js +6 -0
- vibe_surf/backend/frontend/assets/navigation-2-off-Xfvx3297.js +6 -0
- vibe_surf/backend/frontend/assets/navigation-CTZ2PK8B.js +6 -0
- vibe_surf/backend/frontend/assets/navigation-off-CA0_QNZ8.js +6 -0
- vibe_surf/backend/frontend/assets/network-DJgCGMs5.js +6 -0
- vibe_surf/backend/frontend/assets/newspaper-CncK5ZAP.js +6 -0
- vibe_surf/backend/frontend/assets/nfc-DHkaG7f6.js +6 -0
- vibe_surf/backend/frontend/assets/non-binary-DrHfkDpx.js +6 -0
- vibe_surf/backend/frontend/assets/notebook-Bu_56sbo.js +6 -0
- vibe_surf/backend/frontend/assets/notebook-pen-BfNCvEsp.js +6 -0
- vibe_surf/backend/frontend/assets/notebook-tabs-DXKJLdw0.js +6 -0
- vibe_surf/backend/frontend/assets/notebook-text-CLDwqJL4.js +6 -0
- vibe_surf/backend/frontend/assets/notepad-text-BzId44ui.js +6 -0
- vibe_surf/backend/frontend/assets/notepad-text-dashed-C2ifxTJ-.js +6 -0
- vibe_surf/backend/frontend/assets/nut-BflOPXDH.js +6 -0
- vibe_surf/backend/frontend/assets/nut-off-C7f4vuBh.js +6 -0
- vibe_surf/backend/frontend/assets/octagon-Cy5B14LK.js +6 -0
- vibe_surf/backend/frontend/assets/octagon-alert-BQnnyMAR.js +6 -0
- vibe_surf/backend/frontend/assets/octagon-minus-D4t-g_gW.js +6 -0
- vibe_surf/backend/frontend/assets/octagon-pause-D4ADMFHJ.js +6 -0
- vibe_surf/backend/frontend/assets/octagon-x-3lOoF8Wy.js +6 -0
- vibe_surf/backend/frontend/assets/omega-CAb2Yotb.js +6 -0
- vibe_surf/backend/frontend/assets/option-CIxLb5L5.js +6 -0
- vibe_surf/backend/frontend/assets/orbit-Cyp4vT1A.js +6 -0
- vibe_surf/backend/frontend/assets/origami-Bp-6CC8X.js +6 -0
- vibe_surf/backend/frontend/assets/package-2-CF7BAidm.js +6 -0
- vibe_surf/backend/frontend/assets/package-check-DKVi-M6g.js +6 -0
- vibe_surf/backend/frontend/assets/package-dwDgaGhA.js +6 -0
- vibe_surf/backend/frontend/assets/package-minus-mNyMzPhU.js +6 -0
- vibe_surf/backend/frontend/assets/package-open-D4CXb1O6.js +6 -0
- vibe_surf/backend/frontend/assets/package-plus-Dy5MsZf9.js +6 -0
- vibe_surf/backend/frontend/assets/package-search-1aN1Tfbn.js +6 -0
- vibe_surf/backend/frontend/assets/package-x-Br_OiHp7.js +6 -0
- vibe_surf/backend/frontend/assets/paint-bucket-BgqBhtcr.js +6 -0
- vibe_surf/backend/frontend/assets/paint-roller-BKJO-A3W.js +6 -0
- vibe_surf/backend/frontend/assets/paintbrush-Dr3zosPE.js +6 -0
- vibe_surf/backend/frontend/assets/paintbrush-vertical-C_SF0K9Y.js +6 -0
- vibe_surf/backend/frontend/assets/palette-cqdkJAwD.js +6 -0
- vibe_surf/backend/frontend/assets/panel-bottom-close-LR-vRGYT.js +6 -0
- vibe_surf/backend/frontend/assets/panel-bottom-dashed-DZpxppGi.js +6 -0
- vibe_surf/backend/frontend/assets/panel-bottom-open-BIDVhq4g.js +6 -0
- vibe_surf/backend/frontend/assets/panel-bottom-qNgkDPPB.js +6 -0
- vibe_surf/backend/frontend/assets/panel-left-close-jbvRjJyH.js +6 -0
- vibe_surf/backend/frontend/assets/panel-left-dashed-CGafwEEz.js +6 -0
- vibe_surf/backend/frontend/assets/panel-left-open-RdnDP8SA.js +6 -0
- vibe_surf/backend/frontend/assets/panel-right-DG2JkT_r.js +6 -0
- vibe_surf/backend/frontend/assets/panel-right-close-ON0hPuYG.js +6 -0
- vibe_surf/backend/frontend/assets/panel-right-dashed-BWDVhMO-.js +6 -0
- vibe_surf/backend/frontend/assets/panel-right-open-CKshqOyf.js +6 -0
- vibe_surf/backend/frontend/assets/panel-top-Dmxz_Mfs.js +6 -0
- vibe_surf/backend/frontend/assets/panel-top-close-DONOva6Y.js +6 -0
- vibe_surf/backend/frontend/assets/panel-top-dashed-D0pzC4ED.js +6 -0
- vibe_surf/backend/frontend/assets/panel-top-open-u6AKby5v.js +6 -0
- vibe_surf/backend/frontend/assets/panels-left-bottom-_pyxxhnv.js +6 -0
- vibe_surf/backend/frontend/assets/panels-right-bottom-DqdulV5k.js +6 -0
- vibe_surf/backend/frontend/assets/panels-top-left-8p6VuUOb.js +6 -0
- vibe_surf/backend/frontend/assets/paperclip-BlUFsNqR.js +6 -0
- vibe_surf/backend/frontend/assets/parentheses-CRp6hYJ6.js +6 -0
- vibe_surf/backend/frontend/assets/parking-meter-BKs-9jbh.js +6 -0
- vibe_surf/backend/frontend/assets/party-popper-DbzkvAli.js +6 -0
- vibe_surf/backend/frontend/assets/paw-print-BbMlkOEO.js +6 -0
- vibe_surf/backend/frontend/assets/pc-case-BSIAwfze.js +6 -0
- vibe_surf/backend/frontend/assets/pen-D9TSq5aq.js +6 -0
- vibe_surf/backend/frontend/assets/pen-line-C3NzRPd3.js +6 -0
- vibe_surf/backend/frontend/assets/pen-off-D05y9ref.js +6 -0
- vibe_surf/backend/frontend/assets/pen-tool-D9p9RNoA.js +6 -0
- vibe_surf/backend/frontend/assets/pencil-BKpQNzvp.js +6 -0
- vibe_surf/backend/frontend/assets/pencil-line-Bdq6780_.js +6 -0
- vibe_surf/backend/frontend/assets/pencil-off-CZ7lI3k0.js +6 -0
- vibe_surf/backend/frontend/assets/pencil-ruler-D2QniS9D.js +6 -0
- vibe_surf/backend/frontend/assets/pentagon-CL0P-2Be.js +6 -0
- vibe_surf/backend/frontend/assets/percent-BM6Kl-Hu.js +6 -0
- vibe_surf/backend/frontend/assets/person-standing-CpyRtsce.js +6 -0
- vibe_surf/backend/frontend/assets/philippine-peso-D5bFWvtm.js +6 -0
- vibe_surf/backend/frontend/assets/phone-K9-s3Bu6.js +6 -0
- vibe_surf/backend/frontend/assets/phone-call-BMuuoOHh.js +6 -0
- vibe_surf/backend/frontend/assets/phone-forwarded-D-nD-ssq.js +6 -0
- vibe_surf/backend/frontend/assets/phone-incoming-Ct97uBnX.js +6 -0
- vibe_surf/backend/frontend/assets/phone-missed-Dl1yFHA8.js +6 -0
- vibe_surf/backend/frontend/assets/phone-off-CIIiW4DK.js +6 -0
- vibe_surf/backend/frontend/assets/phone-outgoing-Bn21zfLf.js +6 -0
- vibe_surf/backend/frontend/assets/pi-KBaiCIkJ.js +6 -0
- vibe_surf/backend/frontend/assets/piano-Cor-6BQM.js +6 -0
- vibe_surf/backend/frontend/assets/pickaxe-JX5oJ1hy.js +6 -0
- vibe_surf/backend/frontend/assets/picture-in-picture-2-CSmStCZ4.js +6 -0
- vibe_surf/backend/frontend/assets/picture-in-picture-yDdZDNRC.js +6 -0
- vibe_surf/backend/frontend/assets/piggy-bank-D9sTa-am.js +6 -0
- vibe_surf/backend/frontend/assets/pilcrow-B6Aeks47.js +6 -0
- vibe_surf/backend/frontend/assets/pilcrow-left-BQvCcQzh.js +6 -0
- vibe_surf/backend/frontend/assets/pilcrow-right-CrxOjUOh.js +6 -0
- vibe_surf/backend/frontend/assets/pill-DhPudta1.js +6 -0
- vibe_surf/backend/frontend/assets/pill-bottle-BCzORdwx.js +6 -0
- vibe_surf/backend/frontend/assets/pin-MT9TvItb.js +6 -0
- vibe_surf/backend/frontend/assets/pin-off-C4sFwE93.js +6 -0
- vibe_surf/backend/frontend/assets/pipette-BE16X0Zc.js +6 -0
- vibe_surf/backend/frontend/assets/pizza-Cwfm_kaE.js +6 -0
- vibe_surf/backend/frontend/assets/plane-Ct0cOHRo.js +6 -0
- vibe_surf/backend/frontend/assets/plane-landing-Ct4oV7kn.js +6 -0
- vibe_surf/backend/frontend/assets/plane-takeoff-IjpPtaS6.js +6 -0
- vibe_surf/backend/frontend/assets/plug-2-Cn9EdPUM.js +6 -0
- vibe_surf/backend/frontend/assets/plug-pQlGzx_B.js +6 -0
- vibe_surf/backend/frontend/assets/plug-zap-9nF6PFtm.js +6 -0
- vibe_surf/backend/frontend/assets/pocket-3pOTAnEC.js +6 -0
- vibe_surf/backend/frontend/assets/pocket-knife-TKmUVvO9.js +6 -0
- vibe_surf/backend/frontend/assets/podcast-BHXE6S9W.js +6 -0
- vibe_surf/backend/frontend/assets/pointer-BzZXhAOc.js +6 -0
- vibe_surf/backend/frontend/assets/pointer-off-CC5B3RYl.js +6 -0
- vibe_surf/backend/frontend/assets/popcorn-COypVWGN.js +6 -0
- vibe_surf/backend/frontend/assets/popsicle-CmV5g-9P.js +6 -0
- vibe_surf/backend/frontend/assets/pound-sterling-CRW7qDBu.js +6 -0
- vibe_surf/backend/frontend/assets/power-CeN1_ifF.js +6 -0
- vibe_surf/backend/frontend/assets/power-off-DnruOFHO.js +6 -0
- vibe_surf/backend/frontend/assets/presentation-BBhZ1T90.js +6 -0
- vibe_surf/backend/frontend/assets/printer-J_X9y3GJ.js +6 -0
- vibe_surf/backend/frontend/assets/printer-check-Xrof9OPX.js +6 -0
- vibe_surf/backend/frontend/assets/projector-Cr7pbU9O.js +6 -0
- vibe_surf/backend/frontend/assets/proportions-Bt_oONAD.js +6 -0
- vibe_surf/backend/frontend/assets/puzzle-BEB9dtqG.js +6 -0
- vibe_surf/backend/frontend/assets/pyramid-B63D_xCq.js +6 -0
- vibe_surf/backend/frontend/assets/qr-code-DD65EP-q.js +6 -0
- vibe_surf/backend/frontend/assets/quote-DGI0FmFV.js +6 -0
- vibe_surf/backend/frontend/assets/rabbit-BAAJvAQ1.js +6 -0
- vibe_surf/backend/frontend/assets/radar-DiWFjDof.js +6 -0
- vibe_surf/backend/frontend/assets/radiation-6S246_qf.js +6 -0
- vibe_surf/backend/frontend/assets/radical-B4h5Vjr-.js +6 -0
- vibe_surf/backend/frontend/assets/radio-DNjlx2h6.js +6 -0
- vibe_surf/backend/frontend/assets/radio-receiver-DVXCb1C2.js +6 -0
- vibe_surf/backend/frontend/assets/radio-tower-DUKttK3Q.js +6 -0
- vibe_surf/backend/frontend/assets/radius-NH2Pgs7n.js +6 -0
- vibe_surf/backend/frontend/assets/rail-symbol-y_83HZIX.js +6 -0
- vibe_surf/backend/frontend/assets/rainbow-ex4up0y_.js +6 -0
- vibe_surf/backend/frontend/assets/rat-DVSQEhd7.js +6 -0
- vibe_surf/backend/frontend/assets/ratio-Dv-gnu5W.js +6 -0
- vibe_surf/backend/frontend/assets/receipt-DKZm1LWG.js +6 -0
- vibe_surf/backend/frontend/assets/receipt-cent-5S25Pz-Y.js +6 -0
- vibe_surf/backend/frontend/assets/receipt-euro-BtPm6Ent.js +6 -0
- vibe_surf/backend/frontend/assets/receipt-indian-rupee-DUF2ASWh.js +6 -0
- vibe_surf/backend/frontend/assets/receipt-japanese-yen-DYwfBDPz.js +6 -0
- vibe_surf/backend/frontend/assets/receipt-pound-sterling-Dz03w-I-.js +6 -0
- vibe_surf/backend/frontend/assets/receipt-russian-ruble-BPvEoyQB.js +6 -0
- vibe_surf/backend/frontend/assets/receipt-swiss-franc-CE5V9HAu.js +6 -0
- vibe_surf/backend/frontend/assets/receipt-text-4jJUDNZL.js +6 -0
- vibe_surf/backend/frontend/assets/rectangle-ellipsis-CiMEZA-s.js +6 -0
- vibe_surf/backend/frontend/assets/rectangle-goggles-BbvMYFz0.js +6 -0
- vibe_surf/backend/frontend/assets/rectangle-horizontal-BBRMxKxu.js +6 -0
- vibe_surf/backend/frontend/assets/rectangle-vertical-CeoWO5KM.js +6 -0
- vibe_surf/backend/frontend/assets/recycle-BtU0aG4p.js +6 -0
- vibe_surf/backend/frontend/assets/redo-2-DluCWtO8.js +6 -0
- vibe_surf/backend/frontend/assets/redo-D-cP_Hkn.js +6 -0
- vibe_surf/backend/frontend/assets/redo-dot-D3AdCDPV.js +6 -0
- vibe_surf/backend/frontend/assets/refresh-ccw-PanlYmNP.js +6 -0
- vibe_surf/backend/frontend/assets/refresh-ccw-dot-BtKETZVW.js +6 -0
- vibe_surf/backend/frontend/assets/refresh-cw-2F9M9WA-.js +6 -0
- vibe_surf/backend/frontend/assets/refresh-cw-off-DfcoyDb0.js +6 -0
- vibe_surf/backend/frontend/assets/refrigerator-CjKO5bNs.js +6 -0
- vibe_surf/backend/frontend/assets/regex-DSjHOCWp.js +6 -0
- vibe_surf/backend/frontend/assets/remove-formatting-DNhVuOyu.js +6 -0
- vibe_surf/backend/frontend/assets/repeat-1-BWnjf3uj.js +6 -0
- vibe_surf/backend/frontend/assets/repeat-2-DtYtXQSH.js +6 -0
- vibe_surf/backend/frontend/assets/repeat-Bxz0odhG.js +6 -0
- vibe_surf/backend/frontend/assets/replace-BfkipbaZ.js +6 -0
- vibe_surf/backend/frontend/assets/replace-all-PgS4Wej3.js +6 -0
- vibe_surf/backend/frontend/assets/reply-B5lewwtx.js +6 -0
- vibe_surf/backend/frontend/assets/reply-all-0VOGnNa3.js +6 -0
- vibe_surf/backend/frontend/assets/rewind-BP7_fsYl.js +6 -0
- vibe_surf/backend/frontend/assets/ribbon-CCR_MZmZ.js +6 -0
- vibe_surf/backend/frontend/assets/robot-BsccFpqT.png +0 -0
- vibe_surf/backend/frontend/assets/rocket-BvI5E0xM.js +6 -0
- vibe_surf/backend/frontend/assets/rocking-chair-D9ciQaG2.js +6 -0
- vibe_surf/backend/frontend/assets/roller-coaster-CIYjsFvO.js +6 -0
- vibe_surf/backend/frontend/assets/rotate-3d-57_lqlxh.js +6 -0
- vibe_surf/backend/frontend/assets/rotate-ccw-Dv0afAgn.js +6 -0
- vibe_surf/backend/frontend/assets/rotate-ccw-key-BEfjwpDz.js +6 -0
- vibe_surf/backend/frontend/assets/rotate-ccw-square-DQw5wuXQ.js +6 -0
- vibe_surf/backend/frontend/assets/rotate-cw-square-BBVduPLL.js +6 -0
- vibe_surf/backend/frontend/assets/route-Cb5rOsHB.js +6 -0
- vibe_surf/backend/frontend/assets/route-off-DCvXXstI.js +6 -0
- vibe_surf/backend/frontend/assets/router-DY3g0wJU.js +6 -0
- vibe_surf/backend/frontend/assets/rows-2-aV0bv01v.js +6 -0
- vibe_surf/backend/frontend/assets/rows-3-YFUDa1KS.js +6 -0
- vibe_surf/backend/frontend/assets/rows-4---Zyqbpk.js +6 -0
- vibe_surf/backend/frontend/assets/rss-CXFLSLBN.js +6 -0
- vibe_surf/backend/frontend/assets/ruler-DqorlT-h.js +6 -0
- vibe_surf/backend/frontend/assets/ruler-dimension-line-7m0vG2Ir.js +6 -0
- vibe_surf/backend/frontend/assets/russian-ruble-C32P06TU.js +6 -0
- vibe_surf/backend/frontend/assets/sailboat-C0UyBVmA.js +6 -0
- vibe_surf/backend/frontend/assets/salad-DJ2OeKQ0.js +6 -0
- vibe_surf/backend/frontend/assets/sandwich-CWDihFSJ.js +6 -0
- vibe_surf/backend/frontend/assets/satellite-DWJiZMc4.js +6 -0
- vibe_surf/backend/frontend/assets/satellite-dish-CyKhq7bX.js +6 -0
- vibe_surf/backend/frontend/assets/saudi-riyal-CDMN7EuW.js +6 -0
- vibe_surf/backend/frontend/assets/save-Sf21IaPS.js +6 -0
- vibe_surf/backend/frontend/assets/save-all-CazGJB6d.js +6 -0
- vibe_surf/backend/frontend/assets/save-off-ClLS86SR.js +6 -0
- vibe_surf/backend/frontend/assets/scale-3d-BO2k-FAS.js +6 -0
- vibe_surf/backend/frontend/assets/scale-B1BMBPHE.js +6 -0
- vibe_surf/backend/frontend/assets/scaling-6FiHXVNt.js +6 -0
- vibe_surf/backend/frontend/assets/scan-BociKTm7.js +6 -0
- vibe_surf/backend/frontend/assets/scan-barcode-9a0RKd9F.js +6 -0
- vibe_surf/backend/frontend/assets/scan-eye-B4Fq_o4w.js +6 -0
- vibe_surf/backend/frontend/assets/scan-face-CQxrOJRg.js +6 -0
- vibe_surf/backend/frontend/assets/scan-heart-gC97XkVz.js +6 -0
- vibe_surf/backend/frontend/assets/scan-line-QZz3wllu.js +6 -0
- vibe_surf/backend/frontend/assets/scan-qr-code-CL7m0Abc.js +6 -0
- vibe_surf/backend/frontend/assets/scan-search-B5fLui1I.js +6 -0
- vibe_surf/backend/frontend/assets/scan-text-lBsygGB9.js +6 -0
- vibe_surf/backend/frontend/assets/school-CJrzwRC4.js +6 -0
- vibe_surf/backend/frontend/assets/scissors-line-dashed-BE64co8i.js +6 -0
- vibe_surf/backend/frontend/assets/scissors-pEw6Xaqr.js +6 -0
- vibe_surf/backend/frontend/assets/screen-share-BK2OnDwg.js +6 -0
- vibe_surf/backend/frontend/assets/screen-share-off-BXzQiMup.js +6 -0
- vibe_surf/backend/frontend/assets/scroll-DOu3NpFe.js +6 -0
- vibe_surf/backend/frontend/assets/scroll-text-Bkt7Rmng.js +6 -0
- vibe_surf/backend/frontend/assets/search-check-BijeS6tH.js +6 -0
- vibe_surf/backend/frontend/assets/search-code-DwYE8wkC.js +6 -0
- vibe_surf/backend/frontend/assets/search-slash-D0kKoqoN.js +6 -0
- vibe_surf/backend/frontend/assets/search-x-O8nHs6x_.js +6 -0
- vibe_surf/backend/frontend/assets/section-CDcMqQkw.js +6 -0
- vibe_surf/backend/frontend/assets/send-18rqzjQL.js +6 -0
- vibe_surf/backend/frontend/assets/send-horizontal-BlS3LSk8.js +6 -0
- vibe_surf/backend/frontend/assets/send-to-back-pQRkI1lQ.js +6 -0
- vibe_surf/backend/frontend/assets/separator-horizontal-DITxbxBK.js +6 -0
- vibe_surf/backend/frontend/assets/separator-vertical-s3Z8KVZ1.js +6 -0
- vibe_surf/backend/frontend/assets/server-BOW7Qnvk.js +6 -0
- vibe_surf/backend/frontend/assets/server-cog-BXqD_2iC.js +6 -0
- vibe_surf/backend/frontend/assets/server-crash-CdPSdSgW.js +6 -0
- vibe_surf/backend/frontend/assets/server-off-CRJxmnrh.js +6 -0
- vibe_surf/backend/frontend/assets/settings-2-CJHcPvMS.js +6 -0
- vibe_surf/backend/frontend/assets/settings-Bj8QCFrW.js +6 -0
- vibe_surf/backend/frontend/assets/shapes-DE19P8VB.js +6 -0
- vibe_surf/backend/frontend/assets/share-2-D_f9E9OI.js +6 -0
- vibe_surf/backend/frontend/assets/share-Dl2kwbyK.js +6 -0
- vibe_surf/backend/frontend/assets/sheet-D-7Wal14.js +6 -0
- vibe_surf/backend/frontend/assets/shell-CBntfIeY.js +6 -0
- vibe_surf/backend/frontend/assets/shield--hABef9x.js +6 -0
- vibe_surf/backend/frontend/assets/shield-alert-B4tE7sej.js +6 -0
- vibe_surf/backend/frontend/assets/shield-ban-CeAW94aR.js +6 -0
- vibe_surf/backend/frontend/assets/shield-check-BE77dRZh.js +6 -0
- vibe_surf/backend/frontend/assets/shield-ellipsis-09A4HS03.js +6 -0
- vibe_surf/backend/frontend/assets/shield-half-DKJcQwtx.js +6 -0
- vibe_surf/backend/frontend/assets/shield-minus-Bwqn7bCD.js +6 -0
- vibe_surf/backend/frontend/assets/shield-off-CNWzwcox.js +6 -0
- vibe_surf/backend/frontend/assets/shield-plus-DWaKzpCt.js +6 -0
- vibe_surf/backend/frontend/assets/shield-question-D_4Yva8t.js +6 -0
- vibe_surf/backend/frontend/assets/shield-user-B9IXYUW_.js +6 -0
- vibe_surf/backend/frontend/assets/shield-x-CiykLrl6.js +6 -0
- vibe_surf/backend/frontend/assets/ship-BScV8-bd.js +6 -0
- vibe_surf/backend/frontend/assets/ship-wheel-Djpjm-Ds.js +6 -0
- vibe_surf/backend/frontend/assets/shirt-BQYiVewb.js +6 -0
- vibe_surf/backend/frontend/assets/shopping-bag-CHEQVXZe.js +6 -0
- vibe_surf/backend/frontend/assets/shopping-basket-BN8OQ-W2.js +6 -0
- vibe_surf/backend/frontend/assets/shopping-cart-CrWWcNX6.js +6 -0
- vibe_surf/backend/frontend/assets/shovel-OV8umLfu.js +6 -0
- vibe_surf/backend/frontend/assets/shower-head-Bx7v6ZlC.js +6 -0
- vibe_surf/backend/frontend/assets/shredder-DqB2N_G-.js +6 -0
- vibe_surf/backend/frontend/assets/shrimp-uvf6awsH.js +6 -0
- vibe_surf/backend/frontend/assets/shrink-D_H8kRaB.js +6 -0
- vibe_surf/backend/frontend/assets/shrub-CkCwsaYP.js +6 -0
- vibe_surf/backend/frontend/assets/shuffle-Fq0KJO-a.js +6 -0
- vibe_surf/backend/frontend/assets/sigma-BR8bMoDL.js +6 -0
- vibe_surf/backend/frontend/assets/signal-TOctv2i0.js +6 -0
- vibe_surf/backend/frontend/assets/signal-high-u_iVhz3W.js +6 -0
- vibe_surf/backend/frontend/assets/signal-low-CLoQeV0B.js +6 -0
- vibe_surf/backend/frontend/assets/signal-medium-AwY8Ntei.js +6 -0
- vibe_surf/backend/frontend/assets/signal-zero-BEXPbo5k.js +6 -0
- vibe_surf/backend/frontend/assets/signature-Cgbo04nK.js +6 -0
- vibe_surf/backend/frontend/assets/signpost-BumCuKy8.js +6 -0
- vibe_surf/backend/frontend/assets/signpost-big-BRDDJu7l.js +6 -0
- vibe_surf/backend/frontend/assets/siren-Dmc1QgzA.js +6 -0
- vibe_surf/backend/frontend/assets/skip-back-DYGAhVaZ.js +6 -0
- vibe_surf/backend/frontend/assets/skip-forward-Cmo14QdF.js +6 -0
- vibe_surf/backend/frontend/assets/skull-C7f59NOY.js +6 -0
- vibe_surf/backend/frontend/assets/slack-BZCH_jmq.js +6 -0
- vibe_surf/backend/frontend/assets/slash-D508NrMk.js +6 -0
- vibe_surf/backend/frontend/assets/slice-X7STCda9.js +6 -0
- vibe_surf/backend/frontend/assets/sliders-horizontal-CfzazJ4Z.js +6 -0
- vibe_surf/backend/frontend/assets/sliders-vertical-CDP8j0-D.js +6 -0
- vibe_surf/backend/frontend/assets/smartphone-charging-BbvzdjcK.js +6 -0
- vibe_surf/backend/frontend/assets/smartphone-nfc-BUwpyAe9.js +6 -0
- vibe_surf/backend/frontend/assets/smartphone-vlXaYd7G.js +6 -0
- vibe_surf/backend/frontend/assets/smile-WIoPOV75.js +6 -0
- vibe_surf/backend/frontend/assets/smile-plus-C7_2KI6t.js +6 -0
- vibe_surf/backend/frontend/assets/snail-DiXb1jdv.js +6 -0
- vibe_surf/backend/frontend/assets/snowflake-DbaQxR5F.js +6 -0
- vibe_surf/backend/frontend/assets/sofa-3gaNXRHk.js +6 -0
- vibe_surf/backend/frontend/assets/soup-BJWMbLNe.js +6 -0
- vibe_surf/backend/frontend/assets/space-BgZ7M3kc.js +6 -0
- vibe_surf/backend/frontend/assets/spade-DmCswPx6.js +6 -0
- vibe_surf/backend/frontend/assets/sparkle-BcIeelqq.js +6 -0
- vibe_surf/backend/frontend/assets/sparkles-EZvTd48X.js +6 -0
- vibe_surf/backend/frontend/assets/speaker-cy8pASlT.js +6 -0
- vibe_surf/backend/frontend/assets/speech-D2DBEjZh.js +6 -0
- vibe_surf/backend/frontend/assets/spell-check-2-CT6j-nnq.js +6 -0
- vibe_surf/backend/frontend/assets/spell-check-BLpw53aW.js +6 -0
- vibe_surf/backend/frontend/assets/spline-Dj4_WV_J.js +6 -0
- vibe_surf/backend/frontend/assets/spline-pointer-B70ZX6Jx.js +6 -0
- vibe_surf/backend/frontend/assets/split-BUN_2DPl.js +6 -0
- vibe_surf/backend/frontend/assets/spray-can--CM3S7I1.js +6 -0
- vibe_surf/backend/frontend/assets/sprout-DHRMaLE1.js +6 -0
- vibe_surf/backend/frontend/assets/square-D8mSOgWq.js +6 -0
- vibe_surf/backend/frontend/assets/square-activity-HHBbub6x.js +6 -0
- vibe_surf/backend/frontend/assets/square-arrow-down-DNqGulvF.js +6 -0
- vibe_surf/backend/frontend/assets/square-arrow-down-left-mkEWcF4d.js +6 -0
- vibe_surf/backend/frontend/assets/square-arrow-down-right-BWWZbJCm.js +6 -0
- vibe_surf/backend/frontend/assets/square-arrow-left-DJJcrIld.js +6 -0
- vibe_surf/backend/frontend/assets/square-arrow-out-down-left-C4KWrLml.js +6 -0
- vibe_surf/backend/frontend/assets/square-arrow-out-down-right-CDptR_XX.js +6 -0
- vibe_surf/backend/frontend/assets/square-arrow-out-up-left-BwHPp6UO.js +6 -0
- vibe_surf/backend/frontend/assets/square-arrow-out-up-right-tzaptCUV.js +6 -0
- vibe_surf/backend/frontend/assets/square-arrow-right-DVcoFdqS.js +6 -0
- vibe_surf/backend/frontend/assets/square-arrow-up-BupGJOnJ.js +6 -0
- vibe_surf/backend/frontend/assets/square-arrow-up-left-w635cnEo.js +6 -0
- vibe_surf/backend/frontend/assets/square-arrow-up-right-C1ac-f2n.js +6 -0
- vibe_surf/backend/frontend/assets/square-asterisk-D6Cym7Xv.js +6 -0
- vibe_surf/backend/frontend/assets/square-bottom-dashed-scissors-BVNT9RSH.js +6 -0
- vibe_surf/backend/frontend/assets/square-chart-gantt-C3dcJ6sg.js +6 -0
- vibe_surf/backend/frontend/assets/square-check-S6hpNtFK.js +6 -0
- vibe_surf/backend/frontend/assets/square-check-big-D9upq6ft.js +6 -0
- vibe_surf/backend/frontend/assets/square-chevron-down-BA97_sqV.js +6 -0
- vibe_surf/backend/frontend/assets/square-chevron-left-CLiOdSzb.js +6 -0
- vibe_surf/backend/frontend/assets/square-chevron-right-t-igHrA_.js +6 -0
- vibe_surf/backend/frontend/assets/square-chevron-up-CbvwXecv.js +6 -0
- vibe_surf/backend/frontend/assets/square-code-DUqDccm-.js +6 -0
- vibe_surf/backend/frontend/assets/square-dashed-DAZVB5Ow.js +6 -0
- vibe_surf/backend/frontend/assets/square-dashed-bottom-DIHrivbQ.js +6 -0
- vibe_surf/backend/frontend/assets/square-dashed-bottom-code-BurWoYrF.js +6 -0
- vibe_surf/backend/frontend/assets/square-dashed-kanban-DJ3Nf0yW.js +6 -0
- vibe_surf/backend/frontend/assets/square-dashed-mouse-pointer-D83fN529.js +6 -0
- vibe_surf/backend/frontend/assets/square-divide-DfK2w5k3.js +6 -0
- vibe_surf/backend/frontend/assets/square-dot-E08KHmsT.js +6 -0
- vibe_surf/backend/frontend/assets/square-equal-DmilLTYr.js +6 -0
- vibe_surf/backend/frontend/assets/square-function-Bmr5-y7k.js +6 -0
- vibe_surf/backend/frontend/assets/square-kanban-C_Y3PzRd.js +6 -0
- vibe_surf/backend/frontend/assets/square-library-Bljg4ak_.js +6 -0
- vibe_surf/backend/frontend/assets/square-m-Bm5eCYFz.js +6 -0
- vibe_surf/backend/frontend/assets/square-menu-2PwZ-t8v.js +6 -0
- vibe_surf/backend/frontend/assets/square-minus-DB2rsSIh.js +6 -0
- vibe_surf/backend/frontend/assets/square-mouse-pointer-Yggd861r.js +6 -0
- vibe_surf/backend/frontend/assets/square-parking-0BMseCWh.js +6 -0
- vibe_surf/backend/frontend/assets/square-parking-off-wL1Aoald.js +6 -0
- vibe_surf/backend/frontend/assets/square-pen-DUgkyJvx.js +6 -0
- vibe_surf/backend/frontend/assets/square-percent-D1N2DxXQ.js +6 -0
- vibe_surf/backend/frontend/assets/square-pi-BAB-yOqi.js +6 -0
- vibe_surf/backend/frontend/assets/square-pilcrow-YTTQD0YQ.js +6 -0
- vibe_surf/backend/frontend/assets/square-play-D0CcTkr2.js +6 -0
- vibe_surf/backend/frontend/assets/square-plus-BdjiqtXM.js +6 -0
- vibe_surf/backend/frontend/assets/square-power-8LY4_Isa.js +6 -0
- vibe_surf/backend/frontend/assets/square-radical-DC1m2SHK.js +6 -0
- vibe_surf/backend/frontend/assets/square-round-corner-CYVVFjQx.js +6 -0
- vibe_surf/backend/frontend/assets/square-scissors-BZUPjoru.js +6 -0
- vibe_surf/backend/frontend/assets/square-sigma-CTgs2Ekn.js +6 -0
- vibe_surf/backend/frontend/assets/square-slash-DoZz--aG.js +6 -0
- vibe_surf/backend/frontend/assets/square-split-horizontal-C5VA-YKL.js +6 -0
- vibe_surf/backend/frontend/assets/square-split-vertical-br-5Oe8V.js +6 -0
- vibe_surf/backend/frontend/assets/square-square-D-S2fMQV.js +6 -0
- vibe_surf/backend/frontend/assets/square-stack-BpnJ--p7.js +6 -0
- vibe_surf/backend/frontend/assets/square-terminal-D1xyM5zr.js +6 -0
- vibe_surf/backend/frontend/assets/square-user-BM_UbMq8.js +6 -0
- vibe_surf/backend/frontend/assets/square-user-round-BjbE9Ex0.js +6 -0
- vibe_surf/backend/frontend/assets/square-x-ndOAHZyv.js +6 -0
- vibe_surf/backend/frontend/assets/squares-exclude-i1Cuf4eN.js +6 -0
- vibe_surf/backend/frontend/assets/squares-intersect-B_KkkCiA.js +6 -0
- vibe_surf/backend/frontend/assets/squares-subtract-0Gqt-l9r.js +6 -0
- vibe_surf/backend/frontend/assets/squares-unite-fFpeFJy_.js +6 -0
- vibe_surf/backend/frontend/assets/squircle-BWK1XIab.js +6 -0
- vibe_surf/backend/frontend/assets/squirrel-BemFtLhO.js +6 -0
- vibe_surf/backend/frontend/assets/stamp-n1s-2-vi.js +6 -0
- vibe_surf/backend/frontend/assets/star-JqPDEQO0.js +6 -0
- vibe_surf/backend/frontend/assets/star-half-Ctp-6K3f.js +6 -0
- vibe_surf/backend/frontend/assets/star-off-DTrat8iZ.js +6 -0
- vibe_surf/backend/frontend/assets/step-back-_f3vl_Mc.js +6 -0
- vibe_surf/backend/frontend/assets/step-forward-U0c2umRC.js +6 -0
- vibe_surf/backend/frontend/assets/stethoscope-BcOEujBx.js +6 -0
- vibe_surf/backend/frontend/assets/sticker-BUUkREla.js +6 -0
- vibe_surf/backend/frontend/assets/sticky-note-Dau-uEqX.js +6 -0
- vibe_surf/backend/frontend/assets/store-CDDYJAqq.js +6 -0
- vibe_surf/backend/frontend/assets/stretch-horizontal-C7d6gxZ-.js +6 -0
- vibe_surf/backend/frontend/assets/stretch-vertical-DwZ7L62M.js +6 -0
- vibe_surf/backend/frontend/assets/strikethrough-tErW_78t.js +6 -0
- vibe_surf/backend/frontend/assets/subscript-AEnn7z1-.js +6 -0
- vibe_surf/backend/frontend/assets/sun-CUhBOUww.js +6 -0
- vibe_surf/backend/frontend/assets/sun-dim-mjCyc7b-.js +6 -0
- vibe_surf/backend/frontend/assets/sun-medium-BlmZvs1P.js +6 -0
- vibe_surf/backend/frontend/assets/sun-moon-DNDzmGy_.js +6 -0
- vibe_surf/backend/frontend/assets/sun-snow-btXFhvOs.js +6 -0
- vibe_surf/backend/frontend/assets/sunrise-BPn0BvIU.js +6 -0
- vibe_surf/backend/frontend/assets/sunset-Bn6AsuaW.js +6 -0
- vibe_surf/backend/frontend/assets/superscript-CCWWx6fn.js +6 -0
- vibe_surf/backend/frontend/assets/swatch-book-DAO0_j5l.js +6 -0
- vibe_surf/backend/frontend/assets/swiss-franc-DvPAMwVi.js +6 -0
- vibe_surf/backend/frontend/assets/switch-camera-DDK45wsa.js +6 -0
- vibe_surf/backend/frontend/assets/sword-CdjQ03Nx.js +6 -0
- vibe_surf/backend/frontend/assets/swords-DwnTqFFL.js +6 -0
- vibe_surf/backend/frontend/assets/syringe-DMHMk3I_.js +6 -0
- vibe_surf/backend/frontend/assets/table-2-fXlN5mfo.js +6 -0
- vibe_surf/backend/frontend/assets/table-DywCQdAx.js +6 -0
- vibe_surf/backend/frontend/assets/table-cells-merge-1rBoZbUH.js +6 -0
- vibe_surf/backend/frontend/assets/table-cells-split-DvDXy8Zk.js +6 -0
- vibe_surf/backend/frontend/assets/table-columns-split-5lVHYUrA.js +6 -0
- vibe_surf/backend/frontend/assets/table-of-contents-CiE6KpvH.js +6 -0
- vibe_surf/backend/frontend/assets/table-properties-C5MLGyyn.js +6 -0
- vibe_surf/backend/frontend/assets/table-rows-split-6tWPhAGA.js +6 -0
- vibe_surf/backend/frontend/assets/tablet-onVj1N8V.js +6 -0
- vibe_surf/backend/frontend/assets/tablet-smartphone-Dy1zcLBR.js +6 -0
- vibe_surf/backend/frontend/assets/tablets-TV4RvSqQ.js +6 -0
- vibe_surf/backend/frontend/assets/tag-COdo6PC1.js +6 -0
- vibe_surf/backend/frontend/assets/tags-C_PyXxvo.js +6 -0
- vibe_surf/backend/frontend/assets/tally-1-TLUCkMfT.js +6 -0
- vibe_surf/backend/frontend/assets/tally-2-40s-WtRw.js +6 -0
- vibe_surf/backend/frontend/assets/tally-3-Cr7c6JyQ.js +6 -0
- vibe_surf/backend/frontend/assets/tally-4-CgMb3kf-.js +6 -0
- vibe_surf/backend/frontend/assets/tally-5-BYhkAnpk.js +6 -0
- vibe_surf/backend/frontend/assets/tangent-Cch1S25B.js +6 -0
- vibe_surf/backend/frontend/assets/target-BxbxOJBi.js +6 -0
- vibe_surf/backend/frontend/assets/telescope-DB7CDRtv.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-CipD8dRg.js +6 -0
- vibe_surf/backend/frontend/assets/tent-tree-HUvCq3o8.js +6 -0
- vibe_surf/backend/frontend/assets/terminal-CfniKHGt.js +6 -0
- vibe_surf/backend/frontend/assets/test-tube-DcBZWnPV.js +6 -0
- vibe_surf/backend/frontend/assets/test-tube-diagonal-DLDAq2x-.js +6 -0
- vibe_surf/backend/frontend/assets/test-tubes-DEqLhART.js +6 -0
- vibe_surf/backend/frontend/assets/text-CjNHL8YY.js +6 -0
- vibe_surf/backend/frontend/assets/text-cursor-Bfyx77E0.js +6 -0
- vibe_surf/backend/frontend/assets/text-cursor-input-DEntniNC.js +6 -0
- vibe_surf/backend/frontend/assets/text-quote-CuHDE9wz.js +6 -0
- vibe_surf/backend/frontend/assets/text-search-BVoMtXGi.js +6 -0
- vibe_surf/backend/frontend/assets/text-select-C5UoP5L8.js +6 -0
- vibe_surf/backend/frontend/assets/theater-5p2oJrBR.js +6 -0
- vibe_surf/backend/frontend/assets/thermometer-UK9pmYRI.js +6 -0
- vibe_surf/backend/frontend/assets/thermometer-snowflake-kQI9FMjj.js +6 -0
- vibe_surf/backend/frontend/assets/thermometer-sun-DFR8N7SP.js +6 -0
- vibe_surf/backend/frontend/assets/thumbs-down-D9fAJ2gG.js +6 -0
- vibe_surf/backend/frontend/assets/thumbs-up-DoKS_oaD.js +6 -0
- vibe_surf/backend/frontend/assets/ticket-Cesz_aOn.js +6 -0
- vibe_surf/backend/frontend/assets/ticket-check-hrSzboJJ.js +6 -0
- vibe_surf/backend/frontend/assets/ticket-minus-DSlyjy1m.js +6 -0
- vibe_surf/backend/frontend/assets/ticket-percent-B1fhQdh4.js +6 -0
- vibe_surf/backend/frontend/assets/ticket-plus-Dimk4-uQ.js +6 -0
- vibe_surf/backend/frontend/assets/ticket-slash-BbNYJCVm.js +6 -0
- vibe_surf/backend/frontend/assets/ticket-x-DZmFrk6f.js +6 -0
- vibe_surf/backend/frontend/assets/tickets-oFgC5KK5.js +6 -0
- vibe_surf/backend/frontend/assets/tickets-plane-7zFRiAsP.js +6 -0
- vibe_surf/backend/frontend/assets/timer-Dus7G8uq.js +6 -0
- vibe_surf/backend/frontend/assets/timer-off-DwuoxoCG.js +6 -0
- vibe_surf/backend/frontend/assets/timer-reset-6QQ9CB1x.js +6 -0
- vibe_surf/backend/frontend/assets/toggle-left-CP39bKF1.js +6 -0
- vibe_surf/backend/frontend/assets/toggle-right-BKQovK3O.js +6 -0
- vibe_surf/backend/frontend/assets/toilet-BBNGmlkm.js +6 -0
- vibe_surf/backend/frontend/assets/tornado-CmCC8lkh.js +6 -0
- vibe_surf/backend/frontend/assets/torus-DksvYfUU.js +6 -0
- vibe_surf/backend/frontend/assets/touchpad-B_iE1cT_.js +6 -0
- vibe_surf/backend/frontend/assets/touchpad-off-C3NRWKvk.js +6 -0
- vibe_surf/backend/frontend/assets/tower-control-C9XxmqPK.js +6 -0
- vibe_surf/backend/frontend/assets/toy-brick-BAWK5m2R.js +6 -0
- vibe_surf/backend/frontend/assets/tractor-ZemWoG5M.js +6 -0
- vibe_surf/backend/frontend/assets/traffic-cone-CQQptVNY.js +6 -0
- vibe_surf/backend/frontend/assets/train-front-C6IEoUQj.js +6 -0
- vibe_surf/backend/frontend/assets/train-front-tunnel-CRzVUubn.js +6 -0
- vibe_surf/backend/frontend/assets/train-track-DQ1Jx75q.js +6 -0
- vibe_surf/backend/frontend/assets/tram-front-CKDE6nBl.js +6 -0
- vibe_surf/backend/frontend/assets/transgender-DRQWjJQq.js +6 -0
- vibe_surf/backend/frontend/assets/trash-C7FJQWXt.js +6 -0
- vibe_surf/backend/frontend/assets/tree-deciduous-C_NdJWmQ.js +6 -0
- vibe_surf/backend/frontend/assets/tree-palm-rAQ0YuEF.js +6 -0
- vibe_surf/backend/frontend/assets/tree-pine-BC-4ht4p.js +6 -0
- vibe_surf/backend/frontend/assets/trees-Br8pDJw0.js +6 -0
- vibe_surf/backend/frontend/assets/trello-BQynNo87.js +6 -0
- vibe_surf/backend/frontend/assets/trending-down-m6hdRTZC.js +6 -0
- vibe_surf/backend/frontend/assets/trending-up-DEzTc77q.js +6 -0
- vibe_surf/backend/frontend/assets/trending-up-down-CdmVa8T1.js +6 -0
- vibe_surf/backend/frontend/assets/triangle-DxElnb7f.js +6 -0
- vibe_surf/backend/frontend/assets/triangle-alert-BmgW8WWD.js +6 -0
- vibe_surf/backend/frontend/assets/triangle-dashed-fyl8Ux-f.js +6 -0
- vibe_surf/backend/frontend/assets/triangle-right-Bn5gxIA-.js +6 -0
- vibe_surf/backend/frontend/assets/trophy-gb1-2rUo.js +6 -0
- vibe_surf/backend/frontend/assets/truck-CyEUIB3S.js +6 -0
- vibe_surf/backend/frontend/assets/truck-electric-C_IB9gt8.js +6 -0
- vibe_surf/backend/frontend/assets/turtle-JiowR0Q_.js +6 -0
- vibe_surf/backend/frontend/assets/tv-B0tAK-iR.js +6 -0
- vibe_surf/backend/frontend/assets/tv-minimal-BzNmtVcb.js +6 -0
- vibe_surf/backend/frontend/assets/tv-minimal-play-DY3HMhTZ.js +6 -0
- vibe_surf/backend/frontend/assets/twitch-X3gysvi1.js +6 -0
- vibe_surf/backend/frontend/assets/twitter-DgWlCFbw.js +6 -0
- vibe_surf/backend/frontend/assets/type-CbzhcXZj.js +6 -0
- vibe_surf/backend/frontend/assets/type-outline-EJOgqfeY.js +6 -0
- vibe_surf/backend/frontend/assets/umbrella-2CrWS8G9.js +6 -0
- vibe_surf/backend/frontend/assets/umbrella-off-wnubYDr5.js +6 -0
- vibe_surf/backend/frontend/assets/underline-kox2pBOb.js +6 -0
- vibe_surf/backend/frontend/assets/undo-2-CMFxk0AM.js +6 -0
- vibe_surf/backend/frontend/assets/undo-BB6rCcPu.js +6 -0
- vibe_surf/backend/frontend/assets/undo-dot-PizHjiGF.js +6 -0
- vibe_surf/backend/frontend/assets/unfold-horizontal-DJYCPLbF.js +6 -0
- vibe_surf/backend/frontend/assets/unfold-vertical-xsaYrtue.js +6 -0
- vibe_surf/backend/frontend/assets/ungroup-COP2DC2I.js +6 -0
- vibe_surf/backend/frontend/assets/university-Bydtu_C0.js +6 -0
- vibe_surf/backend/frontend/assets/unlink-2-CGh6udmI.js +6 -0
- vibe_surf/backend/frontend/assets/unlink-Cl0N-H5R.js +6 -0
- vibe_surf/backend/frontend/assets/unplug-CvUy0kbs.js +6 -0
- vibe_surf/backend/frontend/assets/upload-CsiQhdGb.js +6 -0
- vibe_surf/backend/frontend/assets/usb-DgJciZ8D.js +6 -0
- vibe_surf/backend/frontend/assets/use-post-add-user-X-JStdcv.js +1 -0
- vibe_surf/backend/frontend/assets/user-check-oTj-oMD1.js +6 -0
- vibe_surf/backend/frontend/assets/user-cog-De5lo6V4.js +6 -0
- vibe_surf/backend/frontend/assets/user-lock-Cd6PZI_W.js +6 -0
- vibe_surf/backend/frontend/assets/user-minus-Bk4X5ZEo.js +6 -0
- vibe_surf/backend/frontend/assets/user-pen-DdI66MUk.js +6 -0
- vibe_surf/backend/frontend/assets/user-plus-CU5763YF.js +6 -0
- vibe_surf/backend/frontend/assets/user-rQhBQtW6.js +6 -0
- vibe_surf/backend/frontend/assets/user-round-Balh9Ngi.js +6 -0
- vibe_surf/backend/frontend/assets/user-round-check-CNnGyjh3.js +6 -0
- vibe_surf/backend/frontend/assets/user-round-cog-cytI9ohB.js +6 -0
- vibe_surf/backend/frontend/assets/user-round-minus-BPLiMNlF.js +6 -0
- vibe_surf/backend/frontend/assets/user-round-pen-DYmI1nrr.js +6 -0
- vibe_surf/backend/frontend/assets/user-round-plus-vC9pdrP-.js +6 -0
- vibe_surf/backend/frontend/assets/user-round-search-B7B-daNE.js +6 -0
- vibe_surf/backend/frontend/assets/user-round-x-DyuI5YoS.js +6 -0
- vibe_surf/backend/frontend/assets/user-search-BKYbqUOf.js +6 -0
- vibe_surf/backend/frontend/assets/user-x-DJ3ciRY5.js +6 -0
- vibe_surf/backend/frontend/assets/users-BuFcoxWH.js +6 -0
- vibe_surf/backend/frontend/assets/users-round-Bmf9zVDL.js +6 -0
- vibe_surf/backend/frontend/assets/utensils-DbpPXdpJ.js +6 -0
- vibe_surf/backend/frontend/assets/utensils-crossed-aDCkAivJ.js +6 -0
- vibe_surf/backend/frontend/assets/utility-pole-Bc7lymCy.js +6 -0
- vibe_surf/backend/frontend/assets/vanilla-picker-B6E6ObS_.js +8 -0
- vibe_surf/backend/frontend/assets/variable-DyXUbeWo.js +6 -0
- vibe_surf/backend/frontend/assets/vault-BBLLA0yD.js +6 -0
- vibe_surf/backend/frontend/assets/vegan-DkXrMg_9.js +6 -0
- vibe_surf/backend/frontend/assets/venetian-mask-DSF__6pM.js +6 -0
- vibe_surf/backend/frontend/assets/venus-BqrM2Wbm.js +6 -0
- vibe_surf/backend/frontend/assets/venus-and-mars-CocpgQS_.js +6 -0
- vibe_surf/backend/frontend/assets/vibrate-CSaEPSAw.js +6 -0
- vibe_surf/backend/frontend/assets/vibrate-off-BkeOYWie.js +6 -0
- vibe_surf/backend/frontend/assets/video-CDDAj1Mz.js +6 -0
- vibe_surf/backend/frontend/assets/video-off-BSlBZ5ca.js +6 -0
- vibe_surf/backend/frontend/assets/videotape-ChK7t0IE.js +6 -0
- vibe_surf/backend/frontend/assets/view-BTeYNd7e.js +6 -0
- vibe_surf/backend/frontend/assets/voicemail-DXRJxFC2.js +6 -0
- vibe_surf/backend/frontend/assets/volleyball-0jePXF2X.js +6 -0
- vibe_surf/backend/frontend/assets/volume-1-CBKuT4gx.js +6 -0
- vibe_surf/backend/frontend/assets/volume-CJ3kb1UJ.js +6 -0
- vibe_surf/backend/frontend/assets/volume-off-Drh6kI0N.js +6 -0
- vibe_surf/backend/frontend/assets/vote-D7rR24Uv.js +6 -0
- vibe_surf/backend/frontend/assets/wallet-cards-BmUXKVPo.js +6 -0
- vibe_surf/backend/frontend/assets/wallet-minimal-CfQ29GXX.js +6 -0
- vibe_surf/backend/frontend/assets/wallet-odbnitLx.js +6 -0
- vibe_surf/backend/frontend/assets/wallpaper--aY9LRKu.js +6 -0
- vibe_surf/backend/frontend/assets/wand-XfMLbt7W.js +6 -0
- vibe_surf/backend/frontend/assets/wand-sparkles-EKZGPSQU.js +6 -0
- vibe_surf/backend/frontend/assets/warehouse-CQb33kTK.js +6 -0
- vibe_surf/backend/frontend/assets/washing-machine-BcdChWag.js +6 -0
- vibe_surf/backend/frontend/assets/watch-BAxj0MpS.js +6 -0
- vibe_surf/backend/frontend/assets/waves-DSxAAEDo.js +6 -0
- vibe_surf/backend/frontend/assets/waves-ladder-CQM5bq9O.js +6 -0
- vibe_surf/backend/frontend/assets/waypoints-X-1I6GAF.js +6 -0
- vibe_surf/backend/frontend/assets/webcam-D0M9jAcy.js +6 -0
- vibe_surf/backend/frontend/assets/webhook-B4-tv0Ay.js +6 -0
- vibe_surf/backend/frontend/assets/webhook-off-DgBYoB9w.js +6 -0
- vibe_surf/backend/frontend/assets/weight-CbJjMaGD.js +6 -0
- vibe_surf/backend/frontend/assets/wheat-DRqMfslQ.js +6 -0
- vibe_surf/backend/frontend/assets/wheat-off-DN3CMot9.js +6 -0
- vibe_surf/backend/frontend/assets/whole-word-rys0-nDs.js +6 -0
- vibe_surf/backend/frontend/assets/wifi-B6YlXqZQ.js +6 -0
- vibe_surf/backend/frontend/assets/wifi-high-BN7s1tEO.js +6 -0
- vibe_surf/backend/frontend/assets/wifi-low-DqS_NT9C.js +6 -0
- vibe_surf/backend/frontend/assets/wifi-off-CRhK1VN6.js +6 -0
- vibe_surf/backend/frontend/assets/wifi-pen-gMAH3nO9.js +6 -0
- vibe_surf/backend/frontend/assets/wifi-zero-CL35Rk1s.js +6 -0
- vibe_surf/backend/frontend/assets/wind-CABDXl30.js +6 -0
- vibe_surf/backend/frontend/assets/wind-arrow-down-CCe6Rj-A.js +6 -0
- vibe_surf/backend/frontend/assets/wine-CADKMVqu.js +6 -0
- vibe_surf/backend/frontend/assets/wine-off-DKIC96cS.js +6 -0
- vibe_surf/backend/frontend/assets/workflow-l7VJgDwH.js +6 -0
- vibe_surf/backend/frontend/assets/worm-Bd0iMQEP.js +6 -0
- vibe_surf/backend/frontend/assets/wrap-text-Cunt4p5D.js +6 -0
- vibe_surf/backend/frontend/assets/wrench-dRH2B7Yl.js +6 -0
- vibe_surf/backend/frontend/assets/youtube-DMk3ysts.js +6 -0
- vibe_surf/backend/frontend/assets/zap-DLlvIcB2.js +6 -0
- vibe_surf/backend/frontend/assets/zap-off-Bxyq6wwx.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 +225 -0
- vibe_surf/backend/main.py +793 -0
- vibe_surf/backend/shared_state.py +1110 -0
- vibe_surf/backend/utils/__init__.py +7 -0
- vibe_surf/backend/utils/encryption.py +172 -0
- vibe_surf/backend/utils/llm_factory.py +274 -0
- vibe_surf/backend/utils/utils.py +42 -0
- vibe_surf/backend/utils/workflow_converter.py +570 -0
- vibe_surf/backend/voice_model_config.py +25 -0
- vibe_surf/browser/__init__.py +8 -0
- vibe_surf/browser/agen_browser_profile.py +136 -0
- vibe_surf/browser/agent_browser_session.py +1244 -0
- vibe_surf/browser/browser_manager.py +268 -0
- vibe_surf/browser/find_page_element.py +1100 -0
- vibe_surf/browser/page_operations.py +222 -0
- vibe_surf/browser/utils.py +785 -0
- vibe_surf/browser/watchdogs/__init__.py +0 -0
- vibe_surf/browser/watchdogs/action_watchdog.py +109 -0
- vibe_surf/browser/watchdogs/dom_watchdog.py +249 -0
- vibe_surf/chrome_extension/background.js +908 -0
- vibe_surf/chrome_extension/config.js +56 -0
- vibe_surf/chrome_extension/content.js +745 -0
- vibe_surf/chrome_extension/dev-reload.js +47 -0
- vibe_surf/chrome_extension/icons/logo.icns +0 -0
- vibe_surf/chrome_extension/icons/logo.png +0 -0
- vibe_surf/chrome_extension/manifest.json +70 -0
- vibe_surf/chrome_extension/permission-iframe.html +38 -0
- vibe_surf/chrome_extension/permission-request.html +104 -0
- vibe_surf/chrome_extension/popup.html +134 -0
- vibe_surf/chrome_extension/scripts/api-client.js +755 -0
- vibe_surf/chrome_extension/scripts/file-manager.js +523 -0
- vibe_surf/chrome_extension/scripts/history-manager.js +658 -0
- vibe_surf/chrome_extension/scripts/main.js +547 -0
- vibe_surf/chrome_extension/scripts/markdown-it.min.js +3 -0
- vibe_surf/chrome_extension/scripts/modal-manager.js +496 -0
- vibe_surf/chrome_extension/scripts/news-carousel.js +543 -0
- vibe_surf/chrome_extension/scripts/permission-iframe-request.js +188 -0
- vibe_surf/chrome_extension/scripts/permission-request.js +118 -0
- vibe_surf/chrome_extension/scripts/session-manager.js +800 -0
- vibe_surf/chrome_extension/scripts/settings-general.js +483 -0
- vibe_surf/chrome_extension/scripts/settings-integrations.js +998 -0
- vibe_surf/chrome_extension/scripts/settings-manager.js +275 -0
- vibe_surf/chrome_extension/scripts/settings-profiles.js +1330 -0
- vibe_surf/chrome_extension/scripts/settings-workflow.js +3530 -0
- vibe_surf/chrome_extension/scripts/ui-manager.js +3799 -0
- vibe_surf/chrome_extension/scripts/user-settings-storage.js +422 -0
- vibe_surf/chrome_extension/scripts/version.js +3 -0
- vibe_surf/chrome_extension/scripts/voice-recorder.js +514 -0
- vibe_surf/chrome_extension/scripts/workflow-recorder.js +651 -0
- vibe_surf/chrome_extension/sidepanel.html +1200 -0
- vibe_surf/chrome_extension/styles/activity.css +934 -0
- vibe_surf/chrome_extension/styles/animations.css +471 -0
- vibe_surf/chrome_extension/styles/base.css +76 -0
- vibe_surf/chrome_extension/styles/components.css +1044 -0
- vibe_surf/chrome_extension/styles/history-modal.css +791 -0
- vibe_surf/chrome_extension/styles/input.css +760 -0
- vibe_surf/chrome_extension/styles/layout.css +247 -0
- vibe_surf/chrome_extension/styles/news-carousel.css +530 -0
- vibe_surf/chrome_extension/styles/responsive.css +454 -0
- vibe_surf/chrome_extension/styles/settings-environment.css +303 -0
- vibe_surf/chrome_extension/styles/settings-forms.css +389 -0
- vibe_surf/chrome_extension/styles/settings-integrations.css +945 -0
- vibe_surf/chrome_extension/styles/settings-modal.css +145 -0
- vibe_surf/chrome_extension/styles/settings-profiles.css +244 -0
- vibe_surf/chrome_extension/styles/settings-responsive.css +176 -0
- vibe_surf/chrome_extension/styles/settings-utilities.css +25 -0
- vibe_surf/chrome_extension/styles/settings-workflow.css +3013 -0
- vibe_surf/chrome_extension/styles/variables.css +105 -0
- vibe_surf/cli.py +562 -0
- vibe_surf/common.py +35 -0
- 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 +1304 -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 +141 -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 +27 -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 +1616 -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 +133 -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/__init__.py +21 -0
- vibe_surf/llm/openai_compatible.py +372 -0
- vibe_surf/logger.py +99 -0
- vibe_surf/telemetry/__init__.py +60 -0
- vibe_surf/telemetry/service.py +113 -0
- vibe_surf/telemetry/views.py +188 -0
- vibe_surf/tools/__init__.py +0 -0
- vibe_surf/tools/browser_use_tools.py +492 -0
- vibe_surf/tools/composio_client.py +458 -0
- vibe_surf/tools/file_system.py +437 -0
- vibe_surf/tools/finance_tools.py +629 -0
- vibe_surf/tools/mcp_client.py +84 -0
- vibe_surf/tools/report_writer_tools.py +22 -0
- vibe_surf/tools/utils.py +1793 -0
- vibe_surf/tools/vibesurf_registry.py +52 -0
- vibe_surf/tools/vibesurf_tools.py +2277 -0
- vibe_surf/tools/views.py +365 -0
- vibe_surf/tools/voice_asr.py +125 -0
- 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 +848 -0
- vibe_surf/tools/website_api/douyin/helpers.py +239 -0
- vibe_surf/tools/website_api/newsnow/__init__.py +0 -0
- vibe_surf/tools/website_api/newsnow/client.py +385 -0
- vibe_surf/tools/website_api/newsnow/helpers.py +118 -0
- vibe_surf/tools/website_api/newsnow/sources.json +385 -0
- vibe_surf/tools/website_api/weibo/__init__.py +0 -0
- vibe_surf/tools/website_api/weibo/client.py +767 -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 +804 -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/AIGC/genai_image_generator.py +284 -0
- vibe_surf/workflows/AIGC/media_viewer.py +127 -0
- vibe_surf/workflows/AIGC/vertex_image_generator.py +259 -0
- vibe_surf/workflows/Browser/browser_click_element.py +195 -0
- vibe_surf/workflows/Browser/browser_download_media.py +113 -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 +127 -0
- vibe_surf/workflows/Browser/browser_upload_file.py +182 -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/newsnow.py +121 -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 +115 -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/structured_output.py +154 -0
- vibe_surf/workflows/VibeSurf/variable_manager.py +140 -0
- vibe_surf/workflows/VibeSurf/vibesurf_agent.py +113 -0
- vibesurf-0.2.40.dist-info/METADATA +432 -0
- vibesurf-0.2.40.dist-info/RECORD +2921 -0
- vibesurf-0.2.40.dist-info/WHEEL +5 -0
- vibesurf-0.2.40.dist-info/entry_points.txt +2 -0
- vibesurf-0.2.40.dist-info/licenses/LICENSE +22 -0
- vibesurf-0.2.40.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,2277 @@
|
|
|
1
|
+
from typing import Any, Generic, TypeVar
|
|
2
|
+
from browser_use.tools.registry.service import Registry
|
|
3
|
+
from pydantic import BaseModel
|
|
4
|
+
import pdb
|
|
5
|
+
import os
|
|
6
|
+
import asyncio
|
|
7
|
+
import json
|
|
8
|
+
import enum
|
|
9
|
+
import base64
|
|
10
|
+
import mimetypes
|
|
11
|
+
import yfinance as yf
|
|
12
|
+
import pprint
|
|
13
|
+
import pandas as pd
|
|
14
|
+
import numpy as np
|
|
15
|
+
import matplotlib
|
|
16
|
+
|
|
17
|
+
matplotlib.use('Agg') # Use non-interactive backend
|
|
18
|
+
import matplotlib.pyplot as plt
|
|
19
|
+
import seaborn as sns
|
|
20
|
+
import io
|
|
21
|
+
import json
|
|
22
|
+
import re
|
|
23
|
+
import os
|
|
24
|
+
import openpyxl
|
|
25
|
+
from datetime import datetime, timedelta
|
|
26
|
+
from pathlib import Path
|
|
27
|
+
import csv
|
|
28
|
+
|
|
29
|
+
from json_repair import repair_json
|
|
30
|
+
from datetime import datetime
|
|
31
|
+
from typing import Optional, Type, Callable, Dict, Any, Union, Awaitable, TypeVar
|
|
32
|
+
from pathvalidate import sanitize_filename
|
|
33
|
+
from pydantic import BaseModel
|
|
34
|
+
from browser_use.tools.service import Controller, Tools, handle_browser_error
|
|
35
|
+
import logging
|
|
36
|
+
from browser_use.agent.views import ActionModel, ActionResult
|
|
37
|
+
from browser_use.utils import time_execution_sync
|
|
38
|
+
from browser_use.filesystem.file_system import FileSystem
|
|
39
|
+
from browser_use.browser import BrowserSession
|
|
40
|
+
from browser_use.llm.base import BaseChatModel
|
|
41
|
+
from browser_use.llm.messages import UserMessage, ContentPartTextParam, ContentPartImageParam, ImageURL, \
|
|
42
|
+
AssistantMessage
|
|
43
|
+
from browser_use.dom.service import EnhancedDOMTreeNode
|
|
44
|
+
from browser_use.browser.views import BrowserError
|
|
45
|
+
from browser_use.mcp.client import MCPClient
|
|
46
|
+
from browser_use.tools.views import NoParamsAction
|
|
47
|
+
from vibe_surf.browser.agent_browser_session import AgentBrowserSession
|
|
48
|
+
from vibe_surf.tools.views import HoverAction, ExtractionAction, FileExtractionAction, BrowserUseAgentExecution, \
|
|
49
|
+
ReportWriterTask, TodoGenerateAction, TodoModifyAction, VibeSurfDoneAction, SkillSearchAction, SkillCrawlAction, \
|
|
50
|
+
SkillSummaryAction, SkillTakeScreenshotAction, SkillDeepResearchAction, SkillCodeAction, SkillFinanceAction, \
|
|
51
|
+
SkillXhsAction, SkillDouyinAction, SkillYoutubeAction, SkillWeiboAction, GrepContentAction, \
|
|
52
|
+
SearchToolAction, GetToolInfoAction, ExecuteExtraToolAction, ExecutePythonCodeAction, SkillTrendAction
|
|
53
|
+
from vibe_surf.tools.finance_tools import FinanceDataRetriever, FinanceMarkdownFormatter, FinanceMethod
|
|
54
|
+
from vibe_surf.tools.mcp_client import CustomMCPClient
|
|
55
|
+
from vibe_surf.tools.composio_client import ComposioClient
|
|
56
|
+
from vibe_surf.tools.file_system import CustomFileSystem
|
|
57
|
+
from vibe_surf.browser.browser_manager import BrowserManager
|
|
58
|
+
from vibe_surf.tools.vibesurf_registry import VibeSurfRegistry
|
|
59
|
+
from bs4 import BeautifulSoup
|
|
60
|
+
from vibe_surf.logger import get_logger
|
|
61
|
+
from vibe_surf.tools.utils import clean_html_basic
|
|
62
|
+
from vibe_surf.tools.utils import _extract_structured_content, _rank_search_results_with_llm, \
|
|
63
|
+
extract_file_content_with_llm, remove_import_statements
|
|
64
|
+
|
|
65
|
+
logger = get_logger(__name__)
|
|
66
|
+
|
|
67
|
+
Context = TypeVar('Context')
|
|
68
|
+
|
|
69
|
+
T = TypeVar('T', bound=BaseModel)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class VibeSurfTools:
|
|
73
|
+
def __init__(self, exclude_actions: list[str] = [], mcp_server_config: Optional[Dict[str, Any]] = None,
|
|
74
|
+
composio_client: ComposioClient = None):
|
|
75
|
+
self.registry = VibeSurfRegistry(exclude_actions)
|
|
76
|
+
self._register_file_actions()
|
|
77
|
+
self._register_browser_use_agent()
|
|
78
|
+
self._register_report_writer_agent()
|
|
79
|
+
self._register_todo_actions()
|
|
80
|
+
self._register_done_action()
|
|
81
|
+
self._register_skills()
|
|
82
|
+
self._register_extra_tools()
|
|
83
|
+
self.mcp_server_config = mcp_server_config
|
|
84
|
+
self.mcp_clients: Dict[str, MCPClient] = {}
|
|
85
|
+
self.composio_toolkits: Dict[str, Any] = {}
|
|
86
|
+
self.composio_client: ComposioClient = composio_client
|
|
87
|
+
|
|
88
|
+
def get_all_action_names(self, exclude_actions: Optional[list] = None) -> list[str]:
|
|
89
|
+
action_names = []
|
|
90
|
+
for action_name in self.registry.registry.actions:
|
|
91
|
+
add_flag = True
|
|
92
|
+
for ex_action_name in exclude_actions:
|
|
93
|
+
if action_name.startswith(ex_action_name) or ex_action_name in action_name:
|
|
94
|
+
add_flag = False
|
|
95
|
+
break
|
|
96
|
+
if add_flag:
|
|
97
|
+
action_names.append(action_name)
|
|
98
|
+
return action_names
|
|
99
|
+
|
|
100
|
+
def _register_skills(self):
|
|
101
|
+
@self.registry.action(
|
|
102
|
+
'Advanced search',
|
|
103
|
+
param_model=SkillSearchAction,
|
|
104
|
+
)
|
|
105
|
+
async def skill_search(
|
|
106
|
+
params: SkillSearchAction,
|
|
107
|
+
browser_manager: BrowserManager,
|
|
108
|
+
page_extraction_llm: BaseChatModel
|
|
109
|
+
):
|
|
110
|
+
"""
|
|
111
|
+
Advanced search skill that uses Google AI model search as primary method,
|
|
112
|
+
with fallback to parallel search across all/news/videos tabs.
|
|
113
|
+
|
|
114
|
+
Primary Method: Google AI model search (udm=50) with "show more" button click
|
|
115
|
+
Fallback Method: Parallel search across all, news, and videos tabs
|
|
116
|
+
|
|
117
|
+
Args:
|
|
118
|
+
params: SkillSearchAction containing query and rank parameters
|
|
119
|
+
browser_manager: Browser manager for creating browser sessions
|
|
120
|
+
page_extraction_llm: LLM for ranking results when rank=True
|
|
121
|
+
|
|
122
|
+
Returns:
|
|
123
|
+
ActionResult with formatted search results
|
|
124
|
+
"""
|
|
125
|
+
from vibe_surf.tools.utils import google_ai_model_search, fallback_parallel_search
|
|
126
|
+
|
|
127
|
+
agent_ids = []
|
|
128
|
+
try:
|
|
129
|
+
# Step 1: Try Google AI model search first (primary method)
|
|
130
|
+
logger.info(f'🔍 Starting Google AI model search for: {params.query}')
|
|
131
|
+
|
|
132
|
+
# Attempt Google AI model search with udm=50
|
|
133
|
+
search_result_dict = await google_ai_model_search(browser_manager, params.query, max_results=15)
|
|
134
|
+
|
|
135
|
+
# Step 2: If AI search fails or returns insufficient results, use fallback method
|
|
136
|
+
if not search_result_dict or (isinstance(search_result_dict, dict) and len(search_result_dict.get('sources', [])) == 0):
|
|
137
|
+
logger.info(f'🔄 Google AI search returned no results, using fallback parallel search')
|
|
138
|
+
|
|
139
|
+
# Use parallel search across all, news, and videos tabs
|
|
140
|
+
search_result_dict = await fallback_parallel_search(browser_manager, params.query, max_results=15)
|
|
141
|
+
used_fallback = True
|
|
142
|
+
else:
|
|
143
|
+
logger.info(f'✅ Google AI search found results')
|
|
144
|
+
used_fallback = False
|
|
145
|
+
|
|
146
|
+
# Extract response and sources from dict
|
|
147
|
+
ai_response = search_result_dict.get('response', '')
|
|
148
|
+
all_results = search_result_dict.get('sources', [])
|
|
149
|
+
|
|
150
|
+
# Step 3: Process results based on rank parameter
|
|
151
|
+
if params.rank and all_results and len(all_results) > 10:
|
|
152
|
+
logger.info(f'🔄 Using LLM ranking for {len(all_results)} results')
|
|
153
|
+
|
|
154
|
+
if not page_extraction_llm:
|
|
155
|
+
logger.warning("LLM not available for ranking, returning unranked results")
|
|
156
|
+
top_results = all_results[:15]
|
|
157
|
+
else:
|
|
158
|
+
# Use LLM ranking when rank=True and we have many results
|
|
159
|
+
top_results = await _rank_search_results_with_llm(
|
|
160
|
+
all_results, params.query, page_extraction_llm
|
|
161
|
+
)
|
|
162
|
+
elif params.rank and all_results and len(all_results) <= 10:
|
|
163
|
+
logger.info(f'⭐ Skipping LLM ranking for {len(all_results)} results (≤10)')
|
|
164
|
+
top_results = all_results
|
|
165
|
+
else:
|
|
166
|
+
# When rank=False, return results from different tabs (5 each from all, news, videos)
|
|
167
|
+
if hasattr(all_results, '__iter__') and all_results:
|
|
168
|
+
# Group results by source_tab if available, otherwise take first 15
|
|
169
|
+
tab_groups = {'all': [], 'news': [], 'videos': [], 'other': []}
|
|
170
|
+
|
|
171
|
+
for result in all_results:
|
|
172
|
+
source_tab = result.get('source_tab', 'other')
|
|
173
|
+
tab_groups[source_tab].append(result)
|
|
174
|
+
|
|
175
|
+
# Take up to 5 results from each tab
|
|
176
|
+
top_results = []
|
|
177
|
+
for tab_name in ['all', 'news', 'videos', 'other']:
|
|
178
|
+
top_results.extend(tab_groups[tab_name][:5])
|
|
179
|
+
|
|
180
|
+
# If we don't have enough results from tabs, take the first 15 overall
|
|
181
|
+
if len(top_results) < 15:
|
|
182
|
+
top_results = all_results[:15]
|
|
183
|
+
else:
|
|
184
|
+
top_results = all_results[:15] if all_results else []
|
|
185
|
+
|
|
186
|
+
# Step 4: Format results for display - AI response first, then sources
|
|
187
|
+
results_text = f"# 🔍 Search Results for '{params.query}'\n\n"
|
|
188
|
+
|
|
189
|
+
# Display AI response if available
|
|
190
|
+
if ai_response:
|
|
191
|
+
results_text += f"## 🤖 AI Response\n\n{ai_response}\n\n"
|
|
192
|
+
results_text += "---\n\n"
|
|
193
|
+
|
|
194
|
+
# Display sources
|
|
195
|
+
if top_results:
|
|
196
|
+
results_text += f"## 📚 Sources ({len(top_results)} results)\n\n"
|
|
197
|
+
for i, result in enumerate(top_results):
|
|
198
|
+
title = result.get('title', 'Unknown Title')
|
|
199
|
+
url = result.get('url', 'No URL')
|
|
200
|
+
summary = result.get('summary', 'No description available')
|
|
201
|
+
|
|
202
|
+
results_text += f"### {i + 1}. {title}\n"
|
|
203
|
+
results_text += f"**URL:** {url}\n\n"
|
|
204
|
+
results_text += f"**Summary:** {summary}\n\n"
|
|
205
|
+
else:
|
|
206
|
+
results_text += f"## 📚 Sources\n\nNo source results found for query: {params.query}\n\n"
|
|
207
|
+
|
|
208
|
+
logger.info(f'🔍 Skill Search completed for: {params.query}, found {len(top_results)} sources, AI response: {bool(ai_response)}')
|
|
209
|
+
return ActionResult(
|
|
210
|
+
extracted_content=results_text,
|
|
211
|
+
include_extracted_content_only_once=True,
|
|
212
|
+
long_term_memory=f'Search completed for: {params.query}, found {len(top_results)} sources{"with AI response" if ai_response else ""} using {"fallback search" if used_fallback else "AI model search"}'
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
except Exception as e:
|
|
216
|
+
logger.error(f'❌ Skill Search failed: {e}')
|
|
217
|
+
return ActionResult(error=f'Skill search failed: {str(e)}')
|
|
218
|
+
finally:
|
|
219
|
+
# Clean up browser sessions
|
|
220
|
+
for agent_id in agent_ids:
|
|
221
|
+
try:
|
|
222
|
+
await browser_manager.unregister_agent(agent_id, close_tabs=True)
|
|
223
|
+
except Exception as cleanup_error:
|
|
224
|
+
logger.warning(f"Failed to cleanup agent {agent_id}: {cleanup_error}")
|
|
225
|
+
|
|
226
|
+
@self.registry.action(
|
|
227
|
+
'',
|
|
228
|
+
param_model=SkillCrawlAction,
|
|
229
|
+
)
|
|
230
|
+
async def skill_crawl(
|
|
231
|
+
params: SkillCrawlAction,
|
|
232
|
+
browser_manager: BrowserManager,
|
|
233
|
+
page_extraction_llm: BaseChatModel
|
|
234
|
+
):
|
|
235
|
+
"""
|
|
236
|
+
Skill: Extract structured content from current or specified webpage
|
|
237
|
+
"""
|
|
238
|
+
llm = page_extraction_llm
|
|
239
|
+
try:
|
|
240
|
+
if not llm:
|
|
241
|
+
raise RuntimeError("LLM is required for skill_crawl")
|
|
242
|
+
|
|
243
|
+
# Get browser session
|
|
244
|
+
browser_session = browser_manager.main_browser_session
|
|
245
|
+
|
|
246
|
+
# If tab_id is provided, switch to that tab
|
|
247
|
+
target_id = None
|
|
248
|
+
if params.tab_id:
|
|
249
|
+
target_id = await browser_session.get_target_id_from_tab_id(params.tab_id)
|
|
250
|
+
url = await browser_session.get_current_page_url()
|
|
251
|
+
current_target_id = None
|
|
252
|
+
current_url = None
|
|
253
|
+
if browser_session._dom_watchdog and browser_session._dom_watchdog.enhanced_dom_tree:
|
|
254
|
+
current_target_id = browser_session._dom_watchdog.enhanced_dom_tree.target_id
|
|
255
|
+
if browser_session._cached_browser_state_summary:
|
|
256
|
+
current_url = browser_session._cached_browser_state_summary.url
|
|
257
|
+
if current_target_id != target_id or url != current_url:
|
|
258
|
+
browser_session._dom_watchdog.clear_cache()
|
|
259
|
+
browser_session._cached_browser_state_summary = None
|
|
260
|
+
await browser_session.get_or_create_cdp_session(target_id, focus=True)
|
|
261
|
+
|
|
262
|
+
# Extract structured content using the existing method
|
|
263
|
+
extracted_content = await _extract_structured_content(
|
|
264
|
+
browser_session, params.query, llm, target_id=target_id
|
|
265
|
+
)
|
|
266
|
+
|
|
267
|
+
current_url = await browser_session.get_current_page_url()
|
|
268
|
+
result_text = f'### URL:{current_url}\n\n{extracted_content}'
|
|
269
|
+
|
|
270
|
+
# Handle memory storage
|
|
271
|
+
MAX_MEMORY_LENGTH = 1000
|
|
272
|
+
if len(result_text) < MAX_MEMORY_LENGTH:
|
|
273
|
+
memory = result_text
|
|
274
|
+
include_extracted_content_only_once = False
|
|
275
|
+
else:
|
|
276
|
+
memory = f'Extracted structured content from {current_url} for query: {params.query}'
|
|
277
|
+
include_extracted_content_only_once = True
|
|
278
|
+
|
|
279
|
+
logger.info(f'📄 Skill Crawl completed for: {current_url}')
|
|
280
|
+
return ActionResult(
|
|
281
|
+
extracted_content=result_text,
|
|
282
|
+
include_extracted_content_only_once=include_extracted_content_only_once,
|
|
283
|
+
long_term_memory=memory,
|
|
284
|
+
)
|
|
285
|
+
|
|
286
|
+
except Exception as e:
|
|
287
|
+
logger.error(f'❌ Skill Crawl failed: {e}')
|
|
288
|
+
return ActionResult(error=f'Skill crawl failed: {str(e)}')
|
|
289
|
+
|
|
290
|
+
@self.registry.action(
|
|
291
|
+
'',
|
|
292
|
+
param_model=SkillSummaryAction,
|
|
293
|
+
)
|
|
294
|
+
async def skill_summary(
|
|
295
|
+
params: SkillSummaryAction,
|
|
296
|
+
browser_manager: BrowserManager,
|
|
297
|
+
page_extraction_llm: BaseChatModel
|
|
298
|
+
):
|
|
299
|
+
"""
|
|
300
|
+
Skill: Summarize webpage content using LLM
|
|
301
|
+
"""
|
|
302
|
+
llm = page_extraction_llm
|
|
303
|
+
try:
|
|
304
|
+
if not llm:
|
|
305
|
+
raise RuntimeError("LLM is required for skill_summary")
|
|
306
|
+
|
|
307
|
+
# Get browser session
|
|
308
|
+
browser_session = browser_manager.main_browser_session
|
|
309
|
+
|
|
310
|
+
# If tab_id is provided, switch to that tab
|
|
311
|
+
target_id = None
|
|
312
|
+
if params.tab_id:
|
|
313
|
+
target_id = await browser_session.get_target_id_from_tab_id(params.tab_id)
|
|
314
|
+
url = await browser_session.get_current_page_url()
|
|
315
|
+
current_target_id = None
|
|
316
|
+
current_url = None
|
|
317
|
+
if browser_session._dom_watchdog and browser_session._dom_watchdog.enhanced_dom_tree:
|
|
318
|
+
current_target_id = browser_session._dom_watchdog.enhanced_dom_tree.target_id
|
|
319
|
+
if browser_session._cached_browser_state_summary:
|
|
320
|
+
current_url = browser_session._cached_browser_state_summary.url
|
|
321
|
+
if current_target_id != target_id or url != current_url:
|
|
322
|
+
browser_session._dom_watchdog.clear_cache()
|
|
323
|
+
browser_session._cached_browser_state_summary = None
|
|
324
|
+
await browser_session.get_or_create_cdp_session(target_id, focus=True)
|
|
325
|
+
|
|
326
|
+
# Extract and summarize content
|
|
327
|
+
summary = await _extract_structured_content(
|
|
328
|
+
browser_session, "Provide a comprehensive summary of this webpage", llm, target_id=target_id
|
|
329
|
+
)
|
|
330
|
+
|
|
331
|
+
current_url = await browser_session.get_current_page_url()
|
|
332
|
+
result_text = f'📝 Summary of {current_url}:\n\n{summary}'
|
|
333
|
+
|
|
334
|
+
# Handle memory storage
|
|
335
|
+
MAX_MEMORY_LENGTH = 1000
|
|
336
|
+
if len(result_text) < MAX_MEMORY_LENGTH:
|
|
337
|
+
memory = result_text
|
|
338
|
+
include_extracted_content_only_once = False
|
|
339
|
+
else:
|
|
340
|
+
memory = f'Summarized webpage: {current_url}'
|
|
341
|
+
include_extracted_content_only_once = True
|
|
342
|
+
|
|
343
|
+
logger.info(f'📝 Skill Summary completed for: {current_url}')
|
|
344
|
+
return ActionResult(
|
|
345
|
+
extracted_content=result_text,
|
|
346
|
+
include_extracted_content_only_once=include_extracted_content_only_once,
|
|
347
|
+
long_term_memory=memory,
|
|
348
|
+
)
|
|
349
|
+
|
|
350
|
+
except Exception as e:
|
|
351
|
+
logger.error(f'❌ Skill Summary failed: {e}')
|
|
352
|
+
return ActionResult(error=f'Skill summary failed: {str(e)}')
|
|
353
|
+
|
|
354
|
+
@self.registry.action(
|
|
355
|
+
'',
|
|
356
|
+
param_model=SkillTakeScreenshotAction,
|
|
357
|
+
)
|
|
358
|
+
async def skill_screenshot(
|
|
359
|
+
params: SkillTakeScreenshotAction,
|
|
360
|
+
browser_manager: BrowserManager,
|
|
361
|
+
file_system: CustomFileSystem
|
|
362
|
+
):
|
|
363
|
+
"""
|
|
364
|
+
Skill: Take screenshot with optional tab selection
|
|
365
|
+
"""
|
|
366
|
+
try:
|
|
367
|
+
# Get browser session
|
|
368
|
+
browser_session = browser_manager.main_browser_session
|
|
369
|
+
|
|
370
|
+
# If tab_id is provided, switch to that tab
|
|
371
|
+
if params.tab_id:
|
|
372
|
+
target_id = await browser_session.get_target_id_from_tab_id(params.tab_id)
|
|
373
|
+
await browser_session.get_or_create_cdp_session(target_id, focus=True)
|
|
374
|
+
|
|
375
|
+
# Take screenshot using browser session
|
|
376
|
+
screenshot_bytes = await browser_session.take_screenshot()
|
|
377
|
+
|
|
378
|
+
# Generate timestamp for filename
|
|
379
|
+
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
380
|
+
|
|
381
|
+
# Get file system directory path (Path type)
|
|
382
|
+
fs_dir = file_system.get_dir()
|
|
383
|
+
|
|
384
|
+
# Create screenshots directory if it doesn't exist
|
|
385
|
+
screenshots_dir = fs_dir / "screenshots"
|
|
386
|
+
screenshots_dir.mkdir(exist_ok=True)
|
|
387
|
+
|
|
388
|
+
# Save screenshot to file system
|
|
389
|
+
page_title = await browser_session.get_current_page_title()
|
|
390
|
+
from pathvalidate import sanitize_filename
|
|
391
|
+
page_title = sanitize_filename(page_title)
|
|
392
|
+
filename = f"{page_title}-{timestamp}.png"
|
|
393
|
+
filepath = screenshots_dir / filename
|
|
394
|
+
|
|
395
|
+
with open(filepath, "wb") as f:
|
|
396
|
+
f.write(screenshot_bytes)
|
|
397
|
+
|
|
398
|
+
msg = f'📸 Screenshot saved to path: [{filename}]({str(filepath.relative_to(fs_dir))})'
|
|
399
|
+
logger.info(msg)
|
|
400
|
+
return ActionResult(
|
|
401
|
+
extracted_content=msg,
|
|
402
|
+
include_in_memory=True,
|
|
403
|
+
long_term_memory=f'Screenshot saved to {str(filepath.relative_to(fs_dir))}',
|
|
404
|
+
)
|
|
405
|
+
|
|
406
|
+
except Exception as e:
|
|
407
|
+
error_msg = f'❌ Failed to take screenshot: {str(e)}'
|
|
408
|
+
logger.error(error_msg)
|
|
409
|
+
return ActionResult(error=error_msg)
|
|
410
|
+
|
|
411
|
+
@self.registry.action(
|
|
412
|
+
'Execute JavaScript code on webpage',
|
|
413
|
+
param_model=SkillCodeAction,
|
|
414
|
+
)
|
|
415
|
+
async def skill_code(
|
|
416
|
+
params: SkillCodeAction,
|
|
417
|
+
browser_manager: BrowserManager,
|
|
418
|
+
page_extraction_llm: BaseChatModel,
|
|
419
|
+
file_system: CustomFileSystem
|
|
420
|
+
):
|
|
421
|
+
"""
|
|
422
|
+
Skill: Generate and execute JavaScript code from functional requirements or code prompts with iterative retry logic
|
|
423
|
+
"""
|
|
424
|
+
|
|
425
|
+
try:
|
|
426
|
+
if not page_extraction_llm:
|
|
427
|
+
raise RuntimeError("LLM is required for skill_code")
|
|
428
|
+
|
|
429
|
+
# Get browser session
|
|
430
|
+
browser_session = browser_manager.main_browser_session
|
|
431
|
+
|
|
432
|
+
# If tab_id is provided, switch to that tab
|
|
433
|
+
if params.tab_id:
|
|
434
|
+
target_id = await browser_session.get_target_id_from_tab_id(params.tab_id)
|
|
435
|
+
await browser_session.get_or_create_cdp_session(target_id, focus=True)
|
|
436
|
+
|
|
437
|
+
from vibe_surf.tools.utils import generate_java_script_code
|
|
438
|
+
|
|
439
|
+
success, execute_result, js_code = await generate_java_script_code(params.code_requirement,
|
|
440
|
+
page_extraction_llm, browser_session,
|
|
441
|
+
MAX_ITERATIONS=5)
|
|
442
|
+
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
443
|
+
code_file = f"codes/{timestamp}.js"
|
|
444
|
+
await file_system.write_file(code_file, js_code)
|
|
445
|
+
|
|
446
|
+
if len(execute_result) < 1000:
|
|
447
|
+
msg = f'JavaScript Code save at:{code_file}\nResult:\n```json\n {execute_result}\n```\n'
|
|
448
|
+
else:
|
|
449
|
+
result_file = f"codes/{timestamp}.json"
|
|
450
|
+
await file_system.write_file(result_file, execute_result)
|
|
451
|
+
msg = f'Code save at:{code_file}\n```javascript\n{js_code}\n```\n Result save at {result_file}:\n```json\n {execute_result[:1000]}\n...\n```'
|
|
452
|
+
if success:
|
|
453
|
+
return ActionResult(extracted_content=msg)
|
|
454
|
+
else:
|
|
455
|
+
return ActionResult(error=msg)
|
|
456
|
+
|
|
457
|
+
except Exception as e:
|
|
458
|
+
logger.error(f'❌ Skill Code failed: {e}')
|
|
459
|
+
return ActionResult(error=f'Skill code failed: {str(e)}')
|
|
460
|
+
|
|
461
|
+
@self.registry.action(
|
|
462
|
+
'Get comprehensive financial data for stocks - retrieve company information, historical prices, news, earnings, dividends, analyst recommendations and other financial data using Yahoo Finance.',
|
|
463
|
+
param_model=SkillFinanceAction,
|
|
464
|
+
)
|
|
465
|
+
async def skill_finance(
|
|
466
|
+
params: SkillFinanceAction,
|
|
467
|
+
):
|
|
468
|
+
"""
|
|
469
|
+
Skill: Get comprehensive financial data using Yahoo Finance
|
|
470
|
+
|
|
471
|
+
Available methods include:
|
|
472
|
+
- get_info: Company information including sector, industry, market cap, business summary
|
|
473
|
+
- get_history: Historical stock prices and volume data over time periods
|
|
474
|
+
- get_news: Latest news articles about the company
|
|
475
|
+
- get_dividends: Historical dividend payments and yield data
|
|
476
|
+
- get_earnings: Quarterly and annual earnings data and growth trends
|
|
477
|
+
- get_recommendations: Analyst recommendations, price targets, and ratings
|
|
478
|
+
- get_balance_sheet: Company balance sheet data (assets, liabilities, equity)
|
|
479
|
+
- get_income_stmt: Income statement data (revenue, expenses, profit)
|
|
480
|
+
- get_cashflow: Cash flow statement data (operating, investing, financing)
|
|
481
|
+
- get_fast_info: Quick statistics like current price, volume, market cap
|
|
482
|
+
- get_institutional_holders: Institutional ownership and holdings data
|
|
483
|
+
- get_major_holders: Major shareholders and insider ownership percentages
|
|
484
|
+
- get_sustainability: ESG (Environmental, Social, Governance) scores and data
|
|
485
|
+
- get_upgrades_downgrades: Recent analyst upgrades and downgrades
|
|
486
|
+
- get_splits: Historical stock splits and stock split dates
|
|
487
|
+
- get_actions: Corporate actions including dividends and splits
|
|
488
|
+
- get_sec_filings: Recent SEC filings and regulatory documents
|
|
489
|
+
- get_calendar: Upcoming earnings dates and events
|
|
490
|
+
- get_mutualfund_holders: Mutual fund ownership data
|
|
491
|
+
- get_insider_purchases: Recent insider buying activity
|
|
492
|
+
- get_insider_transactions: All insider trading transactions
|
|
493
|
+
- get_shares: Outstanding shares and float data
|
|
494
|
+
"""
|
|
495
|
+
try:
|
|
496
|
+
# Default to get_info if no methods specified
|
|
497
|
+
methods = params.methods if params.methods else [FinanceMethod.GET_INFO]
|
|
498
|
+
|
|
499
|
+
# Convert string methods to FinanceMethod enum if needed
|
|
500
|
+
if methods and isinstance(methods[0], str):
|
|
501
|
+
try:
|
|
502
|
+
methods = [FinanceMethod(method) for method in methods]
|
|
503
|
+
except ValueError as e:
|
|
504
|
+
available_methods = [method.value for method in FinanceMethod]
|
|
505
|
+
return ActionResult(
|
|
506
|
+
error=f'Invalid method in {methods}. Available methods: {available_methods}'
|
|
507
|
+
)
|
|
508
|
+
|
|
509
|
+
# Create data retriever with symbol
|
|
510
|
+
retriever = FinanceDataRetriever(params.symbol)
|
|
511
|
+
|
|
512
|
+
# Convert FinanceMethod enum values to strings for the retriever
|
|
513
|
+
method_strings = [method.value for method in methods]
|
|
514
|
+
|
|
515
|
+
# Retrieve financial data
|
|
516
|
+
financial_data = retriever.get_finance_data(
|
|
517
|
+
methods=method_strings,
|
|
518
|
+
period=getattr(params, 'period', '1y'),
|
|
519
|
+
start_date=getattr(params, 'start_date', None),
|
|
520
|
+
end_date=getattr(params, 'end_date', None),
|
|
521
|
+
interval=getattr(params, 'interval', '1d'),
|
|
522
|
+
num_news=getattr(params, 'num_news', 5)
|
|
523
|
+
)
|
|
524
|
+
|
|
525
|
+
# Format as markdown using the static method
|
|
526
|
+
markdown_content = FinanceMarkdownFormatter.format_finance_data(
|
|
527
|
+
symbol=params.symbol,
|
|
528
|
+
results=financial_data,
|
|
529
|
+
methods=method_strings
|
|
530
|
+
)
|
|
531
|
+
|
|
532
|
+
method_names = [method.value for method in methods]
|
|
533
|
+
logger.info(f'💹 Comprehensive finance data retrieved for {params.symbol} with methods: {method_names}')
|
|
534
|
+
|
|
535
|
+
return ActionResult(
|
|
536
|
+
extracted_content=markdown_content,
|
|
537
|
+
include_extracted_content_only_once=True,
|
|
538
|
+
long_term_memory=f'Retrieved comprehensive financial data for {params.symbol} using methods: {", ".join(method_names)}',
|
|
539
|
+
)
|
|
540
|
+
|
|
541
|
+
except Exception as e:
|
|
542
|
+
error_msg = f'❌ Failed to retrieve financial data for {params.symbol}: {str(e)}'
|
|
543
|
+
logger.error(error_msg)
|
|
544
|
+
return ActionResult(error=error_msg, extracted_content=error_msg)
|
|
545
|
+
|
|
546
|
+
@self.registry.action(
|
|
547
|
+
'',
|
|
548
|
+
param_model=SkillXhsAction,
|
|
549
|
+
)
|
|
550
|
+
async def skill_xhs(
|
|
551
|
+
params: SkillXhsAction,
|
|
552
|
+
browser_manager: BrowserManager,
|
|
553
|
+
file_system: CustomFileSystem
|
|
554
|
+
):
|
|
555
|
+
"""
|
|
556
|
+
Skill: Xiaohongshu API integration
|
|
557
|
+
|
|
558
|
+
Available methods:
|
|
559
|
+
- search_content_by_keyword: Search content by keyword with sorting options
|
|
560
|
+
- fetch_content_details: Get detailed information about specific content
|
|
561
|
+
- fetch_all_content_comments: Get all comments for specific content
|
|
562
|
+
- get_user_profile: Get user profile information
|
|
563
|
+
- fetch_all_user_content: Get all content posted by a user
|
|
564
|
+
- get_home_recommendations: Get homepage recommended content
|
|
565
|
+
"""
|
|
566
|
+
try:
|
|
567
|
+
from vibe_surf.tools.website_api.xhs.client import XiaoHongShuApiClient
|
|
568
|
+
|
|
569
|
+
# Initialize client
|
|
570
|
+
xhs_client = XiaoHongShuApiClient(browser_session=browser_manager.main_browser_session)
|
|
571
|
+
await xhs_client.setup()
|
|
572
|
+
|
|
573
|
+
# Parse params JSON string
|
|
574
|
+
import json
|
|
575
|
+
from json_repair import repair_json
|
|
576
|
+
try:
|
|
577
|
+
method_params = json.loads(params.params)
|
|
578
|
+
except json.JSONDecodeError:
|
|
579
|
+
method_params = json.loads(repair_json(params.params))
|
|
580
|
+
|
|
581
|
+
# Execute the requested method
|
|
582
|
+
result = None
|
|
583
|
+
if params.method == "search_content_by_keyword":
|
|
584
|
+
result = await xhs_client.search_content_by_keyword(**method_params)
|
|
585
|
+
elif params.method == "fetch_content_details":
|
|
586
|
+
result = await xhs_client.fetch_content_details(**method_params)
|
|
587
|
+
elif params.method == "fetch_all_content_comments":
|
|
588
|
+
result = await xhs_client.fetch_all_content_comments(**method_params)
|
|
589
|
+
elif params.method == "get_user_profile":
|
|
590
|
+
result = await xhs_client.get_user_profile(**method_params)
|
|
591
|
+
elif params.method == "fetch_all_user_content":
|
|
592
|
+
result = await xhs_client.fetch_all_user_content(**method_params)
|
|
593
|
+
elif params.method == "get_home_recommendations":
|
|
594
|
+
result = await xhs_client.get_home_recommendations()
|
|
595
|
+
else:
|
|
596
|
+
return ActionResult(error=f"Unknown method: {params.method}")
|
|
597
|
+
|
|
598
|
+
# Save result to file
|
|
599
|
+
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
600
|
+
filename = f"xhs_{params.method}_{timestamp}.json"
|
|
601
|
+
filepath = file_system.get_dir() / "data" / filename
|
|
602
|
+
filepath.parent.mkdir(exist_ok=True)
|
|
603
|
+
|
|
604
|
+
with open(filepath, "w", encoding="utf-8") as f:
|
|
605
|
+
json.dump(result, f, ensure_ascii=False, indent=2)
|
|
606
|
+
|
|
607
|
+
# Format result as markdown
|
|
608
|
+
if isinstance(result, list):
|
|
609
|
+
display_count = min(5, len(result))
|
|
610
|
+
md_content = f"## Xiaohongshu {params.method.replace('_', ' ').title()}\n\n"
|
|
611
|
+
md_content += f"Showing {display_count} of {len(result)} results:\n\n"
|
|
612
|
+
for i, item in enumerate(result[:display_count]):
|
|
613
|
+
md_content += f"### Result {i + 1}\n"
|
|
614
|
+
for key, value in item.items():
|
|
615
|
+
if not value:
|
|
616
|
+
continue
|
|
617
|
+
if isinstance(value, str) and len(value) > 200:
|
|
618
|
+
md_content += f"- **{key}**: {value[:200]}...\n"
|
|
619
|
+
else:
|
|
620
|
+
md_content += f"- **{key}**: {value}\n"
|
|
621
|
+
md_content += "\n"
|
|
622
|
+
else:
|
|
623
|
+
md_content = f"## Xiaohongshu {params.method.replace('_', ' ').title()}\n\n"
|
|
624
|
+
for key, value in result.items():
|
|
625
|
+
if isinstance(value, str) and len(value) > 200:
|
|
626
|
+
md_content += f"- **{key}**: {value[:200]}...\n"
|
|
627
|
+
else:
|
|
628
|
+
md_content += f"- **{key}**: {value}\n"
|
|
629
|
+
md_content += "\n"
|
|
630
|
+
|
|
631
|
+
# Add file path to markdown
|
|
632
|
+
relative_path = str(filepath.relative_to(file_system.get_dir()))
|
|
633
|
+
md_content += f"\n> 📁 Full data saved to: [{filename}]({relative_path})\n"
|
|
634
|
+
md_content += f"> 💡 Click the link above to view all results.\n"
|
|
635
|
+
|
|
636
|
+
logger.info(f'📕 Xiaohongshu data retrieved with method: {params.method}')
|
|
637
|
+
|
|
638
|
+
# Close client
|
|
639
|
+
await xhs_client.close()
|
|
640
|
+
|
|
641
|
+
return ActionResult(
|
|
642
|
+
extracted_content=md_content
|
|
643
|
+
)
|
|
644
|
+
|
|
645
|
+
except Exception as e:
|
|
646
|
+
error_msg = f'❌ Failed to retrieve Xiaohongshu data: {str(e)}'
|
|
647
|
+
logger.error(error_msg)
|
|
648
|
+
return ActionResult(error=error_msg, extracted_content=error_msg)
|
|
649
|
+
|
|
650
|
+
@self.registry.action(
|
|
651
|
+
'',
|
|
652
|
+
param_model=SkillWeiboAction,
|
|
653
|
+
)
|
|
654
|
+
async def skill_weibo(
|
|
655
|
+
params: SkillWeiboAction,
|
|
656
|
+
browser_manager: BrowserManager,
|
|
657
|
+
file_system: CustomFileSystem
|
|
658
|
+
):
|
|
659
|
+
"""
|
|
660
|
+
Skill: Weibo API integration
|
|
661
|
+
|
|
662
|
+
Available methods:
|
|
663
|
+
- search_posts_by_keyword: Search posts by keyword with sorting options
|
|
664
|
+
- get_post_detail: Get detailed information about specific post
|
|
665
|
+
- get_all_post_comments: Get all comments for specific post
|
|
666
|
+
- get_user_info: Get user profile information
|
|
667
|
+
- get_all_user_posts: Get all posts by a user
|
|
668
|
+
- get_hot_posts: Get hot posts
|
|
669
|
+
- get_trending_list: Get trending list
|
|
670
|
+
"""
|
|
671
|
+
try:
|
|
672
|
+
from vibe_surf.tools.website_api.weibo.client import WeiboApiClient
|
|
673
|
+
|
|
674
|
+
# Initialize client
|
|
675
|
+
wb_client = WeiboApiClient(browser_session=browser_manager.main_browser_session)
|
|
676
|
+
await wb_client.setup()
|
|
677
|
+
|
|
678
|
+
# Parse params JSON string
|
|
679
|
+
import json
|
|
680
|
+
from json_repair import repair_json
|
|
681
|
+
try:
|
|
682
|
+
method_params = json.loads(params.params)
|
|
683
|
+
except json.JSONDecodeError:
|
|
684
|
+
method_params = json.loads(repair_json(params.params))
|
|
685
|
+
|
|
686
|
+
# Execute the requested method
|
|
687
|
+
result = None
|
|
688
|
+
if params.method == "search_posts_by_keyword":
|
|
689
|
+
result = await wb_client.search_posts_by_keyword(**method_params)
|
|
690
|
+
elif params.method == "get_post_detail":
|
|
691
|
+
result = await wb_client.get_post_detail(**method_params)
|
|
692
|
+
elif params.method == "get_all_post_comments":
|
|
693
|
+
result = await wb_client.get_all_post_comments(**method_params)
|
|
694
|
+
elif params.method == "get_user_info":
|
|
695
|
+
result = await wb_client.get_user_info(**method_params)
|
|
696
|
+
elif params.method == "get_all_user_posts":
|
|
697
|
+
result = await wb_client.get_all_user_posts(**method_params)
|
|
698
|
+
elif params.method == "get_hot_posts":
|
|
699
|
+
result = await wb_client.get_hot_posts()
|
|
700
|
+
elif params.method == "get_trending_posts":
|
|
701
|
+
result = await wb_client.get_trending_posts()
|
|
702
|
+
else:
|
|
703
|
+
return ActionResult(error=f"Unknown method: {params.method}")
|
|
704
|
+
|
|
705
|
+
# Save result to file
|
|
706
|
+
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
707
|
+
filename = f"weibo_{params.method}_{timestamp}.json"
|
|
708
|
+
filepath = file_system.get_dir() / "data" / filename
|
|
709
|
+
filepath.parent.mkdir(exist_ok=True)
|
|
710
|
+
|
|
711
|
+
with open(filepath, "w", encoding="utf-8") as f:
|
|
712
|
+
json.dump(result, f, ensure_ascii=False, indent=2)
|
|
713
|
+
# Format result as markdown
|
|
714
|
+
if isinstance(result, list):
|
|
715
|
+
display_count = min(5, len(result))
|
|
716
|
+
md_content = f"## Weibo {params.method.replace('_', ' ').title()}\n\n"
|
|
717
|
+
md_content += f"Showing {display_count} of {len(result)} results:\n\n"
|
|
718
|
+
for i, item in enumerate(result[:display_count]):
|
|
719
|
+
md_content += f"### Result {i + 1}\n"
|
|
720
|
+
for key, value in item.items():
|
|
721
|
+
if not value:
|
|
722
|
+
continue
|
|
723
|
+
if isinstance(value, str) and len(value) > 200:
|
|
724
|
+
md_content += f"- **{key}**: {value[:200]}...\n"
|
|
725
|
+
else:
|
|
726
|
+
md_content += f"- **{key}**: {value}\n"
|
|
727
|
+
md_content += "\n"
|
|
728
|
+
else:
|
|
729
|
+
md_content = f"## Weibo {params.method.replace('_', ' ').title()}\n\n"
|
|
730
|
+
for key, value in result.items():
|
|
731
|
+
if isinstance(value, str) and len(value) > 200:
|
|
732
|
+
md_content += f"- **{key}**: {value[:200]}...\n"
|
|
733
|
+
else:
|
|
734
|
+
md_content += f"- **{key}**: {value}\n"
|
|
735
|
+
md_content += "\n"
|
|
736
|
+
|
|
737
|
+
# Add file path to markdown
|
|
738
|
+
relative_path = str(filepath.relative_to(file_system.get_dir()))
|
|
739
|
+
md_content += f"\n> 📁 Full data saved to: [{filename}]({relative_path})\n"
|
|
740
|
+
md_content += f"> 💡 Click the link above to view all results.\n"
|
|
741
|
+
|
|
742
|
+
logger.info(f'🐦 Weibo data retrieved with method: {params.method}')
|
|
743
|
+
|
|
744
|
+
# Close client
|
|
745
|
+
await wb_client.close()
|
|
746
|
+
|
|
747
|
+
return ActionResult(
|
|
748
|
+
extracted_content=md_content
|
|
749
|
+
)
|
|
750
|
+
|
|
751
|
+
except Exception as e:
|
|
752
|
+
import traceback
|
|
753
|
+
traceback.print_exc()
|
|
754
|
+
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.'
|
|
755
|
+
logger.error(error_msg)
|
|
756
|
+
return ActionResult(error=error_msg, extracted_content=error_msg)
|
|
757
|
+
|
|
758
|
+
@self.registry.action(
|
|
759
|
+
'',
|
|
760
|
+
param_model=SkillDouyinAction,
|
|
761
|
+
)
|
|
762
|
+
async def skill_douyin(
|
|
763
|
+
params: SkillDouyinAction,
|
|
764
|
+
browser_manager: BrowserManager,
|
|
765
|
+
file_system: CustomFileSystem
|
|
766
|
+
):
|
|
767
|
+
"""
|
|
768
|
+
Skill: Douyin API integration
|
|
769
|
+
|
|
770
|
+
Available methods:
|
|
771
|
+
- search_content_by_keyword: Search content by keyword with filtering options
|
|
772
|
+
- fetch_video_details: Get detailed information about specific video
|
|
773
|
+
- fetch_all_video_comments: Get all comments for specific video
|
|
774
|
+
- fetch_user_info: Get user profile information
|
|
775
|
+
- fetch_all_user_videos: Get all videos by a user
|
|
776
|
+
"""
|
|
777
|
+
try:
|
|
778
|
+
from vibe_surf.tools.website_api.douyin.client import DouyinApiClient
|
|
779
|
+
|
|
780
|
+
# Initialize client
|
|
781
|
+
dy_client = DouyinApiClient(browser_session=browser_manager.main_browser_session)
|
|
782
|
+
await dy_client.setup()
|
|
783
|
+
|
|
784
|
+
# Parse params JSON string
|
|
785
|
+
import json
|
|
786
|
+
from json_repair import repair_json
|
|
787
|
+
try:
|
|
788
|
+
method_params = json.loads(params.params)
|
|
789
|
+
except json.JSONDecodeError:
|
|
790
|
+
method_params = json.loads(repair_json(params.params))
|
|
791
|
+
|
|
792
|
+
# Execute the requested method
|
|
793
|
+
result = None
|
|
794
|
+
if params.method == "search_content_by_keyword":
|
|
795
|
+
result = await dy_client.search_content_by_keyword(**method_params)
|
|
796
|
+
elif params.method == "fetch_video_details":
|
|
797
|
+
result = await dy_client.fetch_video_details(**method_params)
|
|
798
|
+
elif params.method == "fetch_all_video_comments":
|
|
799
|
+
result = await dy_client.fetch_all_video_comments(**method_params)
|
|
800
|
+
elif params.method == "fetch_user_info":
|
|
801
|
+
result = await dy_client.fetch_user_info(**method_params)
|
|
802
|
+
elif params.method == "fetch_all_user_videos":
|
|
803
|
+
result = await dy_client.fetch_all_user_videos(**method_params)
|
|
804
|
+
else:
|
|
805
|
+
return ActionResult(error=f"Unknown method: {params.method}")
|
|
806
|
+
|
|
807
|
+
# Save result to file
|
|
808
|
+
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
809
|
+
filename = f"douyin_{params.method}_{timestamp}.json"
|
|
810
|
+
filepath = file_system.get_dir() / "data" / filename
|
|
811
|
+
filepath.parent.mkdir(exist_ok=True)
|
|
812
|
+
|
|
813
|
+
with open(filepath, "w", encoding="utf-8") as f:
|
|
814
|
+
json.dump(result, f, ensure_ascii=False, indent=2)
|
|
815
|
+
|
|
816
|
+
# Format result as markdown
|
|
817
|
+
if isinstance(result, list):
|
|
818
|
+
display_count = min(5, len(result))
|
|
819
|
+
md_content = f"## Douyin {params.method.replace('_', ' ').title()}\n\n"
|
|
820
|
+
md_content += f"Showing {display_count} of {len(result)} results:\n\n"
|
|
821
|
+
for i, item in enumerate(result[:display_count]):
|
|
822
|
+
md_content += f"### Result {i + 1}\n"
|
|
823
|
+
for key, value in item.items():
|
|
824
|
+
if not value:
|
|
825
|
+
continue
|
|
826
|
+
if isinstance(value, str) and len(value) > 200:
|
|
827
|
+
md_content += f"- **{key}**: {value[:200]}...\n"
|
|
828
|
+
else:
|
|
829
|
+
md_content += f"- **{key}**: {value}\n"
|
|
830
|
+
md_content += "\n"
|
|
831
|
+
else:
|
|
832
|
+
md_content = f"## Douyin {params.method.replace('_', ' ').title()}\n\n"
|
|
833
|
+
for key, value in result.items():
|
|
834
|
+
if isinstance(value, str) and len(value) > 200:
|
|
835
|
+
md_content += f"- **{key}**: {value[:200]}...\n"
|
|
836
|
+
else:
|
|
837
|
+
md_content += f"- **{key}**: {value}\n"
|
|
838
|
+
md_content += "\n"
|
|
839
|
+
|
|
840
|
+
# Add file path to markdown
|
|
841
|
+
relative_path = str(filepath.relative_to(file_system.get_dir()))
|
|
842
|
+
md_content += f"\n> 📁 Full data saved to: [{filename}]({relative_path})\n"
|
|
843
|
+
md_content += f"> 💡 Click the link above to view all results.\n"
|
|
844
|
+
|
|
845
|
+
logger.info(f'🎵 Douyin data retrieved with method: {params.method}')
|
|
846
|
+
|
|
847
|
+
# Close client
|
|
848
|
+
await dy_client.close()
|
|
849
|
+
|
|
850
|
+
return ActionResult(
|
|
851
|
+
extracted_content=md_content
|
|
852
|
+
)
|
|
853
|
+
|
|
854
|
+
except Exception as e:
|
|
855
|
+
error_msg = f'❌ Failed to retrieve Douyin data: {str(e)}'
|
|
856
|
+
logger.error(error_msg)
|
|
857
|
+
return ActionResult(error=error_msg, extracted_content=error_msg)
|
|
858
|
+
|
|
859
|
+
@self.registry.action(
|
|
860
|
+
"""YouTube API - If users want to know the specific content of this video, please use get_video_transcript to get detailed video content first.""",
|
|
861
|
+
param_model=SkillYoutubeAction,
|
|
862
|
+
)
|
|
863
|
+
async def skill_youtube(
|
|
864
|
+
params: SkillYoutubeAction,
|
|
865
|
+
browser_manager: BrowserManager,
|
|
866
|
+
file_system: CustomFileSystem
|
|
867
|
+
):
|
|
868
|
+
"""
|
|
869
|
+
Skill: YouTube API integration
|
|
870
|
+
|
|
871
|
+
Available methods:
|
|
872
|
+
- search_videos: Search videos by keyword
|
|
873
|
+
- get_video_details: Get detailed information about specific video
|
|
874
|
+
- get_video_comments: Get comments for specific video
|
|
875
|
+
- get_channel_info: Get channel information
|
|
876
|
+
- get_channel_videos: Get videos from specific channel
|
|
877
|
+
- get_trending_videos: Get trending videos
|
|
878
|
+
- get_video_transcript: Get video transcript in multiple languages
|
|
879
|
+
"""
|
|
880
|
+
try:
|
|
881
|
+
from vibe_surf.tools.website_api.youtube.client import YouTubeApiClient
|
|
882
|
+
|
|
883
|
+
# Initialize client
|
|
884
|
+
yt_client = YouTubeApiClient(browser_session=browser_manager.main_browser_session)
|
|
885
|
+
await yt_client.setup()
|
|
886
|
+
|
|
887
|
+
# Parse params JSON string
|
|
888
|
+
import json
|
|
889
|
+
from json_repair import repair_json
|
|
890
|
+
try:
|
|
891
|
+
method_params = json.loads(params.params)
|
|
892
|
+
except json.JSONDecodeError:
|
|
893
|
+
method_params = json.loads(repair_json(params.params))
|
|
894
|
+
|
|
895
|
+
# Execute the requested method
|
|
896
|
+
result = None
|
|
897
|
+
if params.method == "search_videos":
|
|
898
|
+
result = await yt_client.search_videos(**method_params)
|
|
899
|
+
elif params.method == "get_video_details":
|
|
900
|
+
result = await yt_client.get_video_details(**method_params)
|
|
901
|
+
elif params.method == "get_video_comments":
|
|
902
|
+
result = await yt_client.get_video_comments(**method_params)
|
|
903
|
+
elif params.method == "get_channel_info":
|
|
904
|
+
result = await yt_client.get_channel_info(**method_params)
|
|
905
|
+
elif params.method == "get_channel_videos":
|
|
906
|
+
result = await yt_client.get_channel_videos(**method_params)
|
|
907
|
+
elif params.method == "get_trending_videos":
|
|
908
|
+
result = await yt_client.get_trending_videos()
|
|
909
|
+
elif params.method == "get_video_transcript":
|
|
910
|
+
result = await yt_client.get_video_transcript(**method_params)
|
|
911
|
+
else:
|
|
912
|
+
return ActionResult(error=f"Unknown method: {params.method}")
|
|
913
|
+
|
|
914
|
+
# Save result to file
|
|
915
|
+
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
916
|
+
filename = f"youtube_{params.method}_{timestamp}.json"
|
|
917
|
+
filepath = file_system.get_dir() / "data" / filename
|
|
918
|
+
filepath.parent.mkdir(exist_ok=True)
|
|
919
|
+
|
|
920
|
+
with open(filepath, "w", encoding="utf-8") as f:
|
|
921
|
+
json.dump(result, f, ensure_ascii=False, indent=2)
|
|
922
|
+
|
|
923
|
+
# Format result as markdown
|
|
924
|
+
if isinstance(result, list):
|
|
925
|
+
display_count = min(5, len(result))
|
|
926
|
+
md_content = f"## YouTube {params.method.replace('_', ' ').title()}\n\n"
|
|
927
|
+
md_content += f"Showing {display_count} of {len(result)} results:\n\n"
|
|
928
|
+
for i, item in enumerate(result[:display_count]):
|
|
929
|
+
md_content += f"### Result {i + 1}\n"
|
|
930
|
+
for key, value in item.items():
|
|
931
|
+
if not value:
|
|
932
|
+
continue
|
|
933
|
+
if isinstance(value, str) and len(value) > 200:
|
|
934
|
+
md_content += f"- **{key}**: {value[:200]}...\n"
|
|
935
|
+
else:
|
|
936
|
+
md_content += f"- **{key}**: {value}\n"
|
|
937
|
+
md_content += "\n"
|
|
938
|
+
else:
|
|
939
|
+
md_content = f"## YouTube {params.method.replace('_', ' ').title()}\n\n"
|
|
940
|
+
for key, value in result.items():
|
|
941
|
+
if isinstance(value, str) and len(value) > 200:
|
|
942
|
+
md_content += f"- **{key}**: {value[:200]}...\n"
|
|
943
|
+
else:
|
|
944
|
+
md_content += f"- **{key}**: {value}\n"
|
|
945
|
+
md_content += "\n"
|
|
946
|
+
|
|
947
|
+
# Add file path to markdown
|
|
948
|
+
relative_path = str(filepath.relative_to(file_system.get_dir()))
|
|
949
|
+
md_content += f"\n> 📁 Full data saved to: [{filename}]({relative_path})\n"
|
|
950
|
+
md_content += f"> 💡 Click the link above to view all results.\n"
|
|
951
|
+
|
|
952
|
+
logger.info(f'🎬 YouTube data retrieved with method: {params.method}')
|
|
953
|
+
|
|
954
|
+
# Close client
|
|
955
|
+
await yt_client.close()
|
|
956
|
+
|
|
957
|
+
return ActionResult(
|
|
958
|
+
extracted_content=md_content
|
|
959
|
+
)
|
|
960
|
+
|
|
961
|
+
except Exception as e:
|
|
962
|
+
error_msg = f'❌ Failed to retrieve YouTube data: {str(e)}'
|
|
963
|
+
logger.error(error_msg)
|
|
964
|
+
return ActionResult(error=error_msg, extracted_content=error_msg)
|
|
965
|
+
|
|
966
|
+
@self.registry.action(
|
|
967
|
+
"""Execute Python code for data processing, visualization, and analysis.
|
|
968
|
+
""",
|
|
969
|
+
param_model=ExecutePythonCodeAction,
|
|
970
|
+
)
|
|
971
|
+
async def execute_python_code(
|
|
972
|
+
params: ExecutePythonCodeAction,
|
|
973
|
+
file_system: CustomFileSystem
|
|
974
|
+
):
|
|
975
|
+
try:
|
|
976
|
+
# Get base directory from file system
|
|
977
|
+
base_dir = str(file_system.get_dir())
|
|
978
|
+
|
|
979
|
+
# Create a secure namespace with pre-imported libraries
|
|
980
|
+
namespace = {
|
|
981
|
+
'__builtins__': {
|
|
982
|
+
# Safe built-ins only
|
|
983
|
+
'abs': abs, 'all': all, 'any': any, 'bin': bin, 'bool': bool,
|
|
984
|
+
'chr': chr, 'dict': dict, 'dir': dir, 'divmod': divmod,
|
|
985
|
+
'enumerate': enumerate, 'filter': filter, 'float': float,
|
|
986
|
+
'format': format, 'frozenset': frozenset, 'getattr': getattr,
|
|
987
|
+
'hasattr': hasattr, 'hash': hash, 'hex': hex, 'id': id,
|
|
988
|
+
'int': int, 'isinstance': isinstance, 'issubclass': issubclass,
|
|
989
|
+
'iter': iter, 'len': len, 'list': list, 'map': map,
|
|
990
|
+
'max': max, 'min': min, 'next': next, 'oct': oct,
|
|
991
|
+
'ord': ord, 'pow': pow, 'print': print, 'range': range,
|
|
992
|
+
'repr': repr, 'reversed': reversed, 'round': round,
|
|
993
|
+
'set': set, 'setattr': setattr, 'slice': slice,
|
|
994
|
+
'sorted': sorted, 'str': str, 'sum': sum, 'tuple': tuple,
|
|
995
|
+
'type': type, 'zip': zip,
|
|
996
|
+
},
|
|
997
|
+
'SAVE_DIR': base_dir,
|
|
998
|
+
}
|
|
999
|
+
|
|
1000
|
+
# Import common libraries safely
|
|
1001
|
+
try:
|
|
1002
|
+
|
|
1003
|
+
# Add libraries to namespace
|
|
1004
|
+
namespace.update({
|
|
1005
|
+
'pd': pd,
|
|
1006
|
+
'pandas': pd,
|
|
1007
|
+
'np': np,
|
|
1008
|
+
'numpy': np,
|
|
1009
|
+
'plt': plt,
|
|
1010
|
+
'matplotlib': matplotlib,
|
|
1011
|
+
'sns': sns,
|
|
1012
|
+
'seaborn': sns,
|
|
1013
|
+
'json': json,
|
|
1014
|
+
're': re,
|
|
1015
|
+
'os': os,
|
|
1016
|
+
'openpyxl': openpyxl,
|
|
1017
|
+
'datetime': datetime,
|
|
1018
|
+
'timedelta': timedelta,
|
|
1019
|
+
'Path': Path,
|
|
1020
|
+
'csv': csv,
|
|
1021
|
+
'io': io
|
|
1022
|
+
})
|
|
1023
|
+
|
|
1024
|
+
# Add secure file helper functions
|
|
1025
|
+
def safe_open(path, mode='r', **kwargs):
|
|
1026
|
+
"""Secure file open that restricts operations to BASE_DIR"""
|
|
1027
|
+
if (not path.startswith(base_dir)) and os.path.isabs(path):
|
|
1028
|
+
raise PermissionError("Absolute paths are not allowed. Only relative paths within workspace are supported.")
|
|
1029
|
+
if not path.startswith(base_dir):
|
|
1030
|
+
full_path = os.path.join(base_dir, path)
|
|
1031
|
+
else:
|
|
1032
|
+
full_path = path
|
|
1033
|
+
if not full_path.startswith(base_dir):
|
|
1034
|
+
raise PermissionError("File operations are restricted to workspace directory only.")
|
|
1035
|
+
os.makedirs(os.path.dirname(full_path), exist_ok=True)
|
|
1036
|
+
return open(full_path, mode, **kwargs)
|
|
1037
|
+
|
|
1038
|
+
def safe_path(path):
|
|
1039
|
+
"""Get safe path within BASE_DIR"""
|
|
1040
|
+
if (not path.startswith(base_dir)) and os.path.isabs(path):
|
|
1041
|
+
raise PermissionError(
|
|
1042
|
+
"Absolute paths are not allowed. Only relative paths within workspace are supported.")
|
|
1043
|
+
if not path.startswith(base_dir):
|
|
1044
|
+
full_path = os.path.join(base_dir, path)
|
|
1045
|
+
else:
|
|
1046
|
+
full_path = path
|
|
1047
|
+
if not full_path.startswith(base_dir):
|
|
1048
|
+
raise PermissionError("File operations are restricted to workspace directory only.")
|
|
1049
|
+
return full_path
|
|
1050
|
+
|
|
1051
|
+
namespace.update({
|
|
1052
|
+
'open': safe_open,
|
|
1053
|
+
'safe_path': safe_path,
|
|
1054
|
+
})
|
|
1055
|
+
|
|
1056
|
+
except ImportError as e:
|
|
1057
|
+
logger.warning(f"Failed to import some libraries: {e}")
|
|
1058
|
+
|
|
1059
|
+
# Remove import statements from user code since modules are pre-imported
|
|
1060
|
+
cleaned_code = remove_import_statements(params.code)
|
|
1061
|
+
logger.info(cleaned_code)
|
|
1062
|
+
|
|
1063
|
+
# Check for dangerous operations
|
|
1064
|
+
dangerous_keywords = [
|
|
1065
|
+
'import subprocess', 'import sys', 'import importlib',
|
|
1066
|
+
'__import__', 'eval(', 'exec(', 'compile(',
|
|
1067
|
+
'open(', 'file(', 'input(', 'raw_input(',
|
|
1068
|
+
'execfile', 'reload', 'vars(', 'globals(', 'locals(',
|
|
1069
|
+
'delattr', 'setattr', 'getattr', '__'
|
|
1070
|
+
]
|
|
1071
|
+
|
|
1072
|
+
code_lower = cleaned_code.lower()
|
|
1073
|
+
for keyword in dangerous_keywords:
|
|
1074
|
+
if keyword in code_lower and keyword not in ['open(', '__']: # Allow our safe open
|
|
1075
|
+
if keyword == 'open(' and 'safe_open' in cleaned_code:
|
|
1076
|
+
continue # Allow our safe open function
|
|
1077
|
+
return ActionResult(
|
|
1078
|
+
error=f"🚫 Security Error: Dangerous operation '{keyword}' detected. Code execution blocked for security reasons."
|
|
1079
|
+
)
|
|
1080
|
+
|
|
1081
|
+
# Capture stdout to get print outputs
|
|
1082
|
+
import sys
|
|
1083
|
+
from io import StringIO
|
|
1084
|
+
|
|
1085
|
+
old_stdout = sys.stdout
|
|
1086
|
+
sys.stdout = captured_output = StringIO()
|
|
1087
|
+
|
|
1088
|
+
try:
|
|
1089
|
+
# Compile and execute the cleaned code
|
|
1090
|
+
compiled_code = compile(cleaned_code, '<code>', 'exec')
|
|
1091
|
+
exec(compiled_code, namespace, namespace)
|
|
1092
|
+
|
|
1093
|
+
# Get the captured output
|
|
1094
|
+
output_value = captured_output.getvalue()
|
|
1095
|
+
if output_value.strip():
|
|
1096
|
+
result_text = output_value
|
|
1097
|
+
else:
|
|
1098
|
+
result_text = "No output printed to console after executing the Python code."
|
|
1099
|
+
finally:
|
|
1100
|
+
# Restore stdout
|
|
1101
|
+
sys.stdout = old_stdout
|
|
1102
|
+
|
|
1103
|
+
logger.info(f'🐍 Python code executed successfully')
|
|
1104
|
+
return ActionResult(
|
|
1105
|
+
extracted_content=result_text)
|
|
1106
|
+
|
|
1107
|
+
except PermissionError as e:
|
|
1108
|
+
error_msg = f'🚫 Security Error: {str(e)}'
|
|
1109
|
+
logger.error(error_msg)
|
|
1110
|
+
return ActionResult(error=error_msg, extracted_content=error_msg)
|
|
1111
|
+
except SyntaxError as e:
|
|
1112
|
+
error_msg = f'❌ Syntax Error in Python code: {str(e)}'
|
|
1113
|
+
logger.error(error_msg)
|
|
1114
|
+
return ActionResult(error=error_msg, extracted_content=error_msg)
|
|
1115
|
+
except Exception as e:
|
|
1116
|
+
error_msg = f'❌ Python code execution failed: {str(e)}'
|
|
1117
|
+
logger.error(error_msg)
|
|
1118
|
+
return ActionResult(error=error_msg, extracted_content=error_msg)
|
|
1119
|
+
|
|
1120
|
+
@self.registry.action(
|
|
1121
|
+
'Get trending/real-time news via NewsNow. Leave keywords EMPTY for general hot searches to avoid over-filtering. Only set keywords for specific topics.',
|
|
1122
|
+
param_model=SkillTrendAction,
|
|
1123
|
+
)
|
|
1124
|
+
async def skill_trend(
|
|
1125
|
+
params: SkillTrendAction,
|
|
1126
|
+
file_system: CustomFileSystem
|
|
1127
|
+
):
|
|
1128
|
+
"""
|
|
1129
|
+
Skill: Get trending news from NewsNow API
|
|
1130
|
+
|
|
1131
|
+
Fetches news from various sources (微博, 知乎, IT之家, GitHub, etc.)
|
|
1132
|
+
Can filter by source_id and keywords
|
|
1133
|
+
"""
|
|
1134
|
+
try:
|
|
1135
|
+
from vibe_surf.tools.website_api.newsnow.client import NewsNowClient
|
|
1136
|
+
|
|
1137
|
+
# Initialize NewsNow client
|
|
1138
|
+
client = NewsNowClient()
|
|
1139
|
+
|
|
1140
|
+
# If source_id is None, show available sources
|
|
1141
|
+
# If source_id is "*", fetch from all sources
|
|
1142
|
+
if params.source_id is None:
|
|
1143
|
+
available_sources = client.get_available_sources()
|
|
1144
|
+
|
|
1145
|
+
# Format available sources as markdown
|
|
1146
|
+
md_content = "## 📰 Available News Sources\n\n"
|
|
1147
|
+
md_content += f"Total: {len(available_sources)} sources\n\n"
|
|
1148
|
+
|
|
1149
|
+
# Group by type
|
|
1150
|
+
realtime_sources = []
|
|
1151
|
+
hottest_sources = []
|
|
1152
|
+
all_sources = []
|
|
1153
|
+
|
|
1154
|
+
for source_id, metadata in available_sources.items():
|
|
1155
|
+
source_type = metadata.get('type', 'all')
|
|
1156
|
+
source_name = metadata.get('name', source_id)
|
|
1157
|
+
source_title = metadata.get('title', '')
|
|
1158
|
+
|
|
1159
|
+
display_name = f"{source_name} - {source_title}" if source_title else source_name
|
|
1160
|
+
|
|
1161
|
+
if source_type == 'realtime':
|
|
1162
|
+
realtime_sources.append((source_id, display_name))
|
|
1163
|
+
elif source_type == 'hottest':
|
|
1164
|
+
hottest_sources.append((source_id, display_name))
|
|
1165
|
+
else:
|
|
1166
|
+
all_sources.append((source_id, display_name))
|
|
1167
|
+
|
|
1168
|
+
if realtime_sources:
|
|
1169
|
+
md_content += "### 🔴 Real-time News Sources\n"
|
|
1170
|
+
for sid, name in realtime_sources:
|
|
1171
|
+
md_content += f"- `{sid}`: {name}\n"
|
|
1172
|
+
md_content += "\n"
|
|
1173
|
+
|
|
1174
|
+
if hottest_sources:
|
|
1175
|
+
md_content += "### 🔥 Hottest News Sources\n"
|
|
1176
|
+
for sid, name in hottest_sources:
|
|
1177
|
+
md_content += f"- `{sid}`: {name}\n"
|
|
1178
|
+
md_content += "\n"
|
|
1179
|
+
|
|
1180
|
+
if all_sources:
|
|
1181
|
+
md_content += "### 📌 General News Sources\n"
|
|
1182
|
+
for sid, name in all_sources:
|
|
1183
|
+
md_content += f"- `{sid}`: {name}\n"
|
|
1184
|
+
md_content += "\n"
|
|
1185
|
+
|
|
1186
|
+
md_content += "\n> 💡 Use any source_id above to fetch news from that specific source.\n"
|
|
1187
|
+
|
|
1188
|
+
logger.info(f'📰 Listed {len(available_sources)} available news sources')
|
|
1189
|
+
return ActionResult(
|
|
1190
|
+
extracted_content=md_content,
|
|
1191
|
+
include_extracted_content_only_once=True,
|
|
1192
|
+
long_term_memory=f'Listed {len(available_sources)} available news sources'
|
|
1193
|
+
)
|
|
1194
|
+
|
|
1195
|
+
# Fetch news from specified source or all sources
|
|
1196
|
+
# If source_id is "*", set it to None to fetch all sources
|
|
1197
|
+
fetch_source_id = None if params.source_id == "*" else params.source_id
|
|
1198
|
+
|
|
1199
|
+
news_results = await client.get_news(
|
|
1200
|
+
source_id=fetch_source_id,
|
|
1201
|
+
count=params.count,
|
|
1202
|
+
news_type=None # Get both realtime and hottest
|
|
1203
|
+
)
|
|
1204
|
+
|
|
1205
|
+
# Filter by keywords if provided
|
|
1206
|
+
if params.key_words:
|
|
1207
|
+
keywords = [kw.strip().lower() for kw in params.key_words.split(',')]
|
|
1208
|
+
filtered_results = {}
|
|
1209
|
+
|
|
1210
|
+
for source_id, news_items in news_results.items():
|
|
1211
|
+
filtered_items = []
|
|
1212
|
+
for item in news_items:
|
|
1213
|
+
# Convert item to JSON string and check if any keyword matches
|
|
1214
|
+
item_copy = item.copy()
|
|
1215
|
+
if 'url' in item_copy:
|
|
1216
|
+
del item_copy['url']
|
|
1217
|
+
if 'id' in item_copy:
|
|
1218
|
+
del item_copy['id']
|
|
1219
|
+
if 'mobileUrl' in item_copy:
|
|
1220
|
+
del item_copy['mobileUrl']
|
|
1221
|
+
item_str = json.dumps(item_copy, ensure_ascii=False).lower()
|
|
1222
|
+
if any(keyword in item_str for keyword in keywords):
|
|
1223
|
+
filtered_items.append(item)
|
|
1224
|
+
|
|
1225
|
+
if filtered_items:
|
|
1226
|
+
filtered_results[source_id] = filtered_items
|
|
1227
|
+
|
|
1228
|
+
news_results = filtered_results
|
|
1229
|
+
|
|
1230
|
+
# Format results as markdown
|
|
1231
|
+
if not news_results:
|
|
1232
|
+
md_content = f"## 📰 No news found\n\n"
|
|
1233
|
+
if params.source_id:
|
|
1234
|
+
md_content += f"No news found for source: {params.source_id}\n"
|
|
1235
|
+
if params.key_words:
|
|
1236
|
+
md_content += f"No news matching keywords: {params.key_words}\n"
|
|
1237
|
+
else:
|
|
1238
|
+
total_items = sum(len(items) for items in news_results.values())
|
|
1239
|
+
md_content = f"## 📰 Trending News\n\n"
|
|
1240
|
+
md_content += f"Found {total_items} news items from {len(news_results)} source(s)\n"
|
|
1241
|
+
if params.key_words:
|
|
1242
|
+
md_content += f"Filtered by keywords: {params.key_words}\n"
|
|
1243
|
+
md_content += "\n---\n\n"
|
|
1244
|
+
|
|
1245
|
+
# Get source metadata for display names
|
|
1246
|
+
all_sources = client.get_available_sources()
|
|
1247
|
+
|
|
1248
|
+
for source_id, news_items in news_results.items():
|
|
1249
|
+
source_info = all_sources.get(source_id, {})
|
|
1250
|
+
source_name = source_info.get('name', source_id)
|
|
1251
|
+
source_title = source_info.get('title', '')
|
|
1252
|
+
|
|
1253
|
+
display_name = f"{source_name} - {source_title}" if source_title else source_name
|
|
1254
|
+
|
|
1255
|
+
md_content += f"### 📌 {display_name} (`{source_id}`)\n\n"
|
|
1256
|
+
md_content += f"{len(news_items)} items\n\n"
|
|
1257
|
+
|
|
1258
|
+
for i, item in enumerate(news_items[:params.count], 1):
|
|
1259
|
+
title = item.get('title', 'No title')
|
|
1260
|
+
url = item.get('url', '#')
|
|
1261
|
+
|
|
1262
|
+
md_content += f"{i}. [{title}]({url})\n"
|
|
1263
|
+
|
|
1264
|
+
md_content += "\n"
|
|
1265
|
+
|
|
1266
|
+
# Save to file if results are large
|
|
1267
|
+
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
1268
|
+
filename = f"newsnow_trend_{timestamp}.json"
|
|
1269
|
+
filepath = file_system.get_dir() / "data" / filename
|
|
1270
|
+
filepath.parent.mkdir(exist_ok=True)
|
|
1271
|
+
|
|
1272
|
+
with open(filepath, "w", encoding="utf-8") as f:
|
|
1273
|
+
json.dump(news_results, f, ensure_ascii=False, indent=2)
|
|
1274
|
+
|
|
1275
|
+
# Add file reference to markdown
|
|
1276
|
+
relative_path = str(filepath.relative_to(file_system.get_dir()))
|
|
1277
|
+
md_content += f"\n> 📁 Full data saved to: [{filename}]({relative_path})\n"
|
|
1278
|
+
|
|
1279
|
+
logger.info(f'📰 NewsNow trend data retrieved: {len(news_results)} sources, {sum(len(items) for items in news_results.values())} items')
|
|
1280
|
+
|
|
1281
|
+
return ActionResult(
|
|
1282
|
+
extracted_content=md_content,
|
|
1283
|
+
include_extracted_content_only_once=True,
|
|
1284
|
+
long_term_memory=f'Retrieved trending news from {len(news_results)} sources with {sum(len(items) for items in news_results.values())} items'
|
|
1285
|
+
)
|
|
1286
|
+
|
|
1287
|
+
except Exception as e:
|
|
1288
|
+
error_msg = f'❌ Failed to retrieve NewsNow trending data: {str(e)}'
|
|
1289
|
+
logger.error(error_msg)
|
|
1290
|
+
return ActionResult(error=error_msg, extracted_content=error_msg)
|
|
1291
|
+
|
|
1292
|
+
def _register_extra_tools(self):
|
|
1293
|
+
"""
|
|
1294
|
+
Register extra tools for dynamic toolkit and MCP tool access
|
|
1295
|
+
"""
|
|
1296
|
+
|
|
1297
|
+
@self.registry.action(
|
|
1298
|
+
'Get all available toolkit types from both Composio and MCP clients',
|
|
1299
|
+
param_model=NoParamsAction,
|
|
1300
|
+
)
|
|
1301
|
+
async def get_all_toolkit_types():
|
|
1302
|
+
"""
|
|
1303
|
+
Get all toolkit types available in composio_toolkits and mcp_clients
|
|
1304
|
+
|
|
1305
|
+
Returns:
|
|
1306
|
+
ActionResult with list of all toolkit type names
|
|
1307
|
+
"""
|
|
1308
|
+
try:
|
|
1309
|
+
toolkit_types = []
|
|
1310
|
+
|
|
1311
|
+
# Add Composio toolkit types
|
|
1312
|
+
if self.composio_toolkits:
|
|
1313
|
+
toolkit_types.extend(list(self.composio_toolkits.keys()))
|
|
1314
|
+
|
|
1315
|
+
# Add MCP client types
|
|
1316
|
+
if self.mcp_clients:
|
|
1317
|
+
toolkit_types.extend(list(self.mcp_clients.keys()))
|
|
1318
|
+
|
|
1319
|
+
result_text = f"Available toolkit types ({len(toolkit_types)} total):\n\n"
|
|
1320
|
+
|
|
1321
|
+
# Group by type
|
|
1322
|
+
composio_types = list(self.composio_toolkits.keys()) if self.composio_toolkits else []
|
|
1323
|
+
mcp_types = list(self.mcp_clients.keys()) if self.mcp_clients else []
|
|
1324
|
+
|
|
1325
|
+
if composio_types:
|
|
1326
|
+
result_text += f"**Composio Toolkits ({len(composio_types)}):**\n"
|
|
1327
|
+
for toolkit in composio_types:
|
|
1328
|
+
result_text += f"- {toolkit}\n"
|
|
1329
|
+
result_text += "\n"
|
|
1330
|
+
|
|
1331
|
+
if mcp_types:
|
|
1332
|
+
result_text += f"**MCP Clients ({len(mcp_types)}):**\n"
|
|
1333
|
+
for client in mcp_types:
|
|
1334
|
+
result_text += f"- {client}\n"
|
|
1335
|
+
result_text += "\n"
|
|
1336
|
+
|
|
1337
|
+
if not toolkit_types:
|
|
1338
|
+
result_text = "No toolkit types available. Please register Composio toolkits or MCP clients first."
|
|
1339
|
+
|
|
1340
|
+
logger.info(f'📋 Retrieved {len(toolkit_types)} toolkit types')
|
|
1341
|
+
return ActionResult(
|
|
1342
|
+
extracted_content=result_text,
|
|
1343
|
+
)
|
|
1344
|
+
|
|
1345
|
+
except Exception as e:
|
|
1346
|
+
logger.error(f'❌ Failed to get toolkit types: {e}')
|
|
1347
|
+
return ActionResult(error=f'Failed to get toolkit types: {str(e)}')
|
|
1348
|
+
|
|
1349
|
+
@self.registry.action(
|
|
1350
|
+
'Search tools within a specific toolkit type by name and description filters',
|
|
1351
|
+
param_model=SearchToolAction,
|
|
1352
|
+
)
|
|
1353
|
+
async def search_tool(params: SearchToolAction):
|
|
1354
|
+
"""
|
|
1355
|
+
Search tools by toolkit type and filters
|
|
1356
|
+
|
|
1357
|
+
Args:
|
|
1358
|
+
params: SearchToolAction containing toolkit_type and filters
|
|
1359
|
+
|
|
1360
|
+
Returns:
|
|
1361
|
+
ActionResult with matching tools and their descriptions
|
|
1362
|
+
"""
|
|
1363
|
+
try:
|
|
1364
|
+
toolkit_type = params.toolkit_type
|
|
1365
|
+
try:
|
|
1366
|
+
if params.filters:
|
|
1367
|
+
filters = [f.lower() for f in params.filters]
|
|
1368
|
+
else:
|
|
1369
|
+
filters = []
|
|
1370
|
+
except Exception as e:
|
|
1371
|
+
filters = []
|
|
1372
|
+
|
|
1373
|
+
matching_tools = []
|
|
1374
|
+
|
|
1375
|
+
# Search in registry actions with prefixes
|
|
1376
|
+
for action_name, action in self.registry.registry.actions.items():
|
|
1377
|
+
# Check if this action belongs to the specified toolkit type
|
|
1378
|
+
if toolkit_type in self.composio_toolkits and action_name.startswith(f"cpo.{toolkit_type}."):
|
|
1379
|
+
# Get tool description from param_model
|
|
1380
|
+
try:
|
|
1381
|
+
param_dict = action.param_model.model_json_schema()
|
|
1382
|
+
description = param_dict.get('description', action_name)
|
|
1383
|
+
except:
|
|
1384
|
+
description = action_name
|
|
1385
|
+
|
|
1386
|
+
# Check if any filter matches tool name or description
|
|
1387
|
+
search_text = f"{action_name} {description}".lower()
|
|
1388
|
+
if not filters or any(filter_term in search_text for filter_term in filters):
|
|
1389
|
+
matching_tools.append({
|
|
1390
|
+
'tool_name': action_name,
|
|
1391
|
+
'description': description
|
|
1392
|
+
})
|
|
1393
|
+
|
|
1394
|
+
elif toolkit_type in self.mcp_clients and action_name.startswith(f"mcp.{toolkit_type}."):
|
|
1395
|
+
# Get tool description from param_model
|
|
1396
|
+
try:
|
|
1397
|
+
param_dict = action.param_model.model_json_schema()
|
|
1398
|
+
description = param_dict.get('description', action_name)
|
|
1399
|
+
except:
|
|
1400
|
+
description = action_name
|
|
1401
|
+
|
|
1402
|
+
# Check if any filter matches tool name or description
|
|
1403
|
+
search_text = f"{action_name} {description}".lower()
|
|
1404
|
+
if not filters or any(filter_term in search_text for filter_term in filters):
|
|
1405
|
+
matching_tools.append({
|
|
1406
|
+
'tool_name': action_name,
|
|
1407
|
+
'description': description
|
|
1408
|
+
})
|
|
1409
|
+
|
|
1410
|
+
# Format results
|
|
1411
|
+
if matching_tools:
|
|
1412
|
+
result_text = f"Found {len(matching_tools)} tools in '{toolkit_type}' matching filters {params.filters}:\n\n"
|
|
1413
|
+
for i, tool in enumerate(matching_tools, 1):
|
|
1414
|
+
result_text += f"{i}. **{tool['tool_name']}**\n"
|
|
1415
|
+
result_text += f" Description: {tool['description']}\n\n"
|
|
1416
|
+
else:
|
|
1417
|
+
result_text = f"No tools found in '{toolkit_type}' matching filters {params.filters}"
|
|
1418
|
+
|
|
1419
|
+
logger.info(f'🔍 Found {len(matching_tools)} tools in {toolkit_type} matching filters')
|
|
1420
|
+
return ActionResult(
|
|
1421
|
+
extracted_content=result_text,
|
|
1422
|
+
include_extracted_content_only_once=True
|
|
1423
|
+
)
|
|
1424
|
+
|
|
1425
|
+
except Exception as e:
|
|
1426
|
+
logger.error(f'❌ Failed to search tools: {e}')
|
|
1427
|
+
return ActionResult(error=f'Failed to search tools: {str(e)}')
|
|
1428
|
+
|
|
1429
|
+
@self.registry.action(
|
|
1430
|
+
'Get detailed information about a specific tool including its parameters',
|
|
1431
|
+
param_model=GetToolInfoAction,
|
|
1432
|
+
)
|
|
1433
|
+
async def get_tool_info(params: GetToolInfoAction):
|
|
1434
|
+
"""
|
|
1435
|
+
Get tool information including parameter model
|
|
1436
|
+
|
|
1437
|
+
Args:
|
|
1438
|
+
params: GetToolInfoAction containing tool_name
|
|
1439
|
+
|
|
1440
|
+
Returns:
|
|
1441
|
+
ActionResult with tool parameter information
|
|
1442
|
+
"""
|
|
1443
|
+
try:
|
|
1444
|
+
tool_name = params.tool_name
|
|
1445
|
+
|
|
1446
|
+
if tool_name not in self.registry.registry.actions:
|
|
1447
|
+
return ActionResult(error=f'Tool "{tool_name}" not found in registry')
|
|
1448
|
+
|
|
1449
|
+
action = self.registry.registry.actions[tool_name]
|
|
1450
|
+
|
|
1451
|
+
# Convert param_model to dict
|
|
1452
|
+
try:
|
|
1453
|
+
param_dict = action.param_model.model_json_schema()
|
|
1454
|
+
result_text = json.dumps(param_dict, indent=2, ensure_ascii=False)
|
|
1455
|
+
except Exception as e:
|
|
1456
|
+
result_text = f"Tool: {tool_name}\nError getting parameter info: {str(e)}"
|
|
1457
|
+
|
|
1458
|
+
logger.info(f'ℹ️ Retrieved tool info for: {tool_name}')
|
|
1459
|
+
return ActionResult(
|
|
1460
|
+
extracted_content=f"```json\n{result_text}\n```"
|
|
1461
|
+
)
|
|
1462
|
+
|
|
1463
|
+
except Exception as e:
|
|
1464
|
+
logger.error(f'❌ Failed to get tool info: {e}')
|
|
1465
|
+
return ActionResult(error=f'Failed to get tool info: {str(e)}')
|
|
1466
|
+
|
|
1467
|
+
@self.registry.action(
|
|
1468
|
+
'Execute a specific extra tool with provided parameters',
|
|
1469
|
+
param_model=ExecuteExtraToolAction,
|
|
1470
|
+
)
|
|
1471
|
+
async def execute_extra_tool(
|
|
1472
|
+
params: ExecuteExtraToolAction,
|
|
1473
|
+
browser_manager: BrowserManager,
|
|
1474
|
+
page_extraction_llm: BaseChatModel,
|
|
1475
|
+
file_system: CustomFileSystem
|
|
1476
|
+
):
|
|
1477
|
+
"""
|
|
1478
|
+
Execute an extra tool with given parameters
|
|
1479
|
+
|
|
1480
|
+
Args:
|
|
1481
|
+
params: ExecuteExtraToolAction containing tool_name and tool_params
|
|
1482
|
+
browser_manager: Browser manager instance
|
|
1483
|
+
page_extraction_llm: LLM instance
|
|
1484
|
+
file_system: File system instance
|
|
1485
|
+
|
|
1486
|
+
Returns:
|
|
1487
|
+
ActionResult from the executed tool
|
|
1488
|
+
"""
|
|
1489
|
+
try:
|
|
1490
|
+
tool_name = params.tool_name
|
|
1491
|
+
|
|
1492
|
+
if tool_name not in self.registry.registry.actions:
|
|
1493
|
+
return ActionResult(error=f'Tool "{tool_name}" not found in registry')
|
|
1494
|
+
|
|
1495
|
+
# Parse tool parameters
|
|
1496
|
+
try:
|
|
1497
|
+
tool_params_dict = json.loads(params.tool_params)
|
|
1498
|
+
except json.JSONDecodeError:
|
|
1499
|
+
try:
|
|
1500
|
+
tool_params_dict = json.loads(repair_json(params.tool_params))
|
|
1501
|
+
except Exception as e:
|
|
1502
|
+
return ActionResult(error=f'Failed to parse tool parameters: {str(e)}')
|
|
1503
|
+
|
|
1504
|
+
# Get the action
|
|
1505
|
+
action = self.registry.registry.actions[tool_name]
|
|
1506
|
+
|
|
1507
|
+
# Create special context (same as in act method)
|
|
1508
|
+
special_context = {
|
|
1509
|
+
'browser_manager': browser_manager,
|
|
1510
|
+
'page_extraction_llm': page_extraction_llm,
|
|
1511
|
+
'file_system': file_system,
|
|
1512
|
+
}
|
|
1513
|
+
|
|
1514
|
+
# Validate parameters
|
|
1515
|
+
try:
|
|
1516
|
+
validated_params = action.param_model(**tool_params_dict)
|
|
1517
|
+
except Exception as e:
|
|
1518
|
+
return ActionResult(
|
|
1519
|
+
error=f'Invalid parameters {tool_params_dict} for action {tool_name}: {type(e)}: {e}')
|
|
1520
|
+
|
|
1521
|
+
# Execute the tool
|
|
1522
|
+
result = await action.function(params=validated_params, **special_context)
|
|
1523
|
+
|
|
1524
|
+
logger.info(f'🔧 Successfully executed extra tool: {tool_name}')
|
|
1525
|
+
return result
|
|
1526
|
+
|
|
1527
|
+
except Exception as e:
|
|
1528
|
+
logger.error(f'❌ Failed to execute extra tool: {e}')
|
|
1529
|
+
return ActionResult(error=f'Failed to execute extra tool: {str(e)}')
|
|
1530
|
+
|
|
1531
|
+
def _register_browser_use_agent(self):
|
|
1532
|
+
@self.registry.action(
|
|
1533
|
+
'Execute browser_use agent tasks. Please specify a tab id to an agent, if you want to let agent work on this tab. When using Parallel Task Processing, each `tab_id` in parameter must be unique - one tab_id can only be assigned to one agent during parallel execution. Otherwise, please use single bu agent to complete the task.',
|
|
1534
|
+
param_model=BrowserUseAgentExecution,
|
|
1535
|
+
)
|
|
1536
|
+
async def execute_browser_use_agent(
|
|
1537
|
+
params: BrowserUseAgentExecution,
|
|
1538
|
+
):
|
|
1539
|
+
"""
|
|
1540
|
+
Execute browser_use agent tasks in parallel for improved efficiency.
|
|
1541
|
+
|
|
1542
|
+
Args:
|
|
1543
|
+
params: BrowserUseAgentExecution containing list of tasks to execute
|
|
1544
|
+
browser_manager: Browser manager instance
|
|
1545
|
+
llm: Language model instance
|
|
1546
|
+
file_system: File system instance
|
|
1547
|
+
|
|
1548
|
+
Returns:
|
|
1549
|
+
ActionResult with execution results
|
|
1550
|
+
"""
|
|
1551
|
+
# TODO: Implement parallel execution of browser_use agent tasks
|
|
1552
|
+
# This is a placeholder implementation
|
|
1553
|
+
pass
|
|
1554
|
+
|
|
1555
|
+
def _register_report_writer_agent(self):
|
|
1556
|
+
@self.registry.action(
|
|
1557
|
+
'Execute report writer agent to generate HTML reports. ',
|
|
1558
|
+
param_model=ReportWriterTask,
|
|
1559
|
+
)
|
|
1560
|
+
async def execute_report_writer_agent(
|
|
1561
|
+
params: ReportWriterTask,
|
|
1562
|
+
):
|
|
1563
|
+
"""
|
|
1564
|
+
Execute report writer agent to generate HTML reports.
|
|
1565
|
+
|
|
1566
|
+
Args:
|
|
1567
|
+
params: ReportWriterTask containing task description with requirements and insights
|
|
1568
|
+
browser_manager: Browser manager instance
|
|
1569
|
+
llm: Language model instance
|
|
1570
|
+
file_system: File system instance
|
|
1571
|
+
|
|
1572
|
+
Returns:
|
|
1573
|
+
ActionResult with generated report path
|
|
1574
|
+
"""
|
|
1575
|
+
# TODO: Implement report writer agent execution
|
|
1576
|
+
# This is a placeholder implementation
|
|
1577
|
+
pass
|
|
1578
|
+
|
|
1579
|
+
def _register_todo_actions(self):
|
|
1580
|
+
@self.registry.action(
|
|
1581
|
+
'Generate a new todo.md file with the provided todo items in markdown checkbox format.',
|
|
1582
|
+
param_model=TodoGenerateAction
|
|
1583
|
+
)
|
|
1584
|
+
async def generate_todos(params: TodoGenerateAction, file_system: CustomFileSystem):
|
|
1585
|
+
"""Generate a new todo.md file with todo items in markdown format"""
|
|
1586
|
+
try:
|
|
1587
|
+
# Format todo items as markdown checkboxes
|
|
1588
|
+
formatted_items = []
|
|
1589
|
+
todo_items = params.todo_items
|
|
1590
|
+
for item in todo_items:
|
|
1591
|
+
# Clean item and ensure it doesn't already have checkbox format
|
|
1592
|
+
clean_item = item.strip()
|
|
1593
|
+
if clean_item.startswith('- ['):
|
|
1594
|
+
formatted_items.append(clean_item)
|
|
1595
|
+
else:
|
|
1596
|
+
formatted_items.append(f'- [ ] {clean_item}')
|
|
1597
|
+
|
|
1598
|
+
# Create content for todo.md
|
|
1599
|
+
content = '\n'.join(formatted_items) + '\n'
|
|
1600
|
+
|
|
1601
|
+
# Write to todo.md file
|
|
1602
|
+
todo_path = file_system.get_dir() / 'todo.md'
|
|
1603
|
+
if todo_path.exists():
|
|
1604
|
+
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
|
|
1605
|
+
await file_system.move_file('todo.md', f'todos/todo-{timestamp}.md')
|
|
1606
|
+
result = await file_system.write_file('todo.md', content)
|
|
1607
|
+
|
|
1608
|
+
logger.info(f'📝 Generated todo.md with {len(todo_items)} items')
|
|
1609
|
+
return ActionResult(
|
|
1610
|
+
extracted_content=f'Todo file generated successfully with {len(todo_items)} items:\n{content}',
|
|
1611
|
+
long_term_memory=f'Generated todo.md with {len(todo_items)} items',
|
|
1612
|
+
)
|
|
1613
|
+
|
|
1614
|
+
except Exception as e:
|
|
1615
|
+
logger.error(f'❌ Failed to generate todo file: {e}')
|
|
1616
|
+
raise RuntimeError(f'Failed to generate todo file: {str(e)}')
|
|
1617
|
+
|
|
1618
|
+
@self.registry.action(
|
|
1619
|
+
'Read the current todo.md file content.'
|
|
1620
|
+
)
|
|
1621
|
+
async def read_todos(file_system: CustomFileSystem):
|
|
1622
|
+
"""Read the current todo.md file content"""
|
|
1623
|
+
try:
|
|
1624
|
+
# Read todo.md file
|
|
1625
|
+
result = await file_system.read_file('todo.md')
|
|
1626
|
+
|
|
1627
|
+
logger.info(f'📖 Read todo.md file')
|
|
1628
|
+
return ActionResult(
|
|
1629
|
+
extracted_content=result,
|
|
1630
|
+
long_term_memory='Read current todo list',
|
|
1631
|
+
include_in_memory=True,
|
|
1632
|
+
)
|
|
1633
|
+
|
|
1634
|
+
except Exception as e:
|
|
1635
|
+
logger.error(f'❌ Failed to read todo file: {e}')
|
|
1636
|
+
return ActionResult(
|
|
1637
|
+
extracted_content='Error: todo.md file not found or could not be read',
|
|
1638
|
+
long_term_memory='Failed to read todo file',
|
|
1639
|
+
)
|
|
1640
|
+
|
|
1641
|
+
@self.registry.action(
|
|
1642
|
+
'Modify existing todo items in todo.md file. Supports add, remove, complete, and uncomplete operations.',
|
|
1643
|
+
param_model=TodoModifyAction,
|
|
1644
|
+
)
|
|
1645
|
+
async def modify_todos(params: TodoModifyAction, file_system: CustomFileSystem):
|
|
1646
|
+
"""Modify existing todo items using various operations"""
|
|
1647
|
+
try:
|
|
1648
|
+
# First read current content
|
|
1649
|
+
current_content = await file_system.read_file('todo.md')
|
|
1650
|
+
|
|
1651
|
+
# Extract just the content part (remove the "Read from file..." prefix)
|
|
1652
|
+
if '<content>' in current_content and '</content>' in current_content:
|
|
1653
|
+
start = current_content.find('<content>') + len('<content>')
|
|
1654
|
+
end = current_content.find('</content>')
|
|
1655
|
+
content = current_content[start:end].strip()
|
|
1656
|
+
else:
|
|
1657
|
+
content = current_content.strip()
|
|
1658
|
+
|
|
1659
|
+
modified_content = content
|
|
1660
|
+
changes_made = []
|
|
1661
|
+
|
|
1662
|
+
# Process each modification
|
|
1663
|
+
for modification in params.modifications:
|
|
1664
|
+
action = modification.action
|
|
1665
|
+
item = modification.item.strip()
|
|
1666
|
+
|
|
1667
|
+
if action == 'add':
|
|
1668
|
+
# Add new item
|
|
1669
|
+
if item:
|
|
1670
|
+
# Format as checkbox if not already formatted
|
|
1671
|
+
if not item.startswith('- ['):
|
|
1672
|
+
item = f'- [ ] {item}'
|
|
1673
|
+
modified_content += f'\n{item}'
|
|
1674
|
+
changes_made.append(f'Added: {item}')
|
|
1675
|
+
|
|
1676
|
+
elif action == 'remove':
|
|
1677
|
+
# Remove item
|
|
1678
|
+
if item:
|
|
1679
|
+
# Try to find and remove the item (with some flexibility)
|
|
1680
|
+
lines = modified_content.split('\n')
|
|
1681
|
+
new_lines = []
|
|
1682
|
+
removed = False
|
|
1683
|
+
for line in lines:
|
|
1684
|
+
if item in line or line.strip().endswith(item):
|
|
1685
|
+
removed = True
|
|
1686
|
+
changes_made.append(f'Removed: {line.strip()}')
|
|
1687
|
+
else:
|
|
1688
|
+
new_lines.append(line)
|
|
1689
|
+
modified_content = '\n'.join(new_lines)
|
|
1690
|
+
if not removed:
|
|
1691
|
+
changes_made.append(f'Item not found for removal: {item}')
|
|
1692
|
+
|
|
1693
|
+
elif action == 'complete':
|
|
1694
|
+
# Mark item as complete: - [ ] → - [x]
|
|
1695
|
+
if item:
|
|
1696
|
+
lines = modified_content.split('\n')
|
|
1697
|
+
completed = False
|
|
1698
|
+
for i, line in enumerate(lines):
|
|
1699
|
+
if item in line and '- [ ]' in line:
|
|
1700
|
+
lines[i] = line.replace('- [ ]', '- [x]')
|
|
1701
|
+
completed = True
|
|
1702
|
+
changes_made.append(f'Completed: {line.strip()} → {lines[i].strip()}')
|
|
1703
|
+
break
|
|
1704
|
+
modified_content = '\n'.join(lines)
|
|
1705
|
+
if not completed:
|
|
1706
|
+
changes_made.append(f'Item not found for completion: {item}')
|
|
1707
|
+
|
|
1708
|
+
elif action == 'uncompleted':
|
|
1709
|
+
# Mark item as uncomplete: - [x] → - [ ]
|
|
1710
|
+
if item:
|
|
1711
|
+
lines = modified_content.split('\n')
|
|
1712
|
+
uncompleted = False
|
|
1713
|
+
for i, line in enumerate(lines):
|
|
1714
|
+
if item in line and '- [x]' in line:
|
|
1715
|
+
lines[i] = line.replace('- [x]', '- [ ]')
|
|
1716
|
+
uncompleted = True
|
|
1717
|
+
changes_made.append(f'Uncompleted: {line.strip()} → {lines[i].strip()}')
|
|
1718
|
+
break
|
|
1719
|
+
modified_content = '\n'.join(lines)
|
|
1720
|
+
if not uncompleted:
|
|
1721
|
+
changes_made.append(f'Item not found for uncompletion: {item}')
|
|
1722
|
+
|
|
1723
|
+
# If we made any add/remove/complete/uncomplete changes, write the updated content
|
|
1724
|
+
if any(change.startswith(('Added:', 'Removed:', 'Completed:', 'Uncompleted:')) for change in
|
|
1725
|
+
changes_made):
|
|
1726
|
+
await file_system.write_file('todo.md', modified_content + '\n')
|
|
1727
|
+
|
|
1728
|
+
changes_summary = '\n'.join(changes_made) if changes_made else 'No changes made'
|
|
1729
|
+
|
|
1730
|
+
logger.info(f'✏️ Modified todo.md: {len(changes_made)} changes')
|
|
1731
|
+
return ActionResult(
|
|
1732
|
+
extracted_content=f'Todo modifications completed:\n{changes_summary}\n\nUpdated content:\n{modified_content}',
|
|
1733
|
+
long_term_memory=f'Modified todo list: {len(changes_made)} changes made',
|
|
1734
|
+
)
|
|
1735
|
+
|
|
1736
|
+
except Exception as e:
|
|
1737
|
+
logger.error(f'❌ Failed to modify todo file: {e}')
|
|
1738
|
+
raise RuntimeError(f'Failed to modify todo file: {str(e)}')
|
|
1739
|
+
|
|
1740
|
+
def _register_done_action(self):
|
|
1741
|
+
@self.registry.action(
|
|
1742
|
+
'Complete task and output final response. Use for simple responses or comprehensive markdown summaries with optional follow-up task suggestions.',
|
|
1743
|
+
param_model=VibeSurfDoneAction,
|
|
1744
|
+
)
|
|
1745
|
+
async def task_done(
|
|
1746
|
+
params: VibeSurfDoneAction,
|
|
1747
|
+
):
|
|
1748
|
+
"""
|
|
1749
|
+
Complete task execution and provide final response.
|
|
1750
|
+
|
|
1751
|
+
"""
|
|
1752
|
+
pass
|
|
1753
|
+
|
|
1754
|
+
def _register_file_actions(self):
|
|
1755
|
+
@self.registry.action(
|
|
1756
|
+
''
|
|
1757
|
+
)
|
|
1758
|
+
async def replace_file_str(file_name: str, old_str: str, new_str: str, file_system: CustomFileSystem):
|
|
1759
|
+
result = await file_system.replace_file_str(file_name, old_str, new_str)
|
|
1760
|
+
logger.info(f'💾 {result}')
|
|
1761
|
+
return ActionResult(extracted_content=result, long_term_memory=result)
|
|
1762
|
+
|
|
1763
|
+
@self.registry.action(
|
|
1764
|
+
'Read file content from file system. If this is a file not in current file system, please provide an absolute path.')
|
|
1765
|
+
async def read_file(file_path: str, file_system: CustomFileSystem):
|
|
1766
|
+
if os.path.exists(file_path):
|
|
1767
|
+
external_file = True
|
|
1768
|
+
else:
|
|
1769
|
+
external_file = False
|
|
1770
|
+
result = await file_system.read_file(file_path, external_file=external_file)
|
|
1771
|
+
|
|
1772
|
+
MAX_MEMORY_SIZE = 1000
|
|
1773
|
+
if len(result) > MAX_MEMORY_SIZE:
|
|
1774
|
+
lines = result.splitlines()
|
|
1775
|
+
display = ''
|
|
1776
|
+
lines_count = 0
|
|
1777
|
+
for line in lines:
|
|
1778
|
+
if len(display) + len(line) < MAX_MEMORY_SIZE:
|
|
1779
|
+
display += line + '\n'
|
|
1780
|
+
lines_count += 1
|
|
1781
|
+
else:
|
|
1782
|
+
break
|
|
1783
|
+
remaining_lines = len(lines) - lines_count
|
|
1784
|
+
memory = f'{display}{remaining_lines} more lines...' if remaining_lines > 0 else display
|
|
1785
|
+
else:
|
|
1786
|
+
memory = result
|
|
1787
|
+
logger.info(f'💾 {memory}')
|
|
1788
|
+
return ActionResult(
|
|
1789
|
+
extracted_content=result,
|
|
1790
|
+
include_in_memory=True,
|
|
1791
|
+
long_term_memory=memory,
|
|
1792
|
+
include_extracted_content_only_once=True,
|
|
1793
|
+
)
|
|
1794
|
+
|
|
1795
|
+
@self.registry.action(
|
|
1796
|
+
'Extract content from a file. Support images, pdf, markdown, txt, json, csv, python, js and etc..',
|
|
1797
|
+
param_model=FileExtractionAction,
|
|
1798
|
+
)
|
|
1799
|
+
async def extract_content_from_file(
|
|
1800
|
+
params: FileExtractionAction,
|
|
1801
|
+
page_extraction_llm: BaseChatModel,
|
|
1802
|
+
file_system: CustomFileSystem,
|
|
1803
|
+
):
|
|
1804
|
+
try:
|
|
1805
|
+
# Get file path
|
|
1806
|
+
file_path = params.file_path
|
|
1807
|
+
full_file_path = file_path
|
|
1808
|
+
# Check if file exists
|
|
1809
|
+
if not os.path.exists(full_file_path):
|
|
1810
|
+
full_file_path = os.path.join(str(file_system.get_dir()), file_path)
|
|
1811
|
+
|
|
1812
|
+
# Use the utility function to extract content from file
|
|
1813
|
+
extracted_content = await extract_file_content_with_llm(
|
|
1814
|
+
file_path=file_path,
|
|
1815
|
+
query=params.query,
|
|
1816
|
+
llm=page_extraction_llm,
|
|
1817
|
+
file_system=file_system
|
|
1818
|
+
)
|
|
1819
|
+
|
|
1820
|
+
# Handle memory storage
|
|
1821
|
+
if len(extracted_content) < 1000:
|
|
1822
|
+
memory = extracted_content
|
|
1823
|
+
include_extracted_content_only_once = False
|
|
1824
|
+
else:
|
|
1825
|
+
save_result = await file_system.save_extracted_content(extracted_content)
|
|
1826
|
+
memory = (
|
|
1827
|
+
f'Extracted content from file {file_path} for query: {params.query}\nContent saved to file system: {save_result}'
|
|
1828
|
+
)
|
|
1829
|
+
include_extracted_content_only_once = True
|
|
1830
|
+
|
|
1831
|
+
logger.info(f'📄 Extracted content from file: {file_path}')
|
|
1832
|
+
return ActionResult(
|
|
1833
|
+
extracted_content=extracted_content,
|
|
1834
|
+
include_extracted_content_only_once=include_extracted_content_only_once,
|
|
1835
|
+
long_term_memory=memory,
|
|
1836
|
+
)
|
|
1837
|
+
|
|
1838
|
+
except Exception as e:
|
|
1839
|
+
logger.debug(f'Error extracting content from file: {e}')
|
|
1840
|
+
raise RuntimeError(str(e))
|
|
1841
|
+
|
|
1842
|
+
@self.registry.action(
|
|
1843
|
+
''
|
|
1844
|
+
)
|
|
1845
|
+
async def write_file(
|
|
1846
|
+
file_path: str,
|
|
1847
|
+
content: str,
|
|
1848
|
+
file_system: CustomFileSystem,
|
|
1849
|
+
append: bool = False,
|
|
1850
|
+
trailing_newline: bool = True,
|
|
1851
|
+
leading_newline: bool = False,
|
|
1852
|
+
):
|
|
1853
|
+
if trailing_newline:
|
|
1854
|
+
content += '\n'
|
|
1855
|
+
if leading_newline:
|
|
1856
|
+
content = '\n' + content
|
|
1857
|
+
if append:
|
|
1858
|
+
result = await file_system.append_file(file_path, content)
|
|
1859
|
+
else:
|
|
1860
|
+
result = await file_system.write_file(file_path, content)
|
|
1861
|
+
logger.info(f'💾 {result}')
|
|
1862
|
+
return ActionResult(extracted_content=result, long_term_memory=result)
|
|
1863
|
+
|
|
1864
|
+
@self.registry.action(
|
|
1865
|
+
'Set external_src=True to copy from external file(absolute path)to FileSystem, False to copy within FileSystem.'
|
|
1866
|
+
)
|
|
1867
|
+
async def copy_file(src_file_path: str, dst_file_path: str, file_system: CustomFileSystem,
|
|
1868
|
+
external_src: bool = False):
|
|
1869
|
+
result = await file_system.copy_file(src_file_path, dst_file_path, external_src)
|
|
1870
|
+
logger.info(f'📁 {result}')
|
|
1871
|
+
return ActionResult(
|
|
1872
|
+
extracted_content=result,
|
|
1873
|
+
include_in_memory=True,
|
|
1874
|
+
long_term_memory=result,
|
|
1875
|
+
)
|
|
1876
|
+
|
|
1877
|
+
@self.registry.action(
|
|
1878
|
+
'Rename a file to new_filename. src_file_path is a relative path to the FileSystem.'
|
|
1879
|
+
)
|
|
1880
|
+
async def rename_file(src_file_path: str, new_filename: str, file_system: CustomFileSystem):
|
|
1881
|
+
result = await file_system.rename_file(src_file_path, new_filename)
|
|
1882
|
+
logger.info(f'📁 {result}')
|
|
1883
|
+
return ActionResult(
|
|
1884
|
+
extracted_content=result,
|
|
1885
|
+
include_in_memory=True,
|
|
1886
|
+
long_term_memory=result,
|
|
1887
|
+
)
|
|
1888
|
+
|
|
1889
|
+
@self.registry.action(
|
|
1890
|
+
'Move a file within the FileSystem from old_filename to new_filename.'
|
|
1891
|
+
)
|
|
1892
|
+
async def move_file(old_file_path: str, new_file_path: str, file_system: CustomFileSystem):
|
|
1893
|
+
result = await file_system.move_file(old_file_path, new_file_path)
|
|
1894
|
+
logger.info(f'📁 {result}')
|
|
1895
|
+
return ActionResult(
|
|
1896
|
+
extracted_content=result,
|
|
1897
|
+
include_in_memory=True,
|
|
1898
|
+
long_term_memory=result,
|
|
1899
|
+
)
|
|
1900
|
+
|
|
1901
|
+
@self.registry.action(
|
|
1902
|
+
'Check file exist or not.'
|
|
1903
|
+
)
|
|
1904
|
+
async def file_exist(file_path: str, file_system: CustomFileSystem):
|
|
1905
|
+
if os.path.exists(file_path):
|
|
1906
|
+
result = f"{file_path} is a external file and it exists."
|
|
1907
|
+
else:
|
|
1908
|
+
is_file_exist = await file_system.file_exist(file_path)
|
|
1909
|
+
if is_file_exist:
|
|
1910
|
+
result = f"{file_path} is in file system and it exists."
|
|
1911
|
+
else:
|
|
1912
|
+
result = f"{file_path} does not exists."
|
|
1913
|
+
|
|
1914
|
+
logger.info(f'📁 {result}')
|
|
1915
|
+
return ActionResult(
|
|
1916
|
+
extracted_content=result,
|
|
1917
|
+
include_in_memory=True,
|
|
1918
|
+
long_term_memory=result,
|
|
1919
|
+
)
|
|
1920
|
+
|
|
1921
|
+
@self.registry.action(
|
|
1922
|
+
'List a directory within the FileSystem. Use empty string "" or "." to list the root FileSystem, or provide relative path for subdirectory.'
|
|
1923
|
+
)
|
|
1924
|
+
async def list_directory(directory_path: str, file_system: CustomFileSystem):
|
|
1925
|
+
result = await file_system.list_directory(directory_path)
|
|
1926
|
+
logger.info(f'📁 {result}')
|
|
1927
|
+
return ActionResult(
|
|
1928
|
+
extracted_content=result,
|
|
1929
|
+
include_in_memory=True,
|
|
1930
|
+
long_term_memory=result,
|
|
1931
|
+
)
|
|
1932
|
+
|
|
1933
|
+
@self.registry.action(
|
|
1934
|
+
'search for query or keywords and return surrounding context',
|
|
1935
|
+
param_model=GrepContentAction,
|
|
1936
|
+
)
|
|
1937
|
+
async def grep_content_from_file(
|
|
1938
|
+
params: GrepContentAction,
|
|
1939
|
+
page_extraction_llm: BaseChatModel,
|
|
1940
|
+
file_system: CustomFileSystem,
|
|
1941
|
+
):
|
|
1942
|
+
try:
|
|
1943
|
+
# Get file path
|
|
1944
|
+
file_path = params.file_path
|
|
1945
|
+
full_file_path = file_path
|
|
1946
|
+
# Check if file exists
|
|
1947
|
+
if not os.path.exists(full_file_path):
|
|
1948
|
+
full_file_path = os.path.join(str(file_system.get_dir()), file_path)
|
|
1949
|
+
|
|
1950
|
+
# Determine if file is an image based on MIME type
|
|
1951
|
+
mime_type, _ = mimetypes.guess_type(file_path)
|
|
1952
|
+
is_image = mime_type and mime_type.startswith('image/')
|
|
1953
|
+
|
|
1954
|
+
if is_image:
|
|
1955
|
+
# Handle image files with LLM vision for OCR
|
|
1956
|
+
try:
|
|
1957
|
+
# Read image file and encode to base64
|
|
1958
|
+
with open(full_file_path, 'rb') as image_file:
|
|
1959
|
+
image_data = image_file.read()
|
|
1960
|
+
image_base64 = base64.b64encode(image_data).decode('utf-8')
|
|
1961
|
+
|
|
1962
|
+
# Create content parts for OCR
|
|
1963
|
+
content_parts: list[ContentPartTextParam | ContentPartImageParam] = [
|
|
1964
|
+
ContentPartTextParam(
|
|
1965
|
+
text="Please extract all text content from this image for search purposes. Return only the extracted text, no additional explanations.")
|
|
1966
|
+
]
|
|
1967
|
+
|
|
1968
|
+
# Add the image
|
|
1969
|
+
content_parts.append(
|
|
1970
|
+
ContentPartImageParam(
|
|
1971
|
+
image_url=ImageURL(
|
|
1972
|
+
url=f'data:{mime_type};base64,{image_base64}',
|
|
1973
|
+
media_type=mime_type,
|
|
1974
|
+
detail='high',
|
|
1975
|
+
),
|
|
1976
|
+
)
|
|
1977
|
+
)
|
|
1978
|
+
|
|
1979
|
+
# Create user message and invoke LLM for OCR
|
|
1980
|
+
user_message = UserMessage(content=content_parts, cache=True)
|
|
1981
|
+
response = await asyncio.wait_for(
|
|
1982
|
+
page_extraction_llm.ainvoke([user_message]),
|
|
1983
|
+
timeout=120.0,
|
|
1984
|
+
)
|
|
1985
|
+
|
|
1986
|
+
file_content = response.completion
|
|
1987
|
+
|
|
1988
|
+
except Exception as e:
|
|
1989
|
+
raise Exception(f'Failed to process image file {file_path} for OCR: {str(e)}')
|
|
1990
|
+
|
|
1991
|
+
else:
|
|
1992
|
+
# Handle non-image files by reading content
|
|
1993
|
+
try:
|
|
1994
|
+
file_content = await file_system.read_file(full_file_path, external_file=True)
|
|
1995
|
+
except Exception as e:
|
|
1996
|
+
raise Exception(f'Failed to read file {file_path}: {str(e)}')
|
|
1997
|
+
|
|
1998
|
+
# Perform grep search
|
|
1999
|
+
search_query = params.query.lower()
|
|
2000
|
+
context_chars = params.context_chars
|
|
2001
|
+
|
|
2002
|
+
# Find all matches with context
|
|
2003
|
+
matches = []
|
|
2004
|
+
content_lower = file_content.lower()
|
|
2005
|
+
search_start = 0
|
|
2006
|
+
|
|
2007
|
+
while True:
|
|
2008
|
+
match_pos = content_lower.find(search_query, search_start)
|
|
2009
|
+
if match_pos == -1:
|
|
2010
|
+
break
|
|
2011
|
+
|
|
2012
|
+
# Calculate context boundaries
|
|
2013
|
+
start_pos = max(0, match_pos - context_chars)
|
|
2014
|
+
end_pos = min(len(file_content), match_pos + len(search_query) + context_chars)
|
|
2015
|
+
|
|
2016
|
+
# Extract context with the match
|
|
2017
|
+
context_before = file_content[start_pos:match_pos]
|
|
2018
|
+
matched_text = file_content[match_pos:match_pos + len(search_query)]
|
|
2019
|
+
context_after = file_content[match_pos + len(search_query):end_pos]
|
|
2020
|
+
|
|
2021
|
+
# Add ellipsis if truncated
|
|
2022
|
+
if start_pos > 0:
|
|
2023
|
+
context_before = "..." + context_before
|
|
2024
|
+
if end_pos < len(file_content):
|
|
2025
|
+
context_after = context_after + "..."
|
|
2026
|
+
|
|
2027
|
+
matches.append({
|
|
2028
|
+
'context_before': context_before,
|
|
2029
|
+
'matched_text': matched_text,
|
|
2030
|
+
'context_after': context_after,
|
|
2031
|
+
'position': match_pos
|
|
2032
|
+
})
|
|
2033
|
+
|
|
2034
|
+
search_start = match_pos + 1
|
|
2035
|
+
|
|
2036
|
+
# Format results
|
|
2037
|
+
if not matches:
|
|
2038
|
+
extracted_content = f'File: {file_path}\nQuery: "{params.query}"\nResult: No matches found'
|
|
2039
|
+
else:
|
|
2040
|
+
result_text = f'File: {file_path}\nQuery: "{params.query}"\nFound {len(matches)} match(es):\n\n'
|
|
2041
|
+
|
|
2042
|
+
for i, match in enumerate(matches, 1):
|
|
2043
|
+
result_text += f"Match {i} (position: {match['position']}):\n"
|
|
2044
|
+
result_text += f"{match['context_before']}[{match['matched_text']}]{match['context_after']}\n\n"
|
|
2045
|
+
|
|
2046
|
+
extracted_content = result_text.strip()
|
|
2047
|
+
|
|
2048
|
+
# Handle memory storage
|
|
2049
|
+
if len(extracted_content) < 1000:
|
|
2050
|
+
memory = extracted_content
|
|
2051
|
+
include_extracted_content_only_once = False
|
|
2052
|
+
else:
|
|
2053
|
+
save_result = await file_system.save_extracted_content(extracted_content)
|
|
2054
|
+
memory = (
|
|
2055
|
+
f'Grep search completed in file {file_path} for query: {params.query}\nFound {len(matches)} match(es)\nContent saved to file system: {save_result}'
|
|
2056
|
+
)
|
|
2057
|
+
include_extracted_content_only_once = True
|
|
2058
|
+
|
|
2059
|
+
logger.info(f'🔍 Grep search completed in file: {file_path}, found {len(matches)} match(es)')
|
|
2060
|
+
return ActionResult(
|
|
2061
|
+
extracted_content=extracted_content,
|
|
2062
|
+
include_extracted_content_only_once=include_extracted_content_only_once,
|
|
2063
|
+
long_term_memory=memory,
|
|
2064
|
+
)
|
|
2065
|
+
|
|
2066
|
+
except Exception as e:
|
|
2067
|
+
logger.debug(f'Error grep searching content from file: {e}')
|
|
2068
|
+
raise RuntimeError(str(e))
|
|
2069
|
+
|
|
2070
|
+
@self.registry.action(
|
|
2071
|
+
'Create a directory within the FileSystem.'
|
|
2072
|
+
)
|
|
2073
|
+
async def create_directory(directory_path: str, file_system: CustomFileSystem):
|
|
2074
|
+
result = await file_system.create_directory(directory_path)
|
|
2075
|
+
logger.info(f'📁 {result}')
|
|
2076
|
+
return ActionResult(
|
|
2077
|
+
extracted_content=result,
|
|
2078
|
+
include_in_memory=True,
|
|
2079
|
+
long_term_memory=result,
|
|
2080
|
+
)
|
|
2081
|
+
|
|
2082
|
+
async def register_mcp_clients(self, mcp_server_config: Optional[Dict[str, Any]] = None):
|
|
2083
|
+
self.mcp_server_config = mcp_server_config or self.mcp_server_config
|
|
2084
|
+
if self.mcp_server_config:
|
|
2085
|
+
await self.unregister_mcp_clients()
|
|
2086
|
+
await self.register_mcp_tools()
|
|
2087
|
+
|
|
2088
|
+
async def register_mcp_tools(self):
|
|
2089
|
+
"""
|
|
2090
|
+
Register the MCP tools used by this tools.
|
|
2091
|
+
"""
|
|
2092
|
+
if not self.mcp_server_config:
|
|
2093
|
+
return
|
|
2094
|
+
|
|
2095
|
+
# Handle both formats: with or without "mcpServers" key
|
|
2096
|
+
mcp_servers = self.mcp_server_config.get('mcpServers', self.mcp_server_config)
|
|
2097
|
+
|
|
2098
|
+
if not mcp_servers:
|
|
2099
|
+
return
|
|
2100
|
+
|
|
2101
|
+
for server_name, server_config in mcp_servers.items():
|
|
2102
|
+
try:
|
|
2103
|
+
logger.info(f'Connecting to MCP server: {server_name}')
|
|
2104
|
+
|
|
2105
|
+
# Create MCP client
|
|
2106
|
+
client = CustomMCPClient(
|
|
2107
|
+
server_name=server_name,
|
|
2108
|
+
command=server_config['command'],
|
|
2109
|
+
args=server_config['args'],
|
|
2110
|
+
env=server_config.get('env', None)
|
|
2111
|
+
)
|
|
2112
|
+
|
|
2113
|
+
# Connect to the MCP server
|
|
2114
|
+
await client.connect(timeout=200)
|
|
2115
|
+
|
|
2116
|
+
# Register tools to tools with prefix
|
|
2117
|
+
prefix = f"mcp.{server_name}."
|
|
2118
|
+
await client.register_to_tools(
|
|
2119
|
+
tools=self,
|
|
2120
|
+
prefix=prefix
|
|
2121
|
+
)
|
|
2122
|
+
|
|
2123
|
+
# Store client for later cleanup
|
|
2124
|
+
self.mcp_clients[server_name] = client
|
|
2125
|
+
|
|
2126
|
+
logger.info(f'Successfully registered MCP server: {server_name} with prefix: {prefix}')
|
|
2127
|
+
|
|
2128
|
+
except Exception as e:
|
|
2129
|
+
logger.error(f'Failed to register MCP server {server_name}: {str(e)}')
|
|
2130
|
+
# Continue with other servers even if one fails
|
|
2131
|
+
|
|
2132
|
+
async def unregister_mcp_clients(self):
|
|
2133
|
+
"""
|
|
2134
|
+
Unregister and disconnect all MCP clients.
|
|
2135
|
+
"""
|
|
2136
|
+
# Disconnect all MCP clients
|
|
2137
|
+
for server_name, client in self.mcp_clients.items():
|
|
2138
|
+
try:
|
|
2139
|
+
logger.info(f'Disconnecting MCP server: {server_name}')
|
|
2140
|
+
await client.disconnect()
|
|
2141
|
+
except Exception as e:
|
|
2142
|
+
logger.error(f'Failed to disconnect MCP server {server_name}: {str(e)}')
|
|
2143
|
+
|
|
2144
|
+
# Remove MCP tools from registry
|
|
2145
|
+
try:
|
|
2146
|
+
# Get all registered actions
|
|
2147
|
+
actions_to_remove = []
|
|
2148
|
+
for action_name in list(self.registry.registry.actions.keys()):
|
|
2149
|
+
if action_name.startswith('mcp.'):
|
|
2150
|
+
actions_to_remove.append(action_name)
|
|
2151
|
+
|
|
2152
|
+
# Remove MCP actions from registry
|
|
2153
|
+
for action_name in actions_to_remove:
|
|
2154
|
+
if action_name in self.registry.registry.actions:
|
|
2155
|
+
del self.registry.registry.actions[action_name]
|
|
2156
|
+
logger.info(f'Removed MCP action: {action_name}')
|
|
2157
|
+
|
|
2158
|
+
except Exception as e:
|
|
2159
|
+
logger.error(f'Failed to remove MCP actions from registry: {str(e)}')
|
|
2160
|
+
|
|
2161
|
+
# Clear the clients dictionary
|
|
2162
|
+
self.mcp_clients.clear()
|
|
2163
|
+
logger.info('All MCP clients unregistered and disconnected')
|
|
2164
|
+
|
|
2165
|
+
async def register_composio_clients(self, composio_instance: Optional[Any] = None,
|
|
2166
|
+
toolkit_tools_dict: Optional[Dict[str, Any]] = None):
|
|
2167
|
+
"""
|
|
2168
|
+
Register Composio tools to the registry.
|
|
2169
|
+
|
|
2170
|
+
Args:
|
|
2171
|
+
composio_instance: Composio instance (optional, can be None initially)
|
|
2172
|
+
toolkit_tools_dict: Dict of toolkit_slug -> tools list
|
|
2173
|
+
"""
|
|
2174
|
+
try:
|
|
2175
|
+
# Initialize Composio client if not exists
|
|
2176
|
+
if self.composio_client is None:
|
|
2177
|
+
self.composio_client = ComposioClient(composio_instance=composio_instance)
|
|
2178
|
+
else:
|
|
2179
|
+
# Update the composio instance
|
|
2180
|
+
self.composio_client.update_composio_instance(composio_instance)
|
|
2181
|
+
self.composio_toolkits = toolkit_tools_dict
|
|
2182
|
+
# Register tools if we have both instance and toolkit tools
|
|
2183
|
+
if composio_instance and toolkit_tools_dict:
|
|
2184
|
+
await self.composio_client.register_to_tools(
|
|
2185
|
+
tools=self,
|
|
2186
|
+
toolkit_tools_dict=toolkit_tools_dict,
|
|
2187
|
+
prefix="cpo."
|
|
2188
|
+
)
|
|
2189
|
+
logger.info(f'Successfully registered Composio tools from {len(toolkit_tools_dict)} toolkits')
|
|
2190
|
+
elif not composio_instance:
|
|
2191
|
+
logger.info("Composio client initialized without instance - will register tools later")
|
|
2192
|
+
elif not toolkit_tools_dict:
|
|
2193
|
+
logger.info("Composio client initialized without toolkit tools - will register tools later")
|
|
2194
|
+
|
|
2195
|
+
except Exception as e:
|
|
2196
|
+
logger.error(f'Failed to register Composio clients: {str(e)}')
|
|
2197
|
+
|
|
2198
|
+
async def unregister_composio_clients(self):
|
|
2199
|
+
"""
|
|
2200
|
+
Unregister all Composio tools from the registry.
|
|
2201
|
+
"""
|
|
2202
|
+
try:
|
|
2203
|
+
if self.composio_client:
|
|
2204
|
+
self.composio_client.unregister_all_tools(self)
|
|
2205
|
+
logger.info('All Composio tools unregistered')
|
|
2206
|
+
self.composio_toolkits.clear()
|
|
2207
|
+
except Exception as e:
|
|
2208
|
+
logger.error(f'Failed to unregister Composio clients: {str(e)}')
|
|
2209
|
+
|
|
2210
|
+
async def update_composio_tools(self, composio_instance: Optional[Any] = None,
|
|
2211
|
+
toolkit_tools_dict: Optional[Dict[str, Any]] = None):
|
|
2212
|
+
"""
|
|
2213
|
+
Update Composio tools by unregistering old ones and registering new ones.
|
|
2214
|
+
|
|
2215
|
+
Args:
|
|
2216
|
+
composio_instance: Composio instance
|
|
2217
|
+
toolkit_tools_dict: Dict of toolkit_slug -> tools list
|
|
2218
|
+
"""
|
|
2219
|
+
try:
|
|
2220
|
+
# Unregister existing tools
|
|
2221
|
+
await self.unregister_composio_clients()
|
|
2222
|
+
|
|
2223
|
+
# Register new tools
|
|
2224
|
+
await self.register_composio_clients(composio_instance, toolkit_tools_dict)
|
|
2225
|
+
self.composio_toolkits = toolkit_tools_dict
|
|
2226
|
+
logger.info('Composio tools updated successfully')
|
|
2227
|
+
|
|
2228
|
+
except Exception as e:
|
|
2229
|
+
logger.error(f'Failed to update Composio tools: {str(e)}')
|
|
2230
|
+
|
|
2231
|
+
@time_execution_sync('--act')
|
|
2232
|
+
async def act(
|
|
2233
|
+
self,
|
|
2234
|
+
action: ActionModel,
|
|
2235
|
+
browser_manager: BrowserManager | None = None,
|
|
2236
|
+
llm: BaseChatModel | None = None,
|
|
2237
|
+
file_system: CustomFileSystem | None = None,
|
|
2238
|
+
) -> ActionResult:
|
|
2239
|
+
"""Execute an action"""
|
|
2240
|
+
|
|
2241
|
+
for action_name, params in action.model_dump(exclude_unset=True).items():
|
|
2242
|
+
if params is not None:
|
|
2243
|
+
try:
|
|
2244
|
+
if action_name not in self.registry.registry.actions:
|
|
2245
|
+
raise ValueError(f'Action {action_name} not found')
|
|
2246
|
+
action = self.registry.registry.actions[action_name]
|
|
2247
|
+
special_context = {
|
|
2248
|
+
'browser_manager': browser_manager,
|
|
2249
|
+
'page_extraction_llm': llm,
|
|
2250
|
+
'file_system': file_system,
|
|
2251
|
+
}
|
|
2252
|
+
try:
|
|
2253
|
+
validated_params = action.param_model(**params)
|
|
2254
|
+
except Exception as e:
|
|
2255
|
+
raise ValueError(f'Invalid parameters {params} for action {action_name}: {type(e)}: {e}') from e
|
|
2256
|
+
|
|
2257
|
+
result = await action.function(params=validated_params, **special_context)
|
|
2258
|
+
except BrowserError as e:
|
|
2259
|
+
logger.error(f'❌ Action {action_name} failed with BrowserError: {str(e)}')
|
|
2260
|
+
result = handle_browser_error(e)
|
|
2261
|
+
except TimeoutError as e:
|
|
2262
|
+
logger.error(f'❌ Action {action_name} failed with TimeoutError: {str(e)}')
|
|
2263
|
+
result = ActionResult(error=f'{action_name} was not executed due to timeout.')
|
|
2264
|
+
except Exception as e:
|
|
2265
|
+
# Log the original exception with traceback for observability
|
|
2266
|
+
logger.error(f"Action '{action_name}' failed with error: {str(e)}")
|
|
2267
|
+
result = ActionResult(error=str(e))
|
|
2268
|
+
|
|
2269
|
+
if isinstance(result, str):
|
|
2270
|
+
return ActionResult(extracted_content=result)
|
|
2271
|
+
elif isinstance(result, ActionResult):
|
|
2272
|
+
return result
|
|
2273
|
+
elif result is None:
|
|
2274
|
+
return ActionResult()
|
|
2275
|
+
else:
|
|
2276
|
+
raise ValueError(f'Invalid action result type: {type(result)} of {result}')
|
|
2277
|
+
return ActionResult()
|