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