@decocms/mesh 2.135.1 → 2.136.1
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.
- package/dist/client/assets/{AlertCircle-C0eftc-S.js → AlertCircle-CXJCnY_R.js} +1 -1
- package/dist/client/assets/{AlignLeft-y_Ps49tB.js → AlignLeft-Ckpqqq7X.js} +1 -1
- package/dist/client/assets/{ArrowDown-BVK-2NZv.js → ArrowDown-BXCgJapO.js} +1 -1
- package/dist/client/assets/{ArrowLeft-BNX_fMaj.js → ArrowLeft-ihbjidrQ.js} +1 -1
- package/dist/client/assets/{ArrowUp-N8lcMBug.js → ArrowUp-B3tPpNuu.js} +1 -1
- package/dist/client/assets/{Check-Cjs4C9GE.js → Check-G22LpKFd.js} +1 -1
- package/dist/client/assets/{CheckCircle-KfoOm4QY.js → CheckCircle-Dl3Eh5mw.js} +1 -1
- package/dist/client/assets/{CheckDone01-BesDn4jt.js → CheckDone01-DQOA8kaK.js} +1 -1
- package/dist/client/assets/{CheckVerified02-dNCcvCnV.js → CheckVerified02-C58oaMz8.js} +1 -1
- package/dist/client/assets/{ChevronDown-jKZz68gN.js → ChevronDown-DAk1F2Sn.js} +1 -1
- package/dist/client/assets/{ChevronLeft-DrJ63fdN.js → ChevronLeft-CGPjZdmg.js} +1 -1
- package/dist/client/assets/{ChevronRight-O5hZNhHU.js → ChevronRight-BT7U8Kip.js} +1 -1
- package/dist/client/assets/{Clock-CZrEpwOM.js → Clock-CPO-Cqx6.js} +1 -1
- package/dist/client/assets/{Code01-DVgdcTZ1.js → Code01-UXkm6aqY.js} +1 -1
- package/dist/client/assets/{Container-BADgIox6.js → Container-CyEPuAYL.js} +1 -1
- package/dist/client/assets/{Copy01-CwZDv92A.js → Copy01-tzx60ICS.js} +1 -1
- package/dist/client/assets/{Dataflow03-BD9MOeSH.js → Dataflow03-mD5gBD1P.js} +1 -1
- package/dist/client/assets/{DotsHorizontal-M2BFmBhE.js → DotsHorizontal-9qiIYu_T.js} +1 -1
- package/dist/client/assets/{DotsVertical-B7FmF1Xu.js → DotsVertical-DHxrk-2J.js} +1 -1
- package/dist/client/assets/{Download01-9ocXQLzr.js → Download01-DM18IWVp.js} +1 -1
- package/dist/client/assets/{Edit01-kvm_TgXf.js → Edit01-D3PaS600.js} +1 -1
- package/dist/client/assets/{Edit05-D4Vt7tOt.js → Edit05-B64h7zay.js} +1 -1
- package/dist/client/assets/{Eye-BCmEvczH.js → Eye-C_LYW9jG.js} +1 -1
- package/dist/client/assets/{File02-CK_RNTh6.js → File02-CY9LI3Y-.js} +1 -1
- package/dist/client/assets/{File06-B3E-bjor.js → File06-Dy7xo8XS.js} +1 -1
- package/dist/client/assets/{FilterLines-DAyCv-Xk.js → FilterLines-BvkJQ7ij.js} +1 -1
- package/dist/client/assets/{Globe01-jKd57I4x.js → Globe01-39jWI59e.js} +1 -1
- package/dist/client/assets/{Globe02-D-yCMf5N.js → Globe02-X-Xm1ngz.js} +1 -1
- package/dist/client/assets/{Grid01-DRBx9FRw.js → Grid01-DTf5JuyC.js} +1 -1
- package/dist/client/assets/{Hash02-CyfLltcT.js → Hash02-AH6eTaow.js} +1 -1
- package/dist/client/assets/{Home02-BcZSV_S0.js → Home02-DzIcdgJH.js} +1 -1
- package/dist/client/assets/{Image01-Dg_KnZBd.js → Image01-Dvb2vnmH.js} +1 -1
- package/dist/client/assets/{Inbox01-nkL2-2Zq.js → Inbox01-CsvPcK33.js} +1 -1
- package/dist/client/assets/{InfoCircle-Ipgqrfv0.js → InfoCircle-D2mDfen0.js} +1 -1
- package/dist/client/assets/{Key01-CyP1-GBg.js → Key01-C3Fh3hes.js} +1 -1
- package/dist/client/assets/{LayersTwo01-rKs-Uww3.js → LayersTwo01-CRgWs3EX.js} +1 -1
- package/dist/client/assets/{LayoutLeft-BH3urRkN.js → LayoutLeft-C-0_xlw0.js} +1 -1
- package/dist/client/assets/{Link01-D-1AbdDy.js → Link01-C74Jreax.js} +1 -1
- package/dist/client/assets/{LinkExternal01-DIMSPk19.js → LinkExternal01-D6xwQf32.js} +1 -1
- package/dist/client/assets/{List-BzhQuBp2.js → List-DJEz6yKj.js} +1 -1
- package/dist/client/assets/{Loading01-BSgMOGt8.js → Loading01-B3gOoSbd.js} +1 -1
- package/dist/client/assets/{Lock01-T7BR0zuk.js → Lock01-CodP_ius.js} +1 -1
- package/dist/client/assets/{Play-CBKoaI1n.js → Play-CxAaQi_l.js} +1 -1
- package/dist/client/assets/{Plus-kcfCg7FH.js → Plus-Bo0L9uYY.js} +1 -1
- package/dist/client/assets/{RefreshCcw01-DiAOUquJ.js → RefreshCcw01-v6pXwg6P.js} +1 -1
- package/dist/client/assets/{Save01-CgyWcG00.js → Save01-CU3VjXKO.js} +1 -1
- package/dist/client/assets/{SearchMd-DyDznS8C.js → SearchMd-Cpf31N-H.js} +1 -1
- package/dist/client/assets/{Settings01-B90Jx8ZC.js → Settings01-BmEB9pVn.js} +1 -1
- package/dist/client/assets/{Shield01-B2Y9HIu6.js → Shield01-CqrrEAw-.js} +1 -1
- package/dist/client/assets/{Terminal-BxQK5nsd.js → Terminal-BS-6VR5p.js} +1 -1
- package/dist/client/assets/{Trash01-Dhrt1Goe.js → Trash01-HuK-pEft.js} +1 -1
- package/dist/client/assets/{Upload01-Dja0ZgIT.js → Upload01-DcyyJb_e.js} +1 -1
- package/dist/client/assets/{Users03-DHATZiFL.js → Users03-CPWgVi4r.js} +1 -1
- package/dist/client/assets/{X-BpJJDPzv.js → X-uHaUni9w.js} +1 -1
- package/dist/client/assets/{XCircle-D52fnGO6.js → XCircle-C4iqiznn.js} +1 -1
- package/dist/client/assets/{XClose-DcdK3w1e.js → XClose-DGYV-4S5.js} +1 -1
- package/dist/client/assets/{Zap-CP5UH1Dw.js → Zap-5c_DBEtK.js} +1 -1
- package/dist/client/assets/{agent-connections-preview-v4ndb6aJ.js → agent-connections-preview-BsjSZYGn.js} +1 -1
- package/dist/client/assets/agent-detail-BxRuQLTH.js +2 -0
- package/dist/client/assets/agents-KBFzt520.js +1 -0
- package/dist/client/assets/{alert-dialog-PSmHhGOE.js → alert-dialog-D3oCqQtu.js} +2 -2
- package/dist/client/assets/{auth-catchall-CplMsxXE.js → auth-catchall-bz6gJ41s.js} +1 -1
- package/dist/client/assets/{avatar-VPsqzp0K.js → avatar-rYlL0ZoJ.js} +1 -1
- package/dist/client/assets/{badge-DSAomO1_.js → badge-CxJArm69.js} +1 -1
- package/dist/client/assets/{binder-8_Oel13A.js → binder-BXDCztlr.js} +1 -1
- package/dist/client/assets/{breadcrumb-Dxn3nF83.js → breadcrumb-CGrLS5HH.js} +1 -1
- package/dist/client/assets/{card-CRGkE-QK.js → card-CAORA3L1.js} +1 -1
- package/dist/client/assets/{chart-B-ayLZ8-.js → chart-DX1_yJHY.js} +1 -1
- package/dist/client/assets/{checkbox-Dj6Qb3KC.js → checkbox-BCSzUsPR.js} +1 -1
- package/dist/client/assets/{circle-alert-DcuI5GGM.js → circle-alert-B4C3d1aQ.js} +1 -1
- package/dist/client/assets/{collapsible-D2Mpu85K.js → collapsible-sQONDG4w.js} +1 -1
- package/dist/client/assets/{collection-detail-FNWcZVfu.js → collection-detail-B42SRwNb.js} +3 -3
- package/dist/client/assets/collection-display-button-M7dfC2Rf.js +1 -0
- package/dist/client/assets/{collection-search-FSS_Lkwz.js → collection-search-q4T1hb73.js} +1 -1
- package/dist/client/assets/collection-tab-e-VwhAzh.js +1 -0
- package/dist/client/assets/collection-table-wrapper-DXH0yXJC.js +1 -0
- package/dist/client/assets/{collection-tabs-CK4hfCPZ.js → collection-tabs-BbVq4J-5.js} +1 -1
- package/dist/client/assets/{command-BK3ZFocj.js → command-CPQN970u.js} +1 -1
- package/dist/client/assets/{connect-D2cFEIR8.js → connect-BGH3KdkD.js} +1 -1
- package/dist/client/assets/{connection-card-GLkE1rwd.js → connection-card-DTiOZbAC.js} +1 -1
- package/dist/client/assets/connection-detail-DznxU3SC.js +1 -0
- package/dist/client/assets/connections-AQfSUAp3.js +1 -0
- package/dist/client/assets/{constants-3MhIA0pZ.js → constants-D9bRXDQp.js} +1 -1
- package/dist/client/assets/constants-DvJZMaim.js +1 -0
- package/dist/client/assets/{create-organization-dialog-CR8t2T4R.js → create-organization-dialog-Bs4zbKG7.js} +1 -1
- package/dist/client/assets/{create-project-dialog-DFaC5_HT.js → create-project-dialog-BkL7vqeo.js} +1 -1
- package/dist/client/assets/{danger-BEh_Y1ce.js → danger-C_vn0auF.js} +1 -1
- package/dist/client/assets/{danger-zone-CpwKIZ0p.js → danger-zone-CdUOoCFt.js} +1 -1
- package/dist/client/assets/{decopilot-events-CA9aFPSQ.js → decopilot-events-DHSwekTa.js} +1 -1
- package/dist/client/assets/dependencies-DTmw6OGT.js +1 -0
- package/dist/client/assets/{dialog-CPWJMuHX.js → dialog-Baq_fjtR.js} +1 -1
- package/dist/client/assets/{dropdown-menu-DW1GDWfN.js → dropdown-menu-CSqO4Mxn.js} +1 -1
- package/dist/client/assets/dynamic-plugin-layout-d0KDA7MF.js +1 -0
- package/dist/client/assets/{editable-task-title-D4gyoQ4x.js → editable-task-title-HUenZvZX.js} +1 -1
- package/dist/client/assets/{empty-state-boxcABsi.js → empty-state-BPClkF2j.js} +1 -1
- package/dist/client/assets/{env-vars-editor-x5YLFI-P.js → env-vars-editor-DDp7f4JN.js} +1 -1
- package/dist/client/assets/{extract-connection-data-D40JrSD8.js → extract-connection-data-BkJeK0tX.js} +1 -1
- package/dist/client/assets/{file-browser-CrcClgQC.js → file-browser-DVzV35Ko.js} +2 -2
- package/dist/client/assets/{form-7Q-FsNtX.js → form-C5R0_qWR.js} +1 -1
- package/dist/client/assets/{general-C0buekt8.js → general-mBNwCpsS.js} +1 -1
- package/dist/client/assets/{grid-view-J96VhXfb.js → grid-view-7eQhfO8f.js} +1 -1
- package/dist/client/assets/{home-H46nCwT5.js → home-okrTp5Gh.js} +1 -1
- package/dist/client/assets/{icon-picker-DPVWLIZ3.js → icon-picker-DevrZ9IQ.js} +1 -1
- package/dist/client/assets/{index-CsXxowFD.js → index-B-STjJpH.js} +1 -1
- package/dist/client/assets/{index-ZgdunwGI.js → index-BK6i23a9.js} +1 -1
- package/dist/client/assets/{index-D7M37zt-.js → index-BWSvBz7o.js} +1 -1
- package/dist/client/assets/{index-3zbyfLqi.js → index-B_0vsVr1.js} +3 -3
- package/dist/client/assets/{index-DqzqEzLf.js → index-ByA6j7_H.js} +1 -1
- package/dist/client/assets/{index-DziKeC8s.js → index-CvEIDmnk.js} +1 -1
- package/dist/client/assets/index-D6E08wfB.css +1 -0
- package/dist/client/assets/index-DYY56DJY.js +1 -0
- package/dist/client/assets/{index-DZgOYNf-.js → index-QCmdl8uj.js} +1 -1
- package/dist/client/assets/{index-CW624IAb.js → index-UbeVlDrq.js} +1 -1
- package/dist/client/assets/{infiniteQueryObserver-DkOiuhUg.js → infiniteQueryObserver-DKiK82rX.js} +1 -1
- package/dist/client/assets/{input-DVv1wKLp.js → input-CW7SVowR.js} +1 -1
- package/dist/client/assets/{integration-icon-_0Y5dukY.js → integration-icon-DAFtApWT.js} +1 -1
- package/dist/client/assets/{label-CfzCa7Vm.js → label-DWU1nKSS.js} +1 -1
- package/dist/client/assets/{layout-DemCWqB_.js → layout-CzVwolFw.js} +1 -1
- package/dist/client/assets/{layout-CFi42XXk.js → layout-DEcRD72T.js} +1 -1
- package/dist/client/assets/{localstorage-keys-D2dx16dH.js → localstorage-keys-BAzeyS9J.js} +1 -1
- package/dist/client/assets/{login-BXUbt1kV.js → login-OPfY3bsF.js} +1 -1
- package/dist/client/assets/{markdown-89WWPNXO.js → markdown-DCSB9ejV.js} +1 -1
- package/dist/client/assets/{mcp-app-renderer-MJ3LmhBP.js → mcp-app-renderer-BtuEhdWL.js} +1 -1
- package/dist/client/assets/{mcp-oauth-CPAKRpWT.js → mcp-oauth-D8pA0WRM.js} +1 -1
- package/dist/client/assets/{mcp-server-card-gl2xF4cu.js → mcp-server-card-D7xlSyX7.js} +1 -1
- package/dist/client/assets/mcp-server-detail-DdKXdUu2.js +2 -0
- package/dist/client/assets/members-YKyOsCaT.js +3 -0
- package/dist/client/assets/{monaco-editor-Qwuf1rYM.js → monaco-editor-zyWgiZEt.js} +1 -1
- package/dist/client/assets/{monitoring-C-vcUHdF.js → monitoring-SM_c8qxT.js} +2 -2
- package/dist/client/assets/monitoring-dashboard-edit-cexdjvMw.js +1 -0
- package/dist/client/assets/{monitoring-dashboard-view-D7MwbzDH.js → monitoring-dashboard-view-C3qQNwfm.js} +1 -1
- package/dist/client/assets/{oauth-callback-BnBZDVD6.js → oauth-callback-1SC3hH5y.js} +1 -1
- package/dist/client/assets/page-DfTTOYQt.js +1 -0
- package/dist/client/assets/page-hoODnFtN.js +1 -0
- package/dist/client/assets/{plugin-empty-state-DfdPh9Ts.js → plugin-empty-state-Cl_h_OgT.js} +1 -1
- package/dist/client/assets/{plugin-empty-state-BuLjcm9B.js → plugin-empty-state-Doboc7Tq.js} +1 -1
- package/dist/client/assets/{plugin-header-CKLaOHoT.js → plugin-header-C4Dfehzm.js} +1 -1
- package/dist/client/assets/{plugin-header-Bi-8qclQ.js → plugin-header-DNeaPoeS.js} +1 -1
- package/dist/client/assets/plugins-H9eiCXso.js +1 -0
- package/dist/client/assets/popover-BNZ96bFv.js +1 -0
- package/dist/client/assets/project-app-view-Bsbq4Qf_.js +1 -0
- package/dist/client/assets/project-layout-B4cnkESa.js +1 -0
- package/dist/client/assets/{project-plugins-B1sb2cJf.js → project-plugins-CqDaIw1P.js} +1 -1
- package/dist/client/assets/{projects-list-D0DH8k1c.js → projects-list-CgsVuZof.js} +1 -1
- package/dist/client/assets/{readme-viewer-BvJA0DXw.js → readme-viewer-CKidIXa3.js} +1 -1
- package/dist/client/assets/{registry-layout-BJCo3ZwE.js → registry-layout-oUh5Zl7W.js} +2 -2
- package/dist/client/assets/{registry-utils-Cx5oa6Ne.js → registry-utils-DXJps8H7.js} +1 -1
- package/dist/client/assets/{reports-layout-DYTNa8h-.js → reports-layout-CFJRqv-Q.js} +2 -2
- package/dist/client/assets/{reset-password-DFzqJN6I.js → reset-password-ZQI9gTW6.js} +1 -1
- package/dist/client/assets/{resizable-PA9Y3YAt.js → resizable-CWRglWOX.js} +1 -1
- package/dist/client/assets/{save-actions-CXaB5WYr.js → save-actions-eGQZXGI3.js} +1 -1
- package/dist/client/assets/{scroll-area-DoXCMB9j.js → scroll-area-By1z4ZyY.js} +1 -1
- package/dist/client/assets/{select-DaTaxi5W.js → select-CYY4CENz.js} +1 -1
- package/dist/client/assets/shell-layout-DMKfJTmj.js +3 -0
- package/dist/client/assets/{sidebar-settings-BZwWXZuX.js → sidebar-settings-ILgspCqY.js} +1 -1
- package/dist/client/assets/{skeleton-C9OYLAME.js → skeleton-C4ZMp7sl.js} +1 -1
- package/dist/client/assets/{spinner-RGw-eBKN.js → spinner-oA3jiJW_.js} +1 -1
- package/dist/client/assets/{store-invite-Fvga4enp.js → store-invite-Bfy0Alsf.js} +1 -1
- package/dist/client/assets/{switch-CKTW0M5S.js → switch-BSc4dVNg.js} +1 -1
- package/dist/client/assets/{table-Dr33PlEJ.js → table-RFgqEt_E.js} +1 -1
- package/dist/client/assets/{tabs-t9dEapgX.js → tabs-BZ-xfLNG.js} +1 -1
- package/dist/client/assets/tasks-Cy-gkHRX.js +1 -0
- package/dist/client/assets/{tasks-panel-DLy55FSi.js → tasks-panel-C7RwVTDD.js} +1 -1
- package/dist/client/assets/{textarea-CNTbi5Nk.js → textarea-4HpXofT0.js} +1 -1
- package/dist/client/assets/{time-range-picker-Do8ix4-A.js → time-range-picker-Cx2A-Fs_.js} +1 -1
- package/dist/client/assets/{toggle-group-Ck1YCESf.js → toggle-group-CVFHcp8K.js} +1 -1
- package/dist/client/assets/tools-list-BYphEqhu.js +1 -0
- package/dist/client/assets/{tooltip-CzsT_Xmu.js → tooltip-Cz-bAWiO.js} +1 -1
- package/dist/client/assets/{topbar-portal-pZDSuDEC.js → topbar-portal-DOwsTUY4.js} +1 -1
- package/dist/client/assets/{types-BFBQ7LBo.js → types-B46wd5bS.js} +1 -1
- package/dist/client/assets/{use-binding-Cz4OU82g.js → use-binding-Dz1SRdBY.js} +1 -1
- package/dist/client/assets/use-collections-vccihohV.js +1 -0
- package/dist/client/assets/use-connection-DeEn4qfI.js +1 -0
- package/dist/client/assets/{use-copy-C0vtJ5Ye.js → use-copy-CykDvxn6.js} +1 -1
- package/dist/client/assets/{use-create-virtual-mcp-CsNENE7l.js → use-create-virtual-mcp-DB14T-Ft.js} +1 -1
- package/dist/client/assets/use-install-from-registry-BeHRHLDl.js +1 -0
- package/dist/client/assets/{use-list-state-DUq5hUJc.js → use-list-state-ykkfYLR3.js} +1 -1
- package/dist/client/assets/use-llm-B_iPCa-K.js +1 -0
- package/dist/client/assets/{use-mcp-resources-DjDOJ-nS.js → use-mcp-resources-Rqzq7A0J.js} +1 -1
- package/dist/client/assets/{use-mcp-tools-WZlm0cnW.js → use-mcp-tools-BXihKxpu.js} +1 -1
- package/dist/client/assets/{use-members-BLjJfltI.js → use-members-DAcqcxDX.js} +1 -1
- package/dist/client/assets/{use-mobile-CzcHKmhL.js → use-mobile-B2VAoWT2.js} +1 -1
- package/dist/client/assets/{use-project-CIyZUlkd.js → use-project-D96OXk4y.js} +1 -1
- package/dist/client/assets/{use-settings-modal-BU5fs4m_.js → use-settings-modal-CouKpdi3.js} +1 -1
- package/dist/client/assets/{use-view-mode-BadETRuZ.js → use-view-mode-DyK0fMBe.js} +1 -1
- package/dist/client/assets/use-virtual-mcp-OwU65kyR.js +1 -0
- package/dist/client/assets/useInfiniteQuery-Cl9EtkM0.js +1 -0
- package/dist/client/assets/{useMutation-CqJLXgOK.js → useMutation-lBFQDcxE.js} +1 -1
- package/dist/client/assets/useQuery-DcRkCB2j.js +1 -0
- package/dist/client/assets/useSuspenseInfiniteQuery-DdSDu-rZ.js +1 -0
- package/dist/client/assets/{user-vKqDbtP6.js → user-C73vNaiS.js} +1 -1
- package/dist/client/assets/workflow-S9BhswBs.js +1 -0
- package/dist/client/index.html +2 -2
- package/dist/server/cli.js +1 -1
- package/dist/server/migrate.js +1 -1
- package/dist/server/server.js +1 -1
- package/package.json +1 -1
- package/dist/client/assets/agent-detail-DyOlL9jH.js +0 -2
- package/dist/client/assets/agents-CB6IRof4.js +0 -1
- package/dist/client/assets/collection-tab-FKeWJS1r.js +0 -1
- package/dist/client/assets/collection-table-wrapper-C3jcR2VW.js +0 -1
- package/dist/client/assets/connection-detail-PegJ7rZR.js +0 -1
- package/dist/client/assets/connections-C18lG_Ow.js +0 -1
- package/dist/client/assets/constants-Csevqii0.js +0 -1
- package/dist/client/assets/dependencies-mwSdsJgD.js +0 -1
- package/dist/client/assets/dynamic-plugin-layout-CY4G5d8i.js +0 -1
- package/dist/client/assets/index-Cr3FYIgR.css +0 -1
- package/dist/client/assets/index-DFlYm7QG.js +0 -1
- package/dist/client/assets/mcp-server-detail-CzmUyYsJ.js +0 -2
- package/dist/client/assets/members-BjMeazP1.js +0 -3
- package/dist/client/assets/monitoring-dashboard-edit-DdMgOlQK.js +0 -1
- package/dist/client/assets/page-BNQcXJwH.js +0 -1
- package/dist/client/assets/page-DvC0ZQe5.js +0 -1
- package/dist/client/assets/plugins-cGh_gky2.js +0 -1
- package/dist/client/assets/popover-7xIJyxqf.js +0 -1
- package/dist/client/assets/project-app-view-C_PL72tZ.js +0 -1
- package/dist/client/assets/project-layout-DIwsntjO.js +0 -1
- package/dist/client/assets/shell-layout-BqF7J7La.js +0 -3
- package/dist/client/assets/tasks-OJAbxkK1.js +0 -1
- package/dist/client/assets/tools-list-DLfR0anP.js +0 -1
- package/dist/client/assets/use-connection-Dlr-wAwU.js +0 -1
- package/dist/client/assets/use-install-from-registry-C_roXw8y.js +0 -1
- package/dist/client/assets/use-llm-B6AzV9Iw.js +0 -1
- package/dist/client/assets/use-virtual-mcp-BjGr5L6n.js +0 -1
- package/dist/client/assets/useInfiniteQuery-CGGEgi5q.js +0 -1
- package/dist/client/assets/useQuery-DWLTdDjg.js +0 -1
- package/dist/client/assets/useSuspenseInfiniteQuery-YGfVGowO.js +0 -1
- package/dist/client/assets/workflow--wyybZpA.js +0 -1
package/dist/server/cli.js
CHANGED
|
@@ -1298,7 +1298,7 @@ Hint: Configure a valid Google account email in Monitor Configuration > Contexto
|
|
|
1298
1298
|
|
|
1299
1299
|
`).trim(),B=F.length>0?`Not executed tools (${F.length}/${Y.tools.length}): ${F.join(", ")}`:"",U=[V,B].filter((z)=>z.length>0).join(`
|
|
1300
1300
|
|
|
1301
|
-
`);return{toolResults:H,agentSummary:U.length>0?U:null,unexecutedTools:F}}finally{await Q.close?.().catch(()=>{})}}async function $z1(Y,Q){let X=v4(),J=Y.organization.id,G=await X.monitorConnections.findByItemId(J,Q.id);if(G){if(await Y.storage.connections.findById(G.connection_id,J))return G.connection_id}let K=jb6(Q);if(!K)throw Error(`Registry item ${Q.id} has no remote URL`);let W=Rb6(Y),Z=Ib6(Q),H=await Y.storage.connections.create({organization_id:J,created_by:W,title:`[Monitor] ${Q.title}`,description:`Auto-created monitor connection for ${Q.id}`,app_name:"private-registry-monitor",app_id:`${dH}:monitor`,connection_type:Z,connection_url:K,metadata:{monitorConnection:!0,registryItemId:Q.id,pluginId:dH}});return await X.monitorConnections.upsert({organization_id:J,item_id:Q.id,connection_id:H.id,auth_status:"none"}),H.id}async function gb6(Y){let Q=v4();switch(Y.action){case"unlisted":return await Q.items.update(Y.organizationId,Y.item.id,{is_unlisted:!0}),"unlisted";case"remove_public":return await Q.items.update(Y.organizationId,Y.item.id,{is_public:!1}),"removed_public";case"remove_private":case"remove_all":return await Q.items.delete(Y.organizationId,Y.item.id),Y.action==="remove_all"?"removed_all":"removed_private";default:return"none"}}async function ub6(Y){let Q=Date.now();if(Y.signal.aborted)throw Error("Run cancelled");let X="passed",J=!1,G=!1,K=null,W="none",Z=null,H=[],$=null,F=async()=>{await Y.onProgress?.({status:X,connectionOk:J,toolsListed:G,toolResults:[...H],agentSummary:Z,errorMessage:K,actionTaken:W,durationMs:Date.now()-Q})};try{let V=await $z1(Y.ctx,Y.item);$=await Y.ctx.createMCPProxy(V),J=!0;let U=(await kk($.listTools?$.listTools():Promise.resolve({tools:[]}),Y.monitorConfig.perMcpTimeoutMs,`listTools ${Y.item.id}`)).tools??[];if(G=!0,Y.monitorConfig.monitorMode!=="health_check")H.push(...U.map((z)=>Hz1(z.name))),await F();if(Y.monitorConfig.monitorMode==="full_agent"){let z=await xb6({ctx:Y.ctx,monitorConfig:Y.monitorConfig,item:Y.item,proxy:$,tools:U,signal:Y.signal,onProgress:async(D)=>{H.length=0,H.push(...Xg0({discoveredTools:U,executedResults:D})),X=D.some((L)=>!L.success)?"failed":"passed",await F()}});if(H.length=0,H.push(...Xg0({discoveredTools:U,executedResults:z.toolResults})),Z=z.agentSummary,z.toolResults.some((D)=>!D.success))X="failed";if(z.unexecutedTools.length>0){if(X="failed",!K)K=`Agent skipped ${z.unexecutedTools.length} tool(s): ${z.unexecutedTools.join(", ")}`}}else if(Y.monitorConfig.monitorMode!=="health_check"){for(let z=0;z<U.length;z++){let D=U[z];if(!D||Y.signal.aborted)throw Error("Run cancelled");let L=Date.now();try{let w={},E=await kk($.callTool({name:D.name,arguments:w}),Y.monitorConfig.perToolTimeoutMs,`tool ${D.name}`),T=!E.isError,C=Date.now()-L;Jg0(H,{toolName:D.name,success:T,input:w,durationMs:C,outputPreview:$g0(E.structuredContent??E.content),error:T?null:Ua(E.content?.find((P)=>P.type==="text")?.text?.slice(0,300)??"Tool returned error")}),await F()}catch(w){let E=Date.now()-L,T=w instanceof Error?w.message:String(w);Jg0(H,{toolName:D.name,success:!1,durationMs:E,error:Ua(T)}),await F()}}if(H.some((z)=>!z.success))X="failed"}else for(let z of U)H.push(Hz1(z.name));if(Y.canApplyFailureAction&&X==="failed"&&Y.monitorConfig.onFailure!=="none")W=await gb6({organizationId:Y.organizationId,item:Y.item,action:Y.monitorConfig.onFailure})}catch(V){if(K=V instanceof Error?V.message:String(V),Sb6(V))X="needs_auth",await v4().monitorConnections.updateAuthStatus(Y.organizationId,Y.item.id,"needs_auth");else X="error"}finally{await $?.close?.().catch(()=>{})}return{status:X,connectionOk:J,toolsListed:G,toolResults:H,agentSummary:Z,errorMessage:K,actionTaken:W,durationMs:Date.now()-Q}}async function mb6(Y){let Q=Date.now(),X=v4(),G=(await X.items.list(Y.organizationId,{includeUnlisted:!0})).items.filter((B)=>{if(Y.monitorConfig.testPublicOnly&&!B.is_public)return!1;if(Y.monitorConfig.testPrivateOnly&&B.is_public)return!1;return!0}),K=Y.monitorConfig.includePendingRequests?(await X.publishRequests.list(Y.organizationId,{status:"pending",limit:500})).items.map((B)=>lb6(B)):[],W=[...G.map((B)=>({item:B,source:"registry_item"})),...K.map((B)=>({item:B,source:"publish_request"}))];if(W.length===0){await X.monitorRuns.update(Y.organizationId,Y.runId,{total_items:0,status:"completed",started_at:new Date().toISOString(),finished_at:new Date().toISOString()}),await qa({ctx:Y.ctx,type:"registry.monitor.completed",subject:Y.runId,data:{runId:Y.runId,total:0}});return}await X.monitorRuns.update(Y.organizationId,Y.runId,{total_items:W.length,status:"running",started_at:new Date().toISOString()});let Z=0,H=0,$=0,F=0;for(let B=0;B<W.length;B++){let U=W[B],z=U?.item;if(!z||Y.signal.aborted){await X.monitorRuns.update(Y.organizationId,Y.runId,{status:"cancelled",current_item_id:null,finished_at:new Date().toISOString()});return}await X.monitorRuns.update(Y.organizationId,Y.runId,{current_item_id:z.id});let D=null,L=async(E)=>{if(!D){D=(await X.monitorResults.create({run_id:Y.runId,organization_id:Y.organizationId,item_id:z.id,item_title:z.title,status:E.status,error_message:E.errorMessage,connection_ok:E.connectionOk,tools_listed:E.toolsListed,tool_results:E.toolResults,agent_summary:E.agentSummary,duration_ms:E.durationMs,action_taken:E.actionTaken})).id;return}await X.monitorResults.update(Y.organizationId,D,{status:E.status,error_message:E.errorMessage,connection_ok:E.connectionOk,tools_listed:E.toolsListed,tool_results:E.toolResults,agent_summary:E.agentSummary,duration_ms:E.durationMs,action_taken:E.actionTaken})},w=await ub6({ctx:Y.ctx,organizationId:Y.organizationId,item:z,monitorConfig:Y.monitorConfig,signal:Y.signal,canApplyFailureAction:U.source==="registry_item",onProgress:L});if(await L({status:w.status,connectionOk:w.connectionOk,toolsListed:w.toolsListed,toolResults:w.toolResults,agentSummary:w.agentSummary,errorMessage:w.errorMessage,actionTaken:w.actionTaken,durationMs:w.durationMs}),Z+=1,w.status==="passed")H+=1;else if(w.status==="failed"||w.status==="error")$+=1;else F+=1;if(await X.monitorRuns.update(Y.organizationId,Y.runId,{tested_items:Z,passed_items:H,failed_items:$,skipped_items:F}),w.status==="failed"||w.status==="error")await qa({ctx:Y.ctx,type:"registry.monitor.item_failed",subject:z.id,data:{runId:Y.runId,itemId:z.id,itemTitle:z.title,status:w.status,errorMessage:w.errorMessage,actionTaken:w.actionTaken}})}let V=Date.now()-Q;await X.monitorRuns.update(Y.organizationId,Y.runId,{status:"completed",current_item_id:null,finished_at:new Date().toISOString()}),await qa({ctx:Y.ctx,type:"registry.monitor.completed",subject:Y.runId,data:{runId:Y.runId,total:Z,passed:H,failed:$,skipped:F,durationMs:V}})}function lb6(Y){return{id:`${tq}${Y.id}`,title:Y.title,description:Y.description,_meta:Y._meta,server:Y.server,is_public:!1,is_unlisted:!0,created_at:Y.created_at,updated_at:Y.updated_at}}async function db6(Y,Q){let X=Hg0(Y);await X.access.check();let J=v4(),G=await J.monitorRuns.create({organization_id:X.organization.id,status:"pending",config_snapshot:Q,started_at:null}),K=new AbortController;return Ba.set(G.id,K),mb6({ctx:X,runId:G.id,organizationId:X.organization.id,monitorConfig:Q,signal:K.signal}).catch(async(W)=>{await J.monitorRuns.update(X.organization.id,G.id,{status:"failed",current_item_id:null,finished_at:new Date().toISOString()}).catch(()=>{}),await qa({ctx:X,type:"registry.monitor.failed",subject:G.id,data:{runId:G.id,error:W instanceof Error?W.message:String(W)}}),Cb6(`Run ${G.id} failed with uncaught error:`,W)}).finally(()=>{Ba.delete(G.id)}),{run:{id:G.id}}}var Ba,Zg0="[MONITOR-AGENT]",Pb6,Eb6="health_check: not called",qg0;var za=S(()=>{QY();tZ();uD();_W();Z9();Ba=new Map,Pb6=xS0;qg0={name:"REGISTRY_MONITOR_RUN_START",description:"Start an MCP registry monitor run with an isolated set of monitor connections.",inputSchema:cx0,outputSchema:nx0,handler:async(Y,Q)=>{let J=Fa(Y.config??{}),{run:G}=await db6(Q,J),W=await v4().monitorRuns.findById(Hg0(Q).organization.id,G.id);if(!W)throw Error(`Failed to load monitor run ${G.id}`);return{run:W}}}});var Bg0;var Ug0=S(()=>{_W();Z9();Bg0={name:"REGISTRY_MONITOR_RUN_LIST",description:"List MCP registry monitor runs",inputSchema:Yz1,outputSchema:ax0,handler:Z6(Yz1,async(Y,Q)=>{return v4().monitorRuns.list(Q.organization.id,Y)})}});var zg0;var Dg0=S(()=>{_W();Z9();zg0={name:"REGISTRY_MONITOR_RUN_GET",description:"Get details for one MCP registry monitor run",inputSchema:Qz1,outputSchema:rx0,handler:Z6(Qz1,async(Y,Q)=>{return{run:await v4().monitorRuns.findById(Q.organization.id,Y.runId)}})}});var Og0;var Ng0=S(()=>{_W();za();Z9();Og0={name:"REGISTRY_MONITOR_RUN_CANCEL",description:"Cancel a running MCP registry monitor run",inputSchema:eU1,outputSchema:ix0,handler:Z6(eU1,async(Y,Q)=>{return Kg0(Y.runId),{run:await v4().monitorRuns.update(Q.organization.id,Y.runId,{status:"cancelled",current_item_id:null,finished_at:new Date().toISOString()})}})}});var Lg0;var Mg0=S(()=>{_W();Z9();Lg0={name:"REGISTRY_MONITOR_RESULT_LIST",description:"List results for a given MCP registry monitor run",inputSchema:Xz1,outputSchema:ox0,handler:Z6(Xz1,async(Y,Q)=>{return v4().monitorResults.listByRun(Q.organization.id,Y.runId,{status:Y.status,limit:Y.limit,offset:Y.offset})})}});var wg0;var Ag0=S(()=>{_W();Z9();uD();wg0={name:"REGISTRY_MONITOR_CONNECTION_LIST",description:"List monitor connection mappings for private registry MCP monitor runs, including auth status",inputSchema:Jz1,outputSchema:sx0,handler:Z6(Jz1,async(Y,Q)=>{let X=v4(),J=await X.monitorConnections.list(Q.organization.id);return{items:await Promise.all(J.map(async(K)=>{let W=await X.items.findById(Q.organization.id,K.item_id);if(!W&&K.item_id.startsWith(tq)){let $=K.item_id.slice(tq.length),F=await X.publishRequests.findById(Q.organization.id,$);if(F)W={id:K.item_id,title:F.title,description:F.description,_meta:F._meta,server:F.server,is_public:!1,is_unlisted:!0,created_at:F.created_at,updated_at:F.updated_at}}let Z=W?.server.remotes?.find(($)=>$.url)?.url??null,H=K.item_id.startsWith(tq)?"request":"store";return{mapping:K,item:W,remoteUrl:Z,source:H}}))}})}});function pb6(Y){return{id:`${tq}${Y.id}`,title:Y.title,description:Y.description,_meta:Y._meta,server:Y.server,is_public:!1,is_unlisted:!0,created_at:Y.created_at,updated_at:Y.updated_at}}var Pg0;var Eg0=S(()=>{_W();za();Z9();uD();Pg0={name:"REGISTRY_MONITOR_CONNECTION_SYNC",description:"Ensure every registry item has a dedicated monitor connection mapping for MCP monitors",inputSchema:Gz1,outputSchema:tx0,handler:Z6(Gz1,async(Y,Q)=>{let X=v4(),J=(await X.items.list(Q.organization.id,{includeUnlisted:!0})).items,K=(await X.publishRequests.list(Q.organization.id,{status:"pending",limit:500})).items.map(pb6),W=[...J,...K],Z=await X.monitorConnections.list(Q.organization.id),H=new Set(Z.map((F)=>F.item_id)),$=0;for(let F of W){if(!F.server.remotes?.some((V)=>V.url))continue;if(await $z1(Q,F),!H.has(F.id))$+=1}return{created:$,updated:Math.max(W.length-$,0)}})}});var Tg0;var Cg0=S(()=>{_W();Z9();Tg0={name:"REGISTRY_MONITOR_CONNECTION_UPDATE_AUTH",description:"Update the auth_status of a monitor connection mapping (by core connection ID)",inputSchema:Wz1,outputSchema:ex0,handler:Z6(Wz1,async({connectionId:Y,authStatus:Q},X)=>{let J=v4(),G=X.organization.id,K=await J.monitorConnections.findByConnectionId(G,Y);if(!K)throw Error(`No monitor connection mapping found for connection ${Y}`);return await J.monitorConnections.updateAuthStatus(G,K.item_id,Q),{success:!0}})}});function vk(Y){if(!Y||typeof Y!=="object")return null;let Q=Y,X=Q.id;if(typeof X==="string"&&X.length>0)return X;for(let J of["event","result","structuredContent","content"]){let G=Q[J],K=vk(G);if(K)return K}if(Array.isArray(Y))for(let J of Y){let G=vk(J);if(G)return G}return null}var Rg0;var Ig0=S(()=>{QY();_W();Z9();Rg0={name:"REGISTRY_MONITOR_SCHEDULE_SET",description:"Schedule recurring MCP monitor runs via EVENT_PUBLISH cron",inputSchema:Zz1,outputSchema:Yg0,handler:Z6(Zz1,async(Y,Q)=>{let X=IY.SELF(Q.organization.id),J=await Q.createMCPProxy(X);try{let G=await J.callTool({name:"EVENT_PUBLISH",arguments:{type:"registry.monitor.scheduled",subject:"private-registry",cron:Y.cronExpression,data:{config:Y.config??{}}}});if(G.isError)throw Error("Failed to create monitor schedule via EVENT_PUBLISH");let K=vk(G.structuredContent)??vk(G.content)??vk(G);if(!K)throw Error("Could not resolve schedule event id from EVENT_PUBLISH");return{scheduleEventId:K}}finally{await J.close?.().catch(()=>{})}})}});var jg0;var Sg0=S(()=>{QY();_W();Z9();jg0={name:"REGISTRY_MONITOR_SCHEDULE_CANCEL",description:"Cancel a recurring MCP monitor schedule via EVENT_CANCEL",inputSchema:Kz1,outputSchema:Qg0,handler:Z6(Kz1,async(Y,Q)=>{let X=IY.SELF(Q.organization.id),J=await Q.createMCPProxy(X);try{if((await J.callTool({name:"EVENT_CANCEL",arguments:{eventId:Y.scheduleEventId}})).isError)throw Error("Failed to cancel monitor schedule via EVENT_CANCEL");return{success:!0}}finally{await J.close?.().catch(()=>{})}})}});function cb6(Y,Q){if(!Q)return Y;let X={field:["is_public"],operator:"eq",value:!1};if(!Y)return X;return{operator:"and",conditions:[Y,X]}}function nb6(Y){let Q=new Map,X=new Map;for(let G of Y){let K=G._meta?.["mcp.mesh"];for(let W of K?.tags??[])Q.set(W,(Q.get(W)??0)+1);for(let W of K?.categories??[])X.set(W,(X.get(W)??0)+1)}let J=(G)=>Array.from(G.entries()).map(([K,W])=>({value:K,count:W})).sort((K,W)=>K.value.localeCompare(W.value));return{tags:J(Q),categories:J(X)}}var kg0,vg0,_g0,yg0;var fg0=S(()=>{l1();cY();Z9();kg0={name:"COLLECTION_REGISTRY_APP_LIST",description:"List registry items for Store discovery. Supports private-only mode from plugin settings.",inputSchema:eq,outputSchema:jA,handler:Z6(eq,async(Y,Q)=>{let X=v4(),J=await $k(Q,Q.organization.id);return X.items.list(Q.organization.id,{...Y,where:cb6(Y.where,J.storePrivateOnly===!0)})})},vg0={name:"COLLECTION_REGISTRY_APP_GET",description:"Get a registry item for Store details. Respects private-only mode from plugin settings.",inputSchema:AG,outputSchema:cD,handler:Z6(AG,async(Y,Q)=>{let X=v4(),J=await $k(Q,Q.organization.id),G=Y.id??Y.name;if(!G)return{item:null};let K=await X.items.findByIdOrName(Q.organization.id,G);if(!K)return{item:null};if(J.storePrivateOnly&&K.is_public)return{item:null};return{item:K}})},_g0={name:"COLLECTION_REGISTRY_APP_VERSIONS",description:"Get registry item versions for Store details. Respects private-only mode from plugin settings.",inputSchema:AG,outputSchema:q.object({versions:q.array(pZ)}),handler:Z6(AG,async(Y,Q)=>{let X=v4(),J=await $k(Q,Q.organization.id),G=Y.id??Y.name;if(!G)return{versions:[]};let K=await X.items.findByIdOrName(Q.organization.id,G);if(!K)return{versions:[]};if(J.storePrivateOnly&&K.is_public)return{versions:[]};return{versions:[K]}})},yg0={name:"COLLECTION_REGISTRY_APP_FILTERS",description:"List Store filter facets for registry items. Respects private-only mode from plugin settings.",inputSchema:q.object({}),outputSchema:SA,handler:Z6(q.object({}),async(Y,Q)=>{let X=v4();if(!(await $k(Q,Q.organization.id)).storePrivateOnly)return X.items.getFilters(Q.organization.id);let G=await X.items.list(Q.organization.id,{limit:1e4,where:{field:["is_public"],operator:"eq",value:!1}});return nb6(G.items)})}});var bg0;var hg0=S(()=>{Iv0();Sv0();vv0();yv0();k_0();__0();f_0();h_0();g_0();m_0();d_0();c_0();i_0();r_0();s_0();e_0();Qy0();Jy0();za();Ug0();Dg0();Ng0();Mg0();Ag0();Eg0();Cg0();Ig0();Sg0();fg0();bg0=[kg0,vg0,_g0,yg0,b_0,x_0,y_0,l_0,kv0,Rv0,u_0,_v0,v_0,S_0,jv0,p_0,n_0,a_0,o_0,t_0,Yy0,Xy0,qg0,Bg0,zg0,Og0,Lg0,wg0,Pg0,Tg0,Rg0,jg0]});var xg0;var gg0=S(()=>{uD();Yk0();Lv0();Cv0();hg0();_W();xg0={id:dH,description:hS0,tools:bg0,migrations:eS0,publicRoutes:(Y,Q)=>{LB1(Y,Q),DB1(Y,Q)},createStorage:Tv0,onEvents:{types:["registry.monitor.scheduled"],handler:async(Y,Q)=>{let X=await Q.createMCPProxy(Q.connectionId);try{for(let J of Y){if(J.type!=="registry.monitor.scheduled")continue;let G=J.data&&typeof J.data==="object"?J.data:{},K=G.config&&typeof G.config==="object"?G.config:{},W=Fa(K);await X.callTool({name:"REGISTRY_MONITOR_RUN_START",arguments:{config:W}})}}finally{await X.close()}}}}});var Da="user-sandbox",ug0="Create embeddable integration flows for platform end-users";import{sql as _k}from"kysely";var mg0;var lg0=S(()=>{mg0={name:"001-user-sandbox",async up(Y){await Y.schema.createTable("user_sandbox").addColumn("id","text",(Q)=>Q.primaryKey()).addColumn("organization_id","text",(Q)=>Q.notNull().references("organization.id").onDelete("cascade")).addColumn("title","text",(Q)=>Q.notNull()).addColumn("description","text").addColumn("icon","text").addColumn("required_apps","text",(Q)=>Q.notNull()).addColumn("redirect_url","text").addColumn("webhook_url","text").addColumn("event_type","text",(Q)=>Q.notNull().defaultTo("integration.completed")).addColumn("agent_title_template","text",(Q)=>Q.notNull().defaultTo("Agent for {{externalUserId}}")).addColumn("agent_instructions","text").addColumn("tool_selection_mode","text",(Q)=>Q.notNull().defaultTo("inclusion")).addColumn("status","text",(Q)=>Q.notNull().defaultTo("active")).addColumn("created_at","text",(Q)=>Q.notNull().defaultTo(_k`CURRENT_TIMESTAMP`)).addColumn("updated_at","text",(Q)=>Q.notNull().defaultTo(_k`CURRENT_TIMESTAMP`)).addColumn("created_by","text",(Q)=>Q.references("user.id").onDelete("set null")).execute(),await Y.schema.createIndex("idx_user_sandbox_org").on("user_sandbox").column("organization_id").execute(),await Y.schema.createTable("user_sandbox_sessions").addColumn("id","text",(Q)=>Q.primaryKey()).addColumn("template_id","text",(Q)=>Q.notNull().references("user_sandbox.id").onDelete("cascade")).addColumn("organization_id","text",(Q)=>Q.notNull().references("organization.id").onDelete("cascade")).addColumn("external_user_id","text",(Q)=>Q.notNull()).addColumn("status","text",(Q)=>Q.notNull().defaultTo("pending")).addColumn("app_statuses","text",(Q)=>Q.notNull().defaultTo("{}")).addColumn("created_agent_id","text",(Q)=>Q.references("connections.id").onDelete("set null")).addColumn("redirect_url","text").addColumn("created_at","text",(Q)=>Q.notNull().defaultTo(_k`CURRENT_TIMESTAMP`)).addColumn("updated_at","text",(Q)=>Q.notNull().defaultTo(_k`CURRENT_TIMESTAMP`)).addColumn("expires_at","text",(Q)=>Q.notNull()).execute(),await Y.schema.createIndex("idx_user_sandbox_sessions_template").on("user_sandbox_sessions").column("template_id").execute(),await Y.schema.createIndex("idx_user_sandbox_sessions_external_user").on("user_sandbox_sessions").columns(["template_id","external_user_id"]).execute(),await Y.schema.createIndex("idx_user_sandbox_sessions_org").on("user_sandbox_sessions").column("organization_id").execute(),await Y.schema.createTable("user_sandbox_agents").addColumn("id","text",(Q)=>Q.primaryKey()).addColumn("user_sandbox_id","text",(Q)=>Q.notNull().references("user_sandbox.id").onDelete("cascade")).addColumn("external_user_id","text",(Q)=>Q.notNull()).addColumn("connection_id","text",(Q)=>Q.notNull().references("connections.id").onDelete("cascade")).addColumn("created_at","text",(Q)=>Q.notNull().defaultTo(_k`CURRENT_TIMESTAMP`)).execute(),await Y.schema.createIndex("idx_user_sandbox_agents_unique").on("user_sandbox_agents").columns(["user_sandbox_id","external_user_id"]).unique().execute(),await Y.schema.createIndex("idx_user_sandbox_agents_connection").on("user_sandbox_agents").column("connection_id").execute()},async down(Y){await Y.schema.dropIndex("idx_user_sandbox_agents_connection").ifExists().execute(),await Y.schema.dropIndex("idx_user_sandbox_agents_unique").ifExists().execute(),await Y.schema.dropIndex("idx_user_sandbox_sessions_org").ifExists().execute(),await Y.schema.dropIndex("idx_user_sandbox_sessions_external_user").ifExists().execute(),await Y.schema.dropIndex("idx_user_sandbox_sessions_template").ifExists().execute(),await Y.schema.dropIndex("idx_user_sandbox_org").ifExists().execute(),await Y.schema.dropTable("user_sandbox_agents").ifExists().execute(),await Y.schema.dropTable("user_sandbox_sessions").ifExists().execute(),await Y.schema.dropTable("user_sandbox").ifExists().execute()}}});var dg0;var pg0=S(()=>{lg0();dg0=[mg0]});function Oa(Y){let Q=Date.now().toString(36),X=crypto.randomUUID().replace(/-/g,"").substring(0,8);return`${Y}_${Q}${X}`}class yk{db;constructor(Y){this.db=Y}async create(Y){let Q=Oa("usb"),X=new Date().toISOString(),J={id:Q,organization_id:Y.organization_id,title:Y.title,description:Y.description??null,icon:Y.icon??null,required_apps:JSON.stringify(Y.required_apps),redirect_url:Y.redirect_url??null,webhook_url:Y.webhook_url??null,event_type:Y.event_type??"integration.completed",agent_title_template:Y.agent_title_template??"{{externalUserId}}'s Agent",agent_instructions:Y.agent_instructions??null,tool_selection_mode:Y.tool_selection_mode??"inclusion",status:"active",created_at:X,updated_at:X,created_by:Y.created_by??null};await this.db.insertInto("user_sandbox").values(J).execute();let G=await this.findById(Q);if(!G)throw Error(`Failed to create user sandbox with id: ${Q}`);return G}async findById(Y){let Q=await this.db.selectFrom("user_sandbox").selectAll().where("id","=",Y).executeTakeFirst();if(!Q)return null;return this.deserialize(Q)}async list(Y){return(await this.db.selectFrom("user_sandbox").selectAll().where("organization_id","=",Y).orderBy("created_at","desc").execute()).map((X)=>this.deserialize(X))}async update(Y,Q){let J={updated_at:new Date().toISOString()};if(Q.title!==void 0)J.title=Q.title;if(Q.description!==void 0)J.description=Q.description;if(Q.icon!==void 0)J.icon=Q.icon;if(Q.required_apps!==void 0)J.required_apps=JSON.stringify(Q.required_apps);if(Q.redirect_url!==void 0)J.redirect_url=Q.redirect_url;if(Q.webhook_url!==void 0)J.webhook_url=Q.webhook_url;if(Q.event_type!==void 0)J.event_type=Q.event_type;if(Q.agent_title_template!==void 0)J.agent_title_template=Q.agent_title_template;if(Q.agent_instructions!==void 0)J.agent_instructions=Q.agent_instructions;if(Q.tool_selection_mode!==void 0)J.tool_selection_mode=Q.tool_selection_mode;if(Q.status!==void 0)J.status=Q.status;await this.db.updateTable("user_sandbox").set(J).where("id","=",Y).execute();let G=await this.findById(Y);if(!G)throw Error(`Template not found after update: ${Y}`);return G}async delete(Y){await this.db.deleteFrom("user_sandbox").where("id","=",Y).execute()}deserialize(Y){let Q=[];try{Q=JSON.parse(Y.required_apps)}catch{Q=[]}return{id:Y.id,organization_id:Y.organization_id,title:Y.title,description:Y.description,icon:Y.icon,required_apps:Q,redirect_url:Y.redirect_url,webhook_url:Y.webhook_url,event_type:Y.event_type,agent_title_template:Y.agent_title_template,agent_instructions:Y.agent_instructions,tool_selection_mode:Y.tool_selection_mode,status:Y.status,created_at:Y.created_at,updated_at:Y.updated_at,created_by:Y.created_by}}}var Fz1=()=>{};class fk{db;constructor(Y){this.db=Y}async create(Y){let Q=Oa("sandbox_session"),X=new Date().toISOString(),J={id:Q,template_id:Y.template_id,organization_id:Y.organization_id,external_user_id:Y.external_user_id,status:"pending",app_statuses:"{}",created_agent_id:Y.created_agent_id??null,redirect_url:Y.redirect_url??null,created_at:X,updated_at:X,expires_at:Y.expires_at};await this.db.insertInto("user_sandbox_sessions").values(J).execute();let G=await this.findById(Q);if(!G)throw Error(`Failed to create session with id: ${Q}`);return G}async findById(Y){let Q=await this.db.selectFrom("user_sandbox_sessions").selectAll().where("id","=",Y).executeTakeFirst();if(!Q)return null;return this.deserialize(Q)}async findExisting(Y,Q){let X=new Date().toISOString(),J=await this.db.selectFrom("user_sandbox_sessions").selectAll().where("template_id","=",Y).where("external_user_id","=",Q).where("expires_at",">",X).where("status","!=","completed").orderBy("created_at","desc").executeTakeFirst();if(!J)return null;return this.deserialize(J)}async listByTemplate(Y){return(await this.db.selectFrom("user_sandbox_sessions").selectAll().where("template_id","=",Y).orderBy("created_at","desc").execute()).map((X)=>this.deserialize(X))}async listByOrganization(Y){return(await this.db.selectFrom("user_sandbox_sessions").selectAll().where("organization_id","=",Y).orderBy("created_at","desc").execute()).map((X)=>this.deserialize(X))}async update(Y,Q){let J={updated_at:new Date().toISOString()};if(Q.status!==void 0)J.status=Q.status;if(Q.app_statuses!==void 0)J.app_statuses=JSON.stringify(Q.app_statuses);if(Q.created_agent_id!==void 0)J.created_agent_id=Q.created_agent_id;await this.db.updateTable("user_sandbox_sessions").set(J).where("id","=",Y).execute();let G=await this.findById(Y);if(!G)throw Error(`Session not found after update: ${Y}`);return G}async delete(Y){await this.db.deleteFrom("user_sandbox_sessions").where("id","=",Y).execute()}async deleteExpired(){let Y=new Date().toISOString(),Q=await this.db.deleteFrom("user_sandbox_sessions").where("expires_at","<",Y).where("status","!=","completed").executeTakeFirst();return Number(Q.numDeletedRows??0)}async deleteByExternalUserId(Y,Q){let X=await this.db.deleteFrom("user_sandbox_sessions").where("organization_id","=",Y).where("external_user_id","=",Q).executeTakeFirst();return Number(X.numDeletedRows??0)}deserialize(Y){let Q={};try{Q=JSON.parse(Y.app_statuses)}catch{Q={}}return{id:Y.id,template_id:Y.template_id,organization_id:Y.organization_id,external_user_id:Y.external_user_id,status:Y.status,app_statuses:Q,created_agent_id:Y.created_agent_id,redirect_url:Y.redirect_url,created_at:Y.created_at,updated_at:Y.updated_at,expires_at:Y.expires_at}}}var Vz1=()=>{};function bk(Y){qz1=Y}function bJ(){if(!qz1)throw Error(`Plugin storage not initialized. Make sure the "${Da}" plugin is enabled.`);return qz1}function Bz1(){return process.env.BASE_URL||"http://localhost:3000"}var qz1=null;var eZ=()=>{};function cg0(Y){let Q=Y.db,X={templates:new yk(Q),sessions:new fk(Q)};return bk(X),X}var ng0=S(()=>{Fz1();Vz1();eZ()});var ib6,ab6,rb6,ob6,sb6,ZB,tb6,ig0,ag0,rg0,og0,sg0,tg0,eg0,Yu0,Qu0,Xu0,Ju0,eb6,Gu0,Wu0,Zu0;var tH=S(()=>{l1();ib6=q.object({authorizationEndpoint:q.string().describe("OAuth authorization endpoint URL"),tokenEndpoint:q.string().describe("OAuth token endpoint URL"),clientId:q.string().describe("OAuth client ID"),scopes:q.array(q.string()).describe("OAuth scopes to request"),grantType:q.enum(["authorization_code","client_credentials"]).describe("OAuth grant type")}),ab6=q.object({headers:q.record(q.string(),q.string()).optional().describe("HTTP headers")}),rb6=q.object({command:q.string().describe("Command to run"),args:q.array(q.string()).optional().describe("Command arguments"),cwd:q.string().optional().describe("Working directory"),envVars:q.record(q.string(),q.string()).optional().describe("Environment variables")}),ob6=q.object({app_name:q.string().describe("App name from registry (e.g., '@deco/gmail')"),title:q.string().describe("Display title for the app"),description:q.string().nullable().optional().describe("App description"),icon:q.string().nullable().optional().describe("Icon URL"),connection_type:q.enum(["HTTP","SSE","Websocket","STDIO"]).describe("Connection type"),connection_url:q.string().nullable().optional().describe("MCP server URL"),connection_headers:q.union([ab6,rb6]).nullable().optional().describe("Connection parameters"),oauth_config:ib6.nullable().optional().describe("OAuth configuration if required"),selected_tools:q.array(q.string()).nullable().optional().describe("Selected tools to expose (null = all)"),selected_resources:q.array(q.string()).nullable().optional().describe("Selected resources to expose (null = all)"),selected_prompts:q.array(q.string()).nullable().optional().describe("Selected prompts to expose (null = all)")}),sb6=q.object({configured:q.boolean().describe("Whether the app has been configured"),connection_id:q.string().nullable().describe("Connection ID if created"),error:q.string().nullable().describe("Error message if configuration failed")}),ZB=q.object({id:q.string(),organization_id:q.string(),title:q.string(),description:q.string().nullable(),icon:q.string().nullable(),required_apps:q.array(ob6),redirect_url:q.string().nullable(),webhook_url:q.string().nullable(),event_type:q.string(),agent_title_template:q.string(),agent_instructions:q.string().nullable(),tool_selection_mode:q.enum(["inclusion","exclusion"]),status:q.enum(["active","inactive"]),created_at:q.string(),updated_at:q.string(),created_by:q.string().nullable()}),tb6=q.object({id:q.string(),template_id:q.string(),organization_id:q.string(),external_user_id:q.string(),status:q.enum(["pending","in_progress","completed"]),app_statuses:q.record(q.string(),sb6),created_agent_id:q.string().nullable(),redirect_url:q.string().nullable(),created_at:q.string(),updated_at:q.string(),expires_at:q.string()}),ig0=q.object({app_name:q.string().describe("App name from registry (e.g., '@deco/openrouter')"),selected_tools:q.array(q.string()).nullable().optional().describe("Selected tools to expose (null = all)"),selected_resources:q.array(q.string()).nullable().optional().describe("Selected resources to expose (null = all)"),selected_prompts:q.array(q.string()).nullable().optional().describe("Selected prompts to expose (null = all)")}),ag0=q.object({title:q.string().describe("Title for the template"),description:q.string().optional().describe("Optional description"),icon:q.string().optional().describe("Optional icon URL"),registry_id:q.string().describe("Connection ID of the registry to look up apps from"),required_apps:q.array(ig0).describe("Apps to include - only app_name required, details fetched from registry"),redirect_url:q.string().optional().describe("URL to redirect to after completion"),webhook_url:q.string().optional().describe("Webhook URL to call on completion"),event_type:q.string().optional().describe("Event type to emit (default: integration.completed)"),agent_title_template:q.string().optional().describe("Template for agent title (supports {{externalUserId}})"),agent_instructions:q.string().optional().describe("Instructions for the created agent"),tool_selection_mode:q.enum(["inclusion","exclusion"]).optional().describe("Tool selection mode for the agent")}),rg0=q.object({id:q.string().describe("Template ID to update"),title:q.string().optional(),description:q.string().nullable().optional(),icon:q.string().nullable().optional(),registry_id:q.string().optional().describe("Connection ID of the registry (required if updating required_apps)"),required_apps:q.array(ig0).optional().describe("Updated apps (details will be fetched from registry)"),redirect_url:q.string().nullable().optional(),webhook_url:q.string().nullable().optional(),event_type:q.string().optional(),agent_title_template:q.string().optional(),agent_instructions:q.string().nullable().optional(),tool_selection_mode:q.enum(["inclusion","exclusion"]).optional(),status:q.enum(["active","inactive"]).optional()}),og0=q.object({id:q.string().describe("Template ID")}),sg0=q.object({}),tg0=q.object({id:q.string().describe("Template ID to delete")}),eg0=q.object({templateId:q.string().describe("Template ID"),externalUserId:q.string().describe("External user ID from your platform"),expiresInSeconds:q.number().optional().describe("Session expiration in seconds (default: 7 days)")}),Yu0=q.object({sessionId:q.string().describe("Session ID"),url:q.string().describe("URL for the connect flow"),expiresAt:q.string().describe("Session expiration time"),agentId:q.string().nullable().optional().describe("Virtual MCP ID for this user (unique per template + user)"),created:q.boolean().describe("Whether the agent was newly created (true) or already existed (false)")}),Qu0=q.object({templateId:q.string().optional().describe("Filter by template ID")}),Xu0=q.object({sessions:q.array(tb6)}),Ju0=q.object({externalUserId:q.string().describe("External user ID to find agents for")}),eb6=q.object({id:q.string().describe("Agent (Virtual MCP) ID"),title:q.string(),external_user_id:q.string(),template_id:q.string().nullable(),created_at:q.string()}),Gu0=q.object({agents:q.array(eb6)}),Wu0=q.object({externalUserId:q.string().describe("External user ID whose session data should be cleared")}),Zu0=q.object({success:q.boolean(),deletedAgents:q.number().describe("Number of agents (Virtual MCPs) deleted"),deletedConnections:q.number().describe("Number of child connections deleted"),deletedSessions:q.number().describe("Number of sessions deleted")})});function Qh6(Y){if(!Y?.url)return null;try{let Q=new URL(Y.url);if(Q.hostname==="github.com"){let X=Q.pathname.split("/").filter(Boolean);if(X.length>=1)return`https://github.com/${X[0]}.png`}}catch{}return null}function Xh6(Y){return Y.find((X)=>X.name.endsWith("_LIST"))?.name??null}function Jh6(Y){if(!Y)return[];if(Array.isArray(Y))return Y;if(typeof Y==="object"&&Y!==null){let Q=Object.keys(Y).find((X)=>Array.isArray(Y[X]));if(Q)return Y[Q]}return[]}function Gh6(Y,Q,X,J){let G=Y.server,K=Y._meta?.["mcp.mesh"],W=K?.friendlyName||K?.friendly_name||Y.title||G?.title||G?.name||"Unnamed MCP Server",Z=G?.description||null,H=G?.icons?.[0]?.src||Qh6(G?.repository)||null,$=K?.oauth_config,F=$&&typeof $.authorizationEndpoint==="string"&&typeof $.tokenEndpoint==="string"&&typeof $.clientId==="string"&&Array.isArray($.scopes)&&($.grantType==="authorization_code"||$.grantType==="client_credentials")?{authorizationEndpoint:$.authorizationEndpoint,tokenEndpoint:$.tokenEndpoint,clientId:$.clientId,scopes:$.scopes,grantType:$.grantType}:null,V=G?.packages??[],B=G?.remotes??[],U,z,D=null,L=B[0],w=V[0];if(L){if(U=Yh6[L.type??""]??L.type?.toUpperCase()??"HTTP",z=L.url??null,L.headers&&L.headers.length>0){let E={};for(let T of L.headers)if(T.name&&T.value)E[T.name]=T.value;if(Object.keys(E).length>0)D={headers:E}}}else if(w){U="STDIO",z=null;let E=w.identifier||w.name,T={};if(w.environmentVariables){for(let C of w.environmentVariables)if(C.name)T[C.name]=""}D={command:"npx",args:E?["-y",E]:[],...Object.keys(T).length>0&&{envVars:T}}}else U="HTTP",z=null;return{title:W,description:Z,icon:H,connection_type:U,connection_url:z,connection_headers:D,oauth_config:F,selected_tools:Q,selected_resources:X,selected_prompts:J}}async function Wh6(Y,Q,X,J=null,G=null,K=null){let W=await Y.createMCPProxy(Q);try{let Z=await W.listTools(),H=Xh6(Z.tools);if(!H)throw Error(`Registry "${Q}" does not have a LIST tool`);let $=await W.callTool({name:H,arguments:{where:{appName:X}}}),F=$.structuredContent??$,B=Jh6(F)[0];if(!B)throw Error(`App "${X}" not found in registry "${Q}"`);let U=Gh6(B,J,G,K);return{app_name:X,...U}}finally{await W.close().catch(console.error)}}async function Na(Y,Q,X){let J=[];for(let G of X){let K=await Wh6(Y,Q,G.app_name,G.selected_tools??null,G.selected_resources??null,G.selected_prompts??null);J.push(K)}return J}var Yh6;var Uz1=S(()=>{Yh6={"streamable-http":"HTTP",http:"HTTP",sse:"SSE",stdio:"STDIO",websocket:"Websocket"}});var Ku0;var Hu0=S(()=>{tH();eZ();Uz1();Ku0={name:"USER_SANDBOX_CREATE",description:"Create a new user sandbox for platform integration flows. Specify apps by name and the system will automatically fetch connection details from the registry.",inputSchema:ag0,outputSchema:ZB,handler:async(Y,Q)=>{let X=Y,J=Q;if(!J.organization)throw Error("Organization context required");await J.access.check();let G=await Na(J,X.registry_id,X.required_apps.map((Z)=>({app_name:Z.app_name,selected_tools:Z.selected_tools??null,selected_resources:Z.selected_resources??null,selected_prompts:Z.selected_prompts??null})));return await bJ().templates.create({organization_id:J.organization.id,title:X.title,description:X.description??null,icon:X.icon??null,required_apps:G,redirect_url:X.redirect_url??null,webhook_url:X.webhook_url??null,event_type:X.event_type,agent_title_template:X.agent_title_template,agent_instructions:X.agent_instructions??null,tool_selection_mode:X.tool_selection_mode,created_by:J.auth.user?.id??null})}}});var $u0;var Fu0=S(()=>{tH();eZ();Uz1();$u0={name:"USER_SANDBOX_UPDATE",description:"Update an existing user sandbox. If updating required_apps, provide registry_id to auto-fetch details.",inputSchema:rg0,outputSchema:ZB,handler:async(Y,Q)=>{let X=Y,J=Q;if(!J.organization)throw Error("Organization context required");await J.access.check();let G=bJ(),K=await G.templates.findById(X.id);if(!K)throw Error(`Template not found: ${X.id}`);if(K.organization_id!==J.organization.id)throw Error("Access denied: template belongs to another organization");let W=void 0;if(X.required_apps&&X.required_apps.length>0){if(!X.registry_id)throw Error("registry_id is required when updating required_apps");W=await Na(J,X.registry_id,X.required_apps.map((H)=>({app_name:H.app_name,selected_tools:H.selected_tools??null,selected_resources:H.selected_resources??null,selected_prompts:H.selected_prompts??null})))}return await G.templates.update(X.id,{title:X.title,description:X.description,icon:X.icon,required_apps:W,redirect_url:X.redirect_url,webhook_url:X.webhook_url,event_type:X.event_type,agent_title_template:X.agent_title_template,agent_instructions:X.agent_instructions,tool_selection_mode:X.tool_selection_mode,status:X.status})}}});var Vu0;var qu0=S(()=>{l1();tH();eZ();Vu0={name:"USER_SANDBOX_DELETE",description:"Delete a user sandbox",inputSchema:tg0,outputSchema:q.object({success:q.boolean(),id:q.string()}),handler:async(Y,Q)=>{let X=Y,J=Q;if(!J.organization)throw Error("Organization context required");await J.access.check();let G=bJ(),K=await G.templates.findById(X.id);if(!K)throw Error(`Template not found: ${X.id}`);if(K.organization_id!==J.organization.id)throw Error("Access denied: template belongs to another organization");return await G.templates.delete(X.id),{success:!0,id:X.id}}}});var Bu0;var Uu0=S(()=>{l1();tH();eZ();Bu0={name:"USER_SANDBOX_LIST",description:"List all user sandbox in the organization",inputSchema:sg0,outputSchema:q.object({templates:q.array(ZB)}),handler:async(Y,Q)=>{let X=Q;if(!X.organization)throw Error("Organization context required");return await X.access.check(),{templates:await bJ().templates.list(X.organization.id)}}}});var zu0;var Du0=S(()=>{tH();eZ();zu0={name:"USER_SANDBOX_GET",description:"Get a user sandbox by ID",inputSchema:og0,outputSchema:ZB,handler:async(Y,Q)=>{let X=Y,J=Q;if(!J.organization)throw Error("Organization context required");await J.access.check();let K=await bJ().templates.findById(X.id);if(K&&K.organization_id!==J.organization.id)throw Error("Access denied: template belongs to another organization");return K}}});async function Ou0(Y,Q){let X=await Q.sessions.findById(Y);if(!X)throw new WF("Session not found","SESSION_NOT_FOUND");if(new Date(X.expires_at)<new Date)throw new WF("Session has expired","SESSION_EXPIRED");return X}async function Zh6(Y,Q){let X=await Ou0(Y,Q);if(X.status==="completed")throw new WF("Session is already completed. Create a new session to reconfigure.","SESSION_COMPLETED");return X}function Kh6(Y,Q){let X=Y.metadata;if(!X)throw new WF("Connection has no metadata","CONNECTION_ACCESS_DENIED");let J=X[KB.SESSION_ID]===Q.id,G=X[KB.EXTERNAL_USER_ID]===Q.external_user_id&&X[KB.TEMPLATE_ID]===Q.template_id;if(!J&&!G)throw new WF("Access denied: connection does not belong to this session","CONNECTION_ACCESS_DENIED")}function zz1(Y,Q,X){return{[KB.SESSION_ID]:Y,[KB.EXTERNAL_USER_ID]:Q,[KB.TEMPLATE_ID]:X,source:"user-sandbox"}}function Dz1(Y,Q){return{[KB.EXTERNAL_USER_ID]:Y,[KB.TEMPLATE_ID]:Q,source:"user-sandbox"}}async function WO(Y,Q,X){let J=X?.allowCompleted?await Ou0(Y,Q):await Zh6(Y,Q);if(X?.connection)Kh6(X.connection,J);return J}var KB,WF;var Nu0=S(()=>{KB={SESSION_ID:"user_sandbox_session_id",EXTERNAL_USER_ID:"user_sandbox_external_user_id",TEMPLATE_ID:"user_sandbox_id"};WF=class WF extends Error{code;constructor(Y,Q){super(Y);this.code=Q;this.name="SessionAccessError"}}});var Oz1=S(()=>{Nu0()});async function $h6(Y,Q,X,J,G,K,W,Z){let H=Y,$=await H.selectFrom("user_sandbox_agents").select("connection_id").where("user_sandbox_id","=",J).where("external_user_id","=",G).executeTakeFirst();if($)return{connectionId:$.connection_id,created:!1};let F=new Date().toISOString(),V=`usa_${Date.now().toString(36)}${crypto.randomUUID().replace(/-/g,"").substring(0,8)}`,B=`vir_${Date.now().toString(36)}${crypto.randomUUID().replace(/-/g,"").substring(0,8)}`;try{return await H.transaction().execute(async(U)=>{await U.insertInto("connections").values({id:B,organization_id:Q,created_by:X,title:K,description:W,icon:null,app_name:null,app_id:null,connection_type:"VIRTUAL",connection_url:`virtual://${B}`,connection_token:null,connection_headers:JSON.stringify({tool_selection_mode:Z}),oauth_config:null,configuration_state:null,configuration_scopes:null,metadata:JSON.stringify(Dz1(G,J)),tools:null,bindings:null,status:"active",created_at:F,updated_at:F}).execute(),await U.insertInto("user_sandbox_agents").values({id:V,user_sandbox_id:J,external_user_id:G,connection_id:B,created_at:F}).execute()}),{connectionId:B,created:!0}}catch(U){let z=String(U);if(z.includes("UNIQUE constraint")||z.includes("duplicate key")){let D=await H.selectFrom("user_sandbox_agents").select("connection_id").where("user_sandbox_id","=",J).where("external_user_id","=",G).executeTakeFirst();if(D)return{connectionId:D.connection_id,created:!1}}throw U}}var Hh6=604800,Lu0;var Mu0=S(()=>{tH();eZ();Oz1();Lu0={name:"USER_SANDBOX_CREATE_SESSION",description:"Create a connect session URL for an external user. Returns a URL that the user can visit to configure their integrations. Also creates a unique Virtual MCP (agent) for this user if one doesn't exist.",inputSchema:eg0,outputSchema:Yu0,handler:async(Y,Q)=>{let X=Y,J=Q;if(!J.organization)throw Error("Organization context required");await J.access.check();let G=bJ(),K=await G.templates.findById(X.templateId);if(!K)throw Error(`Template not found: ${X.templateId}`);if(K.organization_id!==J.organization.id)throw Error("Access denied: template belongs to another organization");if(K.status!=="active")throw Error("Template is not active");let W=K.agent_title_template.replace("{{externalUserId}}",X.externalUserId),Z=K.created_by??J.auth.user?.id??"system",{connectionId:H,created:$}=await $h6(J.db,J.organization.id,Z,K.id,X.externalUserId,W,K.agent_instructions,K.tool_selection_mode),F=await G.sessions.findExisting(X.templateId,X.externalUserId);if(F){if(!F.created_agent_id)await G.sessions.update(F.id,{created_agent_id:H});let D=Bz1();return{sessionId:F.id,url:`${D}/connect/${F.id}`,expiresAt:F.expires_at,agentId:F.created_agent_id??H,created:$}}let V=X.expiresInSeconds??Hh6,B=new Date(Date.now()+V*1000).toISOString(),U=await G.sessions.create({template_id:X.templateId,organization_id:J.organization.id,external_user_id:X.externalUserId,redirect_url:K.redirect_url,expires_at:B,created_agent_id:H}),z=Bz1();return{sessionId:U.id,url:`${z}/connect/${U.id}`,expiresAt:U.expires_at,agentId:H,created:$}}}});var wu0;var Au0=S(()=>{tH();eZ();wu0={name:"USER_SANDBOX_LIST_SESSIONS",description:"List connect sessions for monitoring and management",inputSchema:Qu0,outputSchema:Xu0,handler:async(Y,Q)=>{let X=Y,J=Q;if(!J.organization)throw Error("Organization context required");await J.access.check();let G=bJ(),K;if(X.templateId){let W=await G.templates.findById(X.templateId);if(!W)throw Error(`Template not found: ${X.templateId}`);if(W.organization_id!==J.organization.id)throw Error("Access denied: template belongs to another organization");K=await G.sessions.listByTemplate(X.templateId)}else K=await G.sessions.listByOrganization(J.organization.id);return{sessions:K}}}});var Fh6="user_sandbox_external_user_id",Vh6="user_sandbox_id",Pu0;var Eu0=S(()=>{tH();Pu0={name:"USER_SANDBOX_LIST_USER_AGENTS",description:"List all agents (Virtual MCPs) created for an external user. Use this to find agents created via user sandbox for a specific user in your platform.",inputSchema:Ju0,outputSchema:Gu0,handler:async(Y,Q)=>{let X=Y,J=Q;if(!J.organization)throw Error("Organization context required");return await J.access.check(),{agents:(await J.storage.connections.list(J.organization.id)).filter((W)=>{if(W.connection_type!=="VIRTUAL")return!1;let Z=W.metadata;if(!Z)return!1;return Z[Fh6]===X.externalUserId}).map((W)=>{let Z=W.metadata;return{id:W.id,title:W.title,external_user_id:X.externalUserId,template_id:Z[Vh6]??null,created_at:W.created_at}})}}}});var qh6="user_sandbox_external_user_id",Tu0;var Cu0=S(()=>{tH();eZ();Tu0={name:"USER_SANDBOX_CLEAR_USER_SESSION",description:"Clear all session data for an external user, revoking all access they've granted. This deletes their agents (Virtual MCPs), child connections, OAuth tokens, and sessions. Use this when a user wants to disconnect all their integrations.",inputSchema:Wu0,outputSchema:Zu0,handler:async(Y,Q)=>{let X=Y,J=Q;if(!J.organization)throw Error("Organization context required");await J.access.check();let G=J.db,K=bJ(),Z=(await G.selectFrom("connections").select(["id","metadata"]).where("organization_id","=",J.organization.id).where("connection_type","=","VIRTUAL").execute()).filter((F)=>{if(!F.metadata)return!1;try{return JSON.parse(F.metadata)[qh6]===X.externalUserId}catch{return!1}}).map((F)=>F.id),H=0;if(Z.length>0){let V=(await G.selectFrom("connection_aggregations").select("child_connection_id").where("parent_connection_id","in",Z).execute()).map((B)=>B.child_connection_id);if(await G.deleteFrom("connection_aggregations").where("parent_connection_id","in",Z).execute(),V.length>0)await G.deleteFrom("downstream_tokens").where("connectionId","in",V).execute(),await G.deleteFrom("connections").where("id","in",V).execute(),H=V.length;await G.deleteFrom("connections").where("id","in",Z).execute(),await G.deleteFrom("user_sandbox_agents").where("external_user_id","=",X.externalUserId).execute()}let $=await K.sessions.deleteByExternalUserId(J.organization.id,X.externalUserId);return{success:!0,deletedAgents:Z.length,deletedConnections:H,deletedSessions:$}}}});var Ru0;var Iu0=S(()=>{Hu0();Fu0();qu0();Uu0();Du0();Mu0();Au0();Eu0();Cu0();eZ();Ru0=[Ku0,$u0,Vu0,Bu0,zu0,Lu0,wu0,Pu0,Tu0]});function Bh6(Y){let Q=Date.now().toString(36),X=crypto.randomUUID().replace(/-/g,"").substring(0,8);return`${Y}_${Q}${X}`}async function Nz1(Y,Q,X,J){let G={success:!1,agentId:Y.created_agent_id,connectionIds:[],redirectUrl:null,eventEmitted:!1,webhookCalled:!1};try{let K=J.db,W=new Date().toISOString(),Z=Y.created_agent_id;if(!Z)throw Error("Session has no agent - this should not happen");let H=[],$=[];for(let[B,U]of Object.entries(Y.app_statuses))if(U.configured&&U.connection_id){H.push(U.connection_id);let z=Q.required_apps.find((D)=>D.app_name===B);$.push({appName:B,connectionId:U.connection_id,selectedTools:z?.selected_tools??null,selectedResources:z?.selected_resources??null,selectedPrompts:z?.selected_prompts??null})}if(G.connectionIds=H,await K.deleteFrom("connection_aggregations").where("parent_connection_id","=",Z).execute(),$.length>0)await K.insertInto("connection_aggregations").values($.map((B)=>({id:Bh6("agg"),parent_connection_id:Z,child_connection_id:B.connectionId,selected_tools:B.selectedTools?JSON.stringify(B.selectedTools):null,selected_resources:B.selectedResources?JSON.stringify(B.selectedResources):null,selected_prompts:B.selectedPrompts?JSON.stringify(B.selectedPrompts):null,created_at:W}))).execute();await X.sessions.update(Y.id,{status:"completed"});let F={type:Q.event_type,data:{externalUserId:Y.external_user_id,agentId:Z,templateId:Q.id,sessionId:Y.id,connections:H.map((B)=>{let U=Object.entries(Y.app_statuses).find(([z,D])=>D.connection_id===B)?.[0];return{id:B,appName:U??"unknown"}})}};if(J.eventBus)try{await J.eventBus.publish(J.organizationId,"user-sandbox",F),G.eventEmitted=!0}catch(B){console.error("[UserSandbox] Failed to emit completion event:",B)}if(Q.webhook_url)try{let B=await fetch(Q.webhook_url,{method:"POST",headers:{"Content-Type":"application/json","X-User-Sandbox-Event":Q.event_type},body:JSON.stringify(F.data)});if(!B.ok)console.error("[UserSandbox] Webhook returned error:",B.status);else G.webhookCalled=!0}catch(B){console.error("[UserSandbox] Failed to call webhook:",B)}let V=Y.redirect_url??Q.redirect_url;if(V){let B=new URL(V);B.searchParams.set("sessionId",Y.id),B.searchParams.set("externalUserId",Y.external_user_id),B.searchParams.set("agentId",Z),G.redirectUrl=B.toString()}return G.success=!0,G}catch(K){throw console.error("[UserSandbox] Completion failed:",K),K}}var ju0=()=>{};function Uh6(){let Y=Date.now().toString(36),Q=crypto.randomUUID().replace(/-/g,"").substring(0,8);return`conn_${Y}${Q}`}async function zh6(Y,Q,X,J,G,K,W){let Z=Uh6(),H=new Date().toISOString();if(!W.title)throw Error(`App "${W.app_name}" is missing required field: title`);if(!W.connection_type)throw Error(`App "${W.app_name}" is missing required field: connection_type`);if(!W.connection_url&&W.connection_type!=="STDIO")throw Error(`App "${W.app_name}" is missing required field: connection_url`);let $={id:Z,organization_id:Q,created_by:X,title:W.title,description:W.description??null,icon:W.icon??null,app_name:W.app_name,app_id:null,connection_type:W.connection_type,connection_url:W.connection_url??"",connection_token:null,connection_headers:W.connection_headers?JSON.stringify(W.connection_headers):null,oauth_config:W.oauth_config?JSON.stringify(W.oauth_config):null,configuration_state:null,configuration_scopes:null,metadata:JSON.stringify(zz1(J,G,K)),tools:null,bindings:null,status:"active",created_at:H,updated_at:H};return await Y.insertInto("connections").values($).execute(),Z}function hk(Y,Q){if(Q instanceof WF){let X={SESSION_NOT_FOUND:404,SESSION_EXPIRED:410,SESSION_COMPLETED:409,ACCESS_DENIED:403,CONNECTION_ACCESS_DENIED:403};return Y.json({error:Q.message,code:Q.code},X[Q.code]??400)}return console.error("[UserSandbox] Connect API error:",Q),Y.json({error:Q instanceof Error?Q.message:"Internal error"},500)}function Lz1(Y,Q){let X=Q.db,J=new yk(X),G=new fk(X),K={templates:J,sessions:G};Y.get("/api/user-sandbox/sessions/:sessionId",async(W)=>{try{let Z=W.req.param("sessionId"),H=await WO(Z,K,{allowCompleted:!0}),$=await J.findById(H.template_id);if(!$)return W.json({error:"Template not found"},404);return W.json({session:{id:H.id,status:H.status,external_user_id:H.external_user_id,expires_at:H.expires_at,redirect_url:H.redirect_url,created_agent_id:H.created_agent_id},template:{id:$.id,title:$.title,description:$.description,icon:$.icon},apps:$.required_apps.map((F)=>({app_name:F.app_name,title:F.title,description:F.description,icon:F.icon,connection_type:F.connection_type,requires_oauth:!!F.oauth_config,selected_tools:F.selected_tools,selected_resources:F.selected_resources,selected_prompts:F.selected_prompts,status:H.app_statuses[F.app_name]??{configured:!1,connection_id:null,error:null}}))})}catch(Z){return hk(W,Z)}}),Y.post("/api/user-sandbox/sessions/:sessionId/provision",async(W)=>{try{let Z=W.req.param("sessionId"),H=await W.req.json();if(!H.app_name)return W.json({error:"app_name is required"},400);let $=await WO(Z,K,{allowCompleted:!0}),F=await J.findById($.template_id);if(!F)return W.json({error:"Template not found"},404);let V=F.required_apps.find((D)=>D.app_name===H.app_name);if(!V)return W.json({error:`App "${H.app_name}" is not required by this template`},400);let B=$.app_statuses[H.app_name];if(B?.connection_id)return W.json({success:!0,connection_id:B.connection_id,already_provisioned:!0,requires_oauth:!!V.oauth_config});if(!F.created_by)return W.json({error:"Template is missing created_by - cannot create connections"},500);let U=await zh6(X,$.organization_id,F.created_by,Z,$.external_user_id,$.template_id,V),z={...$.app_statuses,[H.app_name]:{configured:!1,connection_id:U,error:null}};return await G.update(Z,{status:"in_progress",app_statuses:z}),W.json({success:!0,connection_id:U,already_provisioned:!1,requires_oauth:!!V.oauth_config})}catch(Z){return hk(W,Z)}}),Y.post("/api/user-sandbox/sessions/:sessionId/configure",async(W)=>{try{let Z=W.req.param("sessionId"),H=await W.req.json();if(!H.app_name)return W.json({error:"app_name is required"},400);let $=await WO(Z,K,{allowCompleted:!0}),F=await J.findById($.template_id);if(!F)return W.json({error:"Template not found"},404);if(!F.required_apps.find((L)=>L.app_name===H.app_name))return W.json({error:`App "${H.app_name}" is not required by this template`},400);let B=$.app_statuses[H.app_name],z={configured:!0,connection_id:H.connection_id??B?.connection_id??null,error:null},D={...$.app_statuses,[H.app_name]:z};return await G.update(Z,{status:"in_progress",app_statuses:D}),W.json({success:!0,app_name:H.app_name,status:z})}catch(Z){return hk(W,Z)}}),Y.post("/api/user-sandbox/sessions/:sessionId/oauth-token",async(W)=>{try{let Z=W.req.param("sessionId"),H=await W.req.json();if(!H.connection_id)return W.json({error:"connection_id is required"},400);if(!H.access_token)return W.json({error:"access_token is required"},400);let $=await WO(Z,K,{allowCompleted:!0});if(!Object.values($.app_statuses).some((E)=>E.connection_id===H.connection_id))return W.json({error:"Connection does not belong to this session"},403);let V=H.expires_in?new Date(Date.now()+H.expires_in*1000):null,B=new Date().toISOString(),U=await Q.vault.encrypt(H.access_token),z=H.refresh_token?await Q.vault.encrypt(H.refresh_token):null,D=H.client_secret?await Q.vault.encrypt(H.client_secret):null,L=X,w=await L.selectFrom("downstream_tokens").select(["id"]).where("connectionId","=",H.connection_id).executeTakeFirst();if(w)await L.updateTable("downstream_tokens").set({accessToken:U,refreshToken:z,scope:H.scope??null,expiresAt:V?.toISOString()??null,clientId:H.client_id??null,clientSecret:D,tokenEndpoint:H.token_endpoint??null,updatedAt:B}).where("id","=",w.id).execute();else{let E=`dtok_${Date.now().toString(36)}${crypto.randomUUID().replace(/-/g,"").substring(0,8)}`;await L.insertInto("downstream_tokens").values({id:E,connectionId:H.connection_id,accessToken:U,refreshToken:z,scope:H.scope??null,expiresAt:V?.toISOString()??null,clientId:H.client_id??null,clientSecret:D,tokenEndpoint:H.token_endpoint??null,createdAt:B,updatedAt:B}).execute()}return W.json({success:!0,expiresAt:V})}catch(Z){return hk(W,Z)}}),Y.post("/api/user-sandbox/sessions/:sessionId/complete",async(W)=>{try{let Z=W.req.param("sessionId"),H=await WO(Z,K,{allowCompleted:!0}),$=await J.findById(H.template_id);if(!$)return W.json({error:"Template not found"},404);if($.required_apps.filter((B)=>{return H.app_statuses[B.app_name]?.configured}).length===0)return W.json({error:"At least one app must be configured"},400);let V=await Nz1(H,$,K,{organizationId:H.organization_id,db:X});return W.json({success:V.success,completed:!0,agentId:V.agentId,redirectUrl:V.redirectUrl,eventEmitted:V.eventEmitted,webhookCalled:V.webhookCalled})}catch(Z){return hk(W,Z)}})}var Su0=S(()=>{Fz1();Vz1();Oz1();ju0()});var ku0=S(()=>{Su0()});var vu0;var _u0=S(()=>{pg0();ng0();Iu0();ku0();vu0={id:Da,description:ug0,tools:Ru0,publicRoutes:(Y,Q)=>{Lz1(Y,Q)},migrations:dg0,createStorage:(Y)=>{let Q=cg0(Y);return bk(Q),Q}}});var yu0="workflows",fu0="Create workflows for platform end-users";import{sql as bu0}from"kysely";var hu0;var xu0=S(()=>{hu0={name:"001-workflows",async up(Y){await Y.schema.createTable("workflow_collection").addColumn("id","text",(Q)=>Q.primaryKey()).addColumn("organization_id","text",(Q)=>Q.notNull().references("organization.id").onDelete("cascade")).addColumn("title","text",(Q)=>Q.notNull()).addColumn("description","text").addColumn("virtual_mcp_id","text",(Q)=>Q.notNull()).addColumn("steps","text",(Q)=>Q.notNull().defaultTo("[]")).addColumn("created_at","text",(Q)=>Q.notNull().defaultTo(bu0`CURRENT_TIMESTAMP`)).addColumn("updated_at","text",(Q)=>Q.notNull().defaultTo(bu0`CURRENT_TIMESTAMP`)).addColumn("created_by","text").addColumn("updated_by","text").execute(),await Y.schema.createIndex("idx_wf_collection_org").on("workflow_collection").column("organization_id").execute(),await Y.schema.createIndex("idx_wf_collection_created_at").on("workflow_collection").column("created_at").execute(),await Y.schema.createTable("workflow").addColumn("id","text",(Q)=>Q.primaryKey()).addColumn("workflow_collection_id","text").addColumn("organization_id","text",(Q)=>Q.notNull().references("organization.id").onDelete("cascade")).addColumn("steps","text",(Q)=>Q.notNull().defaultTo("[]")).addColumn("input","text").addColumn("virtual_mcp_id","text",(Q)=>Q.notNull()).addColumn("created_at_epoch_ms","bigint",(Q)=>Q.notNull()).addColumn("created_by","text").execute(),await Y.schema.createIndex("idx_workflow_created_at").on("workflow").column("created_at_epoch_ms").execute(),await Y.schema.createIndex("idx_workflow_collection_id").on("workflow").column("workflow_collection_id").execute(),await Y.schema.createTable("workflow_execution").addColumn("id","text",(Q)=>Q.primaryKey()).addColumn("workflow_id","text",(Q)=>Q.notNull().references("workflow.id").onDelete("cascade")).addColumn("organization_id","text",(Q)=>Q.notNull().references("organization.id").onDelete("cascade")).addColumn("status","text",(Q)=>Q.notNull().defaultTo("enqueued")).addColumn("input","text").addColumn("output","text").addColumn("error","text").addColumn("created_at","bigint",(Q)=>Q.notNull()).addColumn("updated_at","bigint",(Q)=>Q.notNull()).addColumn("start_at_epoch_ms","bigint").addColumn("started_at_epoch_ms","bigint").addColumn("completed_at_epoch_ms","bigint").addColumn("timeout_ms","bigint").addColumn("deadline_at_epoch_ms","bigint").addColumn("created_by","text").execute(),await Y.schema.createIndex("idx_wf_execution_status").on("workflow_execution").column("status").execute(),await Y.schema.createIndex("idx_wf_execution_workflow_id").on("workflow_execution").column("workflow_id").execute(),await Y.schema.createIndex("idx_wf_execution_org").on("workflow_execution").column("organization_id").execute(),await Y.schema.createIndex("idx_wf_execution_created_at").on("workflow_execution").column("created_at").execute(),await Y.schema.createTable("workflow_execution_step_result").addColumn("execution_id","text",(Q)=>Q.notNull().references("workflow_execution.id").onDelete("cascade")).addColumn("step_id","text",(Q)=>Q.notNull()).addColumn("started_at_epoch_ms","bigint").addColumn("completed_at_epoch_ms","bigint").addColumn("output","text").addColumn("error","text").addColumn("raw_tool_output","text").execute(),await Y.schema.createIndex("idx_wf_step_result_pk").on("workflow_execution_step_result").columns(["execution_id","step_id"]).unique().execute(),await Y.schema.createIndex("idx_wf_step_result_execution").on("workflow_execution_step_result").column("execution_id").execute()},async down(Y){await Y.schema.dropIndex("idx_wf_step_result_execution").ifExists().execute(),await Y.schema.dropIndex("idx_wf_step_result_pk").ifExists().execute(),await Y.schema.dropIndex("idx_wf_execution_created_at").ifExists().execute(),await Y.schema.dropIndex("idx_wf_execution_org").ifExists().execute(),await Y.schema.dropIndex("idx_wf_execution_workflow_id").ifExists().execute(),await Y.schema.dropIndex("idx_wf_execution_status").ifExists().execute(),await Y.schema.dropIndex("idx_workflow_collection_id").ifExists().execute(),await Y.schema.dropIndex("idx_workflow_created_at").ifExists().execute(),await Y.schema.dropIndex("idx_wf_collection_created_at").ifExists().execute(),await Y.schema.dropIndex("idx_wf_collection_org").ifExists().execute(),await Y.schema.dropTable("workflow_execution_step_result").ifExists().execute(),await Y.schema.dropTable("workflow_execution").ifExists().execute(),await Y.schema.dropTable("workflow").ifExists().execute(),await Y.schema.dropTable("workflow_collection").ifExists().execute()}}});var gu0;var uu0=S(()=>{xu0();gu0=[hu0]});function CG(Y){let Q=Y;if(!Q.organization)throw Error("Organization context required for workflow tools");return Q}function k5(Y){if(Y===null||Y===void 0)return null;if(typeof Y==="object")return Y;if(typeof Y!=="string")return Y;try{return JSON.parse(Y)}catch{return Y}}function mu0(Y){Mz1=Y}function QJ(){if(!Mz1)throw Error('Plugin storage not initialized. Make sure the "workflows" plugin is enabled.');return Mz1}var Mz1=null;function lu0(Y){return{...Y,steps:k5(Y.steps)??[]}}class wz1{db;constructor(Y){this.db=Y}async list(Y,Q={}){let{limit:X=50,offset:J=0}=Q,G=await this.db.selectFrom("workflow_collection").selectAll().where("organization_id","=",Y).orderBy("created_at","desc").limit(X).offset(J).execute(),K=await this.db.selectFrom("workflow_collection").select((W)=>W.fn.countAll().as("count")).where("organization_id","=",Y).executeTakeFirstOrThrow();return{items:G,totalCount:Number(K.count)}}async getById(Y,Q){let X=await this.db.selectFrom("workflow_collection").selectAll().where("id","=",Y).where("organization_id","=",Q).executeTakeFirst();return X?lu0(X):null}async create(Y){let Q=await this.db.insertInto("workflow_collection").values(Y).returningAll().executeTakeFirstOrThrow();return lu0(Q)}async update(Y,Q,X){return await this.db.updateTable("workflow_collection").set({...X,updated_at:new Date().toISOString()}).where("id","=",Y).where("organization_id","=",Q).returningAll().executeTakeFirstOrThrow()}async delete(Y,Q){return await this.db.deleteFrom("workflow_collection").where("id","=",Y).where("organization_id","=",Q).returningAll().executeTakeFirstOrThrow()}}var du0=()=>{};function Dh6(Y){return{...Y,steps:k5(Y.steps)??[],input:k5(Y.input)??null}}function HB(Y){return{...Y,output:k5(Y.output),error:k5(Y.error),raw_tool_output:k5(Y.raw_tool_output)}}class Az1{db;constructor(Y){this.db=Y}async _createWorkflow(Y,Q){let X=crypto.randomUUID(),J=Date.now();return await Y.insertInto("workflow").values({id:X,workflow_collection_id:Q.workflowCollectionId??null,organization_id:Q.organizationId,steps:JSON.stringify(Q.steps),input:Q.input?JSON.stringify(Q.input):null,virtual_mcp_id:Q.virtualMcpId,created_at_epoch_ms:J,created_by:Q.createdBy??null}).execute(),{id:X}}async createWorkflow(Y){return this._createWorkflow(this.db,Y)}async getWorkflow(Y){let Q=await this.db.selectFrom("workflow").selectAll().where("id","=",Y).executeTakeFirst();return Q?Dh6(Q):null}async createExecution(Y){return this.db.transaction().execute(async(Q)=>{let X=Date.now(),{id:J}=await this._createWorkflow(Q,{organizationId:Y.organizationId,workflowCollectionId:Y.workflowCollectionId,virtualMcpId:Y.virtualMcpId,input:Y.input,steps:Y.steps,createdBy:Y.createdBy}),G=crypto.randomUUID(),K=Y.startAtEpochMs??X,W=Y.timeoutMs?K+Y.timeoutMs:null;return await Q.insertInto("workflow_execution").values({id:G,workflow_id:J,organization_id:Y.organizationId,status:"enqueued",input:Y.input?JSON.stringify(Y.input):null,created_at:X,updated_at:X,start_at_epoch_ms:K,timeout_ms:Y.timeoutMs??null,deadline_at_epoch_ms:W,created_by:Y.createdBy??null}).execute(),{id:G}})}async getExecution(Y,Q){return await this.db.selectFrom("workflow_execution").selectAll().where("id","=",Y).where("organization_id","=",Q).executeTakeFirst()??null}async getExecutionFull(Y,Q){let X=await this.db.selectFrom("workflow_execution").selectAll().where("id","=",Y).where("organization_id","=",Q).executeTakeFirst();if(!X)return null;let J=await this.db.selectFrom("workflow_execution_step_result").selectAll().where("execution_id","=",Y).execute();return{execution:X,stepResults:J.map(HB)}}async getExecutionContext(Y){let Q=await this.db.selectFrom("workflow_execution").select(["id","status","workflow_id","deadline_at_epoch_ms"]).where("id","=",Y).executeTakeFirst();if(!Q)return null;let X=await this.db.selectFrom("workflow").select(["steps","input","virtual_mcp_id"]).where("id","=",Q.workflow_id).executeTakeFirst();if(!X)return null;let J=await this.db.selectFrom("workflow_execution_step_result").selectAll().where("execution_id","=",Y).execute();return{execution:{id:Q.id,status:Q.status,workflow_id:Q.workflow_id,deadline_at_epoch_ms:Q.deadline_at_epoch_ms},workflow:{steps:k5(X.steps)??[],input:k5(X.input)??null,virtual_mcp_id:X.virtual_mcp_id},stepResults:J.map(HB)}}async claimExecution(Y){let Q=Date.now(),X=await this.db.updateTable("workflow_execution").set({status:"running",updated_at:Q}).where("id","=",Y).where("status","=","enqueued").returningAll().executeTakeFirst();if(!X)return null;let J=await this.getWorkflow(X.workflow_id);if(!J)throw Error(`Workflow ${X.workflow_id} not found for execution ${Y}`);return{execution:X,workflow:J}}async updateExecution(Y,Q,X){let G={updated_at:Date.now()};if(Q.status!==void 0)G.status=Q.status;if(Q.output!==void 0)G.output=JSON.stringify(Q.output);if(Q.error!==void 0)G.error=JSON.stringify(Q.error);if(Q.completed_at_epoch_ms!==void 0)G.completed_at_epoch_ms=Q.completed_at_epoch_ms;let K=this.db.updateTable("workflow_execution").set(G).where("id","=",Y);if(X?.onlyIfStatus)K=K.where("status","=",X.onlyIfStatus);return await K.returningAll().executeTakeFirst()??null}async cancelExecution(Y,Q){let X=Date.now();return!!await this.db.updateTable("workflow_execution").set({status:"cancelled",updated_at:X}).where("id","=",Y).where("organization_id","=",Q).where("status","in",["enqueued","running"]).returningAll().executeTakeFirst()}async resumeExecution(Y,Q){return this.db.transaction().execute(async(X)=>{let J=Date.now();return await X.deleteFrom("workflow_execution_step_result").where("execution_id","=",Y).where("completed_at_epoch_ms","is",null).execute(),!!await X.updateTable("workflow_execution").set({status:"enqueued",updated_at:J,completed_at_epoch_ms:null}).where("id","=",Y).where("organization_id","=",Q).where("status","=","cancelled").returningAll().executeTakeFirst()})}async listExecutions(Y,Q={}){let{limit:X=50,offset:J=0,status:G}=Q,K=this.db.selectFrom("workflow_execution as we").innerJoin("workflow as w","we.workflow_id","w.id").leftJoin("workflow_collection as wc","w.workflow_collection_id","wc.id").select(["we.id","we.workflow_id","we.organization_id","we.status","we.input","we.output","we.error","we.created_at","we.updated_at","we.start_at_epoch_ms","we.started_at_epoch_ms","we.completed_at_epoch_ms","we.timeout_ms","we.deadline_at_epoch_ms","we.created_by","w.virtual_mcp_id"]).select((F)=>F.fn.coalesce("wc.title",F.val("Workflow Execution")).as("title")).where("we.organization_id","=",Y);if(G)K=K.where("we.status","=",G);let W=await K.orderBy("we.created_at","desc").limit(X).offset(J).execute(),Z=this.db.selectFrom("workflow_execution").select((F)=>F.fn.countAll().as("count")).where("organization_id","=",Y);if(G)Z=Z.where("status","=",G);let H=await Z.executeTakeFirstOrThrow(),$=Number(H.count);return{items:W,totalCount:$,hasMore:J+W.length<$}}async createStepResult(Y){let Q=await this.db.insertInto("workflow_execution_step_result").values({execution_id:Y.execution_id,step_id:Y.step_id,started_at_epoch_ms:Y.completed_at_epoch_ms?Date.now():null,completed_at_epoch_ms:Y.completed_at_epoch_ms??null,output:Y.output!==void 0?JSON.stringify(Y.output):null,error:Y.error!==void 0?JSON.stringify(Y.error):null}).onConflict((X)=>X.columns(["execution_id","step_id"]).doNothing()).returningAll().executeTakeFirst();return Q?HB(Q):null}async updateStepResult(Y,Q,X){let J={};if(X.output!==void 0)J.output=JSON.stringify(X.output);if(X.error!==void 0)J.error=JSON.stringify(X.error);if(X.started_at_epoch_ms!==void 0)J.started_at_epoch_ms=X.started_at_epoch_ms;if(X.completed_at_epoch_ms!==void 0)J.completed_at_epoch_ms=X.completed_at_epoch_ms;if(Object.keys(J).length===0)return null;let G=await this.db.updateTable("workflow_execution_step_result").set(J).where("execution_id","=",Y).where("step_id","=",Q).returningAll().executeTakeFirst();return G?HB(G):null}async checkpointAndTransform(Y,Q,X,J){await this.db.updateTable("workflow_execution_step_result").set({raw_tool_output:JSON.stringify(X)}).where("execution_id","=",Y).where("step_id","=",Q).execute();let G,K;try{let H=await J(X);G=H.output,K=H.error}catch(H){K=H instanceof Error?`Transform failed: ${H.message}`:`Transform failed: ${String(H)}`}let W={completed_at_epoch_ms:Date.now()};if(G!==void 0)W.output=JSON.stringify(G);if(K!==void 0)W.error=JSON.stringify(K);let Z=await this.db.updateTable("workflow_execution_step_result").set(W).where("execution_id","=",Y).where("step_id","=",Q).returningAll().executeTakeFirst();return Z?HB(Z):null}async getStepResult(Y,Q){let X=await this.db.selectFrom("workflow_execution_step_result").selectAll().where("execution_id","=",Y).where("step_id","=",Q).executeTakeFirst();return X?HB(X):null}async getStepResults(Y){return(await this.db.selectFrom("workflow_execution_step_result").selectAll().where("execution_id","=",Y).execute()).map(HB)}async deleteStepResult(Y,Q){await this.db.deleteFrom("workflow_execution_step_result").where("execution_id","=",Y).where("step_id","=",Q).execute()}async getStepResultsByPrefix(Y,Q){return(await this.db.selectFrom("workflow_execution_step_result").selectAll().where("execution_id","=",Y).where("step_id","like",`${Q}%`).orderBy("step_id").execute()).map(HB)}async recoverStuckExecutions(){return this.db.transaction().execute(async(Y)=>{let Q=await Y.selectFrom("workflow_execution").select(["id","organization_id"]).where("status","=","running").execute();if(Q.length===0)return[];let X=Q.map((J)=>J.id);return await Y.updateTable("workflow_execution").set({status:"enqueued",updated_at:Date.now()}).where("id","in",X).where("status","=","running").execute(),Q})}}var pu0=()=>{};function cu0(Y){let Q=Y.db;return{collections:new wz1(Q),executions:new Az1(Q)}}var nu0=S(()=>{du0();pu0()});var iu0,au0,ru0,ou0,su0;var tu0=S(()=>{l1();IA();QY();iu0={name:"COLLECTION_WORKFLOW_LIST",description:"List workflows with pagination. Does not include steps -- use GET for full details.",inputSchema:q.object({limit:q.number().optional().default(50),offset:q.number().optional().default(0)}),outputSchema:q.object({items:q.array(q.object({id:q.string(),title:q.string(),description:q.string().nullable(),virtual_mcp_id:q.string(),created_at:q.string(),updated_at:q.string()})),totalCount:q.number(),hasMore:q.boolean()}),handler:async(Y,Q)=>{let X=CG(Q);await X.access.check();let J=Y,G=QJ(),{items:K,totalCount:W}=await G.collections.list(X.organization.id,{limit:J.limit,offset:J.offset});return{items:K.map((Z)=>({id:Z.id,title:Z.title,description:Z.description,virtual_mcp_id:Z.virtual_mcp_id,created_at:Z.created_at,updated_at:Z.updated_at})),totalCount:W,hasMore:(J.offset??0)+K.length<W}}},au0={name:"COLLECTION_WORKFLOW_GET",description:"Get a single workflow by ID, including its steps.",inputSchema:q.object({id:q.string()}),outputSchema:q.object({item:q.object({id:q.string(),title:q.string(),description:q.string().nullable(),virtual_mcp_id:q.string(),steps:q.array(dD),created_at:q.string(),updated_at:q.string()}).nullable()}),handler:async(Y,Q)=>{let X=CG(Q);await X.access.check();let{id:J}=Y,K=await QJ().collections.getById(J,X.organization.id);if(!K)return{item:null};return{item:{id:K.id,title:K.title,description:K.description,virtual_mcp_id:K.virtual_mcp_id,steps:K.steps,created_at:K.created_at,updated_at:K.updated_at}}}},ru0={name:"COLLECTION_WORKFLOW_CREATE",description:`Create a workflow template. This is a reusable definition, not an execution.
|
|
1301
|
+
`);return{toolResults:H,agentSummary:U.length>0?U:null,unexecutedTools:F}}finally{await Q.close?.().catch(()=>{})}}async function $z1(Y,Q){let X=v4(),J=Y.organization.id,G=await X.monitorConnections.findByItemId(J,Q.id);if(G){if(await Y.storage.connections.findById(G.connection_id,J))return G.connection_id}let K=jb6(Q);if(!K)throw Error(`Registry item ${Q.id} has no remote URL`);let W=Rb6(Y),Z=Ib6(Q),H=await Y.storage.connections.create({organization_id:J,created_by:W,title:`[MCP Tester] ${Q.title}`,description:`Auto-created monitor connection for ${Q.id}`,app_name:"private-registry-monitor",app_id:`${dH}:monitor`,connection_type:Z,connection_url:K,metadata:{monitorConnection:!0,registryItemId:Q.id,pluginId:dH}});return await X.monitorConnections.upsert({organization_id:J,item_id:Q.id,connection_id:H.id,auth_status:"none"}),H.id}async function gb6(Y){let Q=v4();switch(Y.action){case"unlisted":return await Q.items.update(Y.organizationId,Y.item.id,{is_unlisted:!0}),"unlisted";case"remove_public":return await Q.items.update(Y.organizationId,Y.item.id,{is_public:!1}),"removed_public";case"remove_private":case"remove_all":return await Q.items.delete(Y.organizationId,Y.item.id),Y.action==="remove_all"?"removed_all":"removed_private";default:return"none"}}async function ub6(Y){let Q=Date.now();if(Y.signal.aborted)throw Error("Run cancelled");let X="passed",J=!1,G=!1,K=null,W="none",Z=null,H=[],$=null,F=async()=>{await Y.onProgress?.({status:X,connectionOk:J,toolsListed:G,toolResults:[...H],agentSummary:Z,errorMessage:K,actionTaken:W,durationMs:Date.now()-Q})};try{let V=await $z1(Y.ctx,Y.item);$=await Y.ctx.createMCPProxy(V),J=!0;let U=(await kk($.listTools?$.listTools():Promise.resolve({tools:[]}),Y.monitorConfig.perMcpTimeoutMs,`listTools ${Y.item.id}`)).tools??[];if(G=!0,Y.monitorConfig.monitorMode!=="health_check")H.push(...U.map((z)=>Hz1(z.name))),await F();if(Y.monitorConfig.monitorMode==="full_agent"){let z=await xb6({ctx:Y.ctx,monitorConfig:Y.monitorConfig,item:Y.item,proxy:$,tools:U,signal:Y.signal,onProgress:async(D)=>{H.length=0,H.push(...Xg0({discoveredTools:U,executedResults:D})),X=D.some((L)=>!L.success)?"failed":"passed",await F()}});if(H.length=0,H.push(...Xg0({discoveredTools:U,executedResults:z.toolResults})),Z=z.agentSummary,z.toolResults.some((D)=>!D.success))X="failed";if(z.unexecutedTools.length>0){if(X="failed",!K)K=`Agent skipped ${z.unexecutedTools.length} tool(s): ${z.unexecutedTools.join(", ")}`}}else if(Y.monitorConfig.monitorMode!=="health_check"){for(let z=0;z<U.length;z++){let D=U[z];if(!D||Y.signal.aborted)throw Error("Run cancelled");let L=Date.now();try{let w={},E=await kk($.callTool({name:D.name,arguments:w}),Y.monitorConfig.perToolTimeoutMs,`tool ${D.name}`),T=!E.isError,C=Date.now()-L;Jg0(H,{toolName:D.name,success:T,input:w,durationMs:C,outputPreview:$g0(E.structuredContent??E.content),error:T?null:Ua(E.content?.find((P)=>P.type==="text")?.text?.slice(0,300)??"Tool returned error")}),await F()}catch(w){let E=Date.now()-L,T=w instanceof Error?w.message:String(w);Jg0(H,{toolName:D.name,success:!1,durationMs:E,error:Ua(T)}),await F()}}if(H.some((z)=>!z.success))X="failed"}else for(let z of U)H.push(Hz1(z.name));if(Y.canApplyFailureAction&&X==="failed"&&Y.monitorConfig.onFailure!=="none")W=await gb6({organizationId:Y.organizationId,item:Y.item,action:Y.monitorConfig.onFailure})}catch(V){if(K=V instanceof Error?V.message:String(V),Sb6(V))X="needs_auth",await v4().monitorConnections.updateAuthStatus(Y.organizationId,Y.item.id,"needs_auth");else X="error"}finally{await $?.close?.().catch(()=>{})}return{status:X,connectionOk:J,toolsListed:G,toolResults:H,agentSummary:Z,errorMessage:K,actionTaken:W,durationMs:Date.now()-Q}}async function mb6(Y){let Q=Date.now(),X=v4(),G=(await X.items.list(Y.organizationId,{includeUnlisted:!0})).items.filter((B)=>{if(Y.monitorConfig.testPublicOnly&&!B.is_public)return!1;if(Y.monitorConfig.testPrivateOnly&&B.is_public)return!1;return!0}),K=Y.monitorConfig.includePendingRequests?(await X.publishRequests.list(Y.organizationId,{status:"pending",limit:500})).items.map((B)=>lb6(B)):[],W=[...G.map((B)=>({item:B,source:"registry_item"})),...K.map((B)=>({item:B,source:"publish_request"}))];if(W.length===0){await X.monitorRuns.update(Y.organizationId,Y.runId,{total_items:0,status:"completed",started_at:new Date().toISOString(),finished_at:new Date().toISOString()}),await qa({ctx:Y.ctx,type:"registry.monitor.completed",subject:Y.runId,data:{runId:Y.runId,total:0}});return}await X.monitorRuns.update(Y.organizationId,Y.runId,{total_items:W.length,status:"running",started_at:new Date().toISOString()});let Z=0,H=0,$=0,F=0;for(let B=0;B<W.length;B++){let U=W[B],z=U?.item;if(!z||Y.signal.aborted){await X.monitorRuns.update(Y.organizationId,Y.runId,{status:"cancelled",current_item_id:null,finished_at:new Date().toISOString()});return}await X.monitorRuns.update(Y.organizationId,Y.runId,{current_item_id:z.id});let D=null,L=async(E)=>{if(!D){D=(await X.monitorResults.create({run_id:Y.runId,organization_id:Y.organizationId,item_id:z.id,item_title:z.title,status:E.status,error_message:E.errorMessage,connection_ok:E.connectionOk,tools_listed:E.toolsListed,tool_results:E.toolResults,agent_summary:E.agentSummary,duration_ms:E.durationMs,action_taken:E.actionTaken})).id;return}await X.monitorResults.update(Y.organizationId,D,{status:E.status,error_message:E.errorMessage,connection_ok:E.connectionOk,tools_listed:E.toolsListed,tool_results:E.toolResults,agent_summary:E.agentSummary,duration_ms:E.durationMs,action_taken:E.actionTaken})},w=await ub6({ctx:Y.ctx,organizationId:Y.organizationId,item:z,monitorConfig:Y.monitorConfig,signal:Y.signal,canApplyFailureAction:U.source==="registry_item",onProgress:L});if(await L({status:w.status,connectionOk:w.connectionOk,toolsListed:w.toolsListed,toolResults:w.toolResults,agentSummary:w.agentSummary,errorMessage:w.errorMessage,actionTaken:w.actionTaken,durationMs:w.durationMs}),Z+=1,w.status==="passed")H+=1;else if(w.status==="failed"||w.status==="error")$+=1;else F+=1;if(await X.monitorRuns.update(Y.organizationId,Y.runId,{tested_items:Z,passed_items:H,failed_items:$,skipped_items:F}),w.status==="failed"||w.status==="error")await qa({ctx:Y.ctx,type:"registry.monitor.item_failed",subject:z.id,data:{runId:Y.runId,itemId:z.id,itemTitle:z.title,status:w.status,errorMessage:w.errorMessage,actionTaken:w.actionTaken}})}let V=Date.now()-Q;await X.monitorRuns.update(Y.organizationId,Y.runId,{status:"completed",current_item_id:null,finished_at:new Date().toISOString()}),await qa({ctx:Y.ctx,type:"registry.monitor.completed",subject:Y.runId,data:{runId:Y.runId,total:Z,passed:H,failed:$,skipped:F,durationMs:V}})}function lb6(Y){return{id:`${tq}${Y.id}`,title:Y.title,description:Y.description,_meta:Y._meta,server:Y.server,is_public:!1,is_unlisted:!0,created_at:Y.created_at,updated_at:Y.updated_at}}async function db6(Y,Q){let X=Hg0(Y);await X.access.check();let J=v4(),G=await J.monitorRuns.create({organization_id:X.organization.id,status:"pending",config_snapshot:Q,started_at:null}),K=new AbortController;return Ba.set(G.id,K),mb6({ctx:X,runId:G.id,organizationId:X.organization.id,monitorConfig:Q,signal:K.signal}).catch(async(W)=>{await J.monitorRuns.update(X.organization.id,G.id,{status:"failed",current_item_id:null,finished_at:new Date().toISOString()}).catch(()=>{}),await qa({ctx:X,type:"registry.monitor.failed",subject:G.id,data:{runId:G.id,error:W instanceof Error?W.message:String(W)}}),Cb6(`Run ${G.id} failed with uncaught error:`,W)}).finally(()=>{Ba.delete(G.id)}),{run:{id:G.id}}}var Ba,Zg0="[MONITOR-AGENT]",Pb6,Eb6="health_check: not called",qg0;var za=S(()=>{QY();tZ();uD();_W();Z9();Ba=new Map,Pb6=xS0;qg0={name:"REGISTRY_MONITOR_RUN_START",description:"Start an MCP registry monitor run with an isolated set of monitor connections.",inputSchema:cx0,outputSchema:nx0,handler:async(Y,Q)=>{let J=Fa(Y.config??{}),{run:G}=await db6(Q,J),W=await v4().monitorRuns.findById(Hg0(Q).organization.id,G.id);if(!W)throw Error(`Failed to load monitor run ${G.id}`);return{run:W}}}});var Bg0;var Ug0=S(()=>{_W();Z9();Bg0={name:"REGISTRY_MONITOR_RUN_LIST",description:"List MCP registry monitor runs",inputSchema:Yz1,outputSchema:ax0,handler:Z6(Yz1,async(Y,Q)=>{return v4().monitorRuns.list(Q.organization.id,Y)})}});var zg0;var Dg0=S(()=>{_W();Z9();zg0={name:"REGISTRY_MONITOR_RUN_GET",description:"Get details for one MCP registry monitor run",inputSchema:Qz1,outputSchema:rx0,handler:Z6(Qz1,async(Y,Q)=>{return{run:await v4().monitorRuns.findById(Q.organization.id,Y.runId)}})}});var Og0;var Ng0=S(()=>{_W();za();Z9();Og0={name:"REGISTRY_MONITOR_RUN_CANCEL",description:"Cancel a running MCP registry monitor run",inputSchema:eU1,outputSchema:ix0,handler:Z6(eU1,async(Y,Q)=>{return Kg0(Y.runId),{run:await v4().monitorRuns.update(Q.organization.id,Y.runId,{status:"cancelled",current_item_id:null,finished_at:new Date().toISOString()})}})}});var Lg0;var Mg0=S(()=>{_W();Z9();Lg0={name:"REGISTRY_MONITOR_RESULT_LIST",description:"List results for a given MCP registry monitor run",inputSchema:Xz1,outputSchema:ox0,handler:Z6(Xz1,async(Y,Q)=>{return v4().monitorResults.listByRun(Q.organization.id,Y.runId,{status:Y.status,limit:Y.limit,offset:Y.offset})})}});var wg0;var Ag0=S(()=>{_W();Z9();uD();wg0={name:"REGISTRY_MONITOR_CONNECTION_LIST",description:"List monitor connection mappings for private registry MCP monitor runs, including auth status",inputSchema:Jz1,outputSchema:sx0,handler:Z6(Jz1,async(Y,Q)=>{let X=v4(),J=await X.monitorConnections.list(Q.organization.id);return{items:await Promise.all(J.map(async(K)=>{let W=await X.items.findById(Q.organization.id,K.item_id);if(!W&&K.item_id.startsWith(tq)){let $=K.item_id.slice(tq.length),F=await X.publishRequests.findById(Q.organization.id,$);if(F)W={id:K.item_id,title:F.title,description:F.description,_meta:F._meta,server:F.server,is_public:!1,is_unlisted:!0,created_at:F.created_at,updated_at:F.updated_at}}let Z=W?.server.remotes?.find(($)=>$.url)?.url??null,H=K.item_id.startsWith(tq)?"request":"store";return{mapping:K,item:W,remoteUrl:Z,source:H}}))}})}});function pb6(Y){return{id:`${tq}${Y.id}`,title:Y.title,description:Y.description,_meta:Y._meta,server:Y.server,is_public:!1,is_unlisted:!0,created_at:Y.created_at,updated_at:Y.updated_at}}var Pg0;var Eg0=S(()=>{_W();za();Z9();uD();Pg0={name:"REGISTRY_MONITOR_CONNECTION_SYNC",description:"Ensure every registry item has a dedicated monitor connection mapping for MCP monitors",inputSchema:Gz1,outputSchema:tx0,handler:Z6(Gz1,async(Y,Q)=>{let X=v4(),J=(await X.items.list(Q.organization.id,{includeUnlisted:!0})).items,K=(await X.publishRequests.list(Q.organization.id,{status:"pending",limit:500})).items.map(pb6),W=[...J,...K],Z=await X.monitorConnections.list(Q.organization.id),H=new Set(Z.map((F)=>F.item_id)),$=0;for(let F of W){if(!F.server.remotes?.some((V)=>V.url))continue;if(await $z1(Q,F),!H.has(F.id))$+=1}return{created:$,updated:Math.max(W.length-$,0)}})}});var Tg0;var Cg0=S(()=>{_W();Z9();Tg0={name:"REGISTRY_MONITOR_CONNECTION_UPDATE_AUTH",description:"Update the auth_status of a monitor connection mapping (by core connection ID)",inputSchema:Wz1,outputSchema:ex0,handler:Z6(Wz1,async({connectionId:Y,authStatus:Q},X)=>{let J=v4(),G=X.organization.id,K=await J.monitorConnections.findByConnectionId(G,Y);if(!K)throw Error(`No monitor connection mapping found for connection ${Y}`);return await J.monitorConnections.updateAuthStatus(G,K.item_id,Q),{success:!0}})}});function vk(Y){if(!Y||typeof Y!=="object")return null;let Q=Y,X=Q.id;if(typeof X==="string"&&X.length>0)return X;for(let J of["event","result","structuredContent","content"]){let G=Q[J],K=vk(G);if(K)return K}if(Array.isArray(Y))for(let J of Y){let G=vk(J);if(G)return G}return null}var Rg0;var Ig0=S(()=>{QY();_W();Z9();Rg0={name:"REGISTRY_MONITOR_SCHEDULE_SET",description:"Schedule recurring MCP monitor runs via EVENT_PUBLISH cron",inputSchema:Zz1,outputSchema:Yg0,handler:Z6(Zz1,async(Y,Q)=>{let X=IY.SELF(Q.organization.id),J=await Q.createMCPProxy(X);try{let G=await J.callTool({name:"EVENT_PUBLISH",arguments:{type:"registry.monitor.scheduled",subject:"private-registry",cron:Y.cronExpression,data:{config:Y.config??{}}}});if(G.isError)throw Error("Failed to create monitor schedule via EVENT_PUBLISH");let K=vk(G.structuredContent)??vk(G.content)??vk(G);if(!K)throw Error("Could not resolve schedule event id from EVENT_PUBLISH");return{scheduleEventId:K}}finally{await J.close?.().catch(()=>{})}})}});var jg0;var Sg0=S(()=>{QY();_W();Z9();jg0={name:"REGISTRY_MONITOR_SCHEDULE_CANCEL",description:"Cancel a recurring MCP monitor schedule via EVENT_CANCEL",inputSchema:Kz1,outputSchema:Qg0,handler:Z6(Kz1,async(Y,Q)=>{let X=IY.SELF(Q.organization.id),J=await Q.createMCPProxy(X);try{if((await J.callTool({name:"EVENT_CANCEL",arguments:{eventId:Y.scheduleEventId}})).isError)throw Error("Failed to cancel monitor schedule via EVENT_CANCEL");return{success:!0}}finally{await J.close?.().catch(()=>{})}})}});function cb6(Y,Q){if(!Q)return Y;let X={field:["is_public"],operator:"eq",value:!1};if(!Y)return X;return{operator:"and",conditions:[Y,X]}}function nb6(Y){let Q=new Map,X=new Map;for(let G of Y){let K=G._meta?.["mcp.mesh"];for(let W of K?.tags??[])Q.set(W,(Q.get(W)??0)+1);for(let W of K?.categories??[])X.set(W,(X.get(W)??0)+1)}let J=(G)=>Array.from(G.entries()).map(([K,W])=>({value:K,count:W})).sort((K,W)=>K.value.localeCompare(W.value));return{tags:J(Q),categories:J(X)}}var kg0,vg0,_g0,yg0;var fg0=S(()=>{l1();cY();Z9();kg0={name:"COLLECTION_REGISTRY_APP_LIST",description:"List registry items for Store discovery. Supports private-only mode from plugin settings.",inputSchema:eq,outputSchema:jA,handler:Z6(eq,async(Y,Q)=>{let X=v4(),J=await $k(Q,Q.organization.id);return X.items.list(Q.organization.id,{...Y,where:cb6(Y.where,J.storePrivateOnly===!0)})})},vg0={name:"COLLECTION_REGISTRY_APP_GET",description:"Get a registry item for Store details. Respects private-only mode from plugin settings.",inputSchema:AG,outputSchema:cD,handler:Z6(AG,async(Y,Q)=>{let X=v4(),J=await $k(Q,Q.organization.id),G=Y.id??Y.name;if(!G)return{item:null};let K=await X.items.findByIdOrName(Q.organization.id,G);if(!K)return{item:null};if(J.storePrivateOnly&&K.is_public)return{item:null};return{item:K}})},_g0={name:"COLLECTION_REGISTRY_APP_VERSIONS",description:"Get registry item versions for Store details. Respects private-only mode from plugin settings.",inputSchema:AG,outputSchema:q.object({versions:q.array(pZ)}),handler:Z6(AG,async(Y,Q)=>{let X=v4(),J=await $k(Q,Q.organization.id),G=Y.id??Y.name;if(!G)return{versions:[]};let K=await X.items.findByIdOrName(Q.organization.id,G);if(!K)return{versions:[]};if(J.storePrivateOnly&&K.is_public)return{versions:[]};return{versions:[K]}})},yg0={name:"COLLECTION_REGISTRY_APP_FILTERS",description:"List Store filter facets for registry items. Respects private-only mode from plugin settings.",inputSchema:q.object({}),outputSchema:SA,handler:Z6(q.object({}),async(Y,Q)=>{let X=v4();if(!(await $k(Q,Q.organization.id)).storePrivateOnly)return X.items.getFilters(Q.organization.id);let G=await X.items.list(Q.organization.id,{limit:1e4,where:{field:["is_public"],operator:"eq",value:!1}});return nb6(G.items)})}});var bg0;var hg0=S(()=>{Iv0();Sv0();vv0();yv0();k_0();__0();f_0();h_0();g_0();m_0();d_0();c_0();i_0();r_0();s_0();e_0();Qy0();Jy0();za();Ug0();Dg0();Ng0();Mg0();Ag0();Eg0();Cg0();Ig0();Sg0();fg0();bg0=[kg0,vg0,_g0,yg0,b_0,x_0,y_0,l_0,kv0,Rv0,u_0,_v0,v_0,S_0,jv0,p_0,n_0,a_0,o_0,t_0,Yy0,Xy0,qg0,Bg0,zg0,Og0,Lg0,wg0,Pg0,Tg0,Rg0,jg0]});var xg0;var gg0=S(()=>{uD();Yk0();Lv0();Cv0();hg0();_W();xg0={id:dH,description:hS0,tools:bg0,migrations:eS0,publicRoutes:(Y,Q)=>{LB1(Y,Q),DB1(Y,Q)},createStorage:Tv0,onEvents:{types:["registry.monitor.scheduled"],handler:async(Y,Q)=>{let X=await Q.createMCPProxy(Q.connectionId);try{for(let J of Y){if(J.type!=="registry.monitor.scheduled")continue;let G=J.data&&typeof J.data==="object"?J.data:{},K=G.config&&typeof G.config==="object"?G.config:{},W=Fa(K);await X.callTool({name:"REGISTRY_MONITOR_RUN_START",arguments:{config:W}})}}finally{await X.close()}}}}});var Da="user-sandbox",ug0="Create embeddable integration flows for platform end-users";import{sql as _k}from"kysely";var mg0;var lg0=S(()=>{mg0={name:"001-user-sandbox",async up(Y){await Y.schema.createTable("user_sandbox").addColumn("id","text",(Q)=>Q.primaryKey()).addColumn("organization_id","text",(Q)=>Q.notNull().references("organization.id").onDelete("cascade")).addColumn("title","text",(Q)=>Q.notNull()).addColumn("description","text").addColumn("icon","text").addColumn("required_apps","text",(Q)=>Q.notNull()).addColumn("redirect_url","text").addColumn("webhook_url","text").addColumn("event_type","text",(Q)=>Q.notNull().defaultTo("integration.completed")).addColumn("agent_title_template","text",(Q)=>Q.notNull().defaultTo("Agent for {{externalUserId}}")).addColumn("agent_instructions","text").addColumn("tool_selection_mode","text",(Q)=>Q.notNull().defaultTo("inclusion")).addColumn("status","text",(Q)=>Q.notNull().defaultTo("active")).addColumn("created_at","text",(Q)=>Q.notNull().defaultTo(_k`CURRENT_TIMESTAMP`)).addColumn("updated_at","text",(Q)=>Q.notNull().defaultTo(_k`CURRENT_TIMESTAMP`)).addColumn("created_by","text",(Q)=>Q.references("user.id").onDelete("set null")).execute(),await Y.schema.createIndex("idx_user_sandbox_org").on("user_sandbox").column("organization_id").execute(),await Y.schema.createTable("user_sandbox_sessions").addColumn("id","text",(Q)=>Q.primaryKey()).addColumn("template_id","text",(Q)=>Q.notNull().references("user_sandbox.id").onDelete("cascade")).addColumn("organization_id","text",(Q)=>Q.notNull().references("organization.id").onDelete("cascade")).addColumn("external_user_id","text",(Q)=>Q.notNull()).addColumn("status","text",(Q)=>Q.notNull().defaultTo("pending")).addColumn("app_statuses","text",(Q)=>Q.notNull().defaultTo("{}")).addColumn("created_agent_id","text",(Q)=>Q.references("connections.id").onDelete("set null")).addColumn("redirect_url","text").addColumn("created_at","text",(Q)=>Q.notNull().defaultTo(_k`CURRENT_TIMESTAMP`)).addColumn("updated_at","text",(Q)=>Q.notNull().defaultTo(_k`CURRENT_TIMESTAMP`)).addColumn("expires_at","text",(Q)=>Q.notNull()).execute(),await Y.schema.createIndex("idx_user_sandbox_sessions_template").on("user_sandbox_sessions").column("template_id").execute(),await Y.schema.createIndex("idx_user_sandbox_sessions_external_user").on("user_sandbox_sessions").columns(["template_id","external_user_id"]).execute(),await Y.schema.createIndex("idx_user_sandbox_sessions_org").on("user_sandbox_sessions").column("organization_id").execute(),await Y.schema.createTable("user_sandbox_agents").addColumn("id","text",(Q)=>Q.primaryKey()).addColumn("user_sandbox_id","text",(Q)=>Q.notNull().references("user_sandbox.id").onDelete("cascade")).addColumn("external_user_id","text",(Q)=>Q.notNull()).addColumn("connection_id","text",(Q)=>Q.notNull().references("connections.id").onDelete("cascade")).addColumn("created_at","text",(Q)=>Q.notNull().defaultTo(_k`CURRENT_TIMESTAMP`)).execute(),await Y.schema.createIndex("idx_user_sandbox_agents_unique").on("user_sandbox_agents").columns(["user_sandbox_id","external_user_id"]).unique().execute(),await Y.schema.createIndex("idx_user_sandbox_agents_connection").on("user_sandbox_agents").column("connection_id").execute()},async down(Y){await Y.schema.dropIndex("idx_user_sandbox_agents_connection").ifExists().execute(),await Y.schema.dropIndex("idx_user_sandbox_agents_unique").ifExists().execute(),await Y.schema.dropIndex("idx_user_sandbox_sessions_org").ifExists().execute(),await Y.schema.dropIndex("idx_user_sandbox_sessions_external_user").ifExists().execute(),await Y.schema.dropIndex("idx_user_sandbox_sessions_template").ifExists().execute(),await Y.schema.dropIndex("idx_user_sandbox_org").ifExists().execute(),await Y.schema.dropTable("user_sandbox_agents").ifExists().execute(),await Y.schema.dropTable("user_sandbox_sessions").ifExists().execute(),await Y.schema.dropTable("user_sandbox").ifExists().execute()}}});var dg0;var pg0=S(()=>{lg0();dg0=[mg0]});function Oa(Y){let Q=Date.now().toString(36),X=crypto.randomUUID().replace(/-/g,"").substring(0,8);return`${Y}_${Q}${X}`}class yk{db;constructor(Y){this.db=Y}async create(Y){let Q=Oa("usb"),X=new Date().toISOString(),J={id:Q,organization_id:Y.organization_id,title:Y.title,description:Y.description??null,icon:Y.icon??null,required_apps:JSON.stringify(Y.required_apps),redirect_url:Y.redirect_url??null,webhook_url:Y.webhook_url??null,event_type:Y.event_type??"integration.completed",agent_title_template:Y.agent_title_template??"{{externalUserId}}'s Agent",agent_instructions:Y.agent_instructions??null,tool_selection_mode:Y.tool_selection_mode??"inclusion",status:"active",created_at:X,updated_at:X,created_by:Y.created_by??null};await this.db.insertInto("user_sandbox").values(J).execute();let G=await this.findById(Q);if(!G)throw Error(`Failed to create user sandbox with id: ${Q}`);return G}async findById(Y){let Q=await this.db.selectFrom("user_sandbox").selectAll().where("id","=",Y).executeTakeFirst();if(!Q)return null;return this.deserialize(Q)}async list(Y){return(await this.db.selectFrom("user_sandbox").selectAll().where("organization_id","=",Y).orderBy("created_at","desc").execute()).map((X)=>this.deserialize(X))}async update(Y,Q){let J={updated_at:new Date().toISOString()};if(Q.title!==void 0)J.title=Q.title;if(Q.description!==void 0)J.description=Q.description;if(Q.icon!==void 0)J.icon=Q.icon;if(Q.required_apps!==void 0)J.required_apps=JSON.stringify(Q.required_apps);if(Q.redirect_url!==void 0)J.redirect_url=Q.redirect_url;if(Q.webhook_url!==void 0)J.webhook_url=Q.webhook_url;if(Q.event_type!==void 0)J.event_type=Q.event_type;if(Q.agent_title_template!==void 0)J.agent_title_template=Q.agent_title_template;if(Q.agent_instructions!==void 0)J.agent_instructions=Q.agent_instructions;if(Q.tool_selection_mode!==void 0)J.tool_selection_mode=Q.tool_selection_mode;if(Q.status!==void 0)J.status=Q.status;await this.db.updateTable("user_sandbox").set(J).where("id","=",Y).execute();let G=await this.findById(Y);if(!G)throw Error(`Template not found after update: ${Y}`);return G}async delete(Y){await this.db.deleteFrom("user_sandbox").where("id","=",Y).execute()}deserialize(Y){let Q=[];try{Q=JSON.parse(Y.required_apps)}catch{Q=[]}return{id:Y.id,organization_id:Y.organization_id,title:Y.title,description:Y.description,icon:Y.icon,required_apps:Q,redirect_url:Y.redirect_url,webhook_url:Y.webhook_url,event_type:Y.event_type,agent_title_template:Y.agent_title_template,agent_instructions:Y.agent_instructions,tool_selection_mode:Y.tool_selection_mode,status:Y.status,created_at:Y.created_at,updated_at:Y.updated_at,created_by:Y.created_by}}}var Fz1=()=>{};class fk{db;constructor(Y){this.db=Y}async create(Y){let Q=Oa("sandbox_session"),X=new Date().toISOString(),J={id:Q,template_id:Y.template_id,organization_id:Y.organization_id,external_user_id:Y.external_user_id,status:"pending",app_statuses:"{}",created_agent_id:Y.created_agent_id??null,redirect_url:Y.redirect_url??null,created_at:X,updated_at:X,expires_at:Y.expires_at};await this.db.insertInto("user_sandbox_sessions").values(J).execute();let G=await this.findById(Q);if(!G)throw Error(`Failed to create session with id: ${Q}`);return G}async findById(Y){let Q=await this.db.selectFrom("user_sandbox_sessions").selectAll().where("id","=",Y).executeTakeFirst();if(!Q)return null;return this.deserialize(Q)}async findExisting(Y,Q){let X=new Date().toISOString(),J=await this.db.selectFrom("user_sandbox_sessions").selectAll().where("template_id","=",Y).where("external_user_id","=",Q).where("expires_at",">",X).where("status","!=","completed").orderBy("created_at","desc").executeTakeFirst();if(!J)return null;return this.deserialize(J)}async listByTemplate(Y){return(await this.db.selectFrom("user_sandbox_sessions").selectAll().where("template_id","=",Y).orderBy("created_at","desc").execute()).map((X)=>this.deserialize(X))}async listByOrganization(Y){return(await this.db.selectFrom("user_sandbox_sessions").selectAll().where("organization_id","=",Y).orderBy("created_at","desc").execute()).map((X)=>this.deserialize(X))}async update(Y,Q){let J={updated_at:new Date().toISOString()};if(Q.status!==void 0)J.status=Q.status;if(Q.app_statuses!==void 0)J.app_statuses=JSON.stringify(Q.app_statuses);if(Q.created_agent_id!==void 0)J.created_agent_id=Q.created_agent_id;await this.db.updateTable("user_sandbox_sessions").set(J).where("id","=",Y).execute();let G=await this.findById(Y);if(!G)throw Error(`Session not found after update: ${Y}`);return G}async delete(Y){await this.db.deleteFrom("user_sandbox_sessions").where("id","=",Y).execute()}async deleteExpired(){let Y=new Date().toISOString(),Q=await this.db.deleteFrom("user_sandbox_sessions").where("expires_at","<",Y).where("status","!=","completed").executeTakeFirst();return Number(Q.numDeletedRows??0)}async deleteByExternalUserId(Y,Q){let X=await this.db.deleteFrom("user_sandbox_sessions").where("organization_id","=",Y).where("external_user_id","=",Q).executeTakeFirst();return Number(X.numDeletedRows??0)}deserialize(Y){let Q={};try{Q=JSON.parse(Y.app_statuses)}catch{Q={}}return{id:Y.id,template_id:Y.template_id,organization_id:Y.organization_id,external_user_id:Y.external_user_id,status:Y.status,app_statuses:Q,created_agent_id:Y.created_agent_id,redirect_url:Y.redirect_url,created_at:Y.created_at,updated_at:Y.updated_at,expires_at:Y.expires_at}}}var Vz1=()=>{};function bk(Y){qz1=Y}function bJ(){if(!qz1)throw Error(`Plugin storage not initialized. Make sure the "${Da}" plugin is enabled.`);return qz1}function Bz1(){return process.env.BASE_URL||"http://localhost:3000"}var qz1=null;var eZ=()=>{};function cg0(Y){let Q=Y.db,X={templates:new yk(Q),sessions:new fk(Q)};return bk(X),X}var ng0=S(()=>{Fz1();Vz1();eZ()});var ib6,ab6,rb6,ob6,sb6,ZB,tb6,ig0,ag0,rg0,og0,sg0,tg0,eg0,Yu0,Qu0,Xu0,Ju0,eb6,Gu0,Wu0,Zu0;var tH=S(()=>{l1();ib6=q.object({authorizationEndpoint:q.string().describe("OAuth authorization endpoint URL"),tokenEndpoint:q.string().describe("OAuth token endpoint URL"),clientId:q.string().describe("OAuth client ID"),scopes:q.array(q.string()).describe("OAuth scopes to request"),grantType:q.enum(["authorization_code","client_credentials"]).describe("OAuth grant type")}),ab6=q.object({headers:q.record(q.string(),q.string()).optional().describe("HTTP headers")}),rb6=q.object({command:q.string().describe("Command to run"),args:q.array(q.string()).optional().describe("Command arguments"),cwd:q.string().optional().describe("Working directory"),envVars:q.record(q.string(),q.string()).optional().describe("Environment variables")}),ob6=q.object({app_name:q.string().describe("App name from registry (e.g., '@deco/gmail')"),title:q.string().describe("Display title for the app"),description:q.string().nullable().optional().describe("App description"),icon:q.string().nullable().optional().describe("Icon URL"),connection_type:q.enum(["HTTP","SSE","Websocket","STDIO"]).describe("Connection type"),connection_url:q.string().nullable().optional().describe("MCP server URL"),connection_headers:q.union([ab6,rb6]).nullable().optional().describe("Connection parameters"),oauth_config:ib6.nullable().optional().describe("OAuth configuration if required"),selected_tools:q.array(q.string()).nullable().optional().describe("Selected tools to expose (null = all)"),selected_resources:q.array(q.string()).nullable().optional().describe("Selected resources to expose (null = all)"),selected_prompts:q.array(q.string()).nullable().optional().describe("Selected prompts to expose (null = all)")}),sb6=q.object({configured:q.boolean().describe("Whether the app has been configured"),connection_id:q.string().nullable().describe("Connection ID if created"),error:q.string().nullable().describe("Error message if configuration failed")}),ZB=q.object({id:q.string(),organization_id:q.string(),title:q.string(),description:q.string().nullable(),icon:q.string().nullable(),required_apps:q.array(ob6),redirect_url:q.string().nullable(),webhook_url:q.string().nullable(),event_type:q.string(),agent_title_template:q.string(),agent_instructions:q.string().nullable(),tool_selection_mode:q.enum(["inclusion","exclusion"]),status:q.enum(["active","inactive"]),created_at:q.string(),updated_at:q.string(),created_by:q.string().nullable()}),tb6=q.object({id:q.string(),template_id:q.string(),organization_id:q.string(),external_user_id:q.string(),status:q.enum(["pending","in_progress","completed"]),app_statuses:q.record(q.string(),sb6),created_agent_id:q.string().nullable(),redirect_url:q.string().nullable(),created_at:q.string(),updated_at:q.string(),expires_at:q.string()}),ig0=q.object({app_name:q.string().describe("App name from registry (e.g., '@deco/openrouter')"),selected_tools:q.array(q.string()).nullable().optional().describe("Selected tools to expose (null = all)"),selected_resources:q.array(q.string()).nullable().optional().describe("Selected resources to expose (null = all)"),selected_prompts:q.array(q.string()).nullable().optional().describe("Selected prompts to expose (null = all)")}),ag0=q.object({title:q.string().describe("Title for the template"),description:q.string().optional().describe("Optional description"),icon:q.string().optional().describe("Optional icon URL"),registry_id:q.string().describe("Connection ID of the registry to look up apps from"),required_apps:q.array(ig0).describe("Apps to include - only app_name required, details fetched from registry"),redirect_url:q.string().optional().describe("URL to redirect to after completion"),webhook_url:q.string().optional().describe("Webhook URL to call on completion"),event_type:q.string().optional().describe("Event type to emit (default: integration.completed)"),agent_title_template:q.string().optional().describe("Template for agent title (supports {{externalUserId}})"),agent_instructions:q.string().optional().describe("Instructions for the created agent"),tool_selection_mode:q.enum(["inclusion","exclusion"]).optional().describe("Tool selection mode for the agent")}),rg0=q.object({id:q.string().describe("Template ID to update"),title:q.string().optional(),description:q.string().nullable().optional(),icon:q.string().nullable().optional(),registry_id:q.string().optional().describe("Connection ID of the registry (required if updating required_apps)"),required_apps:q.array(ig0).optional().describe("Updated apps (details will be fetched from registry)"),redirect_url:q.string().nullable().optional(),webhook_url:q.string().nullable().optional(),event_type:q.string().optional(),agent_title_template:q.string().optional(),agent_instructions:q.string().nullable().optional(),tool_selection_mode:q.enum(["inclusion","exclusion"]).optional(),status:q.enum(["active","inactive"]).optional()}),og0=q.object({id:q.string().describe("Template ID")}),sg0=q.object({}),tg0=q.object({id:q.string().describe("Template ID to delete")}),eg0=q.object({templateId:q.string().describe("Template ID"),externalUserId:q.string().describe("External user ID from your platform"),expiresInSeconds:q.number().optional().describe("Session expiration in seconds (default: 7 days)")}),Yu0=q.object({sessionId:q.string().describe("Session ID"),url:q.string().describe("URL for the connect flow"),expiresAt:q.string().describe("Session expiration time"),agentId:q.string().nullable().optional().describe("Virtual MCP ID for this user (unique per template + user)"),created:q.boolean().describe("Whether the agent was newly created (true) or already existed (false)")}),Qu0=q.object({templateId:q.string().optional().describe("Filter by template ID")}),Xu0=q.object({sessions:q.array(tb6)}),Ju0=q.object({externalUserId:q.string().describe("External user ID to find agents for")}),eb6=q.object({id:q.string().describe("Agent (Virtual MCP) ID"),title:q.string(),external_user_id:q.string(),template_id:q.string().nullable(),created_at:q.string()}),Gu0=q.object({agents:q.array(eb6)}),Wu0=q.object({externalUserId:q.string().describe("External user ID whose session data should be cleared")}),Zu0=q.object({success:q.boolean(),deletedAgents:q.number().describe("Number of agents (Virtual MCPs) deleted"),deletedConnections:q.number().describe("Number of child connections deleted"),deletedSessions:q.number().describe("Number of sessions deleted")})});function Qh6(Y){if(!Y?.url)return null;try{let Q=new URL(Y.url);if(Q.hostname==="github.com"){let X=Q.pathname.split("/").filter(Boolean);if(X.length>=1)return`https://github.com/${X[0]}.png`}}catch{}return null}function Xh6(Y){return Y.find((X)=>X.name.endsWith("_LIST"))?.name??null}function Jh6(Y){if(!Y)return[];if(Array.isArray(Y))return Y;if(typeof Y==="object"&&Y!==null){let Q=Object.keys(Y).find((X)=>Array.isArray(Y[X]));if(Q)return Y[Q]}return[]}function Gh6(Y,Q,X,J){let G=Y.server,K=Y._meta?.["mcp.mesh"],W=K?.friendlyName||K?.friendly_name||Y.title||G?.title||G?.name||"Unnamed MCP Server",Z=G?.description||null,H=G?.icons?.[0]?.src||Qh6(G?.repository)||null,$=K?.oauth_config,F=$&&typeof $.authorizationEndpoint==="string"&&typeof $.tokenEndpoint==="string"&&typeof $.clientId==="string"&&Array.isArray($.scopes)&&($.grantType==="authorization_code"||$.grantType==="client_credentials")?{authorizationEndpoint:$.authorizationEndpoint,tokenEndpoint:$.tokenEndpoint,clientId:$.clientId,scopes:$.scopes,grantType:$.grantType}:null,V=G?.packages??[],B=G?.remotes??[],U,z,D=null,L=B[0],w=V[0];if(L){if(U=Yh6[L.type??""]??L.type?.toUpperCase()??"HTTP",z=L.url??null,L.headers&&L.headers.length>0){let E={};for(let T of L.headers)if(T.name&&T.value)E[T.name]=T.value;if(Object.keys(E).length>0)D={headers:E}}}else if(w){U="STDIO",z=null;let E=w.identifier||w.name,T={};if(w.environmentVariables){for(let C of w.environmentVariables)if(C.name)T[C.name]=""}D={command:"npx",args:E?["-y",E]:[],...Object.keys(T).length>0&&{envVars:T}}}else U="HTTP",z=null;return{title:W,description:Z,icon:H,connection_type:U,connection_url:z,connection_headers:D,oauth_config:F,selected_tools:Q,selected_resources:X,selected_prompts:J}}async function Wh6(Y,Q,X,J=null,G=null,K=null){let W=await Y.createMCPProxy(Q);try{let Z=await W.listTools(),H=Xh6(Z.tools);if(!H)throw Error(`Registry "${Q}" does not have a LIST tool`);let $=await W.callTool({name:H,arguments:{where:{appName:X}}}),F=$.structuredContent??$,B=Jh6(F)[0];if(!B)throw Error(`App "${X}" not found in registry "${Q}"`);let U=Gh6(B,J,G,K);return{app_name:X,...U}}finally{await W.close().catch(console.error)}}async function Na(Y,Q,X){let J=[];for(let G of X){let K=await Wh6(Y,Q,G.app_name,G.selected_tools??null,G.selected_resources??null,G.selected_prompts??null);J.push(K)}return J}var Yh6;var Uz1=S(()=>{Yh6={"streamable-http":"HTTP",http:"HTTP",sse:"SSE",stdio:"STDIO",websocket:"Websocket"}});var Ku0;var Hu0=S(()=>{tH();eZ();Uz1();Ku0={name:"USER_SANDBOX_CREATE",description:"Create a new user sandbox for platform integration flows. Specify apps by name and the system will automatically fetch connection details from the registry.",inputSchema:ag0,outputSchema:ZB,handler:async(Y,Q)=>{let X=Y,J=Q;if(!J.organization)throw Error("Organization context required");await J.access.check();let G=await Na(J,X.registry_id,X.required_apps.map((Z)=>({app_name:Z.app_name,selected_tools:Z.selected_tools??null,selected_resources:Z.selected_resources??null,selected_prompts:Z.selected_prompts??null})));return await bJ().templates.create({organization_id:J.organization.id,title:X.title,description:X.description??null,icon:X.icon??null,required_apps:G,redirect_url:X.redirect_url??null,webhook_url:X.webhook_url??null,event_type:X.event_type,agent_title_template:X.agent_title_template,agent_instructions:X.agent_instructions??null,tool_selection_mode:X.tool_selection_mode,created_by:J.auth.user?.id??null})}}});var $u0;var Fu0=S(()=>{tH();eZ();Uz1();$u0={name:"USER_SANDBOX_UPDATE",description:"Update an existing user sandbox. If updating required_apps, provide registry_id to auto-fetch details.",inputSchema:rg0,outputSchema:ZB,handler:async(Y,Q)=>{let X=Y,J=Q;if(!J.organization)throw Error("Organization context required");await J.access.check();let G=bJ(),K=await G.templates.findById(X.id);if(!K)throw Error(`Template not found: ${X.id}`);if(K.organization_id!==J.organization.id)throw Error("Access denied: template belongs to another organization");let W=void 0;if(X.required_apps&&X.required_apps.length>0){if(!X.registry_id)throw Error("registry_id is required when updating required_apps");W=await Na(J,X.registry_id,X.required_apps.map((H)=>({app_name:H.app_name,selected_tools:H.selected_tools??null,selected_resources:H.selected_resources??null,selected_prompts:H.selected_prompts??null})))}return await G.templates.update(X.id,{title:X.title,description:X.description,icon:X.icon,required_apps:W,redirect_url:X.redirect_url,webhook_url:X.webhook_url,event_type:X.event_type,agent_title_template:X.agent_title_template,agent_instructions:X.agent_instructions,tool_selection_mode:X.tool_selection_mode,status:X.status})}}});var Vu0;var qu0=S(()=>{l1();tH();eZ();Vu0={name:"USER_SANDBOX_DELETE",description:"Delete a user sandbox",inputSchema:tg0,outputSchema:q.object({success:q.boolean(),id:q.string()}),handler:async(Y,Q)=>{let X=Y,J=Q;if(!J.organization)throw Error("Organization context required");await J.access.check();let G=bJ(),K=await G.templates.findById(X.id);if(!K)throw Error(`Template not found: ${X.id}`);if(K.organization_id!==J.organization.id)throw Error("Access denied: template belongs to another organization");return await G.templates.delete(X.id),{success:!0,id:X.id}}}});var Bu0;var Uu0=S(()=>{l1();tH();eZ();Bu0={name:"USER_SANDBOX_LIST",description:"List all user sandbox in the organization",inputSchema:sg0,outputSchema:q.object({templates:q.array(ZB)}),handler:async(Y,Q)=>{let X=Q;if(!X.organization)throw Error("Organization context required");return await X.access.check(),{templates:await bJ().templates.list(X.organization.id)}}}});var zu0;var Du0=S(()=>{tH();eZ();zu0={name:"USER_SANDBOX_GET",description:"Get a user sandbox by ID",inputSchema:og0,outputSchema:ZB,handler:async(Y,Q)=>{let X=Y,J=Q;if(!J.organization)throw Error("Organization context required");await J.access.check();let K=await bJ().templates.findById(X.id);if(K&&K.organization_id!==J.organization.id)throw Error("Access denied: template belongs to another organization");return K}}});async function Ou0(Y,Q){let X=await Q.sessions.findById(Y);if(!X)throw new WF("Session not found","SESSION_NOT_FOUND");if(new Date(X.expires_at)<new Date)throw new WF("Session has expired","SESSION_EXPIRED");return X}async function Zh6(Y,Q){let X=await Ou0(Y,Q);if(X.status==="completed")throw new WF("Session is already completed. Create a new session to reconfigure.","SESSION_COMPLETED");return X}function Kh6(Y,Q){let X=Y.metadata;if(!X)throw new WF("Connection has no metadata","CONNECTION_ACCESS_DENIED");let J=X[KB.SESSION_ID]===Q.id,G=X[KB.EXTERNAL_USER_ID]===Q.external_user_id&&X[KB.TEMPLATE_ID]===Q.template_id;if(!J&&!G)throw new WF("Access denied: connection does not belong to this session","CONNECTION_ACCESS_DENIED")}function zz1(Y,Q,X){return{[KB.SESSION_ID]:Y,[KB.EXTERNAL_USER_ID]:Q,[KB.TEMPLATE_ID]:X,source:"user-sandbox"}}function Dz1(Y,Q){return{[KB.EXTERNAL_USER_ID]:Y,[KB.TEMPLATE_ID]:Q,source:"user-sandbox"}}async function WO(Y,Q,X){let J=X?.allowCompleted?await Ou0(Y,Q):await Zh6(Y,Q);if(X?.connection)Kh6(X.connection,J);return J}var KB,WF;var Nu0=S(()=>{KB={SESSION_ID:"user_sandbox_session_id",EXTERNAL_USER_ID:"user_sandbox_external_user_id",TEMPLATE_ID:"user_sandbox_id"};WF=class WF extends Error{code;constructor(Y,Q){super(Y);this.code=Q;this.name="SessionAccessError"}}});var Oz1=S(()=>{Nu0()});async function $h6(Y,Q,X,J,G,K,W,Z){let H=Y,$=await H.selectFrom("user_sandbox_agents").select("connection_id").where("user_sandbox_id","=",J).where("external_user_id","=",G).executeTakeFirst();if($)return{connectionId:$.connection_id,created:!1};let F=new Date().toISOString(),V=`usa_${Date.now().toString(36)}${crypto.randomUUID().replace(/-/g,"").substring(0,8)}`,B=`vir_${Date.now().toString(36)}${crypto.randomUUID().replace(/-/g,"").substring(0,8)}`;try{return await H.transaction().execute(async(U)=>{await U.insertInto("connections").values({id:B,organization_id:Q,created_by:X,title:K,description:W,icon:null,app_name:null,app_id:null,connection_type:"VIRTUAL",connection_url:`virtual://${B}`,connection_token:null,connection_headers:JSON.stringify({tool_selection_mode:Z}),oauth_config:null,configuration_state:null,configuration_scopes:null,metadata:JSON.stringify(Dz1(G,J)),tools:null,bindings:null,status:"active",created_at:F,updated_at:F}).execute(),await U.insertInto("user_sandbox_agents").values({id:V,user_sandbox_id:J,external_user_id:G,connection_id:B,created_at:F}).execute()}),{connectionId:B,created:!0}}catch(U){let z=String(U);if(z.includes("UNIQUE constraint")||z.includes("duplicate key")){let D=await H.selectFrom("user_sandbox_agents").select("connection_id").where("user_sandbox_id","=",J).where("external_user_id","=",G).executeTakeFirst();if(D)return{connectionId:D.connection_id,created:!1}}throw U}}var Hh6=604800,Lu0;var Mu0=S(()=>{tH();eZ();Oz1();Lu0={name:"USER_SANDBOX_CREATE_SESSION",description:"Create a connect session URL for an external user. Returns a URL that the user can visit to configure their integrations. Also creates a unique Virtual MCP (agent) for this user if one doesn't exist.",inputSchema:eg0,outputSchema:Yu0,handler:async(Y,Q)=>{let X=Y,J=Q;if(!J.organization)throw Error("Organization context required");await J.access.check();let G=bJ(),K=await G.templates.findById(X.templateId);if(!K)throw Error(`Template not found: ${X.templateId}`);if(K.organization_id!==J.organization.id)throw Error("Access denied: template belongs to another organization");if(K.status!=="active")throw Error("Template is not active");let W=K.agent_title_template.replace("{{externalUserId}}",X.externalUserId),Z=K.created_by??J.auth.user?.id??"system",{connectionId:H,created:$}=await $h6(J.db,J.organization.id,Z,K.id,X.externalUserId,W,K.agent_instructions,K.tool_selection_mode),F=await G.sessions.findExisting(X.templateId,X.externalUserId);if(F){if(!F.created_agent_id)await G.sessions.update(F.id,{created_agent_id:H});let D=Bz1();return{sessionId:F.id,url:`${D}/connect/${F.id}`,expiresAt:F.expires_at,agentId:F.created_agent_id??H,created:$}}let V=X.expiresInSeconds??Hh6,B=new Date(Date.now()+V*1000).toISOString(),U=await G.sessions.create({template_id:X.templateId,organization_id:J.organization.id,external_user_id:X.externalUserId,redirect_url:K.redirect_url,expires_at:B,created_agent_id:H}),z=Bz1();return{sessionId:U.id,url:`${z}/connect/${U.id}`,expiresAt:U.expires_at,agentId:H,created:$}}}});var wu0;var Au0=S(()=>{tH();eZ();wu0={name:"USER_SANDBOX_LIST_SESSIONS",description:"List connect sessions for monitoring and management",inputSchema:Qu0,outputSchema:Xu0,handler:async(Y,Q)=>{let X=Y,J=Q;if(!J.organization)throw Error("Organization context required");await J.access.check();let G=bJ(),K;if(X.templateId){let W=await G.templates.findById(X.templateId);if(!W)throw Error(`Template not found: ${X.templateId}`);if(W.organization_id!==J.organization.id)throw Error("Access denied: template belongs to another organization");K=await G.sessions.listByTemplate(X.templateId)}else K=await G.sessions.listByOrganization(J.organization.id);return{sessions:K}}}});var Fh6="user_sandbox_external_user_id",Vh6="user_sandbox_id",Pu0;var Eu0=S(()=>{tH();Pu0={name:"USER_SANDBOX_LIST_USER_AGENTS",description:"List all agents (Virtual MCPs) created for an external user. Use this to find agents created via user sandbox for a specific user in your platform.",inputSchema:Ju0,outputSchema:Gu0,handler:async(Y,Q)=>{let X=Y,J=Q;if(!J.organization)throw Error("Organization context required");return await J.access.check(),{agents:(await J.storage.connections.list(J.organization.id)).filter((W)=>{if(W.connection_type!=="VIRTUAL")return!1;let Z=W.metadata;if(!Z)return!1;return Z[Fh6]===X.externalUserId}).map((W)=>{let Z=W.metadata;return{id:W.id,title:W.title,external_user_id:X.externalUserId,template_id:Z[Vh6]??null,created_at:W.created_at}})}}}});var qh6="user_sandbox_external_user_id",Tu0;var Cu0=S(()=>{tH();eZ();Tu0={name:"USER_SANDBOX_CLEAR_USER_SESSION",description:"Clear all session data for an external user, revoking all access they've granted. This deletes their agents (Virtual MCPs), child connections, OAuth tokens, and sessions. Use this when a user wants to disconnect all their integrations.",inputSchema:Wu0,outputSchema:Zu0,handler:async(Y,Q)=>{let X=Y,J=Q;if(!J.organization)throw Error("Organization context required");await J.access.check();let G=J.db,K=bJ(),Z=(await G.selectFrom("connections").select(["id","metadata"]).where("organization_id","=",J.organization.id).where("connection_type","=","VIRTUAL").execute()).filter((F)=>{if(!F.metadata)return!1;try{return JSON.parse(F.metadata)[qh6]===X.externalUserId}catch{return!1}}).map((F)=>F.id),H=0;if(Z.length>0){let V=(await G.selectFrom("connection_aggregations").select("child_connection_id").where("parent_connection_id","in",Z).execute()).map((B)=>B.child_connection_id);if(await G.deleteFrom("connection_aggregations").where("parent_connection_id","in",Z).execute(),V.length>0)await G.deleteFrom("downstream_tokens").where("connectionId","in",V).execute(),await G.deleteFrom("connections").where("id","in",V).execute(),H=V.length;await G.deleteFrom("connections").where("id","in",Z).execute(),await G.deleteFrom("user_sandbox_agents").where("external_user_id","=",X.externalUserId).execute()}let $=await K.sessions.deleteByExternalUserId(J.organization.id,X.externalUserId);return{success:!0,deletedAgents:Z.length,deletedConnections:H,deletedSessions:$}}}});var Ru0;var Iu0=S(()=>{Hu0();Fu0();qu0();Uu0();Du0();Mu0();Au0();Eu0();Cu0();eZ();Ru0=[Ku0,$u0,Vu0,Bu0,zu0,Lu0,wu0,Pu0,Tu0]});function Bh6(Y){let Q=Date.now().toString(36),X=crypto.randomUUID().replace(/-/g,"").substring(0,8);return`${Y}_${Q}${X}`}async function Nz1(Y,Q,X,J){let G={success:!1,agentId:Y.created_agent_id,connectionIds:[],redirectUrl:null,eventEmitted:!1,webhookCalled:!1};try{let K=J.db,W=new Date().toISOString(),Z=Y.created_agent_id;if(!Z)throw Error("Session has no agent - this should not happen");let H=[],$=[];for(let[B,U]of Object.entries(Y.app_statuses))if(U.configured&&U.connection_id){H.push(U.connection_id);let z=Q.required_apps.find((D)=>D.app_name===B);$.push({appName:B,connectionId:U.connection_id,selectedTools:z?.selected_tools??null,selectedResources:z?.selected_resources??null,selectedPrompts:z?.selected_prompts??null})}if(G.connectionIds=H,await K.deleteFrom("connection_aggregations").where("parent_connection_id","=",Z).execute(),$.length>0)await K.insertInto("connection_aggregations").values($.map((B)=>({id:Bh6("agg"),parent_connection_id:Z,child_connection_id:B.connectionId,selected_tools:B.selectedTools?JSON.stringify(B.selectedTools):null,selected_resources:B.selectedResources?JSON.stringify(B.selectedResources):null,selected_prompts:B.selectedPrompts?JSON.stringify(B.selectedPrompts):null,created_at:W}))).execute();await X.sessions.update(Y.id,{status:"completed"});let F={type:Q.event_type,data:{externalUserId:Y.external_user_id,agentId:Z,templateId:Q.id,sessionId:Y.id,connections:H.map((B)=>{let U=Object.entries(Y.app_statuses).find(([z,D])=>D.connection_id===B)?.[0];return{id:B,appName:U??"unknown"}})}};if(J.eventBus)try{await J.eventBus.publish(J.organizationId,"user-sandbox",F),G.eventEmitted=!0}catch(B){console.error("[UserSandbox] Failed to emit completion event:",B)}if(Q.webhook_url)try{let B=await fetch(Q.webhook_url,{method:"POST",headers:{"Content-Type":"application/json","X-User-Sandbox-Event":Q.event_type},body:JSON.stringify(F.data)});if(!B.ok)console.error("[UserSandbox] Webhook returned error:",B.status);else G.webhookCalled=!0}catch(B){console.error("[UserSandbox] Failed to call webhook:",B)}let V=Y.redirect_url??Q.redirect_url;if(V){let B=new URL(V);B.searchParams.set("sessionId",Y.id),B.searchParams.set("externalUserId",Y.external_user_id),B.searchParams.set("agentId",Z),G.redirectUrl=B.toString()}return G.success=!0,G}catch(K){throw console.error("[UserSandbox] Completion failed:",K),K}}var ju0=()=>{};function Uh6(){let Y=Date.now().toString(36),Q=crypto.randomUUID().replace(/-/g,"").substring(0,8);return`conn_${Y}${Q}`}async function zh6(Y,Q,X,J,G,K,W){let Z=Uh6(),H=new Date().toISOString();if(!W.title)throw Error(`App "${W.app_name}" is missing required field: title`);if(!W.connection_type)throw Error(`App "${W.app_name}" is missing required field: connection_type`);if(!W.connection_url&&W.connection_type!=="STDIO")throw Error(`App "${W.app_name}" is missing required field: connection_url`);let $={id:Z,organization_id:Q,created_by:X,title:W.title,description:W.description??null,icon:W.icon??null,app_name:W.app_name,app_id:null,connection_type:W.connection_type,connection_url:W.connection_url??"",connection_token:null,connection_headers:W.connection_headers?JSON.stringify(W.connection_headers):null,oauth_config:W.oauth_config?JSON.stringify(W.oauth_config):null,configuration_state:null,configuration_scopes:null,metadata:JSON.stringify(zz1(J,G,K)),tools:null,bindings:null,status:"active",created_at:H,updated_at:H};return await Y.insertInto("connections").values($).execute(),Z}function hk(Y,Q){if(Q instanceof WF){let X={SESSION_NOT_FOUND:404,SESSION_EXPIRED:410,SESSION_COMPLETED:409,ACCESS_DENIED:403,CONNECTION_ACCESS_DENIED:403};return Y.json({error:Q.message,code:Q.code},X[Q.code]??400)}return console.error("[UserSandbox] Connect API error:",Q),Y.json({error:Q instanceof Error?Q.message:"Internal error"},500)}function Lz1(Y,Q){let X=Q.db,J=new yk(X),G=new fk(X),K={templates:J,sessions:G};Y.get("/api/user-sandbox/sessions/:sessionId",async(W)=>{try{let Z=W.req.param("sessionId"),H=await WO(Z,K,{allowCompleted:!0}),$=await J.findById(H.template_id);if(!$)return W.json({error:"Template not found"},404);return W.json({session:{id:H.id,status:H.status,external_user_id:H.external_user_id,expires_at:H.expires_at,redirect_url:H.redirect_url,created_agent_id:H.created_agent_id},template:{id:$.id,title:$.title,description:$.description,icon:$.icon},apps:$.required_apps.map((F)=>({app_name:F.app_name,title:F.title,description:F.description,icon:F.icon,connection_type:F.connection_type,requires_oauth:!!F.oauth_config,selected_tools:F.selected_tools,selected_resources:F.selected_resources,selected_prompts:F.selected_prompts,status:H.app_statuses[F.app_name]??{configured:!1,connection_id:null,error:null}}))})}catch(Z){return hk(W,Z)}}),Y.post("/api/user-sandbox/sessions/:sessionId/provision",async(W)=>{try{let Z=W.req.param("sessionId"),H=await W.req.json();if(!H.app_name)return W.json({error:"app_name is required"},400);let $=await WO(Z,K,{allowCompleted:!0}),F=await J.findById($.template_id);if(!F)return W.json({error:"Template not found"},404);let V=F.required_apps.find((D)=>D.app_name===H.app_name);if(!V)return W.json({error:`App "${H.app_name}" is not required by this template`},400);let B=$.app_statuses[H.app_name];if(B?.connection_id)return W.json({success:!0,connection_id:B.connection_id,already_provisioned:!0,requires_oauth:!!V.oauth_config});if(!F.created_by)return W.json({error:"Template is missing created_by - cannot create connections"},500);let U=await zh6(X,$.organization_id,F.created_by,Z,$.external_user_id,$.template_id,V),z={...$.app_statuses,[H.app_name]:{configured:!1,connection_id:U,error:null}};return await G.update(Z,{status:"in_progress",app_statuses:z}),W.json({success:!0,connection_id:U,already_provisioned:!1,requires_oauth:!!V.oauth_config})}catch(Z){return hk(W,Z)}}),Y.post("/api/user-sandbox/sessions/:sessionId/configure",async(W)=>{try{let Z=W.req.param("sessionId"),H=await W.req.json();if(!H.app_name)return W.json({error:"app_name is required"},400);let $=await WO(Z,K,{allowCompleted:!0}),F=await J.findById($.template_id);if(!F)return W.json({error:"Template not found"},404);if(!F.required_apps.find((L)=>L.app_name===H.app_name))return W.json({error:`App "${H.app_name}" is not required by this template`},400);let B=$.app_statuses[H.app_name],z={configured:!0,connection_id:H.connection_id??B?.connection_id??null,error:null},D={...$.app_statuses,[H.app_name]:z};return await G.update(Z,{status:"in_progress",app_statuses:D}),W.json({success:!0,app_name:H.app_name,status:z})}catch(Z){return hk(W,Z)}}),Y.post("/api/user-sandbox/sessions/:sessionId/oauth-token",async(W)=>{try{let Z=W.req.param("sessionId"),H=await W.req.json();if(!H.connection_id)return W.json({error:"connection_id is required"},400);if(!H.access_token)return W.json({error:"access_token is required"},400);let $=await WO(Z,K,{allowCompleted:!0});if(!Object.values($.app_statuses).some((E)=>E.connection_id===H.connection_id))return W.json({error:"Connection does not belong to this session"},403);let V=H.expires_in?new Date(Date.now()+H.expires_in*1000):null,B=new Date().toISOString(),U=await Q.vault.encrypt(H.access_token),z=H.refresh_token?await Q.vault.encrypt(H.refresh_token):null,D=H.client_secret?await Q.vault.encrypt(H.client_secret):null,L=X,w=await L.selectFrom("downstream_tokens").select(["id"]).where("connectionId","=",H.connection_id).executeTakeFirst();if(w)await L.updateTable("downstream_tokens").set({accessToken:U,refreshToken:z,scope:H.scope??null,expiresAt:V?.toISOString()??null,clientId:H.client_id??null,clientSecret:D,tokenEndpoint:H.token_endpoint??null,updatedAt:B}).where("id","=",w.id).execute();else{let E=`dtok_${Date.now().toString(36)}${crypto.randomUUID().replace(/-/g,"").substring(0,8)}`;await L.insertInto("downstream_tokens").values({id:E,connectionId:H.connection_id,accessToken:U,refreshToken:z,scope:H.scope??null,expiresAt:V?.toISOString()??null,clientId:H.client_id??null,clientSecret:D,tokenEndpoint:H.token_endpoint??null,createdAt:B,updatedAt:B}).execute()}return W.json({success:!0,expiresAt:V})}catch(Z){return hk(W,Z)}}),Y.post("/api/user-sandbox/sessions/:sessionId/complete",async(W)=>{try{let Z=W.req.param("sessionId"),H=await WO(Z,K,{allowCompleted:!0}),$=await J.findById(H.template_id);if(!$)return W.json({error:"Template not found"},404);if($.required_apps.filter((B)=>{return H.app_statuses[B.app_name]?.configured}).length===0)return W.json({error:"At least one app must be configured"},400);let V=await Nz1(H,$,K,{organizationId:H.organization_id,db:X});return W.json({success:V.success,completed:!0,agentId:V.agentId,redirectUrl:V.redirectUrl,eventEmitted:V.eventEmitted,webhookCalled:V.webhookCalled})}catch(Z){return hk(W,Z)}})}var Su0=S(()=>{Fz1();Vz1();Oz1();ju0()});var ku0=S(()=>{Su0()});var vu0;var _u0=S(()=>{pg0();ng0();Iu0();ku0();vu0={id:Da,description:ug0,tools:Ru0,publicRoutes:(Y,Q)=>{Lz1(Y,Q)},migrations:dg0,createStorage:(Y)=>{let Q=cg0(Y);return bk(Q),Q}}});var yu0="workflows",fu0="Create workflows for platform end-users";import{sql as bu0}from"kysely";var hu0;var xu0=S(()=>{hu0={name:"001-workflows",async up(Y){await Y.schema.createTable("workflow_collection").addColumn("id","text",(Q)=>Q.primaryKey()).addColumn("organization_id","text",(Q)=>Q.notNull().references("organization.id").onDelete("cascade")).addColumn("title","text",(Q)=>Q.notNull()).addColumn("description","text").addColumn("virtual_mcp_id","text",(Q)=>Q.notNull()).addColumn("steps","text",(Q)=>Q.notNull().defaultTo("[]")).addColumn("created_at","text",(Q)=>Q.notNull().defaultTo(bu0`CURRENT_TIMESTAMP`)).addColumn("updated_at","text",(Q)=>Q.notNull().defaultTo(bu0`CURRENT_TIMESTAMP`)).addColumn("created_by","text").addColumn("updated_by","text").execute(),await Y.schema.createIndex("idx_wf_collection_org").on("workflow_collection").column("organization_id").execute(),await Y.schema.createIndex("idx_wf_collection_created_at").on("workflow_collection").column("created_at").execute(),await Y.schema.createTable("workflow").addColumn("id","text",(Q)=>Q.primaryKey()).addColumn("workflow_collection_id","text").addColumn("organization_id","text",(Q)=>Q.notNull().references("organization.id").onDelete("cascade")).addColumn("steps","text",(Q)=>Q.notNull().defaultTo("[]")).addColumn("input","text").addColumn("virtual_mcp_id","text",(Q)=>Q.notNull()).addColumn("created_at_epoch_ms","bigint",(Q)=>Q.notNull()).addColumn("created_by","text").execute(),await Y.schema.createIndex("idx_workflow_created_at").on("workflow").column("created_at_epoch_ms").execute(),await Y.schema.createIndex("idx_workflow_collection_id").on("workflow").column("workflow_collection_id").execute(),await Y.schema.createTable("workflow_execution").addColumn("id","text",(Q)=>Q.primaryKey()).addColumn("workflow_id","text",(Q)=>Q.notNull().references("workflow.id").onDelete("cascade")).addColumn("organization_id","text",(Q)=>Q.notNull().references("organization.id").onDelete("cascade")).addColumn("status","text",(Q)=>Q.notNull().defaultTo("enqueued")).addColumn("input","text").addColumn("output","text").addColumn("error","text").addColumn("created_at","bigint",(Q)=>Q.notNull()).addColumn("updated_at","bigint",(Q)=>Q.notNull()).addColumn("start_at_epoch_ms","bigint").addColumn("started_at_epoch_ms","bigint").addColumn("completed_at_epoch_ms","bigint").addColumn("timeout_ms","bigint").addColumn("deadline_at_epoch_ms","bigint").addColumn("created_by","text").execute(),await Y.schema.createIndex("idx_wf_execution_status").on("workflow_execution").column("status").execute(),await Y.schema.createIndex("idx_wf_execution_workflow_id").on("workflow_execution").column("workflow_id").execute(),await Y.schema.createIndex("idx_wf_execution_org").on("workflow_execution").column("organization_id").execute(),await Y.schema.createIndex("idx_wf_execution_created_at").on("workflow_execution").column("created_at").execute(),await Y.schema.createTable("workflow_execution_step_result").addColumn("execution_id","text",(Q)=>Q.notNull().references("workflow_execution.id").onDelete("cascade")).addColumn("step_id","text",(Q)=>Q.notNull()).addColumn("started_at_epoch_ms","bigint").addColumn("completed_at_epoch_ms","bigint").addColumn("output","text").addColumn("error","text").addColumn("raw_tool_output","text").execute(),await Y.schema.createIndex("idx_wf_step_result_pk").on("workflow_execution_step_result").columns(["execution_id","step_id"]).unique().execute(),await Y.schema.createIndex("idx_wf_step_result_execution").on("workflow_execution_step_result").column("execution_id").execute()},async down(Y){await Y.schema.dropIndex("idx_wf_step_result_execution").ifExists().execute(),await Y.schema.dropIndex("idx_wf_step_result_pk").ifExists().execute(),await Y.schema.dropIndex("idx_wf_execution_created_at").ifExists().execute(),await Y.schema.dropIndex("idx_wf_execution_org").ifExists().execute(),await Y.schema.dropIndex("idx_wf_execution_workflow_id").ifExists().execute(),await Y.schema.dropIndex("idx_wf_execution_status").ifExists().execute(),await Y.schema.dropIndex("idx_workflow_collection_id").ifExists().execute(),await Y.schema.dropIndex("idx_workflow_created_at").ifExists().execute(),await Y.schema.dropIndex("idx_wf_collection_created_at").ifExists().execute(),await Y.schema.dropIndex("idx_wf_collection_org").ifExists().execute(),await Y.schema.dropTable("workflow_execution_step_result").ifExists().execute(),await Y.schema.dropTable("workflow_execution").ifExists().execute(),await Y.schema.dropTable("workflow").ifExists().execute(),await Y.schema.dropTable("workflow_collection").ifExists().execute()}}});var gu0;var uu0=S(()=>{xu0();gu0=[hu0]});function CG(Y){let Q=Y;if(!Q.organization)throw Error("Organization context required for workflow tools");return Q}function k5(Y){if(Y===null||Y===void 0)return null;if(typeof Y==="object")return Y;if(typeof Y!=="string")return Y;try{return JSON.parse(Y)}catch{return Y}}function mu0(Y){Mz1=Y}function QJ(){if(!Mz1)throw Error('Plugin storage not initialized. Make sure the "workflows" plugin is enabled.');return Mz1}var Mz1=null;function lu0(Y){return{...Y,steps:k5(Y.steps)??[]}}class wz1{db;constructor(Y){this.db=Y}async list(Y,Q={}){let{limit:X=50,offset:J=0}=Q,G=await this.db.selectFrom("workflow_collection").selectAll().where("organization_id","=",Y).orderBy("created_at","desc").limit(X).offset(J).execute(),K=await this.db.selectFrom("workflow_collection").select((W)=>W.fn.countAll().as("count")).where("organization_id","=",Y).executeTakeFirstOrThrow();return{items:G,totalCount:Number(K.count)}}async getById(Y,Q){let X=await this.db.selectFrom("workflow_collection").selectAll().where("id","=",Y).where("organization_id","=",Q).executeTakeFirst();return X?lu0(X):null}async create(Y){let Q=await this.db.insertInto("workflow_collection").values(Y).returningAll().executeTakeFirstOrThrow();return lu0(Q)}async update(Y,Q,X){return await this.db.updateTable("workflow_collection").set({...X,updated_at:new Date().toISOString()}).where("id","=",Y).where("organization_id","=",Q).returningAll().executeTakeFirstOrThrow()}async delete(Y,Q){return await this.db.deleteFrom("workflow_collection").where("id","=",Y).where("organization_id","=",Q).returningAll().executeTakeFirstOrThrow()}}var du0=()=>{};function Dh6(Y){return{...Y,steps:k5(Y.steps)??[],input:k5(Y.input)??null}}function HB(Y){return{...Y,output:k5(Y.output),error:k5(Y.error),raw_tool_output:k5(Y.raw_tool_output)}}class Az1{db;constructor(Y){this.db=Y}async _createWorkflow(Y,Q){let X=crypto.randomUUID(),J=Date.now();return await Y.insertInto("workflow").values({id:X,workflow_collection_id:Q.workflowCollectionId??null,organization_id:Q.organizationId,steps:JSON.stringify(Q.steps),input:Q.input?JSON.stringify(Q.input):null,virtual_mcp_id:Q.virtualMcpId,created_at_epoch_ms:J,created_by:Q.createdBy??null}).execute(),{id:X}}async createWorkflow(Y){return this._createWorkflow(this.db,Y)}async getWorkflow(Y){let Q=await this.db.selectFrom("workflow").selectAll().where("id","=",Y).executeTakeFirst();return Q?Dh6(Q):null}async createExecution(Y){return this.db.transaction().execute(async(Q)=>{let X=Date.now(),{id:J}=await this._createWorkflow(Q,{organizationId:Y.organizationId,workflowCollectionId:Y.workflowCollectionId,virtualMcpId:Y.virtualMcpId,input:Y.input,steps:Y.steps,createdBy:Y.createdBy}),G=crypto.randomUUID(),K=Y.startAtEpochMs??X,W=Y.timeoutMs?K+Y.timeoutMs:null;return await Q.insertInto("workflow_execution").values({id:G,workflow_id:J,organization_id:Y.organizationId,status:"enqueued",input:Y.input?JSON.stringify(Y.input):null,created_at:X,updated_at:X,start_at_epoch_ms:K,timeout_ms:Y.timeoutMs??null,deadline_at_epoch_ms:W,created_by:Y.createdBy??null}).execute(),{id:G}})}async getExecution(Y,Q){return await this.db.selectFrom("workflow_execution").selectAll().where("id","=",Y).where("organization_id","=",Q).executeTakeFirst()??null}async getExecutionFull(Y,Q){let X=await this.db.selectFrom("workflow_execution").selectAll().where("id","=",Y).where("organization_id","=",Q).executeTakeFirst();if(!X)return null;let J=await this.db.selectFrom("workflow_execution_step_result").selectAll().where("execution_id","=",Y).execute();return{execution:X,stepResults:J.map(HB)}}async getExecutionContext(Y){let Q=await this.db.selectFrom("workflow_execution").select(["id","status","workflow_id","deadline_at_epoch_ms"]).where("id","=",Y).executeTakeFirst();if(!Q)return null;let X=await this.db.selectFrom("workflow").select(["steps","input","virtual_mcp_id"]).where("id","=",Q.workflow_id).executeTakeFirst();if(!X)return null;let J=await this.db.selectFrom("workflow_execution_step_result").selectAll().where("execution_id","=",Y).execute();return{execution:{id:Q.id,status:Q.status,workflow_id:Q.workflow_id,deadline_at_epoch_ms:Q.deadline_at_epoch_ms},workflow:{steps:k5(X.steps)??[],input:k5(X.input)??null,virtual_mcp_id:X.virtual_mcp_id},stepResults:J.map(HB)}}async claimExecution(Y){let Q=Date.now(),X=await this.db.updateTable("workflow_execution").set({status:"running",updated_at:Q}).where("id","=",Y).where("status","=","enqueued").returningAll().executeTakeFirst();if(!X)return null;let J=await this.getWorkflow(X.workflow_id);if(!J)throw Error(`Workflow ${X.workflow_id} not found for execution ${Y}`);return{execution:X,workflow:J}}async updateExecution(Y,Q,X){let G={updated_at:Date.now()};if(Q.status!==void 0)G.status=Q.status;if(Q.output!==void 0)G.output=JSON.stringify(Q.output);if(Q.error!==void 0)G.error=JSON.stringify(Q.error);if(Q.completed_at_epoch_ms!==void 0)G.completed_at_epoch_ms=Q.completed_at_epoch_ms;let K=this.db.updateTable("workflow_execution").set(G).where("id","=",Y);if(X?.onlyIfStatus)K=K.where("status","=",X.onlyIfStatus);return await K.returningAll().executeTakeFirst()??null}async cancelExecution(Y,Q){let X=Date.now();return!!await this.db.updateTable("workflow_execution").set({status:"cancelled",updated_at:X}).where("id","=",Y).where("organization_id","=",Q).where("status","in",["enqueued","running"]).returningAll().executeTakeFirst()}async resumeExecution(Y,Q){return this.db.transaction().execute(async(X)=>{let J=Date.now();return await X.deleteFrom("workflow_execution_step_result").where("execution_id","=",Y).where("completed_at_epoch_ms","is",null).execute(),!!await X.updateTable("workflow_execution").set({status:"enqueued",updated_at:J,completed_at_epoch_ms:null}).where("id","=",Y).where("organization_id","=",Q).where("status","=","cancelled").returningAll().executeTakeFirst()})}async listExecutions(Y,Q={}){let{limit:X=50,offset:J=0,status:G}=Q,K=this.db.selectFrom("workflow_execution as we").innerJoin("workflow as w","we.workflow_id","w.id").leftJoin("workflow_collection as wc","w.workflow_collection_id","wc.id").select(["we.id","we.workflow_id","we.organization_id","we.status","we.input","we.output","we.error","we.created_at","we.updated_at","we.start_at_epoch_ms","we.started_at_epoch_ms","we.completed_at_epoch_ms","we.timeout_ms","we.deadline_at_epoch_ms","we.created_by","w.virtual_mcp_id"]).select((F)=>F.fn.coalesce("wc.title",F.val("Workflow Execution")).as("title")).where("we.organization_id","=",Y);if(G)K=K.where("we.status","=",G);let W=await K.orderBy("we.created_at","desc").limit(X).offset(J).execute(),Z=this.db.selectFrom("workflow_execution").select((F)=>F.fn.countAll().as("count")).where("organization_id","=",Y);if(G)Z=Z.where("status","=",G);let H=await Z.executeTakeFirstOrThrow(),$=Number(H.count);return{items:W,totalCount:$,hasMore:J+W.length<$}}async createStepResult(Y){let Q=await this.db.insertInto("workflow_execution_step_result").values({execution_id:Y.execution_id,step_id:Y.step_id,started_at_epoch_ms:Y.completed_at_epoch_ms?Date.now():null,completed_at_epoch_ms:Y.completed_at_epoch_ms??null,output:Y.output!==void 0?JSON.stringify(Y.output):null,error:Y.error!==void 0?JSON.stringify(Y.error):null}).onConflict((X)=>X.columns(["execution_id","step_id"]).doNothing()).returningAll().executeTakeFirst();return Q?HB(Q):null}async updateStepResult(Y,Q,X){let J={};if(X.output!==void 0)J.output=JSON.stringify(X.output);if(X.error!==void 0)J.error=JSON.stringify(X.error);if(X.started_at_epoch_ms!==void 0)J.started_at_epoch_ms=X.started_at_epoch_ms;if(X.completed_at_epoch_ms!==void 0)J.completed_at_epoch_ms=X.completed_at_epoch_ms;if(Object.keys(J).length===0)return null;let G=await this.db.updateTable("workflow_execution_step_result").set(J).where("execution_id","=",Y).where("step_id","=",Q).returningAll().executeTakeFirst();return G?HB(G):null}async checkpointAndTransform(Y,Q,X,J){await this.db.updateTable("workflow_execution_step_result").set({raw_tool_output:JSON.stringify(X)}).where("execution_id","=",Y).where("step_id","=",Q).execute();let G,K;try{let H=await J(X);G=H.output,K=H.error}catch(H){K=H instanceof Error?`Transform failed: ${H.message}`:`Transform failed: ${String(H)}`}let W={completed_at_epoch_ms:Date.now()};if(G!==void 0)W.output=JSON.stringify(G);if(K!==void 0)W.error=JSON.stringify(K);let Z=await this.db.updateTable("workflow_execution_step_result").set(W).where("execution_id","=",Y).where("step_id","=",Q).returningAll().executeTakeFirst();return Z?HB(Z):null}async getStepResult(Y,Q){let X=await this.db.selectFrom("workflow_execution_step_result").selectAll().where("execution_id","=",Y).where("step_id","=",Q).executeTakeFirst();return X?HB(X):null}async getStepResults(Y){return(await this.db.selectFrom("workflow_execution_step_result").selectAll().where("execution_id","=",Y).execute()).map(HB)}async deleteStepResult(Y,Q){await this.db.deleteFrom("workflow_execution_step_result").where("execution_id","=",Y).where("step_id","=",Q).execute()}async getStepResultsByPrefix(Y,Q){return(await this.db.selectFrom("workflow_execution_step_result").selectAll().where("execution_id","=",Y).where("step_id","like",`${Q}%`).orderBy("step_id").execute()).map(HB)}async recoverStuckExecutions(){return this.db.transaction().execute(async(Y)=>{let Q=await Y.selectFrom("workflow_execution").select(["id","organization_id"]).where("status","=","running").execute();if(Q.length===0)return[];let X=Q.map((J)=>J.id);return await Y.updateTable("workflow_execution").set({status:"enqueued",updated_at:Date.now()}).where("id","in",X).where("status","=","running").execute(),Q})}}var pu0=()=>{};function cu0(Y){let Q=Y.db;return{collections:new wz1(Q),executions:new Az1(Q)}}var nu0=S(()=>{du0();pu0()});var iu0,au0,ru0,ou0,su0;var tu0=S(()=>{l1();IA();QY();iu0={name:"COLLECTION_WORKFLOW_LIST",description:"List workflows with pagination. Does not include steps -- use GET for full details.",inputSchema:q.object({limit:q.number().optional().default(50),offset:q.number().optional().default(0)}),outputSchema:q.object({items:q.array(q.object({id:q.string(),title:q.string(),description:q.string().nullable(),virtual_mcp_id:q.string(),created_at:q.string(),updated_at:q.string()})),totalCount:q.number(),hasMore:q.boolean()}),handler:async(Y,Q)=>{let X=CG(Q);await X.access.check();let J=Y,G=QJ(),{items:K,totalCount:W}=await G.collections.list(X.organization.id,{limit:J.limit,offset:J.offset});return{items:K.map((Z)=>({id:Z.id,title:Z.title,description:Z.description,virtual_mcp_id:Z.virtual_mcp_id,created_at:Z.created_at,updated_at:Z.updated_at})),totalCount:W,hasMore:(J.offset??0)+K.length<W}}},au0={name:"COLLECTION_WORKFLOW_GET",description:"Get a single workflow by ID, including its steps.",inputSchema:q.object({id:q.string()}),outputSchema:q.object({item:q.object({id:q.string(),title:q.string(),description:q.string().nullable(),virtual_mcp_id:q.string(),steps:q.array(dD),created_at:q.string(),updated_at:q.string()}).nullable()}),handler:async(Y,Q)=>{let X=CG(Q);await X.access.check();let{id:J}=Y,K=await QJ().collections.getById(J,X.organization.id);if(!K)return{item:null};return{item:{id:K.id,title:K.title,description:K.description,virtual_mcp_id:K.virtual_mcp_id,steps:K.steps,created_at:K.created_at,updated_at:K.updated_at}}}},ru0={name:"COLLECTION_WORKFLOW_CREATE",description:`Create a workflow template. This is a reusable definition, not an execution.
|
|
1302
1302
|
|
|
1303
1303
|
Key concepts:
|
|
1304
1304
|
- Steps without references run immediately (in parallel).
|