decocms 4.344.1 → 4.344.3
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-BjMuYxmi.js → AlertCircle-C3hNX-U3.js} +1 -1
- package/dist/client/assets/{AreaChart-P5pArksK.js → AreaChart-V5K73xTf.js} +1 -1
- package/dist/client/assets/{ArrowLeft-BwC_u33Q.js → ArrowLeft-xkekPehv.js} +1 -1
- package/dist/client/assets/{ArrowUp-B8VhBtFx.js → ArrowUp-CYfoVlFX.js} +1 -1
- package/dist/client/assets/{Check-DxQeYFcE.js → Check-BcH3mbli.js} +1 -1
- package/dist/client/assets/{CheckCircle-C_IlU8js.js → CheckCircle-efnyoYbr.js} +1 -1
- package/dist/client/assets/{ChevronRight-DPUKyX3B.js → ChevronRight-zWIGH7_7.js} +1 -1
- package/dist/client/assets/{ChevronSelectorVertical-YzQi0PQX.js → ChevronSelectorVertical-Q_MhqA-g.js} +1 -1
- package/dist/client/assets/{ChevronUp-C9LCQ5Al.js → ChevronUp-CcnNOmjW.js} +1 -1
- package/dist/client/assets/{Copy01-MwHtzLVF.js → Copy01-B-07BGuw.js} +1 -1
- package/dist/client/assets/{CreditCard01-Bi3-77w1.js → CreditCard01-DZdhUpRr.js} +1 -1
- package/dist/client/assets/{DotsVertical-B1I-mCuU.js → DotsVertical-Cha1vnex.js} +1 -1
- package/dist/client/assets/{Download01-DGJEMDLc.js → Download01-BH00OOK2.js} +1 -1
- package/dist/client/assets/{ErrorBarContext-DJ1fmyx8.js → ErrorBarContext-DGy0g17o.js} +1 -1
- package/dist/client/assets/{Eye-D5g3w0j_.js → Eye-s_5OI3rP.js} +1 -1
- package/dist/client/assets/{GitBranch01-CnlwY1P_.js → GitBranch01-DPsdhEPj.js} +1 -1
- package/dist/client/assets/{Globe01-BLWkbDkc.js → Globe01-BOLRhWz3.js} +1 -1
- package/dist/client/assets/{HardDrive-DQDOqSUK.js → HardDrive-Jz5aKVF-.js} +1 -1
- package/dist/client/assets/{Image01-vgxUXrTy.js → Image01-Dde0njV5.js} +1 -1
- package/dist/client/assets/{Key01-BmgHvr4E.js → Key01-CL0l8cke.js} +1 -1
- package/dist/client/assets/{Link01-tJAsKN4V.js → Link01-c7H6evzR.js} +1 -1
- package/dist/client/assets/{LinkExternal01-DhLc5AVD.js → LinkExternal01-mF6LE9cE.js} +1 -1
- package/dist/client/assets/{Monitor01-BC_tYrvH.js → Monitor01-CxZPUqxw.js} +1 -1
- package/dist/client/assets/{Package-gYdvPjZu.js → Package-D1Oz_AXu.js} +1 -1
- package/dist/client/assets/{Palette-CqySYNVO.js → Palette-BZi2CQIb.js} +1 -1
- package/dist/client/assets/{Play-Un8C-mAg.js → Play-DL08uuDR.js} +1 -1
- package/dist/client/assets/{Plus-D6AiOZHV.js → Plus-UnZHTGwg.js} +1 -1
- package/dist/client/assets/{SearchMd-By0JhV4t.js → SearchMd-BoghbLrR.js} +1 -1
- package/dist/client/assets/{Sector-DHsJol83.js → Sector-CwzoDHdp.js} +1 -1
- package/dist/client/assets/{Settings02-ClicUXGp.js → Settings02-CRvAtfO0.js} +1 -1
- package/dist/client/assets/{Share07-J9Tcg72Q.js → Share07-CTpIecy0.js} +1 -1
- package/dist/client/assets/{Shield01-CRcKuFYE.js → Shield01-DPL17IT0.js} +1 -1
- package/dist/client/assets/{Stars01-Dmq72XcE.js → Stars01-DveEX2vy.js} +1 -1
- package/dist/client/assets/{Sun-BXZfuBXP.js → Sun-cPKIj7uq.js} +1 -1
- package/dist/client/assets/{Tool01-DJvWUPsn.js → Tool01-DXqO9hP4.js} +1 -1
- package/dist/client/assets/{Tool02-eg3_S9Ak.js → Tool02-B4NLpHjP.js} +1 -1
- package/dist/client/assets/{Trash01-C8iWkF21.js → Trash01-CRSthTGO.js} +1 -1
- package/dist/client/assets/{TrendUp01-vUbGui7n.js → TrendUp01-Dug8rn5Y.js} +1 -1
- package/dist/client/assets/{Upload01-iR-rddab.js → Upload01-D_Fv189I.js} +1 -1
- package/dist/client/assets/{User01-B5-Ys5vY.js → User01-CDa2pgjQ.js} +1 -1
- package/dist/client/assets/{UserSquare-gcGLnQoD.js → UserSquare-CWhx4AsN.js} +1 -1
- package/dist/client/assets/{Users01-BVSUwlTI.js → Users01-DZlH1wbC.js} +1 -1
- package/dist/client/assets/{Users03-B9pTZPgz.js → Users03-CoUu6iB3.js} +1 -1
- package/dist/client/assets/{XCircle-4-8Jmfe4.js → XCircle-TCv3gxEk.js} +1 -1
- package/dist/client/assets/{XClose-COktzEMg.js → XClose-DqZ5Ef7p.js} +1 -1
- package/dist/client/assets/{Zap-g0qt0BwC.js → Zap-HRAvXFnr.js} +1 -1
- package/dist/client/assets/{ZoomOut-B_R5roqc.js → ZoomOut-DC7lYRrH.js} +1 -1
- package/dist/client/assets/{access-gate-DLbpI8LF.js → access-gate-LG7Db20W.js} +1 -1
- package/dist/client/assets/{agent-icon-CCMiedCg.js → agent-icon-B0j2UorE.js} +1 -1
- package/dist/client/assets/{agents-list-BQlnHJ-C.js → agents-list-DJgBBD1W.js} +1 -1
- package/dist/client/assets/{ai-providers-C8Gfn0sX.js → ai-providers-D9b6lp9s.js} +1 -1
- package/dist/client/assets/{alert-C6LsdoJV.js → alert-Yw6picdx.js} +1 -1
- package/dist/client/assets/{alert-dialog-CJkXwWO9.js → alert-dialog-B6LS36Sm.js} +1 -1
- package/dist/client/assets/{analytics-tab-C9SAGUgS.js → analytics-tab-D-B27giR.js} +1 -1
- package/dist/client/assets/api-keys-BpX-le77.js +1 -0
- package/dist/client/assets/{api-keys-Cfd6NXQe.js → api-keys-D7tL_p1k.js} +1 -1
- package/dist/client/assets/app-editor-Dr01DzC2.js +1 -0
- package/dist/client/assets/{auth-BPPezCXD.js → auth-DBYGTgFE.js} +1 -1
- package/dist/client/assets/{auth-catchall-BdTMMjlD.js → auth-catchall-DU8qDYnm.js} +1 -1
- package/dist/client/assets/{auth-entry-B9uhggZP.js → auth-entry-6o1YBMQ6.js} +1 -1
- package/dist/client/assets/{auth-split-layout-CN54sM56.js → auth-split-layout-Csg-iIgy.js} +1 -1
- package/dist/client/assets/{authenticate-and-persist-oauth-Cu9y6SFV.js → authenticate-and-persist-oauth-AGm_2YIv.js} +1 -1
- package/dist/client/assets/{automation-list-row-BfHNI8Ry.js → automation-list-row-yl7Jr9Us.js} +1 -1
- package/dist/client/assets/{automation-runs-xfHBNYfm.js → automation-runs-DBYd6ygh.js} +1 -1
- package/dist/client/assets/{automations-BG7aFgC9.js → automations-Dlvl2Sbn.js} +1 -1
- package/dist/client/assets/{autosend-CzXMxIBc.js → autosend-9lrcbCup.js} +1 -1
- package/dist/client/assets/{avatar-cGgzX6Q8.js → avatar-BusY4imm.js} +1 -1
- package/dist/client/assets/{badge-BOpZ6PkI.js → badge-COtyjjy2.js} +1 -1
- package/dist/client/assets/{block-document-Cx3WrG1X.js → block-document-pw3BZW3I.js} +1 -1
- package/dist/client/assets/{breadcrumb-KhPwJDYK.js → breadcrumb-aEyQOqqG.js} +1 -1
- package/dist/client/assets/{buckets-oJeZKYCe.js → buckets-CrIxq0vO.js} +1 -1
- package/dist/client/assets/{bulk-category-panel-B3zkGj5A.js → bulk-category-panel-D7gbHLhl.js} +1 -1
- package/dist/client/assets/{capability-load-error-D4HyCPBw.js → capability-load-error-BeQsW5u1.js} +1 -1
- package/dist/client/assets/{cards-7EkyDZYV.js → cards-CAtXduAN.js} +1 -1
- package/dist/client/assets/{category-editor-6SA3LNZv.js → category-editor-CQj0g1PN.js} +1 -1
- package/dist/client/assets/{cdn-tab-DnbzvYlD.js → cdn-tab-VWG7A8ek.js} +1 -1
- package/dist/client/assets/{chart-D3GNpA8E.js → chart-BSIlcmgf.js} +1 -1
- package/dist/client/assets/{chat-context-CXRs08s6.js → chat-context-DU7jeH6U.js} +1 -1
- package/dist/client/assets/{checkbox-CpzwVXNS.js → checkbox-D1r9ixw9.js} +1 -1
- package/dist/client/assets/{choose-editor-B4YWcnMg.js → choose-editor-BEZHaCP7.js} +1 -1
- package/dist/client/assets/{cli-auth-success-CgbANE02.js → cli-auth-success-ChhNt2lr.js} +1 -1
- package/dist/client/assets/{client-icons-rTmmY4Qu.js → client-icons-CqD2Q5XK.js} +1 -1
- package/dist/client/assets/{collection-detail-5_RmbhhY.js → collection-detail-Bc1N9_b4.js} +1 -1
- package/dist/client/assets/{collection-display-button-CxDVHK3I.js → collection-display-button-Bc0_77tr.js} +1 -1
- package/dist/client/assets/{collection-search-l1m_ppUw.js → collection-search-CkYj4zLQ.js} +1 -1
- package/dist/client/assets/{collection-table-wrapper-Cnb9LKHS.js → collection-table-wrapper-DRVe2c2R.js} +1 -1
- package/dist/client/assets/{collection-tabs-CwMFKn1n.js → collection-tabs-N31SqJ5M.js} +1 -1
- package/dist/client/assets/{command-BYlxLxTL.js → command-M5Hy4Bca.js} +1 -1
- package/dist/client/assets/{commerce-onboarding-DjThyQh0.js → commerce-onboarding-g6xIZGng.js} +1 -1
- package/dist/client/assets/{connect-Bkm3_g-O.js → connect-Cf-9oNPe.js} +1 -1
- package/dist/client/assets/{connect-layout-COVIZNxi.js → connect-layout-Z933g_CV.js} +1 -1
- package/dist/client/assets/{connection-C7aOtOZ9.js → connection-Cimig8VQ.js} +1 -1
- package/dist/client/assets/{connection-card-FoQxvuJf.js → connection-card-kDFhfbya.js} +1 -1
- package/dist/client/assets/{connection-detail-DKMftkhe.js → connection-detail-D3l8WE-Y.js} +1 -1
- package/dist/client/assets/{connection-form-helpers-BuJtasnZ.js → connection-form-helpers-Bb00vWyO.js} +1 -1
- package/dist/client/assets/{connections-FZxsmgMU.js → connections-BS7ow6ak.js} +1 -1
- package/dist/client/assets/{create-organization-dialog-G4OcSS8l.js → create-organization-dialog-DF7Gz0pf.js} +1 -1
- package/dist/client/assets/{decopilot-sse-pool-L93pnfSs.js → decopilot-sse-pool-C6z-rtNE.js} +1 -1
- package/dist/client/assets/{dialog-OBxzAzom.js → dialog-CIbVvLCQ.js} +1 -1
- package/dist/client/assets/{domain-settings-BRznnLr6.js → domain-settings-Bmfy9jDz.js} +1 -1
- package/dist/client/assets/{drawer-C2xrNU8r.js → drawer-CJFC-0Fv.js} +1 -1
- package/dist/client/assets/{dropdown-menu-D7LCoNMq.js → dropdown-menu-BHHO3QAR.js} +1 -1
- package/dist/client/assets/{e2e-tab-ntnPl-ca.js → e2e-tab-DNyiIyOa.js} +1 -1
- package/dist/client/assets/{editor-CCRpAUKq.js → editor-D6mstx7z.js} +1 -1
- package/dist/client/assets/{empty-state-ADGxJSqy.js → empty-state-BOUJ1IRI.js} +1 -1
- package/dist/client/assets/{empty-state-DHwnQMV_.js → empty-state-CFTbSuP9.js} +1 -1
- package/dist/client/assets/{extract-connection-data-BbqgTPgH.js → extract-connection-data-BAwcjEs9.js} +1 -1
- package/dist/client/assets/{file-explorer-Bw3GSfQk.js → file-explorer-Bh9n4VYl.js} +1 -1
- package/dist/client/assets/{file-type-icon-CAW_viSw.js → file-type-icon-VaomZQ4k.js} +1 -1
- package/dist/client/assets/{folder-icon-SMGV3EMO.js → folder-icon-BPPBLsSQ.js} +1 -1
- package/dist/client/assets/{form-S1ZESyeH.js → form-BLZF8D8t.js} +1 -1
- package/dist/client/assets/{general-SIMm3O8G.js → general-1KXfjgkN.js} +1 -1
- package/dist/client/assets/{github-icon-DbAmZ8nk.js → github-icon-BMwS5NHP.js} +1 -1
- package/dist/client/assets/{hooks-B2R9sLxn.js → hooks-Dx8_BRAv.js} +1 -1
- package/dist/client/assets/{hosting-tab-Ijx0TIC2.js → hosting-tab-HpfZRgGl.js} +1 -1
- package/dist/client/assets/{index-Un5MjpBc.js → index-816NyhfX.js} +1 -1
- package/dist/client/assets/{index-BchAOKlj.js → index-B_lUDZ9B.js} +2 -2
- package/dist/client/assets/{index-CY2FHft8.js → index-BnQgQVCt.js} +1 -1
- package/dist/client/assets/{index-DPgRZdG6.js → index-BozOu9tc.js} +1 -1
- package/dist/client/assets/{index-DhTvONYT.js → index-CIa7ef_A.js} +1 -1
- package/dist/client/assets/{index-lO6vP97d.js → index-CVcEeQb5.js} +1 -1
- package/dist/client/assets/{index-Dhhe2yhg.js → index-CiTAcnLT.js} +1 -1
- package/dist/client/assets/{index-BPhWztnJ.js → index-DSjfYpae.js} +6 -6
- package/dist/client/assets/{index-7sFGYlJb.js → index-Dd37LnAd.js} +1 -1
- package/dist/client/assets/{index-redirect-BK-AVO2r.js → index-redirect-CxyJoKV4.js} +1 -1
- package/dist/client/assets/{index-Buw64iTd.js → index-scWMkxhM.js} +1 -1
- package/dist/client/assets/{infiniteQueryObserver-DdVambif.js → infiniteQueryObserver-CwY974C7.js} +1 -1
- package/dist/client/assets/{infra-billing-C3sspPa6.js → infra-billing-_yVOOYJd.js} +1 -1
- package/dist/client/assets/{input-DHP0RHlp.js → input-COX_MHDV.js} +1 -1
- package/dist/client/assets/{integration-icon-W2Q5PIck.js → integration-icon-DCPy_52o.js} +1 -1
- package/dist/client/assets/{invite-member-dialog-CtEorK5c.js → invite-member-dialog-BHafD7C7.js} +1 -1
- package/dist/client/assets/{label-C7PK-lHw.js → label-BWr2mmGs.js} +1 -1
- package/dist/client/assets/{layout-BnKlqv03.js → layout-C7V0gFy0.js} +1 -1
- package/dist/client/assets/{login-BgsirZAt.js → login-D1Nz670h.js} +1 -1
- package/dist/client/assets/{markdown-BsIXLS3b.js → markdown-BYbXDv7N.js} +1 -1
- package/dist/client/assets/{mcp-app-renderer-BTHF0AHF.js → mcp-app-renderer-C-wnTv6N.js} +1 -1
- package/dist/client/assets/{mcp-oauth-DEWFOPkn.js → mcp-oauth-D4bG2HDW.js} +1 -1
- package/dist/client/assets/{members-jBFFi-vT.js → members-wTEykKnV.js} +1 -1
- package/dist/client/assets/{monaco-editor-DZADfW6r.js → monaco-editor-YC0wWRXT.js} +1 -1
- package/dist/client/assets/{monitoring-stats-row-hKlWAt04.js → monitoring-stats-row-BvTSmQaL.js} +1 -1
- package/dist/client/assets/{multi-select-BLvZSTa1.js → multi-select-BmB9r4YL.js} +1 -1
- package/dist/client/assets/{oauth-callback-C51UB2D9.js → oauth-callback-D2Gp_wZF.js} +1 -1
- package/dist/client/assets/{oauth-callback-ai-provider-Dsv963Ta.js → oauth-callback-ai-provider-CoABKbtI.js} +1 -1
- package/dist/client/assets/{onboarding-BYN-WZdf.js → onboarding-CftT1nG0.js} +1 -1
- package/dist/client/assets/{org-layout-p6eqD620.js → org-layout-B1FHoYea.js} +1 -1
- package/dist/client/assets/{organization-choice-BLk1I6v9.js → organization-choice-CBe05Pnl.js} +1 -1
- package/dist/client/assets/{orgs-D_gvdKOu.js → orgs-CtakA9D0.js} +1 -1
- package/dist/client/assets/{page-seo-form-BDlAG2ny.js → page-seo-form-ZY8ZbyqT.js} +1 -1
- package/dist/client/assets/{popover-DkmR2lA6.js → popover-BGEouS4O.js} +1 -1
- package/dist/client/assets/{post-calendar-CZISCbTj.js → post-calendar-C4PHtaZV.js} +1 -1
- package/dist/client/assets/{post-editor-CYhhN1_z.js → post-editor-D6FwVD0B.js} +1 -1
- package/dist/client/assets/{primitives-CdRr57q-.js → primitives-BFeFdEFz.js} +1 -1
- package/dist/client/assets/{profile-CBONxCiy.js → profile-GTCpmwYq.js} +1 -1
- package/dist/client/assets/{project-app-view-BhoARCjd.js → project-app-view-BQZfjkf1.js} +1 -1
- package/dist/client/assets/{project-icon-DamXOjp8.js → project-icon-mS3w82ZB.js} +1 -1
- package/dist/client/assets/{prompts-B6rAIvaw.js → prompts-uofkMfaL.js} +1 -1
- package/dist/client/assets/record-editor-DZ_Ht_rf.js +1 -0
- package/dist/client/assets/redirect-editor-DLSqpC6c.js +1 -0
- package/dist/client/assets/registry-R33rTMC7.js +2 -0
- package/dist/client/assets/{registry-layout-DXwkRZOQ.js → registry-layout-YOADDKZS.js} +1 -1
- package/dist/client/assets/{reports-BdxqpCo4.js → reports-DYmaGRqW.js} +1 -1
- package/dist/client/assets/{repositories-CGubii5t.js → repositories-BgsdtnFm.js} +1 -1
- package/dist/client/assets/{repository-import-picker-BJ-zN9Ij.js → repository-import-picker-DKCHkj_0.js} +1 -1
- package/dist/client/assets/{repository-picker-BX_XSV19.js → repository-picker-hMZKUmSe.js} +1 -1
- package/dist/client/assets/{require-capability--DOt2ERE.js → require-capability-D7WPxMT8.js} +1 -1
- package/dist/client/assets/{required-auth-layout-Dy1_df_6.js → required-auth-layout-BzHLhAY7.js} +1 -1
- package/dist/client/assets/{reset-password-98jWo32P.js → reset-password-Db8RpI71.js} +1 -1
- package/dist/client/assets/{review-settings-CMYzZWK1.js → review-settings-CcgZS4Qu.js} +1 -1
- package/dist/client/assets/{roles-CPs9PioP.js → roles-D5JKlKQL.js} +1 -1
- package/dist/client/assets/{schema-C65nFTu4.js → schema-7gcATtGd.js} +1 -1
- package/dist/client/assets/{scroll-area-TfVnAKMc.js → scroll-area-BV67BPd_.js} +1 -1
- package/dist/client/assets/{search-input-BQUFx9US.js → search-input-D-ESO_3b.js} +1 -1
- package/dist/client/assets/{secrets-C2HdSGM-.js → secrets-DslGN31D.js} +1 -1
- package/dist/client/assets/{sections-editor-BkMJ_oh_.js → sections-editor-Cl6Tz3LM.js} +1 -1
- package/dist/client/assets/{select-DrxveWhw.js → select-DrcEVnZ2.js} +1 -1
- package/dist/client/assets/{select-model-Chu6b8mZ.js → select-model-BxS8auXw.js} +1 -1
- package/dist/client/assets/{self-tool-result-DTVcCRcK.js → self-tool-result-BJzf7f_D.js} +1 -1
- package/dist/client/assets/{seo-editor-CuepF3pb.js → seo-editor-BE4i-LT0.js} +1 -1
- package/dist/client/assets/settings-layout-CUALOfuk.js +1 -0
- package/dist/client/assets/{settings-sidebar-DLrns6Fj.js → settings-sidebar-C6TvhfID.js} +1 -1
- package/dist/client/assets/{shell-controls-CQiUgtRO.js → shell-controls-BxmxydXV.js} +1 -1
- package/dist/client/assets/{shell-layout-BqV6fEBV.js → shell-layout-Bx5eb743.js} +1 -1
- package/dist/client/assets/{skill-preview-CllyAILl.js → skill-preview-DttG8VYN.js} +1 -1
- package/dist/client/assets/{skills-CFONQWW-.js → skills-DHAWKG4x.js} +1 -1
- package/dist/client/assets/{sso-0n7r8-x_.js → sso-Bx-8EZnD.js} +1 -1
- package/dist/client/assets/{store-B9HWO6cb.js → store-C6L68gEz.js} +1 -1
- package/dist/client/assets/store-registry-DGHd6xRw.js +2 -0
- package/dist/client/assets/{switch-D_cjCTgk.js → switch-6gOY7p_B.js} +1 -1
- package/dist/client/assets/{synced-repos-CoVXAmDk.js → synced-repos-5BNmNf6C.js} +1 -1
- package/dist/client/assets/{table-Cf1yQntK.js → table-CiqNoZ31.js} +1 -1
- package/dist/client/assets/{tabs-od0SPK7S.js → tabs-Bkqs8f-5.js} +1 -1
- package/dist/client/assets/{task-board-BnIBnE9V.js → task-board-DZmRPJBt.js} +1 -1
- package/dist/client/assets/{task-route-C8eS62da.js → task-route-DFWTcvum.js} +1 -1
- package/dist/client/assets/{tasks-Bd3sMm2P.js → tasks-CzRXtD5l.js} +1 -1
- package/dist/client/assets/{textarea-CtTIh5eo.js → textarea-BPKnRKFj.js} +1 -1
- package/dist/client/assets/{thread-intent-BUdj1oNO.js → thread-intent-CFtt_nS5.js} +1 -1
- package/dist/client/assets/{thread-route-BuMLLPC9.js → thread-route-Cqs0O0Ez.js} +1 -1
- package/dist/client/assets/{toggle-group-CRdE5vQF.js → toggle-group-dwqfI-na.js} +1 -1
- package/dist/client/assets/{toolbar-CsP7VfFt.js → toolbar-ClAV86ux.js} +1 -1
- package/dist/client/assets/{toolbar-icon-button-BuEXzagv.js → toolbar-icon-button-_od4zlTM.js} +1 -1
- package/dist/client/assets/{track-0QXSC0aR.js → track-DR1-LwVK.js} +1 -1
- package/dist/client/assets/{types-KEdMbDrR.js → types-CXQqC75q.js} +1 -1
- package/dist/client/assets/{use-ai-providers-BdW_wf1z.js → use-ai-providers-dsyrDnO9.js} +1 -1
- package/dist/client/assets/{use-automations-DKOxPPAq.js → use-automations-GJZG9mot.js} +1 -1
- package/dist/client/assets/{use-autosave-BFL8sOAH.js → use-autosave-edA5EL24.js} +1 -1
- package/dist/client/assets/{use-connection-BRPceU75.js → use-connection-BRJSF7XV.js} +1 -1
- package/dist/client/assets/{use-copy-BeP1DGCD.js → use-copy-BYPpXCK2.js} +1 -1
- package/dist/client/assets/{use-create-virtual-mcp-DhSsOf3L.js → use-create-virtual-mcp-CK3FIQpt.js} +1 -1
- package/dist/client/assets/{use-date-fns-locale-CqGJGe22.js → use-date-fns-locale-xY0hnak0.js} +1 -1
- package/dist/client/assets/{use-debounced-autosave-ORs7hX9x.js → use-debounced-autosave-BZz1Sh5T.js} +1 -1
- package/dist/client/assets/{use-debounced-value-8ClMD96D.js → use-debounced-value-BBOX-Vjy.js} +1 -1
- package/dist/client/assets/{use-decopilot-events-kIL4-9J-.js → use-decopilot-events-CrymWsPY.js} +1 -1
- package/dist/client/assets/{use-delete-connection-DtqNWOLX.js → use-delete-connection-BwDOMJxj.js} +1 -1
- package/dist/client/assets/{use-deployment-admin-Cm6pk0-i.js → use-deployment-admin-BHuzOYuO.js} +1 -1
- package/dist/client/assets/{use-destination-route-DSB7ygJ3.js → use-destination-route-OdrYRKi6.js} +1 -1
- package/dist/client/assets/{use-file-configs-CI0rcz5W.js → use-file-configs-B8jXjEAi.js} +1 -1
- package/dist/client/assets/{use-infinite-scroll-c0yQIbtU.js → use-infinite-scroll-DQ_XrNCL.js} +1 -1
- package/dist/client/assets/{use-join-requests-Dpj6-Adj.js → use-join-requests-35XhVVHr.js} +1 -1
- package/dist/client/assets/{use-mcp-auth-status-DhNUxu5f.js → use-mcp-auth-status-nQqJOE5j.js} +1 -1
- package/dist/client/assets/{use-mcp-client-dKCIRAKY.js → use-mcp-client-xRPKqtBd.js} +1 -1
- package/dist/client/assets/{use-mcp-prompts-W9hu3OsJ.js → use-mcp-prompts-BH2161nI.js} +1 -1
- package/dist/client/assets/{use-mcp-tools-Ci7UuYIf.js → use-mcp-tools-DhWg8eQ9.js} +1 -1
- package/dist/client/assets/{use-members-DfzsBCnJ.js → use-members-CTCpXWvz.js} +1 -1
- package/dist/client/assets/{use-navigate-to-agent-DsVT2aJv.js → use-navigate-to-agent-DEnupm5-.js} +1 -1
- package/dist/client/assets/{use-org-auth-client-C1YRjV3w.js → use-org-auth-client-tX4pyhvY.js} +1 -1
- package/dist/client/assets/{use-org-notice-Cpu85Ukm.js → use-org-notice-BrqrQNrZ.js} +1 -1
- package/dist/client/assets/{use-org-sso-C2KOoYeA.js → use-org-sso-ax_WPM-e.js} +1 -1
- package/dist/client/assets/{use-organization-roles-t96LTPe2.js → use-organization-roles-le6n88uk.js} +1 -1
- package/dist/client/assets/{use-organization-settings-ux6449Xl.js → use-organization-settings-DeqTyhDT.js} +1 -1
- package/dist/client/assets/{use-panel-navigate-BvI2J3ls.js → use-panel-navigate-DufE4TQe.js} +1 -1
- package/dist/client/assets/{use-registry-connections-D8Shk9Ny.js → use-registry-connections-CnQcaAch.js} +1 -1
- package/dist/client/assets/{use-secrets-DFHzz6hG.js → use-secrets-BKeXLH1Q.js} +1 -1
- package/dist/client/assets/{use-section-preview-base-jzmCaiCf.js → use-section-preview-base-C_rHbM66.js} +1 -1
- package/dist/client/assets/{use-status-sounds-DudWi0tR.js → use-status-sounds-Cw977hrS.js} +1 -1
- package/dist/client/assets/{use-tags-BN2t59T_.js → use-tags-C-FksPQ4.js} +1 -1
- package/dist/client/assets/{use-view-mode-DXxOuUTm.js → use-view-mode-BzXvEzDG.js} +1 -1
- package/dist/client/assets/{use-virtual-mcp-CE2lvrwN.js → use-virtual-mcp-8rv5G58S.js} +1 -1
- package/dist/client/assets/useInfiniteQuery-D-5t1K3F.js +1 -0
- package/dist/client/assets/useSuspenseInfiniteQuery-CzeWzIJb.js +1 -0
- package/dist/client/assets/{users-COCvGep8.js → users-Hybgdqlv.js} +1 -1
- package/dist/client/assets/{variant-calendar-NUEWKCfJ.js → variant-calendar-CVemYhc_.js} +1 -1
- package/dist/client/assets/{view-mode-toggle-uxtdvGkq.js → view-mode-toggle-ZMf_pu5n.js} +1 -1
- package/dist/client/index.html +1 -1
- package/dist/server/cli.js +4 -4
- package/dist/server/server.js +4 -4
- package/package.json +1 -1
- package/dist/client/assets/api-keys-D7hTNuqp.js +0 -1
- package/dist/client/assets/app-editor-CnMywu3-.js +0 -1
- package/dist/client/assets/record-editor-BGBP-klp.js +0 -1
- package/dist/client/assets/redirect-editor-BwCGTNSS.js +0 -1
- package/dist/client/assets/registry-XT_AT1wH.js +0 -2
- package/dist/client/assets/settings-layout-7f7HAulD.js +0 -1
- package/dist/client/assets/store-registry-tVyVxLd9.js +0 -2
- package/dist/client/assets/useInfiniteQuery-rTw2vfoi.js +0 -1
- package/dist/client/assets/useSuspenseInfiniteQuery-C9r2I39H.js +0 -1
package/dist/server/server.js
CHANGED
|
@@ -106,7 +106,7 @@ You are running the brand-context onboarding for the user's organization. Your o
|
|
|
106
106
|
4. Do NOT call any other tools in this thread. Do NOT call \`brand_context_setup\` more than once.
|
|
107
107
|
|
|
108
108
|
If the tool returns an error, surface the error message to the user and ask whether they want to try a different URL.
|
|
109
|
-
`.trim();Pc1=YJ("site-diagnostics_"),Z85=Pc1.is,Q85=Pc1.get,Ac1=YJ("commerce-discovery_"),X85=Ac1.is,i50=Ac1.get;NE={AUTOMATION_MANAGER:YJ("studio-automation-manager_"),CONNECTION_MANAGER:YJ("studio-connection-manager_"),API_KEY_MANAGER:YJ("studio-api-key-manager_"),STORE_MANAGER:YJ("studio-store-manager_"),BRAND_MANAGER:YJ("studio-brand-manager_"),USAGE_MANAGER:YJ("studio-usage-manager_")},GJ={AUTOMATION_MANAGER:NE.AUTOMATION_MANAGER.get,CONNECTION_MANAGER:NE.CONNECTION_MANAGER.get,API_KEY_MANAGER:NE.API_KEY_MANAGER.get,STORE_MANAGER:NE.STORE_MANAGER.get,BRAND_MANAGER:NE.BRAND_MANAGER.get,USAGE_MANAGER:NE.USAGE_MANAGER.get};Ou0=["studio-agent-manager_","studio-task-manager_"],Y85=Ou0.map(YJ)});function kc1($){return $.toLowerCase().replace(/[^a-z0-9]/g,"")}function Hl8($){return kc1($).includes("deepresearch")}function Vc1($){let Z=kc1($);if(Z.includes("deepresearch"))return!1;return Fl8.some((Q)=>Z.includes(Q))}function Ul8($){return $.asyncResearch!==!0&&Vc1($.modelId)}function Nl8($){return $.asyncResearch===!0||Hl8($.modelId)||Vc1($.modelId)}function mx($,Z,Q,X){for(let Y of Q){let G=$.find((J)=>J.modelId===Y);if(G)return{keyId:Z,modelId:G.modelId,title:G.title}}for(let Y of Q){let G=$.find((J)=>J.modelId.includes(Y));if(G)return{keyId:Z,modelId:G.modelId,title:G.title}}if(X){let Y=$.find(X);if(Y)return{keyId:Z,modelId:Y.modelId,title:Y.title}}return null}function Sc1($,Z){let Q={chat:{fast:null,smart:null,thinking:null},image:null,webSearch:null,deepResearch:null};for(let X of $){let Y=Z[X.id]??[],G=X.providerId;if(!Q.chat.fast)Q.chat.fast=mx(Y,X.id,Xl8[G]??[]);if(!Q.chat.smart)Q.chat.smart=mx(Y,X.id,Yl8[G]??[]);if(!Q.chat.thinking)Q.chat.thinking=mx(Y,X.id,Gl8[G]??[]);if(!Q.image)Q.image=mx(Y,X.id,Jl8[G]??[],(J)=>J.capabilities?.includes("image")===!0);if(!Q.webSearch)Q.webSearch=mx(Y,X.id,Wl8[G]??[],Ul8);if(!Q.deepResearch)Q.deepResearch=mx(Y,X.id,Kl8[G]??[],Nl8)}return Q}var Xl8,Yl8,Gl8,Jl8,Wl8,Kl8,Fl8;var Cc1=D(()=>{Xl8={anthropic:["claude-haiku-4-5","claude-haiku"],openrouter:["qwen/qwen3.5-flash","anthropic/claude-haiku-4.5","anthropic/claude-haiku","google/gemini-3-flash"],deco:["qwen/qwen3.5-flash","anthropic/claude-haiku"],llmapi:["claude-haiku-4-5","claude-haiku","gpt-4o-mini"],google:["gemini-2.5-flash","gemini-3-flash"]},Yl8={anthropic:["claude-sonnet-5","claude-sonnet"],openrouter:["anthropic/claude-sonnet-5","anthropic/claude-sonnet","anthropic/claude-opus-4.8","google/gemini-3-pro"],deco:["anthropic/claude-sonnet-5","anthropic/claude-sonnet","anthropic/claude"],llmapi:["claude-sonnet-4-6","claude-sonnet"],google:["gemini-3-pro","gemini-3-flash"]},Gl8={anthropic:["claude-opus-4-8","claude-sonnet-5","claude-sonnet","claude-fable-5"],openrouter:["anthropic/claude-opus-4.8:extended","anthropic/claude-opus-4.8","anthropic/claude-sonnet-5:extended","anthropic/claude-sonnet-5","google/gemini-3-pro","anthropic/claude-fable-5"],deco:["anthropic/claude-opus","anthropic/claude-sonnet-4.6","anthropic/claude-sonnet","anthropic/claude-fable"],llmapi:["claude-opus-4-8","claude-opus","claude-sonnet-4-6"],google:["gemini-3-pro"]},Jl8={openrouter:["openai/gpt-image-1","google/gemini-2.0-flash-image"],deco:["openai/gpt-image-1","google/gemini-2.0-flash-image"],llmapi:["gemini-2.5-flash-image","gpt-image-1"],google:["gemini-2.0-flash-image"]},Wl8={openrouter:["perplexity/sonar","perplexity/sonar-pro"],deco:["perplexity/sonar","perplexity/sonar-pro"]},Kl8={openrouter:["perplexity/deep-research","perplexity/sonar-pro"],deco:["perplexity/deep-research","perplexity/sonar-pro"]};Fl8=["sonar","searchpreview","online"]});function p50($){if(!$)return;let Z={};for(let Q in $){let X=$[Q];if(typeof X==="object"&&X!==null){let Y={};for(let G of Bl8)if(G in X)Y[G]=X[G];Z[Q]=Y}}return Object.keys(Z).length>0?Z:void 0}var Bl8;var _c1=D(()=>{Bl8=["usage","cost","model"]});var k8=D(()=>{E60();Mc1();Cc1();_c1()});function n50($){return $.toLowerCase().trim().replace(/\//g,"-").replace(/[^a-z0-9\s_-]+/g,"").replace(/[\s_-]+/g,"-").replace(/^-+|-+$/g,"")}function mB($){if($.app_name)return $.app_name;if($.connection_url)try{let Z=new URL($.connection_url),X=((Z.port?`${Z.hostname}-${Z.port}`:Z.hostname)+Z.pathname).replace(/\/+$/,"");return n50(X)}catch{return n50($.connection_url)}if($.title)return n50($.title);return $.id??"unknown"}var t50=()=>{};var ix=300000,o50=5000,r50=1e4,Du0=3,wu0=30000,vc1=65000,s50=1000,px=3,fc1=5,bc1=60000,xc1=300000,Lu0=60000;function yc1(){if(eF.size<s50)return;let $=null,Z=1/0;for(let[Q,X]of eF)if(X.lastFailureAt<Z)Z=X.lastFailureAt,$=Q;if($)eF.delete($)}function gc1($){let Z=eF.get($);if(!Z)return yc1(),eF.set($,{consecutiveFailures:1,disabled:!1,lastFailureAt:Date.now()}),{consecutiveFailures:1,thresholdCrossed:1>=px};return Z.consecutiveFailures++,Z.lastFailureAt=Date.now(),{consecutiveFailures:Z.consecutiveFailures,thresholdCrossed:Z.consecutiveFailures>=px}}function Eu0($){let Z=eF.get($);if(Z){Z.disabled=!0;return}yc1(),eF.set($,{consecutiveFailures:px,disabled:!0,lastFailureAt:Date.now()})}function hc1($){return eF.get($)?.disabled??!1}function uc1($){eF.delete($)}var eF;var lc1=D(()=>{eF=new Map});import{sql as p$}from"kysely";function dc1($){if($.length===0)return null;let Z=$[0];if($.length===1&&Dl8.has(Z))return p$.ref(Z);if($.length===2&&cc1.has(Z)){let Q=$[1];return p$`${p$.ref(Z)}->>${p$.lit(Q)}`}if($.length>2&&cc1.has(Z)){let Q=`{${$.slice(1).join(",")}}`;return p$`${p$.ref(Z)}#>>${p$.lit(Q)}`}return null}function mc1($){if("conditions"in $){let{operator:G,conditions:J}=$;if(J.length===0)return p$`true`;let W=J.map((K)=>mc1(K));switch(G){case"and":return p$`(${p$.join(W,p$` AND `)})`;case"or":return p$`(${p$.join(W,p$` OR `)})`;case"not":return p$`NOT (${p$.join(W,p$` AND `)})`;default:return p$`true`}}let{field:Z,operator:Q,value:X}=$,Y=dc1(Z);if(!Y)return p$`true`;switch(Q){case"eq":return X===null?p$`${Y} IS NULL`:p$`${Y} = ${p$.val(X)}`;case"gt":return p$`${Y} > ${p$.val(X)}`;case"gte":return p$`${Y} >= ${p$.val(X)}`;case"lt":return p$`${Y} < ${p$.val(X)}`;case"lte":return p$`${Y} <= ${p$.val(X)}`;case"in":if(!Array.isArray(X)||X.length===0)return p$`false`;return p$`${Y} IN (${p$.join(X.map((G)=>p$.val(G)))})`;case"like":return p$`${Y} ILIKE ${p$.val(X)}`;case"contains":{let G=String(X).replace(/[%_\\]/g,"\\$&");return p$`${Y} ILIKE ${p$.val(`%${G}%`)}`}default:return p$`true`}}class Li{db;vault;constructor($,Z){this.db=$;this.vault=Z}async create($){let Z=$.id??M8("conn"),Q=new Date().toISOString(),X=await this.db.selectFrom("connections").select("organization_id").where("id","=",Z).executeTakeFirst();if(X){if(X.organization_id!==$.organization_id)throw Error("Connection ID already exists");return this.update(Z,$)}let Y=mB($),G=await this.serializeConnection({...$,id:$.id??Z,slug:Y,status:"active",created_at:Q,updated_at:Q}),J;try{J=await this.db.insertInto("connections").values(G).returningAll().executeTakeFirst()}catch(W){if(W instanceof Error&&(W.message.includes("duplicate key")||W.message.includes("unique constraint")))throw Error("Connection ID already exists");throw W}if(!J)throw Error(`Failed to create connection with id: ${Z}`);return this.deserializeConnection(J)}async createNew($){let Z=$.id??M8("conn"),Q=new Date().toISOString(),X=mB($),Y=await this.serializeConnection({...$,id:Z,slug:X,status:"active",created_at:Q,updated_at:Q}),G;try{G=await this.db.insertInto("connections").values(Y).returningAll().executeTakeFirst()}catch(J){if(J instanceof Error&&(J.message.includes("duplicate key")||J.message.includes("unique constraint")))throw Error("Connection ID already exists");throw J}if(!G)throw Error(`Failed to create connection with id: ${Z}`);return this.deserializeConnection(G)}async findById($,Z){let Q=GQ($);if(Q)return Ic1(Z??Q);let X=this.db.selectFrom("connections").selectAll().where("id","=",$);if(Z)X=X.where("organization_id","=",Z);let Y=await X.executeTakeFirst();return Y?this.deserializeConnection(Y):null}async findBySanitizedId($){let Z=$.replace(/-/g,"_"),Q=await this.db.selectFrom("connections").selectAll().where(p$`replace(id, '-', '_')`,"=",Z).where("id","!=",$).executeTakeFirst();return Q?this.deserializeConnection(Q):null}async list($,Z){let Q=this.db.selectFrom("connections").selectAll().where("organization_id","=",$);if(!Z?.includeVirtual)Q=Q.where("connection_type","!=","VIRTUAL");if(Z?.slug)Q=Q.where("slug","=",Z.slug);if(Z?.where)Q=Q.where(mc1(Z.where));let G=(await this.db.selectFrom(Q.as("filtered")).select(p$`count(*)::int`.as("count")).executeTakeFirst())?.count??0;if(Z?.orderBy&&Z.orderBy.length>0)for(let K of Z.orderBy){let H=dc1(K.field);if(!H)continue;let F=K.direction==="desc"?p$`desc`:p$`asc`,U=K.nulls==="first"?p$`nulls first`:p$`nulls last`;Q=Q.orderBy(p$`${H} ${F} ${U}`)}if(Z?.limit!==void 0)Q=Q.limit(Z.limit);if(Z?.offset)Q=Q.offset(Z.offset);let J=await Q.execute();return{items:await Promise.all(J.map((K)=>this.deserializeConnection(K))),totalCount:G}}async update($,Z){let{id:Q,organization_id:X,created_by:Y,created_at:G,...J}=Z;if(Z=J,Object.keys(Z).length===0){let U=await this.findById($);if(!U)throw Error("Connection not found");return U}let W={...Z},K=await this.db.selectFrom("connections").select(["app_name","connection_url","title"]).where("id","=",$).executeTakeFirst();if(K){let U=(N)=>Z[N]===void 0?K[N]:Z[N];W.slug=mB({app_name:U("app_name"),connection_url:U("connection_url"),title:U("title"),id:$})}let H=await this.serializeConnection({...W,updated_at:new Date().toISOString()}),F=await this.db.updateTable("connections").set(H).where("id","=",$).returningAll().executeTakeFirst();if(!F)throw Error("Connection not found after update");return this.deserializeConnection(F)}async isReferencedByThread($){return await this.db.selectFrom("threads").select("id").where(p$`metadata -> 'githubRepo' ->> 'connectionId' = ${$}`).limit(1).executeTakeFirst()!==void 0}async delete($){await this.db.deleteFrom("connections").where("id","=",$).execute()}async testConnection($,Z){let Q=await this.findById($);if(!Q)throw Error("Connection not found");let X=Date.now();if(Q.connection_type==="STDIO")return{healthy:!0,latencyMs:Date.now()-X};if(!Q.connection_url)return{healthy:!1,latencyMs:Date.now()-X};try{if(await cx(Q.connection_url))return{healthy:!1,latencyMs:Date.now()-X};let G=Q.connection_headers,J=await dB()(Q.connection_url,{method:"POST",signal:AbortSignal.timeout(1e4),headers:{"Content-Type":"application/json",...Q.connection_token&&{Authorization:`Bearer ${Q.connection_token}`},...G?.headers,...Z},body:JSON.stringify({jsonrpc:"2.0",method:"ping",id:1})});return{healthy:J.ok||J.status===404,latencyMs:Date.now()-X}}catch{return{healthy:!1,latencyMs:Date.now()-X}}}async serializeConnection($){let Z={};for(let[Q,X]of Object.entries($)){if(X===void 0)continue;if(Q==="tools")continue;if(Q==="connection_token"&&X)Z[Q]=await this.vault.encrypt(X);else if(Q==="configuration_state"&&X){let Y=JSON.stringify(X);Z[Q]=await this.vault.encrypt(Y)}else if(Q==="oauth_config"&&X)Z[Q]=await this.vault.encrypt(JSON.stringify(X));else if(Q==="connection_headers"&&X){let Y=X;if(OK(Y)&&Y.envVars){let G={};for(let[J,W]of Object.entries(Y.envVars))G[J]=await this.vault.encrypt(W);Z[Q]=JSON.stringify({...Y,envVars:G})}else Z[Q]=JSON.stringify(Y)}else if(Ol8.includes(Q))Z[Q]=X?JSON.stringify(X):null;else Z[Q]=X}return Z}async handleDecryptFailures($,Z){let Q=`connection ${$.id} (org: ${$.organization_id}, type: ${$.connection_type}, title: ${$.title})`;if(hc1($.id))return;if($.status!=="active"){Eu0($.id);return}let{thresholdCrossed:X}=gc1($.id);if(!X){for(let{label:Y,error:G}of Z)console.error(`Failed to decrypt ${Y} for ${Q}:`,G);return}try{await this.db.updateTable("connections").set({status:"error"}).where("id","=",$.id).execute(),Eu0($.id),console.error(`Disabled ${Q} after ${px} consecutive decryption failures.`,Z[0]?.error)}catch(Y){console.error(`Failed to disable ${Q} after decryption failures:`,Y)}}async deserializeConnection($){let Z=[],Q=null;if($.connection_token)try{Q=await this.vault.decrypt($.connection_token)}catch(W){Z.push({label:"connection token",error:W})}let X=null;if($.configuration_state)try{let W=await this.vault.decrypt($.configuration_state);X=JSON.parse(W)}catch(W){Z.push({label:"configuration state",error:W})}let Y=null;if(typeof $.oauth_config==="string")try{Y=JSON.parse(await this.vault.decrypt($.oauth_config))}catch{try{Y=JSON.parse($.oauth_config)}catch(W){Z.push({label:"oauth config",error:W})}}else Y=$.oauth_config;if(Z.length>0)await this.handleDecryptFailures($,Z);else if($.connection_token||$.configuration_state||$.oauth_config)uc1($.id);let G=null;if($.connection_headers)try{let W=JSON.parse($.connection_headers);if(OK(W)&&W.envVars){let K={};for(let[H,F]of Object.entries(W.envVars))try{K[H]=await this.vault.decrypt(F)}catch{K[H]=F}G={...W,envVars:K}}else G=W}catch(W){console.error(`Failed to parse connection_headers for connection ${$.id} (org: ${$.organization_id}, type: ${$.connection_type}, title: ${$.title}):`,W)}let J=(W)=>{if(W===null)return null;if(typeof W==="string")try{return JSON.parse(W)}catch{return null}return W};return{id:$.id,organization_id:$.organization_id,created_by:$.created_by,updated_by:$.updated_by??void 0,title:$.title,description:$.description,icon:$.icon,app_name:$.app_name,app_id:$.app_id,slug:$.slug,connection_type:$.connection_type,connection_url:$.connection_url,connection_token:Q,connection_headers:G,oauth_config:Y,configuration_state:X,configuration_scopes:J($.configuration_scopes),metadata:J($.metadata),tools:null,bindings:J($.bindings),status:$.status,created_at:$.created_at,updated_at:$.updated_at}}}var Ol8,Dl8,cc1;var ju0=D(()=>{wK();FE();YQ();k8();t50();lc1();Ol8=["connection_headers","configuration_scopes","metadata","bindings"],Dl8=new Set(["id","organization_id","created_by","updated_by","title","description","icon","app_name","app_id","slug","connection_type","connection_url","status","created_at","updated_at"]),cc1=new Set(["metadata","configuration_scopes","bindings"])});import{createHash as wl8,randomBytes as Ll8,timingSafeEqual as V85}from"crypto";function jl8($){return $.toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function Pu0($){return wl8("sha256").update($).digest("hex")}function nc1($){let Z=zu0.length+1,Q=Z+pc1;if(!$.startsWith(`${zu0}_`)||$.length<=Q+1||$[Q]!=="_")return null;let X=$.slice(Z,Q),Y=$.slice(Q+1);if(!ic1.test(X)||!ic1.test(Y))return null;return X}function tc1(){let $=jl8(Ll8(El8)),Z=$.slice(0,pc1),Q=`${zu0}_${Z}_${$}`;return{plaintext:Q,prefix:Z,hash:Pu0(Q)}}var zu0="stv",El8=32,pc1=12,ic1;var oc1=D(()=>{ic1=/^[A-Za-z0-9_-]+$/});function rc1($){return{id:$.id,organizationId:$.organization_id,subjectConnectionId:$.subject_connection_id,tokenHash:$.token_hash,tokenPrefix:$.token_prefix,name:$.name,revokedAt:$.revoked_at,lastUsedAt:$.last_used_at,createdAt:$.created_at,updatedAt:$.updated_at}}class Au0{db;constructor($){this.db=$}async createOrRotateWorkloadToken($){let Z=$.name??"default";return await this.db.transaction().execute(async(X)=>{if(!await X.selectFrom("connections").select("id").where("id","=",$.subjectConnectionId).where("organization_id","=",$.organizationId).executeTakeFirst())throw Error("Subject connection not found in organization");let G=tc1(),J=new Date().toISOString();await X.updateTable("connection_workload_tokens").set({revoked_at:J,updated_at:J}).where("organization_id","=",$.organizationId).where("subject_connection_id","=",$.subjectConnectionId).where("name","=",Z).where("revoked_at","is",null).execute();let W=await X.insertInto("connection_workload_tokens").values({id:M8("cwt"),organization_id:$.organizationId,subject_connection_id:$.subjectConnectionId,token_hash:G.hash,token_prefix:G.prefix,name:Z,revoked_at:null,last_used_at:null,created_at:J,updated_at:J}).returningAll().executeTakeFirstOrThrow();return{plaintextToken:G.plaintext,record:rc1(W)}})}async findActiveWorkloadToken($){let Z=await this.db.selectFrom("connection_workload_tokens").selectAll().where("organization_id","=",$.organizationId).where("subject_connection_id","=",$.subjectConnectionId).where("name","=",$.name??"default").where("revoked_at","is",null).executeTakeFirst();return Z?rc1(Z):null}async revokeWorkloadToken($){let Z=new Date().toISOString();await this.db.updateTable("connection_workload_tokens").set({revoked_at:Z,updated_at:Z}).where("id","=",$.tokenId).where("organization_id","=",$.organizationId).where("subject_connection_id","=",$.subjectConnectionId).where("revoked_at","is",null).execute()}async authenticateWorkloadToken($){let Z=nc1($);if(!Z)return null;let Q=Pu0($),X=await this.db.selectFrom("connection_workload_tokens").select(["id","organization_id","subject_connection_id","token_prefix"]).where("token_prefix","=",Z).where("token_hash","=",Q).where("revoked_at","is",null).executeTakeFirst();if(!X)return null;let Y=new Date().toISOString();return await this.db.updateTable("connection_workload_tokens").set({last_used_at:Y,updated_at:Y}).where("id","=",X.id).execute(),{tokenId:X.id,tokenPrefix:X.token_prefix,organizationId:X.organization_id,subjectConnectionId:X.subject_connection_id}}async replaceGrantsForSubject($){await this.db.transaction().execute(async(Z)=>{if(!await Z.selectFrom("connections").select("id").where("id","=",$.subjectConnectionId).where("organization_id","=",$.organizationId).executeTakeFirst())throw Error("Referenced connection not found in organization");let X=[...new Set($.grants.map((J)=>J.targetConnectionId))];if(X.length>0){if((await Z.selectFrom("connections").select("id").where("organization_id","=",$.organizationId).where("id","in",X).execute()).length!==X.length)throw Error("Referenced connection not found in organization")}if(await Z.deleteFrom("connection_credential_grants").where("organization_id","=",$.organizationId).where("subject_connection_id","=",$.subjectConnectionId).execute(),$.grants.length===0)return;let Y=new Date().toISOString(),G=$.grants.map((J)=>({id:M8("ccg"),organization_id:$.organizationId,subject_connection_id:$.subjectConnectionId,target_connection_id:J.targetConnectionId,scope:J.scope,created_by:$.createdBy,created_at:Y,updated_at:Y}));await Z.insertInto("connection_credential_grants").values(G).execute()})}async hasGrant($){return!!await this.db.selectFrom("connection_credential_grants").select("id").where("organization_id","=",$.organizationId).where("subject_connection_id","=",$.subjectConnectionId).where("target_connection_id","=",$.targetConnectionId).where("scope","=",$.scope).executeTakeFirst()}}var a50="credential:access-token:read",e50="credential:configuration:read";var $90=D(()=>{YQ();oc1()});function sc1($,Z){let Q=!1,X={...$},Y=$.pinnedViews;if(Array.isArray(Y)){let W=Y.filter((K)=>K.connectionId!==Z);if(W.length!==Y.length)Q=!0,X.pinnedViews=W.length>0?W:null}let G=$.homeTile;if(G&&G.connectionId===Z)Q=!0,X.homeTile=null;let J=$.homeTiles;if(Array.isArray(J)){let W=J.filter((K)=>K.connectionId!==Z);if(W.length!==J.length)Q=!0,X.homeTiles=W.length>0?W:null}return{ui:X,changed:Q}}function zl8($){return $.replace(/\\/g,"\\\\").replace(/%/g,"\\%").replace(/_/g,"\\_")}function ac1($){let Z=$?.githubRepo?.repositoryId;return typeof Z==="string"&&Z.length>0?Z:null}class nx{db;constructor($){this.db=$}async create($,Z,Q,X){let Y=X?.id??M8("vir"),G=new Date().toISOString();await this.db.transaction().execute(async(W)=>{if(await W.insertInto("connections").values({id:Y,organization_id:$,created_by:Z,updated_by:Z,title:Q.title,description:Q.description??null,icon:Q.icon??null,app_name:null,app_id:null,connection_type:"VIRTUAL",pinned:Q.pinned??!1,connection_url:`virtual://${Y}`,connection_token:null,connection_headers:null,oauth_config:null,configuration_state:null,configuration_scopes:null,metadata:Q.metadata?JSON.stringify(Q.metadata):null,repository_id:ac1(Q.metadata),bindings:null,status:Q.status??"active",created_at:G,updated_at:G}).execute(),Q.connections.length>0)await W.insertInto("connection_aggregations").values(Q.connections.map((K)=>({id:M8("agg"),parent_connection_id:Y,child_connection_id:K.connection_id,selected_tools:K.selected_tools?JSON.stringify(K.selected_tools):null,selected_resources:K.selected_resources?JSON.stringify(K.selected_resources):null,selected_prompts:K.selected_prompts?JSON.stringify(K.selected_prompts):null,dependency_mode:"direct",created_at:G}))).execute()});let J=await this.findById(Y);if(!J)throw Error(`Failed to create virtual MCP with id: ${Y}`);return J}async findById($,Z){let Q=GQ($);if(Q)return{...Bu0(Z??Q),pinned:!1,connections:[]};let X=m50($);if(X)return{...zc1(Z??X),pinned:!1,connections:[]};return this.findByIdInternal(this.db,$)}async findByIdInternal($,Z){let Q=await $.selectFrom("connections").selectAll().where("id","=",Z).where("connection_type","=","VIRTUAL").executeTakeFirst();if(!Q)return null;let X=await $.selectFrom("connection_aggregations").selectAll().where("parent_connection_id","=",Z).where("dependency_mode","=","direct").execute();return this.deserializeVirtualMCPEntity(Q,X)}async searchAcrossMemberships($){let{userId:Z,term:Q,limit:X,offset:Y=0,organizationId:G}=$,J=`%${zl8(Q)}%`,W=this.db.selectFrom("connections").innerJoin("member",(H)=>H.onRef("member.organizationId","=","connections.organization_id").on("member.userId","=",Z)).innerJoin("organization","organization.id","connections.organization_id").where("connections.connection_type","=","VIRTUAL").where((H)=>H.or([H("connections.title","ilike",J),H("connections.description","ilike",J)]));if(G)W=W.where("connections.organization_id","=",G);return(await W.select(["connections.id as id","connections.title as title","connections.icon as icon","connections.metadata as metadata","connections.organization_id as organization_id","organization.name as organization_name","organization.slug as organization_slug","organization.metadata as organization_metadata"]).orderBy("connections.updated_at","desc").orderBy("connections.id","asc").limit(X).offset(Y).execute()).map((H)=>({id:H.id,title:H.title,icon:H.icon,metadata:this.parseJson(H.metadata),organization_id:H.organization_id,organization_name:H.organization_name,organization_slug:H.organization_slug,organization_metadata:H.organization_metadata}))}async list($,Z){let Q=this.db.selectFrom("connections").selectAll().where("organization_id","=",$).where("connection_type","=","VIRTUAL");if(Z?.pinnedOnly)Q=Q.where("pinned","=",!0);let X=await Q.orderBy("created_at","asc").orderBy("id","asc").execute(),Y=X.map((W)=>W.id);if(Y.length===0)return[];let G=await this.db.selectFrom("connection_aggregations").selectAll().where("parent_connection_id","in",Y).where("dependency_mode","=","direct").execute(),J=new Map;for(let W of G){let K=J.get(W.parent_connection_id)??[];K.push(W),J.set(W.parent_connection_id,K)}return X.map((W)=>this.deserializeVirtualMCPEntity(W,J.get(W.id)??[]))}async listByIds($,Z){if(Z.length===0)return[];let Q=await this.db.selectFrom("connections").selectAll().where("id","in",Z).where("organization_id","=",$).where("connection_type","=","VIRTUAL").execute();if(Q.length===0)return[];let X=Q.map((J)=>J.id),Y=await this.db.selectFrom("connection_aggregations").selectAll().where("parent_connection_id","in",X).where("dependency_mode","=","direct").execute(),G=new Map;for(let J of Y){let W=G.get(J.parent_connection_id)??[];W.push(J),G.set(J.parent_connection_id,W)}return Q.map((J)=>this.deserializeVirtualMCPEntity(J,G.get(J.id)??[]))}async listByConnectionId($,Z){let X=(await this.db.selectFrom("connection_aggregations").select("parent_connection_id").where("child_connection_id","=",Z).execute()).map((K)=>K.parent_connection_id);if(X.length===0)return[];let Y=await this.db.selectFrom("connections").selectAll().where("id","in",X).where("organization_id","=",$).where("connection_type","=","VIRTUAL").execute();if(Y.length===0)return[];let G=Y.map((K)=>K.id),J=await this.db.selectFrom("connection_aggregations").selectAll().where("parent_connection_id","in",G).where("dependency_mode","=","direct").execute(),W=new Map;for(let K of J){let H=W.get(K.parent_connection_id)??[];H.push(K),W.set(K.parent_connection_id,H)}return Y.map((K)=>this.deserializeVirtualMCPEntity(K,W.get(K.id)??[]))}async update($,Z,Q){let X=new Date().toISOString(),Y={updated_at:X,updated_by:Z};if(Q.title!==void 0)Y.title=Q.title;if(Q.description!==void 0)Y.description=Q.description;if(Q.icon!==void 0)Y.icon=Q.icon;if(Q.status!==void 0)Y.status=Q.status;if(Q.pinned!==void 0)Y.pinned=Q.pinned;if(Q.metadata!==void 0)Y.repository_id=ac1(Q.metadata),Y.metadata=Q.metadata?JSON.stringify(Q.metadata):null;let G=[];await this.db.transaction().execute(async(W)=>{if(await W.updateTable("connections").set(Y).where("id","=",$).where("connection_type","=","VIRTUAL").execute(),Q.connections!==void 0){let K=await W.selectFrom("connection_aggregations").select("child_connection_id").where("parent_connection_id","=",$).where("dependency_mode","=","direct").execute(),H=new Set(K.map((U)=>U.child_connection_id));if(await W.deleteFrom("connection_aggregations").where("parent_connection_id","=",$).where("dependency_mode","=","direct").execute(),Q.connections.length>0)await W.insertInto("connection_aggregations").values(Q.connections.map((U)=>({id:M8("agg"),parent_connection_id:$,child_connection_id:U.connection_id,selected_tools:U.selected_tools?JSON.stringify(U.selected_tools):null,selected_resources:U.selected_resources?JSON.stringify(U.selected_resources):null,selected_prompts:U.selected_prompts?JSON.stringify(U.selected_prompts):null,dependency_mode:"direct",created_at:X}))).execute();let F=new Set(Q.connections.map((U)=>U.connection_id));for(let U of H)if(!F.has(U))G.push(U)}});for(let W of G)await this.cleanOrphanedPinnedViews([$],W);let J=await this.findById($);if(!J)throw Error("Virtual MCP not found after update");return J}async delete($){await this.db.transaction().execute(async(Z)=>{await Z.deleteFrom("threads").where("virtual_mcp_id","=",$).execute(),await Z.deleteFrom("connection_aggregations").where("parent_connection_id","=",$).execute(),await Z.deleteFrom("connections").where("id","=",$).where("connection_type","=","VIRTUAL").execute()})}async removeConnectionReferences($){let Z=await this.db.selectFrom("connection_aggregations").select("parent_connection_id").where("child_connection_id","=",$).execute();await this.db.deleteFrom("connection_aggregations").where("child_connection_id","=",$).execute(),await this.cleanOrphanedPinnedViews(Z.map((Q)=>Q.parent_connection_id),$)}async cleanOrphanedPinnedViews($,Z){for(let Q of $){let X=await this.db.selectFrom("connections").select("metadata").where("id","=",Q).executeTakeFirst();if(!X?.metadata)continue;let Y;try{Y=typeof X.metadata==="string"?JSON.parse(X.metadata):X.metadata}catch{continue}let G=Y.ui??null;if(!G)continue;let{ui:J,changed:W}=sc1(G,Z);if(!W)continue;let K={...Y,ui:J};await this.db.updateTable("connections").set({metadata:JSON.stringify(K)}).where("id","=",Q).execute()}}deserializeVirtualMCPEntity($,Z){let Q=$.created_at instanceof Date?$.created_at.toISOString():$.created_at,X=$.updated_at instanceof Date?$.updated_at.toISOString():$.updated_at,Y=$.status==="active"?"active":"inactive",G=this.parseJson($.metadata),{sandboxMap:J,...W}=G??{},K=J!==void 0?_y0(J):void 0;return{id:$.id,organization_id:$.organization_id,title:$.title,description:$.description,icon:$.icon,status:Y,pinned:$.pinned,created_at:Q,updated_at:X,created_by:$.created_by,updated_by:$.updated_by??void 0,metadata:{...W,instructions:G?.instructions??null,...K!==void 0?{sandboxMap:K}:{}},connections:Z.map((H)=>({connection_id:H.child_connection_id,selected_tools:this.parseJson(H.selected_tools),selected_resources:this.parseJson(H.selected_resources),selected_prompts:this.parseJson(H.selected_prompts)}))}}parseJson($){if($===null)return null;if(typeof $==="string")try{return JSON.parse($)}catch{return null}return $}}function ec1($){let Z=new Map,Q=(X,Y)=>{let G=Z.get(X);if(G)return G;let J=Y();return Z.set(X,J),J};return new Proxy($,{get(X,Y,G){if(Y==="list")return(J,W)=>Q(`list:${J}:${W?.pinnedOnly?1:0}`,()=>X.list(J,W));if(Y==="create"||Y==="update"||Y==="delete"||Y==="removeConnectionReferences")return(...J)=>{return Z.clear(),X[Y](...J)};return Reflect.get(X,Y,G)}})}var Tu0=D(()=>{YQ();k8()});function OE($){let Z=String($??"");if(Z&&!Z.includes("T"))return Z.replace(" ","T")+"Z";return Z}function P$($){return $.replace(/\0/g,"").replace(/\\/g,"\\\\").replace(/'/g,"''")}function n8($){let Z=Number($??0);return Number.isFinite(Z)?Z:0}function Al8($){if(!Pl8.has($))throw Error(`Invalid groupByColumn: ${$}`);return $}function Ru0($){if(!Tl8.test($))throw Error(`Invalid JSONPath: ${$}`);if($.startsWith("$."))return $;if($.startsWith("."))return`$${$}`;return`$.${$}`}function ku0($){return $.replace(/^\$\./,"").split(".").map((Q)=>`'${P$(Q)}'`).join(", ")}function Il8($){let Z=Rl8.exec($);if(!Z||!Z[1]||!Z[2])throw Error(`Invalid interval: ${$}`);let Q=parseInt(Z[1],10),X=Z[2],Y=ql8[X];if(Q<1||Q>Y)throw Error(`Invalid interval amount: ${Q}${X} (max ${Y}${X})`);return{amount:Q,unit:X}}function iB($,Z,Q="timestamp"){let{amount:X,unit:Y}=Il8($),J={m:"MINUTE",h:"HOUR",d:"DAY"}[Y];if(Z==="duckdb")return`time_bucket(INTERVAL '${X} ${J}', CAST(${Q} AS TIMESTAMP))`;return`toStartOfInterval(${Q}, INTERVAL ${X} ${J})`}function Ei($,Z,Q){if(Q==="duckdb")return`json_extract_string(${$}, '${Z}')`;let X=ku0(Z);return`JSONExtractString(${$}, ${X})`}function Ml8($,Z,Q){if(Q==="duckdb")return`CAST(json_extract_string(${$}, '${Z}') AS DOUBLE)`;let X=ku0(Z);return`JSONExtractFloat(${$}, ${X})`}function $d1($,Z,Q){if(Q==="duckdb")return`TRY_CAST(json_extract_string(${$}, '${Z}') AS DOUBLE)`;let X=ku0(Z);return`toFloat64OrZero(JSONExtractString(${$}, ${X}))`}function qu0($){if($===null||$===void 0)return{};if(typeof $==="object")return $;let Z=String($);try{return JSON.parse(Z)}catch{return{_decocms_truncated:Z}}}function Iu0($){return{id:String($.id??""),organizationId:String($.organization_id??""),connectionId:String($.connection_id??""),toolName:String($.tool_name??""),input:qu0($.input),output:qu0($.output),isError:$.is_error===1||$.is_error===!0||$.is_error==="1"||typeof $.is_error==="bigint"&&$.is_error===1n,errorMessage:$.error_message!=null?String($.error_message):null,durationMs:Number($.duration_ms??0),timestamp:(()=>{if($.timestamp instanceof Date)return $.timestamp.toISOString();let Z=String($.timestamp??""),Q=new Date(Z.includes("T")?Z:Z.replace(" ","T")+"Z");return Number.isNaN(Q.getTime())?Z:Q.toISOString()})(),userId:$.user_id!=null?String($.user_id):null,requestId:String($.request_id??""),userAgent:$.user_agent!=null?String($.user_agent):null,virtualMcpId:$.virtual_mcp_id!=null?String($.virtual_mcp_id):null,properties:$.properties?qu0($.properties):null}}function Yd1($,Z){let Q=[];if($.properties)for(let[X,Y]of Object.entries($.properties)){let G=P$(X),J=P$(Y);if(Z==="duckdb")Q.push(`json_extract_string(properties, '$.${G}') = '${J}'`);else Q.push(`JSONExtractString(properties, '${G}') = '${J}'`)}if($.propertyKeys)for(let X of $.propertyKeys){let Y=P$(X);if(Z==="duckdb")Q.push(`json_extract_string(properties, '$.${Y}') IS NOT NULL AND json_extract_string(properties, '$.${Y}') != ''`);else Q.push(`JSONExtractString(properties, '${Y}') IS NOT NULL AND JSONExtractString(properties, '${Y}') != ''`)}if($.propertyPatterns)for(let[X,Y]of Object.entries($.propertyPatterns)){let G=P$(X),J=P$(Y);if(Z==="duckdb")Q.push(`json_extract_string(properties, '$.${G}') ILIKE '${J}'`);else Q.push(`JSONExtractString(properties, '${G}') ILIKE '${J}'`)}if($.propertyInValues)for(let[X,Y]of Object.entries($.propertyInValues)){let G=P$(X),J=P$(Y);if(Z==="duckdb")Q.push(`list_contains(string_split(json_extract_string(properties, '$.${G}'), ','), '${J}')`);else Q.push(`has(splitByChar(',', JSONExtractString(properties, '${G}')), '${J}')`)}return Q}function Qd1($,Z){let Q=[];if(WJ(Q,Z?.startDate,$),!Z)return Q;if(Z.connectionIds?.length){let X=Z.connectionIds.map((Y)=>`'${P$(Y)}'`).join(",");Q.push(`connection_id IN (${X})`)}if(Z.toolNames?.length){let X=Z.toolNames.map((Y)=>`'${P$(Y)}'`).join(",");Q.push(`tool_name IN (${X})`)}if(Z.virtualMcpIds?.length){let X=Z.virtualMcpIds.map((Y)=>`'${P$(Y)}'`).join(",");Q.push(`virtual_mcp_id IN (${X})`)}if(Z.endDate)Q.push(JJ(Z.endDate,$));if(Z.propertyFilters)Q.push(...Yd1(Z.propertyFilters,$));return Q}function Xd1($,Z,Q="timestamp"){if(Z==="duckdb")return`CAST(${Q} AS TIMESTAMP) >= TIMESTAMP '${$.toISOString()}'`;if(Q==="bucket")return`${Q} >= parseDateTimeBestEffort('${$.toISOString()}')`;return`${Q} >= parseDateTime64BestEffort('${$.toISOString()}', 9)`}function JJ($,Z,Q="timestamp"){if(Z==="duckdb")return`CAST(${Q} AS TIMESTAMP) <= TIMESTAMP '${$.toISOString()}'`;if(Q==="bucket")return`${Q} <= parseDateTimeBestEffort('${$.toISOString()}')`;return`${Q} <= parseDateTime64BestEffort('${$.toISOString()}', 9)`}function WJ($,Z,Q,X="timestamp"){if(Z)$.push(Xd1(Z,Q,X));else if(Q==="clickhouse")$.push(Xd1(new Date(Date.now()-kl8),Q,X))}class Vu0{engine;sourceFactory;metricEngine;metricSourceFactory;dialect;metricsFromLogs;constructor($,Z,Q,X,Y="clickhouse",G=!1){this.engine=$;this.sourceFactory=Z;this.metricEngine=Q;this.metricSourceFactory=X;this.dialect=Y;this.metricsFromLogs=G}async query($){if(!$.organizationId)throw Error("organizationId is required");let Z=this.sourceFactory($.organizationId,{startDate:$.startDate,endDate:$.endDate}),Q=[`organization_id = '${P$($.organizationId)}'`];if($.connectionId)Q.push(`connection_id = '${P$($.connectionId)}'`);if($.excludeConnectionIds?.length){let N=$.excludeConnectionIds.map((B)=>`'${P$(B)}'`).join(",");Q.push(`connection_id NOT IN (${N})`)}if($.virtualMcpId)Q.push(`virtual_mcp_id = '${P$($.virtualMcpId)}'`);if($.toolName)Q.push(`tool_name = '${P$($.toolName)}'`);if($.isError!==void 0)Q.push(`is_error = ${$.isError?1:0}`);if(WJ(Q,$.startDate,this.dialect),$.endDate)Q.push(JJ($.endDate,this.dialect));if($.propertyFilters)Q.push(...Yd1($.propertyFilters,this.dialect));let X=1000,Y=Math.min(Math.max(1,Math.floor($.limit??50)),X),G=Math.max(0,Math.floor($.offset??0)),J=Q.join(" AND ");if(this.dialect==="duckdb"){let N=`SELECT ${Zd1}, count(*) OVER () AS _total FROM ${Z} WHERE ${J} ORDER BY timestamp DESC LIMIT ${Y} OFFSET ${G}`,B=await this.engine.query(N);if(B.length===0)return{logs:[],total:0};let O=Number(B[0]._total??0);return{logs:B.map(Iu0),total:O}}let W=`SELECT count(*) AS total FROM ${Z} WHERE ${J}`,K=`SELECT ${Zd1} FROM ${Z} WHERE ${J} ORDER BY timestamp DESC LIMIT ${Y} OFFSET ${G}`,[H,F]=await Promise.all([this.engine.query(W),this.engine.query(K)]),U=Number(H[0]?.total??0);return{logs:F.map(Iu0),total:U}}async getById($,Z){if(!$||!Z)return null;let X=`SELECT * FROM ${this.sourceFactory($)} WHERE organization_id = '${P$($)}' AND id = '${P$(Z)}' LIMIT 1`,Y=await this.engine.query(X);if(Y.length===0)return null;return Iu0(Y[0])}async getStats($){if(!$.organizationId)throw Error("organizationId is required");let Z=this.sourceFactory($.organizationId,{startDate:$.startDate,endDate:$.endDate}),Q=[`organization_id = '${P$($.organizationId)}'`];if(WJ(Q,$.startDate,this.dialect),$.endDate)Q.push(JJ($.endDate,this.dialect));let X=`SELECT count(*) AS total_calls, coalesce(sum(CASE WHEN is_error = 1 THEN 1.0 ELSE 0.0 END) / NULLIF(count(*), 0), 0) AS error_rate, coalesce(avg(duration_ms), 0) AS avg_duration_ms FROM ${Z} WHERE ${Q.join(" AND ")}`,G=(await this.engine.query(X))[0]??{};return{totalCalls:Number(G.total_calls??0),errorRate:Number(G.error_rate??0),avgDurationMs:Number(G.avg_duration_ms??0)}}async queryToolCallHeatmap($){if(!$.organizationId)throw Error("organizationId is required");let Z=this.sourceFactory($.organizationId,{startDate:$.startDate,endDate:$.endDate}),Q=[`organization_id = '${P$($.organizationId)}'`,"type = 'tool_call'"];if($.filters?.virtualMcpIds?.length){let J=$.filters.virtualMcpIds.map((W)=>`'${P$(W)}'`).join(",");Q.push(`virtual_mcp_id IN (${J})`)}if($.filters?.excludeConnectionIds?.length){let J=$.filters.excludeConnectionIds.map((W)=>`'${P$(W)}'`).join(",");Q.push(`connection_id NOT IN (${J})`)}if(WJ(Q,$.startDate,this.dialect),$.endDate)Q.push(JJ($.endDate,this.dialect));let X=Math.min(Math.max(1,Math.floor($.limit??500)),1000),Y=`SELECT virtual_mcp_id, tool_name, count(*) AS calls, coalesce(sum(CASE WHEN is_error = 1 THEN 1 ELSE 0 END), 0) AS errors, coalesce(sum(length(output)), 0) AS output_size FROM ${Z} WHERE ${Q.join(" AND ")} GROUP BY virtual_mcp_id, tool_name ORDER BY calls DESC LIMIT ${X}`;return{cells:(await this.engine.query(Y)).map((J)=>({virtualMcpId:J.virtual_mcp_id?String(J.virtual_mcp_id):null,toolName:String(J.tool_name??""),calls:Number(J.calls??0),errors:Number(J.errors??0),outputSize:Number(J.output_size??0)}))}}async queryLlmUsageStats($){let Z={totalCalls:0,totalErrors:0,avgDurationMs:0,p50DurationMs:0,p95DurationMs:0,totalInputTokens:0,totalOutputTokens:0,totalTokens:0,totalCostUsd:0,topTools:[],timeseries:[]};if(!$.organizationId||!$.connectionId)return Z;let Q=this.dialect,X=Q==="clickhouse",Y=this.sourceFactory($.organizationId,{startDate:$.startDate,endDate:$.endDate}),G=iB($.interval,Q,"timestamp"),J=(E)=>`coalesce(${$d1("properties",`$.${E}`,Q)}, 0)`,W=X?"count()":"count(*)",K=X?"countIf(is_error = 1)":"count(*) FILTER (WHERE is_error = 1)",H=(E)=>X?`quantile(${E})(duration_ms)`:`quantile_cont(duration_ms, ${E})`,F=[`organization_id = '${P$($.organizationId)}'`,`connection_id = '${P$($.connectionId)}'`];if(WJ(F,$.startDate,Q),$.endDate)F.push(JJ($.endDate,Q));if($.userIds?.length){let E=$.userIds.slice(0,100).map((j)=>`'${P$(j)}'`).join(",");F.push(`user_id IN (${E})`)}let U=F.join(" AND "),N=Math.min(Math.max(1,Math.floor($.topN??5)),20),B=`${W} AS calls,
|
|
109
|
+
`.trim();Pc1=YJ("site-diagnostics_"),Z85=Pc1.is,Q85=Pc1.get,Ac1=YJ("commerce-discovery_"),X85=Ac1.is,i50=Ac1.get;NE={AUTOMATION_MANAGER:YJ("studio-automation-manager_"),CONNECTION_MANAGER:YJ("studio-connection-manager_"),API_KEY_MANAGER:YJ("studio-api-key-manager_"),STORE_MANAGER:YJ("studio-store-manager_"),BRAND_MANAGER:YJ("studio-brand-manager_"),USAGE_MANAGER:YJ("studio-usage-manager_")},GJ={AUTOMATION_MANAGER:NE.AUTOMATION_MANAGER.get,CONNECTION_MANAGER:NE.CONNECTION_MANAGER.get,API_KEY_MANAGER:NE.API_KEY_MANAGER.get,STORE_MANAGER:NE.STORE_MANAGER.get,BRAND_MANAGER:NE.BRAND_MANAGER.get,USAGE_MANAGER:NE.USAGE_MANAGER.get};Ou0=["studio-agent-manager_","studio-task-manager_"],Y85=Ou0.map(YJ)});function kc1($){return $.toLowerCase().replace(/[^a-z0-9]/g,"")}function Hl8($){return kc1($).includes("deepresearch")}function Vc1($){let Z=kc1($);if(Z.includes("deepresearch"))return!1;return Fl8.some((Q)=>Z.includes(Q))}function Ul8($){return $.asyncResearch!==!0&&Vc1($.modelId)}function Nl8($){return $.asyncResearch===!0||Hl8($.modelId)||Vc1($.modelId)}function mx($,Z,Q,X){for(let Y of Q){let G=$.find((J)=>J.modelId===Y);if(G)return{keyId:Z,modelId:G.modelId,title:G.title}}for(let Y of Q){let G=$.find((J)=>J.modelId.includes(Y));if(G)return{keyId:Z,modelId:G.modelId,title:G.title}}if(X){let Y=$.find(X);if(Y)return{keyId:Z,modelId:Y.modelId,title:Y.title}}return null}function Sc1($,Z){let Q={chat:{fast:null,smart:null,thinking:null},image:null,webSearch:null,deepResearch:null};for(let X of $){let Y=Z[X.id]??[],G=X.providerId;if(!Q.chat.fast)Q.chat.fast=mx(Y,X.id,Xl8[G]??[]);if(!Q.chat.smart)Q.chat.smart=mx(Y,X.id,Yl8[G]??[]);if(!Q.chat.thinking)Q.chat.thinking=mx(Y,X.id,Gl8[G]??[]);if(!Q.image)Q.image=mx(Y,X.id,Jl8[G]??[],(J)=>J.capabilities?.includes("image")===!0);if(!Q.webSearch)Q.webSearch=mx(Y,X.id,Wl8[G]??[],Ul8);if(!Q.deepResearch)Q.deepResearch=mx(Y,X.id,Kl8[G]??[],Nl8)}return Q}var Xl8,Yl8,Gl8,Jl8,Wl8,Kl8,Fl8;var Cc1=D(()=>{Xl8={anthropic:["claude-haiku-4-5","claude-haiku"],openrouter:["qwen/qwen3.5-flash","anthropic/claude-haiku-4.5","anthropic/claude-haiku","google/gemini-3-flash"],deco:["qwen/qwen3.5-flash","anthropic/claude-haiku"],llmapi:["claude-haiku-4-5","claude-haiku","gpt-4o-mini"],google:["gemini-2.5-flash","gemini-3-flash"]},Yl8={anthropic:["claude-sonnet-5","claude-sonnet"],openrouter:["anthropic/claude-sonnet-5","anthropic/claude-sonnet","anthropic/claude-opus-4.8","google/gemini-3-pro"],deco:["anthropic/claude-sonnet-5","anthropic/claude-sonnet","anthropic/claude"],llmapi:["claude-sonnet-4-6","claude-sonnet"],google:["gemini-3-pro","gemini-3-flash"]},Gl8={anthropic:["claude-opus-4-8","claude-sonnet-5","claude-sonnet","claude-fable-5"],openrouter:["anthropic/claude-opus-4.8:extended","anthropic/claude-opus-4.8","anthropic/claude-sonnet-5:extended","anthropic/claude-sonnet-5","google/gemini-3-pro","anthropic/claude-fable-5"],deco:["anthropic/claude-opus","anthropic/claude-sonnet-4.6","anthropic/claude-sonnet","anthropic/claude-fable"],llmapi:["claude-opus-4-8","claude-opus","claude-sonnet-4-6"],google:["gemini-3-pro"]},Jl8={openrouter:["openai/gpt-image-1","google/gemini-2.0-flash-image"],deco:["openai/gpt-image-1","google/gemini-2.0-flash-image"],llmapi:["gemini-2.5-flash-image","gpt-image-1"],google:["gemini-2.0-flash-image"]},Wl8={openrouter:["perplexity/sonar","perplexity/sonar-pro"],deco:["perplexity/sonar","perplexity/sonar-pro"]},Kl8={openrouter:["perplexity/deep-research","perplexity/sonar-pro"],deco:["perplexity/deep-research","perplexity/sonar-pro"]};Fl8=["sonar","searchpreview","online"]});function p50($){if(!$)return;let Z={};for(let Q in $){let X=$[Q];if(typeof X==="object"&&X!==null){let Y={};for(let G of Bl8)if(G in X)Y[G]=X[G];Z[Q]=Y}}return Object.keys(Z).length>0?Z:void 0}var Bl8;var _c1=D(()=>{Bl8=["usage","cost","model"]});var k8=D(()=>{E60();Mc1();Cc1();_c1()});function n50($){return $.toLowerCase().trim().replace(/\//g,"-").replace(/[^a-z0-9\s_-]+/g,"").replace(/[\s_-]+/g,"-").replace(/^-+|-+$/g,"")}function mB($){if($.app_name)return $.app_name;if($.connection_url)try{let Z=new URL($.connection_url),X=((Z.port?`${Z.hostname}-${Z.port}`:Z.hostname)+Z.pathname).replace(/\/+$/,"");return n50(X)}catch{return n50($.connection_url)}if($.title)return n50($.title);return $.id??"unknown"}var t50=()=>{};var ix=300000,o50=5000,r50=1e4,Du0=3,wu0=30000,vc1=65000,s50=1000,px=3,fc1=5,bc1=60000,xc1=300000,Lu0=60000;function yc1(){if(eF.size<s50)return;let $=null,Z=1/0;for(let[Q,X]of eF)if(X.lastFailureAt<Z)Z=X.lastFailureAt,$=Q;if($)eF.delete($)}function gc1($){let Z=eF.get($);if(!Z)return yc1(),eF.set($,{consecutiveFailures:1,disabled:!1,lastFailureAt:Date.now()}),{consecutiveFailures:1,thresholdCrossed:1>=px};return Z.consecutiveFailures++,Z.lastFailureAt=Date.now(),{consecutiveFailures:Z.consecutiveFailures,thresholdCrossed:Z.consecutiveFailures>=px}}function Eu0($){let Z=eF.get($);if(Z){Z.disabled=!0;return}yc1(),eF.set($,{consecutiveFailures:px,disabled:!0,lastFailureAt:Date.now()})}function hc1($){return eF.get($)?.disabled??!1}function uc1($){eF.delete($)}var eF;var lc1=D(()=>{eF=new Map});import{sql as p$}from"kysely";function dc1($){if($.length===0)return null;let Z=$[0];if($.length===1&&Dl8.has(Z))return p$.ref(Z);if($.length===2&&cc1.has(Z)){let Q=$[1];return p$`${p$.ref(Z)}->>${p$.lit(Q)}`}if($.length>2&&cc1.has(Z)){let Q=`{${$.slice(1).join(",")}}`;return p$`${p$.ref(Z)}#>>${p$.lit(Q)}`}return null}function mc1($){if("conditions"in $){let{operator:G,conditions:J}=$;if(J.length===0)return p$`true`;let W=J.map((K)=>mc1(K));switch(G){case"and":return p$`(${p$.join(W,p$` AND `)})`;case"or":return p$`(${p$.join(W,p$` OR `)})`;case"not":return p$`NOT (${p$.join(W,p$` AND `)})`;default:return p$`true`}}let{field:Z,operator:Q,value:X}=$,Y=dc1(Z);if(!Y)return p$`true`;switch(Q){case"eq":return X===null?p$`${Y} IS NULL`:p$`${Y} = ${p$.val(X)}`;case"gt":return p$`${Y} > ${p$.val(X)}`;case"gte":return p$`${Y} >= ${p$.val(X)}`;case"lt":return p$`${Y} < ${p$.val(X)}`;case"lte":return p$`${Y} <= ${p$.val(X)}`;case"in":if(!Array.isArray(X)||X.length===0)return p$`false`;return p$`${Y} IN (${p$.join(X.map((G)=>p$.val(G)))})`;case"like":return p$`${Y} ILIKE ${p$.val(X)}`;case"contains":{let G=String(X).replace(/[%_\\]/g,"\\$&");return p$`${Y} ILIKE ${p$.val(`%${G}%`)}`}default:return p$`true`}}class Li{db;vault;constructor($,Z){this.db=$;this.vault=Z}async create($){let Z=$.id??M8("conn"),Q=new Date().toISOString(),X=await this.db.selectFrom("connections").select("organization_id").where("id","=",Z).executeTakeFirst();if(X){if(X.organization_id!==$.organization_id)throw Error("Connection ID already exists");return this.update(Z,$)}let Y=mB($),G=await this.serializeConnection({...$,id:$.id??Z,slug:Y,status:"active",created_at:Q,updated_at:Q}),J;try{J=await this.db.insertInto("connections").values(G).returningAll().executeTakeFirst()}catch(W){if(W instanceof Error&&(W.message.includes("duplicate key")||W.message.includes("unique constraint")))throw Error("Connection ID already exists");throw W}if(!J)throw Error(`Failed to create connection with id: ${Z}`);return this.deserializeConnection(J)}async createNew($){let Z=$.id??M8("conn"),Q=new Date().toISOString(),X=mB($),Y=await this.serializeConnection({...$,id:Z,slug:X,status:"active",created_at:Q,updated_at:Q}),G;try{G=await this.db.insertInto("connections").values(Y).returningAll().executeTakeFirst()}catch(J){if(J instanceof Error&&(J.message.includes("duplicate key")||J.message.includes("unique constraint")))throw Error("Connection ID already exists");throw J}if(!G)throw Error(`Failed to create connection with id: ${Z}`);return this.deserializeConnection(G)}async findById($,Z){let Q=GQ($);if(Q)return Ic1(Z??Q);let X=this.db.selectFrom("connections").selectAll().where("id","=",$);if(Z)X=X.where("organization_id","=",Z);let Y=await X.executeTakeFirst();return Y?this.deserializeConnection(Y):null}async findBySanitizedId($){let Z=$.replace(/-/g,"_"),Q=await this.db.selectFrom("connections").selectAll().where(p$`replace(id, '-', '_')`,"=",Z).where("id","!=",$).executeTakeFirst();return Q?this.deserializeConnection(Q):null}async list($,Z){let Q=this.db.selectFrom("connections").selectAll().where("organization_id","=",$);if(!Z?.includeVirtual)Q=Q.where("connection_type","!=","VIRTUAL");if(Z?.slug)Q=Q.where("slug","=",Z.slug);if(Z?.where)Q=Q.where(mc1(Z.where));let G=(await this.db.selectFrom(Q.as("filtered")).select(p$`count(*)::int`.as("count")).executeTakeFirst())?.count??0;if(Z?.orderBy&&Z.orderBy.length>0)for(let K of Z.orderBy){let H=dc1(K.field);if(!H)continue;let F=K.direction==="desc"?p$`desc`:p$`asc`,U=K.nulls==="first"?p$`nulls first`:p$`nulls last`;Q=Q.orderBy(p$`${H} ${F} ${U}`)}if(Z?.limit!==void 0)Q=Q.limit(Z.limit);if(Z?.offset)Q=Q.offset(Z.offset);let J=await Q.execute();return{items:await Promise.all(J.map((K)=>this.deserializeConnection(K))),totalCount:G}}async update($,Z){let{id:Q,organization_id:X,created_by:Y,created_at:G,...J}=Z;if(Z=J,Object.keys(Z).length===0){let U=await this.findById($);if(!U)throw Error("Connection not found");return U}let W={...Z},K=await this.db.selectFrom("connections").select(["app_name","connection_url","title"]).where("id","=",$).executeTakeFirst();if(K){let U=(N)=>Z[N]===void 0?K[N]:Z[N];W.slug=mB({app_name:U("app_name"),connection_url:U("connection_url"),title:U("title"),id:$})}let H=await this.serializeConnection({...W,updated_at:new Date().toISOString()}),F=await this.db.updateTable("connections").set(H).where("id","=",$).returningAll().executeTakeFirst();if(!F)throw Error("Connection not found after update");return this.deserializeConnection(F)}async isReferencedByThread($){return await this.db.selectFrom("threads").select("id").where(p$`metadata -> 'githubRepo' ->> 'connectionId' = ${$}`).limit(1).executeTakeFirst()!==void 0}async delete($){await this.db.deleteFrom("connections").where("id","=",$).execute()}async testConnection($,Z){let Q=await this.findById($);if(!Q)throw Error("Connection not found");let X=Date.now();if(Q.connection_type==="STDIO")return{healthy:!0,latencyMs:Date.now()-X};if(!Q.connection_url)return{healthy:!1,latencyMs:Date.now()-X};try{if(await cx(Q.connection_url))return{healthy:!1,latencyMs:Date.now()-X};let G=Q.connection_headers,J=await dB()(Q.connection_url,{method:"POST",signal:AbortSignal.timeout(1e4),headers:{"Content-Type":"application/json",...Q.connection_token&&{Authorization:`Bearer ${Q.connection_token}`},...G?.headers,...Z},body:JSON.stringify({jsonrpc:"2.0",method:"ping",id:1})});return{healthy:J.ok||J.status===404,latencyMs:Date.now()-X}}catch{return{healthy:!1,latencyMs:Date.now()-X}}}async serializeConnection($){let Z={};for(let[Q,X]of Object.entries($)){if(X===void 0)continue;if(Q==="tools")continue;if(Q==="connection_token"&&X)Z[Q]=await this.vault.encrypt(X);else if(Q==="configuration_state"&&X){let Y=JSON.stringify(X);Z[Q]=await this.vault.encrypt(Y)}else if(Q==="oauth_config"&&X)Z[Q]=await this.vault.encrypt(JSON.stringify(X));else if(Q==="connection_headers"&&X){let Y=X;if(OK(Y)&&Y.envVars){let G={};for(let[J,W]of Object.entries(Y.envVars))G[J]=await this.vault.encrypt(W);Z[Q]=JSON.stringify({...Y,envVars:G})}else Z[Q]=JSON.stringify(Y)}else if(Ol8.includes(Q))Z[Q]=X?JSON.stringify(X):null;else Z[Q]=X}return Z}async handleDecryptFailures($,Z){let Q=`connection ${$.id} (org: ${$.organization_id}, type: ${$.connection_type}, title: ${$.title})`;if(hc1($.id))return;if($.status!=="active"){Eu0($.id);return}let{thresholdCrossed:X}=gc1($.id);if(!X){for(let{label:Y,error:G}of Z)console.error(`Failed to decrypt ${Y} for ${Q}:`,G);return}try{await this.db.updateTable("connections").set({status:"error"}).where("id","=",$.id).execute(),Eu0($.id),console.error(`Disabled ${Q} after ${px} consecutive decryption failures.`,Z[0]?.error)}catch(Y){console.error(`Failed to disable ${Q} after decryption failures:`,Y)}}async deserializeConnection($){let Z=[],Q=null;if($.connection_token)try{Q=await this.vault.decrypt($.connection_token)}catch(K){Z.push({label:"connection token",error:K})}let X=null;if($.configuration_state)try{let K=await this.vault.decrypt($.configuration_state);X=JSON.parse(K)}catch(K){Z.push({label:"configuration state",error:K})}let Y=null;if(typeof $.oauth_config==="string")try{Y=JSON.parse(await this.vault.decrypt($.oauth_config))}catch{try{Y=JSON.parse($.oauth_config)}catch(K){Z.push({label:"oauth config",error:K})}}else Y=$.oauth_config;let G=null,J=!1;if($.connection_headers)try{let K=JSON.parse($.connection_headers);if(OK(K)&&K.envVars){J=!0;let H={};for(let[F,U]of Object.entries(K.envVars))try{H[F]=await this.vault.decrypt(U)}catch(N){H[F]="",Z.push({label:`env var "${F}"`,error:N})}G={...K,envVars:H}}else G=K}catch(K){console.error(`Failed to parse connection_headers for connection ${$.id} (org: ${$.organization_id}, type: ${$.connection_type}, title: ${$.title}):`,K)}if(Z.length>0)await this.handleDecryptFailures($,Z);else if($.connection_token||$.configuration_state||$.oauth_config||J)uc1($.id);let W=(K)=>{if(K===null)return null;if(typeof K==="string")try{return JSON.parse(K)}catch{return null}return K};return{id:$.id,organization_id:$.organization_id,created_by:$.created_by,updated_by:$.updated_by??void 0,title:$.title,description:$.description,icon:$.icon,app_name:$.app_name,app_id:$.app_id,slug:$.slug,connection_type:$.connection_type,connection_url:$.connection_url,connection_token:Q,connection_headers:G,oauth_config:Y,configuration_state:X,configuration_scopes:W($.configuration_scopes),metadata:W($.metadata),tools:null,bindings:W($.bindings),status:$.status,created_at:$.created_at,updated_at:$.updated_at}}}var Ol8,Dl8,cc1;var ju0=D(()=>{wK();FE();YQ();k8();t50();lc1();Ol8=["connection_headers","configuration_scopes","metadata","bindings"],Dl8=new Set(["id","organization_id","created_by","updated_by","title","description","icon","app_name","app_id","slug","connection_type","connection_url","status","created_at","updated_at"]),cc1=new Set(["metadata","configuration_scopes","bindings"])});import{createHash as wl8,randomBytes as Ll8,timingSafeEqual as V85}from"crypto";function jl8($){return $.toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function Pu0($){return wl8("sha256").update($).digest("hex")}function nc1($){let Z=zu0.length+1,Q=Z+pc1;if(!$.startsWith(`${zu0}_`)||$.length<=Q+1||$[Q]!=="_")return null;let X=$.slice(Z,Q),Y=$.slice(Q+1);if(!ic1.test(X)||!ic1.test(Y))return null;return X}function tc1(){let $=jl8(Ll8(El8)),Z=$.slice(0,pc1),Q=`${zu0}_${Z}_${$}`;return{plaintext:Q,prefix:Z,hash:Pu0(Q)}}var zu0="stv",El8=32,pc1=12,ic1;var oc1=D(()=>{ic1=/^[A-Za-z0-9_-]+$/});function rc1($){return{id:$.id,organizationId:$.organization_id,subjectConnectionId:$.subject_connection_id,tokenHash:$.token_hash,tokenPrefix:$.token_prefix,name:$.name,revokedAt:$.revoked_at,lastUsedAt:$.last_used_at,createdAt:$.created_at,updatedAt:$.updated_at}}class Au0{db;constructor($){this.db=$}async createOrRotateWorkloadToken($){let Z=$.name??"default";return await this.db.transaction().execute(async(X)=>{if(!await X.selectFrom("connections").select("id").where("id","=",$.subjectConnectionId).where("organization_id","=",$.organizationId).executeTakeFirst())throw Error("Subject connection not found in organization");let G=tc1(),J=new Date().toISOString();await X.updateTable("connection_workload_tokens").set({revoked_at:J,updated_at:J}).where("organization_id","=",$.organizationId).where("subject_connection_id","=",$.subjectConnectionId).where("name","=",Z).where("revoked_at","is",null).execute();let W=await X.insertInto("connection_workload_tokens").values({id:M8("cwt"),organization_id:$.organizationId,subject_connection_id:$.subjectConnectionId,token_hash:G.hash,token_prefix:G.prefix,name:Z,revoked_at:null,last_used_at:null,created_at:J,updated_at:J}).returningAll().executeTakeFirstOrThrow();return{plaintextToken:G.plaintext,record:rc1(W)}})}async findActiveWorkloadToken($){let Z=await this.db.selectFrom("connection_workload_tokens").selectAll().where("organization_id","=",$.organizationId).where("subject_connection_id","=",$.subjectConnectionId).where("name","=",$.name??"default").where("revoked_at","is",null).executeTakeFirst();return Z?rc1(Z):null}async revokeWorkloadToken($){let Z=new Date().toISOString();await this.db.updateTable("connection_workload_tokens").set({revoked_at:Z,updated_at:Z}).where("id","=",$.tokenId).where("organization_id","=",$.organizationId).where("subject_connection_id","=",$.subjectConnectionId).where("revoked_at","is",null).execute()}async authenticateWorkloadToken($){let Z=nc1($);if(!Z)return null;let Q=Pu0($),X=await this.db.selectFrom("connection_workload_tokens").select(["id","organization_id","subject_connection_id","token_prefix"]).where("token_prefix","=",Z).where("token_hash","=",Q).where("revoked_at","is",null).executeTakeFirst();if(!X)return null;let Y=new Date().toISOString();return await this.db.updateTable("connection_workload_tokens").set({last_used_at:Y,updated_at:Y}).where("id","=",X.id).execute(),{tokenId:X.id,tokenPrefix:X.token_prefix,organizationId:X.organization_id,subjectConnectionId:X.subject_connection_id}}async replaceGrantsForSubject($){await this.db.transaction().execute(async(Z)=>{if(!await Z.selectFrom("connections").select("id").where("id","=",$.subjectConnectionId).where("organization_id","=",$.organizationId).executeTakeFirst())throw Error("Referenced connection not found in organization");let X=[...new Set($.grants.map((J)=>J.targetConnectionId))];if(X.length>0){if((await Z.selectFrom("connections").select("id").where("organization_id","=",$.organizationId).where("id","in",X).execute()).length!==X.length)throw Error("Referenced connection not found in organization")}if(await Z.deleteFrom("connection_credential_grants").where("organization_id","=",$.organizationId).where("subject_connection_id","=",$.subjectConnectionId).execute(),$.grants.length===0)return;let Y=new Date().toISOString(),G=$.grants.map((J)=>({id:M8("ccg"),organization_id:$.organizationId,subject_connection_id:$.subjectConnectionId,target_connection_id:J.targetConnectionId,scope:J.scope,created_by:$.createdBy,created_at:Y,updated_at:Y}));await Z.insertInto("connection_credential_grants").values(G).execute()})}async hasGrant($){return!!await this.db.selectFrom("connection_credential_grants").select("id").where("organization_id","=",$.organizationId).where("subject_connection_id","=",$.subjectConnectionId).where("target_connection_id","=",$.targetConnectionId).where("scope","=",$.scope).executeTakeFirst()}}var a50="credential:access-token:read",e50="credential:configuration:read";var $90=D(()=>{YQ();oc1()});function sc1($,Z){let Q=!1,X={...$},Y=$.pinnedViews;if(Array.isArray(Y)){let W=Y.filter((K)=>K.connectionId!==Z);if(W.length!==Y.length)Q=!0,X.pinnedViews=W.length>0?W:null}let G=$.homeTile;if(G&&G.connectionId===Z)Q=!0,X.homeTile=null;let J=$.homeTiles;if(Array.isArray(J)){let W=J.filter((K)=>K.connectionId!==Z);if(W.length!==J.length)Q=!0,X.homeTiles=W.length>0?W:null}return{ui:X,changed:Q}}function zl8($){return $.replace(/\\/g,"\\\\").replace(/%/g,"\\%").replace(/_/g,"\\_")}function ac1($){let Z=$?.githubRepo?.repositoryId;return typeof Z==="string"&&Z.length>0?Z:null}class nx{db;constructor($){this.db=$}async create($,Z,Q,X){let Y=X?.id??M8("vir"),G=new Date().toISOString();await this.db.transaction().execute(async(W)=>{if(await W.insertInto("connections").values({id:Y,organization_id:$,created_by:Z,updated_by:Z,title:Q.title,description:Q.description??null,icon:Q.icon??null,app_name:null,app_id:null,connection_type:"VIRTUAL",pinned:Q.pinned??!1,connection_url:`virtual://${Y}`,connection_token:null,connection_headers:null,oauth_config:null,configuration_state:null,configuration_scopes:null,metadata:Q.metadata?JSON.stringify(Q.metadata):null,repository_id:ac1(Q.metadata),bindings:null,status:Q.status??"active",created_at:G,updated_at:G}).execute(),Q.connections.length>0)await W.insertInto("connection_aggregations").values(Q.connections.map((K)=>({id:M8("agg"),parent_connection_id:Y,child_connection_id:K.connection_id,selected_tools:K.selected_tools?JSON.stringify(K.selected_tools):null,selected_resources:K.selected_resources?JSON.stringify(K.selected_resources):null,selected_prompts:K.selected_prompts?JSON.stringify(K.selected_prompts):null,dependency_mode:"direct",created_at:G}))).execute()});let J=await this.findById(Y);if(!J)throw Error(`Failed to create virtual MCP with id: ${Y}`);return J}async findById($,Z){let Q=GQ($);if(Q)return{...Bu0(Z??Q),pinned:!1,connections:[]};let X=m50($);if(X)return{...zc1(Z??X),pinned:!1,connections:[]};return this.findByIdInternal(this.db,$)}async findByIdInternal($,Z){let Q=await $.selectFrom("connections").selectAll().where("id","=",Z).where("connection_type","=","VIRTUAL").executeTakeFirst();if(!Q)return null;let X=await $.selectFrom("connection_aggregations").selectAll().where("parent_connection_id","=",Z).where("dependency_mode","=","direct").execute();return this.deserializeVirtualMCPEntity(Q,X)}async searchAcrossMemberships($){let{userId:Z,term:Q,limit:X,offset:Y=0,organizationId:G}=$,J=`%${zl8(Q)}%`,W=this.db.selectFrom("connections").innerJoin("member",(H)=>H.onRef("member.organizationId","=","connections.organization_id").on("member.userId","=",Z)).innerJoin("organization","organization.id","connections.organization_id").where("connections.connection_type","=","VIRTUAL").where((H)=>H.or([H("connections.title","ilike",J),H("connections.description","ilike",J)]));if(G)W=W.where("connections.organization_id","=",G);return(await W.select(["connections.id as id","connections.title as title","connections.icon as icon","connections.metadata as metadata","connections.organization_id as organization_id","organization.name as organization_name","organization.slug as organization_slug","organization.metadata as organization_metadata"]).orderBy("connections.updated_at","desc").orderBy("connections.id","asc").limit(X).offset(Y).execute()).map((H)=>({id:H.id,title:H.title,icon:H.icon,metadata:this.parseJson(H.metadata),organization_id:H.organization_id,organization_name:H.organization_name,organization_slug:H.organization_slug,organization_metadata:H.organization_metadata}))}async list($,Z){let Q=this.db.selectFrom("connections").selectAll().where("organization_id","=",$).where("connection_type","=","VIRTUAL");if(Z?.pinnedOnly)Q=Q.where("pinned","=",!0);let X=await Q.orderBy("created_at","asc").orderBy("id","asc").execute(),Y=X.map((W)=>W.id);if(Y.length===0)return[];let G=await this.db.selectFrom("connection_aggregations").selectAll().where("parent_connection_id","in",Y).where("dependency_mode","=","direct").execute(),J=new Map;for(let W of G){let K=J.get(W.parent_connection_id)??[];K.push(W),J.set(W.parent_connection_id,K)}return X.map((W)=>this.deserializeVirtualMCPEntity(W,J.get(W.id)??[]))}async listByIds($,Z){if(Z.length===0)return[];let Q=await this.db.selectFrom("connections").selectAll().where("id","in",Z).where("organization_id","=",$).where("connection_type","=","VIRTUAL").execute();if(Q.length===0)return[];let X=Q.map((J)=>J.id),Y=await this.db.selectFrom("connection_aggregations").selectAll().where("parent_connection_id","in",X).where("dependency_mode","=","direct").execute(),G=new Map;for(let J of Y){let W=G.get(J.parent_connection_id)??[];W.push(J),G.set(J.parent_connection_id,W)}return Q.map((J)=>this.deserializeVirtualMCPEntity(J,G.get(J.id)??[]))}async listByConnectionId($,Z){let X=(await this.db.selectFrom("connection_aggregations").select("parent_connection_id").where("child_connection_id","=",Z).execute()).map((K)=>K.parent_connection_id);if(X.length===0)return[];let Y=await this.db.selectFrom("connections").selectAll().where("id","in",X).where("organization_id","=",$).where("connection_type","=","VIRTUAL").execute();if(Y.length===0)return[];let G=Y.map((K)=>K.id),J=await this.db.selectFrom("connection_aggregations").selectAll().where("parent_connection_id","in",G).where("dependency_mode","=","direct").execute(),W=new Map;for(let K of J){let H=W.get(K.parent_connection_id)??[];H.push(K),W.set(K.parent_connection_id,H)}return Y.map((K)=>this.deserializeVirtualMCPEntity(K,W.get(K.id)??[]))}async update($,Z,Q){let X=new Date().toISOString(),Y={updated_at:X,updated_by:Z};if(Q.title!==void 0)Y.title=Q.title;if(Q.description!==void 0)Y.description=Q.description;if(Q.icon!==void 0)Y.icon=Q.icon;if(Q.status!==void 0)Y.status=Q.status;if(Q.pinned!==void 0)Y.pinned=Q.pinned;if(Q.metadata!==void 0)Y.repository_id=ac1(Q.metadata),Y.metadata=Q.metadata?JSON.stringify(Q.metadata):null;let G=[];await this.db.transaction().execute(async(W)=>{if(await W.updateTable("connections").set(Y).where("id","=",$).where("connection_type","=","VIRTUAL").execute(),Q.connections!==void 0){let K=await W.selectFrom("connection_aggregations").select("child_connection_id").where("parent_connection_id","=",$).where("dependency_mode","=","direct").execute(),H=new Set(K.map((U)=>U.child_connection_id));if(await W.deleteFrom("connection_aggregations").where("parent_connection_id","=",$).where("dependency_mode","=","direct").execute(),Q.connections.length>0)await W.insertInto("connection_aggregations").values(Q.connections.map((U)=>({id:M8("agg"),parent_connection_id:$,child_connection_id:U.connection_id,selected_tools:U.selected_tools?JSON.stringify(U.selected_tools):null,selected_resources:U.selected_resources?JSON.stringify(U.selected_resources):null,selected_prompts:U.selected_prompts?JSON.stringify(U.selected_prompts):null,dependency_mode:"direct",created_at:X}))).execute();let F=new Set(Q.connections.map((U)=>U.connection_id));for(let U of H)if(!F.has(U))G.push(U)}});for(let W of G)await this.cleanOrphanedPinnedViews([$],W);let J=await this.findById($);if(!J)throw Error("Virtual MCP not found after update");return J}async delete($){await this.db.transaction().execute(async(Z)=>{await Z.deleteFrom("threads").where("virtual_mcp_id","=",$).execute(),await Z.deleteFrom("connection_aggregations").where("parent_connection_id","=",$).execute(),await Z.deleteFrom("connections").where("id","=",$).where("connection_type","=","VIRTUAL").execute()})}async removeConnectionReferences($){let Z=await this.db.selectFrom("connection_aggregations").select("parent_connection_id").where("child_connection_id","=",$).execute();await this.db.deleteFrom("connection_aggregations").where("child_connection_id","=",$).execute(),await this.cleanOrphanedPinnedViews(Z.map((Q)=>Q.parent_connection_id),$)}async cleanOrphanedPinnedViews($,Z){for(let Q of $){let X=await this.db.selectFrom("connections").select("metadata").where("id","=",Q).executeTakeFirst();if(!X?.metadata)continue;let Y;try{Y=typeof X.metadata==="string"?JSON.parse(X.metadata):X.metadata}catch{continue}let G=Y.ui??null;if(!G)continue;let{ui:J,changed:W}=sc1(G,Z);if(!W)continue;let K={...Y,ui:J};await this.db.updateTable("connections").set({metadata:JSON.stringify(K)}).where("id","=",Q).execute()}}deserializeVirtualMCPEntity($,Z){let Q=$.created_at instanceof Date?$.created_at.toISOString():$.created_at,X=$.updated_at instanceof Date?$.updated_at.toISOString():$.updated_at,Y=$.status==="active"?"active":"inactive",G=this.parseJson($.metadata),{sandboxMap:J,...W}=G??{},K=J!==void 0?_y0(J):void 0;return{id:$.id,organization_id:$.organization_id,title:$.title,description:$.description,icon:$.icon,status:Y,pinned:$.pinned,created_at:Q,updated_at:X,created_by:$.created_by,updated_by:$.updated_by??void 0,metadata:{...W,instructions:G?.instructions??null,...K!==void 0?{sandboxMap:K}:{}},connections:Z.map((H)=>({connection_id:H.child_connection_id,selected_tools:this.parseJson(H.selected_tools),selected_resources:this.parseJson(H.selected_resources),selected_prompts:this.parseJson(H.selected_prompts)}))}}parseJson($){if($===null)return null;if(typeof $==="string")try{return JSON.parse($)}catch{return null}return $}}function ec1($){let Z=new Map,Q=(X,Y)=>{let G=Z.get(X);if(G)return G;let J=Y();return Z.set(X,J),J};return new Proxy($,{get(X,Y,G){if(Y==="list")return(J,W)=>Q(`list:${J}:${W?.pinnedOnly?1:0}`,()=>X.list(J,W));if(Y==="create"||Y==="update"||Y==="delete"||Y==="removeConnectionReferences")return(...J)=>{return Z.clear(),X[Y](...J)};return Reflect.get(X,Y,G)}})}var Tu0=D(()=>{YQ();k8()});function OE($){let Z=String($??"");if(Z&&!Z.includes("T"))return Z.replace(" ","T")+"Z";return Z}function P$($){return $.replace(/\0/g,"").replace(/\\/g,"\\\\").replace(/'/g,"''")}function n8($){let Z=Number($??0);return Number.isFinite(Z)?Z:0}function Al8($){if(!Pl8.has($))throw Error(`Invalid groupByColumn: ${$}`);return $}function Ru0($){if(!Tl8.test($))throw Error(`Invalid JSONPath: ${$}`);if($.startsWith("$."))return $;if($.startsWith("."))return`$${$}`;return`$.${$}`}function ku0($){return $.replace(/^\$\./,"").split(".").map((Q)=>`'${P$(Q)}'`).join(", ")}function Il8($){let Z=Rl8.exec($);if(!Z||!Z[1]||!Z[2])throw Error(`Invalid interval: ${$}`);let Q=parseInt(Z[1],10),X=Z[2],Y=ql8[X];if(Q<1||Q>Y)throw Error(`Invalid interval amount: ${Q}${X} (max ${Y}${X})`);return{amount:Q,unit:X}}function iB($,Z,Q="timestamp"){let{amount:X,unit:Y}=Il8($),J={m:"MINUTE",h:"HOUR",d:"DAY"}[Y];if(Z==="duckdb")return`time_bucket(INTERVAL '${X} ${J}', CAST(${Q} AS TIMESTAMP))`;return`toStartOfInterval(${Q}, INTERVAL ${X} ${J})`}function Ei($,Z,Q){if(Q==="duckdb")return`json_extract_string(${$}, '${Z}')`;let X=ku0(Z);return`JSONExtractString(${$}, ${X})`}function Ml8($,Z,Q){if(Q==="duckdb")return`CAST(json_extract_string(${$}, '${Z}') AS DOUBLE)`;let X=ku0(Z);return`JSONExtractFloat(${$}, ${X})`}function $d1($,Z,Q){if(Q==="duckdb")return`TRY_CAST(json_extract_string(${$}, '${Z}') AS DOUBLE)`;let X=ku0(Z);return`toFloat64OrZero(JSONExtractString(${$}, ${X}))`}function qu0($){if($===null||$===void 0)return{};if(typeof $==="object")return $;let Z=String($);try{return JSON.parse(Z)}catch{return{_decocms_truncated:Z}}}function Iu0($){return{id:String($.id??""),organizationId:String($.organization_id??""),connectionId:String($.connection_id??""),toolName:String($.tool_name??""),input:qu0($.input),output:qu0($.output),isError:$.is_error===1||$.is_error===!0||$.is_error==="1"||typeof $.is_error==="bigint"&&$.is_error===1n,errorMessage:$.error_message!=null?String($.error_message):null,durationMs:Number($.duration_ms??0),timestamp:(()=>{if($.timestamp instanceof Date)return $.timestamp.toISOString();let Z=String($.timestamp??""),Q=new Date(Z.includes("T")?Z:Z.replace(" ","T")+"Z");return Number.isNaN(Q.getTime())?Z:Q.toISOString()})(),userId:$.user_id!=null?String($.user_id):null,requestId:String($.request_id??""),userAgent:$.user_agent!=null?String($.user_agent):null,virtualMcpId:$.virtual_mcp_id!=null?String($.virtual_mcp_id):null,properties:$.properties?qu0($.properties):null}}function Yd1($,Z){let Q=[];if($.properties)for(let[X,Y]of Object.entries($.properties)){let G=P$(X),J=P$(Y);if(Z==="duckdb")Q.push(`json_extract_string(properties, '$.${G}') = '${J}'`);else Q.push(`JSONExtractString(properties, '${G}') = '${J}'`)}if($.propertyKeys)for(let X of $.propertyKeys){let Y=P$(X);if(Z==="duckdb")Q.push(`json_extract_string(properties, '$.${Y}') IS NOT NULL AND json_extract_string(properties, '$.${Y}') != ''`);else Q.push(`JSONExtractString(properties, '${Y}') IS NOT NULL AND JSONExtractString(properties, '${Y}') != ''`)}if($.propertyPatterns)for(let[X,Y]of Object.entries($.propertyPatterns)){let G=P$(X),J=P$(Y);if(Z==="duckdb")Q.push(`json_extract_string(properties, '$.${G}') ILIKE '${J}'`);else Q.push(`JSONExtractString(properties, '${G}') ILIKE '${J}'`)}if($.propertyInValues)for(let[X,Y]of Object.entries($.propertyInValues)){let G=P$(X),J=P$(Y);if(Z==="duckdb")Q.push(`list_contains(string_split(json_extract_string(properties, '$.${G}'), ','), '${J}')`);else Q.push(`has(splitByChar(',', JSONExtractString(properties, '${G}')), '${J}')`)}return Q}function Qd1($,Z){let Q=[];if(WJ(Q,Z?.startDate,$),!Z)return Q;if(Z.connectionIds?.length){let X=Z.connectionIds.map((Y)=>`'${P$(Y)}'`).join(",");Q.push(`connection_id IN (${X})`)}if(Z.toolNames?.length){let X=Z.toolNames.map((Y)=>`'${P$(Y)}'`).join(",");Q.push(`tool_name IN (${X})`)}if(Z.virtualMcpIds?.length){let X=Z.virtualMcpIds.map((Y)=>`'${P$(Y)}'`).join(",");Q.push(`virtual_mcp_id IN (${X})`)}if(Z.endDate)Q.push(JJ(Z.endDate,$));if(Z.propertyFilters)Q.push(...Yd1(Z.propertyFilters,$));return Q}function Xd1($,Z,Q="timestamp"){if(Z==="duckdb")return`CAST(${Q} AS TIMESTAMP) >= TIMESTAMP '${$.toISOString()}'`;if(Q==="bucket")return`${Q} >= parseDateTimeBestEffort('${$.toISOString()}')`;return`${Q} >= parseDateTime64BestEffort('${$.toISOString()}', 9)`}function JJ($,Z,Q="timestamp"){if(Z==="duckdb")return`CAST(${Q} AS TIMESTAMP) <= TIMESTAMP '${$.toISOString()}'`;if(Q==="bucket")return`${Q} <= parseDateTimeBestEffort('${$.toISOString()}')`;return`${Q} <= parseDateTime64BestEffort('${$.toISOString()}', 9)`}function WJ($,Z,Q,X="timestamp"){if(Z)$.push(Xd1(Z,Q,X));else if(Q==="clickhouse")$.push(Xd1(new Date(Date.now()-kl8),Q,X))}class Vu0{engine;sourceFactory;metricEngine;metricSourceFactory;dialect;metricsFromLogs;constructor($,Z,Q,X,Y="clickhouse",G=!1){this.engine=$;this.sourceFactory=Z;this.metricEngine=Q;this.metricSourceFactory=X;this.dialect=Y;this.metricsFromLogs=G}async query($){if(!$.organizationId)throw Error("organizationId is required");let Z=this.sourceFactory($.organizationId,{startDate:$.startDate,endDate:$.endDate}),Q=[`organization_id = '${P$($.organizationId)}'`];if($.connectionId)Q.push(`connection_id = '${P$($.connectionId)}'`);if($.excludeConnectionIds?.length){let N=$.excludeConnectionIds.map((B)=>`'${P$(B)}'`).join(",");Q.push(`connection_id NOT IN (${N})`)}if($.virtualMcpId)Q.push(`virtual_mcp_id = '${P$($.virtualMcpId)}'`);if($.toolName)Q.push(`tool_name = '${P$($.toolName)}'`);if($.isError!==void 0)Q.push(`is_error = ${$.isError?1:0}`);if(WJ(Q,$.startDate,this.dialect),$.endDate)Q.push(JJ($.endDate,this.dialect));if($.propertyFilters)Q.push(...Yd1($.propertyFilters,this.dialect));let X=1000,Y=Math.min(Math.max(1,Math.floor($.limit??50)),X),G=Math.max(0,Math.floor($.offset??0)),J=Q.join(" AND ");if(this.dialect==="duckdb"){let N=`SELECT ${Zd1}, count(*) OVER () AS _total FROM ${Z} WHERE ${J} ORDER BY timestamp DESC LIMIT ${Y} OFFSET ${G}`,B=await this.engine.query(N);if(B.length===0)return{logs:[],total:0};let O=Number(B[0]._total??0);return{logs:B.map(Iu0),total:O}}let W=`SELECT count(*) AS total FROM ${Z} WHERE ${J}`,K=`SELECT ${Zd1} FROM ${Z} WHERE ${J} ORDER BY timestamp DESC LIMIT ${Y} OFFSET ${G}`,[H,F]=await Promise.all([this.engine.query(W),this.engine.query(K)]),U=Number(H[0]?.total??0);return{logs:F.map(Iu0),total:U}}async getById($,Z){if(!$||!Z)return null;let X=`SELECT * FROM ${this.sourceFactory($)} WHERE organization_id = '${P$($)}' AND id = '${P$(Z)}' LIMIT 1`,Y=await this.engine.query(X);if(Y.length===0)return null;return Iu0(Y[0])}async getStats($){if(!$.organizationId)throw Error("organizationId is required");let Z=this.sourceFactory($.organizationId,{startDate:$.startDate,endDate:$.endDate}),Q=[`organization_id = '${P$($.organizationId)}'`];if(WJ(Q,$.startDate,this.dialect),$.endDate)Q.push(JJ($.endDate,this.dialect));let X=`SELECT count(*) AS total_calls, coalesce(sum(CASE WHEN is_error = 1 THEN 1.0 ELSE 0.0 END) / NULLIF(count(*), 0), 0) AS error_rate, coalesce(avg(duration_ms), 0) AS avg_duration_ms FROM ${Z} WHERE ${Q.join(" AND ")}`,G=(await this.engine.query(X))[0]??{};return{totalCalls:Number(G.total_calls??0),errorRate:Number(G.error_rate??0),avgDurationMs:Number(G.avg_duration_ms??0)}}async queryToolCallHeatmap($){if(!$.organizationId)throw Error("organizationId is required");let Z=this.sourceFactory($.organizationId,{startDate:$.startDate,endDate:$.endDate}),Q=[`organization_id = '${P$($.organizationId)}'`,"type = 'tool_call'"];if($.filters?.virtualMcpIds?.length){let J=$.filters.virtualMcpIds.map((W)=>`'${P$(W)}'`).join(",");Q.push(`virtual_mcp_id IN (${J})`)}if($.filters?.excludeConnectionIds?.length){let J=$.filters.excludeConnectionIds.map((W)=>`'${P$(W)}'`).join(",");Q.push(`connection_id NOT IN (${J})`)}if(WJ(Q,$.startDate,this.dialect),$.endDate)Q.push(JJ($.endDate,this.dialect));let X=Math.min(Math.max(1,Math.floor($.limit??500)),1000),Y=`SELECT virtual_mcp_id, tool_name, count(*) AS calls, coalesce(sum(CASE WHEN is_error = 1 THEN 1 ELSE 0 END), 0) AS errors, coalesce(sum(length(output)), 0) AS output_size FROM ${Z} WHERE ${Q.join(" AND ")} GROUP BY virtual_mcp_id, tool_name ORDER BY calls DESC LIMIT ${X}`;return{cells:(await this.engine.query(Y)).map((J)=>({virtualMcpId:J.virtual_mcp_id?String(J.virtual_mcp_id):null,toolName:String(J.tool_name??""),calls:Number(J.calls??0),errors:Number(J.errors??0),outputSize:Number(J.output_size??0)}))}}async queryLlmUsageStats($){let Z={totalCalls:0,totalErrors:0,avgDurationMs:0,p50DurationMs:0,p95DurationMs:0,totalInputTokens:0,totalOutputTokens:0,totalTokens:0,totalCostUsd:0,topTools:[],timeseries:[]};if(!$.organizationId||!$.connectionId)return Z;let Q=this.dialect,X=Q==="clickhouse",Y=this.sourceFactory($.organizationId,{startDate:$.startDate,endDate:$.endDate}),G=iB($.interval,Q,"timestamp"),J=(E)=>`coalesce(${$d1("properties",`$.${E}`,Q)}, 0)`,W=X?"count()":"count(*)",K=X?"countIf(is_error = 1)":"count(*) FILTER (WHERE is_error = 1)",H=(E)=>X?`quantile(${E})(duration_ms)`:`quantile_cont(duration_ms, ${E})`,F=[`organization_id = '${P$($.organizationId)}'`,`connection_id = '${P$($.connectionId)}'`];if(WJ(F,$.startDate,Q),$.endDate)F.push(JJ($.endDate,Q));if($.userIds?.length){let E=$.userIds.slice(0,100).map((j)=>`'${P$(j)}'`).join(",");F.push(`user_id IN (${E})`)}let U=F.join(" AND "),N=Math.min(Math.max(1,Math.floor($.topN??5)),20),B=`${W} AS calls,
|
|
110
110
|
${K} AS errors,
|
|
111
111
|
avg(duration_ms) AS avg,
|
|
112
112
|
sum(${J("input_tokens")}) AS in_tok,
|
|
@@ -802,7 +802,7 @@ You are the Usage Manager. You analyze how this workspace is actually used \u201
|
|
|
802
802
|
`,K),U=F===-1?$.slice(K):$.slice(K,F);Q+=U,K+=U.length-1;continue}if($.startsWith("/*",K)){let F=1,U=K+2;while(F>0&&U<$.length)if($.startsWith("/*",U))F++,U+=2;else if($.startsWith("*/",U))F--,U+=2;else U++;let N=$.slice(K,U);Q+=N,K+=N.length-1;continue}}if(W!==null){let F=`$${W}$`;if($.startsWith(F,K))Q+=F,K+=F.length-1,W=null;else Q+=H;continue}if(Y&&J&&H==="\\"&&K+1<$.length){Q+=H+$[K+1],K+=1;continue}if(!G&&H==="'"){if(!Y){let F=$[K-1],U=$[K-2]??"";J=(F==="e"||F==="E")&&!/[A-Za-z0-9_]/.test(U)}Y=!Y,Q+=H;continue}if(!Y&&H==='"'){G=!G,Q+=H;continue}if(!Y&&!G&&H==="$"){let F=/^\$(\d+)/.exec($.slice(K)),U=F?Number(F[1])-1:-1;if(F&&U>=0&&U<Z.length){Q+=B$$(Z[U]),K+=F[0].length-1;continue}let N=/^\$([A-Za-z_][A-Za-z0-9_]*)?\$/.exec($.slice(K));if(N){W=N[1]??"",Q+=N[0],K+=N[0].length-1;continue}}else if(!Y&&!G&&H==="?"&&X<Z.length){Q+=B$$(Z[X]),X++;continue}Q+=H}return Q}function O$$($){return $.replace(/-/g,"_")}function c64($){return`app_${O$$($)}`}function d64($){return`app_role_${O$$($)}`}function m64($){if($ instanceof Error){let Z=$.message.toLowerCase(),Q=$.code;return Q==="3F000"||Q==="42704"||Q==="22023"||Z.includes("schema")&&Z.includes("does not exist")||Z.includes("role")&&Z.includes("does not exist")}return!1}async function i64($,Z,Q){if(await h4`CREATE SCHEMA IF NOT EXISTS ${h4.id(Z)}`.execute($),!(await h4`
|
|
803
803
|
SELECT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = ${Q}) as exists
|
|
804
804
|
`.execute($)).rows[0]?.exists)await h4`CREATE ROLE ${h4.id(Q)} NOLOGIN`.execute($);await h4`GRANT ${h4.id(Q)} TO CURRENT_USER`.execute($),await h4`GRANT USAGE, CREATE ON SCHEMA ${h4.id(Z)} TO ${h4.id(Q)}`.execute($),await h4`GRANT ALL ON ALL TABLES IN SCHEMA ${h4.id(Z)} TO ${h4.id(Q)}`.execute($),await h4`GRANT ALL ON ALL SEQUENCES IN SCHEMA ${h4.id(Z)} TO ${h4.id(Q)}`.execute($),await h4`ALTER DEFAULT PRIVILEGES IN SCHEMA ${h4.id(Z)} GRANT ALL ON TABLES TO ${h4.id(Q)}`.execute($),await h4`ALTER DEFAULT PRIVILEGES IN SCHEMA ${h4.id(Z)} GRANT ALL ON SEQUENCES TO ${h4.id(Q)}`.execute($),await h4`REVOKE ALL ON SCHEMA public FROM ${h4.id(Q)}`.execute($)}async function p64($,Z,Q,X){try{return await $.transaction().execute(async(Y)=>{return await h4`SET LOCAL ROLE ${h4.id(Q)}`.execute(Y),await h4`SET LOCAL search_path TO ${h4.id(Z)}`.execute(Y),await h4.raw(X).execute(Y)})}catch(Y){if(m64(Y))return await i64($,Z,Q),await $.transaction().execute(async(G)=>{return await h4`SET LOCAL ROLE ${h4.id(Q)}`.execute(G),await h4`SET LOCAL search_path TO ${h4.id(Z)}`.execute(G),await h4.raw(X).execute(G)});throw Y}}var h64,l64,D$$;var w$$=D(()=>{q0();h64=cK.object({results:cK.array(cK.unknown()).optional(),success:cK.boolean().optional()});l64=cK.object({sql:cK.string().describe("The SQL query to run"),params:cK.array(cK.unknown()).describe("The parameters to pass to the SQL query").optional()});D$$=g({name:"DATABASES_RUN_SQL",description:"Run a SQL query in a connection-scoped isolated schema. Supports SELECT, DDL, and DML.",annotations:{title:"Run SQL Query",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!1,openWorldHint:!1},inputSchema:l64,outputSchema:cK.object({result:cK.array(h64)}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=u64($.sql,$.params||[]);if(!Z.connectionId)throw Error("Connection context required for database access");console.warn("DATABASES_RUN_SQL invoked",{"tool.deprecation_probe":"DATABASES_RUN_SQL","connection.id":Z.connectionId,"organization.id":Z.organization?.id??null,"user.id":Z.auth.user?.id??null});let X=c64(Z.connectionId),Y=d64(Z.connectionId);return{result:[{results:(await p64(Z.db,X,Y,Q)).rows,success:!0}]}}})});function t70($){let Z=$.access.getRole();if(!NZ(Z))throw new sY("Only organization owners and admins can change org-wide pin status")}var nm0=D(()=>{rQ();mF()});async function o70($,Z,Q){let X=[...new Set(Q)],Y=await Promise.all(X.map((J)=>$.storage.connections.findById(J,Z))),G=X.filter((J,W)=>!Y[W]);if(G.length>0)throw Error(`Connection not found: ${G.join(", ")}`)}function KU($){return $.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")}function r70($){let Z=2166136261;for(let Q=0;Q<$.length;Q++)Z=Math.imul(Z^$.charCodeAt(Q),16777619);return`a${(Z>>>0).toString(36).padStart(6,"0").slice(-6)}`}function s70($){if($&&typeof $==="object"&&"gatewayClientId"in $&&typeof $.gatewayClientId==="string")return $.gatewayClientId;return}function a70($,Z){if(!Z)return $;let Q=`${r70(Z)}_`;return $.startsWith(Q)?$.slice(Q.length):$}function t64($){return $.split(/[-_]/).map((Z)=>Z?Z.charAt(0).toUpperCase()+Z.slice(1):Z).join(" ")}function o64($,Z,Q){let X,Y=new Promise((G,J)=>{X=setTimeout(()=>J(Error(Q)),Z)});return Promise.race([$,Y]).finally(()=>clearTimeout(X))}var Fj;var L$$=D(()=>{AK();Fj=class Fj extends d9{static MAX_PAGES_PER_CLIENT=1000;static DEFAULT_LIST_TIMEOUT_MS=30000;clients;slugToKey=new Map;resolvedClients=new Map;toolsCache=null;resourcesCache=null;resourceTemplatesCache=null;promptsCache=null;resourceRouteMap=new Map;listTimeoutMs;constructor($,Z){super(Z?.clientInfo??{name:"gateway-client",version:"1.0.0"},{capabilities:Z?.capabilities});this.clients=$,this.listTimeoutMs=Z?.listTimeoutMs??Fj.DEFAULT_LIST_TIMEOUT_MS;for(let Q of Object.keys($)){let X=r70(Q);if(this.slugToKey.has(X))throw Error(`GatewayClient: duplicate namespace code "${X}" from keys "${this.slugToKey.get(X)}" and "${Q}"`);this.slugToKey.set(X,Q)}}namespace($,Z){return`${r70($)}_${Z}`}async resolveNamespacedTarget($,Z,Q){let X=$.indexOf("_");if(X!==-1){let Y=$.slice(0,X),G=this.slugToKey.get(Y);if(G)return[G,$.slice(X+1)]}for(let Y of await Q()){let G=s70(Y._meta);if(!G)continue;if(a70(Y.name,G)===$)return[G,$]}if(X===-1)throw Error(`GatewayClient: could not resolve ${Z} "${$}" \u2014 no namespace prefix and not found in any client`);throw Error(`GatewayClient: unknown namespace "${$.slice(0,X)}" in "${$}" and not found by original name in any client`)}resolveToolTarget($){return this.resolveNamespacedTarget($,"tool",async()=>(await this.listTools()).tools)}resolvePromptTarget($){return this.resolveNamespacedTarget($,"prompt",async()=>(await this.listPrompts()).prompts)}resolveClient($){let Z=this.resolvedClients.get($);if(Z)return Z;let Q=this.clients[$];if(!Q)return Promise.reject(Error(`GatewayClient: unknown client key "${$}"`));let X=Q.client,Y;try{Y=typeof X==="function"?Promise.resolve(X()):Promise.resolve(X)}catch(J){return Promise.reject(J)}let G=Y.catch((J)=>{throw this.resolvedClients.delete($),J});return this.resolvedClients.set($,G),G}getResolvedClient($){return this.resolveClient($)}async listFromClient($,Z,Q){try{return await o64((async()=>{let X=await this.resolveClient($);return await Z(X)})(),this.listTimeoutMs,`timed out after ${this.listTimeoutMs}ms`)}catch(X){return console.warn(`GatewayClient: skipping ${Q} from client "${$}" \u2014 ${X?.message??X}`),[]}}listFromAllClients($,Z){return Promise.all(Object.entries(this.clients).map(async([Q,X])=>[Q,X,await this.listFromClient(Q,(Y)=>$(Y,Q),Z)]))}async paginate($,Z,Q){let X=[],Y,G=0;do{let J=await Q(Y);X.push(...J.items),Y=J.nextCursor,G++}while(Y&&G<Fj.MAX_PAGES_PER_CLIENT);if(Y)console.warn(`GatewayClient: client "${$}" exceeded ${Fj.MAX_PAGES_PER_CLIENT} pages listing ${Z} \u2014 truncating`);return X}fetchAllTools($,Z){return this.paginate(Z,"tools",async(Q)=>{let X=await $.listTools(Q?{cursor:Q}:void 0);return{items:X.tools,nextCursor:X.nextCursor}})}fetchAllResources($,Z){return this.paginate(Z,"resources",async(Q)=>{let X=await $.listResources(Q?{cursor:Q}:void 0);return{items:X.resources,nextCursor:X.nextCursor}})}fetchAllResourceTemplates($,Z){return this.paginate(Z,"resource templates",async(Q)=>{let X=await $.listResourceTemplates(Q?{cursor:Q}:void 0);return{items:X.resourceTemplates,nextCursor:X.nextCursor}})}fetchAllPrompts($,Z){return this.paginate(Z,"prompts",async(Q)=>{let X=await $.listPrompts(Q?{cursor:Q}:void 0);return{items:X.prompts,nextCursor:X.nextCursor}})}listTools($,Z){if(!this.toolsCache)this.toolsCache=this.aggregateTools();return this.toolsCache}async aggregateTools(){let $=[],Z=await this.listFromAllClients((Q,X)=>this.fetchAllTools(Q,X),"tools");for(let[Q,X,Y]of Z){let G=X.tools,J=G?new Set(G):null;for(let W of Y){if(J&&!J.has(W.name))continue;$.push({...W,name:this.namespace(Q,W.name),_meta:{...W._meta??{},gatewayClientId:Q}})}}return{tools:$}}listResources($,Z){if(!this.resourcesCache)this.resourcesCache=this.aggregateResources();return this.resourcesCache}async aggregateResources(){let $=new Set,Z=[],Q=new Map,X=await this.listFromAllClients((Y,G)=>this.fetchAllResources(Y,G),"resources");for(let[Y,G,J]of X){let W=G.resources,K=W?new Set(W):null;for(let H of J){if(K&&!K.has(H.uri)&&!(H.name&&K.has(H.name)))continue;if($.has(H.uri)){console.warn(`GatewayClient: duplicate resource "${H.uri}" from client "${Y}" \u2014 skipping`);continue}$.add(H.uri),Q.set(H.uri,Y),Z.push({...H,_meta:{...H._meta??{},gatewayClientId:Y}})}}return this.resourceRouteMap=Q,{resources:Z}}listResourceTemplates($,Z){if(!this.resourceTemplatesCache)this.resourceTemplatesCache=this.aggregateResourceTemplates();return this.resourceTemplatesCache}async aggregateResourceTemplates(){let $=new Set,Z=[],Q=await this.listFromAllClients((X,Y)=>this.fetchAllResourceTemplates(X,Y),"resource templates");for(let[X,Y,G]of Q)for(let J of G){if($.has(J.uriTemplate)){console.warn(`GatewayClient: duplicate resource template "${J.uriTemplate}" from client "${X}" \u2014 skipping`);continue}$.add(J.uriTemplate),Z.push({...J,_meta:{...J._meta??{},gatewayClientId:X}})}return{resourceTemplates:Z}}listPrompts($,Z){if(!this.promptsCache)this.promptsCache=this.aggregatePrompts();return this.promptsCache}async aggregatePrompts(){let $=[],Z=await this.listFromAllClients((Q,X)=>this.fetchAllPrompts(Q,X),"prompts");for(let[Q,X,Y]of Z){let G=X.prompts,J=G?new Set(G):null;for(let W of Y){if(J&&!J.has(W.name))continue;$.push({...W,name:this.namespace(Q,W.name),title:W.title??t64(W.name),_meta:{...W._meta??{},gatewayClientId:Q}})}}return{prompts:$}}async callTool($,Z,Q){let[X,Y]=await this.resolveToolTarget($.name);return(await this.resolveClient(X)).callTool({...$,name:Y},Z,Q)}async readResource($,Z){let Q=await this.resolveResourceRoute($.uri);return(await this.resolveClient(Q)).readResource($)}async getPrompt($,Z){let[Q,X]=await this.resolvePromptTarget($.name);return(await this.resolveClient(Q)).getPrompt({...$,name:X})}async resolveResourceRoute($){let Z=this.resourceRouteMap.get($);if(Z)return Z;if(this.resourcesCache=null,await this.listResources(),Z=this.resourceRouteMap.get($),Z)return Z;throw Error(`GatewayClient: resource "${$}" not found in any upstream client`)}getServerCapabilities(){return{tools:{},resources:{},prompts:{}}}getInstructions(){return}refresh(){this.toolsCache=null,this.resourcesCache=null,this.resourceTemplatesCache=null,this.promptsCache=null}async close(){let $=[...this.resolvedClients.values()].map((Z)=>Z.then((Q)=>Q.close()).catch(()=>{}));await Promise.allSettled($),await super.close()}}});var e70=D(()=>{L$$()});function om0($){return KU($)}function s64($,Z){let Q=KU(Z)||"prompt";return`${String($).padStart(r64,"0")}-${Q}`}async function rm0($,Z,Q){try{await $.delete($Q0,om0(Z),{actor:Q})}catch(X){console.error("[agent-prompts] failed to delete prompts",{agentId:Z,err:X})}}async function ZQ0($,Z,Q,X){let Y=om0(Z);await rm0($,Z,Q),await Promise.all(X.slice(0,tm0).map(async(G,J)=>{let W=s64(J,G.title),K={name:W,title:G.title,description:G.description,text:G.text};try{await $.write($Q0,`${Y}/${W}.json`,JSON.stringify(K),{actor:Q,contentType:"application/json"})}catch(H){console.error("[agent-prompts] failed to seed prompt",{agentId:Z,name:W,err:H})}}))}async function E$$($,Z){let Q=om0(Z),X;try{X=await $.listDir($Q0,Q)}catch{return[]}let Y=X.filter((J)=>J.kind==="file"&&J.path.endsWith(".json")).slice(0,tm0),G=[];for(let J of Y)try{let W=await $.read($Q0,J.path),K=JSON.parse(new TextDecoder().decode(W));if(K&&typeof K.name==="string"&&typeof K.title==="string"&&typeof K.text==="string")G.push(K)}catch{}return G}var $Q0="agent-prompts",tm0=20,r64;var xn=D(()=>{e70();r64=String(tm0-1).length});function Tg($){if(!$)return $;let Z={...$};return delete Z.sandboxMap,Z}import{z as P$$}from"zod";function a64(){let $=j$$[Math.floor(Math.random()*j$$.length)];return`icon://${z$$[Math.floor(Math.random()*z$$.length)]}?color=${$}`}var j$$,z$$,e64,$54,Uj;var sm0=D(()=>{q0();SO();nm0();xn();j$$=["red","orange","amber","yellow","lime","green","emerald","cyan","sky","blue","indigo","violet","purple","fuchsia","pink","rose"],z$$=["Star01","Zap","Heart","Globe01","Compass03","Lightbulb02","Rocket01","Flag01","BookOpen01","Shield01","Key01","Diamond01","Cube01","Target04","Award01","Briefcase01","Coffee","Feather","Hexagon01","Layers3_01","Map01","Palette","Package","Terminal"];e64=P$$.object({data:O60.describe("Data for the new virtual MCP")}),$54=P$$.object({item:$Q.describe("The created virtual MCP entity")}),Uj=g({name:"COLLECTION_VIRTUAL_MCP_CREATE",description:"Create a Virtual MCP (agent) that aggregates tools from multiple connections into one endpoint. Pass `prompts` to seed the agent with kickstart prompts (conversation starters shown as icebreakers). Author them from the agent's role/instructions and the descriptions of the tools it will have, so the starters are coherent and immediately useful.",annotations:{title:"Create Virtual MCP",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!1,openWorldHint:!1},inputSchema:e64,outputSchema:$54,handler:async($,Z)=>{t(Z);let Q=n(Z);await Z.access.check();let X=n0(Z);if(!X)throw Error("User ID required to create virtual MCP");if($.data.pinned===!0)t70(Z);let{prompts:Y,metadata:G,...J}=$.data,W=Tg(G);if(J.connections.length>0)await o70(Z,Q.id,J.connections.map((F)=>F.connection_id));let K={...J,metadata:W,icon:J.icon??a64()},H=await Z.storage.virtualMcps.create(Q.id,X,K);if(Y?.length&&Z.orgFs&&H.id)await ZQ0(Z.orgFs,H.id,X,Y);return{item:H}}})});function Z54($){let Z=[],Q=0;while(Q<$.length){let X=$[Q];if(X==="%")Z.push(".*");else if(X==="_")Z.push(".");else if(/[.*+?^${}()|[\]\\]/.test(X))Z.push("\\"+X);else Z.push(X);Q++}return Z.join("")}function hO($){return typeof $==="string"||typeof $==="number"}function am0($,Z){let Q=Z.split("."),X=$;for(let Y of Q){if(X==null||typeof X!=="object")return;X=X[Y]}return X}function Q54($,Z){return $.connections.some((Q)=>Q.connection_id===Z)}function QQ0($,Z){if("conditions"in Z){let{operator:W,conditions:K}=Z;switch(W){case"and":return K.every((H)=>QQ0($,H));case"or":return K.some((H)=>QQ0($,H));case"not":return!K.every((H)=>QQ0($,H));default:return!0}}let{field:Q,operator:X,value:Y}=Z,G=Q.join(".");if(G==="connection_id"){if(X!=="eq"||typeof Y!=="string")return!1;return Q54($,Y)}let J=am0($,G);switch(X){case"eq":return J===Y;case"gt":return hO(J)&&hO(Y)&&J>Y;case"gte":return hO(J)&&hO(Y)&&J>=Y;case"lt":return hO(J)&&hO(Y)&&J<Y;case"lte":return hO(J)&&hO(Y)&&J<=Y;case"in":return Array.isArray(Y)&&Y.includes(J);case"like":if(typeof J!=="string"||typeof Y!=="string")return!1;if(Y.length>100)return!1;let W=Z54(Y);return new RegExp(`^${W}$`,"i").test(J);case"contains":if(typeof J!=="string"||typeof Y!=="string")return!1;return J.toLowerCase().includes(Y.toLowerCase());default:return!0}}function X54($,Z){return[...$].sort((Q,X)=>{for(let Y of Z){let G=Y.field.join("."),J=am0(Q,G),W=am0(X,G),K=0;if(J==null&&W==null)continue;if(J==null)K=Y.nulls==="first"?-1:1;else if(W==null)K=Y.nulls==="first"?1:-1;else if(typeof J==="string"&&typeof W==="string")K=J.localeCompare(W);else if(typeof J==="number"&&typeof W==="number")K=J-W;else K=String(J).localeCompare(String(W));if(K!==0)return Y.direction==="desc"?-K:K}return 0})}var Y54,G54,Nj;var em0=D(()=>{DJ();q0();SO();Y54=r3,G54=JU($Q),Nj=g({name:"COLLECTION_VIRTUAL_MCP_LIST",description:"List all MCP virtual MCPs in the organization",annotations:{title:"List Virtual MCPs",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:Y54,outputSchema:G54,handler:async($,Z)=>{await Z.access.check();let Q=n(Z),X=$.where&&!("conditions"in $.where)&&$.where.field.join(".")==="connection_id"&&$.where.operator==="eq"&&typeof $.where.value==="string"?$.where.value:void 0,Y=$.where&&!("conditions"in $.where)&&$.where.field.join(".")==="pinned"&&$.where.operator==="eq"&&typeof $.where.value==="boolean"?$.where.value:void 0,J=X?await Z.storage.virtualMcps.listByConnectionId(Q.id,X):await Z.storage.virtualMcps.list(Q.id,Y!==void 0?{pinnedOnly:Y}:void 0);if($.where)J=J.filter((N)=>QQ0(N,$.where));if($.orderBy&&$.orderBy.length>0)J=X54(J,$.orderBy);let W=J.length,K=$.offset??0,H=$.limit??100,F=J.slice(K,K+H),U=K+H<W;return{items:F,totalCount:W,hasMore:U}}})});import{z as $i0}from"zod";var J54,W54,Bj;var Zi0=D(()=>{q0();SO();J54=$i0.object({id:$i0.string().describe("ID of the virtual MCP to retrieve")}),W54=$i0.object({item:$Q.nullable().describe("The retrieved virtual MCP, or null if not found")}),Bj=g({name:"COLLECTION_VIRTUAL_MCP_GET",description:"Get a Virtual MCP's configuration, connections, and virtual tools by ID.",annotations:{title:"Get Virtual MCP",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:J54,outputSchema:W54,handler:async($,Z)=>{t(Z);let Q=n(Z);await Z.access.check();let X=await Z.storage.virtualMcps.findById($.id);if(X&&X.organization_id!==Q.id)return{item:null};if(!X)return{item:null};return{item:X}}})});function WX($){return Qi0.test($)}function A$$($){let Z=(Q)=>typeof Q==="string"?Q.trim().toLowerCase():"";return Z($?.metadata?.siteSlug)||Z($?.title)||null}var Qi0;var HU=D(()=>{Qi0=/^[a-z0-9][a-z0-9-]{0,59}$/});function T$$($){let{nextTitle:Z,currentTitle:Q,currentSiteSlug:X}=$;if(X?.trim())return null;if(Z===void 0||Z===Q)return null;let Y=Q?.trim().toLowerCase()??"";return WX(Y)?Y:null}var R$$=D(()=>{HU()});import{z as Xi0}from"zod";var K54,H54,Oj;var Yi0=D(()=>{q0();xn();SO();nm0();R$$();K54=Xi0.object({id:Xi0.string().describe("ID of the virtual MCP to update"),data:D60.describe("Partial virtual MCP data to update")}),H54=Xi0.object({item:$Q.describe("The updated virtual MCP entity")}),Oj=g({name:"COLLECTION_VIRTUAL_MCP_UPDATE",description:"Update a Virtual MCP's name, slug, connection list, or kickstart prompts. Pass `prompts` to replace the agent's conversation starters (full set; empty array clears them).",annotations:{title:"Update Virtual MCP",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:K54,outputSchema:H54,handler:async($,Z)=>{t(Z);let Q=n(Z);await Z.access.check();let X=n0(Z);if(!X)throw Error("User ID required to update virtual MCP");let Y=await Z.storage.virtualMcps.findById($.id);if(!Y)throw Error(`Virtual MCP not found: ${$.id}`);if(Y.organization_id!==Q.id)throw Error(`Virtual MCP not found: ${$.id}`);let{prompts:G,metadata:J,...W}=$.data,K=Tg(J);if(K&&Y.metadata)K={...Y.metadata,...K};else if(K===null&&Y.metadata?.sandboxMap)K={sandboxMap:Y.metadata.sandboxMap};let H={...W,...J!==void 0?{metadata:K}:{}},F=T$$({nextTitle:H.title,currentTitle:Y.title,currentSiteSlug:Y.metadata?.siteSlug});if(F)H.metadata={...Y.metadata,...H.metadata,siteSlug:F};if(H.pinned!==void 0&&H.pinned!==Y.pinned)t70(Z);if(H.connections?.length)await o70(Z,Q.id,H.connections.map((N)=>N.connection_id));let U=await Z.storage.virtualMcps.update($.id,X,H);if(G!==void 0&&Z.orgFs)await ZQ0(Z.orgFs,$.id,X,G);return{item:U}}})});function Ji0($){if(!$)return!1;let Z=yn.join("|");return new RegExp(`permission\\s+"?(?:${Z})"?\\s+is not allowed`,"i").test($)||/permissions exceed what the github app/i.test($)}function q$$($){let Z={...$};for(let Q of yn)Z[Q]="read";return Z}async function I$$($,Z){let Q={...Z};for(;;){let X=await $(Q);if(!X.isError)return{result:X,grantedPermissions:Q};let Y=X.content?.find((K)=>K.type==="text")?.text,G=yn.find((K)=>(K in Q));if(!G||!Ji0(Y))return{result:X,grantedPermissions:Q};let{[G]:J,...W}=Q;Q=W}}function F54($){if(!$||typeof $!=="object"||Array.isArray($))return XQ0;let Z=$;if(Object.values(Z).some((Q)=>typeof Q!=="string"))return XQ0;return Z}function U54($){if(typeof $!=="number"||!Number.isFinite($)||!Number.isInteger($)||$<=0)return;return $}function t5($){let Z=$.metadata?.repoScope;if(!Z||typeof Z.installationId!=="number"||!Number.isFinite(Z.installationId)||!Number.isInteger(Z.installationId)||Z.installationId<=0||typeof Z.owner!=="string"||typeof Z.repo!=="string"||Z.owner.length===0||Z.repo.length===0)return null;let Q=U54(Z.repositoryId);return{sourceConnectionId:typeof Z.sourceConnectionId==="string"?Z.sourceConnectionId:void 0,installationId:Z.installationId,repositoryId:Q,owner:Z.owner,repo:Z.repo,permissions:F54(Z.permissions),grantProvider:Z.grantProvider==="github-mcp"?"github-mcp":void 0}}function uO($){return $.metadata?.orgShared===!0}function M$$($){let Z=new Set,Q=[];for(let X of $??[]){if(X.status!=="active")continue;let Y=t5(X);if(Y===null)continue;let G=Gi0(Y.owner,Y.repo);if(Z.has(G))continue;Z.add(G),Q.push(`${Y.owner}/${Y.repo}`)}return Q}function YQ0($,Z,Q){let X=Gi0(Z,Q),Y=($??[]).filter((G)=>{if(G.status&&G.status!=="active")return!1;let J=t5(G);return J!==null&&Gi0(J.owner,J.repo)===X});return Y.find(uO)??Y[0]??null}var XQ0,yn,Gi0=($,Z)=>`${$}/${Z}`.toLowerCase();var tX=D(()=>{XQ0={contents:"write",metadata:"read",pull_requests:"write",issues:"write",checks:"read",deployments:"read"},yn=["deployments","checks"]});function k$$($){return GQ($)!==null||m50($)!==null}var V$$=D(()=>{k8()});import{z as Wi0}from"zod";var N54,B54,Dj;var Ki0=D(()=>{tX();s3();q0();xn();SO();V$$();N54=Wi0.object({id:Wi0.string().describe("ID of the virtual MCP to delete")}),B54=Wi0.object({item:$Q.describe("The deleted virtual MCP entity")}),Dj=g({name:"COLLECTION_VIRTUAL_MCP_DELETE",description:"Permanently delete a Virtual MCP and its virtual tools.",annotations:{title:"Delete Virtual MCP",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:N54,outputSchema:B54,handler:async($,Z)=>{t(Z);let Q=n(Z);if(await Z.access.check(),k$$($.id))throw Error(`Virtual MCP not found: ${$.id}`);let X=await Z.storage.virtualMcps.findById($.id);if(!X)throw Error(`Virtual MCP not found: ${$.id}`);if(X.organization_id!==Q.id)throw Error(`Virtual MCP not found: ${$.id}`);if(await Z.storage.virtualMcps.delete($.id),Z.orgFs)await rm0(Z.orgFs,$.id,n0(Z)??"system");let Y=X.metadata?.githubRepo?.connectionId;if(Y)try{let G=await Z.storage.connections.findById(Y,Q.id),J=G&&(uO(G)||(await Z.storage.virtualMcps.listByConnectionId(Q.id,Y)).length>0||await Z.storage.connections.isReferencedByThread(Y));if(G&&t5(G)&&!J){let K=await new z5(Z.db,Z.vault).get(Y);if(K?.accessToken)try{await fetch("https://api.github.com/installation/token",{method:"DELETE",headers:{Authorization:`Bearer ${K.accessToken}`,Accept:"application/vnd.github+json","X-GitHub-Api-Version":"2022-11-28"},signal:AbortSignal.timeout(5000)})}catch{}await Z.storage.connections.delete(Y)}}catch(G){console.error("[VIRTUAL_MCP_DELETE] failed to tear down repo-scoped connection",{childConnectionId:Y,error:G.message})}return{item:X}}})});import{z as oX}from"zod";var O54,wj;var Hi0=D(()=>{q0();O54=oX.object({id:oX.string(),virtualMcpId:oX.string(),pluginId:oX.string(),connectionId:oX.string().nullable(),settings:oX.record(oX.string(),oX.unknown()).nullable(),createdAt:oX.string(),updatedAt:oX.string()}),wj=g({name:"VIRTUAL_MCP_PLUGIN_CONFIG_GET",description:"Get a plugin's current configuration for a specific virtual MCP.",annotations:{title:"Get Virtual MCP Plugin Config",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:oX.object({virtualMcpId:oX.string().describe("Virtual MCP ID"),pluginId:oX.string().describe("Plugin ID")}),outputSchema:oX.object({config:O54.nullable()}),handler:async($,Z)=>{t(Z);let Q=n(Z);await Z.access.check();let{virtualMcpId:X,pluginId:Y}=$,G=await Z.storage.connections.findById(X);if(!G||G.organization_id!==Q.id)return{config:null};if(G.connection_type!=="VIRTUAL")return{config:null};let J=await Z.storage.virtualMcpPluginConfigs.get(X,Y);if(!J)return{config:null};return{config:{id:J.id,virtualMcpId:J.virtualMcpId,pluginId:J.pluginId,connectionId:J.connectionId,settings:J.settings,createdAt:J.createdAt instanceof Date?J.createdAt.toISOString():J.createdAt,updatedAt:J.updatedAt instanceof Date?J.updatedAt.toISOString():J.updatedAt}}}})});import{z as pZ}from"zod";var D54,Lj;var Fi0=D(()=>{q0();Wj();C5();D54=pZ.object({id:pZ.string(),virtualMcpId:pZ.string(),pluginId:pZ.string(),connectionId:pZ.string().nullable(),settings:pZ.record(pZ.string(),pZ.unknown()).nullable(),createdAt:pZ.string(),updatedAt:pZ.string()}),Lj=g({name:"VIRTUAL_MCP_PLUGIN_CONFIG_UPDATE",description:"Set or update a plugin's configuration for a specific virtual MCP.",annotations:{title:"Update Virtual MCP Plugin Config",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:pZ.object({virtualMcpId:pZ.string().describe("Virtual MCP ID"),pluginId:pZ.string().describe("Plugin ID"),connectionId:pZ.string().nullable().optional().describe("MCP connection to bind"),settings:pZ.record(pZ.string(),pZ.unknown()).nullable().optional().describe("Plugin-specific settings")}),outputSchema:pZ.object({config:D54}),handler:async($,Z)=>{t(Z);let Q=n(Z);await Z.access.check();let{virtualMcpId:X,pluginId:Y,connectionId:G,settings:J}=$,W=n0(Z),K=await Z.storage.connections.findById(X);if(!K)throw Error(`Connection not found: ${X}`);if(K.organization_id!==Q.id)throw Error(`Connection not found: ${X}`);if(K.connection_type!=="VIRTUAL")throw Error(`Connection not found: ${X}`);let H=G?await Z.storage.connections.findById(G):null;if(G&&H&&H.organization_id!==Q.id)throw Error(`Connection not found: ${G}`);if(G&&K.organization_id&&!H&&nX()&&Eg(G,K.organization_id)){if(!W)throw Error("User ID required to create dev-assets connection");let U=jg(K.organization_id,K9());await Z.storage.connections.create({...U,organization_id:K.organization_id,created_by:W})}else if(G&&!H)throw Error(`Connection not found: ${G}`);let F=await Z.storage.virtualMcpPluginConfigs.upsert(X,Y,{connectionId:G,settings:J});return{config:{id:F.id,virtualMcpId:F.virtualMcpId,pluginId:F.pluginId,connectionId:F.connectionId,settings:F.settings,createdAt:F.createdAt instanceof Date?F.createdAt.toISOString():F.createdAt,updatedAt:F.updatedAt instanceof Date?F.updatedAt.toISOString():F.updatedAt}}}})});function S$$($,Z){let Q=$!==null&&typeof $==="object"&&!Array.isArray($)?$:null;if(Z===void 0)return Q;return{...Q??{},...Z}}import{z as KX}from"zod";var w54,Ej;var Ui0=D(()=>{q0();SO();w54=KX.object({connectionId:KX.string(),toolName:KX.string(),label:KX.string(),icon:KX.string().nullable().optional()}),Ej=g({name:"VIRTUAL_MCP_PINNED_VIEWS_UPDATE",description:"Update the pinned sidebar views for a virtual MCP. Replaces all current pins.",annotations:{title:"Update Pinned Views",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:KX.object({virtualMcpId:KX.string().describe("Virtual MCP ID"),pinnedViews:KX.array(w54).describe("Pinned views to set for the virtual MCP sidebar"),layout:KX.object({defaultMainView:KX.object({type:KX.string(),id:KX.string().optional(),toolName:KX.string().optional()}).nullable().optional(),chatDefaultOpen:KX.boolean().nullable().optional()}).optional()}),outputSchema:KX.object({item:$Q.nullable()}),handler:async($,Z)=>{t(Z);let Q=n(Z);await Z.access.check();let{virtualMcpId:X,pinnedViews:Y,layout:G}=$,J=n0(Z),W=await Z.storage.virtualMcps.findById(X);if(!W)throw Error(`Virtual MCP not found: ${X}`);if(W.organization_id!==Q.id)throw Error(`Virtual MCP not found: ${X}`);let K=W.metadata?.ui??{},H={...K,pinnedViews:Y.length>0?Y:null,layout:S$$(K.layout,G)};return{item:await Z.storage.virtualMcps.update(X,J??"system",{metadata:{...W.metadata,ui:H}})}}})});import{z as FU}from"zod";var L54,E54,Ni0;var C$$=D(()=>{q0();L54=FU.object({ids:FU.array(FU.string()).max(1000).describe("Virtual MCP ids to look up")}),E54=FU.object({items:FU.array(FU.object({id:FU.string(),last_used_at:FU.string().optional(),last_used_by:FU.string().optional()}))}),Ni0=g({name:"VIRTUAL_MCP_LAST_USED_LIST",description:"Get last-used info (timestamp + user) for one or more virtual MCPs, derived from the most recent thread per agent.",annotations:{title:"List Virtual MCP Last Used",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:L54,outputSchema:E54,handler:async($,Z)=>{t(Z),n(Z),await Z.access.check();let Q=await Z.storage.threads.findLastUsedByVirtualMcpIds($.ids);return{items:$.ids.map((X)=>({id:X,last_used_at:Q.get(X)?.last_used_at,last_used_by:Q.get(X)?.last_used_by}))}}})});var _$$=D(()=>{sm0();em0();Zi0();Yi0();Ki0();Hi0();Fi0();Ui0();C$$()});import{z as UQ}from"zod";var Bi0;var v$$=D(()=>{X6();q0();Bi0=g({name:"MONITORING_HEATMAP",description:"Get tool-call volume broken down by agent and tool name, for spotting heavily-used tools per agent.",annotations:{title:"Get Tool-Call Heatmap",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:UQ.object({startDate:UQ.string().datetime().optional().describe("Filter by start date (ISO 8601 datetime string)"),endDate:UQ.string().datetime().optional().describe("Filter by end date (ISO 8601 datetime string)"),virtualMcpIds:UQ.array(UQ.string()).max(100).optional().describe("Filter by specific agent (Virtual MCP) IDs"),excludeConnectionIds:UQ.array(UQ.string()).max(100).optional().describe("Exclude tool calls from these connection IDs"),limit:UQ.number().int().min(1).max(1000).optional().describe("Max number of (agent, tool) cells to return")}),outputSchema:UQ.object({cells:UQ.array(UQ.object({virtualMcpId:UQ.string().nullable(),toolName:UQ.string(),calls:UQ.number(),errors:UQ.number(),outputSize:UQ.number().describe("Sum of tool-output character length \u2014 a proxy for context weight, not LLM token count")}))}),handler:async($,Z)=>{let Q=n(Z);return await Z.access.check(),await IX(),Z.storage.monitoring.queryToolCallHeatmap({organizationId:Q.id,startDate:$.startDate?new Date($.startDate):void 0,endDate:$.endDate?new Date($.endDate):void 0,filters:{virtualMcpIds:$.virtualMcpIds,excludeConnectionIds:$.excludeConnectionIds},limit:$.limit})}})});import{z as P5}from"zod";var Oi0;var f$$=D(()=>{X6();q0();Oi0=g({name:"MONITORING_LOG_GET",description:"Get a single monitoring log by ID with full input and output data.",annotations:{title:"Get Monitoring Log",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:P5.object({id:P5.string().describe("Log ID to fetch")}),outputSchema:P5.object({log:P5.object({id:P5.string().optional(),organizationId:P5.string(),connectionId:P5.string(),toolName:P5.string(),input:P5.record(P5.string(),P5.unknown()),output:P5.record(P5.string(),P5.unknown()),isError:P5.boolean(),errorMessage:P5.string().nullish(),durationMs:P5.number(),timestamp:P5.string(),userId:P5.string().nullish(),requestId:P5.string(),userAgent:P5.string().nullish(),virtualMcpId:P5.string().nullish(),properties:P5.record(P5.string(),P5.string()).nullish()}).nullable().describe("The monitoring log, or null if not found")}),handler:async($,Z)=>{await Z.access.check(),await IX();let Q=n(Z),X=await Z.storage.monitoring.getById(Q.id,$.id);if(!X)return{log:null};return{log:{...X,timestamp:X.timestamp instanceof Date?X.timestamp.toISOString():X.timestamp}}}})});import{z as L8}from"zod";var z54,Di0;var b$$=D(()=>{X6();q0();z54=L8.object({id:L8.string().optional().describe("Unique log identifier"),organizationId:L8.string().describe("Organization ID"),connectionId:L8.string().describe("Connection ID"),toolName:L8.string().describe("Name of the tool that was called"),isError:L8.boolean().describe("Whether the call resulted in an error"),errorMessage:L8.string().nullish().describe("Error message if applicable"),durationMs:L8.number().describe("Call duration in milliseconds"),timestamp:L8.string().describe("ISO 8601 timestamp of the call"),userId:L8.string().nullish().describe("User who triggered the call"),requestId:L8.string().describe("Unique request identifier"),userAgent:L8.string().nullish().describe("Client identifier (x-studio-client header)"),virtualMcpId:L8.string().nullish().describe("Virtual MCP (Agent) ID if routed through an agent"),properties:L8.record(L8.string(),L8.string()).nullish().describe("Custom key-value metadata attached to the log")}),Di0=g({name:"MONITORING_LOGS_LIST",description:"List monitoring logs for tool calls with filtering and pagination.",annotations:{title:"List Monitoring Logs",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:L8.object({connectionId:L8.string().optional().describe("Filter by connection ID"),excludeConnectionIds:L8.array(L8.string()).optional().describe("Exclude logs from these connection IDs (e.g. system connections)"),virtualMcpId:L8.string().optional().describe("Filter by Virtual MCP (Agent) ID"),toolName:L8.string().optional().describe("Filter by tool name"),isError:L8.boolean().optional().describe("Filter by error status"),startDate:L8.string().datetime().optional().describe("Filter by start date (ISO 8601 datetime string)"),endDate:L8.string().datetime().optional().describe("Filter by end date (ISO 8601 datetime string)"),limit:L8.number().default(20).describe("Maximum number of results"),offset:L8.number().default(0).describe("Offset for pagination"),properties:L8.record(L8.string(),L8.string()).optional().describe("Filter by exact property key=value matches"),propertyKeys:L8.array(L8.string()).optional().describe("Filter by logs that have these property keys"),propertyPatterns:L8.record(L8.string(),L8.string()).optional().describe("Filter by property value patterns (SQL LIKE, use % as wildcard)"),propertyInValues:L8.record(L8.string(),L8.string()).optional().describe("Filter by exact match within comma-separated values (e.g., user_tags in 'Engineering')")}),outputSchema:L8.object({logs:L8.array(z54).describe("Array of monitoring logs"),total:L8.number().describe("Total number of logs matching filters"),offset:L8.number().describe("Current offset for pagination"),limit:L8.number().describe("Current limit for pagination")}),handler:async($,Z)=>{await Z.access.check(),await IX();let Q=n(Z),Y=$.properties||$.propertyKeys||$.propertyPatterns||$.propertyInValues?{properties:$.properties,propertyKeys:$.propertyKeys,propertyPatterns:$.propertyPatterns,propertyInValues:$.propertyInValues}:void 0,G={organizationId:Q.id,connectionId:$.connectionId,excludeConnectionIds:$.excludeConnectionIds,virtualMcpId:$.virtualMcpId,toolName:$.toolName,isError:$.isError,startDate:$.startDate?new Date($.startDate):void 0,endDate:$.endDate?new Date($.endDate):void 0,limit:$.limit,offset:$.offset,propertyFilters:Y},J=await Z.storage.monitoring.query(G);return{logs:J.logs.map(({input:W,output:K,...H})=>({...H,timestamp:H.timestamp instanceof Date?H.timestamp.toISOString():H.timestamp})),total:J.total,offset:$.offset,limit:$.limit}}})});import{z as F$}from"zod";var wi0;var x$$=D(()=>{X6();q0();wi0=g({name:"MONITORING_STATS",description:"Get aggregated statistics (counts, latency, error rates) for tool call monitoring.",annotations:{title:"Get Monitoring Stats",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:F$.object({startDate:F$.string().datetime().optional().describe("Filter by start date (ISO 8601 datetime string)"),endDate:F$.string().datetime().optional().describe("Filter by end date (ISO 8601 datetime string)"),interval:F$.string().regex(/^\d+[mhd]$/).optional().describe("Bucket interval for timeseries data (e.g. 1m, 5m, 2h, 1d). When provided, returns timeseries array."),connectionIds:F$.array(F$.string()).max(100).optional().describe("Filter by specific connection IDs (max 100)"),excludeConnectionIds:F$.array(F$.string()).max(100).optional().describe("Exclude specific connection IDs (max 100)"),toolNames:F$.array(F$.string()).max(100).optional().describe("Filter by specific tool names (max 100)"),status:F$.enum(["success","error"]).optional().describe("Filter metrics by execution status"),topN:F$.number().int().min(1).max(20).optional().describe("When provided with interval, also return top tools and their timeseries"),userIds:F$.array(F$.string()).max(100).optional().describe("Filter LLM usage by user IDs (only applied when llmUsage is true)"),llmUsage:F$.boolean().optional().describe("Aggregate LLM-call usage (tokens + USD cost) from raw log rows for the given connection. Returns token/cost totals and timeseries. Requires interval.")}),outputSchema:F$.object({totalCalls:F$.number().describe("Total number of tool calls"),errorRate:F$.number().optional().describe("Error rate as a decimal (0 to 1)"),avgDurationMs:F$.number().describe("Average call duration in milliseconds"),errorRatePercent:F$.string().optional().describe("Error rate as a percentage string"),totalErrors:F$.number().optional().describe("Total number of errors"),p50DurationMs:F$.number().optional().describe("50th percentile duration in milliseconds"),p95DurationMs:F$.number().optional().describe("95th percentile duration in milliseconds"),connectionBreakdown:F$.array(F$.object({connectionId:F$.string(),calls:F$.number(),errors:F$.number(),errorRate:F$.number(),avgDurationMs:F$.number()})).optional().describe("Per-connection metric breakdown"),totalInputTokens:F$.number().optional().describe("Total input tokens (LLM usage mode)"),totalOutputTokens:F$.number().optional().describe("Total output tokens (LLM usage mode)"),totalTokens:F$.number().optional().describe("Total tokens (LLM usage mode)"),totalCostUsd:F$.number().optional().describe("Total USD cost (LLM usage mode; only non-zero for providers that report cost)"),topTools:F$.array(F$.object({toolName:F$.string(),connectionId:F$.string().nullable(),calls:F$.number(),inputTokens:F$.number().optional(),outputTokens:F$.number().optional(),costUsd:F$.number().optional()})).optional().describe("Top tools ranked by calls"),topToolsTimeseries:F$.array(F$.object({timestamp:F$.string(),toolName:F$.string(),calls:F$.number(),errors:F$.number(),avg:F$.number(),p95:F$.number()})).optional().describe("Per-tool metric timeseries for the top tools"),timeseries:F$.array(F$.object({timestamp:F$.string(),calls:F$.number(),errors:F$.number(),errorRate:F$.number(),avg:F$.number(),p50:F$.number(),p95:F$.number(),inputTokens:F$.number().optional(),outputTokens:F$.number().optional(),totalTokens:F$.number().optional(),costUsd:F$.number().optional()})).optional().describe("Timeseries data points bucketed by interval")}),handler:async($,Z)=>{let Q=n(Z);if(await Z.access.check(),await IX(),$.interval&&$.llmUsage)return Z.storage.monitoring.queryLlmUsageStats({organizationId:Q.id,interval:$.interval,connectionId:$.connectionIds?.[0]??"decopilot",startDate:$.startDate?new Date($.startDate):void 0,endDate:$.endDate?new Date($.endDate):void 0,userIds:$.userIds,topN:$.topN});if($.interval){let Y=await Z.storage.monitoring.queryMetricTimeseries({organizationId:Q.id,interval:$.interval,startDate:$.startDate?new Date($.startDate):void 0,endDate:$.endDate?new Date($.endDate):void 0,filters:{connectionIds:$.connectionIds,excludeConnectionIds:$.excludeConnectionIds,toolNames:$.toolNames,status:$.status}});if(!$.topN)return Y;let G=await Z.storage.monitoring.queryMetricTopToolsTimeseries({organizationId:Q.id,interval:$.interval,startDate:$.startDate?new Date($.startDate):void 0,endDate:$.endDate?new Date($.endDate):void 0,topN:$.topN,filters:{connectionIds:$.connectionIds,excludeConnectionIds:$.excludeConnectionIds,toolNames:$.toolNames,status:$.status}});return{...Y,topTools:G.topTools,topToolsTimeseries:G.timeseries}}let X=await Z.storage.monitoring.getStats({organizationId:Q.id,startDate:$.startDate?new Date($.startDate):void 0,endDate:$.endDate?new Date($.endDate):void 0});return{...X,errorRatePercent:(X.errorRate*100).toFixed(2)}}})});import{z as HX}from"zod";var Li0;var y$$=D(()=>{X6();q0();Li0=g({name:"MONITORING_THREAD_USAGE",description:"Aggregate LLM token usage and USD cost per thread for the given thread IDs.",annotations:{title:"Get Thread Usage",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:HX.object({threadIds:HX.array(HX.string()).min(1).max(500).describe("Thread IDs to aggregate usage for (max 500)"),connectionId:HX.string().optional().describe("LLM connection ID (defaults to 'decopilot')"),startDate:HX.string().datetime().optional().describe("Filter by start date (ISO 8601 datetime string)"),endDate:HX.string().datetime().optional().describe("Filter by end date (ISO 8601 datetime string)")}),outputSchema:HX.object({items:HX.array(HX.object({threadId:HX.string(),calls:HX.number(),inputTokens:HX.number(),outputTokens:HX.number(),totalTokens:HX.number(),costUsd:HX.number()}))}),handler:async($,Z)=>{let Q=n(Z);return await Z.access.check(),await IX(),{items:await Z.storage.monitoring.queryThreadUsage({organizationId:Q.id,connectionId:$.connectionId??"decopilot",threadIds:$.threadIds,startDate:$.startDate?new Date($.startDate):void 0,endDate:$.endDate?new Date($.endDate):void 0})}}})});var g$$=D(()=>{v$$();f$$();b$$();x$$();y$$()});function GQ0($){return typeof $==="string"&&A54.has($.trim().toLowerCase())}var A54;var Ei0=D(()=>{A54=new Set([".well-known","_admin","api","auth","choose-editor","cli","commerce-onboarding","dbos-queue-depth","health","hosted-run-pending","login","mcp","metrics","oauth","oauth-proxy","onboarding","org","report","reset-password"])});import{z as YG}from"zod";var ji0;var h$$=D(()=>{q0();Ei0();ji0=g({name:"ORGANIZATION_CREATE",description:"Create a new organization. The caller becomes the owner automatically.",annotations:{title:"Create Organization",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!1,openWorldHint:!1},inputSchema:YG.object({slug:YG.string().min(1).max(50).regex(/^[a-z0-9-]+$/,"Slug must be lowercase alphanumeric with hyphens").refine(($)=>!GQ0($),"Slug is reserved by Studio"),name:YG.string().min(1).max(255),description:YG.string().optional()}),outputSchema:YG.object({id:YG.string(),name:YG.string(),slug:YG.string(),logo:YG.string().nullable().optional(),metadata:YG.any().optional(),createdAt:YG.string().datetime().describe("ISO 8601 timestamp"),members:YG.array(YG.any()).optional()}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=n0(Z);if(!Q)throw Error("User ID required to create organization");let X=await Z.boundAuth.organization.create({name:$.name,slug:$.slug,metadata:$.description?{description:$.description}:void 0,userId:Q});if(!X)throw Error("Failed to create organization");return{...X,createdAt:X.createdAt instanceof Date?X.createdAt.toISOString():X.createdAt}}})});import{z as dK}from"zod";var zi0;var u$$=D(()=>{q0();zi0=g({name:"ORGANIZATION_LIST",description:"List organizations the current user belongs to.",annotations:{title:"List Organizations",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},_meta:{ui:{visibility:"app"}},inputSchema:dK.object({}),outputSchema:dK.object({organizations:dK.array(dK.object({id:dK.string(),name:dK.string(),slug:dK.string(),logo:dK.string().nullable().optional(),metadata:dK.any().optional(),createdAt:dK.string().datetime().describe("ISO 8601 timestamp")}))}),handler:async($,Z)=>{if(t(Z),await Z.access.check(),!n0(Z))throw Error("User ID required to list organizations");return{organizations:(await Z.boundAuth.organization.list()).map((X)=>({...X,createdAt:X.createdAt instanceof Date?X.createdAt.toISOString():X.createdAt}))}}})});import{z as EJ}from"zod";var Pi0;var l$$=D(()=>{q0();Pi0=g({name:"ORGANIZATION_GET",description:"Get an organization's details, members, and settings by slug or ID.",annotations:{title:"Get Organization",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:EJ.object({}),outputSchema:EJ.object({id:EJ.string(),name:EJ.string(),slug:EJ.string(),logo:EJ.string().nullable().optional(),metadata:EJ.any().optional(),createdAt:EJ.string().datetime().describe("ISO 8601 timestamp"),members:EJ.array(EJ.any()).optional(),invitations:EJ.array(EJ.any()).optional()}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=Z.organization?.id;if(!Q)throw Error("Organization ID required (no active organization in context)");let X=await Z.boundAuth.organization.get(Q);if(!X)throw Error("No active organization found");let Y=new Date,G=X.invitations?.filter((J)=>new Date(J.expiresAt)>Y);return{...X,invitations:G,createdAt:X.createdAt instanceof Date?X.createdAt.toISOString():X.createdAt}}})});import{z as a3}from"zod";var Ai0;var c$$=D(()=>{q0();Ai0=g({name:"ORGANIZATION_UPDATE",description:"Update an organization's name or description.",annotations:{title:"Update Organization",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:a3.object({id:a3.string(),name:a3.string().min(1).max(255).optional(),description:a3.string().optional()}),outputSchema:a3.object({id:a3.string(),name:a3.string(),slug:a3.string(),logo:a3.string().nullable().optional(),metadata:a3.any().optional(),createdAt:a3.string().datetime().describe("ISO 8601 timestamp")}),handler:async($,Z)=>{if(t(Z),await Z.access.check(),$.id!==Z.organization?.id)throw Error("Organization ID does not match authenticated organization");let Q={};if($.name)Q.name=$.name;if($.description!==void 0){let Y=await Z.boundAuth.organization.get($.id);Q.metadata={...Y?.metadata,description:$.description}}let X=await Z.boundAuth.organization.update({organizationId:$.id,data:Q});if(!X)throw Error("Failed to update organization");return{...X,createdAt:X.createdAt instanceof Date?X.createdAt.toISOString():X.createdAt}}})});import{z as gn}from"zod";var Ti0;var d$$=D(()=>{q0();Ti0=g({name:"ORGANIZATION_DELETE",description:"Archive an organization (soft delete).",annotations:{title:"Delete Organization",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:gn.object({id:gn.string()}),outputSchema:gn.object({success:gn.boolean(),id:gn.string()}),handler:async($,Z)=>{if(t(Z),await Z.access.check(),$.id!==Z.organization?.id)throw Error("Organization ID does not match authenticated organization");let X=(await Z.boundAuth.organization.get($.id))?.metadata??{};if(X.archived===!0)return{success:!0,id:$.id};return await Z.boundAuth.organization.update({organizationId:$.id,data:{metadata:{...X,archived:!0,archivedAt:new Date().toISOString()}}}),{success:!0,id:$.id}}})});import{z as c1}from"zod";function FX($,Z){let Q=$?.[Z];return T54.has(Z)?Q!==!1:Q===!0}function i$$($){let Z=$?.auto_resolve_conflicts;return typeof Z==="boolean"?Z:$?.auto_merge===!0}var NU=500,hn,un,UU,m$$,lO,ln,cn,dn,jj,T54,JQ0=262144,R54=50,GG=500,q54=5000,cO;var t9=D(()=>{hn=c1.object({title:c1.string().max(NU),url:c1.string().max(NU),icon:c1.string().max(NU)}),un=c1.object({registries:c1.record(c1.string().max(NU),c1.object({enabled:c1.boolean()})).describe("Per-registry enabled/disabled state. Key is connection ID. Absent registries are treated as enabled."),blockedMcps:c1.array(c1.string().max(NU)).describe("List of MCP app_name or app_id values to hide from the store.")}),UU=c1.object({keyId:c1.string().max(NU),modelId:c1.string().max(NU),title:c1.string().max(NU).optional()}).nullable(),m$$=c1.enum(["fast","smart","thinking","image","web_search","deep_research"]),lO=c1.enum(["fast","smart","thinking"]),ln=c1.object({tiers:c1.object({fast:UU,smart:UU,thinking:UU,image:UU,web_search:UU,deep_research:UU})}),cn=c1.object({tiers:c1.object({fast:UU.optional(),smart:UU.optional(),thinking:UU.optional()})}),dn=c1.object({ids:c1.array(c1.string().max(NU)).describe("Ordered list of custom virtual MCP agent ids to show on the home view.")}),jj=c1.object({demo_mode:c1.boolean().optional().describe("Curated demo org: the commerce connect modal proceeds without a configured required data source."),reports_only:c1.boolean().optional().describe("Curated commerce (reports) look: hides agent navigation, the home Customize button, and the Settings/Automations tabs. Defaulted on for orgs created by commerce onboarding."),reviewer_enabled:c1.boolean().optional().describe("Run the Reviewer on a task's pull request once it's In Review \u2014 it reviews the code with the repo's stack-appropriate skills, fixes what it finds on the PR's own branch, then exercises the change on the deploy preview and approves or hands the card to a human."),qa_agent_enabled:c1.boolean().optional().describe("Deprecated: see reviewer_enabled."),code_reviewer_enabled:c1.boolean().optional().describe("Deprecated: see reviewer_enabled."),auto_merge:c1.boolean().optional().describe("When the Reviewer approves a task's pull request, merge it automatically instead of leaving the merge to a human."),auto_resolve_conflicts:c1.boolean().optional().describe("When an approved pull request can't be merged because it conflicts with its base branch, hand it back to the Super Agent to resolve the conflict (check out the branch, merge the base, push). Unset, it follows `auto_merge`; set it explicitly to run one without the other."),cheap_reviewer_model:c1.boolean().optional().describe("Run the Reviewer on a cheaper model than the Super Agent that wrote the code. On by default \u2014 turning it off trades cost for some review depth."),coding_agent_org_mcps:c1.boolean().optional().describe("Give a coding-agent run (the claude-code harness in a sandbox) every MCP connection in the org as its own MCP server, on top of the narrow task-run surface it always gets. Off by default: each connection is one more server the agent connects to at session start, and all of their tools land in its context."),coding_agents_claude_code:c1.boolean().optional().describe("Run chats on a Code Agent (an agent imported from a GitHub repo) with the claude-code harness inside its sandbox, instead of hosted Decopilot. Off by default: it changes the runtime of every such chat, and claude-code flushes whole turns rather than streaming tokens."),auto_assign_report_tasks_to_super_agent:c1.boolean().optional().describe("When a report import creates a task board item without an assignee, delegate it to the Super Agent automatically instead of leaving it unassigned."),hosting_enabled:c1.boolean().optional().describe("Per-site Hosting tab (deployments, domains, deploy outcomes). Off by default. deco.cx staff and local dev always see it; this flag is the per-client lever to open it to one external org. `HOSTING_CONTROL_PLANE_GA` opens it (and its peers) to every org at once."),deco_analytics_enabled:c1.boolean().optional().describe("Per-site Deco Analytics tab (traffic, realtime, usage & limits). Off by default. deco.cx staff and local dev always see it; this flag is the per-client lever to open it to one external org. `HOSTING_CONTROL_PLANE_GA` opens it (and its peers) to every org at once."),e2e_enabled:c1.boolean().optional().describe("Per-site E2E tab (end-to-end test runs). Off by default. deco.cx staff and local dev always see it; this flag is the per-client lever to open it to one external org. `HOSTING_CONTROL_PLANE_GA` opens it (and its peers) to every org at once."),monitor_enabled:c1.boolean().optional().describe("Per-site Monitor tab (CDN Performance + Audience from the stats-lake warehouse). Off by default. deco.cx staff and local dev always see it; this flag is the per-client lever to open it to one external org. Its own deployment-wide switch `MONITOR_GA` opens it to every org at once (independent of the control-plane trio)."),delivery_lanes_enabled:c1.boolean().optional().describe("Board lanes for shipping: Approved, Merged and Post-deploy Validation sit between In Review and Done, and a merged pull request lands on Merged instead of Done. For teams whose release process continues after the merge. Off by default \u2014 with it off the board and the state machine behave exactly as if the lanes did not exist."),cms_auto_fresh_branch:c1.boolean().optional().describe("When a user opens the CMS on a branch whose last commit is older than the staleness window (2 days), move the session to a freshly minted branch cut from the default branch. The stale branch is left intact on GitHub. Off by default.")}),T54=new Set(["reviewer_enabled","cheap_reviewer_model"]);cO=c1.object({id:c1.string().describe("Brand context ID"),name:c1.string().max(GG).describe("Company name"),domain:c1.string().max(GG).describe("Company domain (e.g. example.com)"),overview:c1.string().max(q54).describe("Company overview / description"),logo:c1.string().max(GG).nullable().optional().describe("Logo URL"),favicon:c1.string().max(GG).nullable().optional().describe("Favicon URL"),ogImage:c1.string().max(GG).nullable().optional().describe("OG image URL"),fonts:c1.object({heading:c1.string().max(GG).optional().describe("Font family for headings"),body:c1.string().max(GG).optional().describe("Font family for body text"),code:c1.string().max(GG).optional().describe("Font family for code / monospace")}).nullable().optional().describe("Font families by semantic role"),colors:c1.object({primary:c1.string().max(GG).optional().describe("Primary brand color (hex)"),secondary:c1.string().max(GG).optional().describe("Secondary brand color (hex)"),accent:c1.string().max(GG).optional().describe("Accent / highlight color (hex)"),background:c1.string().max(GG).optional().describe("Background color (hex)"),foreground:c1.string().max(GG).optional().describe("Foreground / text color (hex)")}).nullable().optional().describe("Semantic color palette"),images:c1.array(c1.record(c1.string(),c1.unknown())).max(R54).nullable().optional().refine(($)=>$===null||$===void 0||JSON.stringify($).length<=JQ0,{message:`images must serialize to at most ${JQ0} bytes`}).describe("Brand images"),metadata:c1.record(c1.string(),c1.unknown()).nullable().optional().refine(($)=>$===null||$===void 0||JSON.stringify($).length<=JQ0,{message:`metadata must serialize to at most ${JQ0} bytes`}).describe("Extra design tokens (typography, components, spacing, layout, tone, etc.)"),archivedAt:c1.string().nullable().optional().describe("Archive timestamp (null to unarchive)"),isDefault:c1.boolean().optional().describe("Whether this is the default brand for the organization")})});import{z as dO}from"zod";var Ri0;var p$$=D(()=>{q0();t9();Ri0=g({name:"ORGANIZATION_SETTINGS_GET",description:"Get organization-level settings including sidebar configuration, store registry settings, simple model mode, and default home agents.",annotations:{title:"Get Organization Settings",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:dO.object({}),outputSchema:dO.object({organizationId:dO.string(),sidebar_items:dO.array(hn).nullable().optional(),enabled_plugins:dO.array(dO.string()).nullable().optional(),registry_config:un.nullable().optional(),simple_mode:ln.nullable().optional(),default_home_agents:dn.nullable().optional(),flags:jj.nullable().optional(),createdAt:dO.string().datetime().optional().describe("ISO 8601 timestamp"),updatedAt:dO.string().datetime().optional().describe("ISO 8601 timestamp")}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=Z.organization?.id;if(!Q)throw Error("Organization ID required (no active organization in context)");let X=await Z.storage.organizationSettings.get(Q);if(!X)return{organizationId:Q};return{...X,createdAt:X.createdAt instanceof Date?X.createdAt.toISOString():X.createdAt,updatedAt:X.updatedAt instanceof Date?X.updatedAt.toISOString():X.updatedAt}}})});import{z as o9}from"zod";var I54=50,M54=500,k54=100,V54=200,n$$=200,WQ0=500,qi0;var t$$=D(()=>{q0();t9();qi0=g({name:"ORGANIZATION_SETTINGS_UPDATE",description:"Update organization-level settings such as sidebar configuration, store registry settings, simple model mode, and default home agents.",annotations:{title:"Update Organization Settings",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:o9.object({organizationId:o9.string(),sidebar_items:o9.array(hn).max(I54).optional(),enabled_plugins:o9.array(o9.string().max(WQ0)).max(V54).optional(),registry_config:un.extend({registries:o9.record(o9.string().max(WQ0),o9.object({enabled:o9.boolean()})).refine(($)=>Object.keys($).length<=n$$,{message:`registries must have at most ${n$$} entries`}),blockedMcps:o9.array(o9.string().max(WQ0)).max(M54)}).optional(),simple_mode:ln.optional(),default_home_agents:dn.extend({ids:o9.array(o9.string().max(WQ0)).max(k54)}).optional(),flags:jj.strict().optional().describe("Org boolean toggles. Shallow-merged into the stored flags: keys you pass win (explicit false persists), omitted keys keep their value.")}),outputSchema:o9.object({organizationId:o9.string(),sidebar_items:o9.array(hn).nullable().optional(),enabled_plugins:o9.array(o9.string()).nullable().optional(),registry_config:un.nullable().optional(),simple_mode:ln.nullable().optional(),default_home_agents:dn.nullable().optional(),flags:jj.nullable().optional(),createdAt:o9.string().datetime().describe("ISO 8601 timestamp"),updatedAt:o9.string().datetime().describe("ISO 8601 timestamp")}),handler:async($,Z)=>{if(t(Z),await Z.access.check(),n(Z).id!==$.organizationId)throw Error("Cannot update settings for a different organization");let X=await Z.storage.organizationSettings.upsert($.organizationId,{sidebar_items:$.sidebar_items,enabled_plugins:$.enabled_plugins,registry_config:$.registry_config,simple_mode:$.simple_mode,default_home_agents:$.default_home_agents,flags:$.flags});return{...X,createdAt:X.createdAt instanceof Date?X.createdAt.toISOString():X.createdAt,updatedAt:X.updatedAt instanceof Date?X.updatedAt.toISOString():X.updatedAt}}})});import{z as e3}from"zod";var o$$,Ii0,Mi0;var r$$=D(()=>{q0();t9();o$$=cO.extend({organizationId:e3.string(),archivedAt:e3.string().nullable().optional().describe("ISO 8601 timestamp"),createdAt:e3.string().describe("ISO 8601 timestamp"),updatedAt:e3.string().describe("ISO 8601 timestamp")}),Ii0=g({name:"BRAND_CONTEXT_LIST",description:"List all brand contexts (company profiles) for the current organization.",annotations:{title:"List Brand Contexts",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:e3.object({includeArchived:e3.boolean().optional().describe("Include archived brands in the list")}),outputSchema:e3.object({items:e3.array(o$$)}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=Z.organization?.id;if(!Q)throw Error("Organization ID required (no active organization in context)");return{items:(await Z.storage.brandContext.list(Q,{includeArchived:$.includeArchived})).map((Y)=>({...Y,archivedAt:Y.archivedAt instanceof Date?Y.archivedAt.toISOString():Y.archivedAt,createdAt:Y.createdAt instanceof Date?Y.createdAt.toISOString():Y.createdAt,updatedAt:Y.updatedAt instanceof Date?Y.updatedAt.toISOString():Y.updatedAt}))}}}),Mi0=g({name:"BRAND_CONTEXT_GET",description:"Get a specific brand context by ID.",annotations:{title:"Get Brand Context",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:e3.object({id:e3.string().describe("Brand context ID")}),outputSchema:o$$.extend({organizationId:e3.string()}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=Z.organization?.id;if(!Q)throw Error("Organization ID required (no active organization in context)");let X=await Z.storage.brandContext.get($.id,Q);if(!X)throw Error("Brand context not found");return{...X,archivedAt:X.archivedAt instanceof Date?X.archivedAt.toISOString():X.archivedAt,createdAt:X.createdAt instanceof Date?X.createdAt.toISOString():X.createdAt,updatedAt:X.updatedAt instanceof Date?X.updatedAt.toISOString():X.updatedAt}}})});import{z as zj}from"zod";var s$$,ki0,Vi0,Si0;var a$$=D(()=>{q0();t9();s$$=cO.extend({organizationId:zj.string(),createdAt:zj.string().describe("ISO 8601 timestamp"),updatedAt:zj.string().describe("ISO 8601 timestamp")}),ki0=g({name:"BRAND_CONTEXT_CREATE",description:"Create a new brand context (company profile) for the current organization.",annotations:{title:"Create Brand Context",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1,openWorldHint:!1},inputSchema:cO.omit({id:!0}),outputSchema:s$$,handler:async($,Z)=>{t(Z),await Z.access.check();let Q=Z.organization?.id;if(!Q)throw Error("Organization ID required (no active organization in context)");let X=await Z.storage.brandContext.create(Q,{name:$.name,domain:$.domain,overview:$.overview,logo:$.logo??null,favicon:$.favicon??null,ogImage:$.ogImage??null,fonts:$.fonts??null,colors:$.colors??null,images:$.images??null,metadata:$.metadata??null});return{...X,archivedAt:X.archivedAt instanceof Date?X.archivedAt.toISOString():X.archivedAt,createdAt:X.createdAt instanceof Date?X.createdAt.toISOString():X.createdAt,updatedAt:X.updatedAt instanceof Date?X.updatedAt.toISOString():X.updatedAt}}}),Vi0=g({name:"BRAND_CONTEXT_UPDATE",description:"Update an existing brand context by ID.",annotations:{title:"Update Brand Context",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:cO.partial().required({id:!0}),outputSchema:s$$,handler:async($,Z)=>{t(Z),await Z.access.check();let Q=Z.organization?.id;if(!Q)throw Error("Organization ID required (no active organization in context)");if(!await Z.storage.brandContext.get($.id,Q))throw Error("Brand context not found");let{id:Y,...G}=$;if(G.isDefault===!0)await Z.storage.brandContext.setDefault(Y,Q);let J=await Z.storage.brandContext.update(Y,Q,{name:G.name,domain:G.domain,overview:G.overview,logo:G.logo!==void 0?G.logo??null:void 0,favicon:G.favicon!==void 0?G.favicon??null:void 0,ogImage:G.ogImage!==void 0?G.ogImage??null:void 0,fonts:G.fonts!==void 0?G.fonts??null:void 0,colors:G.colors!==void 0?G.colors??null:void 0,images:G.images!==void 0?G.images??null:void 0,metadata:G.metadata!==void 0?G.metadata??null:void 0,archivedAt:G.archivedAt!==void 0?G.archivedAt??null:void 0,isDefault:G.isDefault===!1?!1:void 0});return{...J,archivedAt:J.archivedAt instanceof Date?J.archivedAt.toISOString():J.archivedAt,createdAt:J.createdAt instanceof Date?J.createdAt.toISOString():J.createdAt,updatedAt:J.updatedAt instanceof Date?J.updatedAt.toISOString():J.updatedAt}}}),Si0=g({name:"BRAND_CONTEXT_DELETE",description:"Archive a brand context by ID (soft delete).",annotations:{title:"Archive Brand Context",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:zj.object({id:zj.string().describe("Brand context ID")}),outputSchema:zj.object({success:zj.boolean()}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=Z.organization?.id;if(!Q)throw Error("Organization ID required (no active organization in context)");if(!await Z.storage.brandContext.get($.id,Q))throw Error("Brand context not found");return await Z.storage.brandContext.update($.id,Q,{archivedAt:new Date().toISOString(),isDefault:!1}),{success:!0}}})});async function KQ0($,Z,Q){let X=$.trim();if(!X.startsWith("http"))X=`https://${X}`;let Y=await fetch("https://api.firecrawl.dev/v1/scrape",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${Z}`},body:JSON.stringify({url:X,formats:["branding"]})});if(!Y.ok){let N=await Y.text().catch(()=>"");throw Error(`Firecrawl API error: ${Y.status} ${N.slice(0,200)}`)}let G=await Y.json();if(!G.success||!G.data?.branding)return null;let J=G.data.branding,W=G.data.metadata??{},K=_54(J,W);return{name:W.title?.split(/[|\u2013\u2014]|\s+-\s+/).map((N)=>N.trim()).filter(Boolean)?.slice().sort((N,B)=>N.length-B.length)[0]??W.ogSiteName??Q??$,domain:$,overview:W.description??"",logo:K.logo,favicon:K.favicon,ogImage:K.ogImage,fonts:K.fonts,colors:K.colors,images:null,metadata:Object.keys(K.metadata).length>0?K.metadata:null}}function _54($,Z){let Q=$.images??{},X=$.colors??{},Y={};for(let[F,U]of Object.entries(X))if(typeof U==="string"&&U&&S54.has(F))Y[F]=U;let G={},W=($.typography??{}).fontFamilies??{};for(let[F,U]of Object.entries(W))if(typeof U==="string"&&U){let N=C54[F.toLowerCase()];if(N&&!G[N])G[N]=U}let K=$.fonts;if(Array.isArray(K))for(let F of K){let U=F.family;if(typeof U==="string"&&U&&!G.body)G.body=U}let H={};for(let F of["typography","components","spacing","layout","animations","icons","tone","personality","colorScheme"])if($[F]!==void 0)H[F]=$[F];return{logo:Q.logo??null,favicon:Q.favicon??null,ogImage:Q.ogImage??Z.ogImage??null,fonts:Object.keys(G).length>0?G:null,colors:Object.keys(Y).length>0?Y:null,metadata:H}}var S54,C54;var Ci0=D(()=>{S54=new Set(["primary","secondary","accent","background","foreground"]),C54={heading:"heading",headings:"heading",head:"heading",title:"heading",body:"body",primary:"body",text:"body",code:"code",monospace:"code",mono:"code"}});import{z as HQ0}from"zod";var v54,_i0;var e$$=D(()=>{q0();Ci0();t9();v54=cO.pick({id:!0,name:!0,domain:!0,overview:!0,logo:!0,favicon:!0,ogImage:!0,fonts:!0,colors:!0}).extend({success:HQ0.boolean()}),_i0=g({name:"BRAND_CONTEXT_EXTRACT",description:"Extract brand context (colors, fonts, logos) from a website URL using Firecrawl.",annotations:{title:"Extract Brand Context",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},inputSchema:HQ0.object({domain:HQ0.string().describe("Website domain to extract brand from"),brandId:HQ0.string().optional().describe("Existing brand context ID to update (creates new if omitted)")}),outputSchema:v54,modelSummary:($)=>$.success?`Brand saved (id=${$.id}, name=${$.name}, domain=${$.domain}). The UI rendered the logo, colors, fonts, and overview.`:"Brand extraction failed.",handler:async($,Z)=>{t(Z),await Z.access.check();let Q=Z.organization?.id;if(!Q)throw Error("Organization ID required (no active organization in context)");let X=Z.firecrawlApiKey;if(!X)throw Error("FIRECRAWL_API_KEY is not configured. Set the environment variable to enable brand extraction.");let Y=await KQ0($.domain,X,$.domain);if(!Y)throw Error("Firecrawl did not return branding data for this URL");let G={name:Y.name,domain:Y.domain,overview:Y.overview,logo:Y.logo,favicon:Y.favicon,ogImage:Y.ogImage,fonts:Y.fonts,colors:Y.colors,images:Y.images,metadata:Y.metadata},J=$.brandId?await(async()=>{if(!await Z.storage.brandContext.get($.brandId,Q))throw Error("Brand context not found");return Z.storage.brandContext.update($.brandId,Q,G)})():await Z.storage.brandContext.create(Q,G);return{id:J.id,name:J.name,domain:J.domain,overview:J.overview,logo:J.logo,favicon:J.favicon,ogImage:J.ogImage,fonts:J.fonts,colors:J.colors,success:!0}}})});function $8$($){let Z=$.metadata??{};return{id:$.id,name:$.name,domain:$.domain||void 0,colors:$.colors??void 0,fonts:$.fonts??void 0,assets:$.logo||$.favicon||$.ogImage?{logo:$.logo??void 0,favicon:$.favicon??void 0,ogImage:$.ogImage??void 0}:void 0,overview:$.overview||void 0,tagline:typeof Z.tagline==="string"?Z.tagline:void 0,tone:typeof Z.tone==="string"?Z.tone:void 0,metadata:(()=>{let Q=Object.fromEntries(Object.entries(Z).filter(([X])=>X!=="tagline"&&X!=="tone"));return Object.keys(Q).length>0?Q:void 0})()}}var vi0,fi0;var Z8$=D(()=>{_m0();q0();vi0=g({name:"BRAND_GET",description:"Get a brand context by ID. Omit the ID to get the default brand for the organization.",annotations:{title:"Get Brand",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:x70,outputSchema:In,handler:async($,Z)=>{t(Z),await Z.access.check();let Q=Z.organization?.id;if(!Q)throw Error("Organization ID required (no active organization in context)");let X=$.id?await Z.storage.brandContext.get($.id,Q):await Z.storage.brandContext.getDefault(Q);if(!X)throw Error($.id?"Brand not found":"No default brand configured");return $8$(X)}}),fi0=g({name:"BRAND_LIST",description:"List all active brands for the current organization.",annotations:{title:"List Brands",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:y70,outputSchema:g70,handler:async($,Z)=>{t(Z),await Z.access.check();let Q=Z.organization?.id;if(!Q)throw Error("Organization ID required (no active organization in context)");return{items:(await Z.storage.brandContext.list(Q)).map($8$)}}})});import{resolveTxt as f54}from"dns/promises";function bi0($){return`${b54}.${$.toLowerCase()}`}function Q8$(){return`deco-verify-${crypto.randomUUID().replace(/-/g,"")}`}async function X8$($,Z,Q=f54){if(!Z)return!1;try{return(await Q(bi0($))).some((Y)=>Y.join("").trim()===Z)}catch{return!1}}var b54="_deco-verify";var Y8$=()=>{};import{z as b5}from"zod";function mO($){let Z=$.verificationStatus==="pending"&&Boolean($.verificationToken);return{id:$.id,domain:$.domain,joinMode:$.joinMode,verificationStatus:$.verificationStatus,verificationMethod:$.verificationMethod,verifiedAt:$.verifiedAt?new Date($.verifiedAt).toISOString():null,recordName:Z?bi0($.domain):null,recordValue:Z?$.verificationToken:null}}function y54($){let Z=$.toLowerCase().trim();if(!x54.test(Z))throw Error(`Invalid domain format: "${Z}". Must be a valid domain like "acme.com"`);if($W.has(Z))throw Error(`Cannot claim generic email domain "${Z}". Only corporate domains are allowed.`);return Z}var x54,xi0,FQ0,yi0,gi0,hi0,ui0,li0;var G8$=D(()=>{JG();Y8$();q0();x54=/^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$/,xi0=b5.enum(["off","auto","request"]),FQ0=b5.object({id:b5.string(),domain:b5.string(),joinMode:xi0,verificationStatus:b5.enum(["pending","verified"]),verificationMethod:b5.enum(["email","dns"]).nullable(),verifiedAt:b5.string().nullable(),recordName:b5.string().nullable(),recordValue:b5.string().nullable()});yi0=g({name:"ORGANIZATION_DOMAIN_LIST",description:"List the email domains claimed by an organization.",annotations:{title:"List Organization Domains",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:b5.object({}),outputSchema:b5.object({domains:b5.array(FQ0)}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=n(Z);return{domains:(await Z.storage.organizationDomains.listByOrganizationId(Q.id)).map(mO)}}}),gi0=g({name:"ORGANIZATION_DOMAIN_ADD",description:"Claim an email domain for an organization. If the caller's verified email matches the domain it is trusted immediately; otherwise it requires DNS verification.",annotations:{title:"Add Organization Domain",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:b5.object({domain:b5.string().min(1).max(255).describe("Domain to claim, e.g. acme.com"),joinMode:xi0.optional().describe("Initial join mode (only applied when the domain is trusted immediately via email match).")}),outputSchema:FQ0,handler:async($,Z)=>{t(Z),await Z.access.check();let Q=n(Z),X=y54($.domain),G=Z.auth.user?.email?.split("@")[1]?.toLowerCase(),J=Boolean(Z.auth.user?.emailVerified)&&G===X,W=await Z.storage.organizationDomains.getByOrgAndDomain(Q.id,X);if(W){if(W.verificationStatus!=="verified"&&J){let H=await Z.storage.organizationDomains.markVerified(W.id,"email");return mO(H)}return mO(W)}let K=J?await Z.storage.organizationDomains.add(Q.id,X,{joinMode:$.joinMode??"off",verificationStatus:"verified",verificationMethod:"email"}):await Z.storage.organizationDomains.add(Q.id,X,{joinMode:"off",verificationStatus:"pending",verificationToken:Q8$()});return mO(K)}}),hi0=g({name:"ORGANIZATION_DOMAIN_UPDATE",description:"Set the join mode for a claimed domain. Discoverable modes (auto/request) require the domain to be verified.",annotations:{title:"Update Organization Domain",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:b5.object({id:b5.string(),joinMode:xi0}),outputSchema:FQ0,handler:async($,Z)=>{t(Z),await Z.access.check();let Q=n(Z),X=await Z.storage.organizationDomains.getById($.id);if(!X||X.organizationId!==Q.id)throw Error("Domain not found");if($.joinMode!=="off"&&X.verificationStatus!=="verified")throw Error("Verify the domain before enabling auto-join or requests.");let Y=await Z.storage.organizationDomains.updateJoinMode($.id,$.joinMode);return mO(Y)}}),ui0=g({name:"ORGANIZATION_DOMAIN_VERIFY",description:"Check the DNS TXT record for a pending domain and mark it verified if present.",annotations:{title:"Verify Organization Domain",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},inputSchema:b5.object({id:b5.string()}),outputSchema:b5.object({verified:b5.boolean(),domain:FQ0}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=n(Z),X=await Z.storage.organizationDomains.getById($.id);if(!X||X.organizationId!==Q.id)throw Error("Domain not found");if(X.verificationStatus==="verified")return{verified:!0,domain:mO(X)};if(!X.verificationToken)throw Error("Domain has no pending DNS verification.");if(!await X8$(X.domain,X.verificationToken))return{verified:!1,domain:mO(X)};let G=await Z.storage.organizationDomains.markVerified($.id,"dns");return{verified:!0,domain:mO(G)}}}),li0=g({name:"ORGANIZATION_DOMAIN_REMOVE",description:"Remove a claimed domain from an organization.",annotations:{title:"Remove Organization Domain",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:b5.object({id:b5.string()}),outputSchema:b5.object({success:b5.boolean()}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=n(Z),X=await Z.storage.organizationDomains.getById($.id);if(!X||X.organizationId!==Q.id)throw Error("Domain not found");return await Z.storage.organizationDomains.removeById($.id),{success:!0}}})});function iO($){return($ instanceof Error?$.message.toLowerCase():"").includes("already a member")}import{z as M9}from"zod";var g54,ci0,di0,mi0;var J8$=D(()=>{q0();g4();g54=M9.object({id:M9.string(),userId:M9.string(),status:M9.enum(["pending","approved","denied"]),createdAt:M9.string(),user:M9.object({id:M9.string(),name:M9.string(),email:M9.string(),image:M9.string().nullable()}).nullable()}),ci0=g({name:"ORGANIZATION_JOIN_REQUEST_LIST",description:"List pending requests to join the organization.",annotations:{title:"List Join Requests",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:M9.object({}),outputSchema:M9.object({requests:M9.array(g54)}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=n(Z);return{requests:(await Z.storage.organizationJoinRequests.listPendingWithUser(Q.id)).map((Y)=>({id:Y.id,userId:Y.userId,status:Y.status,createdAt:new Date(Y.createdAt).toISOString(),user:Y.user}))}}}),di0=g({name:"ORGANIZATION_JOIN_REQUEST_APPROVE",description:"Approve a pending join request, adding the user as a member.",annotations:{title:"Approve Join Request",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:M9.object({requestId:M9.string()}),outputSchema:M9.object({success:M9.boolean()}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=n(Z),X=await Z.storage.organizationJoinRequests.getById($.requestId);if(!X||X.organizationId!==Q.id)throw Error("Join request not found");if(X.status!=="pending")throw Error("Join request has already been decided");let Y=n0(Z);if(!await Z.storage.organizationJoinRequests.decide(X.id,"approved",Y??X.userId))return{success:!0};try{await Z.boundAuth.organization.addMember({organizationId:Q.id,userId:X.userId,role:["user"]})}catch(J){if(!iO(J))throw J}if(Y)V1.capture({distinctId:Y,event:"organization_join_request_approved",groups:{organization:Q.id},properties:{organization_id:Q.id,user_id:X.userId}});return{success:!0}}}),mi0=g({name:"ORGANIZATION_JOIN_REQUEST_DENY",description:"Deny a pending join request.",annotations:{title:"Deny Join Request",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:M9.object({requestId:M9.string()}),outputSchema:M9.object({success:M9.boolean()}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=n(Z),X=await Z.storage.organizationJoinRequests.getById($.requestId);if(!X||X.organizationId!==Q.id)throw Error("Join request not found");if(X.status!=="pending")throw Error("Join request has already been decided");let Y=n0(Z);if(await Z.storage.organizationJoinRequests.decide(X.id,"denied",Y??X.userId)&&Y)V1.capture({distinctId:Y,event:"organization_join_request_denied",groups:{organization:Q.id},properties:{organization_id:Q.id,user_id:X.userId}});return{success:!0}}})});import{z as rX}from"zod";var ii0;var W8$=D(()=>{g4();q0();rQ();ii0=g({name:"ORGANIZATION_MEMBER_ADD",description:"Invite a member to the organization by email with an assigned role.",annotations:{title:"Add Organization Member",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:rX.object({organizationId:rX.string().optional(),userId:rX.string(),role:rX.array(rX.string())}),outputSchema:rX.object({id:rX.string(),organizationId:rX.string(),userId:rX.string(),role:rX.union([rX.string(),rX.array(rX.string())]),createdAt:rX.string().datetime().describe("ISO 8601 timestamp")}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=$.organizationId||Z.organization?.id;if(!Q)throw Error("Organization ID required (no active organization in context)");if(Q!==Z.organization?.id)throw Error("Organization ID does not match authenticated organization");let X=await Z.db.selectFrom("member").select(["role"]).where("userId","=",n0(Z)??"").where("organizationId","=",Q).executeTakeFirst();if(!A60(X?.role,$.role))throw Error(`Insufficient privileges to assign role "${$.role.join(",")}"`);let Y=await Z.boundAuth.organization.addMember({organizationId:Q,userId:$.userId,role:$.role});if(!Y)throw Error("Failed to add member");let G=n0(Z);if(G)V1.capture({distinctId:G,event:"organization_member_added",groups:{organization:Q},properties:{organization_id:Q,added_user_id:$.userId,role:$.role}});return{...Y,role:Y.role,createdAt:Y.createdAt instanceof Date?Y.createdAt.toISOString():Y.createdAt}}})});import{z as Rg}from"zod";var pi0;var K8$=D(()=>{g4();q0();pi0=g({name:"ORGANIZATION_MEMBER_REMOVE",description:"Remove a member from the organization. Revokes all their access immediately.",annotations:{title:"Remove Organization Member",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:Rg.object({organizationId:Rg.string().optional(),memberIdOrEmail:Rg.string()}),outputSchema:Rg.object({success:Rg.boolean(),memberIdOrEmail:Rg.string()}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=$.organizationId||Z.organization?.id;if(!Q)throw Error("Organization ID required (no active organization in context)");if(Q!==Z.organization?.id)throw Error("Organization ID does not match authenticated organization");let X=await Z.boundAuth.organization.removeMember({organizationId:Q,memberIdOrEmail:$.memberIdOrEmail});Z.invalidateMemberRole?.(X.member.userId,Q);let Y=n0(Z);if(Y)V1.capture({distinctId:Y,event:"organization_member_removed",groups:{organization:Q},properties:{organization_id:Q,member_id_or_email:$.memberIdOrEmail}});return{success:!0,memberIdOrEmail:$.memberIdOrEmail}}})});import{z as NQ}from"zod";var ni0;var H8$=D(()=>{q0();ni0=g({name:"ORGANIZATION_MEMBER_LIST",description:"List all members in the organization with their roles.",annotations:{title:"List Organization Members",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:NQ.object({limit:NQ.number().int().min(1).max(1000).optional(),offset:NQ.number().int().min(0).optional()}),outputSchema:NQ.object({members:NQ.array(NQ.object({id:NQ.string(),organizationId:NQ.string(),userId:NQ.string(),role:NQ.string(),createdAt:NQ.string().datetime().describe("ISO 8601 timestamp"),user:NQ.object({id:NQ.string(),name:NQ.string(),email:NQ.string(),image:NQ.string().optional()}).optional()}))}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=Z.organization?.id;if(!Q)throw Error("Organization ID required (no active organization in context)");return{members:((await Z.boundAuth.organization.listMembers({organizationId:Q,limit:$.limit,offset:$.offset}))?.members??[]).map((G)=>({...G,createdAt:G.createdAt instanceof Date?G.createdAt.toISOString():G.createdAt}))}}})});import{z as nZ}from"zod";var ti0;var F8$=D(()=>{g4();q0();rQ();ti0=g({name:"ORGANIZATION_MEMBER_UPDATE_ROLE",description:"Change a member's role (e.g., admin, member) within the organization.",annotations:{title:"Update Member Role",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:nZ.object({organizationId:nZ.string().optional(),memberId:nZ.string(),role:nZ.array(nZ.string())}),outputSchema:nZ.object({id:nZ.string(),organizationId:nZ.string(),userId:nZ.string(),role:nZ.union([nZ.string(),nZ.array(nZ.string())]),createdAt:nZ.string().datetime().describe("ISO 8601 timestamp"),user:nZ.object({email:nZ.string(),name:nZ.string(),image:nZ.string().optional()})}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=$.organizationId||Z.organization?.id;if(!Q)throw Error("Organization ID required (no active organization in context)");if(Q!==Z.organization?.id)throw Error("Organization ID does not match authenticated organization");let X=await Z.db.selectFrom("member").select(["role"]).where("userId","=",n0(Z)??"").where("organizationId","=",Q).executeTakeFirst();if(!A60(X?.role,$.role))throw Error(`Insufficient privileges to assign role "${$.role.join(",")}"`);let Y=await Z.boundAuth.organization.updateMemberRole({organizationId:Q,memberId:$.memberId,role:$.role});if(!Y)throw Error("Failed to update member role");Z.invalidateMemberRole?.(Y.userId,Q);let G=n0(Z);if(G)V1.capture({distinctId:G,event:"organization_member_role_updated",groups:{organization:Q},properties:{organization_id:Q,member_id:$.memberId,target_user_id:Y.userId,new_role:Array.isArray($.role)?$.role.join(","):$.role}});return{...Y,createdAt:Y.createdAt instanceof Date?Y.createdAt.toISOString():Y.createdAt}}})});async function U8$(){if(mn&&Date.now()-mn.fetchedAt<600000)return mn.rate;try{let Z=await(await fetch("https://economia.awesomeapi.com.br/json/last/USD-BRL",{signal:AbortSignal.timeout(5000)})).json(),Q=parseFloat(Z.USDBRL?.bid??"");if(Number.isNaN(Q)||Q<=0)throw Error("Invalid rate");return mn={rate:Q,fetchedAt:Date.now()},Q}catch{return mn?.rate??5.5}}function N8$($,Z,Q){if(Z==="brl")return Math.round($/Q);return $}var mn=null;function oi0($,Z="",Q=new URLSearchParams){for(let[X,Y]of Object.entries($)){if(Y===void 0||Y===null)continue;let G=Z?`${Z}[${X}]`:X;if(Array.isArray(Y))Y.forEach((J,W)=>{if(typeof J==="object"&&J!==null)oi0(J,`${G}[${W}]`,Q);else Q.append(`${G}[${W}]`,String(J))});else if(typeof Y==="object")oi0(Y,G,Q);else Q.append(G,String(Y))}return Q}async function pn($,Z){let Q=M0().stripeSecretKey;if(!Q)throw new WG(503,"billing is not configured");let X=Z?.params?oi0(Z.params).toString():void 0,Y=await fetch(`${h54}${$}`,{method:Z?.method??(X?"POST":"GET"),headers:{Authorization:`Bearer ${Q}`,...X&&{"Content-Type":"application/x-www-form-urlencoded"}},body:X,signal:AbortSignal.timeout(u54)}),G=await Y.json().catch(()=>({}));if(!Y.ok){let J=G.error?.message??`HTTP ${Y.status}`;throw new WG(Y.status,J)}return G}function B8$($){return{billing_address_collection:"required",custom_fields:[{key:l54,label:{type:"custom",custom:"CPF / CNPJ"},type:"text",optional:!1,text:{minimum_length:c54,maximum_length:d54}}],...$&&{customer_update:{address:"auto",name:"auto"}}}}async function O8$($){let Z=M0().stripeOrgPriceId;if(!Z)throw new WG(503,"billing is not configured");let Q=await pn("/checkout/sessions",{params:{mode:"subscription",...B8$(null),line_items:[{price:Z,quantity:1}],success_url:$.successUrl,cancel_url:$.cancelUrl,metadata:{orgId:$.organizationId},subscription_data:{metadata:{orgId:$.organizationId}}}});if(!Q.url)throw new WG(500,"checkout session lacks url");return{url:Q.url}}function m54($,Z){return Math.round($*(1+Z/100))}async function D8$($){let Z=m54($.amountCents,$.feePercent),Q=N8$($.amountCents,$.currency,await U8$()),X=M0().stripeTopupProductId,Y={kind:"topup",orgId:$.organizationId,creditCents:Q},G=$.currency==="brl"?`Studio AI credits (R$ ${($.amountCents/100).toFixed(2)})`:`Studio AI credits ($${($.amountCents/100).toFixed(2)})`,J=await pn("/checkout/sessions",{params:{mode:"payment",...$.customerId&&{customer:$.customerId},...B8$($.customerId),line_items:[{quantity:1,price_data:{currency:$.currency,unit_amount:Z,...X?{product:X}:{product_data:{name:G}}}}],success_url:$.successUrl,cancel_url:$.cancelUrl,metadata:Y,payment_intent_data:{metadata:Y}}});if(!J.url)throw new WG(500,"checkout session lacks url");return{url:J.url}}async function UQ0($){let Z=await pn("/billing_portal/sessions",{params:{customer:$.customerId,return_url:$.returnUrl}});if(!Z.url)throw new WG(500,"portal session lacks url");return{url:Z.url}}async function NQ0($){return pn(`/subscriptions/${encodeURIComponent($)}`)}async function w8$($){await pn(`/subscriptions/${encodeURIComponent($)}`,{method:"DELETE"})}var h54="https://api.stripe.com/v1",WG,u54=15000,l54="taxid",c54=11,d54=18;var Pj=D(()=>{E$();WG=class WG extends Error{status;constructor($,Z){super(`Stripe API ${$}: ${Z}`);this.status=$;this.name="StripeApiError"}}});import{z as ri0}from"zod";var si0;var L8$=D(()=>{Pj();C5();q0();g4();si0=g({name:"ORGANIZATION_BILLING_CHECKOUT_START",description:"Start the organization's subscription: creates a Stripe Checkout session and returns its URL.",annotations:{title:"Start Billing Checkout",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1,openWorldHint:!0},inputSchema:ri0.object({}),outputSchema:ri0.object({url:ri0.string()}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=Z.organization?.id,X=Z.organization?.slug;if(!Q||!X)throw Error("Organization context required");let Y=await Z.storage.organizationBilling.getBilling(Q);if(Y?.status==="active")throw Error("This organization already has an active subscription.");if(Y?.stripeSubscriptionId)throw Error("This organization still has a subscription on file \u2014 settle or cancel it before starting a new checkout.");let G=`${L5()}${VO(X,"members")}`,{url:J}=await O8$({organizationId:Q,successUrl:`${G}?checkout=success`,cancelUrl:`${G}?checkout=canceled`});return ZG({event:"subscription_checkout_started",organizationId:Q,...Z.auth?.user?.id?{userId:Z.auth.user.id}:{}}),{url:J}}})});import{z as ai0}from"zod";var ei0;var E8$=D(()=>{Pj();C5();q0();ei0=g({name:"ORGANIZATION_BILLING_PORTAL",description:"Open the organization's Stripe billing portal (manage card, invoices, cancellation). Returns the portal URL.",annotations:{title:"Open Billing Portal",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1,openWorldHint:!0},inputSchema:ai0.object({}),outputSchema:ai0.object({url:ai0.string()}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=n(Z);if(!Q.slug)throw Error("Organization context required");let X=await Z.storage.organizationBilling.getBilling(Q.id);if(!X?.stripeCustomerId)throw Error("This organization has no billing account yet \u2014 subscribe first.");try{return await UQ0({customerId:X.stripeCustomerId,returnUrl:`${L5()}${VO(Q.slug,"members")}`})}catch(Y){if(Y instanceof WG)throw Error(Y.message);throw Y}}})});function BQ0($){return $p0[$%$p0.length]??i54}function sX($){return $.createdBy==="system"}function n54($){if($?.reviewer_enabled===void 0&&$?.qa_agent_enabled===!1&&$?.code_reviewer_enabled===!1)return!1;return FX($,"reviewer_enabled")}function BU($){return n54($)?mK:[]}function t54($){return FX($,"delivery_lanes_enabled")}function pK($){return t54($)?"merged":"done"}function nO($,Z){if(!$)return!1;return[iK[Z],...p54].some((Q)=>$.startsWith(`${Q}:`))}function OU($,Z){if(Z)return new Date(Z).getTime();let Q=0;for(let X of $){if(X.action!=="status_changed")continue;if(X.data?.to!=="in_review")continue;Q=Math.max(Q,new Date(X.occurredAt).getTime())}return Q}function tO($,Z){let Q=OU($,Z.cycleStartedAt),X=new Map;for(let Y of $){if(Y.action!=="review_approved"&&Y.action!=="review_changes_requested")continue;if(new Date(Y.occurredAt).getTime()<Q)continue;let G=Y.data??{};if(G.reviewer!=="reviewer")continue;if(Y.action==="review_approved"){if(Z?.verifiedOnly&&G.verified!==!0)continue;X.set("reviewer","approved")}else X.set("reviewer","changes_requested")}return X}function pO($,Z,Q){if(Z.length===0)return!1;let X=tO($,Q);return Z.every((Y)=>X.get(Y)==="approved")}function P8$($,Z,Q){return pO($,Z,Q)&&!pO($,Z,{...Q,verifiedOnly:!0})}function A8$($){let Z=null;for(let Q of $){if(Q.action!=="review_approved"&&Q.action!=="review_changes_requested")continue;let X=new Date(Q.occurredAt).getTime();if(Z&&X<Z.at)continue;let Y=Q.data?.notes;Z={at:X,notes:Q.action==="review_changes_requested"&&typeof Y==="string"?Y:null}}return Z?.notes??null}function M8$($,Z=Date.now()){if($.state!==null&&$.state!=="open")return!1;if($.state===null)return!0;if($.checksStatus==="pending")return!0;if($.previewUrl!==null)return!1;let Q=$.updatedAt?Date.parse($.updatedAt):Number.NaN;return Number.isFinite(Q)&&Z-Q<o54}var n$="super-agent",$p0,i54,nn='Your checkout is SHALLOW (`git clone --depth 1`), so it has no merge base and `git diff main...HEAD` (three dots) fails with "fatal: main...HEAD: no merge base". To see a branch diff, either use the two-dot form against the fetched remote ref (`git fetch origin <base> && git diff origin/<base> HEAD`), or deepen first with `git fetch --deepen=100`. Same for `git log main..HEAD` and anything else that needs shared history.',j8$,Zp0="chore",mK,iK,p54,tn="NO VISUAL SURFACE",ZW,A$,z8$,OQ0,T8$="task-board.item.updated",R8$="task-board.item.deleted",q8$="task-board.item.prs.updated",I8$=4000,o54=600000;var j4=D(()=>{t9();$p0=["#9ca3af","#ef4444","#f97316","#f59e0b","#22c55e","#3b82f6","#a855f7","#ec4899"],i54=$p0[0];j8$="Read the diff with `gh pr diff <number>`. It comes from the API, so it needs no fetch, no merge base, and is unaffected by the shallow checkout. "+"Read it ONCE \u2014 `gh pr diff <number> --name-only` first if you need to size "+"it, then pull the hunks you need per FILE. Do NOT re-run the diff sliced by directory: each slice re-reads bytes you already have into every remaining turn's context, and it is the largest avoidable cost in a review.",mK=["reviewer"],iK={reviewer:"Reviewer"},p54=["QA Agent","Code Reviewer"];ZW=["triage","todo","in_progress","in_review","approved","merged","post_deploy_validation","done","archived"],A$={intake:"triage",queue:"todo",progress:"in_progress",review:"in_review",archive:"archived"},z8$=ZW.map(($,Z)=>({key:$,title:$,position:Z})),OQ0=["approved","merged","post_deploy_validation"]});function Qp0($){return $==="trial"?"trial":"subscription"}function on($,Z,Q,X={}){ZG({event:Z,organizationId:Q.organizationId,...$.auth?.user?.id?{userId:$.auth.user.id}:{},properties:{task_id:Q.id,...X}})}function Xp0($){return $?.status==="active"||$?.status==="past_due"}function DQ0($,Z){if(Xp0($))return{periodKey:$?.currentPeriodEnd?`sub:${$.currentPeriodEnd.toISOString()}`:"sub:pending",limit:$?.monthlyTaskExecutions??Z.monthlyTaskExecutions,exhaustedReason:"monthly_exhausted"};return{periodKey:"trial",limit:$?.freeTaskExecutions??Z.freeTaskExecutions,exhaustedReason:"trial_exhausted"}}function rn(){let $=M0();return{enforced:$.taskQuotaEnforced,freeTaskExecutions:$.freeTaskExecutions,monthlyTaskExecutions:$.monthlyTaskExecutions,maxRunsPerTask:$.maxRunsPerTask}}function oO(){return{...rn(),maxRunsPerTask:Number.POSITIVE_INFINITY}}async function qg($,Z,Q=rn()){if(!Q.enforced||!sX(Z))return;let X=await $.storage.organizationBilling.taskClaim(Z.id);if(X&&X.runCount>=Q.maxRunsPerTask)throw on($,"task_quota_blocked",Z,{phase:"precheck",reason:"runs_exhausted"}),new UX("runs_exhausted");if(X&&X.state!=="released")return;let Y=await $.storage.organizationBilling.getBilling(Z.organizationId),G=DQ0(Y,Q);if(await $.storage.organizationBilling.countTaskClaims(Z.organizationId,G.periodKey)>=G.limit)throw on($,"task_quota_blocked",Z,{phase:"precheck",reason:G.exhaustedReason,billing_mode:Qp0(G.periodKey),limit:G.limit}),new UX(G.exhaustedReason)}async function k8$($,Z,Q=rn()){if(!Q.enforced||!sX(Z))return"skipped";let X=await $.storage.organizationBilling.getBilling(Z.organizationId),Y=DQ0(X,Q),G=await $.storage.organizationBilling.claimTaskUnderLimit(Z.organizationId,Z.id,Y.periodKey,Y.limit,Q.maxRunsPerTask);if(G==="exhausted")throw on($,"task_quota_blocked",Z,{phase:"claim",reason:Y.exhaustedReason,billing_mode:Qp0(Y.periodKey),limit:Y.limit}),new UX(Y.exhaustedReason);if(G==="runs_exhausted")throw on($,"task_quota_blocked",Z,{phase:"claim",reason:"runs_exhausted"}),new UX("runs_exhausted");if(G==="claimed")on($,"task_quota_claimed",Z,{billing_mode:Qp0(Y.periodKey),period_key:Y.periodKey,limit:Y.limit});return G}async function V8$($,Z,Q,X){if(X==="skipped")return;await $.rollbackTaskClaim(Z,Q,{releaseSlot:X==="claimed"}).catch((Y)=>console.error("[task-quota] rollback failed (stays charged)",Y))}async function S8$($,Z){let Q=await $.storage.organizationBilling.taskClaim(Z);return!!Q&&Q.state!=="released"}async function C8$($,Z,Q){if(await $.releaseTaskClaim(Z,Q).catch((Y)=>{return console.error("[task-quota] refund failed (stays charged)",Y),!1}))ZG({event:"task_quota_refunded",organizationId:Z,properties:{task_id:Q}})}var r54="[SUBSCRIPTION_REQUIRED]",s54,UX;var jJ=D(()=>{j4();g4();E$();s54={trial_exhausted:"this organization used its free task executions \u2014 subscribe to keep running tasks",monthly_exhausted:"this organization used its monthly task executions \u2014 more become available next billing cycle",runs_exhausted:"this task reached its execution limit \u2014 create a new task to keep going"};UX=class UX extends Error{reason;constructor($){super(`${r54} ${s54[$]}`);this.reason=$;this.name="TaskQuotaError"}}});import{z as DU}from"zod";var Yp0;var _8$=D(()=>{q0();jJ();Yp0=g({name:"ORGANIZATION_TASK_QUOTA_GET",description:"Get the organization's auto-task quota: how many runs are used in the current period, the limit, and the subscription's billing status.",annotations:{title:"Get Task Quota",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:DU.object({}),outputSchema:DU.object({enforced:DU.boolean(),billingStatus:DU.string(),subscribed:DU.boolean(),hasBillingAccount:DU.boolean(),used:DU.number(),limit:DU.number(),currentPeriodEnd:DU.string().datetime().nullable()}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=n(Z),X=rn(),Y=await Z.storage.organizationBilling.getBilling(Q.id),G=DQ0(Y,X),J=await Z.storage.organizationBilling.countTaskClaims(Q.id,G.periodKey);return{enforced:X.enforced,billingStatus:Y?.status??"none",subscribed:Xp0(Y),hasBillingAccount:!!Y?.stripeCustomerId,used:J,limit:G.limit,currentPeriodEnd:Y?.currentPeriodEnd?.toISOString()??null}}})});var v8$=D(()=>{h$$();u$$();l$$();c$$();d$$();p$$();t$$();r$$();a$$();e$$();Z8$();G8$();J8$();W8$();K8$();H8$();F8$();L8$();E8$();_8$()});function zJ($){let Z=$?.status;return typeof Z==="number"?Z:null}function f8$($){let Z=$;if(Z?.isRateLimited!==!0)return;return typeof Z.retryAfterMs==="number"?Z.retryAfterMs:null}async function aX($,Z){let Q=await $.getBranch(Z);if(Q)return Q.sha;throw new A1({provider:$.repo.provider,status:404,message:`Branch ${Z} does not exist in ${$.repo.path}`})}var x5;var wQ0=D(()=>{lZ();x5=class x5 extends Error{constructor($,Z){super($,Z);this.name="RepoWriteConflict"}}});function LQ0($){if($.length===0)return null;let Z=!1;for(let Q of $){if(Q.state!=="completed"){Z=!0;continue}if(Q.conclusion&&e54.has(Q.conclusion))return"failing"}return Z?"pending":"passing"}var e54,sn;var EQ0=D(()=>{e54=new Set(["failure","cancelled","timed_out","action_required"]);sn=class sn extends Error{existing;constructor($,Z){super($);this.name="ChangeRequestExists",this.existing=Z}}});import{z as h6}from"zod";var $94,an,Z94,Q94,X94,Y94,b8$,x8$,Gp0;var y8$=D(()=>{$94=["github","gitlab"],an=h6.enum($94),Z94=["github_app","oauth","token"],Q94=h6.enum(Z94),X94=["active","revoked"],Y94=h6.enum(X94),b8$=h6.object({provider:an,host:h6.string().min(1).describe("Provider host, e.g. github.com"),path:h6.string().min(1).describe("Full namespace path, e.g. owner/name or group/sub/project")}),x8$=h6.object({id:h6.string(),organizationId:h6.string(),type:an,host:h6.string(),authKind:Q94,externalAccountId:h6.string().describe("Provider-side account identity: installation id (GitHub App) or user/group id."),login:h6.string().describe("Display login of the account/namespace"),avatarUrl:h6.string().nullable(),installationId:h6.number().nullable().describe("GitHub App installation id; null for other auth kinds."),status:Y94,createdAt:h6.string(),updatedAt:h6.string()}),Gp0=h6.object({id:h6.string(),organizationId:h6.string(),accountId:h6.string().nullable().describe("Credential-holding account; null for anonymous public clones."),provider:an,host:h6.string(),path:h6.string(),externalId:h6.string().nullable().describe("Provider repository/project id, when known."),defaultBranch:h6.string().nullable(),webUrl:h6.string(),visibility:h6.enum(["public","private","internal"]).nullable(),createdAt:h6.string(),updatedAt:h6.string()})});function J94($){let Z=$.toLowerCase();if(Z==="github.com"||Z==="www.github.com")return"github";if(Z==="gitlab.com"||Z==="www.gitlab.com")return"gitlab";if(/(^|[.-])gitlab([.-]|$)/.test(Z))return"gitlab";return null}function h8$($){let Z=$.toLowerCase();return Z.startsWith("www.")?Z.slice(4):Z}function QW($,Z){let Q=$.trim();if(!Q)return null;let X,Y,G=/^(?:[\w.-]+@)?([\w.-]+(?::\d+)?):(?!\/\/)(.+)$/.exec(Q);if(G&&!/^[a-z][a-z0-9+.-]*:\/\//i.test(Q))X=G[1],Y=G[2];else if(/^[a-z][a-z0-9+.-]*:\/\//i.test(Q)){let F;try{F=new URL(Q)}catch{return null}if(!/^(https?|ssh|git)(\+ssh)?:$/.test(F.protocol))return null;X=F.host,Y=F.pathname}else if(Z?.provider)X=Z.host??g8$[Z.provider],Y=Q;else return null;X=h8$(X);let J=Z?.provider??J94(X);if(!J)return null;let W=Y.split("/").map((F)=>F.trim()).filter(Boolean),K=W.indexOf("-");if(K>=0)W=W.slice(0,K);if(J==="github"){let F=W.findIndex((U,N)=>N>=2&&W94.has(U));if(F>=0)W=W.slice(0,F);W=W.slice(0,2)}if(W.length<2)return null;let H=W[W.length-1];if(W[W.length-1]=H.replace(/\.git$/i,""),W.some((F)=>F.length===0||F==="."||F===".."))return null;return{provider:J,host:X,path:W.join("/")}}function XW($){return`${$.host.toLowerCase()}/${$.path.toLowerCase()}`}function Jp0($){let Z=$.path.split("/");return Z[Z.length-1]??$.path}function K94($){let Z=$.path.lastIndexOf("/");return Z<0?"":$.path.slice(0,Z)}function I7($){return{owner:K94($),name:Jp0($)}}function YW($){return`https://${$.host}/${$.path}`}function Wp0($,Z){let Q=`${$.host}/${$.path}.git`;if(!Z)return`https://${Q}`;return`https://${G94[$.provider]}:${encodeURIComponent(Z)}@${Q}`}function wU($,Z){let Q=h8$(Z);if($==="github")return Q==="github.com"?"https://api.github.com":`https://${Q}/api/v3`;return`https://${Q}/api/v4`}function LU($,Z){return{provider:"github",host:g8$.github,path:`${$}/${Z}`}}var g8$,G94,W94;var Kp0=D(()=>{g8$={github:"github.com",gitlab:"gitlab.com"},G94={github:"x-access-token",gitlab:"oauth2"};W94=new Set(["tree","blob","pull","pulls","issues","commit","commits","compare","actions","releases","settings","wiki"])});function Ig($,Z){return`${YW($)}/${H94[$.provider]}/${Z}`}function U94($){let Z=$.toLowerCase();return Z==="api.github.com"?"github.com":Z}function N94($,Z){let Q=Number($[3]);if(!Number.isSafeInteger(Q)||Q<=0)return null;let X=U94($[1]),Y=$[2],G=Z?decodeURIComponent(Y):Y;if(/^\d+$/.test(G))return null;let J=QW(`https://${X}/${G}`);if(!J)return null;return{repo:J,number:Q,url:Ig(J,Q)}}function Hp0($){let Z=$.length>u8$?$.slice(0,u8$):$;for(let{re:Q,api:X}of F94){let Y=Q.exec(Z),G=Y?N94(Y,X===!0):null;if(G)return G}return null}var H94,F94,u8$=200000;var l8$=D(()=>{Kp0();H94={github:"pull",gitlab:"-/merge_requests"};F94=[{re:/https?:\/\/([^/\s"']+)\/([^\s"']+?)\/-\/merge_requests\/(\d+)/},{re:/https?:\/\/([^/\s"']+)\/([^/\s"']+\/[^/\s"']+)\/pull\/(\d+)/},{re:/https?:\/\/([^/\s"']+)\/repos\/([^/\s"']+\/[^/\s"']+)\/pulls\/(\d+)/,api:!0},{re:/https?:\/\/([^/\s"']+)\/api\/v4\/projects\/([^/\s"']+)\/merge_requests\/(\d+)/,api:!0}]});function d8$($){return c8$[$]}function m8$($,Z){let{cli:Q,numberSigil:X}=c8$[$];return`${Q==="gh"?"PR":"MR"} ${X}${Z}`}var c8$;var i8$=D(()=>{c8$={github:{cli:"gh",changeRequest:"pull request",createCommand:"gh pr create",checkoutCommand:"gh pr checkout",numberSigil:"#"},gitlab:{cli:"glab",changeRequest:"merge request",createCommand:"glab mr create",checkoutCommand:"glab mr checkout",numberSigil:"!"}}});var y5=D(()=>{y8$();Kp0();l8$();i8$()});var nK;var Fp0=D(()=>{nK={name:"Deco Bot",email:"114028756+decobot@users.noreply.github.com"}});function p8$($){return $ instanceof Date?$.toISOString():String($)}function en($){let Z=$.installation_id===null||$.installation_id===void 0?null:Number($.installation_id);return{id:$.id,organizationId:$.organization_id,type:$.type,host:$.host,authKind:$.auth_kind,externalAccountId:$.external_account_id,login:$.login,avatarUrl:$.avatar_url,installationId:Number.isFinite(Z)?Z:null,status:$.status,credentialConnectionId:$.credential_connection_id,createdAt:p8$($.created_at),updatedAt:p8$($.updated_at)}}class Mg{db;constructor($){this.db=$}async upsert($){let Z=new Date,Q=await this.db.insertInto("git_provider_accounts").values({organization_id:$.organizationId,type:$.type,host:$.host.toLowerCase(),auth_kind:$.authKind,external_account_id:$.externalAccountId,login:$.login,avatar_url:$.avatarUrl??null,installation_id:$.installationId??null,credential_connection_id:null,status:"active",created_by:$.createdBy??null}).onConflict((X)=>X.columns(["organization_id","host","external_account_id"]).doUpdateSet({type:$.type,auth_kind:$.authKind,login:$.login,avatar_url:$.avatarUrl??null,installation_id:$.installationId??null,credential_connection_id:null,status:"active",updated_at:Z})).returningAll().executeTakeFirstOrThrow();return en(Q)}async get($,Z){let Q=await this.db.selectFrom("git_provider_accounts").selectAll().where("id","=",$).where("organization_id","=",Z).executeTakeFirst();return Q?en(Q):null}async getUnscoped($){let Z=await this.db.selectFrom("git_provider_accounts").selectAll().where("id","=",$).executeTakeFirst();return Z?en(Z):null}async listByOrg($){return(await this.db.selectFrom("git_provider_accounts").selectAll().where("organization_id","=",$).orderBy("created_at","asc").execute()).map(en)}async findByExternalId($){let Z=await this.db.selectFrom("git_provider_accounts").selectAll().where("organization_id","=",$.organizationId).where("host","=",$.host.toLowerCase()).where("external_account_id","=",$.externalAccountId).executeTakeFirst();return Z?en(Z):null}async setStatus($,Z,Q){await this.db.updateTable("git_provider_accounts").set({status:Q,updated_at:new Date}).where("id","=",$).where("organization_id","=",Z).execute()}async delete($,Z){return(await this.db.deleteFrom("git_provider_accounts").where("id","=",$).where("organization_id","=",Z).executeTakeFirst()).numDeletedRows>0n}}class $t{db;vault;constructor($,Z){this.db=$;this.vault=Z}async get($){let Z=await this.db.selectFrom("git_provider_account_credentials").selectAll().where("account_id","=",$).executeTakeFirst();if(!Z)return null;return B94(this.vault,Z)}async upsert($){let Z=new Date,Q=await this.vault.encrypt($.accessToken),X=$.refreshToken?await this.vault.encrypt($.refreshToken):null,Y=$.clientSecret?await this.vault.encrypt($.clientSecret):null;await this.db.insertInto("git_provider_account_credentials").values({account_id:$.connectionId,access_token:Q,refresh_token:X,scope:$.scope,expires_at:$.expiresAt,client_id:$.clientId,client_secret:Y,token_endpoint:$.tokenEndpoint}).onConflict((G)=>G.column("account_id").doUpdateSet({access_token:Q,refresh_token:X,scope:$.scope,expires_at:$.expiresAt,client_id:$.clientId,client_secret:Y,token_endpoint:$.tokenEndpoint,updated_at:Z})).execute()}async delete($){await this.db.deleteFrom("git_provider_account_credentials").where("account_id","=",$).execute()}isExpired($,Z=0){if(!$.expiresAt)return!1;let X=($.expiresAt instanceof Date?$.expiresAt:new Date($.expiresAt)).getTime();if(Number.isNaN(X))return!0;return X-Z<Date.now()}}async function B94($,Z){try{let Q=await $.decrypt(Z.access_token),X=Z.refresh_token?await $.decrypt(Z.refresh_token):null,Y=Z.client_secret?await $.decrypt(Z.client_secret):null;return{id:Z.account_id,connectionId:Z.account_id,accessToken:Q,refreshToken:X,scope:Z.scope,expiresAt:Z.expires_at,createdAt:Z.created_at,updatedAt:Z.updated_at,clientId:Z.client_id,clientSecret:Y,tokenEndpoint:Z.token_endpoint}}catch(Q){return console.warn("[GitProviderAccountCredential] failed to decrypt credential row",{accountId:Z.account_id,message:Q instanceof Error?Q.message:String(Q)}),null}}import{sql as O94}from"kysely";function n8$($){return $ instanceof Date?$.toISOString():String($)}function kg($){return{id:$.id,organizationId:$.organization_id,accountId:$.account_id,provider:$.provider,host:$.host,path:$.path,externalId:$.external_id,defaultBranch:$.default_branch,webUrl:$.web_url,visibility:$.visibility,legacyConnectionId:$.legacy_connection_id,createdAt:n8$($.created_at),updatedAt:n8$($.updated_at)}}function Vg($){return{provider:$.provider,host:$.host,path:$.path}}class Zt{db;constructor($){this.db=$}async upsert($){let Z=$.ref.host.toLowerCase(),Q=await this.findByRef($.organizationId,$.ref);if(Q){let Y=await this.db.updateTable("repositories").set({path:$.ref.path,provider:$.ref.provider,web_url:YW({...$.ref,host:Z}),...$.accountId!==void 0?{account_id:$.accountId}:{},...$.externalId!==void 0?{external_id:$.externalId}:{},...$.defaultBranch!==void 0?{default_branch:$.defaultBranch}:{},...$.visibility!==void 0?{visibility:$.visibility}:{},...$.legacyConnectionId!==void 0?{legacy_connection_id:$.legacyConnectionId}:{},updated_at:new Date}).where("id","=",Q.id).where("organization_id","=",$.organizationId).returningAll().executeTakeFirstOrThrow();return kg(Y)}let X=await this.db.insertInto("repositories").values({organization_id:$.organizationId,account_id:$.accountId??null,provider:$.ref.provider,host:Z,path:$.ref.path,external_id:$.externalId??null,default_branch:$.defaultBranch??null,web_url:YW({...$.ref,host:Z}),visibility:$.visibility??null,legacy_connection_id:$.legacyConnectionId??null,created_by:$.createdBy??null}).returningAll().executeTakeFirstOrThrow();return kg(X)}async get($,Z){let Q=await this.db.selectFrom("repositories").selectAll().where("id","=",$).where("organization_id","=",Z).executeTakeFirst();return Q?kg(Q):null}async getUnscoped($){let Z=await this.db.selectFrom("repositories").selectAll().where("id","=",$).executeTakeFirst();return Z?kg(Z):null}async findByRef($,Z){let Q=await this.db.selectFrom("repositories").selectAll().where("organization_id","=",$).where("host","=",Z.host.toLowerCase()).where(O94`lower(path)`,"=",Z.path.toLowerCase()).executeTakeFirst();return Q?kg(Q):null}async listByOrg($,Z){let Q=this.db.selectFrom("repositories").selectAll().where("organization_id","=",$);if(Z?.accountId)Q=Q.where("account_id","=",Z.accountId);return(await Q.orderBy("path","asc").execute()).map(kg)}async delete($,Z){try{return(await this.db.deleteFrom("repositories").where("id","=",$).where("organization_id","=",Z).executeTakeFirst()).numDeletedRows>0n}catch(Q){if(Q instanceof Error&&"constraint"in Q&&Q.constraint==="org_repo_sync_source_present")throw Error("Remove this repository's sync configurations before unlinking it");throw Q}}}var Qt=D(()=>{y5()});function o8$($){return Bun.hash($).toString(36)}function D94($){for(let[Z,Q]of rO)if(Q.expiresAt<=$)rO.delete(Z);while(rO.size>=512){let Z=rO.keys().next();if(Z.done)break;rO.delete(Z.value)}}function Np0($,Z,Q,X=Date.now()){D94(X),rO.set(o8$($),{owner:Z,expiresAt:Q})}function Sg($,Z=Date.now()){let Q=o8$($),X=rO.get(Q);if(!X)return"unknown";if(X.expiresAt<=Z)return rO.delete(Q),"unknown";return X.owner}var t8$="app",Up0="user",rO;var Cg=D(()=>{rO=new Map});function sO($=process.env){let Z=$.GITHUB_APP_ID?.trim(),Q=$.GITHUB_APP_PRIVATE_KEY?.trim(),X=$.GITHUB_APP_CLIENT_ID?.trim(),Y=$.GITHUB_APP_CLIENT_SECRET?.trim(),G=$.GITHUB_APP_SLUG?.trim();if(!Z||!Q||!X||!Y||!G)return null;return{appId:Z,privateKeyPem:Q.replace(/\\n/g,`
|
|
805
|
-
`),clientId:X,clientSecret:Y,slug:G}}function Aj($,Z){let Q=$.get(Z);if(Q===null)return null;let X=Number(Q);return Number.isFinite(X)?X:null}function w94($){return{limit:Aj($,"x-ratelimit-limit"),remaining:Aj($,"x-ratelimit-remaining"),reset:Aj($,"x-ratelimit-reset"),used:Aj($,"x-ratelimit-used"),resource:$.get("x-ratelimit-resource")}}function aO($){if($.status===429)return!0;if($.status!==403)return!1;if($.headers.get("retry-after")!==null)return!0;return Aj($.headers,"x-ratelimit-remaining")===0}function eO($,Z=Date.now()){let Q=Aj($,"retry-after");if(Q!==null)return Math.max(0,Q*1000);let X=Aj($,"x-ratelimit-reset");if(X!==null)return Math.max(0,X*1000-Z);return null}function $D($,Z){let Q=w94($),X=Q.resource??"unknown",Y={installation:Z.installation,resource:X},G={...Y,lane:Z.lane,operation:Z.operation};if(a8$??=Z$.createCounter("github_api_calls",{description:"Calls to the GitHub API, by transport and operation",unit:"{calls}"}),a8$.add(1,G),Q.remaining!==null)r8$??=Z$.createGauge("github_rate_limit_remaining",{description:"Requests (REST) or points (GraphQL) left in the window",unit:"{requests}"}),r8$.record(Q.remaining,Y);if(Q.used!==null)s8$??=Z$.createGauge("github_rate_limit_used",{description:"Requests (REST) or points (GraphQL) spent in the window",unit:"{requests}"}),s8$.record(Q.used,Y);return Q}function ZD($){e8$??=Z$.createCounter("github_rate_limited",{description:"GitHub responses refused for rate-limit reasons",unit:"{responses}"}),e8$.add(1,$)}var r8$=null,s8$=null,a8$=null,e8$=null;var Xt=D(()=>{X6()});function jQ0($){return process.env.GITHUB_API_BASE_URL??wU("github",$)}async function KG($,Z){let Q={Authorization:`Bearer ${Z.token}`,Accept:Z.accept??E94,"X-GitHub-Api-Version":L94};if(Z.body!==void 0)Q["Content-Type"]="application/json";let X;try{X=await fetch($,{method:Z.method??"GET",headers:Q,body:Z.body===void 0?void 0:JSON.stringify(Z.body),signal:AbortSignal.timeout(Z.timeoutMs??Bp0)})}catch(G){throw new A1({provider:"github",status:0,message:`GitHub ${Z.operation} failed: ${G instanceof Error?G.message:String(G)}`,cause:G})}let Y=Sg(Z.token);if($D(X.headers,{lane:"rest",operation:Z.operation,installation:Y}),aO(X)){await X.body?.cancel().catch(()=>{});let G=X.headers.get("retry-after")!==null?"secondary":"primary";ZD({lane:"rest",operation:Z.operation,installation:Y,kind:G});let J=eO(X.headers);throw new A1({provider:"github",status:X.status,retryAfterMs:J,message:`GitHub ${G} rate limit reached${J===null?"":`; retry in ${Math.ceil(J/1000)}s`}`})}return X}function Op0($){try{let Z=JSON.parse($);if(Z!==null&&typeof Z==="object"&&"message"in Z&&typeof Z.message==="string"&&Z.message.length>0)return Z.message}catch{}return $.slice(0,300)}function Dp0($,Z,Q){let X=Op0(Z);return new A1({provider:"github",status:$,message:`GitHub ${Q} failed: ${$}${X?` ${X}`:""}`})}async function NX($,Z){let Q=await $.text().catch(()=>"");return Dp0($.status,Q,Z)}async function PJ($,Z){let Q=await $.text();try{return JSON.parse(Q)}catch(X){throw new A1({provider:"github",status:$.status,message:`GitHub ${Z} returned invalid JSON: ${Q.slice(0,300)}`,cause:X})}}var L94="2022-11-28",E94="application/vnd.github+json",Bp0=15000;var _g=D(()=>{y5();Xt();Cg();lZ()});import{createPrivateKey as Z4$,sign as j94}from"crypto";function wp0($){return Buffer.from($).toString("base64url")}function R94($){let Z=wp0(JSON.stringify({alg:"RS256",typ:"JWT"})),Q=wp0(JSON.stringify({iat:$.nowSeconds-P94,exp:$.nowSeconds+Ep0,iss:$.appId})),X=`${Z}.${Q}`,Y=j94("RSA-SHA256",Buffer.from(X),Z4$($.privateKeyPem));return`${X}.${wp0(Y)}`}function q94($){let Z=yn.find((Y)=>(Y in $));if(!Z)return null;let{[Z]:Q,...X}=$;return X}function I94($,Z){let Q=(Z.repositories??[]).map((Y)=>Y.toLowerCase()).sort(),X=Object.entries(Z.permissions??{}).map(([Y,G])=>`${Y}=${G}`).sort();return`${$}|${Q.join(",")}|${X.join(",")}`}function M94($,Z){for(let[Q,X]of $)if(X.expiresAt.getTime()<=Z)$.delete(Q)}function $4$($){let Z=$.account;if(typeof $.id!=="number"||!Z||typeof Z.id!=="number"||typeof Z.login!=="string")return null;return{installationId:$.id,externalAccountId:String(Z.id),login:Z.login,avatarUrl:typeof Z.avatar_url==="string"?Z.avatar_url:null,accountType:typeof Z.type==="string"?Z.type:"User"}}function k94($){if(!$||typeof $!=="object"||Array.isArray($))return null;let Z={};for(let[Q,X]of Object.entries($))if(typeof X==="string")Z[Q]=X;return Z}class Q4${appId;privateKeyPem;apiBaseUrl;jwt=null;cache=new Map;inFlight=new Map;constructor($,Z){this.appId=$.appId,this.privateKeyPem=$.privateKeyPem,this.apiBaseUrl=(Z?.apiBaseUrl??z94).replace(/\/+$/,"")}appJwt(){let $=Math.floor(Date.now()/1000);if(this.jwt&&this.jwt.exp-$>A94)return this.jwt.value;let Z=R94({appId:this.appId,privateKeyPem:this.privateKeyPem,nowSeconds:$});return this.jwt={value:Z,exp:$+Ep0},Np0(Z,t8$,($+Ep0)*1000),Z}installationToken($,Z={}){let Q=I94($,Z),X=Z.bufferMs??T94;if(!Z.forceRefresh){let J=this.cache.get(Q);if(J&&J.expiresAt.getTime()-Date.now()>X)return Promise.resolve(J)}let Y=this.inFlight.get(Q);if(Y)return Y;let G=this.mint($,Z).then((J)=>{return this.cache.set(Q,J),Np0(J.token,String($),J.expiresAt.getTime()),M94(this.cache,Date.now()),J}).finally(()=>{this.inFlight.delete(Q)});return this.inFlight.set(Q,G),G}async mint($,Z){let X=`${this.apiBaseUrl}/app/installations/${$}/access_tokens`,Y=Z.repositories&&Z.repositories.length>0?Z.repositories:void 0,G=Z.permissions?{...Z.permissions}:void 0;for(;;){let J=await KG(X,{method:"POST",token:this.appJwt(),body:{...Y&&{repositories:Y},...G&&{permissions:G}},operation:"installation_access_token"});if(J.ok){let W=await PJ(J,"installation_access_token");if(typeof W.token!=="string"||typeof W.expires_at!=="string")throw new A1({provider:"github",status:J.status,message:"GitHub installation_access_token returned no token"});return{token:W.token,expiresAt:new Date(W.expires_at),permissions:k94(W.permissions)??G??{}}}if(J.status===422&&G){let W=await J.text().catch(()=>""),K=q94(G);if(K&&Ji0(Op0(W))){G=K;continue}throw Dp0(J.status,W,"installation_access_token")}throw await NX(J,"installation_access_token")}}async getInstallation($){let Q=await KG(`${this.apiBaseUrl}/app/installations/${$}`,{token:this.appJwt(),operation:"get_installation"});if(Q.status===404)return null;if(!Q.ok)throw await NX(Q,"get_installation");let X=$4$(await PJ(Q,"get_installation"));if(!X)throw new A1({provider:"github",status:Q.status,message:"GitHub get_installation returned an installation without a user or organization account"});return X}async listUserInstallations($){let X=[];for(let Y=1;;Y++){let G=await KG(`${this.apiBaseUrl}/user/installations?per_page=100&page=${Y}`,{token:$,operation:"list_user_installations"});if(!G.ok)throw await NX(G,"list_user_installations");let J=await PJ(G,"list_user_installations"),W=Array.isArray(J.installations)?J.installations:[];for(let K of W){let H=$4$(K);if(H)X.push(H)}if(W.length<100)return X}}}function vg(){if(Lp0===void 0){let $=sO();Lp0=$&&V94($)?new Q4$($):null}return Lp0}function V94($){try{return Z4$($.privateKeyPem),!0}catch(Z){return console.error("[git-providers] GITHUB_APP_PRIVATE_KEY is not a usable private key \u2014 "+"the GitHub App stays disabled and orgs keep their existing connections. Check that newlines survived the secret store.",Z),!1}}function X4$(){let $=sO()!==null&&vg()!==null;return{configured:$,hosts:$?[S94]:[]}}var z94="https://api.github.com",P94=60,Ep0=540,A94=60,T94=300000,Lp0,S94="github.com";var zQ0=D(()=>{tX();Cg();lZ();_g()});function b94($){return $==="public"||$==="private"||$==="internal"}function G4$($,Z){let Q="public";if($.private)Q="private";else if($.visibility&&b94($.visibility))Q=$.visibility;return{ref:{provider:"github",host:Z,path:$.full_name},externalId:String($.id),defaultBranch:$.default_branch??null,webUrl:$.html_url,visibility:Q,description:$.description??null,updatedAt:$.pushed_at??$.updated_at??null}}function x94($,Z){let Q=Z?.trim().toLowerCase();if(!Q)return!0;return $.toLowerCase().includes(Q)}function y94($){return{name:$.name||$.login,email:$.email||`${$.login}@users.noreply.github.com`}}function g94($){return $.split("/").filter(Boolean).map(encodeURIComponent).join("/")}function h94($,Z){let{owner:Q,name:X}=I7($),Y=`/repos/${encodeURIComponent(Q)}/${encodeURIComponent(X)}/tarball`;return Z?`${Y}/${encodeURIComponent(Z)}`:Y}class fg{kind="github";host;apiBaseUrl;options;constructor($){this.options=$,this.host=$.host.toLowerCase(),this.apiBaseUrl=wU("github",$.host)}async tokenForRepo($,Z={}){let Q=this.options;if("appAuth"in Q){let X=await Q.appAuth.installationToken(Q.installationId,{repositories:[Jp0($)],permissions:XQ0,bufferMs:Z.bufferMs,forceRefresh:Z.forceRefresh});return{token:X.token,kind:"installation",expiresAt:X.expiresAt}}return this.sourceToken(Q.tokenSource,Z)}async accountToken($={}){let Z=this.options;if("appAuth"in Z){let Q=await Z.appAuth.installationToken(Z.installationId,{permissions:C94,bufferMs:$.bufferMs,forceRefresh:$.forceRefresh});return{token:Q.token,kind:"installation",expiresAt:Q.expiresAt}}return this.sourceToken(Z.tokenSource,$)}async sourceToken($,Z){let Q=await $.get(Z);if(!Q)throw new A1({provider:"github",status:401,message:`No usable GitHub token for ${this.host}; reconnect the account`});return Q}async getRepo($){let{owner:Q,name:X}=I7($),Y=await this.request(`/repos/${encodeURIComponent(Q)}/${encodeURIComponent(X)}`,{operation:"get_repo"});if(Y.status===404)return null;if(!Y.ok)throw await NX(Y,"get_repo");return G4$(await PJ(Y,"get_repo"),this.host)}async listRepos($={}){let Z=Math.max(1,Math.floor($.page??1)),Q=Math.min(v94,Math.max(1,Math.floor($.perPage??_94))),X=`per_page=${Q}&page=${Z}`,Y;if("appAuth"in this.options){let J=await this.request(`/installation/repositories?${X}`,{operation:"list_installation_repositories"});if(!J.ok)throw await NX(J,"list_installation_repositories");let W=await PJ(J,"list_installation_repositories");Y=Array.isArray(W.repositories)?W.repositories:[]}else{let J=await this.request(`/user/repos?affiliation=owner,collaborator,organization_member&sort=pushed&${X}`,{operation:"list_user_repositories"});if(!J.ok)throw await NX(J,"list_user_repositories");let W=await PJ(J,"list_user_repositories");Y=Array.isArray(W)?W:[]}return{repositories:Y.filter((G)=>x94(G.full_name,$.query)).map((G)=>G4$(G,this.host)),hasMore:Y.length===Q}}async readFile($,Z,Q){let{owner:Y,name:G}=I7($),J=Q?`?ref=${encodeURIComponent(Q)}`:"",W=await this.request(`/repos/${encodeURIComponent(Y)}/${encodeURIComponent(G)}/contents/${g94(Z)}${J}`,{operation:"read_file",accept:f94});if(W.status===404)return null;if(!W.ok)throw await NX(W,"read_file");return W.text()}async archiveTarball($,Z){let X=`${this.apiBaseUrl}${h94($,Z)}`,Y=await this.tokenForRepo($),G=await KG(X,{operation:"archive_tarball",token:Y.token,timeoutMs:Y4$});if(G.status===401){await G.body?.cancel().catch(()=>{});let J=await this.tokenForRepo($,{forceRefresh:!0});G=await KG(X,{operation:"archive_tarball",token:J.token,timeoutMs:Y4$})}if(G.status===404)return null;if(!G.ok)throw await NX(G,"archive_tarball");return G.body}async identity(){if("appAuth"in this.options)return null;let $="get_user",Z=await this.request("/user",{operation:$});if(!Z.ok)throw await NX(Z,$);return y94(await PJ(Z,$))}async request($,Z){let Q=`${this.apiBaseUrl}${$}`,X=await this.accountToken(),Y=await KG(Q,{...Z,token:X.token});if(Y.status!==401)return Y;let G=await this.accountToken({forceRefresh:!0});return KG(Q,{...Z,token:G.token})}}var C94,_94=30,v94=100,f94="application/vnd.github.raw+json",Y4$=60000;var jp0=D(()=>{y5();tX();lZ();_g();C94={metadata:"read",contents:"read"}});function PQ0($){return wU("gitlab",$)}function l94($){let Z=(Q)=>{if(typeof Q==="string")return Q.length>0?[Q]:[];if(Array.isArray(Q))return Q.flatMap(Z);if(Q!==null&&typeof Q==="object")return Object.values(Q).flatMap(Z);return[]};try{let Q=JSON.parse($);if(Q!==null&&typeof Q==="object"){let X=Q,Y=[...Z(X.message),...Z(X.error),...Z(X.error_description)];if(Y.length>0)return Y.join("; ")}}catch{}return $.slice(0,300)}async function GW($){let Z=await $.text().catch(()=>""),Q=Z?l94(Z):$.statusText;return new A1({provider:"gitlab",status:$.status,message:`GitLab API ${$.status}: ${Q}`,retryAfterMs:$.status===429?J4$($.headers):null})}async function Yt($,Z){let Q=await $.text();try{return JSON.parse(Q)}catch(X){throw new A1({provider:"gitlab",status:$.status,message:`GitLab ${Z} returned invalid JSON: ${Q.slice(0,300)}`,cause:X})}}async function QD($,Z,Q={}){let X={Authorization:`Bearer ${Z}`,Accept:Q.accept??"application/json"};if(Q.body!==void 0)X["Content-Type"]="application/json";try{return await fetch($,{method:Q.method??"GET",headers:X,body:Q.body===void 0?void 0:JSON.stringify(Q.body),signal:AbortSignal.timeout(Q.timeoutMs??u94)})}catch(Y){throw new A1({provider:"gitlab",status:0,message:`GitLab request failed: ${Y instanceof Error?Y.message:String(Y)}`,cause:Y})}}var u94=15000;var AQ0=D(()=>{y5();lZ();Tj()});import{z as BQ}from"zod";function Rj($){return encodeURIComponent($)}function Gt($){return encodeURIComponent($.replace(/^\/+/,""))}function i94($,Z){let Q=`/projects/${Rj($.path)}/repository/archive.tar.gz`;return Z?`${Q}?sha=${encodeURIComponent(Z)}`:Q}function J4$($,Z=Date.now()){let Q=$.get("retry-after");if(Q!==null){let Y=Number(Q);if(Number.isFinite(Y))return Math.max(0,Y*1000);let G=Date.parse(Q);if(Number.isFinite(G))return Math.max(0,G-Z)}let X=$.get("ratelimit-reset");if(X!==null){let Y=Number(X);if(Number.isFinite(Y))return Math.max(0,Y*1000-Z)}return null}function W4$($,Z){let Q=p94.parse($),X={provider:"gitlab",host:Z,path:Q.path_with_namespace};return{ref:X,externalId:String(Q.id),defaultBranch:Q.default_branch??null,webUrl:Q.web_url??YW(X),visibility:Q.visibility,description:Q.description??null,updatedAt:Q.last_activity_at??null}}async function n94($,Z,Q={}){let X=await QD($,Z,Q);if(X.status===404)return await X.body?.cancel().catch(()=>{}),null;if(!X.ok)throw await GW(X);return X}async function t94($,Z){let Q=await n94(`${wU("gitlab",$)}/user`,Z);if(!Q)throw new A1({provider:"gitlab",status:404,message:"GitLab did not recognise the authenticated user"});return K4$.parse(await Yt(Q,"get_user"))}async function TQ0($,Z){let Q=await t94($,Z);return{externalAccountId:String(Q.id),login:Q.username,avatarUrl:Q.avatar_url??null}}class Jt{kind="gitlab";host;apiBase;tokenSource;constructor($){this.host=$.host,this.apiBase=wU("gitlab",$.host),this.tokenSource=$.tokenSource}async tokenForRepo($,Z){return this.accountToken(Z)}async accountToken($){let Z=await this.tokenSource.get($);if(!Z)throw new A1({provider:"gitlab",status:401,message:"GitLab account is not authenticated"});return Z}async getRepo($){let Z=await this.get(`/projects/${Rj($.path)}`);if(!Z)return null;return W4$(await Yt(Z,"get_repo"),this.host)}async listRepos($={}){let Z=new URLSearchParams({membership:"true",simple:"true",order_by:"id",sort:"desc",per_page:String(Math.min(m94,Math.max(1,$.perPage??d94))),page:String(Math.max(1,$.page??1))}),Q=$.query?.trim();if(Q)Z.set("search",Q);let X=await this.get(`/projects?${Z}`);if(!X)return{repositories:[],hasMore:!1};let Y=await Yt(X,"list_repos");if(!Array.isArray(Y))throw new A1({provider:"gitlab",status:502,message:"GitLab /projects returned a non-array payload"});return{repositories:Y.map((G)=>W4$(G,this.host)),hasMore:Y.length===Number(Z.get("per_page"))}}async readFile($,Z,Q){let X=Q;if(!X){let G=await this.getRepo($);if(!G?.defaultBranch)return null;X=G.defaultBranch}let Y=await this.get(`/projects/${Rj($.path)}/repository/files/${Gt(Z)}/raw?ref=${encodeURIComponent(X)}`,{accept:"text/plain, */*"});if(!Y)return null;return Y.text()}async archiveTarball($,Z){let Q=await this.authedFetch(`${this.apiBase}${i94($,Z)}`,{accept:"application/octet-stream, */*",timeoutMs:c94});if(Q.status===404)return await Q.body?.cancel().catch(()=>{}),null;if(!Q.ok)throw await GW(Q);return Q.body}async identity(){let $=await this.authedFetch(`${this.apiBase}/user`);if(!$.ok)throw await GW($);let Z=K4$.parse(await Yt($,"identity"));return{name:Z.name||Z.username,email:Z.commit_email||Z.public_email||Z.email||`${Z.username}@users.noreply.${this.host}`}}async get($,Z){let Q=await this.authedFetch(`${this.apiBase}${$}`,Z);if(Q.status===404)return await Q.body?.cancel().catch(()=>{}),null;if(!Q.ok)throw await GW(Q);return Q}async authedFetch($,Z={}){let Q=await this.accountToken(),X=await QD($,Q.token,Z);if(X.status!==401)return X;await X.body?.cancel().catch(()=>{});let Y=await this.accountToken({forceRefresh:!0});return QD($,Y.token,Z)}}var c94=60000,d94=30,m94=100,p94,K4$;var Tj=D(()=>{y5();lZ();AQ0();p94=BQ.object({id:BQ.number(),path_with_namespace:BQ.string().min(1),default_branch:BQ.string().nullish(),web_url:BQ.string().nullish(),visibility:BQ.enum(["public","private","internal"]),description:BQ.string().nullish(),last_activity_at:BQ.string().nullish()});K4$=BQ.object({id:BQ.number(),username:BQ.string().min(1),name:BQ.string().nullish(),avatar_url:BQ.string().nullish(),email:BQ.string().nullish(),public_email:BQ.string().nullish(),commit_email:BQ.string().nullish()})});function H4$($,Z,Q){return{kind:Q,async get(X){let Y=X?.forceRefresh?await $.get(Z):null,G=await HG({connectionId:Z,tokenStorage:$,bufferMs:X?.bufferMs,force:X?.forceRefresh===!0&&Y!==null&&XD(Y)});if(!G.accessToken)return null;return{token:G.accessToken,kind:Q,expiresAt:null}}}}function zp0($){return $==="token"?"token":"oauth"}function Wt($){if($.status!=="active")return!1;if($.type==="github"&&$.authKind==="github_app")return vg()!==null&&$.installationId!==null;return!0}function qj($,Z){let Q=new $t($.db,$.vault);switch(Z.type){case"github":{if(Z.authKind==="github_app"){let X=vg();if(!X||Z.installationId===null)throw new A1({provider:"github",status:503,message:"GitHub App credentials are not configured on this deployment"});return new fg({host:Z.host,installationId:Z.installationId,appAuth:X})}return new fg({host:Z.host,tokenSource:H4$(Q,Z.id,zp0(Z.authKind))})}case"gitlab":return new Jt({host:Z.host,tokenSource:H4$(Q,Z.id,zp0(Z.authKind))})}}function o94($){if($.authKind==="github_app")return"installation";return zp0($.authKind)}function RQ0($,Z,Q="installation"){return{ref:$,tokenSource:{kind:Q,get:()=>Promise.resolve({token:Z,kind:Q,expiresAt:null})}}}async function Pp0($,Z){let Q=Vg(Z);if(!Z.accountId)throw new A1({provider:Z.provider,status:401,message:`${Z.path} is linked without an account; link it again to read and write it`});let X=await new Mg($.db).getUnscoped(Z.accountId);if(!X||X.organizationId!==Z.organizationId)throw new A1({provider:Z.provider,status:404,message:`The account backing ${Z.path} no longer exists. Link the repository again.`});let Y=qj($,X),G=o94(X);return{ref:Q,tokenSource:{kind:G,get:(J)=>Y.tokenForRepo(Q,J)}}}async function tK($,Z,Q){let X=Vg(Z);if(!Z.accountId)return r94(X);let Y=await new Mg($.db).getUnscoped(Z.accountId);if(!Y||Y.organizationId!==Z.organizationId)throw new A1({provider:Z.provider,status:404,message:`The account backing ${Z.path} no longer exists. Link the repository again.`});let G=qj($,Y),J=await G.tokenForRepo(X,Q),W=J.kind==="installation"?null:await G.identity().catch(()=>null);return{cloneUrl:Wp0(X,J.token),gitUserName:W?.name??nK.name,gitUserEmail:W?.email??nK.email}}function r94($){return{cloneUrl:Wp0($),gitUserName:nK.name,gitUserEmail:nK.email}}async function Ap0($,Z,Q){let X=Q.repositoryId?await $.repositories.get(Q.repositoryId,Z):Q.ref?await $.repositories.findByRef(Z,Q.ref):null,Y=X?Vg(X):Q.ref??null;if(!Y)return null;return{ref:Y,repository:X,servable:X?await EU($,X):!1}}async function EU($,Z){if(!Z.accountId)return!1;let Q=await $.gitProviderAccounts.getUnscoped(Z.accountId);return Q!==null&&Wt(Q)}var qQ0=D(()=>{y5();LJ();Fp0();Qt();zQ0();jp0();Tj();lZ()});async function s94($,Z){let Q=$.organization?.id;if(!Q)throw Error(wZ);if(!Z.sourceConnectionId)throw Error(wZ);let X=await $.storage.connections.findById(Z.sourceConnectionId,Q);if(!X)throw Error(wZ);let{clientFromConnection:Y}=await Promise.resolve().then(() => (jn(),B4$)),G=await Y(X,$,!0);try{let{result:J}=await I$$((H)=>G.callTool({name:"MINT_REPO_TOKEN",arguments:{installationId:Z.installationId,owner:Z.owner,repo:Z.repo,permissions:H}}),q$$(Z.permissions)),W=J.structuredContent?.token;if(J.isError||!W)throw Error(wZ);let K=J.structuredContent?.expiresAt;return{accessToken:W,expiresAt:K?new Date(K):null}}finally{await G.close().catch(()=>{})}}function a94($,Z){return($?.getTime()??0)>Z?$:new Date(Z+N4$)}async function e94($,Z,Q,X){let Y=Date.now(),G=await s94($,Q),J=a94(G.expiresAt,Y);try{await X.upsert({connectionId:Z,accessToken:G.accessToken,refreshToken:null,scope:null,expiresAt:J,clientId:null,clientSecret:null,tokenEndpoint:null})}catch(W){console.warn("[GithubMint] failed to persist minted token",{connectionId:Z,message:W instanceof Error?W.message:String(W)})}return G.accessToken}async function Kt($,Z,Q){let X=t5(Z);if(!X)throw Error("Connection is not repo-scoped");if(!X.sourceConnectionId)throw Error(wZ);let Y=new z5($.db,$.vault),G=await Y.get(Z.id);if(!Q?.forceRefresh&&G&&!Y.isExpired(G,Ft))return G.accessToken;let J=Tp0.get(Z.id);if(J)return J;let W=e94($,Z.id,X,Y).finally(()=>{Tp0.delete(Z.id)});return Tp0.set(Z.id,W),W}function F4$($){return $.slug==="mcp-github"}async function U4$($,Z,Q){if(t5(Z)?.sourceConnectionId)return Kt($,Z,Q);return(await HG({connectionId:Z.id,connectionUrl:Z.connection_url,tokenStorage:new z5($.db,$.vault),force:Q?.forceRefresh})).accessToken}var Tp0;var Ht=D(()=>{LJ();tX();s3();Tp0=new Map});function $Z4(){return process.env.GITHUB_GRAPHQL_URL??"https://api.github.com/graphql"}function QZ4($){return $>=500&&$<600}function XZ4($){return $ instanceof g9?$.cause:$}function YZ4($,Z){try{return JSON.parse($)}catch(Q){throw Error(`GitHub GraphQL ${Z} returned invalid JSON: ${$.slice(0,300)}`,{cause:Q})}}function GZ4($,Z){let Q=$.errors?.[0]?.message;if(Q)throw Error(`GitHub GraphQL ${Z} failed: ${Q}`);if($.data==null)throw Error(`GitHub GraphQL ${Z} returned no data`);return $.data}async function IQ0($){let Z=await $.getToken();if(!Z)throw Error($.missingTokenMessage);let Q=(W)=>fetch($Z4(),{method:"POST",headers:{Authorization:`Bearer ${W}`,Accept:"application/vnd.github+json","Content-Type":"application/json"},body:JSON.stringify({query:$.query,variables:$.variables}),signal:AbortSignal.timeout(ZZ4)}),X=async(W)=>{try{return await N4(async()=>{let K=await Q(W);if(QZ4(K.status)){let H=K.status;throw await K.body?.cancel().catch(()=>{}),Error(`GitHub GraphQL transient error: ${H}`)}return K},{maxAttempts:3,minTimeout:300,maxTimeout:3000,jitter:1})}catch(K){throw XZ4(K)}},Y=await X(Z),G=Z;if(Y.status===401){try{await Y.body?.cancel()}catch{}let W=await $.getToken(!0);if(!W)throw Error($.missingTokenMessage);if(Y=await X(W),G=W,Y.status===401)throw Error($.missingTokenMessage)}let J=Sg(G);if($D(Y.headers,{lane:"graphql",operation:$.operation,installation:J}),aO(Y)){let W=Y.headers.get("retry-after")!==null?"secondary":"primary";ZD({lane:"graphql",operation:$.operation,installation:J,kind:W});let K=eO(Y.headers);throw Error(`GitHub ${W} rate limit reached${K===null?"":`; retry in ${Math.ceil(K/1000)}s`}`)}if(!Y.ok)throw Error(`GitHub GraphQL ${$.label} failed: ${Y.status}`);return GZ4(YZ4(await Y.text(),$.label),$.label)}var ZZ4=15000;var Rp0=D(()=>{f8();Xt();Cg()});function KZ4($){if(!$)return null;if($.state!=="open")return!1;if(typeof $.mergeable==="boolean")return!$.mergeable;let Z=$.mergeable_state;if(typeof Z!=="string"||Z===""||Z==="unknown")return null;return Z==="dirty"}function HZ4($){if($==="clean")return"passing";if($==="unstable")return"failing";return null}function qp0($){let Z=$.merged===!0||typeof $.merged_at==="string";return{number:$.number??0,url:$.html_url??"",title:$.title??"",body:$.body??"",state:Z?"merged":$.state==="closed"?"closed":"open",draft:$.draft===!0,mergedAt:$.merged_at??null,updatedAt:$.updated_at??null,base:$.base?.ref??"main",head:$.head?.ref??"",headSha:$.head?.sha??"",headRepoPath:$.head?.repo?.full_name??null,author:$.user?.login??"",conflicting:KZ4($),checks:HZ4($.mergeable_state),changedFiles:typeof $.changed_files==="number"?$.changed_files:null}}function FZ4($){if($==="IN_PROGRESS")return"running";if($==="COMPLETED")return"completed";return"queued"}function UZ4($){switch($){case"SUCCESS":return"success";case"FAILURE":case"STARTUP_FAILURE":return"failure";case"NEUTRAL":case"STALE":return"neutral";case"CANCELLED":return"cancelled";case"SKIPPED":return"skipped";case"TIMED_OUT":return"timed_out";case"ACTION_REQUIRED":return"action_required";default:return null}}function DZ4($){let Z=$.state;return{id:null,name:$.context??"",state:Z==="PENDING"||Z==="EXPECTED"?"running":"completed",conclusion:Z==="SUCCESS"?"success":Z==="FAILURE"||Z==="ERROR"?"failure":Z==="PENDING"||Z==="EXPECTED"?null:"neutral",url:$.targetUrl??null,durationMs:null,summary:$.description??null}}function wZ4($){let Z=$.commits?.nodes?.[0]?.commit?.statusCheckRollup?.contexts?.nodes??[],Q=[];for(let X of Z){if(!X)continue;if(X.__typename==="StatusContext"){Q.push(DZ4(X));continue}if(X.__typename!=="CheckRun")continue;let{startedAt:Y,completedAt:G}=X;Q.push({id:X.databaseId==null?null:String(X.databaseId),name:X.name??"",state:FZ4(X.status),conclusion:UZ4(X.conclusion),url:X.detailsUrl??null,durationMs:Y&&G?new Date(G).getTime()-new Date(Y).getTime():null,summary:X.summary??null})}return Q}function LZ4($,Z){let Q=($.reviewThreads?.nodes??[]).filter((K)=>K?.isResolved===!1).length,X=$.reviewDecision,Y=X==="REVIEW_REQUIRED"||X==="CHANGES_REQUESTED",G=wZ4($),J=$.number??0,W=$.merged===!0;return{number:J,url:$.url??Ig(Z,J),title:$.title??"",body:$.body??"",state:W?"merged":$.state==="OPEN"?"open":"closed",draft:$.isDraft===!0,mergedAt:$.mergedAt??null,updatedAt:$.updatedAt??null,base:$.baseRefName??"main",head:$.headRefName??"",headSha:$.headRefOid??"",headRepoPath:$.headRepository?.nameWithOwner??null,author:$.author?.login??"",conflicting:$.state!=="OPEN"?!1:$.mergeable==="CONFLICTING"?!0:$.mergeable==="MERGEABLE"?!1:null,checks:LQ0(G),changedFiles:$.changedFiles??null,checkRuns:G,comments:($.comments?.nodes??[]).flatMap((K)=>K?[{id:String(K.databaseId??0),author:K.author?.login??"",body:K.body??"",createdAt:K.createdAt??"",updatedAt:K.updatedAt??K.createdAt??"",url:K.url??""}]:[]),unresolvedConversations:Q,reviewBlocked:Y}}function EZ4($){let Z=null,Q=-1/0;for(let X of $??[]){if(!X?.mergedAt)continue;let Y=Date.parse(X.mergedAt);if(Number.isNaN(Y)||Y<=Q)continue;Z=X,Q=Y}return Z}function O4$($){return/not allowed on this repository/i.test($)}class Ip0{repo;tokenSource;apiBaseUrl;owner;name;constructor($){this.repo=$.repo,this.tokenSource=$.tokenSource,this.apiBaseUrl=jQ0($.repo.host);let{owner:Z,name:Q}=I7($.repo);this.owner=Z,this.name=Q}async token($){return(await this.tokenSource.get($?{forceRefresh:!0}:void 0))?.token??null}async requireToken(){let $=await this.token();if($)return $;throw new A1({provider:"github",status:401,message:`No usable GitHub token for ${this.repo.path}; reconnect the account`})}get base(){return`${this.apiBaseUrl}/repos/${this.owner}/${this.name}`}async rest($,Z){let Q=await KG(`${this.base}${$}`,{method:Z.method,body:Z.body,token:await this.requireToken(),operation:Z.operation});if(Q.status===404)return await Q.body?.cancel().catch(()=>{}),null;if(!Q.ok)throw await NX(Q,Z.operation);if(Q.status===204)return null;return PJ(Q,Z.operation)}graphql($){return IQ0({getToken:(Z)=>this.token(Z),missingTokenMessage:`No usable GitHub token for ${this.repo.path}; reconnect the account`,...$})}async read($){let Z=await this.rest(`/pulls/${$}`,{operation:"change_request_read"});return Z?qp0(Z):null}async readForBranch($){return await this.readDetailed({branch:$})}async readDetailed($){let Z="number"in $,X=(await this.graphql({query:Z?BZ4:NZ4,variables:Z?{owner:this.owner,repo:this.name,number:$.number}:{owner:this.owner,repo:this.name,branch:$.branch},label:`change request for ${this.repo.path}`,operation:"change_request_detail"})).repository;if(!X)throw new A1({provider:"github",status:404,message:`${this.repo.path} is not accessible with this credential`});let Y=Z?X.pullRequest:X.pullRequests?.nodes?.[0];return Y?LZ4(Y,this.repo):null}async listOpen($){return(await this.rest(`/pulls?state=open&sort=updated&direction=desc&per_page=${Math.min($,100)}`,{operation:"change_request_list"})??[]).map(qp0)}async lastMergedInto($){let Z=await this.graphql({query:OZ4,variables:{owner:this.owner,repo:this.name,base:$},label:`last merged into ${$} on ${this.repo.path}`,operation:"change_request_last_merged"});if(!Z.repository)throw new A1({provider:"github",status:404,message:`${this.repo.path} is not accessible with this credential`});let Q=EZ4(Z.repository.pullRequests?.nodes);if(!Q)return null;let X=Q.number??0;return{number:X,url:Q.url??Ig(this.repo,X),title:Q.title??"",body:Q.body??"",state:"merged",draft:!1,mergedAt:Q.mergedAt??null,updatedAt:Q.mergedAt??null,base:Q.baseRefName??$,head:Q.headRefName??"",headSha:Q.headRefOid??"",headRepoPath:null,author:Q.author?.login??"",conflicting:!1,checks:null,changedFiles:null}}async open($){let Z=await KG(`${this.base}/pulls`,{method:"POST",token:await this.requireToken(),operation:"change_request_open",body:{title:$.title,body:$.body||void 0,head:$.head,base:$.base}});if(Z.ok)return qp0(await PJ(Z,"change_request_open"));let Q=await NX(Z,"change_request_open");if(/already exists|pull request already/i.test(Q.message))throw new sn(Q.message,await this.readForBranch($.head).catch(()=>null));throw Q}async describe($,Z){await this.rest(`/pulls/${$}`,{method:"PATCH",body:{body:Z},operation:"change_request_describe"})}async merge($,Z={}){let Q=JZ4[Z.strategy??"any"],X="";for(let Y of Q){let G=await this.attemptMerge($,Y,Z);if(G.merged)return G;if(G.reason==="blocked"&&O4$(G.detail)){X=G.detail;continue}return G}return{merged:!1,reason:"blocked",detail:X}}async attemptMerge($,Z,Q){let X;try{X=await KG(`${this.base}/pulls/${$}/merge`,{method:"PUT",token:await this.requireToken(),operation:"change_request_merge",body:{merge_method:Z,...Q.commitTitle?{commit_title:Q.commitTitle}:{},...Q.commitMessage?{commit_message:Q.commitMessage}:{}}})}catch(J){return{merged:!1,...jZ4(J)}}if(X.ok)return await X.body?.cancel().catch(()=>{}),{merged:!0};let Y=await NX(X,"change_request_merge");if(X.status===404)return{merged:!1,reason:"not_found",detail:Y.message};if(O4$(Y.message))return{merged:!1,reason:"blocked",detail:Y.message};return{merged:!1,reason:await this.read($).then((J)=>J?.conflicting??null).catch(()=>null)===!0?"conflict":"blocked",detail:Y.message}}async readCheckLog($){let Z=await this.rest(`/check-runs/${encodeURIComponent($)}`,{operation:"change_request_check_log"});return Z?.output?.summary??Z?.output?.text??null}async readDeployedUrl($){let Z=await this.rest(`/deployments?sha=${encodeURIComponent($)}&per_page=${WZ4}`,{operation:"change_request_deployments"});for(let Q of Z??[]){if(typeof Q.id!=="number")continue;let Y=(await this.rest(`/deployments/${Q.id}/statuses?per_page=10`,{operation:"change_request_deployment_statuses"})??[]).find((G)=>G.state==="success"&&typeof G.environment_url==="string"&&G.environment_url.length>0);if(Y?.environment_url)return Y.environment_url}return null}}function jZ4($){let Z=$ instanceof Error?$.message:String($);if($ instanceof A1&&$.isRateLimited)return{reason:"rate_limited",detail:Z};return{reason:"error",detail:Z}}var JZ4,WZ4=3,D4$=`
|
|
805
|
+
`),clientId:X,clientSecret:Y,slug:G}}function Aj($,Z){let Q=$.get(Z);if(Q===null)return null;let X=Number(Q);return Number.isFinite(X)?X:null}function w94($){return{limit:Aj($,"x-ratelimit-limit"),remaining:Aj($,"x-ratelimit-remaining"),reset:Aj($,"x-ratelimit-reset"),used:Aj($,"x-ratelimit-used"),resource:$.get("x-ratelimit-resource")}}function aO($){if($.status===429)return!0;if($.status!==403)return!1;if($.headers.get("retry-after")!==null)return!0;return Aj($.headers,"x-ratelimit-remaining")===0}function eO($,Z=Date.now()){let Q=Aj($,"retry-after");if(Q!==null)return Math.max(0,Q*1000);let X=Aj($,"x-ratelimit-reset");if(X!==null)return Math.max(0,X*1000-Z);return null}function $D($,Z){let Q=w94($),X=Q.resource??"unknown",Y={installation:Z.installation,resource:X},G={...Y,lane:Z.lane,operation:Z.operation};if(a8$??=Z$.createCounter("github_api_calls",{description:"Calls to the GitHub API, by transport and operation",unit:"{calls}"}),a8$.add(1,G),Q.remaining!==null)r8$??=Z$.createGauge("github_rate_limit_remaining",{description:"Requests (REST) or points (GraphQL) left in the window",unit:"{requests}"}),r8$.record(Q.remaining,Y);if(Q.used!==null)s8$??=Z$.createGauge("github_rate_limit_used",{description:"Requests (REST) or points (GraphQL) spent in the window",unit:"{requests}"}),s8$.record(Q.used,Y);return Q}function ZD($){e8$??=Z$.createCounter("github_rate_limited",{description:"GitHub responses refused for rate-limit reasons",unit:"{responses}"}),e8$.add(1,$)}var r8$=null,s8$=null,a8$=null,e8$=null;var Xt=D(()=>{X6()});function jQ0($){return process.env.GITHUB_API_BASE_URL??wU("github",$)}async function KG($,Z){let Q={Authorization:`Bearer ${Z.token}`,Accept:Z.accept??E94,"X-GitHub-Api-Version":L94};if(Z.body!==void 0)Q["Content-Type"]="application/json";let X;try{X=await fetch($,{method:Z.method??"GET",headers:Q,body:Z.body===void 0?void 0:JSON.stringify(Z.body),signal:AbortSignal.timeout(Z.timeoutMs??Bp0)})}catch(G){throw new A1({provider:"github",status:0,message:`GitHub ${Z.operation} failed: ${G instanceof Error?G.message:String(G)}`,cause:G})}let Y=Sg(Z.token);if($D(X.headers,{lane:"rest",operation:Z.operation,installation:Y}),aO(X)){await X.body?.cancel().catch(()=>{});let G=X.headers.get("retry-after")!==null?"secondary":"primary";ZD({lane:"rest",operation:Z.operation,installation:Y,kind:G});let J=eO(X.headers);throw new A1({provider:"github",status:X.status,retryAfterMs:J,message:`GitHub ${G} rate limit reached${J===null?"":`; retry in ${Math.ceil(J/1000)}s`}`})}return X}function Op0($){try{let Z=JSON.parse($);if(Z!==null&&typeof Z==="object"&&"message"in Z&&typeof Z.message==="string"&&Z.message.length>0)return Z.message}catch{}return $.slice(0,300)}function Dp0($,Z,Q){let X=Op0(Z);return new A1({provider:"github",status:$,message:`GitHub ${Q} failed: ${$}${X?` ${X}`:""}`})}async function NX($,Z){let Q=await $.text().catch(()=>"");return Dp0($.status,Q,Z)}async function PJ($,Z){let Q=await $.text();try{return JSON.parse(Q)}catch(X){throw new A1({provider:"github",status:$.status,message:`GitHub ${Z} returned invalid JSON: ${Q.slice(0,300)}`,cause:X})}}var L94="2022-11-28",E94="application/vnd.github+json",Bp0=15000;var _g=D(()=>{y5();Xt();Cg();lZ()});import{createPrivateKey as Z4$,sign as j94}from"crypto";function wp0($){return Buffer.from($).toString("base64url")}function R94($){let Z=wp0(JSON.stringify({alg:"RS256",typ:"JWT"})),Q=wp0(JSON.stringify({iat:$.nowSeconds-P94,exp:$.nowSeconds+Ep0,iss:$.appId})),X=`${Z}.${Q}`,Y=j94("RSA-SHA256",Buffer.from(X),Z4$($.privateKeyPem));return`${X}.${wp0(Y)}`}function q94($){let Z=yn.find((Y)=>(Y in $));if(!Z)return null;let{[Z]:Q,...X}=$;return X}function I94($,Z){let Q=(Z.repositories??[]).map((Y)=>Y.toLowerCase()).sort(),X=Object.entries(Z.permissions??{}).map(([Y,G])=>`${Y}=${G}`).sort();return`${$}|${Q.join(",")}|${X.join(",")}`}function M94($,Z){for(let[Q,X]of $)if(X.expiresAt.getTime()<=Z)$.delete(Q)}function $4$($){let Z=$.account;if(typeof $.id!=="number"||!Z||typeof Z.id!=="number"||typeof Z.login!=="string")return null;return{installationId:$.id,externalAccountId:String(Z.id),login:Z.login,avatarUrl:typeof Z.avatar_url==="string"?Z.avatar_url:null,accountType:typeof Z.type==="string"?Z.type:"User"}}function k94($){if(!$||typeof $!=="object"||Array.isArray($))return null;let Z={};for(let[Q,X]of Object.entries($))if(typeof X==="string")Z[Q]=X;return Z}class Q4${appId;privateKeyPem;apiBaseUrl;jwt=null;cache=new Map;inFlight=new Map;constructor($,Z){this.appId=$.appId,this.privateKeyPem=$.privateKeyPem,this.apiBaseUrl=(Z?.apiBaseUrl??z94).replace(/\/+$/,"")}appJwt(){let $=Math.floor(Date.now()/1000);if(this.jwt&&this.jwt.exp-$>A94)return this.jwt.value;let Z=R94({appId:this.appId,privateKeyPem:this.privateKeyPem,nowSeconds:$});return this.jwt={value:Z,exp:$+Ep0},Np0(Z,t8$,($+Ep0)*1000),Z}installationToken($,Z={}){let Q=I94($,Z),X=Z.bufferMs??T94;if(!Z.forceRefresh){let J=this.cache.get(Q);if(J&&J.expiresAt.getTime()-Date.now()>X)return Promise.resolve(J)}let Y=this.inFlight.get(Q);if(Y)return Y;let G=this.mint($,Z).then((J)=>{return this.cache.set(Q,J),Np0(J.token,String($),J.expiresAt.getTime()),M94(this.cache,Date.now()),J}).finally(()=>{this.inFlight.delete(Q)});return this.inFlight.set(Q,G),G}async mint($,Z){let X=`${this.apiBaseUrl}/app/installations/${$}/access_tokens`,Y=Z.repositories&&Z.repositories.length>0?Z.repositories:void 0,G=Z.permissions?{...Z.permissions}:void 0;for(;;){let J=await KG(X,{method:"POST",token:this.appJwt(),body:{...Y&&{repositories:Y},...G&&{permissions:G}},operation:"installation_access_token"});if(J.ok){let W=await PJ(J,"installation_access_token");if(typeof W.token!=="string"||typeof W.expires_at!=="string")throw new A1({provider:"github",status:J.status,message:"GitHub installation_access_token returned no token"});return{token:W.token,expiresAt:new Date(W.expires_at),permissions:k94(W.permissions)??G??{}}}if(J.status===422&&G){let W=await J.text().catch(()=>""),K=q94(G);if(K&&Ji0(Op0(W))){G=K;continue}throw Dp0(J.status,W,"installation_access_token")}throw await NX(J,"installation_access_token")}}async getInstallation($){let Q=await KG(`${this.apiBaseUrl}/app/installations/${$}`,{token:this.appJwt(),operation:"get_installation"});if(Q.status===404)return null;if(!Q.ok)throw await NX(Q,"get_installation");let X=$4$(await PJ(Q,"get_installation"));if(!X)throw new A1({provider:"github",status:Q.status,message:"GitHub get_installation returned an installation without a user or organization account"});return X}async listUserInstallations($){let X=[];for(let Y=1;;Y++){let G=await KG(`${this.apiBaseUrl}/user/installations?per_page=100&page=${Y}`,{token:$,operation:"list_user_installations"});if(!G.ok)throw await NX(G,"list_user_installations");let J=await PJ(G,"list_user_installations"),W=Array.isArray(J.installations)?J.installations:[];for(let K of W){let H=$4$(K);if(H)X.push(H)}if(W.length<100)return X}}}function vg(){if(Lp0===void 0){let $=sO();Lp0=$&&V94($)?new Q4$($):null}return Lp0}function V94($){try{return Z4$($.privateKeyPem),!0}catch(Z){return console.error("[git-providers] GITHUB_APP_PRIVATE_KEY is not a usable private key \u2014 "+"the GitHub App stays disabled and orgs keep their existing connections. Check that newlines survived the secret store.",Z),!1}}function X4$(){let $=sO()!==null&&vg()!==null;return{configured:$,hosts:$?[S94]:[]}}var z94="https://api.github.com",P94=60,Ep0=540,A94=60,T94=300000,Lp0,S94="github.com";var zQ0=D(()=>{tX();Cg();lZ();_g()});function b94($){return $==="public"||$==="private"||$==="internal"}function G4$($,Z){let Q="public";if($.private)Q="private";else if($.visibility&&b94($.visibility))Q=$.visibility;return{ref:{provider:"github",host:Z,path:$.full_name},externalId:String($.id),defaultBranch:$.default_branch??null,webUrl:$.html_url,visibility:Q,description:$.description??null,updatedAt:$.pushed_at??$.updated_at??null}}function x94($,Z){let Q=Z?.trim().toLowerCase();if(!Q)return!0;return $.toLowerCase().includes(Q)}function y94($){return{name:$.name||$.login,email:$.email||`${$.login}@users.noreply.github.com`}}function g94($){return $.split("/").filter(Boolean).map(encodeURIComponent).join("/")}function h94($,Z){let{owner:Q,name:X}=I7($),Y=`/repos/${encodeURIComponent(Q)}/${encodeURIComponent(X)}/tarball`;return Z?`${Y}/${encodeURIComponent(Z)}`:Y}class fg{kind="github";host;apiBaseUrl;options;constructor($){this.options=$,this.host=$.host.toLowerCase(),this.apiBaseUrl=wU("github",$.host)}async tokenForRepo($,Z={}){let Q=this.options;if("appAuth"in Q){let X=await Q.appAuth.installationToken(Q.installationId,{repositories:[Jp0($)],permissions:XQ0,bufferMs:Z.bufferMs,forceRefresh:Z.forceRefresh});return{token:X.token,kind:"installation",expiresAt:X.expiresAt}}return this.sourceToken(Q.tokenSource,Z)}async accountToken($={}){let Z=this.options;if("appAuth"in Z){let Q=await Z.appAuth.installationToken(Z.installationId,{permissions:C94,bufferMs:$.bufferMs,forceRefresh:$.forceRefresh});return{token:Q.token,kind:"installation",expiresAt:Q.expiresAt}}return this.sourceToken(Z.tokenSource,$)}async sourceToken($,Z){let Q=await $.get(Z);if(!Q)throw new A1({provider:"github",status:401,message:`No usable GitHub token for ${this.host}; reconnect the account`});return Q}async getRepo($){let{owner:Q,name:X}=I7($),Y=await this.request(`/repos/${encodeURIComponent(Q)}/${encodeURIComponent(X)}`,{operation:"get_repo"});if(Y.status===404)return await Y.body?.cancel().catch(()=>{}),null;if(!Y.ok)throw await NX(Y,"get_repo");return G4$(await PJ(Y,"get_repo"),this.host)}async listRepos($={}){let Z=Math.max(1,Math.floor($.page??1)),Q=Math.min(v94,Math.max(1,Math.floor($.perPage??_94))),X=`per_page=${Q}&page=${Z}`,Y;if("appAuth"in this.options){let J=await this.request(`/installation/repositories?${X}`,{operation:"list_installation_repositories"});if(!J.ok)throw await NX(J,"list_installation_repositories");let W=await PJ(J,"list_installation_repositories");Y=Array.isArray(W.repositories)?W.repositories:[]}else{let J=await this.request(`/user/repos?affiliation=owner,collaborator,organization_member&sort=pushed&${X}`,{operation:"list_user_repositories"});if(!J.ok)throw await NX(J,"list_user_repositories");let W=await PJ(J,"list_user_repositories");Y=Array.isArray(W)?W:[]}return{repositories:Y.filter((G)=>x94(G.full_name,$.query)).map((G)=>G4$(G,this.host)),hasMore:Y.length===Q}}async readFile($,Z,Q){let{owner:Y,name:G}=I7($),J=Q?`?ref=${encodeURIComponent(Q)}`:"",W=await this.request(`/repos/${encodeURIComponent(Y)}/${encodeURIComponent(G)}/contents/${g94(Z)}${J}`,{operation:"read_file",accept:f94});if(W.status===404)return await W.body?.cancel().catch(()=>{}),null;if(!W.ok)throw await NX(W,"read_file");return W.text()}async archiveTarball($,Z){let X=`${this.apiBaseUrl}${h94($,Z)}`,Y=await this.tokenForRepo($),G=await KG(X,{operation:"archive_tarball",token:Y.token,timeoutMs:Y4$});if(G.status===401){await G.body?.cancel().catch(()=>{});let J=await this.tokenForRepo($,{forceRefresh:!0});G=await KG(X,{operation:"archive_tarball",token:J.token,timeoutMs:Y4$})}if(G.status===404)return await G.body?.cancel().catch(()=>{}),null;if(!G.ok)throw await NX(G,"archive_tarball");return G.body}async identity(){if("appAuth"in this.options)return null;let $="get_user",Z=await this.request("/user",{operation:$});if(!Z.ok)throw await NX(Z,$);return y94(await PJ(Z,$))}async request($,Z){let Q=`${this.apiBaseUrl}${$}`,X=await this.accountToken(),Y=await KG(Q,{...Z,token:X.token});if(Y.status!==401)return Y;await Y.body?.cancel().catch(()=>{});let G=await this.accountToken({forceRefresh:!0});return KG(Q,{...Z,token:G.token})}}var C94,_94=30,v94=100,f94="application/vnd.github.raw+json",Y4$=60000;var jp0=D(()=>{y5();tX();lZ();_g();C94={metadata:"read",contents:"read"}});function PQ0($){return wU("gitlab",$)}function l94($){let Z=(Q)=>{if(typeof Q==="string")return Q.length>0?[Q]:[];if(Array.isArray(Q))return Q.flatMap(Z);if(Q!==null&&typeof Q==="object")return Object.values(Q).flatMap(Z);return[]};try{let Q=JSON.parse($);if(Q!==null&&typeof Q==="object"){let X=Q,Y=[...Z(X.message),...Z(X.error),...Z(X.error_description)];if(Y.length>0)return Y.join("; ")}}catch{}return $.slice(0,300)}async function GW($){let Z=await $.text().catch(()=>""),Q=Z?l94(Z):$.statusText;return new A1({provider:"gitlab",status:$.status,message:`GitLab API ${$.status}: ${Q}`,retryAfterMs:$.status===429?J4$($.headers):null})}async function Yt($,Z){let Q=await $.text();try{return JSON.parse(Q)}catch(X){throw new A1({provider:"gitlab",status:$.status,message:`GitLab ${Z} returned invalid JSON: ${Q.slice(0,300)}`,cause:X})}}async function QD($,Z,Q={}){let X={Authorization:`Bearer ${Z}`,Accept:Q.accept??"application/json"};if(Q.body!==void 0)X["Content-Type"]="application/json";try{return await fetch($,{method:Q.method??"GET",headers:X,body:Q.body===void 0?void 0:JSON.stringify(Q.body),signal:AbortSignal.timeout(Q.timeoutMs??u94)})}catch(Y){throw new A1({provider:"gitlab",status:0,message:`GitLab request failed: ${Y instanceof Error?Y.message:String(Y)}`,cause:Y})}}var u94=15000;var AQ0=D(()=>{y5();lZ();Tj()});import{z as BQ}from"zod";function Rj($){return encodeURIComponent($)}function Gt($){return encodeURIComponent($.replace(/^\/+/,""))}function i94($,Z){let Q=`/projects/${Rj($.path)}/repository/archive.tar.gz`;return Z?`${Q}?sha=${encodeURIComponent(Z)}`:Q}function J4$($,Z=Date.now()){let Q=$.get("retry-after");if(Q!==null){let Y=Number(Q);if(Number.isFinite(Y))return Math.max(0,Y*1000);let G=Date.parse(Q);if(Number.isFinite(G))return Math.max(0,G-Z)}let X=$.get("ratelimit-reset");if(X!==null){let Y=Number(X);if(Number.isFinite(Y))return Math.max(0,Y*1000-Z)}return null}function W4$($,Z){let Q=p94.parse($),X={provider:"gitlab",host:Z,path:Q.path_with_namespace};return{ref:X,externalId:String(Q.id),defaultBranch:Q.default_branch??null,webUrl:Q.web_url??YW(X),visibility:Q.visibility,description:Q.description??null,updatedAt:Q.last_activity_at??null}}async function n94($,Z,Q={}){let X=await QD($,Z,Q);if(X.status===404)return await X.body?.cancel().catch(()=>{}),null;if(!X.ok)throw await GW(X);return X}async function t94($,Z){let Q=await n94(`${wU("gitlab",$)}/user`,Z);if(!Q)throw new A1({provider:"gitlab",status:404,message:"GitLab did not recognise the authenticated user"});return K4$.parse(await Yt(Q,"get_user"))}async function TQ0($,Z){let Q=await t94($,Z);return{externalAccountId:String(Q.id),login:Q.username,avatarUrl:Q.avatar_url??null}}class Jt{kind="gitlab";host;apiBase;tokenSource;constructor($){this.host=$.host,this.apiBase=wU("gitlab",$.host),this.tokenSource=$.tokenSource}async tokenForRepo($,Z){return this.accountToken(Z)}async accountToken($){let Z=await this.tokenSource.get($);if(!Z)throw new A1({provider:"gitlab",status:401,message:"GitLab account is not authenticated"});return Z}async getRepo($){let Z=await this.get(`/projects/${Rj($.path)}`);if(!Z)return null;return W4$(await Yt(Z,"get_repo"),this.host)}async listRepos($={}){let Z=new URLSearchParams({membership:"true",simple:"true",order_by:"id",sort:"desc",per_page:String(Math.min(m94,Math.max(1,$.perPage??d94))),page:String(Math.max(1,$.page??1))}),Q=$.query?.trim();if(Q)Z.set("search",Q);let X=await this.get(`/projects?${Z}`);if(!X)return{repositories:[],hasMore:!1};let Y=await Yt(X,"list_repos");if(!Array.isArray(Y))throw new A1({provider:"gitlab",status:502,message:"GitLab /projects returned a non-array payload"});return{repositories:Y.map((G)=>W4$(G,this.host)),hasMore:Y.length===Number(Z.get("per_page"))}}async readFile($,Z,Q){let X=Q;if(!X){let G=await this.getRepo($);if(!G?.defaultBranch)return null;X=G.defaultBranch}let Y=await this.get(`/projects/${Rj($.path)}/repository/files/${Gt(Z)}/raw?ref=${encodeURIComponent(X)}`,{accept:"text/plain, */*"});if(!Y)return null;return Y.text()}async archiveTarball($,Z){let Q=await this.authedFetch(`${this.apiBase}${i94($,Z)}`,{accept:"application/octet-stream, */*",timeoutMs:c94});if(Q.status===404)return await Q.body?.cancel().catch(()=>{}),null;if(!Q.ok)throw await GW(Q);return Q.body}async identity(){let $=await this.authedFetch(`${this.apiBase}/user`);if(!$.ok)throw await GW($);let Z=K4$.parse(await Yt($,"identity"));return{name:Z.name||Z.username,email:Z.commit_email||Z.public_email||Z.email||`${Z.username}@users.noreply.${this.host}`}}async get($,Z){let Q=await this.authedFetch(`${this.apiBase}${$}`,Z);if(Q.status===404)return await Q.body?.cancel().catch(()=>{}),null;if(!Q.ok)throw await GW(Q);return Q}async authedFetch($,Z={}){let Q=await this.accountToken(),X=await QD($,Q.token,Z);if(X.status!==401)return X;await X.body?.cancel().catch(()=>{});let Y=await this.accountToken({forceRefresh:!0});return QD($,Y.token,Z)}}var c94=60000,d94=30,m94=100,p94,K4$;var Tj=D(()=>{y5();lZ();AQ0();p94=BQ.object({id:BQ.number(),path_with_namespace:BQ.string().min(1),default_branch:BQ.string().nullish(),web_url:BQ.string().nullish(),visibility:BQ.enum(["public","private","internal"]),description:BQ.string().nullish(),last_activity_at:BQ.string().nullish()});K4$=BQ.object({id:BQ.number(),username:BQ.string().min(1),name:BQ.string().nullish(),avatar_url:BQ.string().nullish(),email:BQ.string().nullish(),public_email:BQ.string().nullish(),commit_email:BQ.string().nullish()})});function H4$($,Z,Q){return{kind:Q,async get(X){let Y=X?.forceRefresh?await $.get(Z):null,G=await HG({connectionId:Z,tokenStorage:$,bufferMs:X?.bufferMs,force:X?.forceRefresh===!0&&Y!==null&&XD(Y)});if(!G.accessToken)return null;return{token:G.accessToken,kind:Q,expiresAt:null}}}}function zp0($){return $==="token"?"token":"oauth"}function Wt($){if($.status!=="active")return!1;if($.type==="github"&&$.authKind==="github_app")return vg()!==null&&$.installationId!==null;return!0}function qj($,Z){let Q=new $t($.db,$.vault);switch(Z.type){case"github":{if(Z.authKind==="github_app"){let X=vg();if(!X||Z.installationId===null)throw new A1({provider:"github",status:503,message:"GitHub App credentials are not configured on this deployment"});return new fg({host:Z.host,installationId:Z.installationId,appAuth:X})}return new fg({host:Z.host,tokenSource:H4$(Q,Z.id,zp0(Z.authKind))})}case"gitlab":return new Jt({host:Z.host,tokenSource:H4$(Q,Z.id,zp0(Z.authKind))})}}function o94($){if($.authKind==="github_app")return"installation";return zp0($.authKind)}function RQ0($,Z,Q="installation"){return{ref:$,tokenSource:{kind:Q,get:()=>Promise.resolve({token:Z,kind:Q,expiresAt:null})}}}async function Pp0($,Z){let Q=Vg(Z);if(!Z.accountId)throw new A1({provider:Z.provider,status:401,message:`${Z.path} is linked without an account; link it again to read and write it`});let X=await new Mg($.db).getUnscoped(Z.accountId);if(!X||X.organizationId!==Z.organizationId)throw new A1({provider:Z.provider,status:404,message:`The account backing ${Z.path} no longer exists. Link the repository again.`});let Y=qj($,X),G=o94(X);return{ref:Q,tokenSource:{kind:G,get:(J)=>Y.tokenForRepo(Q,J)}}}async function tK($,Z,Q){let X=Vg(Z);if(!Z.accountId)return r94(X);let Y=await new Mg($.db).getUnscoped(Z.accountId);if(!Y||Y.organizationId!==Z.organizationId)throw new A1({provider:Z.provider,status:404,message:`The account backing ${Z.path} no longer exists. Link the repository again.`});let G=qj($,Y),J=await G.tokenForRepo(X,Q),W=J.kind==="installation"?null:await G.identity().catch(()=>null);return{cloneUrl:Wp0(X,J.token),gitUserName:W?.name??nK.name,gitUserEmail:W?.email??nK.email}}function r94($){return{cloneUrl:Wp0($),gitUserName:nK.name,gitUserEmail:nK.email}}async function Ap0($,Z,Q){let X=Q.repositoryId?await $.repositories.get(Q.repositoryId,Z):Q.ref?await $.repositories.findByRef(Z,Q.ref):null,Y=X?Vg(X):Q.ref??null;if(!Y)return null;return{ref:Y,repository:X,servable:X?await EU($,X):!1}}async function EU($,Z){if(!Z.accountId)return!1;let Q=await $.gitProviderAccounts.getUnscoped(Z.accountId);return Q!==null&&Wt(Q)}var qQ0=D(()=>{y5();LJ();Fp0();Qt();zQ0();jp0();Tj();lZ()});async function s94($,Z){let Q=$.organization?.id;if(!Q)throw Error(wZ);if(!Z.sourceConnectionId)throw Error(wZ);let X=await $.storage.connections.findById(Z.sourceConnectionId,Q);if(!X)throw Error(wZ);let{clientFromConnection:Y}=await Promise.resolve().then(() => (jn(),B4$)),G=await Y(X,$,!0);try{let{result:J}=await I$$((H)=>G.callTool({name:"MINT_REPO_TOKEN",arguments:{installationId:Z.installationId,owner:Z.owner,repo:Z.repo,permissions:H}}),q$$(Z.permissions)),W=J.structuredContent?.token;if(J.isError||!W)throw Error(wZ);let K=J.structuredContent?.expiresAt;return{accessToken:W,expiresAt:K?new Date(K):null}}finally{await G.close().catch(()=>{})}}function a94($,Z){return($?.getTime()??0)>Z?$:new Date(Z+N4$)}async function e94($,Z,Q,X){let Y=Date.now(),G=await s94($,Q),J=a94(G.expiresAt,Y);try{await X.upsert({connectionId:Z,accessToken:G.accessToken,refreshToken:null,scope:null,expiresAt:J,clientId:null,clientSecret:null,tokenEndpoint:null})}catch(W){console.warn("[GithubMint] failed to persist minted token",{connectionId:Z,message:W instanceof Error?W.message:String(W)})}return G.accessToken}async function Kt($,Z,Q){let X=t5(Z);if(!X)throw Error("Connection is not repo-scoped");if(!X.sourceConnectionId)throw Error(wZ);let Y=new z5($.db,$.vault),G=await Y.get(Z.id);if(!Q?.forceRefresh&&G&&!Y.isExpired(G,Ft))return G.accessToken;let J=Tp0.get(Z.id);if(J)return J;let W=e94($,Z.id,X,Y).finally(()=>{Tp0.delete(Z.id)});return Tp0.set(Z.id,W),W}function F4$($){return $.slug==="mcp-github"}async function U4$($,Z,Q){if(t5(Z)?.sourceConnectionId)return Kt($,Z,Q);return(await HG({connectionId:Z.id,connectionUrl:Z.connection_url,tokenStorage:new z5($.db,$.vault),force:Q?.forceRefresh})).accessToken}var Tp0;var Ht=D(()=>{LJ();tX();s3();Tp0=new Map});function $Z4(){return process.env.GITHUB_GRAPHQL_URL??"https://api.github.com/graphql"}function QZ4($){return $>=500&&$<600}function XZ4($){return $ instanceof g9?$.cause:$}function YZ4($,Z){try{return JSON.parse($)}catch(Q){throw Error(`GitHub GraphQL ${Z} returned invalid JSON: ${$.slice(0,300)}`,{cause:Q})}}function GZ4($,Z){let Q=$.errors?.[0]?.message;if(Q)throw Error(`GitHub GraphQL ${Z} failed: ${Q}`);if($.data==null)throw Error(`GitHub GraphQL ${Z} returned no data`);return $.data}async function IQ0($){let Z=await $.getToken();if(!Z)throw Error($.missingTokenMessage);let Q=(W)=>fetch($Z4(),{method:"POST",headers:{Authorization:`Bearer ${W}`,Accept:"application/vnd.github+json","Content-Type":"application/json"},body:JSON.stringify({query:$.query,variables:$.variables}),signal:AbortSignal.timeout(ZZ4)}),X=async(W)=>{try{return await N4(async()=>{let K=await Q(W);if(QZ4(K.status)){let H=K.status;throw await K.body?.cancel().catch(()=>{}),Error(`GitHub GraphQL transient error: ${H}`)}return K},{maxAttempts:3,minTimeout:300,maxTimeout:3000,jitter:1})}catch(K){throw XZ4(K)}},Y=await X(Z),G=Z;if(Y.status===401){try{await Y.body?.cancel()}catch{}let W=await $.getToken(!0);if(!W)throw Error($.missingTokenMessage);if(Y=await X(W),G=W,Y.status===401)throw Error($.missingTokenMessage)}let J=Sg(G);if($D(Y.headers,{lane:"graphql",operation:$.operation,installation:J}),aO(Y)){let W=Y.headers.get("retry-after")!==null?"secondary":"primary";ZD({lane:"graphql",operation:$.operation,installation:J,kind:W});let K=eO(Y.headers);throw Error(`GitHub ${W} rate limit reached${K===null?"":`; retry in ${Math.ceil(K/1000)}s`}`)}if(!Y.ok)throw Error(`GitHub GraphQL ${$.label} failed: ${Y.status}`);return GZ4(YZ4(await Y.text(),$.label),$.label)}var ZZ4=15000;var Rp0=D(()=>{f8();Xt();Cg()});function KZ4($){if(!$)return null;if($.state!=="open")return!1;if(typeof $.mergeable==="boolean")return!$.mergeable;let Z=$.mergeable_state;if(typeof Z!=="string"||Z===""||Z==="unknown")return null;return Z==="dirty"}function HZ4($){if($==="clean")return"passing";if($==="unstable")return"failing";return null}function qp0($){let Z=$.merged===!0||typeof $.merged_at==="string";return{number:$.number??0,url:$.html_url??"",title:$.title??"",body:$.body??"",state:Z?"merged":$.state==="closed"?"closed":"open",draft:$.draft===!0,mergedAt:$.merged_at??null,updatedAt:$.updated_at??null,base:$.base?.ref??"main",head:$.head?.ref??"",headSha:$.head?.sha??"",headRepoPath:$.head?.repo?.full_name??null,author:$.user?.login??"",conflicting:KZ4($),checks:HZ4($.mergeable_state),changedFiles:typeof $.changed_files==="number"?$.changed_files:null}}function FZ4($){if($==="IN_PROGRESS")return"running";if($==="COMPLETED")return"completed";return"queued"}function UZ4($){switch($){case"SUCCESS":return"success";case"FAILURE":case"STARTUP_FAILURE":return"failure";case"NEUTRAL":case"STALE":return"neutral";case"CANCELLED":return"cancelled";case"SKIPPED":return"skipped";case"TIMED_OUT":return"timed_out";case"ACTION_REQUIRED":return"action_required";default:return null}}function DZ4($){let Z=$.state;return{id:null,name:$.context??"",state:Z==="PENDING"||Z==="EXPECTED"?"running":"completed",conclusion:Z==="SUCCESS"?"success":Z==="FAILURE"||Z==="ERROR"?"failure":Z==="PENDING"||Z==="EXPECTED"?null:"neutral",url:$.targetUrl??null,durationMs:null,summary:$.description??null}}function wZ4($){let Z=$.commits?.nodes?.[0]?.commit?.statusCheckRollup?.contexts?.nodes??[],Q=[];for(let X of Z){if(!X)continue;if(X.__typename==="StatusContext"){Q.push(DZ4(X));continue}if(X.__typename!=="CheckRun")continue;let{startedAt:Y,completedAt:G}=X;Q.push({id:X.databaseId==null?null:String(X.databaseId),name:X.name??"",state:FZ4(X.status),conclusion:UZ4(X.conclusion),url:X.detailsUrl??null,durationMs:Y&&G?new Date(G).getTime()-new Date(Y).getTime():null,summary:X.summary??null})}return Q}function LZ4($,Z){let Q=($.reviewThreads?.nodes??[]).filter((K)=>K?.isResolved===!1).length,X=$.reviewDecision,Y=X==="REVIEW_REQUIRED"||X==="CHANGES_REQUESTED",G=wZ4($),J=$.number??0,W=$.merged===!0;return{number:J,url:$.url??Ig(Z,J),title:$.title??"",body:$.body??"",state:W?"merged":$.state==="OPEN"?"open":"closed",draft:$.isDraft===!0,mergedAt:$.mergedAt??null,updatedAt:$.updatedAt??null,base:$.baseRefName??"main",head:$.headRefName??"",headSha:$.headRefOid??"",headRepoPath:$.headRepository?.nameWithOwner??null,author:$.author?.login??"",conflicting:$.state!=="OPEN"?!1:$.mergeable==="CONFLICTING"?!0:$.mergeable==="MERGEABLE"?!1:null,checks:LQ0(G),changedFiles:$.changedFiles??null,checkRuns:G,comments:($.comments?.nodes??[]).flatMap((K)=>K?[{id:String(K.databaseId??0),author:K.author?.login??"",body:K.body??"",createdAt:K.createdAt??"",updatedAt:K.updatedAt??K.createdAt??"",url:K.url??""}]:[]),unresolvedConversations:Q,reviewBlocked:Y}}function EZ4($){let Z=null,Q=-1/0;for(let X of $??[]){if(!X?.mergedAt)continue;let Y=Date.parse(X.mergedAt);if(Number.isNaN(Y)||Y<=Q)continue;Z=X,Q=Y}return Z}function O4$($){return/not allowed on this repository/i.test($)}class Ip0{repo;tokenSource;apiBaseUrl;owner;name;constructor($){this.repo=$.repo,this.tokenSource=$.tokenSource,this.apiBaseUrl=jQ0($.repo.host);let{owner:Z,name:Q}=I7($.repo);this.owner=Z,this.name=Q}async token($){return(await this.tokenSource.get($?{forceRefresh:!0}:void 0))?.token??null}async requireToken(){let $=await this.token();if($)return $;throw new A1({provider:"github",status:401,message:`No usable GitHub token for ${this.repo.path}; reconnect the account`})}get base(){return`${this.apiBaseUrl}/repos/${this.owner}/${this.name}`}async rest($,Z){let Q=await KG(`${this.base}${$}`,{method:Z.method,body:Z.body,token:await this.requireToken(),operation:Z.operation});if(Q.status===404)return await Q.body?.cancel().catch(()=>{}),null;if(!Q.ok)throw await NX(Q,Z.operation);if(Q.status===204)return null;return PJ(Q,Z.operation)}graphql($){return IQ0({getToken:(Z)=>this.token(Z),missingTokenMessage:`No usable GitHub token for ${this.repo.path}; reconnect the account`,...$})}async read($){let Z=await this.rest(`/pulls/${$}`,{operation:"change_request_read"});return Z?qp0(Z):null}async readForBranch($){return await this.readDetailed({branch:$})}async readDetailed($){let Z="number"in $,X=(await this.graphql({query:Z?BZ4:NZ4,variables:Z?{owner:this.owner,repo:this.name,number:$.number}:{owner:this.owner,repo:this.name,branch:$.branch},label:`change request for ${this.repo.path}`,operation:"change_request_detail"})).repository;if(!X)throw new A1({provider:"github",status:404,message:`${this.repo.path} is not accessible with this credential`});let Y=Z?X.pullRequest:X.pullRequests?.nodes?.[0];return Y?LZ4(Y,this.repo):null}async listOpen($){return(await this.rest(`/pulls?state=open&sort=updated&direction=desc&per_page=${Math.min($,100)}`,{operation:"change_request_list"})??[]).map(qp0)}async lastMergedInto($){let Z=await this.graphql({query:OZ4,variables:{owner:this.owner,repo:this.name,base:$},label:`last merged into ${$} on ${this.repo.path}`,operation:"change_request_last_merged"});if(!Z.repository)throw new A1({provider:"github",status:404,message:`${this.repo.path} is not accessible with this credential`});let Q=EZ4(Z.repository.pullRequests?.nodes);if(!Q)return null;let X=Q.number??0;return{number:X,url:Q.url??Ig(this.repo,X),title:Q.title??"",body:Q.body??"",state:"merged",draft:!1,mergedAt:Q.mergedAt??null,updatedAt:Q.mergedAt??null,base:Q.baseRefName??$,head:Q.headRefName??"",headSha:Q.headRefOid??"",headRepoPath:null,author:Q.author?.login??"",conflicting:!1,checks:null,changedFiles:null}}async open($){let Z=await KG(`${this.base}/pulls`,{method:"POST",token:await this.requireToken(),operation:"change_request_open",body:{title:$.title,body:$.body||void 0,head:$.head,base:$.base}});if(Z.ok)return qp0(await PJ(Z,"change_request_open"));let Q=await NX(Z,"change_request_open");if(/already exists|pull request already/i.test(Q.message))throw new sn(Q.message,await this.readForBranch($.head).catch(()=>null));throw Q}async describe($,Z){await this.rest(`/pulls/${$}`,{method:"PATCH",body:{body:Z},operation:"change_request_describe"})}async merge($,Z={}){let Q=JZ4[Z.strategy??"any"],X="";for(let Y of Q){let G=await this.attemptMerge($,Y,Z);if(G.merged)return G;if(G.reason==="blocked"&&O4$(G.detail)){X=G.detail;continue}return G}return{merged:!1,reason:"blocked",detail:X}}async attemptMerge($,Z,Q){let X;try{X=await KG(`${this.base}/pulls/${$}/merge`,{method:"PUT",token:await this.requireToken(),operation:"change_request_merge",body:{merge_method:Z,...Q.commitTitle?{commit_title:Q.commitTitle}:{},...Q.commitMessage?{commit_message:Q.commitMessage}:{}}})}catch(J){return{merged:!1,...jZ4(J)}}if(X.ok)return await X.body?.cancel().catch(()=>{}),{merged:!0};let Y=await NX(X,"change_request_merge");if(X.status===404)return{merged:!1,reason:"not_found",detail:Y.message};if(O4$(Y.message))return{merged:!1,reason:"blocked",detail:Y.message};return{merged:!1,reason:await this.read($).then((J)=>J?.conflicting??null).catch(()=>null)===!0?"conflict":"blocked",detail:Y.message}}async readCheckLog($){let Z=await this.rest(`/check-runs/${encodeURIComponent($)}`,{operation:"change_request_check_log"});return Z?.output?.summary??Z?.output?.text??null}async readDeployedUrl($){let Z=await this.rest(`/deployments?sha=${encodeURIComponent($)}&per_page=${WZ4}`,{operation:"change_request_deployments"});for(let Q of Z??[]){if(typeof Q.id!=="number")continue;let Y=(await this.rest(`/deployments/${Q.id}/statuses?per_page=10`,{operation:"change_request_deployment_statuses"})??[]).find((G)=>G.state==="success"&&typeof G.environment_url==="string"&&G.environment_url.length>0);if(Y?.environment_url)return Y.environment_url}return null}}function jZ4($){let Z=$ instanceof Error?$.message:String($);if($ instanceof A1&&$.isRateLimited)return{reason:"rate_limited",detail:Z};return{reason:"error",detail:Z}}var JZ4,WZ4=3,D4$=`
|
|
806
806
|
fragment CrDetail on PullRequest {
|
|
807
807
|
number
|
|
808
808
|
title
|
|
@@ -2678,7 +2678,7 @@ Hint: Configure a valid Google account email in Monitor Configuration > Contexto
|
|
|
2678
2678
|
|
|
2679
2679
|
`).trim(),N=F.length>0?`Not executed tools (${F.length}/${$.tools.length}): ${F.join(", ")}`:"",B=[U,N].filter((O)=>O.length>0).join(`
|
|
2680
2680
|
|
|
2681
|
-
`);return{toolResults:K,agentSummary:B.length>0?B:null,unexecutedTools:F}}finally{await Z.close?.().catch(()=>{})}}async function lZ1($,Z){let Q=$.storage.registry,X=$.organization.id,Y=await Q.monitorConnections.findByItemId(X,Z.id);if(Y){if(await $.storage.connections.findById(Y.connection_id,X))return Y.connection_id}let G=$Y6(Z);if(!G)throw Error(`Registry item ${Z.id} has no remote URL`);if(cB(G))throw Error(`Registry item ${Z.id} targets a private network URL, refusing to create a monitor connection`);let J=aX6($),W=eX6(Z),K=await $.storage.connections.create({organization_id:X,created_by:J,title:`[MCP Tester] ${Z.title}`,description:`Auto-created monitor connection for ${Z.id}`,app_name:"private-registry-monitor",app_id:`${Hf}:monitor`,connection_type:W,connection_url:G,metadata:{monitorConnection:!0,registryItemId:Z.id,pluginId:Hf}});return await Q.monitorConnections.upsert({organization_id:X,item_id:Z.id,connection_id:K.id,auth_status:"none"}),K.id}async function FY6($){let Z=$.ctx.storage.registry;switch($.action){case"unlisted":return await Z.items.update($.organizationId,$.item.id,{is_unlisted:!0}),"unlisted";case"remove_public":return await Z.items.update($.organizationId,$.item.id,{is_public:!1}),"removed_public";case"remove_private":case"remove_all":return await Z.items.delete($.organizationId,$.item.id),$.action==="remove_all"?"removed_all":"removed_private";default:return"none"}}async function UY6($){let Z=Date.now();if($.signal.aborted)throw Error("Run cancelled");let Q="passed",X=!1,Y=!1,G=null,J="none",W=null,K=[],H=null,F=async()=>{await $.onProgress?.({status:Q,connectionOk:X,toolsListed:Y,toolResults:[...K],agentSummary:W,errorMessage:G,actionTaken:J,durationMs:Date.now()-Z})};try{let U=await lZ1($.ctx,$.item);H=await $.ctx.createMCPProxy(U),X=!0;let B=(await $e(H.listTools?H.listTools():Promise.resolve({tools:[]}),$.monitorConfig.perMcpTimeoutMs,`listTools ${$.item.id}`)).tools??[];if(Y=!0,$.monitorConfig.monitorMode!=="health_check")K.push(...B.map((O)=>uZ1(O.name))),await F();if($.monitorConfig.monitorMode==="full_agent"){let O=await HY6({ctx:$.ctx,monitorConfig:$.monitorConfig,item:$.item,proxy:H,tools:B,signal:$.signal,onProgress:async(w)=>{K.length=0,K.push(...ay$({discoveredTools:B,executedResults:w})),Q=w.some((L)=>!L.success)?"failed":"passed",await F()}});if(K.length=0,K.push(...ay$({discoveredTools:B,executedResults:O.toolResults})),W=O.agentSummary,O.toolResults.some((w)=>!w.success))Q="failed";if(O.unexecutedTools.length>0){if(Q="failed",!G)G=`Agent skipped ${O.unexecutedTools.length} tool(s): ${O.unexecutedTools.join(", ")}`}}else if($.monitorConfig.monitorMode!=="health_check"){for(let O=0;O<B.length;O++){let w=B[O];if(!w||$.signal.aborted)throw Error("Run cancelled");let L=Date.now();try{let E={},j=await $e(H.callTool({name:w.name,arguments:E}),$.monitorConfig.perToolTimeoutMs,`tool ${w.name}`),z=!j.isError,P=Date.now()-L;ey$(K,{toolName:w.name,success:z,input:E,durationMs:P,outputPreview:Xg$(j.structuredContent??j.content),error:z?null:xT0(j.content?.find((A)=>A.type==="text")?.text?.slice(0,300)??"Tool returned error")}),await F()}catch(E){let j=Date.now()-L,z=E instanceof Error?E.message:String(E);ey$(K,{toolName:w.name,success:!1,durationMs:j,error:xT0(z)}),await F()}}if(K.some((O)=>!O.success))Q="failed"}else for(let O of B)K.push(uZ1(O.name));if($.canApplyFailureAction&&Q==="failed"&&$.monitorConfig.onFailure!=="none")J=await FY6({ctx:$.ctx,organizationId:$.organizationId,item:$.item,action:$.monitorConfig.onFailure})}catch(U){if(G=U instanceof Error?U.message:String(U),ZY6(U))Q="needs_auth",await $.ctx.storage.registry.monitorConnections.updateAuthStatus($.organizationId,$.item.id,"needs_auth");else Q="error"}finally{await H?.close?.().catch(()=>{})}return{status:Q,connectionOk:X,toolsListed:Y,toolResults:K,agentSummary:W,errorMessage:G,actionTaken:J,durationMs:Date.now()-Z}}async function NY6($){let Z=$.ctx.storage.registry,X=(await Z.items.list($.organizationId,{includeUnlisted:!0})).items.filter((F)=>{if($.monitorConfig.testPublicOnly&&!F.is_public)return!1;if($.monitorConfig.testPrivateOnly&&F.is_public)return!1;return!0}),Y=$.monitorConfig.includePendingRequests?(await Z.publishRequests.list($.organizationId,{status:"pending",limit:500})).items.map((F)=>BY6(F)):[],G=[...X.map((F)=>({item:F,source:"registry_item"})),...Y.map((F)=>({item:F,source:"publish_request"}))];if(G.length===0){await Z.monitorRuns.update($.organizationId,$.runId,{total_items:0,status:"completed",started_at:new Date().toISOString(),finished_at:new Date().toISOString()});return}await Z.monitorRuns.update($.organizationId,$.runId,{total_items:G.length,status:"running",started_at:new Date().toISOString()});let J=0,W=0,K=0,H=0;for(let F=0;F<G.length;F++){let U=G[F],N=U?.item;if(!N||$.signal.aborted){await Z.monitorRuns.update($.organizationId,$.runId,{status:"cancelled",current_item_id:null,finished_at:new Date().toISOString()});return}await Z.monitorRuns.update($.organizationId,$.runId,{current_item_id:N.id});let B=null,O=async(L)=>{if(!B){B=(await Z.monitorResults.create({run_id:$.runId,organization_id:$.organizationId,item_id:N.id,item_title:N.title,status:L.status,error_message:L.errorMessage,connection_ok:L.connectionOk,tools_listed:L.toolsListed,tool_results:L.toolResults,agent_summary:L.agentSummary,duration_ms:L.durationMs,action_taken:L.actionTaken})).id;return}await Z.monitorResults.update($.organizationId,B,{status:L.status,error_message:L.errorMessage,connection_ok:L.connectionOk,tools_listed:L.toolsListed,tool_results:L.toolResults,agent_summary:L.agentSummary,duration_ms:L.durationMs,action_taken:L.actionTaken})},w=await UY6({ctx:$.ctx,organizationId:$.organizationId,item:N,monitorConfig:$.monitorConfig,signal:$.signal,canApplyFailureAction:U.source==="registry_item",onProgress:O});if(await O({status:w.status,connectionOk:w.connectionOk,toolsListed:w.toolsListed,toolResults:w.toolResults,agentSummary:w.agentSummary,errorMessage:w.errorMessage,actionTaken:w.actionTaken,durationMs:w.durationMs}),J+=1,w.status==="passed")W+=1;else if(w.status==="failed"||w.status==="error")K+=1;else H+=1;await Z.monitorRuns.update($.organizationId,$.runId,{tested_items:J,passed_items:W,failed_items:K,skipped_items:H})}await Z.monitorRuns.update($.organizationId,$.runId,{status:"completed",current_item_id:null,finished_at:new Date().toISOString()})}function BY6($){return{id:`${_w}${$.id}`,title:$.title,description:$.description,_meta:$._meta,server:$.server,is_public:!1,is_unlisted:!0,created_at:$.created_at,updated_at:$.updated_at}}async function OY6($,Z){let Q=sX6($);await Q.access.check();let X=Q.storage.registry,Y=await X.monitorRuns.create({organization_id:Q.organization.id,status:"pending",config_snapshot:Z,started_at:null}),G=new AbortController;return bT0.set(Y.id,G),NY6({ctx:Q,runId:Y.id,organizationId:Q.organization.id,monitorConfig:Z,signal:G.signal}).catch(async(J)=>{await X.monitorRuns.update(Q.organization.id,Y.id,{status:"failed",current_item_id:null,finished_at:new Date().toISOString()}).catch(()=>{}),rX6(`Run ${Y.id} failed with uncaught error:`,J)}).finally(()=>{bT0.delete(Y.id)}),{run:{id:Y.id}}}var bT0,nX6="[MONITOR-AGENT]",tX6,oX6="health_check: not called",Jg$;var yT0=D(()=>{q0();S4();FE();Il();DN();bT0=new Map,tX6=Sy$;Jg$=g({name:"REGISTRY_MONITOR_RUN_START",description:"Start an MCP registry monitor run with an isolated set of monitor connections.",inputSchema:xy$,outputSchema:yy$,handler:async($,Z)=>{let Q=n(Z);await Z.access.check();let X=by$($.config??{}),{run:Y}=await OY6(Z,X),J=await Z.storage.registry.monitorRuns.findById(Q.id,Y.id);if(!J)throw Error(`Failed to load monitor run ${Y.id}`);return{run:J}}})});var Wg$;var Kg$=D(()=>{q0();DN();Wg$=g({name:"REGISTRY_MONITOR_RUN_LIST",description:"List MCP registry monitor runs",inputSchema:uy$,outputSchema:ly$,handler:async($,Z)=>{let Q=n(Z);return await Z.access.check(),Z.storage.registry.monitorRuns.list(Q.id,$)}})});var Hg$;var Fg$=D(()=>{q0();DN();Hg$=g({name:"REGISTRY_MONITOR_RUN_GET",description:"Get details for one MCP registry monitor run",inputSchema:cy$,outputSchema:dy$,handler:async($,Z)=>{let Q=n(Z);return await Z.access.check(),{run:await Z.storage.registry.monitorRuns.findById(Q.id,$.runId)}}})});var Ug$;var Ng$=D(()=>{q0();DN();yT0();Ug$=g({name:"REGISTRY_MONITOR_RUN_CANCEL",description:"Cancel a running MCP registry monitor run",inputSchema:gy$,outputSchema:hy$,handler:async($,Z)=>{let Q=n(Z);await Z.access.check();let X=Z.storage.registry;if(!await X.monitorRuns.findById(Q.id,$.runId))throw Error(`Monitor run not found: ${$.runId}`);return Qg$($.runId),{run:await X.monitorRuns.update(Q.id,$.runId,{status:"cancelled",current_item_id:null,finished_at:new Date().toISOString()})}}})});var Bg$;var Og$=D(()=>{q0();DN();Bg$=g({name:"REGISTRY_MONITOR_RESULT_LIST",description:"List results for a given MCP registry monitor run",inputSchema:my$,outputSchema:iy$,handler:async($,Z)=>{let Q=n(Z);return await Z.access.check(),Z.storage.registry.monitorResults.listByRun(Q.id,$.runId,{status:$.status,limit:$.limit,offset:$.offset})}})});var Dg$;var wg$=D(()=>{q0();DN();Il();Dg$=g({name:"REGISTRY_MONITOR_CONNECTION_LIST",description:"List monitor connection mappings for private registry MCP monitor runs, including auth status",inputSchema:py$,outputSchema:ny$,handler:async($,Z)=>{let Q=n(Z);await Z.access.check();let X=Z.storage.registry,Y=await X.monitorConnections.list(Q.id);return{items:await Promise.all(Y.map(async(J)=>{let W=await X.items.findById(Q.id,J.item_id);if(!W&&J.item_id.startsWith(_w)){let F=J.item_id.slice(_w.length),U=await X.publishRequests.findById(Q.id,F);if(U)W={id:J.item_id,title:U.title,description:U.description,_meta:U._meta,server:U.server,is_public:!1,is_unlisted:!0,created_at:U.created_at,updated_at:U.updated_at}}let K=W?.server.remotes?.find((F)=>F.url)?.url??null,H=J.item_id.startsWith(_w)?"request":"store";return{mapping:J,item:W,remoteUrl:K,source:H}}))}}})});function DY6($){return{id:`${_w}${$.id}`,title:$.title,description:$.description,_meta:$._meta,server:$.server,is_public:!1,is_unlisted:!0,created_at:$.created_at,updated_at:$.updated_at}}var Lg$;var Eg$=D(()=>{q0();DN();yT0();Il();Lg$=g({name:"REGISTRY_MONITOR_CONNECTION_SYNC",description:"Ensure every registry item has a dedicated monitor connection mapping for MCP monitors",inputSchema:ty$,outputSchema:oy$,handler:async($,Z)=>{let Q=n(Z);await Z.access.check();let X=Z.storage.registry,Y=(await X.items.list(Q.id,{includeUnlisted:!0})).items,J=(await X.publishRequests.list(Q.id,{status:"pending",limit:500})).items.map(DY6),W=[...Y,...J],K=await X.monitorConnections.list(Q.id),H=new Set(K.map((U)=>U.item_id)),F=0;for(let U of W){if(!U.server.remotes?.some((N)=>N.url))continue;try{await lZ1(Z,U)}catch(N){console.warn(`[REGISTRY_MONITOR_CONNECTION_SYNC] Skipping ${U.id}:`,N instanceof Error?N.message:N);continue}if(!H.has(U.id))F+=1}return{created:F,updated:Math.max(W.length-F,0)}}})});var jg$;var zg$=D(()=>{q0();DN();jg$=g({name:"REGISTRY_MONITOR_CONNECTION_UPDATE_AUTH",description:"Update the auth_status of a monitor connection mapping (by core connection ID)",inputSchema:ry$,outputSchema:sy$,handler:async({connectionId:$,authStatus:Z},Q)=>{let X=n(Q);await Q.access.check();let Y=Q.storage.registry,G=X.id,J=await Y.monitorConnections.findByConnectionId(G,$);if(!J)throw Error(`No monitor connection mapping found for connection ${$}`);return await Y.monitorConnections.updateAuthStatus(G,J.item_id,Z),{success:!0}}})});function wY6($){if(!$)return{};if(typeof $==="string")try{return JSON.parse($)}catch{return{}}if(typeof $==="object")return $;return{}}async function Ze($,Z){let X=(await $.db.selectFrom("virtual_mcp_plugin_configs").innerJoin("connections","connections.id","virtual_mcp_plugin_configs.virtual_mcp_id").select(["virtual_mcp_plugin_configs.settings as settings"]).where("connections.organization_id","=",Z).where("virtual_mcp_plugin_configs.plugin_id","=",Hf).execute()).map((G)=>wY6(G.settings)),Y={acceptPublishRequests:X.some((G)=>G.acceptPublishRequests===!0),requireApiToken:X.some((G)=>G.requireApiToken===!0),storePrivateOnly:X.some((G)=>G.storePrivateOnly===!0)};if(Y.acceptPublishRequests||Y.requireApiToken||Y.storePrivateOnly)return Y;for(let G of X)if(Object.keys(G).length>0)return G;return{}}var Pg$=D(()=>{Il()});import{z as cZ1}from"zod";function LY6($,Z){if(!Z)return $;let Q={field:["is_public"],operator:"eq",value:!1};if(!$)return Q;return{operator:"and",conditions:[$,Q]}}function EY6($){let Z=new Map,Q=new Map;for(let Y of $){let G=LK(Y._meta);for(let J of G?.tags??[])Z.set(J,(Z.get(J)??0)+1);for(let J of G?.categories??[])Q.set(J,(Q.get(J)??0)+1)}let X=(Y)=>Array.from(Y.entries()).map(([G,J])=>({value:G,count:J})).sort((G,J)=>G.value.localeCompare(J.value));return{tags:X(Z),categories:X(Q)}}var Ag$,Tg$,Rg$,qg$;var Ig$=D(()=>{q0();P9();Pg$();Ag$=g({name:"COLLECTION_REGISTRY_APP_LIST",description:"List registry items for Store discovery. Supports private-only mode from plugin settings.",inputSchema:Pl,outputSchema:Al,handler:async($,Z)=>{let Q=n(Z);await Z.access.check();let X=Z.storage.registry,Y=await Ze(Z,Q.id);return X.items.list(Q.id,{...$,where:LY6($.where,Y.storePrivateOnly===!0)})}}),Tg$=g({name:"COLLECTION_REGISTRY_APP_GET",description:"Get a registry item for Store details. Respects private-only mode from plugin settings.",inputSchema:oH,outputSchema:Kf,handler:async($,Z)=>{let Q=n(Z);await Z.access.check();let X=Z.storage.registry,Y=await Ze(Z,Q.id),G=$.id??$.name;if(!G)return{item:null};let J=await X.items.findByIdOrName(Q.id,G);if(!J)return{item:null};if(Y.storePrivateOnly&&J.is_public)return{item:null};return{item:J}}}),Rg$=g({name:"COLLECTION_REGISTRY_APP_VERSIONS",description:"Get registry item versions for Store details. Respects private-only mode from plugin settings.",inputSchema:oH,outputSchema:cZ1.object({versions:cZ1.array(dW)}),handler:async($,Z)=>{let Q=n(Z);await Z.access.check();let X=Z.storage.registry,Y=await Ze(Z,Q.id),G=$.id??$.name;if(!G)return{versions:[]};let J=await X.items.findByIdOrName(Q.id,G);if(!J)return{versions:[]};if(Y.storePrivateOnly&&J.is_public)return{versions:[]};return{versions:[J]}}}),qg$=g({name:"COLLECTION_REGISTRY_APP_FILTERS",description:"List Store filter facets for registry items. Respects private-only mode from plugin settings.",inputSchema:cZ1.object({}),outputSchema:Tl,handler:async($,Z)=>{let Q=n(Z);await Z.access.check();let X=Z.storage.registry;if(!(await Ze(Z,Q.id)).storePrivateOnly)return X.items.getFilters(Q.id);let G=await X.items.list(Q.id,{limit:1e4,where:{field:["is_public"],operator:"eq",value:!1}});return EY6(G.items)}})});var Mg$;var kg$=D(()=>{rx$();ax$();$y$();Qy$();FE();Yy$();Jy$();Ky$();Fy$();Ny$();Dy$();Ly$();jy$();Py$();Ty$();qy$();My$();Vy$();yT0();Kg$();Fg$();Ng$();Og$();wg$();Eg$();zg$();Ig$();Mg$=[Ag$,Tg$,Rg$,qg$,Wy$,Hy$,Gy$,Oy$,ex$,ox$,Uy$,Zy$,Xy$,Wc1,sx$,wy$,Ey$,zy$,Ay$,Ry$,Iy$,ky$,Jg$,Wg$,Hg$,Ug$,Bg$,Dg$,Lg$,jg$]});import{z as Ml}from"zod";var dZ1;var Vg$=D(()=>{q0();FW();jo();GY();dZ1=g({name:"SANDBOX_DELETE",description:"Delete a sandbox.",annotations:{title:"Delete VM Preview",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:Ml.object({virtualMcpId:Ml.string().describe("Virtual MCP ID that owns this VM"),branch:Ml.string().min(1).describe("Branch whose vm should be deleted (sandboxMap[userId][branch])"),removeWorktree:Ml.boolean().optional().default(!1).describe("Also reclaim the sandbox's workspace (local worktree + disk). Ignored by hosted teardown, whose filesystem is already destroyed.")}),outputSchema:Ml.object({success:Ml.boolean()}),handler:async($,Z)=>{let Q;try{Q=await kF$($,Z)}catch(W){if(W instanceof Error&&W.message==="Virtual MCP not found")return{success:!0};throw W}let{entry:X,userId:Y,sandboxUserId:G}=Q;if(!X)return{success:!0};let J=await Ho0(Z);return await ED(Z.storage.virtualMcps,$.virtualMcpId,Y,G,$.branch),await J.delete(X.sandboxHandle).catch((W)=>console.error(`[SANDBOX_DELETE] ${k7} ${X.sandboxHandle}: ${W instanceof Error?W.message:String(W)}`)),{success:!0}}})});var Sg$=D(()=>{To();Vg$()});import{z as wN}from"zod";function TY6($){try{return JSON.parse($)}catch(Z){throw Error(`GitHub /user/installations returned invalid JSON: ${$.slice(0,300)}`,{cause:Z})}}var PY6="https://api.github.com",AY6=15000,mZ1;var Cg$=D(()=>{q0();LJ();tX();s3();Xt();Cg();mZ1=g({name:"GITHUB_LIST_USER_ORGS",description:"List GitHub App installations (orgs/accounts) accessible to the authenticated user.",annotations:{title:"List GitHub User Orgs",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:wN.object({connectionId:wN.string().describe("ID of the mcp-github connection to use")}),outputSchema:wN.object({installations:wN.array(wN.object({installationId:wN.number(),login:wN.string(),avatarUrl:wN.string(),type:wN.string()}))}),handler:async($,Z)=>{await Z.access.check();let Q=Z.organization?.id;if(!Q)throw Error("Organization context required");let X=await Z.storage.connections.findById($.connectionId,Q);if(!X)throw Error("Connection not found");if(t5(X))throw Error("Repo-scoped connections cannot list installations \u2014 use an org-level mcp-github connection");let Y=new z5(Z.db,Z.vault),G=await Y.get($.connectionId);if(!G)throw Error("No GitHub token found. Ensure the mcp-github connection is authenticated.");let J=G.accessToken;if(XD(G)&&Y.isExpired(G,Ft)){let U=await gT0(G,Y);if(!U)throw Error(wZ);J=U,G=await Y.get($.connectionId)??G}let W=[],K=1,H=100,F=async(U)=>fetch(`${PY6}/user/installations?per_page=${H}&page=${K}`,{headers:{Authorization:`Bearer ${U}`,Accept:"application/vnd.github+json","X-GitHub-Api-Version":"2022-11-28"},signal:AbortSignal.timeout(AY6)});while(!0){let U=await F(J);if(U.status===401){let B=await Y.get($.connectionId);if(!B||!XD(B))throw Error(wZ);let O=await gT0(B,Y);if(!O)throw Error(wZ);if(J=O,U=await F(J),U.status===401)throw Error(wZ)}if($D(U.headers,{lane:"rest",operation:"list_user_installations",installation:Up0}),aO(U)){let B=U.headers.get("retry-after")!==null?"secondary":"primary";ZD({lane:"rest",operation:"list_user_installations",installation:Up0,kind:B});let O=eO(U.headers);throw Error(`GitHub ${B} rate limit reached${O===null?"":`; retry in ${Math.ceil(O/1000)}s`}`)}if(!U.ok)throw Error(`GitHub /user/installations failed: ${U.status}`);let N=TY6(await U.text());for(let B of N.installations)W.push({installationId:B.id,login:B.account.login,avatarUrl:B.account.avatar_url,type:B.account.type});if(N.installations.length<H)break;K++}return{installations:W}}})});var _g$=D(()=>{Cg$()});import{z as iZ1}from"zod";function hT0($){return{repositoryId:$.repositoryId,ref:$.repoUrl?QW($.repoUrl):null,connectionId:$.connectionId}}var LN,vg$="No credential for this repository \u2014 link it in Settings \u2192 Repositories";var pZ1=D(()=>{y5();LN={repositoryId:iZ1.string().optional().describe("Connected repository (REPOSITORY_LINK) to act on"),repoUrl:iZ1.string().optional().describe("Any URL of the repository \u2014 its provider and host are read from it"),connectionId:iZ1.string().optional().describe("Legacy: a repo-scoped mcp-github connection in this org")}});import{z as mW}from"zod";var nZ1;var fg$=D(()=>{q0();tZ();pZ1();nZ1=g({name:"REPOSITORY_SEARCH_BRANCHES",description:"Search a repository's branches by a case-insensitive substring of the branch name, filtered server-side by the provider.",annotations:{title:"Search Repository Branches",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:mW.object({...LN,query:mW.string().describe("Substring to match against branch names. Empty returns the first branches alphabetically."),limit:mW.number().int().min(1).max(100).default(30),cursor:mW.string().nullish().describe("Opaque cursor from a previous call's `nextCursor`, to read the next window")}),outputSchema:mW.object({branches:mW.array(mW.object({name:mW.string(),author:mW.string().nullable()})),totalCount:mW.number(),nextCursor:mW.string().nullable()}),handler:async($,Z)=>{await Z.access.check();let Q=Z.organization?.id;if(!Q)throw Error("Organization context required");return(await yp0(Z,Q,hT0($))).searchBranches({query:$.query,limit:$.limit,cursor:$.cursor})}})});import{z as g$}from"zod";function xg$($){let{credentialConnectionId:Z,...Q}=$;return{...Q,servable:Wt($)}}function tZ1($){let{legacyConnectionId:Z,...Q}=$;return Q}async function yg$($,Z,Q){let X=await $.storage.gitProviderAccounts.get(Q,Z);if(!X)throw Error("Git account not found");return X}var qY6,bg$,gg$,hg$,ug$,lg$,cg$,dg$,mg$,ig$;var pg$=D(()=>{Nt();y5();q0();tZ();fg$();qY6=g$.object({ref:b8$,externalId:g$.string(),defaultBranch:g$.string().nullable(),webUrl:g$.string(),visibility:g$.enum(["public","private","internal"]),description:g$.string().nullable(),updatedAt:g$.string().nullable()}),bg$=x8$.extend({servable:g$.boolean()});gg$=g({name:"GIT_PROVIDER_CAPABILITIES",description:"Which git providers this deployment can connect through Studio-owned credentials, and the URLs that start each connect flow.",annotations:{title:"Git provider capabilities",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},_meta:{ui:{visibility:"app"}},inputSchema:g$.object({}),outputSchema:g$.object({github:g$.object({configured:g$.boolean(),connectPath:g$.string().nullable(),installPath:g$.string().nullable()}),gitlab:g$.object({oauthHosts:g$.array(g$.string()),connectPath:g$.string().nullable()})}),handler:async($,Z)=>{t(Z);let Q=n(Z),X=`/api/${Q.slug??Q.id}/git-providers`,Y=y4$(),G=Y.github.configured;return{github:{configured:G,connectPath:G?`${X}/github/connect`:null,installPath:G?`${X}/github/install`:null},gitlab:{oauthHosts:Y.gitlab.hosts,connectPath:Y.gitlab.configured?`${X}/gitlab/connect`:null}}}}),hg$=g({name:"GIT_ACCOUNT_LIST",description:"List the git provider accounts connected to this organization.",annotations:{title:"List git accounts",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},_meta:{ui:{visibility:"app"}},inputSchema:g$.object({}),outputSchema:g$.object({accounts:g$.array(bg$)}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=n(Z);return{accounts:(await Z.storage.gitProviderAccounts.listByOrg(Q.id)).map(xg$)}}}),ug$=g({name:"GIT_ACCOUNT_CONNECT_TOKEN",description:"Connect a git provider account with a personal, project or group access token. Validates the token against the provider before storing it encrypted. Use this for self-managed GitLab instances (no OAuth application) or when OAuth is not wanted.",annotations:{title:"Connect git account with a token",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:g$.object({type:an.describe("Provider; only gitlab accepts tokens today"),host:g$.string().min(1).describe("Provider host, e.g. gitlab.com or gitlab.acme.com"),token:g$.string().min(1).describe("Access token with api scope")}),outputSchema:g$.object({account:bg$}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=n(Z),X=$.host.trim().toLowerCase();if(!/^[a-z0-9.-]+(:[0-9]+)?$/.test(X))throw Error("host must be a bare hostname, optionally with a port");let Y=await v4$($.type,X,$.token),G=await Z.storage.gitProviderAccounts.upsert({organizationId:Q.id,type:$.type,host:X,authKind:"token",externalAccountId:Y.externalAccountId,login:Y.login,avatarUrl:Y.avatarUrl,createdBy:n0(Z)??null});return await Z.storage.gitProviderAccountCredentials.upsert({connectionId:G.id,accessToken:$.token,refreshToken:null,scope:null,expiresAt:null,clientId:null,clientSecret:null,tokenEndpoint:null}),{account:xg$(G)}}}),lg$=g({name:"GIT_ACCOUNT_DELETE",description:"Disconnect a git provider account. Its repositories stay linked but lose credentials (they become anonymous clones) until linked to another account.",annotations:{title:"Disconnect git account",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},_meta:{ui:{visibility:"app"}},inputSchema:g$.object({id:g$.string()}),outputSchema:g$.object({deleted:g$.boolean()}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=n(Z);return{deleted:await Z.storage.gitProviderAccounts.delete($.id,Q.id)}}}),cg$=g({name:"REPOSITORY_LIST",description:"List the repositories linked to this organization.",annotations:{title:"List repositories",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},_meta:{ui:{visibility:"app"}},inputSchema:g$.object({accountId:g$.string().optional().describe("Only repositories of this account")}),outputSchema:g$.object({repositories:g$.array(Gp0.extend({usable:g$.boolean()}))}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=n(Z),X=await Z.storage.repositories.listByOrg(Q.id,{accountId:$.accountId}),Y=await JD(Z,Q.id),G=new Set(Y.map((J)=>J.webUrl.toLowerCase()));return{repositories:X.map((J)=>({...tZ1(J),usable:G.has(J.webUrl.toLowerCase())}))}}}),dg$=g({name:"REPOSITORY_SEARCH",description:"Search the repositories an account can reach on its provider (not yet linked). Feeds the repository picker.",annotations:{title:"Search provider repositories",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:g$.object({accountId:g$.string(),query:g$.string().optional(),page:g$.number().int().min(1).optional(),perPage:g$.number().int().min(1).max(100).optional()}),outputSchema:g$.object({repositories:g$.array(qY6),hasMore:g$.boolean()}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=n(Z),X=await yg$(Z,Q.id,$.accountId);return qj({db:Z.db,vault:Z.vault},X).listRepos({query:$.query,page:$.page,perPage:$.perPage})}}),mg$=g({name:"REPOSITORY_LINK",description:"Link a repository to the organization. With an account, the repository is verified against the provider and its facts (id, default branch, visibility) recorded; without one it is linked as an anonymous public clone.",annotations:{title:"Link repository",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:g$.object({url:g$.string().min(1).describe("Repository URL (https or ssh), or a bare path like owner/name when accountId is given"),accountId:g$.string().optional().describe("Account whose credentials access the repository")}),outputSchema:g$.object({repository:Gp0}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=n(Z),X=n0(Z)??null;if(!$.accountId){let H=QW($.url);if(!H)throw Error("Could not recognise the repository URL. Use a full https URL from GitHub or GitLab.");let F=await Z.storage.repositories.upsert({organizationId:Q.id,ref:H,createdBy:X});return{repository:tZ1(F)}}let Y=await yg$(Z,Q.id,$.accountId),G=QW($.url,{provider:Y.type,host:Y.host});if(!G)throw Error("Could not recognise the repository URL or path");if(G.host!==Y.host)throw Error(`Repository is on ${G.host} but the account is on ${Y.host}`);let W=await qj({db:Z.db,vault:Z.vault},Y).getRepo(G);if(!W)throw Error(`${G.path} was not found on ${G.host} or the account cannot access it`);let K=await Z.storage.repositories.upsert({organizationId:Q.id,ref:W.ref,accountId:Y.id,externalId:W.externalId,defaultBranch:W.defaultBranch,visibility:W.visibility,createdBy:X});return{repository:tZ1(K)}}}),ig$=g({name:"REPOSITORY_DELETE",description:"Unlink a repository from the organization. Agents, tasks and syncs that referenced it keep working off their legacy metadata until relinked.",annotations:{title:"Unlink repository",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},_meta:{ui:{visibility:"app"}},inputSchema:g$.object({id:g$.string()}),outputSchema:g$.object({deleted:g$.boolean()}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=n(Z);return{deleted:await Z.storage.repositories.delete($.id,Q.id)}}})});import{z as Q$}from"zod";async function kl($,Z){let Q=$.organization?.id;if(!Q)throw Error("Organization context required");let X=await Ut($,Q,hT0(Z));if(!X)throw Error(vg$);return X}var MY6,kY6,uT0,VY6,ng$,tg$,og$,rg$,sg$,ag$;var eg$=D(()=>{q0();tZ();pZ1();MY6=Q$.object({id:Q$.string().nullable(),name:Q$.string(),state:Q$.enum(["queued","running","completed"]),conclusion:Q$.enum(["success","failure","neutral","cancelled","skipped","timed_out","action_required"]).nullable(),url:Q$.string().nullable(),durationMs:Q$.number().nullable(),summary:Q$.string().nullable()}),kY6=Q$.object({id:Q$.string(),author:Q$.string(),body:Q$.string(),createdAt:Q$.string(),updatedAt:Q$.string(),url:Q$.string()}),uT0=Q$.object({number:Q$.number(),url:Q$.string(),title:Q$.string(),body:Q$.string(),state:Q$.enum(["open","closed","merged"]),draft:Q$.boolean(),mergedAt:Q$.string().nullable(),base:Q$.string(),head:Q$.string(),headSha:Q$.string(),headRepoPath:Q$.string().nullable(),author:Q$.string(),conflicting:Q$.boolean().nullable(),checks:Q$.enum(["pending","passing","failing"]).nullable(),changedFiles:Q$.number().nullable()}),VY6=uT0.extend({checkRuns:Q$.array(MY6),comments:Q$.array(kY6),unresolvedConversations:Q$.number(),reviewBlocked:Q$.boolean()}),ng$=g({name:"CHANGE_REQUEST_STATE",description:"Read a branch's change request with its CI runs, review state and comments.",annotations:{title:"Read Change Request State",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:Q$.object({...LN,branch:Q$.string().describe("Head branch of the change request to read")}),outputSchema:Q$.object({changeRequest:VY6.nullable()}),handler:async($,Z)=>{return await Z.access.check(),{changeRequest:await(await kl(Z,$)).readDetailed({branch:$.branch})}}}),tg$=g({name:"CHANGE_REQUEST_LAST_MERGED",description:"Read the most recently merged change request into a base branch \u2014 in Fast Preview, the last publish.",annotations:{title:"Read Last Merged Change Request",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:Q$.object({...LN,base:Q$.string().describe("Branch it was merged into")}),outputSchema:Q$.object({changeRequest:uT0.nullable()}),handler:async($,Z)=>{return await Z.access.check(),{changeRequest:await(await kl(Z,$)).lastMergedInto($.base)}}}),og$=g({name:"CHANGE_REQUEST_LIST_OPEN",description:"List a repository's open change requests, most recently updated first.",annotations:{title:"List Open Change Requests",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:Q$.object({...LN,limit:Q$.number().int().min(1).max(100).default(50)}),outputSchema:Q$.object({changeRequests:Q$.array(uT0)}),handler:async($,Z)=>{return await Z.access.check(),{changeRequests:await(await kl(Z,$)).listOpen($.limit)}}}),rg$=g({name:"CHANGE_REQUEST_CHECK_LOG",description:"Read one CI run's report \u2014 a GitHub check run's output markdown, or the tail of a GitLab job's trace.",annotations:{title:"Read CI Run Report",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:Q$.object({...LN,checkId:Q$.string().describe("Provider id of the run, from its listing")}),outputSchema:Q$.object({report:Q$.string().nullable()}),handler:async($,Z)=>{return await Z.access.check(),{report:await(await kl(Z,$)).readCheckLog($.checkId)}}}),sg$=g({name:"CHANGE_REQUEST_OPEN",description:"Propose a branch onto another. Returns the branch's existing change request instead of failing when it already has one.",annotations:{title:"Open Change Request",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:Q$.object({...LN,head:Q$.string().describe("Branch being proposed"),base:Q$.string().describe("Branch it should land on"),title:Q$.string(),body:Q$.string().optional()}),outputSchema:Q$.object({changeRequest:uT0,existed:Q$.boolean()}),handler:async($,Z)=>{await Z.access.check();let Q=await kl(Z,$),X=await Q.readForBranch($.head);if(X&&X.state==="open"){if($.body&&$.body!==X.body)await Q.describe(X.number,$.body);return{changeRequest:$.body?{...X,body:$.body}:X,existed:!0}}return{changeRequest:await Q.open({head:$.head,base:$.base,title:$.title,body:$.body}),existed:!1}}}),ag$=g({name:"CHANGE_REQUEST_MERGE",description:"Land a change request. Reports why it could not merge rather than throwing.",annotations:{title:"Merge Change Request",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:Q$.object({...LN,number:Q$.number().int().positive(),strategy:Q$.enum(["any","squash"]).default("any").describe("`squash` when the result must be one commit; `any` uses whatever the repository allows"),commitTitle:Q$.string().optional(),commitMessage:Q$.string().optional()}),outputSchema:Q$.object({merged:Q$.boolean(),reason:Q$.enum(["conflict","blocked","rate_limited","not_found","error"]).optional(),detail:Q$.string().optional()}),handler:async($,Z)=>{await Z.access.check();let X=await(await kl(Z,$)).merge($.number,{strategy:$.strategy,commitTitle:$.commitTitle,commitMessage:$.commitMessage});return X.merged?{merged:!0}:{merged:!1,reason:X.reason,detail:X.detail}}})});import{z as _6}from"zod";function lT0($){if(!$)return"";return typeof $==="string"?$:$.toISOString()}function $h$($){let Z=$.trim();return Z.length>0?Z:void 0}function Zh$($,Z){return $===void 0||$.includes(Z)}var CY6,_Y6,vY6,fY6,bY6,xY6,oZ1;var Qh$=D(()=>{q0();os0();CY6=["thread","task"],_Y6=_6.object({type:_6.literal("thread"),id:_6.string(),title:_6.string(),created_at:_6.string(),updated_at:_6.string(),virtual_mcp_id:_6.string().nullable(),run_config:_6.record(_6.string(),_6.unknown()).nullable(),status:_6.string().nullable()}),vY6=_6.object({type:_6.literal("task"),id:_6.string(),title:_6.string(),created_at:_6.string(),updated_at:_6.string(),key:_6.string().nullable(),status:_6.string().nullable(),repo:_6.string().nullable()}),fY6=_6.discriminatedUnion("type",[_Y6,vY6]),bY6=_6.object({query:_6.string().max(256).describe("Free-text search query. Empty string returns the most recently updated resources."),limit:_6.number().int().min(1).max(50).optional().describe("Maximum results per resource type (default: 20)."),types:_6.array(_6.enum(CY6)).optional().describe("Restrict the search to specific resource types. Omit to search across all available types.")}),xY6=_6.object({items:_6.array(fY6),totalCount:_6.number()});oZ1=g({name:"GLOBAL_SEARCH",description:"Search across organization resources by free-text query. Returns a typed union of matches (currently: threads and task-board cards). New resource types may be added over time without changes to the call shape.",annotations:{title:"Global Search",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:bY6,outputSchema:xY6,handler:async($,Z)=>{await Z.access.check();let Q=n(Z),X=$.limit??20,Y=Zh$($.types,"thread"),G=Zh$($.types,"task"),J=[],W=0;if(Y){let{threads:K,total:H}=await Z.storage.threads.list(void 0,{limit:X,offset:0,search:$h$($.query),includeArchived:!1});W+=H;for(let F of K)J.push({type:"thread",id:F.id,title:F.title??"",created_at:lT0(F.created_at),updated_at:lT0(F.updated_at),virtual_mcp_id:F.virtual_mcp_id??null,run_config:F.run_config??null,status:CJ(F).status})}if(G){let K=await Z.storage.taskBoard.searchByTitle(Q.id,$h$($.query)??"",X);W+=K.length;for(let H of K)J.push({type:"task",id:H.id,title:H.title??"",created_at:lT0(H.createdAt),updated_at:lT0(H.updatedAt),key:Q.slug?rL0(Q.slug,H.keySeq):null,status:H.status??null,repo:H.repo??null})}return{items:J,totalCount:W}}})});var Xh$=D(()=>{Qh$()});var d70={};T4(d70,{toolSubsetMCP:()=>rZ1,managementMCP:()=>Zu,managementContextStore:()=>aU,listManagementTools:()=>gY6,TOOL_BY_NAME:()=>Vl,CORE_TOOLS:()=>Gh$});import{z as Yh$}from"zod";async function gY6($){let Z=await Zu($),[Q,X]=Fn.createLinkedPair();await Z.connect(X);let Y=new d9({name:"tools-hydration",version:"1.0.0"},{jsonSchemaValidator:j5});try{return await Y.connect(Q),(await Y.listTools()).tools}finally{await Y.close().catch(()=>{}),await Z.close().catch(()=>{})}}var Gh$,Vl,rZ1=($,Z)=>{let Q=new TK({name:$,version:"1.0.0"},{capabilities:{tools:{}},jsonSchemaValidator:j5});for(let X of Z){let Y=Vl.get(X);if(!Y){console.warn(`[${$}] unknown tool "${X}" \u2014 not registered`);continue}let{config:G,handler:J}=na(Y);Q.registerTool(Y.name,G,J)}return Q},Zu=async($)=>{let Z=new TK({name:"mcp-cms-management",version:"1.0.0"},{capabilities:{tools:{},prompts:{},resources:{}},jsonSchemaValidator:j5});for(let Y of Vl.values()){let{config:G,handler:J}=na(Y);Z.registerTool(Y.name,G,J)}let Q=zT0();for(let Y of Q){let G=Y.arguments?.length?Object.fromEntries(Y.arguments.map((J)=>{let W=J.required?Yh$.string():Yh$.string().optional();return[J.name,J.description?W.describe(J.description):W]})):void 0;Z.registerPrompt(Y.name,{title:Y.title,description:Y.description,...G?{argsSchema:G}:{}},(J)=>{return{messages:[{role:"user",content:{type:"text",text:typeof Y.text==="function"?Y.text(J??{}):Y.text}}]}})}if($.organization?.id){let Y=await $.storage.brandContext.list($.organization.id),G=new Set;for(let J of Y){let W=J.name.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,""),K=W?`brand-${W}`:`brand-${J.id}`;if(G.has(K))K=`${K}-${J.id.slice(0,8)}`;G.add(K);let H=[`# Brand: ${J.name}`,"",`**Domain:** ${J.domain}`,"","## Overview",J.overview];if(J.colors){let U=Object.entries(J.colors).filter(([,N])=>N);if(U.length>0){H.push("","## Colors");for(let[N,B]of U)H.push(`- **${N}:** ${B}`)}}if(J.fonts){let U=Object.entries(J.fonts).filter(([,N])=>N);if(U.length>0){H.push("","## Fonts");for(let[N,B]of U)H.push(`- ${B} (${N})`)}}if(J.logo)H.push("",`**Logo:** ${J.logo}`);if(J.favicon)H.push(`**Favicon:** ${J.favicon}`);if(J.ogImage)H.push(`**OG Image:** ${J.ogImage}`);if(J.images&&J.images.length>0){H.push("","## Images");for(let U of J.images){let N=Object.entries(U).map(([B,O])=>`${B}: ${O}`).join(", ");H.push(`- ${N}`)}}let F=H.join(`
|
|
2681
|
+
`);return{toolResults:K,agentSummary:B.length>0?B:null,unexecutedTools:F}}finally{await Z.close?.().catch(()=>{})}}async function lZ1($,Z){let Q=$.storage.registry,X=$.organization.id,Y=await Q.monitorConnections.findByItemId(X,Z.id);if(Y){if(await $.storage.connections.findById(Y.connection_id,X))return Y.connection_id}let G=$Y6(Z);if(!G)throw Error(`Registry item ${Z.id} has no remote URL`);if(cB(G))throw Error(`Registry item ${Z.id} targets a private network URL, refusing to create a monitor connection`);let J=aX6($),W=eX6(Z),K=await $.storage.connections.create({organization_id:X,created_by:J,title:`[MCP Tester] ${Z.title}`,description:`Auto-created monitor connection for ${Z.id}`,app_name:"private-registry-monitor",app_id:`${Hf}:monitor`,connection_type:W,connection_url:G,metadata:{monitorConnection:!0,registryItemId:Z.id,pluginId:Hf}});return await Q.monitorConnections.upsert({organization_id:X,item_id:Z.id,connection_id:K.id,auth_status:"none"}),K.id}async function FY6($){let Z=$.ctx.storage.registry;switch($.action){case"unlisted":return await Z.items.update($.organizationId,$.item.id,{is_unlisted:!0}),"unlisted";case"remove_public":return await Z.items.update($.organizationId,$.item.id,{is_public:!1}),"removed_public";case"remove_private":case"remove_all":return await Z.items.delete($.organizationId,$.item.id),$.action==="remove_all"?"removed_all":"removed_private";default:return"none"}}async function UY6($){let Z=Date.now();if($.signal.aborted)throw Error("Run cancelled");let Q="passed",X=!1,Y=!1,G=null,J="none",W=null,K=[],H=null,F=async()=>{await $.onProgress?.({status:Q,connectionOk:X,toolsListed:Y,toolResults:[...K],agentSummary:W,errorMessage:G,actionTaken:J,durationMs:Date.now()-Z})};try{let U=await lZ1($.ctx,$.item);H=await $.ctx.createMCPProxy(U),X=!0;let B=(await $e(H.listTools?H.listTools():Promise.resolve({tools:[]}),$.monitorConfig.perMcpTimeoutMs,`listTools ${$.item.id}`)).tools??[];if(Y=!0,$.monitorConfig.monitorMode!=="health_check")K.push(...B.map((O)=>uZ1(O.name))),await F();if($.monitorConfig.monitorMode==="full_agent"){let O=await HY6({ctx:$.ctx,monitorConfig:$.monitorConfig,item:$.item,proxy:H,tools:B,signal:$.signal,onProgress:async(w)=>{K.length=0,K.push(...ay$({discoveredTools:B,executedResults:w})),Q=w.some((L)=>!L.success)?"failed":"passed",await F()}});if(K.length=0,K.push(...ay$({discoveredTools:B,executedResults:O.toolResults})),W=O.agentSummary,O.toolResults.some((w)=>!w.success))Q="failed";if(O.unexecutedTools.length>0){if(Q="failed",!G)G=`Agent skipped ${O.unexecutedTools.length} tool(s): ${O.unexecutedTools.join(", ")}`}}else if($.monitorConfig.monitorMode!=="health_check"){for(let O=0;O<B.length;O++){let w=B[O];if(!w||$.signal.aborted)throw Error("Run cancelled");let L=Date.now();try{let E={},j=await $e(H.callTool({name:w.name,arguments:E}),$.monitorConfig.perToolTimeoutMs,`tool ${w.name}`),z=!j.isError,P=Date.now()-L;ey$(K,{toolName:w.name,success:z,input:E,durationMs:P,outputPreview:Xg$(j.structuredContent??j.content),error:z?null:xT0(j.content?.find((A)=>A.type==="text")?.text?.slice(0,300)??"Tool returned error")}),await F()}catch(E){let j=Date.now()-L,z=E instanceof Error?E.message:String(E);ey$(K,{toolName:w.name,success:!1,durationMs:j,error:xT0(z)}),await F()}}if(K.some((O)=>!O.success))Q="failed"}else for(let O of B)K.push(uZ1(O.name));if($.canApplyFailureAction&&Q==="failed"&&$.monitorConfig.onFailure!=="none")J=await FY6({ctx:$.ctx,organizationId:$.organizationId,item:$.item,action:$.monitorConfig.onFailure})}catch(U){if(G=U instanceof Error?U.message:String(U),ZY6(U))Q="needs_auth",await $.ctx.storage.registry.monitorConnections.updateAuthStatus($.organizationId,$.item.id,"needs_auth");else Q="error"}finally{await H?.close?.().catch(()=>{})}return{status:Q,connectionOk:X,toolsListed:Y,toolResults:K,agentSummary:W,errorMessage:G,actionTaken:J,durationMs:Date.now()-Z}}async function NY6($){let Z=$.ctx.storage.registry,X=(await Z.items.list($.organizationId,{includeUnlisted:!0})).items.filter((F)=>{if($.monitorConfig.testPublicOnly&&!F.is_public)return!1;if($.monitorConfig.testPrivateOnly&&F.is_public)return!1;return!0}),Y=$.monitorConfig.includePendingRequests?(await Z.publishRequests.list($.organizationId,{status:"pending",limit:500})).items.map((F)=>BY6(F)):[],G=[...X.map((F)=>({item:F,source:"registry_item"})),...Y.map((F)=>({item:F,source:"publish_request"}))];if(G.length===0){await Z.monitorRuns.update($.organizationId,$.runId,{total_items:0,status:"completed",started_at:new Date().toISOString(),finished_at:new Date().toISOString()});return}await Z.monitorRuns.update($.organizationId,$.runId,{total_items:G.length,status:"running",started_at:new Date().toISOString()});let J=0,W=0,K=0,H=0;for(let F=0;F<G.length;F++){let U=G[F],N=U?.item;if(!N||$.signal.aborted){await Z.monitorRuns.update($.organizationId,$.runId,{status:"cancelled",current_item_id:null,finished_at:new Date().toISOString()});return}await Z.monitorRuns.update($.organizationId,$.runId,{current_item_id:N.id});let B=null,O=async(L)=>{if(!B){B=(await Z.monitorResults.create({run_id:$.runId,organization_id:$.organizationId,item_id:N.id,item_title:N.title,status:L.status,error_message:L.errorMessage,connection_ok:L.connectionOk,tools_listed:L.toolsListed,tool_results:L.toolResults,agent_summary:L.agentSummary,duration_ms:L.durationMs,action_taken:L.actionTaken})).id;return}await Z.monitorResults.update($.organizationId,B,{status:L.status,error_message:L.errorMessage,connection_ok:L.connectionOk,tools_listed:L.toolsListed,tool_results:L.toolResults,agent_summary:L.agentSummary,duration_ms:L.durationMs,action_taken:L.actionTaken})},w=await UY6({ctx:$.ctx,organizationId:$.organizationId,item:N,monitorConfig:$.monitorConfig,signal:$.signal,canApplyFailureAction:U.source==="registry_item",onProgress:O});if(await O({status:w.status,connectionOk:w.connectionOk,toolsListed:w.toolsListed,toolResults:w.toolResults,agentSummary:w.agentSummary,errorMessage:w.errorMessage,actionTaken:w.actionTaken,durationMs:w.durationMs}),J+=1,w.status==="passed")W+=1;else if(w.status==="failed"||w.status==="error")K+=1;else H+=1;await Z.monitorRuns.update($.organizationId,$.runId,{tested_items:J,passed_items:W,failed_items:K,skipped_items:H})}await Z.monitorRuns.update($.organizationId,$.runId,{status:"completed",current_item_id:null,finished_at:new Date().toISOString()})}function BY6($){return{id:`${_w}${$.id}`,title:$.title,description:$.description,_meta:$._meta,server:$.server,is_public:!1,is_unlisted:!0,created_at:$.created_at,updated_at:$.updated_at}}async function OY6($,Z){let Q=sX6($);await Q.access.check();let X=Q.storage.registry,Y=await X.monitorRuns.create({organization_id:Q.organization.id,status:"pending",config_snapshot:Z,started_at:null}),G=new AbortController;return bT0.set(Y.id,G),NY6({ctx:Q,runId:Y.id,organizationId:Q.organization.id,monitorConfig:Z,signal:G.signal}).catch(async(J)=>{await X.monitorRuns.update(Q.organization.id,Y.id,{status:"failed",current_item_id:null,finished_at:new Date().toISOString()}).catch(()=>{}),rX6(`Run ${Y.id} failed with uncaught error:`,J)}).finally(()=>{bT0.delete(Y.id)}),{run:{id:Y.id}}}var bT0,nX6="[MONITOR-AGENT]",tX6,oX6="health_check: not called",Jg$;var yT0=D(()=>{q0();S4();FE();Il();DN();bT0=new Map,tX6=Sy$;Jg$=g({name:"REGISTRY_MONITOR_RUN_START",description:"Start an MCP registry monitor run with an isolated set of monitor connections.",inputSchema:xy$,outputSchema:yy$,handler:async($,Z)=>{let Q=n(Z);await Z.access.check();let X=by$($.config??{}),{run:Y}=await OY6(Z,X),J=await Z.storage.registry.monitorRuns.findById(Q.id,Y.id);if(!J)throw Error(`Failed to load monitor run ${Y.id}`);return{run:J}}})});var Wg$;var Kg$=D(()=>{q0();DN();Wg$=g({name:"REGISTRY_MONITOR_RUN_LIST",description:"List MCP registry monitor runs",inputSchema:uy$,outputSchema:ly$,handler:async($,Z)=>{let Q=n(Z);return await Z.access.check(),Z.storage.registry.monitorRuns.list(Q.id,$)}})});var Hg$;var Fg$=D(()=>{q0();DN();Hg$=g({name:"REGISTRY_MONITOR_RUN_GET",description:"Get details for one MCP registry monitor run",inputSchema:cy$,outputSchema:dy$,handler:async($,Z)=>{let Q=n(Z);return await Z.access.check(),{run:await Z.storage.registry.monitorRuns.findById(Q.id,$.runId)}}})});var Ug$;var Ng$=D(()=>{q0();DN();yT0();Ug$=g({name:"REGISTRY_MONITOR_RUN_CANCEL",description:"Cancel a running MCP registry monitor run",inputSchema:gy$,outputSchema:hy$,handler:async($,Z)=>{let Q=n(Z);await Z.access.check();let X=Z.storage.registry;if(!await X.monitorRuns.findById(Q.id,$.runId))throw Error(`Monitor run not found: ${$.runId}`);return Qg$($.runId),{run:await X.monitorRuns.update(Q.id,$.runId,{status:"cancelled",current_item_id:null,finished_at:new Date().toISOString()})}}})});var Bg$;var Og$=D(()=>{q0();DN();Bg$=g({name:"REGISTRY_MONITOR_RESULT_LIST",description:"List results for a given MCP registry monitor run",inputSchema:my$,outputSchema:iy$,handler:async($,Z)=>{let Q=n(Z);return await Z.access.check(),Z.storage.registry.monitorResults.listByRun(Q.id,$.runId,{status:$.status,limit:$.limit,offset:$.offset})}})});var Dg$;var wg$=D(()=>{q0();DN();Il();Dg$=g({name:"REGISTRY_MONITOR_CONNECTION_LIST",description:"List monitor connection mappings for private registry MCP monitor runs, including auth status",inputSchema:py$,outputSchema:ny$,handler:async($,Z)=>{let Q=n(Z);await Z.access.check();let X=Z.storage.registry,Y=await X.monitorConnections.list(Q.id);return{items:await Promise.all(Y.map(async(J)=>{let W=await X.items.findById(Q.id,J.item_id);if(!W&&J.item_id.startsWith(_w)){let F=J.item_id.slice(_w.length),U=await X.publishRequests.findById(Q.id,F);if(U)W={id:J.item_id,title:U.title,description:U.description,_meta:U._meta,server:U.server,is_public:!1,is_unlisted:!0,created_at:U.created_at,updated_at:U.updated_at}}let K=W?.server.remotes?.find((F)=>F.url)?.url??null,H=J.item_id.startsWith(_w)?"request":"store";return{mapping:J,item:W,remoteUrl:K,source:H}}))}}})});function DY6($){return{id:`${_w}${$.id}`,title:$.title,description:$.description,_meta:$._meta,server:$.server,is_public:!1,is_unlisted:!0,created_at:$.created_at,updated_at:$.updated_at}}var Lg$;var Eg$=D(()=>{q0();DN();yT0();Il();Lg$=g({name:"REGISTRY_MONITOR_CONNECTION_SYNC",description:"Ensure every registry item has a dedicated monitor connection mapping for MCP monitors",inputSchema:ty$,outputSchema:oy$,handler:async($,Z)=>{let Q=n(Z);await Z.access.check();let X=Z.storage.registry,Y=(await X.items.list(Q.id,{includeUnlisted:!0})).items,J=(await X.publishRequests.list(Q.id,{status:"pending",limit:500})).items.map(DY6),W=[...Y,...J],K=await X.monitorConnections.list(Q.id),H=new Set(K.map((U)=>U.item_id)),F=0;for(let U of W){if(!U.server.remotes?.some((N)=>N.url))continue;try{await lZ1(Z,U)}catch(N){console.warn(`[REGISTRY_MONITOR_CONNECTION_SYNC] Skipping ${U.id}:`,N instanceof Error?N.message:N);continue}if(!H.has(U.id))F+=1}return{created:F,updated:Math.max(W.length-F,0)}}})});var jg$;var zg$=D(()=>{q0();DN();jg$=g({name:"REGISTRY_MONITOR_CONNECTION_UPDATE_AUTH",description:"Update the auth_status of a monitor connection mapping (by core connection ID)",inputSchema:ry$,outputSchema:sy$,handler:async({connectionId:$,authStatus:Z},Q)=>{let X=n(Q);await Q.access.check();let Y=Q.storage.registry,G=X.id,J=await Y.monitorConnections.findByConnectionId(G,$);if(!J)throw Error(`No monitor connection mapping found for connection ${$}`);return await Y.monitorConnections.updateAuthStatus(G,J.item_id,Z),{success:!0}}})});function wY6($){if(!$)return{};if(typeof $==="string")try{return JSON.parse($)}catch{return{}}if(typeof $==="object")return $;return{}}async function Ze($,Z){let X=(await $.db.selectFrom("virtual_mcp_plugin_configs").innerJoin("connections","connections.id","virtual_mcp_plugin_configs.virtual_mcp_id").select(["virtual_mcp_plugin_configs.settings as settings"]).where("connections.organization_id","=",Z).where("virtual_mcp_plugin_configs.plugin_id","=",Hf).execute()).map((G)=>wY6(G.settings)),Y={acceptPublishRequests:X.some((G)=>G.acceptPublishRequests===!0),requireApiToken:X.some((G)=>G.requireApiToken===!0),storePrivateOnly:X.some((G)=>G.storePrivateOnly===!0)};if(Y.acceptPublishRequests||Y.requireApiToken||Y.storePrivateOnly)return Y;for(let G of X)if(Object.keys(G).length>0)return G;return{}}var Pg$=D(()=>{Il()});import{z as cZ1}from"zod";function LY6($,Z){if(!Z)return $;let Q={field:["is_public"],operator:"eq",value:!1};if(!$)return Q;return{operator:"and",conditions:[$,Q]}}function EY6($){let Z=new Map,Q=new Map;for(let Y of $){let G=LK(Y._meta);for(let J of G?.tags??[])Z.set(J,(Z.get(J)??0)+1);for(let J of G?.categories??[])Q.set(J,(Q.get(J)??0)+1)}let X=(Y)=>Array.from(Y.entries()).map(([G,J])=>({value:G,count:J})).sort((G,J)=>G.value.localeCompare(J.value));return{tags:X(Z),categories:X(Q)}}var Ag$,Tg$,Rg$,qg$;var Ig$=D(()=>{q0();P9();Pg$();Ag$=g({name:"COLLECTION_REGISTRY_APP_LIST",description:"List registry items for Store discovery. Supports private-only mode from plugin settings.",inputSchema:Pl,outputSchema:Al,handler:async($,Z)=>{let Q=n(Z);await Z.access.check();let X=Z.storage.registry,Y=await Ze(Z,Q.id);return X.items.list(Q.id,{...$,where:LY6($.where,Y.storePrivateOnly===!0)})}}),Tg$=g({name:"COLLECTION_REGISTRY_APP_GET",description:"Get a registry item for Store details. Respects private-only mode from plugin settings.",inputSchema:oH,outputSchema:Kf,handler:async($,Z)=>{let Q=n(Z);await Z.access.check();let X=Z.storage.registry,Y=await Ze(Z,Q.id),G=$.id??$.name;if(!G)return{item:null};let J=await X.items.findByIdOrName(Q.id,G);if(!J)return{item:null};if(Y.storePrivateOnly&&J.is_public)return{item:null};return{item:J}}}),Rg$=g({name:"COLLECTION_REGISTRY_APP_VERSIONS",description:"Get registry item versions for Store details. Respects private-only mode from plugin settings.",inputSchema:oH,outputSchema:cZ1.object({versions:cZ1.array(dW)}),handler:async($,Z)=>{let Q=n(Z);await Z.access.check();let X=Z.storage.registry,Y=await Ze(Z,Q.id),G=$.id??$.name;if(!G)return{versions:[]};let J=await X.items.findByIdOrName(Q.id,G);if(!J)return{versions:[]};if(Y.storePrivateOnly&&J.is_public)return{versions:[]};return{versions:[J]}}}),qg$=g({name:"COLLECTION_REGISTRY_APP_FILTERS",description:"List Store filter facets for registry items. Respects private-only mode from plugin settings.",inputSchema:cZ1.object({}),outputSchema:Tl,handler:async($,Z)=>{let Q=n(Z);await Z.access.check();let X=Z.storage.registry;if(!(await Ze(Z,Q.id)).storePrivateOnly)return X.items.getFilters(Q.id);let G=await X.items.list(Q.id,{limit:1e4,where:{field:["is_public"],operator:"eq",value:!1}});return EY6(G.items)}})});var Mg$;var kg$=D(()=>{rx$();ax$();$y$();Qy$();FE();Yy$();Jy$();Ky$();Fy$();Ny$();Dy$();Ly$();jy$();Py$();Ty$();qy$();My$();Vy$();yT0();Kg$();Fg$();Ng$();Og$();wg$();Eg$();zg$();Ig$();Mg$=[Ag$,Tg$,Rg$,qg$,Wy$,Hy$,Gy$,Oy$,ex$,ox$,Uy$,Zy$,Xy$,Wc1,sx$,wy$,Ey$,zy$,Ay$,Ry$,Iy$,ky$,Jg$,Wg$,Hg$,Ug$,Bg$,Dg$,Lg$,jg$]});import{z as Ml}from"zod";var dZ1;var Vg$=D(()=>{q0();FW();jo();GY();dZ1=g({name:"SANDBOX_DELETE",description:"Delete a sandbox.",annotations:{title:"Delete VM Preview",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:Ml.object({virtualMcpId:Ml.string().describe("Virtual MCP ID that owns this VM"),branch:Ml.string().min(1).describe("Branch whose vm should be deleted (sandboxMap[userId][branch])"),removeWorktree:Ml.boolean().optional().default(!1).describe("Also reclaim the sandbox's workspace (local worktree + disk). Ignored by hosted teardown, whose filesystem is already destroyed.")}),outputSchema:Ml.object({success:Ml.boolean()}),handler:async($,Z)=>{let Q;try{Q=await kF$($,Z)}catch(W){if(W instanceof Error&&W.message==="Virtual MCP not found")return{success:!0};throw W}let{entry:X,userId:Y,sandboxUserId:G}=Q;if(!X)return{success:!0};let J=await Ho0(Z);return await ED(Z.storage.virtualMcps,$.virtualMcpId,Y,G,$.branch),await J.delete(X.sandboxHandle).catch((W)=>console.error(`[SANDBOX_DELETE] ${k7} ${X.sandboxHandle}: ${W instanceof Error?W.message:String(W)}`)),{success:!0}}})});var Sg$=D(()=>{To();Vg$()});import{z as wN}from"zod";function TY6($){try{return JSON.parse($)}catch(Z){throw Error(`GitHub /user/installations returned invalid JSON: ${$.slice(0,300)}`,{cause:Z})}}var PY6="https://api.github.com",AY6=15000,mZ1;var Cg$=D(()=>{q0();LJ();tX();s3();Xt();Cg();mZ1=g({name:"GITHUB_LIST_USER_ORGS",description:"List GitHub App installations (orgs/accounts) accessible to the authenticated user.",annotations:{title:"List GitHub User Orgs",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:wN.object({connectionId:wN.string().describe("ID of the mcp-github connection to use")}),outputSchema:wN.object({installations:wN.array(wN.object({installationId:wN.number(),login:wN.string(),avatarUrl:wN.string(),type:wN.string()}))}),handler:async($,Z)=>{await Z.access.check();let Q=Z.organization?.id;if(!Q)throw Error("Organization context required");let X=await Z.storage.connections.findById($.connectionId,Q);if(!X)throw Error("Connection not found");if(t5(X))throw Error("Repo-scoped connections cannot list installations \u2014 use an org-level mcp-github connection");let Y=new z5(Z.db,Z.vault),G=await Y.get($.connectionId);if(!G)throw Error("No GitHub token found. Ensure the mcp-github connection is authenticated.");let J=G.accessToken;if(XD(G)&&Y.isExpired(G,Ft)){let U=await gT0(G,Y);if(!U)throw Error(wZ);J=U,G=await Y.get($.connectionId)??G}let W=[],K=1,H=100,F=async(U)=>fetch(`${PY6}/user/installations?per_page=${H}&page=${K}`,{headers:{Authorization:`Bearer ${U}`,Accept:"application/vnd.github+json","X-GitHub-Api-Version":"2022-11-28"},signal:AbortSignal.timeout(AY6)});while(!0){let U=await F(J);if(U.status===401){let B=await Y.get($.connectionId);if(!B||!XD(B))throw Error(wZ);let O=await gT0(B,Y);if(!O)throw Error(wZ);if(J=O,U=await F(J),U.status===401)throw Error(wZ)}if($D(U.headers,{lane:"rest",operation:"list_user_installations",installation:Up0}),aO(U)){await U.body?.cancel().catch(()=>{});let B=U.headers.get("retry-after")!==null?"secondary":"primary";ZD({lane:"rest",operation:"list_user_installations",installation:Up0,kind:B});let O=eO(U.headers);throw Error(`GitHub ${B} rate limit reached${O===null?"":`; retry in ${Math.ceil(O/1000)}s`}`)}if(!U.ok)throw await U.body?.cancel().catch(()=>{}),Error(`GitHub /user/installations failed: ${U.status}`);let N=TY6(await U.text());for(let B of N.installations)W.push({installationId:B.id,login:B.account.login,avatarUrl:B.account.avatar_url,type:B.account.type});if(N.installations.length<H)break;K++}return{installations:W}}})});var _g$=D(()=>{Cg$()});import{z as iZ1}from"zod";function hT0($){return{repositoryId:$.repositoryId,ref:$.repoUrl?QW($.repoUrl):null,connectionId:$.connectionId}}var LN,vg$="No credential for this repository \u2014 link it in Settings \u2192 Repositories";var pZ1=D(()=>{y5();LN={repositoryId:iZ1.string().optional().describe("Connected repository (REPOSITORY_LINK) to act on"),repoUrl:iZ1.string().optional().describe("Any URL of the repository \u2014 its provider and host are read from it"),connectionId:iZ1.string().optional().describe("Legacy: a repo-scoped mcp-github connection in this org")}});import{z as mW}from"zod";var nZ1;var fg$=D(()=>{q0();tZ();pZ1();nZ1=g({name:"REPOSITORY_SEARCH_BRANCHES",description:"Search a repository's branches by a case-insensitive substring of the branch name, filtered server-side by the provider.",annotations:{title:"Search Repository Branches",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:mW.object({...LN,query:mW.string().describe("Substring to match against branch names. Empty returns the first branches alphabetically."),limit:mW.number().int().min(1).max(100).default(30),cursor:mW.string().nullish().describe("Opaque cursor from a previous call's `nextCursor`, to read the next window")}),outputSchema:mW.object({branches:mW.array(mW.object({name:mW.string(),author:mW.string().nullable()})),totalCount:mW.number(),nextCursor:mW.string().nullable()}),handler:async($,Z)=>{await Z.access.check();let Q=Z.organization?.id;if(!Q)throw Error("Organization context required");return(await yp0(Z,Q,hT0($))).searchBranches({query:$.query,limit:$.limit,cursor:$.cursor})}})});import{z as g$}from"zod";function xg$($){let{credentialConnectionId:Z,...Q}=$;return{...Q,servable:Wt($)}}function tZ1($){let{legacyConnectionId:Z,...Q}=$;return Q}async function yg$($,Z,Q){let X=await $.storage.gitProviderAccounts.get(Q,Z);if(!X)throw Error("Git account not found");return X}var qY6,bg$,gg$,hg$,ug$,lg$,cg$,dg$,mg$,ig$;var pg$=D(()=>{Nt();y5();q0();tZ();fg$();qY6=g$.object({ref:b8$,externalId:g$.string(),defaultBranch:g$.string().nullable(),webUrl:g$.string(),visibility:g$.enum(["public","private","internal"]),description:g$.string().nullable(),updatedAt:g$.string().nullable()}),bg$=x8$.extend({servable:g$.boolean()});gg$=g({name:"GIT_PROVIDER_CAPABILITIES",description:"Which git providers this deployment can connect through Studio-owned credentials, and the URLs that start each connect flow.",annotations:{title:"Git provider capabilities",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},_meta:{ui:{visibility:"app"}},inputSchema:g$.object({}),outputSchema:g$.object({github:g$.object({configured:g$.boolean(),connectPath:g$.string().nullable(),installPath:g$.string().nullable()}),gitlab:g$.object({oauthHosts:g$.array(g$.string()),connectPath:g$.string().nullable()})}),handler:async($,Z)=>{t(Z);let Q=n(Z),X=`/api/${Q.slug??Q.id}/git-providers`,Y=y4$(),G=Y.github.configured;return{github:{configured:G,connectPath:G?`${X}/github/connect`:null,installPath:G?`${X}/github/install`:null},gitlab:{oauthHosts:Y.gitlab.hosts,connectPath:Y.gitlab.configured?`${X}/gitlab/connect`:null}}}}),hg$=g({name:"GIT_ACCOUNT_LIST",description:"List the git provider accounts connected to this organization.",annotations:{title:"List git accounts",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},_meta:{ui:{visibility:"app"}},inputSchema:g$.object({}),outputSchema:g$.object({accounts:g$.array(bg$)}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=n(Z);return{accounts:(await Z.storage.gitProviderAccounts.listByOrg(Q.id)).map(xg$)}}}),ug$=g({name:"GIT_ACCOUNT_CONNECT_TOKEN",description:"Connect a git provider account with a personal, project or group access token. Validates the token against the provider before storing it encrypted. Use this for self-managed GitLab instances (no OAuth application) or when OAuth is not wanted.",annotations:{title:"Connect git account with a token",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:g$.object({type:an.describe("Provider; only gitlab accepts tokens today"),host:g$.string().min(1).describe("Provider host, e.g. gitlab.com or gitlab.acme.com"),token:g$.string().min(1).describe("Access token with api scope")}),outputSchema:g$.object({account:bg$}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=n(Z),X=$.host.trim().toLowerCase();if(!/^[a-z0-9.-]+(:[0-9]+)?$/.test(X))throw Error("host must be a bare hostname, optionally with a port");let Y=await v4$($.type,X,$.token),G=await Z.storage.gitProviderAccounts.upsert({organizationId:Q.id,type:$.type,host:X,authKind:"token",externalAccountId:Y.externalAccountId,login:Y.login,avatarUrl:Y.avatarUrl,createdBy:n0(Z)??null});return await Z.storage.gitProviderAccountCredentials.upsert({connectionId:G.id,accessToken:$.token,refreshToken:null,scope:null,expiresAt:null,clientId:null,clientSecret:null,tokenEndpoint:null}),{account:xg$(G)}}}),lg$=g({name:"GIT_ACCOUNT_DELETE",description:"Disconnect a git provider account. Its repositories stay linked but lose credentials (they become anonymous clones) until linked to another account.",annotations:{title:"Disconnect git account",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},_meta:{ui:{visibility:"app"}},inputSchema:g$.object({id:g$.string()}),outputSchema:g$.object({deleted:g$.boolean()}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=n(Z);return{deleted:await Z.storage.gitProviderAccounts.delete($.id,Q.id)}}}),cg$=g({name:"REPOSITORY_LIST",description:"List the repositories linked to this organization.",annotations:{title:"List repositories",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},_meta:{ui:{visibility:"app"}},inputSchema:g$.object({accountId:g$.string().optional().describe("Only repositories of this account")}),outputSchema:g$.object({repositories:g$.array(Gp0.extend({usable:g$.boolean()}))}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=n(Z),X=await Z.storage.repositories.listByOrg(Q.id,{accountId:$.accountId}),Y=await JD(Z,Q.id),G=new Set(Y.map((J)=>J.webUrl.toLowerCase()));return{repositories:X.map((J)=>({...tZ1(J),usable:G.has(J.webUrl.toLowerCase())}))}}}),dg$=g({name:"REPOSITORY_SEARCH",description:"Search the repositories an account can reach on its provider (not yet linked). Feeds the repository picker.",annotations:{title:"Search provider repositories",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:g$.object({accountId:g$.string(),query:g$.string().optional(),page:g$.number().int().min(1).optional(),perPage:g$.number().int().min(1).max(100).optional()}),outputSchema:g$.object({repositories:g$.array(qY6),hasMore:g$.boolean()}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=n(Z),X=await yg$(Z,Q.id,$.accountId);return qj({db:Z.db,vault:Z.vault},X).listRepos({query:$.query,page:$.page,perPage:$.perPage})}}),mg$=g({name:"REPOSITORY_LINK",description:"Link a repository to the organization. With an account, the repository is verified against the provider and its facts (id, default branch, visibility) recorded; without one it is linked as an anonymous public clone.",annotations:{title:"Link repository",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:g$.object({url:g$.string().min(1).describe("Repository URL (https or ssh), or a bare path like owner/name when accountId is given"),accountId:g$.string().optional().describe("Account whose credentials access the repository")}),outputSchema:g$.object({repository:Gp0}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=n(Z),X=n0(Z)??null;if(!$.accountId){let H=QW($.url);if(!H)throw Error("Could not recognise the repository URL. Use a full https URL from GitHub or GitLab.");let F=await Z.storage.repositories.upsert({organizationId:Q.id,ref:H,createdBy:X});return{repository:tZ1(F)}}let Y=await yg$(Z,Q.id,$.accountId),G=QW($.url,{provider:Y.type,host:Y.host});if(!G)throw Error("Could not recognise the repository URL or path");if(G.host!==Y.host)throw Error(`Repository is on ${G.host} but the account is on ${Y.host}`);let W=await qj({db:Z.db,vault:Z.vault},Y).getRepo(G);if(!W)throw Error(`${G.path} was not found on ${G.host} or the account cannot access it`);let K=await Z.storage.repositories.upsert({organizationId:Q.id,ref:W.ref,accountId:Y.id,externalId:W.externalId,defaultBranch:W.defaultBranch,visibility:W.visibility,createdBy:X});return{repository:tZ1(K)}}}),ig$=g({name:"REPOSITORY_DELETE",description:"Unlink a repository from the organization. Agents, tasks and syncs that referenced it keep working off their legacy metadata until relinked.",annotations:{title:"Unlink repository",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},_meta:{ui:{visibility:"app"}},inputSchema:g$.object({id:g$.string()}),outputSchema:g$.object({deleted:g$.boolean()}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=n(Z);return{deleted:await Z.storage.repositories.delete($.id,Q.id)}}})});import{z as Q$}from"zod";async function kl($,Z){let Q=$.organization?.id;if(!Q)throw Error("Organization context required");let X=await Ut($,Q,hT0(Z));if(!X)throw Error(vg$);return X}var MY6,kY6,uT0,VY6,ng$,tg$,og$,rg$,sg$,ag$;var eg$=D(()=>{q0();tZ();pZ1();MY6=Q$.object({id:Q$.string().nullable(),name:Q$.string(),state:Q$.enum(["queued","running","completed"]),conclusion:Q$.enum(["success","failure","neutral","cancelled","skipped","timed_out","action_required"]).nullable(),url:Q$.string().nullable(),durationMs:Q$.number().nullable(),summary:Q$.string().nullable()}),kY6=Q$.object({id:Q$.string(),author:Q$.string(),body:Q$.string(),createdAt:Q$.string(),updatedAt:Q$.string(),url:Q$.string()}),uT0=Q$.object({number:Q$.number(),url:Q$.string(),title:Q$.string(),body:Q$.string(),state:Q$.enum(["open","closed","merged"]),draft:Q$.boolean(),mergedAt:Q$.string().nullable(),base:Q$.string(),head:Q$.string(),headSha:Q$.string(),headRepoPath:Q$.string().nullable(),author:Q$.string(),conflicting:Q$.boolean().nullable(),checks:Q$.enum(["pending","passing","failing"]).nullable(),changedFiles:Q$.number().nullable()}),VY6=uT0.extend({checkRuns:Q$.array(MY6),comments:Q$.array(kY6),unresolvedConversations:Q$.number(),reviewBlocked:Q$.boolean()}),ng$=g({name:"CHANGE_REQUEST_STATE",description:"Read a branch's change request with its CI runs, review state and comments.",annotations:{title:"Read Change Request State",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:Q$.object({...LN,branch:Q$.string().describe("Head branch of the change request to read")}),outputSchema:Q$.object({changeRequest:VY6.nullable()}),handler:async($,Z)=>{return await Z.access.check(),{changeRequest:await(await kl(Z,$)).readDetailed({branch:$.branch})}}}),tg$=g({name:"CHANGE_REQUEST_LAST_MERGED",description:"Read the most recently merged change request into a base branch \u2014 in Fast Preview, the last publish.",annotations:{title:"Read Last Merged Change Request",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:Q$.object({...LN,base:Q$.string().describe("Branch it was merged into")}),outputSchema:Q$.object({changeRequest:uT0.nullable()}),handler:async($,Z)=>{return await Z.access.check(),{changeRequest:await(await kl(Z,$)).lastMergedInto($.base)}}}),og$=g({name:"CHANGE_REQUEST_LIST_OPEN",description:"List a repository's open change requests, most recently updated first.",annotations:{title:"List Open Change Requests",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:Q$.object({...LN,limit:Q$.number().int().min(1).max(100).default(50)}),outputSchema:Q$.object({changeRequests:Q$.array(uT0)}),handler:async($,Z)=>{return await Z.access.check(),{changeRequests:await(await kl(Z,$)).listOpen($.limit)}}}),rg$=g({name:"CHANGE_REQUEST_CHECK_LOG",description:"Read one CI run's report \u2014 a GitHub check run's output markdown, or the tail of a GitLab job's trace.",annotations:{title:"Read CI Run Report",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:Q$.object({...LN,checkId:Q$.string().describe("Provider id of the run, from its listing")}),outputSchema:Q$.object({report:Q$.string().nullable()}),handler:async($,Z)=>{return await Z.access.check(),{report:await(await kl(Z,$)).readCheckLog($.checkId)}}}),sg$=g({name:"CHANGE_REQUEST_OPEN",description:"Propose a branch onto another. Returns the branch's existing change request instead of failing when it already has one.",annotations:{title:"Open Change Request",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:Q$.object({...LN,head:Q$.string().describe("Branch being proposed"),base:Q$.string().describe("Branch it should land on"),title:Q$.string(),body:Q$.string().optional()}),outputSchema:Q$.object({changeRequest:uT0,existed:Q$.boolean()}),handler:async($,Z)=>{await Z.access.check();let Q=await kl(Z,$),X=await Q.readForBranch($.head);if(X&&X.state==="open"){if($.body&&$.body!==X.body)await Q.describe(X.number,$.body);return{changeRequest:$.body?{...X,body:$.body}:X,existed:!0}}return{changeRequest:await Q.open({head:$.head,base:$.base,title:$.title,body:$.body}),existed:!1}}}),ag$=g({name:"CHANGE_REQUEST_MERGE",description:"Land a change request. Reports why it could not merge rather than throwing.",annotations:{title:"Merge Change Request",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:Q$.object({...LN,number:Q$.number().int().positive(),strategy:Q$.enum(["any","squash"]).default("any").describe("`squash` when the result must be one commit; `any` uses whatever the repository allows"),commitTitle:Q$.string().optional(),commitMessage:Q$.string().optional()}),outputSchema:Q$.object({merged:Q$.boolean(),reason:Q$.enum(["conflict","blocked","rate_limited","not_found","error"]).optional(),detail:Q$.string().optional()}),handler:async($,Z)=>{await Z.access.check();let X=await(await kl(Z,$)).merge($.number,{strategy:$.strategy,commitTitle:$.commitTitle,commitMessage:$.commitMessage});return X.merged?{merged:!0}:{merged:!1,reason:X.reason,detail:X.detail}}})});import{z as _6}from"zod";function lT0($){if(!$)return"";return typeof $==="string"?$:$.toISOString()}function $h$($){let Z=$.trim();return Z.length>0?Z:void 0}function Zh$($,Z){return $===void 0||$.includes(Z)}var CY6,_Y6,vY6,fY6,bY6,xY6,oZ1;var Qh$=D(()=>{q0();os0();CY6=["thread","task"],_Y6=_6.object({type:_6.literal("thread"),id:_6.string(),title:_6.string(),created_at:_6.string(),updated_at:_6.string(),virtual_mcp_id:_6.string().nullable(),run_config:_6.record(_6.string(),_6.unknown()).nullable(),status:_6.string().nullable()}),vY6=_6.object({type:_6.literal("task"),id:_6.string(),title:_6.string(),created_at:_6.string(),updated_at:_6.string(),key:_6.string().nullable(),status:_6.string().nullable(),repo:_6.string().nullable()}),fY6=_6.discriminatedUnion("type",[_Y6,vY6]),bY6=_6.object({query:_6.string().max(256).describe("Free-text search query. Empty string returns the most recently updated resources."),limit:_6.number().int().min(1).max(50).optional().describe("Maximum results per resource type (default: 20)."),types:_6.array(_6.enum(CY6)).optional().describe("Restrict the search to specific resource types. Omit to search across all available types.")}),xY6=_6.object({items:_6.array(fY6),totalCount:_6.number()});oZ1=g({name:"GLOBAL_SEARCH",description:"Search across organization resources by free-text query. Returns a typed union of matches (currently: threads and task-board cards). New resource types may be added over time without changes to the call shape.",annotations:{title:"Global Search",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:bY6,outputSchema:xY6,handler:async($,Z)=>{await Z.access.check();let Q=n(Z),X=$.limit??20,Y=Zh$($.types,"thread"),G=Zh$($.types,"task"),J=[],W=0;if(Y){let{threads:K,total:H}=await Z.storage.threads.list(void 0,{limit:X,offset:0,search:$h$($.query),includeArchived:!1});W+=H;for(let F of K)J.push({type:"thread",id:F.id,title:F.title??"",created_at:lT0(F.created_at),updated_at:lT0(F.updated_at),virtual_mcp_id:F.virtual_mcp_id??null,run_config:F.run_config??null,status:CJ(F).status})}if(G){let K=await Z.storage.taskBoard.searchByTitle(Q.id,$h$($.query)??"",X);W+=K.length;for(let H of K)J.push({type:"task",id:H.id,title:H.title??"",created_at:lT0(H.createdAt),updated_at:lT0(H.updatedAt),key:Q.slug?rL0(Q.slug,H.keySeq):null,status:H.status??null,repo:H.repo??null})}return{items:J,totalCount:W}}})});var Xh$=D(()=>{Qh$()});var d70={};T4(d70,{toolSubsetMCP:()=>rZ1,managementMCP:()=>Zu,managementContextStore:()=>aU,listManagementTools:()=>gY6,TOOL_BY_NAME:()=>Vl,CORE_TOOLS:()=>Gh$});import{z as Yh$}from"zod";async function gY6($){let Z=await Zu($),[Q,X]=Fn.createLinkedPair();await Z.connect(X);let Y=new d9({name:"tools-hydration",version:"1.0.0"},{jsonSchemaValidator:j5});try{return await Y.connect(Q),(await Y.listTools()).tools}finally{await Y.close().catch(()=>{}),await Z.close().catch(()=>{})}}var Gh$,Vl,rZ1=($,Z)=>{let Q=new TK({name:$,version:"1.0.0"},{capabilities:{tools:{}},jsonSchemaValidator:j5});for(let X of Z){let Y=Vl.get(X);if(!Y){console.warn(`[${$}] unknown tool "${X}" \u2014 not registered`);continue}let{config:G,handler:J}=na(Y);Q.registerTool(Y.name,G,J)}return Q},Zu=async($)=>{let Z=new TK({name:"mcp-cms-management",version:"1.0.0"},{capabilities:{tools:{},prompts:{},resources:{}},jsonSchemaValidator:j5});for(let Y of Vl.values()){let{config:G,handler:J}=na(Y);Z.registerTool(Y.name,G,J)}let Q=zT0();for(let Y of Q){let G=Y.arguments?.length?Object.fromEntries(Y.arguments.map((J)=>{let W=J.required?Yh$.string():Yh$.string().optional();return[J.name,J.description?W.describe(J.description):W]})):void 0;Z.registerPrompt(Y.name,{title:Y.title,description:Y.description,...G?{argsSchema:G}:{}},(J)=>{return{messages:[{role:"user",content:{type:"text",text:typeof Y.text==="function"?Y.text(J??{}):Y.text}}]}})}if($.organization?.id){let Y=await $.storage.brandContext.list($.organization.id),G=new Set;for(let J of Y){let W=J.name.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,""),K=W?`brand-${W}`:`brand-${J.id}`;if(G.has(K))K=`${K}-${J.id.slice(0,8)}`;G.add(K);let H=[`# Brand: ${J.name}`,"",`**Domain:** ${J.domain}`,"","## Overview",J.overview];if(J.colors){let U=Object.entries(J.colors).filter(([,N])=>N);if(U.length>0){H.push("","## Colors");for(let[N,B]of U)H.push(`- **${N}:** ${B}`)}}if(J.fonts){let U=Object.entries(J.fonts).filter(([,N])=>N);if(U.length>0){H.push("","## Fonts");for(let[N,B]of U)H.push(`- ${B} (${N})`)}}if(J.logo)H.push("",`**Logo:** ${J.logo}`);if(J.favicon)H.push(`**Favicon:** ${J.favicon}`);if(J.ogImage)H.push(`**OG Image:** ${J.ogImage}`);if(J.images&&J.images.length>0){H.push("","## Images");for(let U of J.images){let N=Object.entries(U).map(([B,O])=>`${B}: ${O}`).join(", ");H.push(`- ${N}`)}}let F=H.join(`
|
|
2682
2682
|
`);Z.prompt(K,`Brand context for ${J.name}`,()=>({messages:[{role:"user",content:{type:"text",text:F}}]}))}}let X=zb$();for(let Y of X)Z.resource(Y.name,Y.uri,{description:Y.description,mimeType:Y.mimeType??"text/markdown"},async(G)=>{return{contents:[{uri:typeof G==="string"?G:G.href,mimeType:Y.mimeType??"text/markdown",text:Y.text}]}});return Z};var gO=D(()=>{AK();Hi();XQ();T0$();b0$();N$$();w$$();_$$();g$$();v8$();eE$();Wj$();Bj$();Ej$();Gz$();Hz$();BT$();LT$();zT$();Af$();Sf$();_f$();gf$();of$();PZ1();PT0();PT0();pb$();kg$();Sg$();_g$();pg$();eg$();Xh$();Gh$=[ji0,zi0,Pi0,Ai0,Ti0,Ri0,qi0,$j$,Qj$,Yj$,Gj$,o_,p_,n_,t_,L01,E01,j01,P01,A01,T01,i_,R01,M01,k01,V01,S01,Ka0,f01,b01,x01,y01,C01,_01,jo0,Ii0,Mi0,ki0,Vi0,Si0,_i0,vi0,fi0,yi0,gi0,hi0,ui0,li0,ci0,di0,mi0,ii0,pi0,ni0,ti0,si0,ei0,Yp0,JZ1,BZ1,OZ1,Im0,Kj,Hj,mm0,im0,pm0,Em0,wm0,Om0,Dm0,Uj,Nj,Bj,Oj,Dj,D$$,Bi0,Oi0,Di0,wi0,Li0,Hm0,Um0,Nm0,Fm0,M11,k11,V11,m01,k_,V_,p01,n01,S_,h01,u01,l01,c01,d01,t01,o01,r01,z11,P11,A11,T11,R11,q11,I11,wj,Lj,Ej,Ni0,k81,V81,S81,C81,_81,v81,f81,b81,x81,y81,g81,l81,c81,OT$,DT$,wT$,i81,p81,e91,ZZ1,QZ1,XZ1,YZ1,GZ1,Cf$,vf$,ff$,bf$,xf$,yf$,mf$,if$,pf$,nf$,tf$,EZ1,jZ1,zZ1,f_,b_,x_,y_,AZ1,TZ1,RZ1,qZ1,IZ1,MZ1,...Mg$,Zs0,dZ1,mZ1,gg$,hg$,ug$,lg$,cg$,dg$,mg$,ig$,nZ1,ng$,tg$,og$,rg$,sg$,ag$,oZ1],Vl=new Map(Gh$.map(($)=>[$.name,$]))});import{z as Jh$}from"zod";function hY6($){return[{permissions:{self:["*"]},getTools:async()=>{let{CORE_TOOLS:Z}=await Promise.resolve().then(() => (gO(),d70));return Z.map((Q)=>{return{name:Q.name,inputSchema:Jh$.toJSONSchema(Q.inputSchema,{unrepresentable:"any"}),outputSchema:Q.outputSchema?Jh$.toJSONSchema(Q.outputSchema,{unrepresentable:"any"}):void 0,description:Q.description}})},data:Bc1(K9(),$)},{data:Nc1()},{data:Uc1($)}]}async function Wh$($,Z){try{let Q=Z8(),X=M0();await Q.db.insertInto("organization_billing").values({organization_id:$}).onConflict((W)=>W.column("organization_id").doNothing()).execute();let Y=new oQ(X.encryptionKey),G=new Li(Q.db,Y),J=hY6($);await Promise.all(J.map(async(W)=>{let K=null;if(W.permissions)K=(await Q8.api.createApiKey({body:{name:`${W.data.app_name??crypto.randomUUID()}-mcp`,userId:Z,permissions:W.permissions,rateLimitEnabled:!1,metadata:{organization:{id:$},purpose:"default-org-connections"}}}))?.key;let H=await Fg({id:"pending",title:W.data.title,connection_type:W.data.connection_type,connection_url:W.data.connection_url,connection_token:W.data.connection_token??K,connection_headers:W.data.connection_headers}).catch(()=>null),F=await W.getTools?.()??H?.tools??null,U=H?.scopes?.length?H.scopes:null,N=W.data.id?W.data.id.startsWith(`${$}_`)?W.data.id:`${$}_${W.data.id}`:void 0;await G.create({...W.data,id:N,tools:F,configuration_scopes:U,organization_id:$,created_by:Z,connection_token:W.data.connection_token??K})}));try{await Km0({orgId:$,createdBy:Z})}catch(W){console.error("Failed to enqueue studio pack install:",W)}if(X.aiGatewayEnabled&&X.studioProvisionSecretKey&&MO.provisionKey)try{let W=await UK(Z),K=await MO.provisionKey(W,$);await new Kn(Q.db,Y).upsert({providerId:"deco",label:"Auto-provisioned",apiKey:K,organizationId:$,createdBy:Z})}catch(W){console.error("Failed to auto-provision Deco AI Gateway key:",W)}}catch(Q){console.error("Error creating default MCP connections:",Q)}}var Kh$=D(()=>{k8();F70();C5();NJ();zB();pd0();ju0();N70();E$();JG();w70();jB()});import{createHash as uY6}from"crypto";function Hh$($){let Z=$;while(Z?.[cT0])Z=Z[cT0];return Z}function aZ1($){let{objectStorage:Z,baseUrl:Q,orgSlug:X,prefix:Y="connection-icons",maxBytes:G=cY6,dryRun:J=!1}=$;return async(W)=>{if(typeof W!=="string")return W;let K=W.match(lY6);if(!K)return W;if(!Z||!X)return W;let[,H,F]=K,U=H.toLowerCase(),N=mY6[U];if(!N)return W;if(Math.floor(F.length*3/4)>G)return console.warn(`[asset-hoister] asset exceeds ${G} bytes, keeping inline`),W;let B=Buffer.from(F,"base64"),O=uY6("sha256").update(B).digest("hex"),w=`${Y}/${O}.${N}`;if(J)return ab(Q,X,w);try{return await Z.put(w,B,{contentType:U}),ab(Q,X,w)}catch(L){return console.error("[asset-hoister] upload failed, keeping inline asset:",L),W}}}async function sZ1($,Z,Q=0){if(Q>dY6)return $;if(typeof $==="string")return await Z($)??$;if(Array.isArray($)){let X=await Promise.all($.map((Y)=>sZ1(Y,Z,Q+1)));return X.some((Y,G)=>Y!==$[G])?X:$}if($!==null&&typeof $==="object"){let X=Object.entries($),Y=await Promise.all(X.map(([,W])=>sZ1(W,Z,Q+1))),G=!1,J={};return X.forEach(([W,K],H)=>{if(J[W]=Y[H],Y[H]!==K)G=!0}),G?J:$}return $}async function Qe($,Z){let Q={...$};if(typeof Q.icon==="string")Q.icon=await Z(Q.icon);if(Q.metadata!==null&&typeof Q.metadata==="object")Q.metadata=await sZ1(Q.metadata,Z);return Q}function iY6($,Z){return new Proxy($,{get(Q,X,Y){if(X===cT0)return Q;if(X==="create")return async(J)=>Q.create(await Qe(J,Z));if(X==="createNew")return async(J)=>Q.createNew(await Qe(J,Z));if(X==="update")return async(J,W)=>Q.update(J,await Qe(W,Z));let G=Reflect.get(Q,X,Y);return typeof G==="function"?G.bind(Q):G}})}function pY6($,Z){return new Proxy($,{get(Q,X,Y){if(X===cT0)return Q;if(X==="create")return async(J,W,K,H)=>Q.create(J,W,await Qe(K,Z),H);if(X==="update")return async(J,W,K)=>Q.update(J,W,await Qe(K,Z));let G=Reflect.get(Q,X,Y);return typeof G==="function"?G.bind(Q):G}})}function eZ1($,Z){let Q=aZ1(Z);if(Fh$($.connections))$.connections=iY6(Hh$($.connections),Q);if(Fh$($.virtualMcps))$.virtualMcps=pY6(Hh$($.virtualMcps),Q)}function Fh$($){return $!==null&&typeof $==="object"}var lY6,cY6=5242880,dY6=64,cT0,mY6;var $71=D(()=>{T3();lY6=/^data:((?:image|audio|video)\/[^;,]+)(?:;[^,]+)?;base64,(.+)$/is,cT0=Symbol("assetHoistingTarget"),mY6={"image/png":"png","image/jpeg":"jpg","image/gif":"gif","image/webp":"webp","image/x-icon":"ico","image/vnd.microsoft.icon":"ico","audio/mpeg":"mp3","audio/mp4":"m4a","audio/wav":"wav","audio/x-wav":"wav","audio/ogg":"ogg","audio/webm":"weba","audio/aac":"aac","video/mp4":"mp4","video/webm":"webm","video/ogg":"ogv","video/quicktime":"mov"}});async function Uh$($,Z){let Q=tY();if(!Q)return Z;let X=await Z8().db.selectFrom("organization").select("slug").where("id","=",$).executeTakeFirst();if(!X?.slug)return Z;return await aZ1({objectStorage:R3(Q,$),baseUrl:K9(),orgSlug:X.slug,prefix:"org-logos"})(Z)??Z}var Nh$=D(()=>{NJ();dL();$71();C5()});function nY6($,Z){let Q=$.email.split("@")[1]?.toLowerCase()??null;return{distinctId:$.id,properties:{$set:{email:$.email,name:$.name,email_verified:$.emailVerified},$set_once:{first_seen_at:Z.toISOString(),signup_email_domain:Q}}}}function Z71($){V1.identify(nY6($,new Date))}var Bh$=D(()=>{g4()});import{adminAc as Oh$,memberAc as tY6}from"@decocms/better-auth/plugins/organization/access";function X71($){let Z=["*",...$];return{user:{self:[...P60],...tY6.statements},admin:{self:Z,...Oh$.statements},owner:{self:Z,...Oh$.statements}}}function oY6($,Z){for(let[Q,X]of Object.entries(Z)){let Y=$[Q];if(!Y)return!1;for(let G of X)if(!Y.includes(G)&&!Y.includes("*"))return!1}return!0}function Dh$($,Z,Q){if(!$)return"fallback";if($.includes(","))return"fallback";if(!Nx.includes($))return"fallback";let X=Q[$];if(!X)return"fallback";return oY6(X,Z)?"grant":"deny"}function wh$(){if(!Q71){let $=Object.values(oL()).flatMap((Z)=>Z.map((Q)=>Q.name));Q71=X71($)}return Q71}var Q71;var Y71=D(()=>{Ux();rQ()});import{decodeJwt as rY6}from"jose";import{sql as Xe}from"kysely";async function eY6($){let{user:Z,token:Q}=$;if(!Q?.idToken)return;let X;try{X=rY6(Q.idToken)}catch{return}let{preferred_username:Y,upn:G}=X,J=[Y,G].filter((H)=>typeof H==="string"&&H.length>0&&H.toLowerCase()!==Z.email.toLowerCase()).map((H)=>H.toLowerCase());if(J.length===0)return;let{db:W}=Z8(),K=await W.selectFrom("user").selectAll().where("email","in",J).where("id","!=",Z.id).executeTakeFirst();if(!K)return;try{await W.transaction().execute(async(H)=>{await Xe`UPDATE "account" SET "userId" = ${K.id} WHERE "userId" = ${Z.id}`.execute(H),await Xe`UPDATE "session" SET "userId" = ${K.id} WHERE "userId" = ${Z.id}`.execute(H),await Xe`
|
|
2683
2683
|
UPDATE "member" SET "userId" = ${K.id}
|
|
2684
2684
|
WHERE "userId" = ${Z.id}
|
|
@@ -2926,7 +2926,7 @@ Respond with ONLY a JSON object of this shape, and nothing else:
|
|
|
2926
2926
|
${G.join(`
|
|
2927
2927
|
`)}`:Y}function Jj6($){let Z=new Set;for(let Q of $)for(let X of Q.split(`
|
|
2928
2928
|
`)){let Y=X.trim();if(/^Co-authored-by:\s/i.test(Y))Z.add(Y)}return[...Z]}var Ln$=200,rE6=12,aE6,$j6=300,wR0=3;var kY1=D(()=>{tZ();DR0();aE6={aheadBy:0,behindBy:0,files:[]}});function Kj6($){if(!$||$.includes(".."))return!1;return Wj6.test($)}function jn$($){let Z=typeof $.__resolveType==="string"?$.__resolveType:null;if(!Z||!Kj6(Z))return null;let{__resolveType:Q,...X}=$;return{resolveType:Z,payload:X}}function zn$($,Z){return`${$.replace(/\/+$/,"")}/deco/invoke/${Z}`}var Wj6;var Pn$=D(()=>{Wj6=/^[\w./@-]+$/});function $00($,Z){let Q=$?.githubRepo;if(!Q?.owner||!Q?.name)return null;if(!Q.connectionId)return Q;if(!Z.includes(Q.connectionId))return null;return Q}async function Tn$($,Z,Q,X){let Y=$.organization?.id;if(!Y)throw new gw(wZ);let G=await GD($.storage,Y,X);if(G&&await EU($.storage,G)){let F=await tK($,G,{forceRefresh:!0}).catch((U)=>{throw new gw(U instanceof Error?U.message:wZ)});await An$($,Z,Q,F);return}let J=X.connectionId??G?.legacyConnectionId;if(!J)throw new gw("Push requires a connected git account. Connect the repository's provider for this project and restart the sandbox.");await gg({ctx:$,connectionId:J,organizationId:Y,forceRefresh:!0,onLegacyMintError:(F)=>{let U=F instanceof Error?F.message:wZ;throw new gw(U)}});let{cloneUrl:W,gitUserName:K,gitUserEmail:H}=await oK(J,X.owner,X.name,$.db,$.vault).catch((F)=>{let{code:U,message:N}=p4$(F instanceof Error?F.message:String(F));throw U?new gw(N):F});await An$($,Z,Q,{cloneUrl:W,gitUserName:K,gitUserEmail:H})}async function An$($,Z,Q,X){let{cloneUrl:Y,gitUserName:G,gitUserEmail:J}=X,W=Yc($),K=await Z.proxyDaemonRequest(Q,"/_sandbox/config",{method:"PUT",headers:new Headers({"content-type":"application/json"}),body:JSON.stringify({git:{repository:{cloneUrl:Y},identity:{userName:G,userEmail:J}},...W?{operator:W}:{}})});if(!K.ok){let H=await bD(K,Hj6).catch(()=>K.statusText);throw Error(`Failed to refresh sandbox git credentials (${K.status}): ${H}`)}}var Hj6=10485760,gw;var VY1=D(()=>{LJ();JR0();Po();vQ0();Dt();tZ();gw=class gw extends Error{constructor($){super($);this.name="GitPushAuthError"}}});function Uj6($){let Z=$.startsWith("thread:")?$.slice(7):$;if(!Z||Z.length>255||Z.includes("..")||Z.startsWith("/")||Z.endsWith("/")||Z.endsWith(".lock")||!Fj6.test(Z))throw Error(`Invalid branch name: ${$}`)}function If($){return AbortSignal.any([$.req.raw.signal,AbortSignal.timeout(Bj6)])}async function Dj6($,Z){let Q=$.var.studioContext,X=XH(Z.branch),Y=$.req.query("thread")??X,G=Y&&Y===X?Z.branchThread:Y?await Q.storage.threads.get(Y).catch(()=>null):null,J=G?.virtual_mcp_id===Z.virtualMcpId?G:null,W=R_(J?.metadata?.runtime);if(W)return W;let K=AL0(Z.virtualMcpMetadata),H=K==="cms"?await KY1(Q,{claimName:Z.claimName}):"alive",F=K==="cms"&&H!=="alive"?"cms":"sandbox",U=!!J&&(H==="gone"||H==="alive"&&K==="cms");if(U&&J)Ao(Q,J.id,F);if(K==="cms")console.log("sandbox proxy: no runtime stamp",{route:$.req.path,method:$.req.method,reason:J?"unstamped":"threadless",liveness:H,resolved:F,stamped:U});return F}async function wj6($){let Z=$.get("vmClaim");if(Z.runner)return Z.runner;try{return await EX($.var.studioContext)}catch{return null}}function Mf($){let{runner:Z}=$.get("vmClaim");if(!Z)return $.json({error:"No sandbox runner configured"},503);return Z}async function Hc($){let{virtualMcpMetadata:Z,connectionIds:Q}=$.get("vmClaim"),X=$.var.studioContext,Y=$00(Z,Q);if(!Y)throw new A1({provider:"github",status:404,message:"Project has no GitHub repository"});let G=n(X);return xg(X,G.id,Y)}function SY1($,Z){let Q=Z instanceof Error?Z.message:String(Z),X=f8$(Z);if(X!==void 0)return $.json({error:Q},429,{...N5,...X===null?{}:{"Retry-After":String(Math.ceil(X/1000))}});if(Z instanceof x5)return $.json({error:Q},409,N5);let Y=zJ(Z);if(Y!==null){let G=Y===404?404:Y===409||Y===422?409:502;return $.json({error:Q},G,N5)}return $.json({error:Q},502,N5)}async function In$($,Z,Q){let X;try{X=await fetch(Z,Q)}catch{return $.json({error:"Preview unreachable"},502)}let Y;try{Y=await X.text()}catch{return $.json({error:"Preview unreachable"},502)}return new Response(Y,{status:X.status,headers:{"content-type":X.headers.get("content-type")??"application/json"}})}async function Mn$($){try{let Z=await Hc($),Q=await LR0(Z,$.get("vmClaim").branch);return $.json(Q,200,N5)}catch(Z){return SY1($,Z)}}function Z00($,Z){let X=(zR0.get($)??Promise.resolve()).catch(()=>{}).then(Z),Y=X.catch(()=>{});return zR0.set($,Y),Y.finally(()=>{if(zR0.get($)===Y)zR0.delete($)}),X}async function G7($,Z,Q){if(!Q?.runner&&$.get("vmClaim").runtime==="cms")return $.json({error:"sandbox not found: this session is sandbox-less"},404,N5);let X=Q?.runner??Mf($);if(X instanceof Response)return X;let{claimName:Y,userId:G,projectRef:J}=$.get("vmClaim"),W=Q?.method??"POST",K=null,H=new Headers;if(Q?.jsonBody!==void 0)K=Q.jsonBody,H.set("content-type","application/json");else if(Q?.forwardJsonBody)K=await $.req.text(),H.set("content-type","application/json");let F=Q?.signal,U={method:W,headers:H,body:K,...F?{signal:F}:{}},N=async()=>{let B=await X.proxyDaemonRequest(Y,Z,U);if(Q?.map404to410&&B.status===404){try{await B.body?.cancel()}catch{}if(await X.adoptLiveClaim({userId:G,projectRef:J},Y))B=await X.proxyDaemonRequest(Y,Z,U);if(B.status===404){try{await B.body?.cancel()}catch{}return new Response(JSON.stringify({error:"Sandbox handle is gone. The sandbox needs to be re-provisioned."}),{status:410,headers:{"content-type":"application/json",...N5}})}}let O=await B.text(),w=Q?.redactRepoDir?Lj6(O):O,L=B.headers.get("content-type")??"application/json";return new Response(w,{status:B.status,headers:{"content-type":L,...N5}})};try{if(F){let B=N();return B.catch(()=>{}),await Promise.race([B,new Promise((w,L)=>{if(F.aborted)return L(F.reason);F.addEventListener("abort",()=>L(F.reason),{once:!0})})])}return await N()}catch(B){let O=B instanceof Error?B.message:String(B);return $.json({error:`Daemon unreachable: ${O}`},502)}}function Lj6($){try{let Z=JSON.parse($);if(Z&&typeof Z==="object"&&!Array.isArray(Z)&&"repoDir"in Z)return JSON.stringify({...Z,repoDir:null})}catch{}return $}async function PR0($,Z,Q,X="GET",Y){let G=await $.proxyDaemonRequest(Z,Q,{method:X,headers:new Headers,body:null});if(G.status===404&&Y){try{await G.body?.cancel()}catch{}if(await $.adoptLiveClaim(Y,Z))G=await $.proxyDaemonRequest(Z,Q,{method:X,headers:new Headers,body:null})}if(G.status===404){try{await G.body?.cancel()}catch{}throw Error("SANDBOX_GONE")}let J=await G.text();if(!G.ok){let W=`Daemon error (${G.status})`;try{W=JSON.parse(J).error??W}catch{}throw Error(W)}return JSON.parse(J)}function Ej6($){return kn$.includes($)}var Fj6,Rn$=524288,Nj6=65536,Bj6=1e4,qn$=2000,Oj6,zR0,N5,kn$,Vn$=()=>{let $=new Q1;$.use("/:virtualMcpId/:branch/*",Oj6),$.post("/:virtualMcpId/:branch/write",(Q)=>G7(Q,"/_sandbox/write",{forwardJsonBody:!0,signal:If(Q)})),$.post("/:virtualMcpId/:branch/unlink",(Q)=>G7(Q,"/_sandbox/unlink",{forwardJsonBody:!0,signal:If(Q)})),$.post("/:virtualMcpId/:branch/mkdir",(Q)=>G7(Q,"/_sandbox/mkdir",{forwardJsonBody:!0,signal:If(Q)})),$.post("/:virtualMcpId/:branch/rename",(Q)=>G7(Q,"/_sandbox/rename",{forwardJsonBody:!0,signal:If(Q)})),$.post("/:virtualMcpId/:branch/read",(Q)=>G7(Q,"/_sandbox/read",{forwardJsonBody:!0,signal:If(Q)})),$.post("/:virtualMcpId/:branch/glob",(Q)=>G7(Q,"/_sandbox/glob",{forwardJsonBody:!0,signal:If(Q)})),$.post("/:virtualMcpId/:branch/grep",(Q)=>G7(Q,"/_sandbox/grep",{forwardJsonBody:!0,signal:If(Q)})),$.post("/:virtualMcpId/:branch/exec/:script",async(Q)=>{let X=Q.req.param("script");if(!X)return Q.json({error:"missing script name"},400);return G7(Q,`/_sandbox/exec/${encodeURIComponent(X)}`)}),$.post("/:virtualMcpId/:branch/exec/:script/kill",async(Q)=>{let X=Q.req.param("script");if(!X)return Q.json({error:"missing script name"},400);return G7(Q,`/_sandbox/exec/${encodeURIComponent(X)}/kill`)}),$.get("/:virtualMcpId/:branch/config",(Q)=>G7(Q,"/_sandbox/config",{method:"GET",map404to410:!0,redactRepoDir:!0})),$.put("/:virtualMcpId/:branch/config",(Q)=>G7(Q,"/_sandbox/config",{method:"PUT",forwardJsonBody:!0,map404to410:!0})),$.post("/:virtualMcpId/:branch/setup/:step",async(Q)=>{let X=Q.req.param("step");if(!X||!Ej6(X))return Q.json({error:`step must be one of: ${kn$.join(", ")}`},400);let Y=Q.get("vmClaim"),G=await KY1(Q.var.studioContext,{claimName:Y.claimName})==="gone"?null:await wj6(Q);if(!G)return Q.json({error:"sandbox not found: nothing is running at this ref"},404,N5);if(X==="start"){let J=n(Q.var.studioContext),W=zh(Y.virtualMcpMetadata);try{await EL0({ctx:Q.var.studioContext,runner:G,handle:Y.claimName,orgId:J.id,userId:Y.callerUserId,entries:W})}catch(K){let H=K instanceof Error?K.message:String(K);return Q.json({error:`Failed to push env to daemon: ${H}`},502)}}return G7(Q,`/_sandbox/setup/${X}`,{signal:Q.req.raw.signal,map404to410:!0,runner:G})}),$.get("/:virtualMcpId/:branch/events",(Q)=>{let X=Q.get("vmClaim");if(!X.runner)return MN(Q,async(Y)=>{await Y.writeSSE({event:"phase",data:JSON.stringify({kind:"failed",reason:"unknown",message:"No sandbox runner configured on this studio instance."})})});return kp$(Q,{ctx:Q.var.studioContext,claimName:X.claimName,runner:X.runner,virtualMcpId:X.virtualMcpId,branch:X.branch,userId:X.userId,projectRef:X.projectRef,virtualMcpMetadata:X.virtualMcpMetadata})}),$.get("/:virtualMcpId/:branch/git/status",(Q)=>{if(Q.get("vmClaim").runtime==="cms")return Mn$(Q);return Z(Q)});let Z=(Q)=>G7(Q,"/_sandbox/git/status",{method:"GET",map404to410:!0,signal:AbortSignal.any([Q.req.raw.signal,AbortSignal.timeout(qn$)])});return $.post("/:virtualMcpId/:branch/git/status",(Q)=>{if(Q.get("vmClaim").runtime==="cms")return Mn$(Q);return G7(Q,"/_sandbox/git/status",{map404to410:!0,signal:AbortSignal.any([Q.req.raw.signal,AbortSignal.timeout(qn$)])})}),$.post("/:virtualMcpId/:branch/git/diff",async(Q)=>{let X=Q.get("vmClaim");if(X.runtime==="cms")try{let Y=await Q.req.json().catch(()=>({})),G=await Hc(Q),J=await ER0(G,X.branch,Y.base);return Q.json(J,200,N5)}catch(Y){return SY1(Q,Y)}return G7(Q,"/_sandbox/git/diff",{forwardJsonBody:!0,map404to410:!0})}),$.post("/:virtualMcpId/:branch/git/publish",async(Q)=>{if(Q.get("vmClaim").runtime==="cms")return Q.json({ok:!0},200,N5);let X=Mf(Q);if(X instanceof Response)return X;let{claimName:Y,virtualMcpMetadata:G,connectionIds:J}=Q.get("vmClaim"),W=Q.var.studioContext;return Z00(Y,async()=>{try{await HY1(W,X,Y);let K=$00(G,J);if(K)await Tn$(W,X,Y,K)}catch(K){if(K instanceof gw)return Q.json({error:K.message},403,N5);let H=K instanceof Error?K.message:String(K);return Q.json({error:H},502,N5)}return G7(Q,"/_sandbox/git/publish",{forwardJsonBody:!0,map404to410:!0})})}),$.post("/:virtualMcpId/:branch/git/discard",async(Q)=>{let X=Q.get("vmClaim");if(X.runtime==="cms")return Z00(X.claimName,async()=>{let Y=await Q.req.json().catch(()=>({})),G=Array.isArray(Y.filepaths)?Y.filepaths.filter((J)=>typeof J==="string"):[];if(G.length===0)return Q.json({error:"filepaths is required"},400,N5);try{let J=await Hc(Q);return await En$(J,X.branch,G),Q.json({ok:!0},200,N5)}catch(J){let W=zJ(J)===409||J instanceof x5?409:502,K=J instanceof Error?J.message:String(J);return Q.json({error:K},W,N5)}});return Z00(X.claimName,()=>G7(Q,"/_sandbox/git/discard",{forwardJsonBody:!0,map404to410:!0}))}),$.post("/:virtualMcpId/:branch/git/rebase",async(Q)=>{let X=Q.get("vmClaim");if(X.runtime==="cms")return Z00(X.claimName,async()=>{try{let W=await Q.req.json().catch(()=>({})),K=await Hc(Q),H=W.base??await K.getDefaultBranch();return await jR0(K,X.branch,H),Q.json({ok:!0},200,N5)}catch(W){return SY1(Q,W)}});let Y=Mf(Q);if(Y instanceof Response)return Y;let{claimName:G}=Q.get("vmClaim"),J=Q.var.studioContext;return Z00(G,async()=>{try{await HY1(J,Y,G)}catch(W){let K=W instanceof Error?W.message:String(W);return Q.json({error:K},502,N5)}return G7(Q,"/_sandbox/git/rebase",{forwardJsonBody:!0,map404to410:!0})})}),$.post("/:virtualMcpId/:branch/git/suggest-commit",Z9({maxSize:Rn$,onError:(Q)=>Q.json({error:"Payload too large"},413,N5)}),async(Q)=>{let X=Q.get("vmClaim"),Y=null;if(X.runtime!=="cms"){let H=Mf(Q);if(H instanceof Response)return H;Y=H}let{claimName:G,userId:J,projectRef:W}=X,K=Q.var.studioContext;try{let H=await Q.req.json().catch(()=>({})),F=H.status,U=H.diff,N=U!=null&&typeof U.diffs==="object"&&U.diffs!==null,[B,O]=NY1(F)&&N?[F,U]:Y?await Promise.all([PR0(Y,G,"/_sandbox/git/status","GET",{userId:J,projectRef:W}),PR0(Y,G,"/_sandbox/git/diff","GET",{userId:J,projectRef:W})]):await(async()=>{let L=await Hc(Q);return Promise.all([LR0(L,X.branch),ER0(L,X.branch)])})(),w=await vp$(K,B,O);return Q.json(w,200,N5)}catch(H){let F=H instanceof Error?H.message:String(H);if(F==="SANDBOX_GONE")return Q.json({error:"Sandbox handle is gone. The sandbox needs to be re-provisioned."},410,N5);return Q.json({error:F},502,N5)}}),$.post("/:virtualMcpId/:branch/git/judge-review",Z9({maxSize:Rn$,onError:(Q)=>Q.json({error:"Payload too large"},413,N5)}),async(Q)=>{let X=Q.get("vmClaim"),Y=null;if(X.runtime!=="cms"){let H=Mf(Q);if(H instanceof Response)return H;Y=H}let{claimName:G,userId:J,projectRef:W}=X,K=Q.var.studioContext;try{let H=await Q.req.json().catch(()=>({})),F=H.status,U=H.diff,N=U!=null&&typeof U.diffs==="object"&&U.diffs!==null,[B,O]=NY1(F)&&N?[F,U]:Y?await Promise.all([PR0(Y,G,"/_sandbox/git/status","GET",{userId:J,projectRef:W}),PR0(Y,G,"/_sandbox/git/diff","GET",{userId:J,projectRef:W})]):await(async()=>{let L=await Hc(Q);return Promise.all([LR0(L,X.branch),ER0(L,X.branch)])})(),w=await bp$(K,B,O,typeof H.language==="string"?H.language:void 0);return Q.json(w,200,N5)}catch(H){let F=H instanceof Error?H.message:String(H);if(F==="SANDBOX_GONE")return Q.json({error:"Sandbox handle is gone. The sandbox needs to be re-provisioned."},410,N5);return Q.json({error:F},502,N5)}}),$.get("/:virtualMcpId/:branch/preview-fetch",async(Q)=>{let X=Mf(Q);if(X instanceof Response)return X;let{claimName:Y}=Q.get("vmClaim"),G=Q.req.query("path");if(!G||!G.startsWith("/")||G.startsWith("//")||G.includes("..")||G.includes("\\"))return Q.json({error:"Path not allowed"},403);let J;try{J=await X.getPreviewUrl(Y)}catch{return Q.json({error:"Preview not available"},502)}if(!J)return Q.json({error:"Preview not available"},502);let W=J.replace(/\/+$/,"");return In$(Q,`${W}${G}`)}),$.post("/:virtualMcpId/:branch/preview-invoke",Z9({maxSize:Nj6,onError:(Q)=>Q.json({error:"Payload too large"},413)}),async(Q)=>{let X=Mf(Q);if(X instanceof Response)return X;let{claimName:Y}=Q.get("vmClaim"),G;try{G=await X.getPreviewUrl(Y)}catch{return Q.json({error:"Preview not available"},502)}if(!G)return Q.json({error:"Preview not available"},502);let J;try{J=await Q.req.json()}catch{return Q.json({error:"Invalid JSON body"},400)}if(!J||typeof J!=="object"||Array.isArray(J))return Q.json({error:"Invalid JSON body"},400);let W=jn$(J);if(!W)return Q.json({error:"Invalid or missing __resolveType"},400);let K=zn$(G,W.resolveType);return In$(Q,K,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(W.payload),signal:AbortSignal.timeout(30000)})}),$};var Sn$=D(()=>{u$();rH();Xc();WY1();Lo();qp$();RJ();Ph();Ip$();FW();Mp$();Vp$();ar0();jo();DY1();xp$();tZ();lZ();kY1();Pn$();VY1();Fj6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;Oj6=GR0(async($,Z)=>{let Q=$.var.studioContext;try{t(Q)}catch{return $.json({error:"Unauthorized"},401)}let X=n0(Q);if(!X)return $.json({error:"Unauthorized"},401);let Y;try{Y=n(Q)}catch{return $.json({error:"Organization scope required"},403)}let G=$.req.param("virtualMcpId"),J=$.req.param("branch");if(!G||!J)return $.json({error:"virtualMcpId and branch are required"},400);try{Uj6(J)}catch(w){let L=w instanceof Error?w.message:String(w);return $.json({error:L},400)}let W=await Q.storage.virtualMcps.findById(G);if(!W||W.organization_id!==Y.id)return $.json({error:"Virtual MCP not found"},404);let K=ut({orgId:Y.id,virtualMcpId:G,branch:J}),H=await Bo0(Q,J),F=Oo0(H,X),U=Rp$({userId:F,projectRef:K}),N=W.metadata??null,B=await Dj6($,{claimName:U,branch:J,virtualMcpId:G,sandboxUserId:F,virtualMcpMetadata:N,branchThread:H});if(B==="cms")return $.set("vmClaim",{claimName:U,callerUserId:X,runner:null,virtualMcpId:G,branch:J,userId:F,projectRef:K,virtualMcpMetadata:N,connectionIds:W.connections?.map((w)=>w.connection_id)??[],runtime:B}),Z();let O;try{O=await EX(Q)}catch{O=null}if(!O)return $.json({error:"No sandbox runner found"},404);return $.set("vmClaim",{claimName:U,callerUserId:X,runner:O,virtualMcpId:G,branch:J,userId:F,projectRef:K,virtualMcpMetadata:N,connectionIds:W.connections?.map((w)=>w.connection_id)??[],runtime:B}),Z()});zR0=new Map;N5={"Cache-Control":"no-store, no-cache, must-revalidate",Pragma:"no-cache"};kn$=["clone","install","start"]});function Cn$($,Z,Q){let X=CY1.get($);if(!X)X={pending:null,running:!1},CY1.set($,X);if(!X.pending)X.pending={set:new Map,del:new Set,deps:Z,resolvers:[],rejecters:[]};let Y=X.pending;Y.deps=Z;for(let[J,W]of Object.entries(Q.set??{}))Y.set.set(J,W),Y.del.delete(J);for(let J of Q.delete??[])Y.del.add(J),Y.set.delete(J);let G=new Promise((J,W)=>{Y.resolvers.push(J),Y.rejecters.push(W)});if(!X.running)zj6($,X);return G}async function zj6($,Z){Z.running=!0;try{while(Z.pending){let Q=Z.pending;Z.pending=null;try{let X=await Pj6(Q);for(let Y of Q.resolvers)Y(X)}catch(X){for(let Y of Q.rejecters)Y(X)}}}finally{if(Z.running=!1,!Z.pending)CY1.delete($)}}async function Pj6($){let{client:Z,branch:Q,packagePath:X}=$.deps,Y=new Map;for(let G=0;;G++){let J=await Kc(Z,Q),W=await Z.listDecofileEntries(J,X),K=qY1(W,X),H=[],F=new Map(K.map((N)=>[N.path,{stem:N.stem,sha:N.sha}]));for(let[N,B]of $.set){let O=IY1(K,N),w=`${JSON.stringify(B,null,2)}
|
|
2929
|
-
`;await Bn$(Z.repo,w);let L=O[0]??`${OR0(X)}/${EY1(N)}.json`;H.push({path:L,content:w});let E=L.slice(L.lastIndexOf("/")+1,-5);F.set(L,{stem:E,content:w});for(let j of O.slice(1))H.push({path:j,deleted:!0}),F.delete(j)}for(let N of $.del)for(let B of IY1(K,N))H.push({path:B,deleted:!0}),F.delete(B);if(H.length===0)return J;let U=X?`${X}/.deco/blocks.gen.json`:".deco/blocks.gen.json";if(W.some((N)=>N.type==="blob"&&N.path===U)){let N=await On$(Z,F.values(),Y),{decofile:B,skipped:O}=te(N);if(O.length>0)console.warn("decofile gen: dropped blocks that were not valid JSON",{repo:XW(Z.repo),branch:Q,packagePath:X,blocks:O.map((w)=>w.key)});H.push({path:U,content:B})}try{let{sha:N}=await Z.commitFiles({branch:Q,message:Aj6($),expectedHead:J,changes:H});return N}catch(N){if(!(N instanceof x5)||G>=jj6-1)throw N;await z$(K7(2000,200,G,2,0.5))}}}function Aj6($){let Z=(Y)=>{let G=Y.slice(0,3).join(", ");return Y.length>3?`${G} (+${Y.length-3} more)`:G},Q=[];if($.set.size>0)Q.push(`update ${Z([...$.set.keys()])}`);if($.del.size>0)Q.push(`delete ${Z([...$.del])}`);let X=`chore(decofile): ${Q.join("; ")}`;return ut0(X,$.deps.coAuthor)}var jj6=3,CY1;var _n$=D(()=>{Jw0();KR0();y5();f8();tZ();DR0();CY1=new Map});import{createHmac as vn$,randomBytes as Tj6,timingSafeEqual as Rj6}from"crypto";function fn$(){if(AR0)return AR0;let $;try{let Z=M0();$=Z.studioJwtSecret??Z.betterAuthSecret}catch{$=void 0}return AR0=$?Buffer.from($):Tj6(32),AR0}function _Y1($){let Z=$.nowMs??Date.now(),Q={o:$.organizationId,m:$.virtualMcpId,b:$.branch,e:Math.floor((Z+qj6)/1000)},X=Buffer.from(JSON.stringify(Q)).toString("base64url"),Y=vn$("sha256",fn$()).update(X).digest("base64url");return`${X}.${Y}`}function bn$($,Z){let Q=$.indexOf(".");if(Q<0)return!1;let X=$.slice(0,Q),Y=Buffer.from($.slice(Q+1)),G=Buffer.from(vn$("sha256",fn$()).update(X).digest("base64url"));if(Y.length!==G.length||!Rj6(Y,G))return!1;let J;try{J=JSON.parse(Buffer.from(X,"base64url").toString())}catch{return!1}let W=Math.floor((Z.nowMs??Date.now())/1000);return J.o===Z.organizationId&&J.m===Z.virtualMcpId&&J.b===Z.branch&&typeof J.e==="number"&&J.e>=W}var qj6=21600000,AR0=null;var xn$=D(()=>{E$()});import{z as Fc}from"zod";function Mj6($){return $.length>0&&$.length<=255&&!$.includes("..")&&!$.endsWith("/")&&!$.endsWith(".lock")&&Ij6.test($)}function ln$($){return $.req.header("x-forwarded-host")??new URL($.req.url).host}async function Q00($){let Z=$.get("decofileScope");return xg($.var.studioContext,Z.organizationId,Z.githubRepo)}function X00($,Z){let Q=Z instanceof Error?Z.message:String(Z);if(Z instanceof x5)return $.json({error:Q},409);let X=zJ(Z);if(X!==null){let Y=X===404?404:X===409||X===422?409:502;return $.json({error:Q},Y)}return $.json({error:Q},500)}function cn$(){let $=new Q1;return $.use("/:virtualMcpId/:branch",un$),$.use("/:virtualMcpId/:branch/*",un$),$.get("/:virtualMcpId/:branch",async(Z)=>{let Q=Z.get("decofileScope");try{let X=await Q00(Z),Y=await Dn$(X,Q.branch,Q.packagePath,{createBranchIfMissing:!!Q.userId}),G={ETag:`"${Y.sha}"`,"Cache-Control":"no-store","Access-Control-Allow-Origin":"*"};if(Z.req.header("if-none-match")===`"${Y.sha}"`)return Z.body(null,304,G);if(!Q.userId)return Z.body(Y.decofile,200,{...G,"content-type":"application/json"});let J=_Y1({organizationId:Q.organizationId,virtualMcpId:Q.virtualMcpId,branch:Q.branch});return Z.body(`{"version":${JSON.stringify(Y.sha)},"token":${JSON.stringify(J)},"apiHost":${JSON.stringify(ln$(Z))},"decofile":${Y.decofile}}`,200,{...G,"content-type":"application/json"})}catch(X){return X00(Z,X)}}),$.get("/:virtualMcpId/:branch/meta",async(Z)=>{let Q=Z.get("decofileScope"),X=Q.packagePath?`${Q.packagePath}/.deco/meta.gen.json`:".deco/meta.gen.json";try{let Y=await Q00(Z),G=await Y.readFileAtRef(Q.branch,X);if(G===null){let J=await Y.getDefaultBranch();if(J!==Q.branch)G=await Y.readFileAtRef(J,X)}if(G===null)return Z.json({error:"meta.gen.json not committed"},404);return Z.body(G,200,{"content-type":"application/json","Cache-Control":"no-store","Access-Control-Allow-Origin":"*"})}catch(Y){return X00(Z,Y)}}),$.patch("/:virtualMcpId/:branch",Vj6,async(Z)=>{let Q=Z.get("decofileScope"),X=Z.var.studioContext,Y=Sj6.safeParse(await Z.req.json().catch(()=>null));if(!Y.success)return Z.json({error:"Invalid body",details:Y.error.issues},400);let G=Y.data;for(let J of[...Object.keys(G.set??{}),...G.delete??[]])try{WR0(J)}catch(W){let K=W instanceof Error?W.message:String(W);return Z.json({error:K},400)}for(let[J,W]of Object.entries(G.set??{})){if(typeof W!=="object"||W===null||Array.isArray(W))return Z.json({error:`Block "${J}" must be a JSON object`},400);if(LY1(J))return Z.json({error:`Block key "${J}" collides with a framework resolver module and cannot be written`},400)}try{let J=await Q00(Z),W=await Cn$(`${Q.organizationId}/${Q.virtualMcpId}/${Q.branch}`,{client:J,branch:Q.branch,packagePath:Q.packagePath,coAuthor:Yc(X)},G),K=_Y1({organizationId:Q.organizationId,virtualMcpId:Q.virtualMcpId,branch:Q.branch});return Z.json({version:W,token:K,apiHost:ln$(Z)})}catch(J){return X00(Z,J)}}),$.post("/:virtualMcpId/:branch/publish",async(Z)=>{let Q=Z.get("decofileScope");try{let X=await Q00(Z),Y=await X.getDefaultBranch();if(Y===Q.branch)return Z.json({error:"Branch is already the default branch"},400);let G=`chore(decofile): publish ${Q.branch}`;try{let J;try{J=await X.mergeBranches(Y,Q.branch,G)}catch(W){if(zJ(W)!==409)throw W;await jR0(X,Q.branch,Y),J=await X.mergeBranches(Y,Q.branch,G)}return J?Z.json({result:"merged",sha:J}):Z.json({result:"up-to-date"})}catch(J){if(zJ(J)===409)return Z.json({error:"merge-conflict"},409);if(zJ(J)===405){let K=await X.findOpenChangeRequest(Y,Q.branch)??await X.createChangeRequest({base:Y,head:Q.branch,title:`Publish ${Q.branch}`});return Z.json({result:"pull-request",number:K.number,url:K.url})}throw J}}catch(X){return X00(Z,X)}}),$.get("/:virtualMcpId/:branch/status",async(Z)=>{let Q=Z.get("decofileScope");try{let X=await Q00(Z),Y=await X.getDefaultBranch();if(Y===Q.branch)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0,lastCommitAt:null});try{let[{aheadBy:G,behindBy:J},W]=await Promise.all([X.compare(Y,Q.branch),X.getBranch(Q.branch)]);return Z.json({baseBranch:Y,aheadBy:G,behindBy:J,lastCommitAt:W?.committedAt??null})}catch(G){if(zJ(G)===404)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0,lastCommitAt:null});throw G}}catch(X){return X00(Z,X)}}),$}var Ij6,yn$=500,gn$=1048576,hn$=1024,kj6=8388608,Vj6,Sj6,un$;var dn$=D(()=>{er0();KR0();u$();rH();WY1();JR0();VY1();tZ();_n$();xn$();kY1();DR0();Ij6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;Vj6=Z9({maxSize:kj6,onError:($)=>$.json({error:"Payload too large"},413)}),Sj6=Fc.object({set:Fc.record(Fc.string(),Fc.unknown()).optional(),delete:Fc.array(Fc.string()).optional()}).refine(($)=>Object.keys($.set??{}).length>0||($.delete?.length??0)>0,{message:"Patch must set or delete at least one block"}).refine(($)=>Object.keys($.set??{}).length+($.delete?.length??0)<=yn$,{message:`Patch cannot touch more than ${yn$} blocks`}).refine(($)=>Object.values($.set??{}).every((Z)=>JSON.stringify(Z).length<=gn$),{message:`Each block must be at most ${gn$} bytes`}).refine(($)=>[...Object.keys($.set??{}),...$.delete??[]].every((Z)=>Z.length<=hn$),{message:`Each block key must be at most ${hn$} characters`}),un$=GR0(async($,Z)=>{let Q=$.var.studioContext,X=Q.organization;if(!X)return $.json({error:"Organization scope required"},500);let Y=$.req.param("virtualMcpId"),G=$.req.param("branch");if(!Y||!G)return $.json({error:"virtualMcpId and branch are required"},400);if(!Mj6(G))return $.json({error:`Invalid branch name: ${G}`},400);let J=Q.auth?.user?.id??null;if(!J){let B=$.req.query("token");if(!($.req.method==="GET"&&!$.req.path.match(/\/(publish|status)$/)))return $.json({error:"Unauthorized"},401);if(!B||!bn$(B,{organizationId:X.id,virtualMcpId:Y,branch:G}))return $.json({error:"Unauthorized"},401)}let W=await Q.storage.virtualMcps.findById(Y);if(!W||W.organization_id!==X.id)return $.json({error:"Virtual MCP not found"},404);let K=W.metadata??null;if(!PL0(K))return $.json({error:"Project has no preview server configured"},404);let F=W.connections?.map((B)=>B.connection_id)??[],U=$00(K,F);if(!U)return $.json({error:"Project has no GitHub repository"},404);let N=K?.runtime;return $.set("decofileScope",{organizationId:X.id,virtualMcpId:Y,branch:G,packagePath:N?.path?.replace(/^\/+|\/+$/g,"")||null,githubRepo:U,userId:J}),Z()})});var mn$=($)=>{let Z=new Q1;if(Z.use("*",Uf),Z.use("*",Ic$),Z.route("/",E20()),Z.route("/",Jd$()),Z.route("/",rc$()),Z.route("/",Up$()),Z.route("/",Kp$()),Z.route("/",QR0()),Z.route("/tools",Ep$()),Z.route("/",Dp$()),Z.route("/",hi$({kvStorage:$.kvStorage})),Z.route("/",yi$()),Z.route("/fs",ei$({getConnection:$.getNatsConnection})),Z.route("/sandbox",Vn$()),Z.route("/decofile",cn$()),Z.route("/",Gp$()),Z.route("/",Zp$()),Z.route("/deco-sites",z20()),Z.route("/hosting",hc$()),Z.route("/monitor",pc$()),Z.route("/sso",N20()),Z.route("/",XR0({tokenStorage:$.tokenStorage,automationEventDispatcher:$.automationEventDispatcher})),Z.route("/webhooks",fc$()),$.mountDevAssets)Z.route("/dev-assets",R20({orgFromPath:!0}));return Z.use("/mcp/:connectionId?",$.mcpAuth),Z.use("/mcp/:connectionId/ui-resource",$.mcpAuth),Z.use("/mcp/gateway/:virtualMcpId?",$.mcpAuth),Z.use("/mcp/virtual-mcp/:virtualMcpId?",$.mcpAuth),Z.use("/mcp/self",$.mcpAuth),Z.use("/mcp/task-run/:threadId",$.mcpAuth),Z.route("/",ah$()),Z.get("/mcp/:gateway?/:connectionId/.well-known/oauth-protected-resource/*",$.betterAuthProtectedResourceHandler),Z.get("/mcp/.well-known/oauth-protected-resource",$.betterAuthProtectedResourceHandler),Z.route("/mcp/task-run",Xp$()),Z.route("/mcp",Rj0()),Z.route("/mcp/self",ZR0()),Z.route("/mcp",Mj0()),Z.all("/oauth-proxy/:connectionId/*",$.oauthProxyHandler),Z.get("/watch",$.watchHandler),Z};var in$=D(()=>{u$();Mc$();K20();bc$();MQ1();uc$();nc$();q20();Ee();AQ1();bQ1();gi$();ui$();$p$();Qp$();Tr();wQ1();kj0();$Y1();Yp$();Jp$();Hp$();Np$();wp$();QY1();jp$();XY1();qj0();Sn$();dn$()});function Cj6($){return $.filter((Z)=>Z.vendors?.alias).map((Z)=>({name:Z.name,title:Z.title,description:Z.description,logo:Z.logo,category:Z.category,vendor:{alias:Z.vendors.alias,url:Z.vendors.url}}))}var _j6=async($,Z)=>{if(!$.get("studioContext").auth.user?.id)return $.json({error:"Unauthorized"},401);return Z()},pn$=()=>{let $=new Q1;return $.use("*",_j6),$.get("/",async(Z)=>{let Q=M0(),X=Q.decoSupabaseUrl,Y=Q.decoSupabaseServiceKey;if(!X||!Y)return Z.json({apps:[]});try{let G=await _Y(X,Y,"apps?select=name,title,description,logo,category,vendors(alias,url)");return Z.json({apps:Cj6(G)})}catch(G){return console.error("[deco-apps] GET error:",G),Z.json({error:"Failed to fetch apps"},502)}}),$};var nn$=D(()=>{u$();E$();ET0()});import{z as M1}from"zod";function QF($,Z="invalid_request_error",Q=null,X=null){return{error:{message:$,type:Z,param:Q,code:X}}}function cj6($){if(!$)return null;let Z=$.indexOf(":");if(Z===-1)return{credentialId:null,modelId:$};let Q=$.substring(0,Z),X=$.substring(Z+1);if(!Q||!X)return null;return{credentialId:Q,modelId:X}}function dj6($,Z,Q){try{return JSON.parse($)}catch{throw new rn$(`Invalid JSON in tool call arguments for function '${Q}' (tool_call_id: ${Z}): ${$}`)}}function mj6($){let Z={};for(let Q of $)if(Q.role==="assistant"&&Q.tool_calls)for(let X of Q.tool_calls)Z[X.id]=X.function.name;return $.map((Q)=>{switch(Q.role){case"system":return{role:"system",content:Q.content};case"user":if(typeof Q.content==="string")return{role:"user",content:Q.content};return{role:"user",content:Q.content.map((Y)=>{if(Y.type==="text")return{type:"text",text:Y.text};return{type:"image",image:Y.image_url.url}})};case"assistant":if(Q.tool_calls&&Q.tool_calls.length>0)return{role:"assistant",content:Q.tool_calls.map((Y)=>({type:"tool-call",toolCallId:Y.id,toolName:Y.function.name,input:dj6(Y.function.arguments,Y.id,Y.function.name)}))};return{role:"assistant",content:Q.content??""};case"tool":let X=Z[Q.tool_call_id]??"unknown";return{role:"tool",content:[{type:"tool-result",toolCallId:Q.tool_call_id,toolName:X,output:{type:"text",value:Q.content}}]}}})}function ij6($){let Z=$.map((Q)=>{let X=Q.function.parameters?LG(Q.function.parameters):LG({type:"object",properties:{}});return[Q.function.name,W$({description:Q.function.description,inputSchema:X})]});return Object.fromEntries(Z)}function pj6($){if(!$)return;return{openai:{response_format:$}}}function nj6(){return`chatcmpl-${crypto.randomUUID().replace(/-/g,"").substring(0,29)}`}function tn$($,Z,Q,X,Y,G){let J={model:$,messages:Z,tools:Q,temperature:X.temperature,maxTokens:X.max_tokens,topP:X.top_p,frequencyPenalty:X.frequency_penalty,presencePenalty:X.presence_penalty,stopSequences:X.stop?Array.isArray(X.stop)?X.stop:[X.stop]:void 0,abortSignal:G};return Y?{...J,providerOptions:Y}:J}function on$($){if($==="tool-calls")return"tool_calls";if($==="length")return"length";return"stop"}var vj6=256,fj6,bj6,xj6,yj6,gj6,hj6,uj6,lj6,rn$,sn$,an$;var en$=D(()=>{S4();u$();Xc();GN();fj6=M1.object({type:M1.literal("function"),function:M1.object({name:M1.string(),description:M1.string().optional(),parameters:M1.record(M1.string(),M1.unknown()).optional()})}),bj6=M1.object({id:M1.string(),type:M1.literal("function"),function:M1.object({name:M1.string(),arguments:M1.string()})}),xj6=M1.discriminatedUnion("role",[M1.object({role:M1.literal("system"),content:M1.string(),name:M1.string().optional()}),M1.object({role:M1.literal("user"),content:M1.union([M1.string(),M1.array(M1.union([M1.object({type:M1.literal("text"),text:M1.string()}),M1.object({type:M1.literal("image_url"),image_url:M1.object({url:M1.string(),detail:M1.string().optional()})})]))]),name:M1.string().optional()}),M1.object({role:M1.literal("assistant"),content:M1.string().nullable().optional(),name:M1.string().optional(),tool_calls:M1.array(bj6).optional()}),M1.object({role:M1.literal("tool"),content:M1.string(),tool_call_id:M1.string()})]),yj6=M1.object({type:M1.literal("text")}),gj6=M1.object({type:M1.literal("json_object")}),hj6=M1.object({type:M1.literal("json_schema"),json_schema:M1.object({name:M1.string(),description:M1.string().optional(),schema:M1.record(M1.string(),M1.unknown()),strict:M1.boolean().optional()})}),uj6=M1.union([yj6,gj6,hj6]),lj6=M1.object({model:M1.string().describe("Format: 'model_id' or 'credential_id:model_id'"),messages:M1.array(xj6),stream:M1.boolean().optional().default(!1),temperature:M1.number().min(0).max(2).optional(),max_tokens:M1.number().positive().optional(),top_p:M1.number().min(0).max(1).optional(),frequency_penalty:M1.number().min(-2).max(2).optional(),presence_penalty:M1.number().min(-2).max(2).optional(),stop:M1.union([M1.string(),M1.array(M1.string())]).optional(),tools:M1.array(fj6).optional(),tool_choice:M1.union([M1.literal("auto"),M1.literal("none"),M1.literal("required"),M1.object({type:M1.literal("function"),function:M1.object({name:M1.string()})})]).optional(),response_format:uj6.optional(),user:M1.string().optional()});rn$=class rn$ extends Error{constructor($){super($);this.name="MessageConversionError"}};sn$=new Q1;sn$.post("/:org/v1/chat/completions",async($)=>{let Z=$.get("studioContext"),Q=$.req.param("org");try{if(!Z.auth.apiKey?.id)return $.json(QF("API key authentication required. Provide a valid API key via Authorization header.","authentication_error"),401);if(!Z.organization)return $.json(QF("Organization context is required. Ensure your API key has organization metadata.","invalid_request_error","organization"),400);if((Z.organization.slug??Z.organization.id)!==Q)return $.json(QF("Organization mismatch. The API key's organization does not match the requested organization.","invalid_request_error","organization"),403);let X=await $.req.json(),Y=lj6.safeParse(X);if(!Y.success){let L=Y.error.issues[0]??{message:"Invalid request",path:[]};return $.json(QF(`Invalid request: ${L.message}`,"invalid_request_error",L.path.length>0?L.path.join("."):null),400)}let G=Y.data,J=cj6(G.model);if(!J)return $.json(QF("Invalid model format. Expected 'model_id' or 'credential_id:model_id' (e.g., 'claude-sonnet-4-6' or 'key_abc123:claude-sonnet-4-6')","invalid_request_error","model"),400);let{credentialId:W}=J,{modelId:K}=J;if(!W){let E=(await Z.storage.aiProviderKeys.list({organizationId:Z.organization.id})).find((j)=>tL(j.providerId));if(!E)return $.json(QF("No AI provider credentials configured for this organization. Add a credential in settings or specify one explicitly via 'credential_id:model_id'.","invalid_request_error","model"),400);W=E.id}let H;try{H=await Z.aiProviders.activate(W,Z.organization.id)}catch{return $.json(QF(`AI provider credential not found or inaccessible: ${W}`,"invalid_request_error","model"),404)}let F=H.aiSdk.languageModel(K),U=mj6(G.messages),N=G.tools?ij6(G.tools):void 0,B=pj6(G.response_format),O=nj6(),w=Math.floor(Date.now()/1000);if(G.stream)return MN($,async(L)=>{let E=tn$(F,U,N,G,B,$.req.raw.signal);try{let j=SD(E),z=!1,P=0,A="",q=async()=>{if(A.length===0)return;let k=A;A="",await L.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:w,model:G.model,choices:[{index:0,delta:{content:k},finish_reason:null}]})})};for await(let k of j.fullStream){if(!z&&(k.type==="text-delta"||k.type==="tool-call"))await L.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:w,model:G.model,choices:[{index:0,delta:{role:"assistant",content:""},finish_reason:null}]})}),z=!0;if(k.type==="text-delta"){if(A+=k.text,A.length>=vj6)await q()}else if(k.type==="tool-call"){await q();let M=P++;await L.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:w,model:G.model,choices:[{index:0,delta:{tool_calls:[{index:M,id:k.toolCallId,type:"function",function:{name:k.toolName,arguments:JSON.stringify(k.input)}}]},finish_reason:null}]})})}else if(k.type==="finish")await q(),await L.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:w,model:G.model,choices:[{index:0,delta:{},finish_reason:on$(k.finishReason)}],usage:k.totalUsage?{prompt_tokens:k.totalUsage.inputTokens??0,completion_tokens:k.totalUsage.outputTokens??0,total_tokens:k.totalUsage.totalTokens??0}:void 0})})}await q(),await L.writeSSE({data:"[DONE]"})}catch(j){let z=j;console.error("[openai-compat:stream] Error:",z.message),await L.writeSSE({data:JSON.stringify({error:{message:z.message,type:"server_error"}})})}});else{let L=tn$(F,U,N,G,B,$.req.raw.signal),E=await kD(L),j={role:"assistant",content:E.text||null};if(E.toolCalls&&E.toolCalls.length>0)j.tool_calls=E.toolCalls.map((z)=>({id:z.toolCallId,type:"function",function:{name:z.toolName,arguments:JSON.stringify("input"in z?z.input:{})}})),j.content=null;return $.json({id:O,object:"chat.completion",created:w,model:G.model,choices:[{index:0,message:j,finish_reason:on$(E.finishReason)}],usage:{prompt_tokens:E.usage?.inputTokens??0,completion_tokens:E.usage?.outputTokens??0,total_tokens:E.usage?.totalTokens??0}})}}catch(X){let Y=X;if(Y.name==="AbortError")return $.json(QF("Request aborted","invalid_request_error"),400);if(Y.name==="MessageConversionError")return $.json(QF(Y.message,"invalid_request_error","messages"),400);return console.error("[openai-compat] Error:",Y.message,Y.stack),$.json(QF(Y.message,"server_error"),500)}});an$=sn$});function tj6($){if(typeof $!=="object"||$===null)return!1;let Q=$.githubRepo?.url;return typeof Q==="string"&&Q.length>0}function $t$(){let $=new Q1;return $.use("*",async(Z,Q)=>{await Q(),Z.header("Cache-Control","private, no-store"),Z.header("Vary","Cookie")}),$.get("/",async(Z)=>{let Q=Z.get("studioContext"),X=n0(Q);if(!X)return Z.json({error:"Authentication required"},401);let G=(Z.req.query("site")??"").trim().toLowerCase();if(!WX(G))return Z.json({error:"Invalid site slug"},400);let J=await Q.db.selectFrom("member").innerJoin("organization","organization.id","member.organizationId").select(["organization.id as id","organization.slug as slug","organization.name as name","organization.metadata as metadata"]).where("member.userId","=",X).execute(),W=[];for(let H of J){if(!H.slug||n9(H))continue;let F=await Q.storage.virtualMcps.list(H.id);for(let U of F){if(A$$(U)!==G)continue;if(!tj6(U.metadata))continue;W.push({orgSlug:H.slug,orgName:H.name??H.slug,project:{id:U.id,title:U.title,icon:U.icon??null}})}}let K={matches:W};return Z.json(K)}),$}var Zt$=D(()=>{u$();HU()});var Xt$;var Qt$=D(()=>{Xt$={name:"decocms",version:"4.344.1",description:"Deco CMS \u2014 Self-hostable MCP Gateway for managing AI connections and tools",author:"Deco team",repository:{type:"git",url:"git+https://github.com/decocms/studio.git",directory:"apps/api"},bugs:{url:"https://github.com/decocms/studio/issues"},type:"module",bin:{deco:"./dist/server/cli.js"},files:["dist/**/*"],scripts:{dev:"bun run migrate && bun run dev:server","dev:server":"bun run --cwd=../../packages/sandbox build && NODE_ENV=development bun --env-file=.env --hot run src/index.ts",build:"bun run build:server","build:server":"bun run scripts/bundle-server-script.ts --dist ./dist/server","generate:tool-contracts":"bun run scripts/generate-tool-contracts.ts","db:migrate":"bun run ./dist/server/migrate.js","db:migrate:dbos":"bun run ./dist/server/migrate-dbos.js",check:"tsc --noEmit",start:"bun run ./dist/server/server.js",migrate:"bun run src/database/migrate.ts","migrate:dbos":"bun run src/database/migrate-dbos.ts",test:"bun test src","better-auth:migrate":"bunx --bun @better-auth/cli migrate -y --config src/auth/index.ts",prepublishOnly:"bun run --cwd=../.. build:studio"},optionalDependencies:{"@duckdb/node-api":"^1.5.0-r.1"},dependencies:{"@ai-sdk/anthropic":"^3.0.85","@ai-sdk/google":"^3.0.83","@ai-sdk/openai":"^3.0.73","@anthropic-ai/sdk":"^0.105.0","@aws-sdk/client-s3":"^3.1013.0","@aws-sdk/client-sts":"^3.1013.0","@aws-sdk/lib-storage":"^3.1013.0","@aws-sdk/s3-request-presigner":"^3.1013.0","@clickhouse/client":"^1.8.1","@dbos-inc/dbos-sdk":"^4.21.6","@inkjs/ui":"^2.0.0","@nats-io/jetstream":"3.4.0","@nats-io/kv":"3.4.0","@nats-io/nats-core":"3.4.0","@nats-io/transport-node":"3.4.0","@openrouter/ai-sdk-provider":"^2.9.1","@opentelemetry/core":"^2.6.0","embedded-postgres":"^18.3.0-beta.16",ink:"^6.8.0",kysely:"^0.28.12","posthog-node":"^5.0.0",react:"^19.2.6","react-dom":"^19.2.6"},devDependencies:{"@ai-sdk/provider":"^3.0.10","@better-auth/sso":"1.4.1","@decocms/better-auth":"1.5.17","@decocms/bindings":"workspace:*","@decocms/mcp-utils":"workspace:*","@decocms/runtime":"workspace:*","@decocms/sandbox":"workspace:*","@decocms/shared":"workspace:*","@jitl/quickjs-wasmfile-release-sync":"0.31.0","@modelcontextprotocol/sdk":"1.29.0","@opentelemetry/api":"^1.9.0","@opentelemetry/api-logs":"^0.211.0","@opentelemetry/exporter-logs-otlp-proto":"^0.211.0","@opentelemetry/exporter-prometheus":"^0.208.0","@opentelemetry/exporter-trace-otlp-proto":"^0.207.0","@opentelemetry/instrumentation-runtime-node":"^0.24.0","@opentelemetry/resources":"^2.6.0","@opentelemetry/sdk-logs":"^0.211.0","@opentelemetry/sdk-metrics":"^2.2.0","@opentelemetry/sdk-node":"^0.207.0","@opentelemetry/sdk-trace-base":"^2.5.0","@types/bun":"^1.3.1","@types/google.maps":"^3.65.2","@types/pg":"^8.15.6","@types/react-syntax-highlighter":"^15.5.13","@vercel/nft":"^1.1.1",ai:"^6.0.208","better-auth":"1.4.22",croner:"^9.1.0",degit:"^2.8.4",hono:"^4.10.7",jose:"^6.0.11",nanoid:"^5.1.6",pg:"^8.16.3",typescript:"^7.0.2",typescript5:"npm:typescript@^5.9.3",zod:"4.3.6"},homepage:"https://github.com/decocms/studio",keywords:["mcp","model-context-protocol","ai","gateway","self-hosted","tools"],license:"MIT",publishConfig:{access:"public"}}});function sj6(){let $=process.env.POSTHOG_KEY;if(!$)return null;return{key:$,host:process.env.POSTHOG_HOST??rj6}}var Yt$,rj6="https://ph.studio.decocms.com",Gt$;var Jt$=D(()=>{u$();kZ0();r_();C5();E$();WQ1();Qt$();Yt$=new Q1;Yt$.get("/",($)=>{let Z={version:Xt$.version,theme:it1(),...XU().logo&&{logo:XU().logo},...pU()&&{internalUrl:Bb1()},...M0().enableDecoImport&&{enableDecoImport:!0},brandExtractEnabled:!!M0().firecrawlApiKey,hostingEnabled:!!M0().controlplaneRestUrl&&!!M0().controlplaneServiceToken,hostingControlPlaneGa:M0().hostingControlPlaneGa,monitorEnabled:!!M0().clickhouseAnalyticsUrl&&!!M0().clickhouseAnalyticsPassword,monitorGa:M0().monitorGa,auth:bl$(),posthog:sj6(),googleMapsApiKey:process.env.GOOGLE_MAPS_API_KEY?.trim()||null,runtime:{agentSandbox:U00()}};return $.header("Cache-Control","no-store"),$.json({success:!0,config:Z})});Gt$=Yt$});function Uc($){let Z=($??"").trim().toLowerCase();return Z=Z.replace(/^https?:\/\//,""),Z=Z.replace(/^www\./,""),Z=Z.split(/[/?#]/)[0]??"",Z.replace(/\/+$/,"")}function vY1($){return(Uc($).split(".")[0]||$).replace(/[-_]/g," ").split(" ").filter(Boolean).map((Q)=>Q.charAt(0).toUpperCase()+Q.slice(1)).join(" ")}function Kt$($,Z=64){return`https://www.google.com/s2/favicons?domain=${encodeURIComponent(Uc($))}&sz=${Z}`}function Wt$($,Z){let Q=$.trim();if(Q.length<=Z)return Q;let X=Q.slice(0,Z-1),Y=X.lastIndexOf(" ");return`${(Y>Z*0.6?X.slice(0,Y):X).trimEnd()}\u2026`}function Ht$($){let{brand:Z,domain:Q,score:X,verdict:Y}=$,G=typeof X==="number"?`${Z} commerce report \u2014 ${Math.round(X)}/100 \xB7 decocms`:`${Z} commerce report \xB7 decocms`,J=`See the full ${Z} scorecard \u2014 SEO, performance, conversion & AEO signals scored by decocms.`,W=Y?.trim()?Wt$(`${Y.trim().replace(/\s+/g," ")} \u2014 ${J}`,200):Wt$(`How does ${Q} really perform? ${J}`,200);return{title:G,description:W}}import{z as c0}from"zod";var kf,aj6,ej6,$z6,Zz6,Ft$;var Ut$=D(()=>{kf=c0.enum(["good","bad","neutral"]),aj6=c0.preprocess(($)=>{if(Array.isArray($))return{kind:"text",value:$.find((Q)=>Q!==null&&typeof Q!=="object")??""};return $!==null&&typeof $==="object"?$:{kind:"text",value:$}},c0.object({kind:c0.enum(["text","number","sparkline","badge","score"]).catch("text"),value:c0.coerce.string().optional(),tone:kf.optional(),muted:c0.boolean().optional(),delta:c0.coerce.string().optional(),deltaDir:c0.enum(["up","down","neutral"]).optional(),points:c0.array(c0.coerce.number()).optional(),label:c0.coerce.string().optional()}).transform(($)=>{if($.kind==="badge"&&$.label==null)$.label=$.value??"";if($.kind==="score"){let Z=Number($.value);if(Number.isNaN(Z))return{...$,kind:"text"}}return $})),ej6=c0.preprocess(($)=>{let Z=$;if(Z&&typeof Z==="object"&&!Array.isArray(Z)&&Array.isArray(Z.cells))Z=Z.cells;if(Array.isArray(Z)&&Z.length===1&&Array.isArray(Z[0]))Z=Z[0];if(Array.isArray(Z))return Z;if(Z&&typeof Z==="object")return Object.values(Z);return Z},c0.array(aj6)),$z6={key:c0.coerce.string(),title:c0.coerce.string(),eyebrow:c0.coerce.string().optional(),headline:c0.coerce.string(),annotation:c0.coerce.string().optional(),methodology:c0.coerce.string().optional(),sources:c0.array(c0.object({name:c0.coerce.string(),logoUrl:c0.coerce.string()})).optional()},Zz6=c0.discriminatedUnion("template",[c0.object({template:c0.literal("cover"),score:c0.object({value:c0.coerce.number(),max:c0.coerce.number().optional(),grade:c0.coerce.string().optional(),label:c0.coerce.string().optional()}).optional(),brandImage:c0.coerce.string().optional(),screenshot:c0.coerce.string().optional(),mobileScreenshot:c0.coerce.string().optional()}),c0.object({template:c0.literal("cta"),ctaUrl:c0.coerce.string().optional(),ctaLabel:c0.coerce.string().optional(),bullets:c0.array(c0.coerce.string()).optional()}),c0.object({template:c0.literal("series"),points:c0.array(c0.coerce.number()).min(2),xLabels:c0.array(c0.coerce.string()).min(1),unit:c0.coerce.string().optional(),callout:c0.object({index:c0.coerce.number(),value:c0.coerce.string(),tone:kf.optional()})}),c0.object({template:c0.literal("threshold"),value:c0.coerce.string().default(""),metricLabel:c0.coerce.string().optional(),ratio:c0.coerce.number(),thresholdRatio:c0.coerce.number().optional(),thresholdLabel:c0.coerce.string().default(""),tone:kf.optional()}),c0.object({template:c0.literal("stats"),stats:c0.array(c0.object({value:c0.coerce.string(),label:c0.coerce.string(),tone:kf.optional()})).min(1)}),c0.object({template:c0.literal("bars"),items:c0.array(c0.object({value:c0.coerce.string(),label:c0.coerce.string(),ratio:c0.coerce.number(),tone:kf.optional()})).min(1)}),c0.object({template:c0.literal("gauges"),gauges:c0.array(c0.object({label:c0.coerce.string(),value:c0.coerce.string(),status:c0.enum(["good","warn","bad"]).catch("warn"),caption:c0.coerce.string().optional(),ratio:c0.coerce.number().optional()})).min(1)}),c0.object({template:c0.literal("checklist"),checks:c0.array(c0.object({label:c0.coerce.string(),status:c0.enum(["pass","fail","warn"]).catch("fail"),value:c0.coerce.string().optional()})).min(1)}),c0.object({template:c0.literal("table"),columns:c0.array(c0.object({label:c0.coerce.string(),align:c0.enum(["left","right"]).optional()})).min(1),rows:c0.array(ej6).min(1),highlightRow:c0.coerce.number().optional()}),c0.object({template:c0.literal("products"),products:c0.array(c0.object({name:c0.coerce.string(),price:c0.coerce.string().optional(),image:c0.coerce.string().optional(),url:c0.coerce.string().optional()})).min(1)}),c0.object({template:c0.literal("list"),entries:c0.array(c0.object({label:c0.coerce.string(),severity:c0.enum(["error","warning","notice"]).catch("notice")})).min(1),moreCount:c0.coerce.number().optional()}),c0.object({template:c0.literal("keywords"),volumeLabel:c0.coerce.string().optional(),keywords:c0.array(c0.object({term:c0.coerce.string(),volume:c0.coerce.string(),position:c0.coerce.number().catch(0)})).min(1)}),c0.object({template:c0.literal("competitor"),metricLabel:c0.coerce.string().optional(),competitors:c0.array(c0.object({name:c0.coerce.string(),value:c0.coerce.string(),tone:kf.optional(),isYou:c0.boolean().optional()})).min(1)}),c0.object({template:c0.literal("scorecard"),rivalLabel:c0.coerce.string().optional(),dimensions:c0.array(c0.object({label:c0.coerce.string(),you:c0.coerce.string(),rival:c0.coerce.string().optional(),rivalName:c0.coerce.string().optional(),tone:kf.optional()})).min(1)})]),Ft$=c0.object({...$z6,template:Zz6})});function TR0($){let Z=[],Q=[...$.sections].sort((Y,G)=>Y.position-G.position).map((Y)=>{let G=Ft$.safeParse(Y.props);if(G.success)return G.data;let J=G.error.issues[0];return Z.push({section_type:Y.section_type,position:Y.position,reason:J?`${J.path.join(".")||"(root)"}: ${J.message}`:"contract violation"}),null}).filter((Y)=>Y!==null),X=Q.filter((Y)=>Y.template.template!=="cover"&&Y.template.template!=="cta").map((Y)=>({key:Y.key,title:Y.title}));return{deck:{meta:{...$.meta,scores:$.summary?.scores,scannedAt:$.scanned_at,toc:X},slides:Q},drops:Z}}var fY1=D(()=>{Ut$()});import{join as Nt$}from"path";async function Xz6($){try{let Z=await fetch(`${xK({})}/api/v2/public/diagnostics/${encodeURIComponent($)}`,{headers:{Accept:"application/json"},signal:AbortSignal.timeout(Qz6)});if(!Z.ok)return null;let Q=await Z.json(),{deck:X}=TR0(Q);if(!X.slides.length)return null;let Y=X.slides.find((W)=>W.template.template==="cover"),G=Y?.template,J=G&&G.template==="cover"?G:void 0;return{brand:X.meta.brand?.trim()||vY1($),score:X.meta.scores?.cover??J?.score?.value,verdict:Y?.annotation?.trim()||Y?.headline?.trim()||void 0}}catch{return null}}function xG($){return $.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function Yz6($,Z){let Q=Uc($),X=Z?.brand?.trim()||vY1(Q),Y=Kt$(Q,128),J=`${(M0().baseUrl??"https://studio.decocms.com").replace(/\/+$/,"")}/report/${encodeURIComponent(Q)}`,{title:W,description:K}=Ht$({brand:X,domain:Q,score:Z?.score,verdict:Z?.verdict}),H=`${J}/og.png`,F=`${X} commerce report by decocms`;return[`<title>${xG(W)}</title>`,`<meta name="description" content="${xG(K)}" />`,'<meta name="robots" content="noindex, follow" />','<meta property="og:type" content="website" />','<meta property="og:site_name" content="decocms" />',`<meta property="og:title" content="${xG(W)}" />`,`<meta property="og:description" content="${xG(K)}" />`,`<meta property="og:url" content="${xG(J)}" />`,`<meta property="og:image" content="${xG(H)}" />`,'<meta property="og:image:width" content="1200" />','<meta property="og:image:height" content="630" />',`<meta property="og:image:alt" content="${xG(F)}" />`,'<meta name="twitter:card" content="summary_large_image" />',`<meta name="twitter:title" content="${xG(W)}" />`,`<meta name="twitter:description" content="${xG(K)}" />`,`<meta name="twitter:image" content="${xG(H)}" />`,`<meta name="twitter:image:alt" content="${xG(F)}" />`,`<link rel="canonical" href="${xG(J)}" />`,`<link rel="icon" href="${xG(Y)}" sizes="any" />`].join(`
|
|
2929
|
+
`;await Bn$(Z.repo,w);let L=O[0]??`${OR0(X)}/${EY1(N)}.json`;H.push({path:L,content:w});let E=L.slice(L.lastIndexOf("/")+1,-5);F.set(L,{stem:E,content:w});for(let j of O.slice(1))H.push({path:j,deleted:!0}),F.delete(j)}for(let N of $.del)for(let B of IY1(K,N))H.push({path:B,deleted:!0}),F.delete(B);if(H.length===0)return J;let U=X?`${X}/.deco/blocks.gen.json`:".deco/blocks.gen.json";if(W.some((N)=>N.type==="blob"&&N.path===U)){let N=await On$(Z,F.values(),Y),{decofile:B,skipped:O}=te(N);if(O.length>0)console.warn("decofile gen: dropped blocks that were not valid JSON",{repo:XW(Z.repo),branch:Q,packagePath:X,blocks:O.map((w)=>w.key)});H.push({path:U,content:B})}try{let{sha:N}=await Z.commitFiles({branch:Q,message:Aj6($),expectedHead:J,changes:H});return N}catch(N){if(!(N instanceof x5)||G>=jj6-1)throw N;await z$(K7(2000,200,G,2,0.5))}}}function Aj6($){let Z=(Y)=>{let G=Y.slice(0,3).join(", ");return Y.length>3?`${G} (+${Y.length-3} more)`:G},Q=[];if($.set.size>0)Q.push(`update ${Z([...$.set.keys()])}`);if($.del.size>0)Q.push(`delete ${Z([...$.del])}`);let X=`chore(decofile): ${Q.join("; ")}`;return ut0(X,$.deps.coAuthor)}var jj6=3,CY1;var _n$=D(()=>{Jw0();KR0();y5();f8();tZ();DR0();CY1=new Map});import{createHmac as vn$,randomBytes as Tj6,timingSafeEqual as Rj6}from"crypto";function fn$(){if(AR0)return AR0;let $;try{let Z=M0();$=Z.studioJwtSecret??Z.betterAuthSecret}catch{$=void 0}return AR0=$?Buffer.from($):Tj6(32),AR0}function _Y1($){let Z=$.nowMs??Date.now(),Q={o:$.organizationId,m:$.virtualMcpId,b:$.branch,e:Math.floor((Z+qj6)/1000)},X=Buffer.from(JSON.stringify(Q)).toString("base64url"),Y=vn$("sha256",fn$()).update(X).digest("base64url");return`${X}.${Y}`}function bn$($,Z){let Q=$.indexOf(".");if(Q<0)return!1;let X=$.slice(0,Q),Y=Buffer.from($.slice(Q+1)),G=Buffer.from(vn$("sha256",fn$()).update(X).digest("base64url"));if(Y.length!==G.length||!Rj6(Y,G))return!1;let J;try{J=JSON.parse(Buffer.from(X,"base64url").toString())}catch{return!1}let W=Math.floor((Z.nowMs??Date.now())/1000);return J.o===Z.organizationId&&J.m===Z.virtualMcpId&&J.b===Z.branch&&typeof J.e==="number"&&J.e>=W}var qj6=21600000,AR0=null;var xn$=D(()=>{E$()});import{z as Fc}from"zod";function Mj6($){return $.length>0&&$.length<=255&&!$.includes("..")&&!$.endsWith("/")&&!$.endsWith(".lock")&&Ij6.test($)}function ln$($){return $.req.header("x-forwarded-host")??new URL($.req.url).host}async function Q00($){let Z=$.get("decofileScope");return xg($.var.studioContext,Z.organizationId,Z.githubRepo)}function X00($,Z){let Q=Z instanceof Error?Z.message:String(Z);if(Z instanceof x5)return $.json({error:Q},409);let X=zJ(Z);if(X!==null){let Y=X===404?404:X===409||X===422?409:502;return $.json({error:Q},Y)}return $.json({error:Q},500)}function cn$(){let $=new Q1;return $.use("/:virtualMcpId/:branch",un$),$.use("/:virtualMcpId/:branch/*",un$),$.get("/:virtualMcpId/:branch",async(Z)=>{let Q=Z.get("decofileScope");try{let X=await Q00(Z),Y=await Dn$(X,Q.branch,Q.packagePath,{createBranchIfMissing:!!Q.userId}),G={ETag:`"${Y.sha}"`,"Cache-Control":"no-store","Access-Control-Allow-Origin":"*"};if(Z.req.header("if-none-match")===`"${Y.sha}"`)return Z.body(null,304,G);if(!Q.userId)return Z.body(Y.decofile,200,{...G,"content-type":"application/json"});let J=_Y1({organizationId:Q.organizationId,virtualMcpId:Q.virtualMcpId,branch:Q.branch});return Z.body(`{"version":${JSON.stringify(Y.sha)},"token":${JSON.stringify(J)},"apiHost":${JSON.stringify(ln$(Z))},"decofile":${Y.decofile}}`,200,{...G,"content-type":"application/json"})}catch(X){return X00(Z,X)}}),$.get("/:virtualMcpId/:branch/meta",async(Z)=>{let Q=Z.get("decofileScope"),X=Q.packagePath?`${Q.packagePath}/.deco/meta.gen.json`:".deco/meta.gen.json";try{let Y=await Q00(Z),G=await Y.readFileAtRef(Q.branch,X);if(G===null){let J=await Y.getDefaultBranch();if(J!==Q.branch)G=await Y.readFileAtRef(J,X)}if(G===null)return Z.json({error:"meta.gen.json not committed"},404);return Z.body(G,200,{"content-type":"application/json","Cache-Control":"no-store","Access-Control-Allow-Origin":"*"})}catch(Y){return X00(Z,Y)}}),$.patch("/:virtualMcpId/:branch",Vj6,async(Z)=>{let Q=Z.get("decofileScope"),X=Z.var.studioContext,Y=Sj6.safeParse(await Z.req.json().catch(()=>null));if(!Y.success)return Z.json({error:"Invalid body",details:Y.error.issues},400);let G=Y.data;for(let J of[...Object.keys(G.set??{}),...G.delete??[]])try{WR0(J)}catch(W){let K=W instanceof Error?W.message:String(W);return Z.json({error:K},400)}for(let[J,W]of Object.entries(G.set??{})){if(typeof W!=="object"||W===null||Array.isArray(W))return Z.json({error:`Block "${J}" must be a JSON object`},400);if(LY1(J))return Z.json({error:`Block key "${J}" collides with a framework resolver module and cannot be written`},400)}try{let J=await Q00(Z),W=await Cn$(`${Q.organizationId}/${Q.virtualMcpId}/${Q.branch}`,{client:J,branch:Q.branch,packagePath:Q.packagePath,coAuthor:Yc(X)},G),K=_Y1({organizationId:Q.organizationId,virtualMcpId:Q.virtualMcpId,branch:Q.branch});return Z.json({version:W,token:K,apiHost:ln$(Z)})}catch(J){return X00(Z,J)}}),$.post("/:virtualMcpId/:branch/publish",async(Z)=>{let Q=Z.get("decofileScope");try{let X=await Q00(Z),Y=await X.getDefaultBranch();if(Y===Q.branch)return Z.json({error:"Branch is already the default branch"},400);let G=`chore(decofile): publish ${Q.branch}`;try{let J;try{J=await X.mergeBranches(Y,Q.branch,G)}catch(W){if(zJ(W)!==409)throw W;await jR0(X,Q.branch,Y),J=await X.mergeBranches(Y,Q.branch,G)}return J?Z.json({result:"merged",sha:J}):Z.json({result:"up-to-date"})}catch(J){if(zJ(J)===409)return Z.json({error:"merge-conflict"},409);if(zJ(J)===405){let K=await X.findOpenChangeRequest(Y,Q.branch)??await X.createChangeRequest({base:Y,head:Q.branch,title:`Publish ${Q.branch}`});return Z.json({result:"pull-request",number:K.number,url:K.url})}throw J}}catch(X){return X00(Z,X)}}),$.get("/:virtualMcpId/:branch/status",async(Z)=>{let Q=Z.get("decofileScope");try{let X=await Q00(Z),Y=await X.getDefaultBranch();if(Y===Q.branch)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0,lastCommitAt:null});try{let[{aheadBy:G,behindBy:J},W]=await Promise.all([X.compare(Y,Q.branch),X.getBranch(Q.branch)]);return Z.json({baseBranch:Y,aheadBy:G,behindBy:J,lastCommitAt:W?.committedAt??null})}catch(G){if(zJ(G)===404)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0,lastCommitAt:null});throw G}}catch(X){return X00(Z,X)}}),$}var Ij6,yn$=500,gn$=1048576,hn$=1024,kj6=8388608,Vj6,Sj6,un$;var dn$=D(()=>{er0();KR0();u$();rH();WY1();JR0();VY1();tZ();_n$();xn$();kY1();DR0();Ij6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;Vj6=Z9({maxSize:kj6,onError:($)=>$.json({error:"Payload too large"},413)}),Sj6=Fc.object({set:Fc.record(Fc.string(),Fc.unknown()).optional(),delete:Fc.array(Fc.string()).optional()}).refine(($)=>Object.keys($.set??{}).length>0||($.delete?.length??0)>0,{message:"Patch must set or delete at least one block"}).refine(($)=>Object.keys($.set??{}).length+($.delete?.length??0)<=yn$,{message:`Patch cannot touch more than ${yn$} blocks`}).refine(($)=>Object.values($.set??{}).every((Z)=>JSON.stringify(Z).length<=gn$),{message:`Each block must be at most ${gn$} bytes`}).refine(($)=>[...Object.keys($.set??{}),...$.delete??[]].every((Z)=>Z.length<=hn$),{message:`Each block key must be at most ${hn$} characters`}),un$=GR0(async($,Z)=>{let Q=$.var.studioContext,X=Q.organization;if(!X)return $.json({error:"Organization scope required"},500);let Y=$.req.param("virtualMcpId"),G=$.req.param("branch");if(!Y||!G)return $.json({error:"virtualMcpId and branch are required"},400);if(!Mj6(G))return $.json({error:`Invalid branch name: ${G}`},400);let J=Q.auth?.user?.id??null;if(!J){let B=$.req.query("token");if(!($.req.method==="GET"&&!$.req.path.match(/\/(publish|status)$/)))return $.json({error:"Unauthorized"},401);if(!B||!bn$(B,{organizationId:X.id,virtualMcpId:Y,branch:G}))return $.json({error:"Unauthorized"},401)}let W=await Q.storage.virtualMcps.findById(Y);if(!W||W.organization_id!==X.id)return $.json({error:"Virtual MCP not found"},404);let K=W.metadata??null;if(!PL0(K))return $.json({error:"Project has no preview server configured"},404);let F=W.connections?.map((B)=>B.connection_id)??[],U=$00(K,F);if(!U)return $.json({error:"Project has no GitHub repository"},404);let N=K?.runtime;return $.set("decofileScope",{organizationId:X.id,virtualMcpId:Y,branch:G,packagePath:N?.path?.replace(/^\/+|\/+$/g,"")||null,githubRepo:U,userId:J}),Z()})});var mn$=($)=>{let Z=new Q1;if(Z.use("*",Uf),Z.use("*",Ic$),Z.route("/",E20()),Z.route("/",Jd$()),Z.route("/",rc$()),Z.route("/",Up$()),Z.route("/",Kp$()),Z.route("/",QR0()),Z.route("/tools",Ep$()),Z.route("/",Dp$()),Z.route("/",hi$({kvStorage:$.kvStorage})),Z.route("/",yi$()),Z.route("/fs",ei$({getConnection:$.getNatsConnection})),Z.route("/sandbox",Vn$()),Z.route("/decofile",cn$()),Z.route("/",Gp$()),Z.route("/",Zp$()),Z.route("/deco-sites",z20()),Z.route("/hosting",hc$()),Z.route("/monitor",pc$()),Z.route("/sso",N20()),Z.route("/",XR0({tokenStorage:$.tokenStorage,automationEventDispatcher:$.automationEventDispatcher})),Z.route("/webhooks",fc$()),$.mountDevAssets)Z.route("/dev-assets",R20({orgFromPath:!0}));return Z.use("/mcp/:connectionId?",$.mcpAuth),Z.use("/mcp/:connectionId/ui-resource",$.mcpAuth),Z.use("/mcp/gateway/:virtualMcpId?",$.mcpAuth),Z.use("/mcp/virtual-mcp/:virtualMcpId?",$.mcpAuth),Z.use("/mcp/self",$.mcpAuth),Z.use("/mcp/task-run/:threadId",$.mcpAuth),Z.route("/",ah$()),Z.get("/mcp/:gateway?/:connectionId/.well-known/oauth-protected-resource/*",$.betterAuthProtectedResourceHandler),Z.get("/mcp/.well-known/oauth-protected-resource",$.betterAuthProtectedResourceHandler),Z.route("/mcp/task-run",Xp$()),Z.route("/mcp",Rj0()),Z.route("/mcp/self",ZR0()),Z.route("/mcp",Mj0()),Z.all("/oauth-proxy/:connectionId/*",$.oauthProxyHandler),Z.get("/watch",$.watchHandler),Z};var in$=D(()=>{u$();Mc$();K20();bc$();MQ1();uc$();nc$();q20();Ee();AQ1();bQ1();gi$();ui$();$p$();Qp$();Tr();wQ1();kj0();$Y1();Yp$();Jp$();Hp$();Np$();wp$();QY1();jp$();XY1();qj0();Sn$();dn$()});function Cj6($){return $.filter((Z)=>Z.vendors?.alias).map((Z)=>({name:Z.name,title:Z.title,description:Z.description,logo:Z.logo,category:Z.category,vendor:{alias:Z.vendors.alias,url:Z.vendors.url}}))}var _j6=async($,Z)=>{if(!$.get("studioContext").auth.user?.id)return $.json({error:"Unauthorized"},401);return Z()},pn$=()=>{let $=new Q1;return $.use("*",_j6),$.get("/",async(Z)=>{let Q=M0(),X=Q.decoSupabaseUrl,Y=Q.decoSupabaseServiceKey;if(!X||!Y)return Z.json({apps:[]});try{let G=await _Y(X,Y,"apps?select=name,title,description,logo,category,vendors(alias,url)");return Z.json({apps:Cj6(G)})}catch(G){return console.error("[deco-apps] GET error:",G),Z.json({error:"Failed to fetch apps"},502)}}),$};var nn$=D(()=>{u$();E$();ET0()});import{z as M1}from"zod";function QF($,Z="invalid_request_error",Q=null,X=null){return{error:{message:$,type:Z,param:Q,code:X}}}function cj6($){if(!$)return null;let Z=$.indexOf(":");if(Z===-1)return{credentialId:null,modelId:$};let Q=$.substring(0,Z),X=$.substring(Z+1);if(!Q||!X)return null;return{credentialId:Q,modelId:X}}function dj6($,Z,Q){try{return JSON.parse($)}catch{throw new rn$(`Invalid JSON in tool call arguments for function '${Q}' (tool_call_id: ${Z}): ${$}`)}}function mj6($){let Z={};for(let Q of $)if(Q.role==="assistant"&&Q.tool_calls)for(let X of Q.tool_calls)Z[X.id]=X.function.name;return $.map((Q)=>{switch(Q.role){case"system":return{role:"system",content:Q.content};case"user":if(typeof Q.content==="string")return{role:"user",content:Q.content};return{role:"user",content:Q.content.map((Y)=>{if(Y.type==="text")return{type:"text",text:Y.text};return{type:"image",image:Y.image_url.url}})};case"assistant":if(Q.tool_calls&&Q.tool_calls.length>0)return{role:"assistant",content:Q.tool_calls.map((Y)=>({type:"tool-call",toolCallId:Y.id,toolName:Y.function.name,input:dj6(Y.function.arguments,Y.id,Y.function.name)}))};return{role:"assistant",content:Q.content??""};case"tool":let X=Z[Q.tool_call_id]??"unknown";return{role:"tool",content:[{type:"tool-result",toolCallId:Q.tool_call_id,toolName:X,output:{type:"text",value:Q.content}}]}}})}function ij6($){let Z=$.map((Q)=>{let X=Q.function.parameters?LG(Q.function.parameters):LG({type:"object",properties:{}});return[Q.function.name,W$({description:Q.function.description,inputSchema:X})]});return Object.fromEntries(Z)}function pj6($){if(!$)return;return{openai:{response_format:$}}}function nj6(){return`chatcmpl-${crypto.randomUUID().replace(/-/g,"").substring(0,29)}`}function tn$($,Z,Q,X,Y,G){let J={model:$,messages:Z,tools:Q,temperature:X.temperature,maxTokens:X.max_tokens,topP:X.top_p,frequencyPenalty:X.frequency_penalty,presencePenalty:X.presence_penalty,stopSequences:X.stop?Array.isArray(X.stop)?X.stop:[X.stop]:void 0,abortSignal:G};return Y?{...J,providerOptions:Y}:J}function on$($){if($==="tool-calls")return"tool_calls";if($==="length")return"length";return"stop"}var vj6=256,fj6,bj6,xj6,yj6,gj6,hj6,uj6,lj6,rn$,sn$,an$;var en$=D(()=>{S4();u$();Xc();GN();fj6=M1.object({type:M1.literal("function"),function:M1.object({name:M1.string(),description:M1.string().optional(),parameters:M1.record(M1.string(),M1.unknown()).optional()})}),bj6=M1.object({id:M1.string(),type:M1.literal("function"),function:M1.object({name:M1.string(),arguments:M1.string()})}),xj6=M1.discriminatedUnion("role",[M1.object({role:M1.literal("system"),content:M1.string(),name:M1.string().optional()}),M1.object({role:M1.literal("user"),content:M1.union([M1.string(),M1.array(M1.union([M1.object({type:M1.literal("text"),text:M1.string()}),M1.object({type:M1.literal("image_url"),image_url:M1.object({url:M1.string(),detail:M1.string().optional()})})]))]),name:M1.string().optional()}),M1.object({role:M1.literal("assistant"),content:M1.string().nullable().optional(),name:M1.string().optional(),tool_calls:M1.array(bj6).optional()}),M1.object({role:M1.literal("tool"),content:M1.string(),tool_call_id:M1.string()})]),yj6=M1.object({type:M1.literal("text")}),gj6=M1.object({type:M1.literal("json_object")}),hj6=M1.object({type:M1.literal("json_schema"),json_schema:M1.object({name:M1.string(),description:M1.string().optional(),schema:M1.record(M1.string(),M1.unknown()),strict:M1.boolean().optional()})}),uj6=M1.union([yj6,gj6,hj6]),lj6=M1.object({model:M1.string().describe("Format: 'model_id' or 'credential_id:model_id'"),messages:M1.array(xj6),stream:M1.boolean().optional().default(!1),temperature:M1.number().min(0).max(2).optional(),max_tokens:M1.number().positive().optional(),top_p:M1.number().min(0).max(1).optional(),frequency_penalty:M1.number().min(-2).max(2).optional(),presence_penalty:M1.number().min(-2).max(2).optional(),stop:M1.union([M1.string(),M1.array(M1.string())]).optional(),tools:M1.array(fj6).optional(),tool_choice:M1.union([M1.literal("auto"),M1.literal("none"),M1.literal("required"),M1.object({type:M1.literal("function"),function:M1.object({name:M1.string()})})]).optional(),response_format:uj6.optional(),user:M1.string().optional()});rn$=class rn$ extends Error{constructor($){super($);this.name="MessageConversionError"}};sn$=new Q1;sn$.post("/:org/v1/chat/completions",async($)=>{let Z=$.get("studioContext"),Q=$.req.param("org");try{if(!Z.auth.apiKey?.id)return $.json(QF("API key authentication required. Provide a valid API key via Authorization header.","authentication_error"),401);if(!Z.organization)return $.json(QF("Organization context is required. Ensure your API key has organization metadata.","invalid_request_error","organization"),400);if((Z.organization.slug??Z.organization.id)!==Q)return $.json(QF("Organization mismatch. The API key's organization does not match the requested organization.","invalid_request_error","organization"),403);let X=await $.req.json(),Y=lj6.safeParse(X);if(!Y.success){let L=Y.error.issues[0]??{message:"Invalid request",path:[]};return $.json(QF(`Invalid request: ${L.message}`,"invalid_request_error",L.path.length>0?L.path.join("."):null),400)}let G=Y.data,J=cj6(G.model);if(!J)return $.json(QF("Invalid model format. Expected 'model_id' or 'credential_id:model_id' (e.g., 'claude-sonnet-4-6' or 'key_abc123:claude-sonnet-4-6')","invalid_request_error","model"),400);let{credentialId:W}=J,{modelId:K}=J;if(!W){let E=(await Z.storage.aiProviderKeys.list({organizationId:Z.organization.id})).find((j)=>tL(j.providerId));if(!E)return $.json(QF("No AI provider credentials configured for this organization. Add a credential in settings or specify one explicitly via 'credential_id:model_id'.","invalid_request_error","model"),400);W=E.id}let H;try{H=await Z.aiProviders.activate(W,Z.organization.id)}catch{return $.json(QF(`AI provider credential not found or inaccessible: ${W}`,"invalid_request_error","model"),404)}let F=H.aiSdk.languageModel(K),U=mj6(G.messages),N=G.tools?ij6(G.tools):void 0,B=pj6(G.response_format),O=nj6(),w=Math.floor(Date.now()/1000);if(G.stream)return MN($,async(L)=>{let E=tn$(F,U,N,G,B,$.req.raw.signal);try{let j=SD(E),z=!1,P=0,A="",q=async()=>{if(A.length===0)return;let k=A;A="",await L.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:w,model:G.model,choices:[{index:0,delta:{content:k},finish_reason:null}]})})};for await(let k of j.fullStream){if(!z&&(k.type==="text-delta"||k.type==="tool-call"))await L.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:w,model:G.model,choices:[{index:0,delta:{role:"assistant",content:""},finish_reason:null}]})}),z=!0;if(k.type==="text-delta"){if(A+=k.text,A.length>=vj6)await q()}else if(k.type==="tool-call"){await q();let M=P++;await L.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:w,model:G.model,choices:[{index:0,delta:{tool_calls:[{index:M,id:k.toolCallId,type:"function",function:{name:k.toolName,arguments:JSON.stringify(k.input)}}]},finish_reason:null}]})})}else if(k.type==="finish")await q(),await L.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:w,model:G.model,choices:[{index:0,delta:{},finish_reason:on$(k.finishReason)}],usage:k.totalUsage?{prompt_tokens:k.totalUsage.inputTokens??0,completion_tokens:k.totalUsage.outputTokens??0,total_tokens:k.totalUsage.totalTokens??0}:void 0})})}await q(),await L.writeSSE({data:"[DONE]"})}catch(j){let z=j;console.error("[openai-compat:stream] Error:",z.message),await L.writeSSE({data:JSON.stringify({error:{message:z.message,type:"server_error"}})})}});else{let L=tn$(F,U,N,G,B,$.req.raw.signal),E=await kD(L),j={role:"assistant",content:E.text||null};if(E.toolCalls&&E.toolCalls.length>0)j.tool_calls=E.toolCalls.map((z)=>({id:z.toolCallId,type:"function",function:{name:z.toolName,arguments:JSON.stringify("input"in z?z.input:{})}})),j.content=null;return $.json({id:O,object:"chat.completion",created:w,model:G.model,choices:[{index:0,message:j,finish_reason:on$(E.finishReason)}],usage:{prompt_tokens:E.usage?.inputTokens??0,completion_tokens:E.usage?.outputTokens??0,total_tokens:E.usage?.totalTokens??0}})}}catch(X){let Y=X;if(Y.name==="AbortError")return $.json(QF("Request aborted","invalid_request_error"),400);if(Y.name==="MessageConversionError")return $.json(QF(Y.message,"invalid_request_error","messages"),400);return console.error("[openai-compat] Error:",Y.message,Y.stack),$.json(QF(Y.message,"server_error"),500)}});an$=sn$});function tj6($){if(typeof $!=="object"||$===null)return!1;let Q=$.githubRepo?.url;return typeof Q==="string"&&Q.length>0}function $t$(){let $=new Q1;return $.use("*",async(Z,Q)=>{await Q(),Z.header("Cache-Control","private, no-store"),Z.header("Vary","Cookie")}),$.get("/",async(Z)=>{let Q=Z.get("studioContext"),X=n0(Q);if(!X)return Z.json({error:"Authentication required"},401);let G=(Z.req.query("site")??"").trim().toLowerCase();if(!WX(G))return Z.json({error:"Invalid site slug"},400);let J=await Q.db.selectFrom("member").innerJoin("organization","organization.id","member.organizationId").select(["organization.id as id","organization.slug as slug","organization.name as name","organization.metadata as metadata"]).where("member.userId","=",X).execute(),W=[];for(let H of J){if(!H.slug||n9(H))continue;let F=await Q.storage.virtualMcps.list(H.id);for(let U of F){if(A$$(U)!==G)continue;if(!tj6(U.metadata))continue;W.push({orgSlug:H.slug,orgName:H.name??H.slug,project:{id:U.id,title:U.title,icon:U.icon??null}})}}let K={matches:W};return Z.json(K)}),$}var Zt$=D(()=>{u$();HU()});var Xt$;var Qt$=D(()=>{Xt$={name:"decocms",version:"4.344.3",description:"Deco CMS \u2014 Self-hostable MCP Gateway for managing AI connections and tools",author:"Deco team",repository:{type:"git",url:"git+https://github.com/decocms/studio.git",directory:"apps/api"},bugs:{url:"https://github.com/decocms/studio/issues"},type:"module",bin:{deco:"./dist/server/cli.js"},files:["dist/**/*"],scripts:{dev:"bun run migrate && bun run dev:server","dev:server":"bun run --cwd=../../packages/sandbox build && NODE_ENV=development bun --env-file=.env --hot run src/index.ts",build:"bun run build:server","build:server":"bun run scripts/bundle-server-script.ts --dist ./dist/server","generate:tool-contracts":"bun run scripts/generate-tool-contracts.ts","db:migrate":"bun run ./dist/server/migrate.js","db:migrate:dbos":"bun run ./dist/server/migrate-dbos.js",check:"tsc --noEmit",start:"bun run ./dist/server/server.js",migrate:"bun run src/database/migrate.ts","migrate:dbos":"bun run src/database/migrate-dbos.ts",test:"bun test src","better-auth:migrate":"bunx --bun @better-auth/cli migrate -y --config src/auth/index.ts",prepublishOnly:"bun run --cwd=../.. build:studio"},optionalDependencies:{"@duckdb/node-api":"^1.5.0-r.1"},dependencies:{"@ai-sdk/anthropic":"^3.0.85","@ai-sdk/google":"^3.0.83","@ai-sdk/openai":"^3.0.73","@anthropic-ai/sdk":"^0.105.0","@aws-sdk/client-s3":"^3.1013.0","@aws-sdk/client-sts":"^3.1013.0","@aws-sdk/lib-storage":"^3.1013.0","@aws-sdk/s3-request-presigner":"^3.1013.0","@clickhouse/client":"^1.8.1","@dbos-inc/dbos-sdk":"^4.21.6","@inkjs/ui":"^2.0.0","@nats-io/jetstream":"3.4.0","@nats-io/kv":"3.4.0","@nats-io/nats-core":"3.4.0","@nats-io/transport-node":"3.4.0","@openrouter/ai-sdk-provider":"^2.9.1","@opentelemetry/core":"^2.6.0","embedded-postgres":"^18.3.0-beta.16",ink:"^6.8.0",kysely:"^0.28.12","posthog-node":"^5.0.0",react:"^19.2.6","react-dom":"^19.2.6"},devDependencies:{"@ai-sdk/provider":"^3.0.10","@better-auth/sso":"1.4.1","@decocms/better-auth":"1.5.17","@decocms/bindings":"workspace:*","@decocms/mcp-utils":"workspace:*","@decocms/runtime":"workspace:*","@decocms/sandbox":"workspace:*","@decocms/shared":"workspace:*","@jitl/quickjs-wasmfile-release-sync":"0.31.0","@modelcontextprotocol/sdk":"1.29.0","@opentelemetry/api":"^1.9.0","@opentelemetry/api-logs":"^0.211.0","@opentelemetry/exporter-logs-otlp-proto":"^0.211.0","@opentelemetry/exporter-prometheus":"^0.208.0","@opentelemetry/exporter-trace-otlp-proto":"^0.207.0","@opentelemetry/instrumentation-runtime-node":"^0.24.0","@opentelemetry/resources":"^2.6.0","@opentelemetry/sdk-logs":"^0.211.0","@opentelemetry/sdk-metrics":"^2.2.0","@opentelemetry/sdk-node":"^0.207.0","@opentelemetry/sdk-trace-base":"^2.5.0","@types/bun":"^1.3.1","@types/google.maps":"^3.65.2","@types/pg":"^8.15.6","@types/react-syntax-highlighter":"^15.5.13","@vercel/nft":"^1.1.1",ai:"^6.0.208","better-auth":"1.4.22",croner:"^9.1.0",degit:"^2.8.4",hono:"^4.10.7",jose:"^6.0.11",nanoid:"^5.1.6",pg:"^8.16.3",typescript:"^7.0.2",typescript5:"npm:typescript@^5.9.3",zod:"4.3.6"},homepage:"https://github.com/decocms/studio",keywords:["mcp","model-context-protocol","ai","gateway","self-hosted","tools"],license:"MIT",publishConfig:{access:"public"}}});function sj6(){let $=process.env.POSTHOG_KEY;if(!$)return null;return{key:$,host:process.env.POSTHOG_HOST??rj6}}var Yt$,rj6="https://ph.studio.decocms.com",Gt$;var Jt$=D(()=>{u$();kZ0();r_();C5();E$();WQ1();Qt$();Yt$=new Q1;Yt$.get("/",($)=>{let Z={version:Xt$.version,theme:it1(),...XU().logo&&{logo:XU().logo},...pU()&&{internalUrl:Bb1()},...M0().enableDecoImport&&{enableDecoImport:!0},brandExtractEnabled:!!M0().firecrawlApiKey,hostingEnabled:!!M0().controlplaneRestUrl&&!!M0().controlplaneServiceToken,hostingControlPlaneGa:M0().hostingControlPlaneGa,monitorEnabled:!!M0().clickhouseAnalyticsUrl&&!!M0().clickhouseAnalyticsPassword,monitorGa:M0().monitorGa,auth:bl$(),posthog:sj6(),googleMapsApiKey:process.env.GOOGLE_MAPS_API_KEY?.trim()||null,runtime:{agentSandbox:U00()}};return $.header("Cache-Control","no-store"),$.json({success:!0,config:Z})});Gt$=Yt$});function Uc($){let Z=($??"").trim().toLowerCase();return Z=Z.replace(/^https?:\/\//,""),Z=Z.replace(/^www\./,""),Z=Z.split(/[/?#]/)[0]??"",Z.replace(/\/+$/,"")}function vY1($){return(Uc($).split(".")[0]||$).replace(/[-_]/g," ").split(" ").filter(Boolean).map((Q)=>Q.charAt(0).toUpperCase()+Q.slice(1)).join(" ")}function Kt$($,Z=64){return`https://www.google.com/s2/favicons?domain=${encodeURIComponent(Uc($))}&sz=${Z}`}function Wt$($,Z){let Q=$.trim();if(Q.length<=Z)return Q;let X=Q.slice(0,Z-1),Y=X.lastIndexOf(" ");return`${(Y>Z*0.6?X.slice(0,Y):X).trimEnd()}\u2026`}function Ht$($){let{brand:Z,domain:Q,score:X,verdict:Y}=$,G=typeof X==="number"?`${Z} commerce report \u2014 ${Math.round(X)}/100 \xB7 decocms`:`${Z} commerce report \xB7 decocms`,J=`See the full ${Z} scorecard \u2014 SEO, performance, conversion & AEO signals scored by decocms.`,W=Y?.trim()?Wt$(`${Y.trim().replace(/\s+/g," ")} \u2014 ${J}`,200):Wt$(`How does ${Q} really perform? ${J}`,200);return{title:G,description:W}}import{z as c0}from"zod";var kf,aj6,ej6,$z6,Zz6,Ft$;var Ut$=D(()=>{kf=c0.enum(["good","bad","neutral"]),aj6=c0.preprocess(($)=>{if(Array.isArray($))return{kind:"text",value:$.find((Q)=>Q!==null&&typeof Q!=="object")??""};return $!==null&&typeof $==="object"?$:{kind:"text",value:$}},c0.object({kind:c0.enum(["text","number","sparkline","badge","score"]).catch("text"),value:c0.coerce.string().optional(),tone:kf.optional(),muted:c0.boolean().optional(),delta:c0.coerce.string().optional(),deltaDir:c0.enum(["up","down","neutral"]).optional(),points:c0.array(c0.coerce.number()).optional(),label:c0.coerce.string().optional()}).transform(($)=>{if($.kind==="badge"&&$.label==null)$.label=$.value??"";if($.kind==="score"){let Z=Number($.value);if(Number.isNaN(Z))return{...$,kind:"text"}}return $})),ej6=c0.preprocess(($)=>{let Z=$;if(Z&&typeof Z==="object"&&!Array.isArray(Z)&&Array.isArray(Z.cells))Z=Z.cells;if(Array.isArray(Z)&&Z.length===1&&Array.isArray(Z[0]))Z=Z[0];if(Array.isArray(Z))return Z;if(Z&&typeof Z==="object")return Object.values(Z);return Z},c0.array(aj6)),$z6={key:c0.coerce.string(),title:c0.coerce.string(),eyebrow:c0.coerce.string().optional(),headline:c0.coerce.string(),annotation:c0.coerce.string().optional(),methodology:c0.coerce.string().optional(),sources:c0.array(c0.object({name:c0.coerce.string(),logoUrl:c0.coerce.string()})).optional()},Zz6=c0.discriminatedUnion("template",[c0.object({template:c0.literal("cover"),score:c0.object({value:c0.coerce.number(),max:c0.coerce.number().optional(),grade:c0.coerce.string().optional(),label:c0.coerce.string().optional()}).optional(),brandImage:c0.coerce.string().optional(),screenshot:c0.coerce.string().optional(),mobileScreenshot:c0.coerce.string().optional()}),c0.object({template:c0.literal("cta"),ctaUrl:c0.coerce.string().optional(),ctaLabel:c0.coerce.string().optional(),bullets:c0.array(c0.coerce.string()).optional()}),c0.object({template:c0.literal("series"),points:c0.array(c0.coerce.number()).min(2),xLabels:c0.array(c0.coerce.string()).min(1),unit:c0.coerce.string().optional(),callout:c0.object({index:c0.coerce.number(),value:c0.coerce.string(),tone:kf.optional()})}),c0.object({template:c0.literal("threshold"),value:c0.coerce.string().default(""),metricLabel:c0.coerce.string().optional(),ratio:c0.coerce.number(),thresholdRatio:c0.coerce.number().optional(),thresholdLabel:c0.coerce.string().default(""),tone:kf.optional()}),c0.object({template:c0.literal("stats"),stats:c0.array(c0.object({value:c0.coerce.string(),label:c0.coerce.string(),tone:kf.optional()})).min(1)}),c0.object({template:c0.literal("bars"),items:c0.array(c0.object({value:c0.coerce.string(),label:c0.coerce.string(),ratio:c0.coerce.number(),tone:kf.optional()})).min(1)}),c0.object({template:c0.literal("gauges"),gauges:c0.array(c0.object({label:c0.coerce.string(),value:c0.coerce.string(),status:c0.enum(["good","warn","bad"]).catch("warn"),caption:c0.coerce.string().optional(),ratio:c0.coerce.number().optional()})).min(1)}),c0.object({template:c0.literal("checklist"),checks:c0.array(c0.object({label:c0.coerce.string(),status:c0.enum(["pass","fail","warn"]).catch("fail"),value:c0.coerce.string().optional()})).min(1)}),c0.object({template:c0.literal("table"),columns:c0.array(c0.object({label:c0.coerce.string(),align:c0.enum(["left","right"]).optional()})).min(1),rows:c0.array(ej6).min(1),highlightRow:c0.coerce.number().optional()}),c0.object({template:c0.literal("products"),products:c0.array(c0.object({name:c0.coerce.string(),price:c0.coerce.string().optional(),image:c0.coerce.string().optional(),url:c0.coerce.string().optional()})).min(1)}),c0.object({template:c0.literal("list"),entries:c0.array(c0.object({label:c0.coerce.string(),severity:c0.enum(["error","warning","notice"]).catch("notice")})).min(1),moreCount:c0.coerce.number().optional()}),c0.object({template:c0.literal("keywords"),volumeLabel:c0.coerce.string().optional(),keywords:c0.array(c0.object({term:c0.coerce.string(),volume:c0.coerce.string(),position:c0.coerce.number().catch(0)})).min(1)}),c0.object({template:c0.literal("competitor"),metricLabel:c0.coerce.string().optional(),competitors:c0.array(c0.object({name:c0.coerce.string(),value:c0.coerce.string(),tone:kf.optional(),isYou:c0.boolean().optional()})).min(1)}),c0.object({template:c0.literal("scorecard"),rivalLabel:c0.coerce.string().optional(),dimensions:c0.array(c0.object({label:c0.coerce.string(),you:c0.coerce.string(),rival:c0.coerce.string().optional(),rivalName:c0.coerce.string().optional(),tone:kf.optional()})).min(1)})]),Ft$=c0.object({...$z6,template:Zz6})});function TR0($){let Z=[],Q=[...$.sections].sort((Y,G)=>Y.position-G.position).map((Y)=>{let G=Ft$.safeParse(Y.props);if(G.success)return G.data;let J=G.error.issues[0];return Z.push({section_type:Y.section_type,position:Y.position,reason:J?`${J.path.join(".")||"(root)"}: ${J.message}`:"contract violation"}),null}).filter((Y)=>Y!==null),X=Q.filter((Y)=>Y.template.template!=="cover"&&Y.template.template!=="cta").map((Y)=>({key:Y.key,title:Y.title}));return{deck:{meta:{...$.meta,scores:$.summary?.scores,scannedAt:$.scanned_at,toc:X},slides:Q},drops:Z}}var fY1=D(()=>{Ut$()});import{join as Nt$}from"path";async function Xz6($){try{let Z=await fetch(`${xK({})}/api/v2/public/diagnostics/${encodeURIComponent($)}`,{headers:{Accept:"application/json"},signal:AbortSignal.timeout(Qz6)});if(!Z.ok)return null;let Q=await Z.json(),{deck:X}=TR0(Q);if(!X.slides.length)return null;let Y=X.slides.find((W)=>W.template.template==="cover"),G=Y?.template,J=G&&G.template==="cover"?G:void 0;return{brand:X.meta.brand?.trim()||vY1($),score:X.meta.scores?.cover??J?.score?.value,verdict:Y?.annotation?.trim()||Y?.headline?.trim()||void 0}}catch{return null}}function xG($){return $.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function Yz6($,Z){let Q=Uc($),X=Z?.brand?.trim()||vY1(Q),Y=Kt$(Q,128),J=`${(M0().baseUrl??"https://studio.decocms.com").replace(/\/+$/,"")}/report/${encodeURIComponent(Q)}`,{title:W,description:K}=Ht$({brand:X,domain:Q,score:Z?.score,verdict:Z?.verdict}),H=`${J}/og.png`,F=`${X} commerce report by decocms`;return[`<title>${xG(W)}</title>`,`<meta name="description" content="${xG(K)}" />`,'<meta name="robots" content="noindex, follow" />','<meta property="og:type" content="website" />','<meta property="og:site_name" content="decocms" />',`<meta property="og:title" content="${xG(W)}" />`,`<meta property="og:description" content="${xG(K)}" />`,`<meta property="og:url" content="${xG(J)}" />`,`<meta property="og:image" content="${xG(H)}" />`,'<meta property="og:image:width" content="1200" />','<meta property="og:image:height" content="630" />',`<meta property="og:image:alt" content="${xG(F)}" />`,'<meta name="twitter:card" content="summary_large_image" />',`<meta name="twitter:title" content="${xG(W)}" />`,`<meta name="twitter:description" content="${xG(K)}" />`,`<meta name="twitter:image" content="${xG(H)}" />`,`<meta name="twitter:image:alt" content="${xG(F)}" />`,`<link rel="canonical" href="${xG(J)}" />`,`<link rel="icon" href="${xG(Y)}" sizes="any" />`].join(`
|
|
2930
2930
|
`)}function Gz6($,Z){return $.replace(/<title>[\s\S]*?<\/title>\s*/i,"").replace(/<meta\s+name="(?:description|twitter:[^"]*)"[^>]*>\s*/gi,"").replace(/<meta\s+property="og:[^"]*"[^>]*>\s*/gi,"").replace(/<link\s+rel="icon"[^>]*>\s*/gi,"").replace("</head>",` ${Z}
|
|
2931
2931
|
</head>`)}function Bt$($){let Z=new Q1;return Z.get("/:domain/og.png",async(Q)=>{let X=Uc(Q.req.param("domain")),Y=async()=>{let G=$?Bun.file(Nt$($,"report-og-fallback.png")):null;if(!G||!await G.exists())return Q.notFound();return Q.body(new Uint8Array(await G.arrayBuffer()),200,{"Content-Type":"image/png","Cache-Control":"public, max-age=0, s-maxage=3600"})};try{let G=await fetch(`${xK({})}/api/v2/public/diagnostics/${encodeURIComponent(X)}/og.png`,{signal:AbortSignal.timeout(Jz6)}),J=G.headers.get("content-type")??"";if(!G.ok||!J.startsWith("image/")||!G.body)return Y();return Q.body(G.body,200,{"Content-Type":J,"Cache-Control":"public, max-age=0, s-maxage=604800"})}catch{return Y()}}),Z.get("/:domain",async(Q)=>{let X=Q.req.param("domain"),Y=$?Nt$($,"index.html"):null,G=Y?Bun.file(Y):null;if(!G||!await G.exists())return Q.notFound();let J=await G.text();try{let W=await Xz6(Uc(X)),K=Yz6(X,W);return Q.html(Gz6(J,K),200,{"Cache-Control":"public, max-age=0, s-maxage=300"})}catch{return Q.html(J)}}),Z}var Qz6=2500,Jz6=1e4;var Ot$=D(()=>{u$();fY1();eE();E$()});function Y00($,Z){return fetch(`${xK({})}${$}`,Z)}async function Wz6($,Z,Q){let X=new URLSearchParams;if(Z)X.set("pw",Z);if(Q)X.set("lang",Q);let Y=X.toString()?`?${X.toString()}`:"",G=await Y00(`/api/v2/public/diagnostics/${encodeURIComponent($)}${Y}`,{headers:{Accept:"application/json"}});if(G.status===404)return{status:"not_found",deck:null,scanned_at:null,drops:[]};if(!G.ok)throw Error(`report read HTTP ${G.status}`);let J=await G.json(),{deck:W,drops:K}=TR0(J);return{status:W.slides.length?"ready":"empty",deck:W,scanned_at:J.scanned_at,drops:K}}var Kz6,VN,Dt$=async($,Z)=>{if(!$.get("reportUser"))return $.json({error:"Authentication required"},401);await Z();return},wt$;var Lt$=D(()=>{u$();JG();eE();fY1();Kz6=new Set(["complete","errored","terminated","unknown"]),VN=new Q1;VN.use("*",async($,Z)=>{let Q=await Q8.api.getSession({headers:$.req.raw.headers});$.set("reportUser",Q?.user?.id?{email:Q.user.email}:void 0),await Z(),$.header("Cache-Control","private, no-store"),$.header("Vary","Cookie");return});VN.use("/link-token/*",Dt$);VN.use("/suggest",Dt$);VN.get("/site/:domain",async($)=>{let Z=$.req.param("domain").trim();if(!Z)return $.json({error:"domain is required"},400);let Q=$.get("reportUser"),X=$.req.query("key")?.trim()||void 0,Y=$.req.query("lang")?.trim()||void 0;try{let G=await Wz6(Z,X,Y);if($.header("Cache-Control","private, no-store"),Q||!G.deck)return $.json(G);return $.json({...G,deck:{...G.deck,slides:G.deck.slides.slice(0,1)},truncated:G.status==="ready"})}catch{return $.json({error:"report read failed"},502)}});VN.post("/run",async($)=>{let Z=$.get("reportUser"),Q;try{Q=await $.req.json()}catch{return $.json({error:"invalid JSON"},400)}let X=typeof Q.domain==="string"?Q.domain.trim():"";if(!X)return $.json({error:"domain is required"},400);let Y=Z?.email,G=typeof Q.distinctId==="string"&&Q.distinctId.trim()&&Q.distinctId.length<=200?Q.distinctId.trim():void 0;try{let J=await Y00("/api/v2/diagnostics/run",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${aE({})}`},body:JSON.stringify({url:X,...Y?{email:Y}:{},distinct_id:G})});if(!J.ok)return $.json({error:`run HTTP ${J.status}`},502);let W=await J.json(),K=W.blocked?{state:"blocked"}:W.status==="fresh"?{state:"fresh"}:W.mode==="sync"?{state:"sync"}:{state:"running",id:W.id??null};return $.json(K)}catch{return $.json({error:"run failed"},502)}});VN.get("/status",async($)=>{let Z=$.req.query("id");if(!Z)return $.json({error:"id is required"},400);try{let Q=await Y00(`/api/v2/diagnostics/status?id=${encodeURIComponent(Z)}`,{headers:{Authorization:`Bearer ${aE({})}`}});if(!Q.ok)return $.json({error:`status HTTP ${Q.status}`},502);let Y=(await Q.json()).status??"unknown",G={done:Kz6.has(Y),status:Y};return $.json(G)}catch{return $.json({error:"status failed"},502)}});VN.get("/link-token/:id",async($)=>{let Z=$.req.param("id");try{let Q=await Y00(`/api/v2/public/link-tokens/${encodeURIComponent(Z)}`,{headers:{Accept:"application/json"}});if(Q.status===404)return $.json(null);if(!Q.ok)return $.json({error:`link token HTTP ${Q.status}`},502);return $.json(await Q.json())}catch{return $.json({error:"link token resolve failed"},502)}});VN.get("/suggest",async($)=>{let Z=($.req.query("q")??"").trim().slice(0,64);if(Z.length<2)return $.json({suggestions:[]});try{let Q=await Y00(`/api/v2/public/suggest?q=${encodeURIComponent(Z)}`,{headers:{Accept:"application/json"}});if(!Q.ok)return $.json({suggestions:[]});let X=await Q.json();return $.json({suggestions:Array.isArray(X.suggestions)?X.suggestions:[]})}catch{return $.json({suggestions:[]})}});wt$=VN});import{createHmac as Hz6,timingSafeEqual as Fz6}from"crypto";function jt$($,Z,Q,X=Date.now()){if(!Z||!Q)return!1;let Y,G=[];for(let H of Z.split(",")){let F=H.indexOf("=");if(F<=0)continue;let U=H.slice(0,F).trim(),N=H.slice(F+1).trim();if(U==="t")Y=N;else if(U==="v1")G.push(N)}if(!Y||G.length===0)return!1;let J=Number(Y);if(!Number.isFinite(J)||Math.abs(X/1000-J)>Uz6)return!1;let W=Hz6("sha256",Q).update(`${Y}.${$}`).digest("hex"),K=Buffer.from(W,"hex");return G.some((H)=>{let F=Buffer.from(H,"hex");return K.length===F.length&&Fz6(K,F)})}function zt$($){let Z;try{Z=JSON.parse($)}catch{return null}let Q=Y3(Z),X=Y3(Y3(Q?.data)?.object);if(!Q||typeof Q.type!=="string"||!X)return null;return{id:XF(Q.id),type:Q.type,created:typeof Q.created==="number"?Q.created:void 0,livemode:typeof Q.livemode==="boolean"?Q.livemode:void 0,data:{object:X}}}function Pt$($){switch($){case"active":case"trialing":return"active";case"past_due":return"past_due";default:return"canceled"}}function XF($){return typeof $==="string"?$:void 0}function Y3($){return typeof $==="object"&&$!==null?$:void 0}function RR0($){return typeof $==="number"?new Date($*1000):null}function yY1($){return XF($)??XF(Y3($)?.id)}function Nz6($){return yY1($.subscription)??XF(Y3(Y3($.parent)?.subscription_details)?.subscription)}function Bz6($){let Z=RR0($.current_period_end);if(Z)return Z;let Q=Y3($.items)?.data;if(!Array.isArray(Q))return null;let X=0;for(let Y of Q){let G=Y3(Y)?.current_period_end;if(typeof G==="number"&&G>X)X=G}return X>0?new Date(X*1000):null}function bY1($,Z){let Q=RR0($.created);return!!Q&&!!Z.lastStripeEventAt&&Q<Z.lastStripeEventAt}function xY1($,Z){let Q=RR0($.created);if(!Q)return;return Z.lastStripeEventAt&&Z.lastStripeEventAt>Q?void 0:Q}async function Oz6($,Z){let Q=Z.data.object;switch(Z.type){case"checkout.session.completed":case"checkout.session.async_payment_succeeded":{let X=XF(Y3(Q.metadata)?.orgId);if(!X)return{handled:!1,reason:"no orgId"};if(XF(Y3(Q.metadata)?.kind)==="topup"){if(Q.mode!=="payment")return{handled:!1,reason:"topup with wrong mode"};if(XF(Q.payment_status)!=="paid")return{handled:!1,reason:"payment not confirmed"};let J=XF(Q.id);if(!J)return console.error("stripe webhook: topup session without id",{eventId:Z.id,organizationId:X}),{handled:!1,reason:"topup session without id"};let W=Number(Y3(Q.metadata)?.creditCents);if(!Number.isInteger(W)||W<=0)return console.error("stripe webhook: paid topup with bad metadata \u2014 credit NOT applied",{eventId:Z.id,organizationId:X,creditCents:Y3(Q.metadata)?.creditCents}),{handled:!1,reason:"bad topup metadata"};return{handled:!0,organizationId:X,topUp:{creditCents:W,referenceId:`stripe-topup:${J}`}}}if(Q.mode!=="subscription")return{handled:!1,reason:"not a subscription checkout"};if(XF(Q.payment_status)!=="paid")return{handled:!1,reason:"payment not confirmed"};let Y=await $.getBilling(X);if(!Y)return{handled:!1,reason:"unknown org"};let G=yY1(Q.subscription);if(Y.stripeSubscriptionId&&G&&Y.stripeSubscriptionId!==G)return console.error("stripe webhook: refused checkout rebind",{organizationId:X,eventId:Z.id}),{handled:!1,reason:"org already bound to another subscription",orphanSubscriptionId:G};if(bY1(Z,Y))return{handled:!1,reason:"stale event"};return await $.updateStripeState(X,{stripeCustomerId:yY1(Q.customer),stripeSubscriptionId:G,status:"active",lastStripeEventAt:xY1(Z,Y)}),{handled:!0,organizationId:X}}case"customer.subscription.updated":case"customer.subscription.deleted":{let X=XF(Q.id);if(!X)return{handled:!1,reason:"no sub id"};let Y=await $.getBillingByStripeSubscriptionId(X);if(!Y)return{handled:!1,reason:"unknown subscription"};let G=Z.type==="customer.subscription.deleted";if(!G&&bY1(Z,Y))return{handled:!1,reason:"stale event"};let J=G?"canceled":Pt$(Q.status);return await $.updateStripeState(Y.organizationId,{status:J,currentPeriodEnd:Bz6(Q),...G&&{stripeSubscriptionId:null},lastStripeEventAt:xY1(Z,Y)}),{handled:!0,organizationId:Y.organizationId}}case"invoice.paid":{let X=Nz6(Q);if(!X)return{handled:!1,reason:"no sub id"};let Y=await $.getBillingByStripeSubscriptionId(X);if(!Y)return{handled:!1,reason:"unknown subscription"};if(bY1(Z,Y))return{handled:!1,reason:"stale event"};return await $.updateStripeState(Y.organizationId,{status:"active",currentPeriodEnd:RR0(Q.period_end),lastStripeEventAt:xY1(Z,Y)}),{handled:!0,organizationId:Y.organizationId}}default:return{handled:!1,reason:`unhandled event ${Z.type}`}}}function Dz6($,Z){if(!Z.handled||$.livemode===!1)return null;let Q=$.data.object;if(Z.topUp)return{name:"credits_topup_succeeded",organizationId:Z.organizationId,properties:{credit_cents:Z.topUp.creditCents}};switch($.type){case"checkout.session.completed":case"checkout.session.async_payment_succeeded":return{name:"subscription_started",organizationId:Z.organizationId,properties:{}};case"customer.subscription.deleted":return{name:"subscription_canceled",organizationId:Z.organizationId,properties:{}};case"customer.subscription.updated":return{name:"subscription_updated",organizationId:Z.organizationId,properties:{status:Pt$(Q.status),...typeof Q.cancel_at_period_end==="boolean"?{cancel_at_period_end:Q.cancel_at_period_end}:{}}};case"invoice.paid":if(Q.billing_reason==="subscription_create")return null;return{name:"subscription_renewed",organizationId:Z.organizationId,properties:{}};default:return null}}function Et$($,Z){let Q=Dz6($,Z);if(!Q)return;ZG({event:Q.name,organizationId:Q.organizationId,...$.id?{uuid:er1(`stripe:${$.id}:${Q.name}`)}:{},...$.created?{timestamp:new Date($.created*1000)}:{},properties:Q.properties})}async function At$($){let Z=new _K(Z8().db),Q=await Oz6(Z,$);if(!(Q.handled&&Q.topUp))Et$($,Q);if(Q.handled&&Q.topUp)await FT$({organizationId:Q.organizationId,amountCents:Q.topUp.creditCents,referenceId:Q.topUp.referenceId}),Et$($,Q);if(!Q.handled&&Q.orphanSubscriptionId)try{await w8$(Q.orphanSubscriptionId),console.error("stripe webhook: canceled orphan subscription",{subscriptionId:Q.orphanSubscriptionId,eventId:$.id})}catch(X){if(!(X instanceof WG&&(X.status===400||X.status===404)))throw X}return Q}var Uz6=300;var Tt$=D(()=>{NJ();g4();FZ0();Pj();u81()});var wz6=1048576,gY1;var Rt$=D(()=>{u$();rH();E$();Tt$();gY1=new Q1;gY1.post("/webhook",Z9({maxSize:wz6,onError:($)=>$.json({error:"payload too large"},413)}),async($)=>{let Z=M0().stripeWebhookSecret;if(!Z)return $.json({error:"stripe billing not configured"},503);let Q=await $.req.text();if(!jt$(Q,$.req.header("stripe-signature"),Z))return $.json({error:"invalid signature"},400);let Y=zt$(Q);if(!Y)return $.json({error:"invalid payload"},400);let G=await At$(Y);return console.log("stripe webhook",{eventId:Y.id,type:Y.type,livemode:Y.livemode,...G}),$.json({received:!0})})});import{timingSafeEqual as Lz6}from"crypto";function zz6($,Z,Q){if(!Z?.startsWith("sha256="))return!1;let X=new Bun.CryptoHasher("sha256",Q).update($).digest("hex"),Y=Z.slice(7);if(Y.length!==X.length)return!1;return Lz6(Buffer.from(Y),Buffer.from(X))}function Pz6($,Z){let Q=Z,X=Q?.repository?.name,Y=Q?.repository?.owner?.login;if(typeof X!=="string"||typeof Y!=="string")return[];let G=[];if($==="check_suite"){if(Q.action!=="completed")return[];let J=Q.check_suite?.pull_requests;for(let W of Array.isArray(J)?J:[]){let K=W?.number;if(typeof K==="number")G.push(K)}}else if($==="issue_comment"&&Q.issue?.pull_request){let J=Q.issue.number;if(typeof J==="number")G.push(J)}return[...new Set(G)].map((J)=>({repoOwner:Y,repoName:X,number:J}))}function qt$($){let Z=new Q1;return Z.post("/webhook",Z9({maxSize:Ez6,onError:(Q)=>Q.json({error:"payload too large"},413)}),async(Q)=>{let X=process.env.GITHUB_WEBHOOK_SECRET;if(!X)return Q.json({error:"github webhook not configured"},503);let Y=await Q.req.text();if(!zz6(Y,Q.req.header("x-hub-signature-256"),X))return Q.json({error:"invalid signature"},400);let G=Q.req.header("x-github-event");if(G!=="push"&&!jz6.has(G??""))return Q.json({ok:!0,ignored:"event"});let J;try{J=JSON.parse(Y)}catch{return Q.json({error:"invalid payload"},400)}if(G==="push"){let H=J.ref,F=J.repository?.full_name;if(!H||!F)return Q.json({ok:!0,ignored:"shape"});let N=(await Fo0())?.markTenantPoolsDirty(F,H)??[];return Q.json({ok:!0,pools:N})}let W=Pz6(G??"",J);if(W.length===0)return Q.json({ok:!0,ignored:"no-pr"});let K=await Az6($,W);return Q.json({ok:!0,refreshed:K})}),Z}async function Az6($,Z){let Q=0;for(let X of Z){let Y=$.taskBoard(),G;try{G=await Y.findPrLinks(X)}catch(J){console.error("[github-webhook] pr link lookup failed:",J);continue}for(let J of G)try{let W=await Y.getById(J.taskBoardItemId,J.organizationId),K=W?await $.contextFactory()(J.organizationId,W.assignedBy??W.createdBy):null;if(!K)continue;if(await lB$(K,J.organizationId,J.taskBoardItemId)!==null)Q++}catch(W){console.error(`[github-webhook] pr card refresh failed for ${J.taskBoardItemId}:`,W)}}return Q}var Ez6=5242880,jz6;var It$=D(()=>{u$();rH();FW();AZ();jz6=new Set(["check_suite","issue_comment"])});function Mt$($){let Z=new EN($.db,new oQ($.encryptionKey)),Q=new Q1;return Q.get("/attachments/:token",async(X)=>{let Y=NN$(X.req.param("token"));if(!Y)return X.json({error:"Invalid or expired link"},404);let G=await Z.getByOrg(Y.organizationId);if(!G)return X.json({error:"Jira is not connected"},404);let W=await new zG(G.siteUrl,G.email,G.apiToken).downloadAttachment(Y.attachmentId);if(!W.ok||!W.body)return X.json({error:"Jira refused the download"},502);let K=new Headers;for(let H of["content-type","content-length","content-disposition"]){let F=W.headers.get(H);if(F)K.set(H,F)}return K.set("cache-control","no-store"),new Response(W.body,{status:200,headers:K})}),Q}var kt$=D(()=>{u$();zB();Is0();v_()});function Vt$($){if(typeof $!=="object"||$===null)return null;let Z=$;if(Z.webhookEvent!=="jira:issue_updated")return null;let Q=Z.issue?.id,X=Z.issue?.key,Y=Z.changelog?.id;if(typeof Q!=="string"&&typeof Q!=="number"||typeof X!=="string"||typeof Y!=="string"&&typeof Y!=="number")return null;let G=Z.changelog?.items?.find((J)=>J.field==="status");if(!G||typeof G.toString!=="string")return null;return{issueId:String(Q),issueKey:X,toStatus:G.toString,changelogId:String(Y)}}function St$($,Z,Q){let X=[];for(let Y of Z){if(new Date(Y.created).getTime()<Q.getTime())continue;let G=Y.items.find((J)=>J.field==="status");if(!G||typeof G.toString!=="string")continue;X.push({issueId:$.id,issueKey:$.key,toStatus:G.toString,changelogId:Y.id})}return X.sort((Y,G)=>Number(Y.changelogId)-Number(G.changelogId))}function qz6($){return`Jira ${$.key}: ${$.summary}`}async function qR0($,Z,Q){if(!Z.enabled)return"disabled";let X=Z.organizationId,Y=await $.storage.jiraIntegrations.getAutomation(X,Q.toStatus);if(!Y)return"no_rule";let G=new zG(Z.siteUrl,Z.email,Z.apiToken),J=await dL0(G,Z.siteUrl,Q.issueId),W=await Iz6($,Z,Q,J);if(!await $.storage.jiraIntegrations.claimTrigger(X,Q.issueId,Q.changelogId))return"duplicate";let H=await $.storage.taskBoard.update(W.id,X,{assigneeId:n$,assignedBy:Z.createdBy},Z.createdBy);try{await TW($,H,{instruction:Y.prompt??Tz6,source:{kind:"jira",issueKey:J.key,title:qz6(J),body:`${mL0(J)}
|
|
2932
2932
|
|