decocms 4.297.4 → 4.297.6
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-SZcDTzHd.js → AlertCircle-Dp6ZlZYR.js} +1 -1
- package/dist/client/assets/{AreaChart-D3iExEwu.js → AreaChart-CLIsSolL.js} +1 -1
- package/dist/client/assets/{ArrowLeft-B4ArFLof.js → ArrowLeft-DcwBClUS.js} +1 -1
- package/dist/client/assets/{ArrowUp-CGtK33X4.js → ArrowUp-he2sU4Sr.js} +1 -1
- package/dist/client/assets/{Check-BVKnNRxb.js → Check-07BNkESk.js} +1 -1
- package/dist/client/assets/{CheckCircle-CFLPWJqp.js → CheckCircle-D0NiMcGY.js} +1 -1
- package/dist/client/assets/{ChevronDown-DPyQprhl.js → ChevronDown-DhOyrBbL.js} +1 -1
- package/dist/client/assets/{ChevronRight-BcyhZob9.js → ChevronRight-Cv2J3rWD.js} +1 -1
- package/dist/client/assets/{ChevronSelectorVertical-BTBwlOVK.js → ChevronSelectorVertical-CsgsXPiX.js} +1 -1
- package/dist/client/assets/{ChevronUp-CRNBMezi.js → ChevronUp-YHn02fNr.js} +1 -1
- package/dist/client/assets/{Copy01-DgP9zHlK.js → Copy01-CmIcrSa6.js} +1 -1
- package/dist/client/assets/{CreditCard01-BPJwKxBZ.js → CreditCard01-CIhTHldk.js} +1 -1
- package/dist/client/assets/{DotsVertical-Bdn6WfZr.js → DotsVertical--3-_GzX9.js} +1 -1
- package/dist/client/assets/{Download01-Cq-cjzdI.js → Download01-toNys3fD.js} +1 -1
- package/dist/client/assets/{Eye-BVXGxbID.js → Eye-DTjOHr1S.js} +1 -1
- package/dist/client/assets/{FilterLines-B9MIm8jC.js → FilterLines-MpMMN0by.js} +1 -1
- package/dist/client/assets/{Globe01-DtvbdjDI.js → Globe01-CAdoRaMK.js} +1 -1
- package/dist/client/assets/{Globe04-BGZGJdIr.js → Globe04-nAO-wIKX.js} +1 -1
- package/dist/client/assets/{HardDrive-BkyiKymv.js → HardDrive-C0hN27ts.js} +1 -1
- package/dist/client/assets/{Key01-Dc45dzTC.js → Key01-wRDbp013.js} +1 -1
- package/dist/client/assets/{LinkExternal01-74ZQ5CW3.js → LinkExternal01-DDRldwTf.js} +1 -1
- package/dist/client/assets/{LockUnlocked01-HRPoF94f.js → LockUnlocked01-CdQhQaHo.js} +1 -1
- package/dist/client/assets/{LogOut01-J_j1af_K.js → LogOut01-CnFpkvWe.js} +1 -1
- package/dist/client/assets/{Monitor01-2dFx1783.js → Monitor01-DalysQsB.js} +1 -1
- package/dist/client/assets/{Palette-CvIQyY4y.js → Palette-D-kLCHzw.js} +1 -1
- package/dist/client/assets/{Play-DBq5ykwL.js → Play-Ba4OZRO0.js} +1 -1
- package/dist/client/assets/{Plus-D73gXSwq.js → Plus-Cr5CpNvW.js} +1 -1
- package/dist/client/assets/{SearchLg-D_4EYfC1.js → SearchLg-BD9EVt5N.js} +1 -1
- package/dist/client/assets/{SearchMd-CBFnhOQR.js → SearchMd-BnpHcTtG.js} +1 -1
- package/dist/client/assets/{Settings02-DWSzdeAu.js → Settings02-CIRSyyiS.js} +1 -1
- package/dist/client/assets/{Share07-BsGHUcGB.js → Share07-G9fx3Q9L.js} +1 -1
- package/dist/client/assets/{Shield01-DcQGH2Gk.js → Shield01-DOrHTNkg.js} +1 -1
- package/dist/client/assets/{Stars01-CDftv7hW.js → Stars01-75kZesHq.js} +1 -1
- package/dist/client/assets/{Stars02-BAeHkghn.js → Stars02-D5uaU5zd.js} +1 -1
- package/dist/client/assets/{Sun-B0bRqjmA.js → Sun-Bz3jRIqc.js} +1 -1
- package/dist/client/assets/{SwitchHorizontal01-Cf3ElbOx.js → SwitchHorizontal01-BtFl3JWf.js} +1 -1
- package/dist/client/assets/{Tool01-UB4iVZea.js → Tool01-VmLtH0nt.js} +1 -1
- package/dist/client/assets/{Tool02-Depaw8PM.js → Tool02-CLP5V5w_.js} +1 -1
- package/dist/client/assets/{Trash01-BRCsH68l.js → Trash01-B_i3PMbq.js} +1 -1
- package/dist/client/assets/{TrendUp01-B-LdWREV.js → TrendUp01-DiRmR7Jx.js} +1 -1
- package/dist/client/assets/{Upload01-DaOD6fZX.js → Upload01-4W6462bd.js} +1 -1
- package/dist/client/assets/{User01-CTHIhpQ9.js → User01-acLUirHu.js} +1 -1
- package/dist/client/assets/{UserSquare-CDNT9BVl.js → UserSquare-CD6rB0Mt.js} +1 -1
- package/dist/client/assets/{Users01-CPm6scUb.js → Users01-CPikD5PC.js} +1 -1
- package/dist/client/assets/{Users03-BL8daW46.js → Users03-DM6R-U2Y.js} +1 -1
- package/dist/client/assets/{XCircle-Br-CcVW-.js → XCircle-nx54qiA1.js} +1 -1
- package/dist/client/assets/{XClose-CND46LC5.js → XClose-DWRp5M8X.js} +1 -1
- package/dist/client/assets/{YAxis-9mLWbFny.js → YAxis-Blx93tnj.js} +1 -1
- package/dist/client/assets/{Zap-BXE1Wm29.js → Zap-DJCvDwma.js} +1 -1
- package/dist/client/assets/{ZapSquare-BKSoDgYp.js → ZapSquare-7BZcnvlP.js} +1 -1
- package/dist/client/assets/{access-gate-CG0Jl7eK.js → access-gate-BqJfgvia.js} +1 -1
- package/dist/client/assets/{agent-icon-CYVpijDG.js → agent-icon-DbEHgX-P.js} +1 -1
- package/dist/client/assets/{agents-list-ISYhEX9o.js → agents-list-u3uKfJUZ.js} +1 -1
- package/dist/client/assets/{ai-providers-Dwn6bF6W.js → ai-providers-BRMGsfAO.js} +1 -1
- package/dist/client/assets/{alert-CTVUNdHZ.js → alert-87ZoISUI.js} +1 -1
- package/dist/client/assets/{alert-dialog-D63fpGRD.js → alert-dialog-BUuk5lcR.js} +1 -1
- package/dist/client/assets/{api-keys-CxBo7cNM.js → api-keys-D70DMJZx.js} +1 -1
- package/dist/client/assets/{app-editor-JGUDZERh.js → app-editor-D97p-uts.js} +1 -1
- package/dist/client/assets/{auth-BRbdWVq4.js → auth-BjjAKPdO.js} +1 -1
- package/dist/client/assets/{auth-catchall-CDs4MkM8.js → auth-catchall-DLNpdPYX.js} +1 -1
- package/dist/client/assets/{auth-entry-CaeorY4u.js → auth-entry-uAAYHr0C.js} +1 -1
- package/dist/client/assets/{auth-split-layout-3AT5JyFf.js → auth-split-layout-BfI9c-zJ.js} +1 -1
- package/dist/client/assets/{authenticate-and-persist-oauth-DvRyhelP.js → authenticate-and-persist-oauth-BpIYdUlz.js} +1 -1
- package/dist/client/assets/{automation-list-row-D6x5wjy8.js → automation-list-row-BTLGh__Y.js} +1 -1
- package/dist/client/assets/{automation-runs-DEt_xznR.js → automation-runs-Dt5duQ0J.js} +1 -1
- package/dist/client/assets/{automations-DaCKCCQW.js → automations-CROR6ZNT.js} +1 -1
- package/dist/client/assets/{avatar-CCUY6IGp.js → avatar-BS-tEYCe.js} +1 -1
- package/dist/client/assets/{badge-BD5l1Gdh.js → badge-CFRe-nD1.js} +1 -1
- package/dist/client/assets/{block-document-DtQz41OQ.js → block-document-DLPEnvuu.js} +1 -1
- package/dist/client/assets/{breadcrumb-CszXJnDw.js → breadcrumb-2i2x9k0L.js} +1 -1
- package/dist/client/assets/{buckets-Cw6UyxU7.js → buckets-BSoW2eqi.js} +1 -1
- package/dist/client/assets/{bulk-category-panel-D_LfiRIJ.js → bulk-category-panel-Cc_OMOog.js} +1 -1
- package/dist/client/assets/{capability-load-error-DhEEutMi.js → capability-load-error-COL43_Mx.js} +1 -1
- package/dist/client/assets/{cards-w5TNNISn.js → cards-DYEOYym-.js} +1 -1
- package/dist/client/assets/{category-editor-Y3Au0o8z.js → category-editor-CPMdxySY.js} +1 -1
- package/dist/client/assets/{chart-DT4FL6-7.js → chart-BhO82AZ9.js} +1 -1
- package/dist/client/assets/{chat-context-Rb-1CzVr.js → chat-context-BEqsjQmO.js} +1 -1
- package/dist/client/assets/{checkbox-Cpz_9WIp.js → checkbox-D5nOQ93h.js} +1 -1
- package/dist/client/assets/{choose-editor-CEv8HCqr.js → choose-editor-Bl4ixlsS.js} +1 -1
- package/dist/client/assets/{cli-auth-success-DDJ0WcP1.js → cli-auth-success-DHoExdJx.js} +1 -1
- package/dist/client/assets/{collection-detail-zSxwXkJC.js → collection-detail-CxCCExnM.js} +1 -1
- package/dist/client/assets/{collection-display-button-DtpCzJlS.js → collection-display-button-PH5obTEl.js} +1 -1
- package/dist/client/assets/{collection-search-yws9XCIC.js → collection-search-_icrgZY2.js} +1 -1
- package/dist/client/assets/{collection-table-wrapper-CfrpONpV.js → collection-table-wrapper-DUao6haA.js} +1 -1
- package/dist/client/assets/{collection-tabs-BdpskJvV.js → collection-tabs-C9z-M1hW.js} +1 -1
- package/dist/client/assets/{command-Bv5rqoSn.js → command-Cr6yO9J6.js} +1 -1
- package/dist/client/assets/{commerce-onboarding-Czy0tiaP.js → commerce-onboarding-CPAGL1fF.js} +1 -1
- package/dist/client/assets/{config-C8Eimitx.js → config-DjJwkqAh.js} +1 -1
- package/dist/client/assets/{connect-gXRIsW8H.js → connect-CtKH97QE.js} +1 -1
- package/dist/client/assets/{connection-card-DPYH7bIs.js → connection-card-oGGVJVEj.js} +1 -1
- package/dist/client/assets/{connection-detail-DqEAPL81.js → connection-detail-B0gkC1Zi.js} +1 -1
- package/dist/client/assets/{connection-form-helpers-B1NHeXnr.js → connection-form-helpers-GREUhGXH.js} +1 -1
- package/dist/client/assets/{connection-BMFSUcVL.js → connection-hAIey6c9.js} +1 -1
- package/dist/client/assets/{connections-DF69aH0y.js → connections-Cr76VzkO.js} +1 -1
- package/dist/client/assets/{decopilot-sse-pool-C90CZsqR.js → decopilot-sse-pool-XTa9osf_.js} +1 -1
- package/dist/client/assets/{dialog-C03fm9Do.js → dialog-Bw8jIxhH.js} +1 -1
- package/dist/client/assets/{domain-settings-B_QmK2nR.js → domain-settings-DdYf0Rwz.js} +1 -1
- package/dist/client/assets/{drawer-BXqSWSdi.js → drawer-BFvmL2Y1.js} +1 -1
- package/dist/client/assets/{dropdown-menu-C6BCq19N.js → dropdown-menu-DP13EbUQ.js} +1 -1
- package/dist/client/assets/{empty-state-Bf-ZRVHX.js → empty-state-V20uqIl7.js} +1 -1
- package/dist/client/assets/{extract-connection-data-NqlcKtVm.js → extract-connection-data-C40FHFBb.js} +1 -1
- package/dist/client/assets/{file-explorer-DXYG7PB_.js → file-explorer-9Mlxcrfr.js} +1 -1
- package/dist/client/assets/{file-type-icon-ClRC6FOm.js → file-type-icon-BunvGKDc.js} +1 -1
- package/dist/client/assets/{form-DquZkH1v.js → form-Co9Mo2GI.js} +1 -1
- package/dist/client/assets/{general-VW0KBHL0.js → general-DdBZ_dD-.js} +1 -1
- package/dist/client/assets/{github-repo-picker-T2EIxl75.js → github-repo-picker-ChEu6h_O.js} +1 -1
- package/dist/client/assets/{hooks-7NFenss-.js → hooks-pL2E-0zH.js} +1 -1
- package/dist/client/assets/{index-ChFIY0ta.js → index-2L98sMK_.js} +1 -1
- package/dist/client/assets/{index-D2WaICIs.js → index-BD4hER2u.js} +1 -1
- package/dist/client/assets/{index-OG-cLGJ3.js → index-BrDSS0vH.js} +3 -3
- package/dist/client/assets/{index-B_nXo7ei.js → index-CH20ZECW.js} +1 -1
- package/dist/client/assets/{index-DWVtOyc1.js → index-Cj8ZZ4fT.js} +1 -1
- package/dist/client/assets/{index-yfHQcuuf.js → index-DotZRxLq.js} +1 -1
- package/dist/client/assets/{index-yhgDq29i.js → index-DpPE5ISD.js} +1 -1
- package/dist/client/assets/{index-D-oPLNTh.js → index-PaLatgUv.js} +6 -6
- package/dist/client/assets/{index-D5nmXNZX.js → index-S0YqkiQf.js} +1 -1
- package/dist/client/assets/{index-redirect-BsTcPyLb.js → index-redirect-CC2Sa-aj.js} +1 -1
- package/dist/client/assets/{infra-billing-D7f3ollk.js → infra-billing-ZonDjQey.js} +1 -1
- package/dist/client/assets/{input-CoQktCJl.js → input-CG2BXvBG.js} +1 -1
- package/dist/client/assets/{integration-icon-68nof6op.js → integration-icon-DNJlj9SH.js} +1 -1
- package/dist/client/assets/{invite-member-dialog-C8S8TSmf.js → invite-member-dialog-BtV1hFV0.js} +1 -1
- package/dist/client/assets/{label-DpF7DceF.js → label-DO8rqj8R.js} +1 -1
- package/dist/client/assets/{layout-Crw9RSGY.js → layout-CvyGinSF.js} +1 -1
- package/dist/client/assets/{login-iFLeAxXW.js → login-BXwH6k7w.js} +1 -1
- package/dist/client/assets/{mcp-oauth-BTPTAXqM.js → mcp-oauth-CTPC1gLp.js} +1 -1
- package/dist/client/assets/{members-qf0dPDE9.js → members-D7maqetW.js} +1 -1
- package/dist/client/assets/{monaco-editor-d1AOiqqe.js → monaco-editor-DeCGAxQs.js} +1 -1
- package/dist/client/assets/{monitoring-stats-row-BAW81GZ7.js → monitoring-stats-row-B6LpZc_k.js} +1 -1
- package/dist/client/assets/{multi-select-B6mqOWpW.js → multi-select-DXNwV172.js} +1 -1
- package/dist/client/assets/{oauth-callback-CZDAgxdM.js → oauth-callback-CEKSqYcn.js} +1 -1
- package/dist/client/assets/{oauth-callback-ai-provider-C6bSOFfR.js → oauth-callback-ai-provider-DUIbaTiW.js} +1 -1
- package/dist/client/assets/{onboarding-CPzXf3hP.js → onboarding-DEwiMojw.js} +1 -1
- package/dist/client/assets/{org-layout-DT7eVbOL.js → org-layout-DMMr4dJ0.js} +1 -1
- package/dist/client/assets/{organization-choice-BBt12B_8.js → organization-choice-Dk_FX4P6.js} +1 -1
- package/dist/client/assets/{orgs-CCQdlPhm.js → orgs-Di6SKByT.js} +1 -1
- package/dist/client/assets/{page-seo-form-C9E5fQgz.js → page-seo-form-DlHjGiwH.js} +1 -1
- package/dist/client/assets/{popover-DRktyE8k.js → popover-Bv7C0yQo.js} +1 -1
- package/dist/client/assets/{post-calendar-iA02LEop.js → post-calendar-Cxd75fx7.js} +1 -1
- package/dist/client/assets/{post-editor-D3dceKpU.js → post-editor-Cg-zq355.js} +1 -1
- package/dist/client/assets/{primitives-BrTKJcge.js → primitives-CgbIYl4-.js} +1 -1
- package/dist/client/assets/{profile-DZidRo8-.js → profile-CdeZVVAJ.js} +1 -1
- package/dist/client/assets/{project-app-view-DidtJbDX.js → project-app-view-DL0bWcLc.js} +1 -1
- package/dist/client/assets/{prompts-BRD2JQkA.js → prompts-IHTaxT_o.js} +1 -1
- package/dist/client/assets/record-editor-TEY7fcTW.js +1 -0
- package/dist/client/assets/redirect-editor-TBzcW6tr.js +1 -0
- package/dist/client/assets/registry-DhYngTg1.js +2 -0
- package/dist/client/assets/{registry-layout-03XhsFAz.js → registry-layout-CZIbrMOo.js} +1 -1
- package/dist/client/assets/{reports-CcoyBluC.js → reports-CJrbJ-aD.js} +1 -1
- package/dist/client/assets/{require-capability-D6mMZMC9.js → require-capability-10i6vpoS.js} +1 -1
- package/dist/client/assets/{required-auth-layout-CBmC8H_l.js → required-auth-layout-C3Ofr9_V.js} +1 -1
- package/dist/client/assets/{reset-password-uWa2ZQKw.js → reset-password-CIrEuZXd.js} +1 -1
- package/dist/client/assets/{review-settings-D47Iw2Vj.js → review-settings-SSNM19fg.js} +1 -1
- package/dist/client/assets/{roles-Ca7WjJKc.js → roles-C6FlHdCA.js} +1 -1
- package/dist/client/assets/{scroll-area-AmuYtPaJ.js → scroll-area-C1ovkzqz.js} +1 -1
- package/dist/client/assets/{search-input-BCf51g10.js → search-input-CGMH8IA5.js} +1 -1
- package/dist/client/assets/{secrets-SDubcvDc.js → secrets-4alwTWuf.js} +1 -1
- package/dist/client/assets/{sections-editor-rTROLbub.js → sections-editor-C6zith-E.js} +1 -1
- package/dist/client/assets/{select-CFrGFxwx.js → select-DpcwZ72F.js} +1 -1
- package/dist/client/assets/{select-model-B4aqkyp3.js → select-model-BI-dA8gZ.js} +1 -1
- package/dist/client/assets/{self-tool-result-q937jpNM.js → self-tool-result-DCxhe8ja.js} +1 -1
- package/dist/client/assets/{seo-editor-DwtFxOUm.js → seo-editor-C7gzHB1I.js} +1 -1
- package/dist/client/assets/{settings-layout-jOPqVY02.js → settings-layout-DkAZTQ2a.js} +1 -1
- package/dist/client/assets/{shell-controls-C0ovdkz_.js → shell-controls-wcxv3dCy.js} +1 -1
- package/dist/client/assets/{shell-layout-DbyWkEwW.js → shell-layout-63QoGcpp.js} +1 -1
- package/dist/client/assets/{spinner-Del5h0VC.js → spinner-CuCGw0zq.js} +1 -1
- package/dist/client/assets/{sso-wOTZCy-g.js → sso-BvJ-0huH.js} +1 -1
- package/dist/client/assets/{store-CA-87B-H.js → store-BP5AR9Ic.js} +1 -1
- package/dist/client/assets/store-registry-Biov3Lnl.js +2 -0
- package/dist/client/assets/{super-agent-icon-CqxK-cWE.js → super-agent-icon-GgzP8ta8.js} +1 -1
- package/dist/client/assets/{switch-D-XeHCY4.js → switch--ZlKCa-F.js} +1 -1
- package/dist/client/assets/{synced-repos-ClMeWJ-b.js → synced-repos-C_5rDao7.js} +1 -1
- package/dist/client/assets/{table-q4lNz4NU.js → table-BipKiwEL.js} +1 -1
- package/dist/client/assets/{tabs-Cf4wWJQQ.js → tabs-CKMDW8vU.js} +1 -1
- package/dist/client/assets/{task-board-C87qjoys.js → task-board-Dp7JXy98.js} +1 -1
- package/dist/client/assets/{tasks-DaXzBW1K.js → tasks-DRGb0eLU.js} +1 -1
- package/dist/client/assets/{textarea-oSE0nXPi.js → textarea-BoTumDit.js} +1 -1
- package/dist/client/assets/{toggle-group-wL3Ae0-d.js → toggle-group-zLUBlOPI.js} +1 -1
- package/dist/client/assets/{toolbar-B4cjYH26.js → toolbar-Dk5WFAot.js} +1 -1
- package/dist/client/assets/{track-BS8hiYrv.js → track-B0Yrx2v1.js} +1 -1
- package/dist/client/assets/{types-BBGiY_5u.js → types-rth0od0M.js} +1 -1
- package/dist/client/assets/{use-ai-providers-D2D_qMTE.js → use-ai-providers-CxY1HQ0n.js} +1 -1
- package/dist/client/assets/{use-api-keys-I_NXPYmb.js → use-api-keys-ej0l_Wa_.js} +1 -1
- package/dist/client/assets/{use-automations-HQapDryZ.js → use-automations-tkJpD40-.js} +1 -1
- package/dist/client/assets/{use-autosave-B98jErnm.js → use-autosave-Bo6QQt-2.js} +1 -1
- package/dist/client/assets/{use-connection-8Rs00y0x.js → use-connection-CigRkG_8.js} +1 -1
- package/dist/client/assets/{use-copy-4cwy4-LT.js → use-copy-CM2jC_7i.js} +1 -1
- package/dist/client/assets/{use-create-virtual-mcp-U77SN8Qt.js → use-create-virtual-mcp-EWwwwVz_.js} +1 -1
- package/dist/client/assets/{use-debounced-autosave-C0rvvRkr.js → use-debounced-autosave-crX_AMVn.js} +1 -1
- package/dist/client/assets/{use-debounced-value-DNLFihnS.js → use-debounced-value-DWJO8nvY.js} +1 -1
- package/dist/client/assets/{use-decopilot-events-Ch4qHpo5.js → use-decopilot-events-C0F2SQd9.js} +1 -1
- package/dist/client/assets/{use-delete-connection-CeL_ckgK.js → use-delete-connection-BYaP7eW8.js} +1 -1
- package/dist/client/assets/{use-deployment-admin-DUXIITA9.js → use-deployment-admin-DD08Dk6l.js} +1 -1
- package/dist/client/assets/{use-destination-route-bPkxA4tB.js → use-destination-route-D-tMiU7z.js} +1 -1
- package/dist/client/assets/{use-file-configs-CGiQJdYc.js → use-file-configs-CS0ZXqXi.js} +1 -1
- package/dist/client/assets/{use-infinite-scroll-DL0OQBln.js → use-infinite-scroll-mm-iRnP3.js} +1 -1
- package/dist/client/assets/{use-join-requests-DCt3pFBl.js → use-join-requests-CsEZPmjA.js} +1 -1
- package/dist/client/assets/{use-mcp-auth-status-4yRgLUMe.js → use-mcp-auth-status-C4AweF_A.js} +1 -1
- package/dist/client/assets/{use-mcp-client-BWAlgISY.js → use-mcp-client-Bvg7XHk9.js} +1 -1
- package/dist/client/assets/{use-mcp-tools-D0n7vAmG.js → use-mcp-tools-QHHoZ2b5.js} +1 -1
- package/dist/client/assets/{use-members-vu0ptsMx.js → use-members-dnCEd_I-.js} +1 -1
- package/dist/client/assets/{use-navigate-to-agent-DHZ5Fe9d.js → use-navigate-to-agent-DgDtQ7iN.js} +1 -1
- package/dist/client/assets/{use-org-auth-client-C1Q0xST6.js → use-org-auth-client-cQ44YMKg.js} +1 -1
- package/dist/client/assets/{use-org-repo-syncs-BCM9o7yp.js → use-org-repo-syncs-CTap8mHN.js} +1 -1
- package/dist/client/assets/{use-org-sso-CtTUq6BR.js → use-org-sso-C9uxUHvy.js} +1 -1
- package/dist/client/assets/{use-organization-roles-D-OoD-Ne.js → use-organization-roles-D5IggfUv.js} +1 -1
- package/dist/client/assets/{use-organization-settings-BMYtcpXR.js → use-organization-settings-B5x_2l31.js} +1 -1
- package/dist/client/assets/{use-panel-navigate-XVJJmMjD.js → use-panel-navigate-BPSosfvG.js} +1 -1
- package/dist/client/assets/{use-registry-connections-Cy7w-ULD.js → use-registry-connections-DNfmYK-s.js} +1 -1
- package/dist/client/assets/{use-secrets-2qXibeIA.js → use-secrets-DuRMdB6_.js} +1 -1
- package/dist/client/assets/{use-section-preview-base-DChDxOBy.js → use-section-preview-base-BFNeWLDp.js} +1 -1
- package/dist/client/assets/{use-status-sounds-DFyxJKtG.js → use-status-sounds-B7qbfIHU.js} +1 -1
- package/dist/client/assets/{use-tags-DC3LcPId.js → use-tags-CJoE7Mdv.js} +1 -1
- package/dist/client/assets/{use-view-mode-ByEum1TJ.js → use-view-mode-BDsVnHNu.js} +1 -1
- package/dist/client/assets/{use-virtual-mcp-Ccd9LuyW.js → use-virtual-mcp-DmXgREYQ.js} +1 -1
- package/dist/client/assets/useInfiniteQuery-KYE-CFE3.js +1 -0
- package/dist/client/assets/useSuspenseInfiniteQuery-BO9Wr8TN.js +1 -0
- package/dist/client/assets/{users--wzjVmtB.js → users-CSxyAh6H.js} +1 -1
- package/dist/client/assets/{variant-calendar-C7AvlA7w.js → variant-calendar-DHBUpFID.js} +1 -1
- package/dist/client/assets/{view-mode-toggle-BZzQ-U0A.js → view-mode-toggle--pHeBkRS.js} +1 -1
- package/dist/client/index.html +1 -1
- package/dist/server/cli.js +3 -3
- package/dist/server/server.js +3 -3
- package/package.json +1 -1
- package/dist/client/assets/record-editor-Bz7Q4Gui.js +0 -1
- package/dist/client/assets/redirect-editor-B3RxiC5F.js +0 -1
- package/dist/client/assets/registry-DHLllLlS.js +0 -2
- package/dist/client/assets/store-registry-uj0JlhzS.js +0 -2
- package/dist/client/assets/useInfiniteQuery-BSLzlLhq.js +0 -1
- package/dist/client/assets/useSuspenseInfiniteQuery-Z2ItFoMM.js +0 -1
package/dist/server/server.js
CHANGED
|
@@ -888,7 +888,7 @@ You are the Usage Manager. You analyze how this workspace is actually used \u201
|
|
|
888
888
|
d. Report the failing tool/connection, error pattern, and suggest the fix or owner.
|
|
889
889
|
</workflows>`,cr1={id:"studio-usage-manager",title:"Usage Manager",icon:"icon://BarChart10?color=blue",description:"Analyze usage, costs, and clean up idle agents and connections",selectedTools:["MONITORING_STATS","MONITORING_LOGS_LIST","MONITORING_LOG_GET","MONITORING_THREAD_USAGE","COLLECTION_VIRTUAL_MCP_LIST","COLLECTION_VIRTUAL_MCP_GET","COLLECTION_VIRTUAL_MCP_DELETE","VIRTUAL_MCP_LAST_USED_LIST","COLLECTION_CONNECTIONS_LIST","COLLECTION_CONNECTIONS_GET","COLLECTION_CONNECTIONS_DELETE","ORGANIZATION_MEMBER_LIST"],selectedConnections:null,selectedPrompts:[],instructions:sr8,getId:MQ.USAGE_MANAGER}});function oc0($){return FE.find((Z)=>$.startsWith(`${Z.id}_`))??null}async function $a8($,Z){if("resolveRuntime"in $)return $.resolveRuntime(Z);return{instructions:$.instructions,selectedTools:$.selectedTools}}async function q90({virtualMcp:$,agentId:Z=$.id,organizationId:X,ctx:Q}){let Y=oc0(Z);if(!Y)return $;let G=await $a8(Y,{orgId:X,ctx:Q}),J=G.selectedTools?[...G.selectedTools]:null;return{...$,metadata:{...$.metadata??{},instructions:G.instructions},connections:$.connections.map((W)=>({...W,selected_tools:J}))}}async function M90($,Z){if(!("checklist"in $))return[];return Promise.all($.checklist.map(async(X)=>({label:X.label,activeForm:X.activeForm,action:X.action,completed:await X.isCompleted(Z),alwaysSuggest:X.alwaysSuggest})))}async function dr1($,Z,X){let Q={self:C8.SELF($),registry:C8.REGISTRY($),"community-registry":C8.COMMUNITY_REGISTRY($)};await Promise.all(er8.map((Y)=>X.delete(`${Y}${$}`))),await Promise.all(FE.map(async(Y)=>{let G=Y.getId($),J=await X.findById(G,$),K=(Y.selectedConnections??["self"]).map((F)=>Q[F]);if(J){await X.update(G,Z,{metadata:{...J.metadata??{},instructions:Y.instructions},connections:K.map((F)=>{let H=J.connections.find((N)=>N.connection_id===F);return{connection_id:F,selected_tools:Y.selectedTools?[...Y.selectedTools]:null,selected_resources:H?.selected_resources??null,selected_prompts:H?.selected_prompts??null}})});return}await X.create($,Z,{title:Y.title,description:Y.description,icon:Y.icon,status:"active",pinned:!1,metadata:{instructions:Y.instructions},connections:K.map((F)=>({connection_id:F,selected_tools:Y.selectedTools?[...Y.selectedTools]:null,selected_resources:null,selected_prompts:Y.selectedPrompts?[...Y.selectedPrompts]:null}))},{id:G})}))}var er8,FE;var rx=D(()=>{_8();Mr1();Vr1();Cr1();xr1();gr1();ur1();lr1();er8=["studio-task-manager_"],FE=[br1,qr1,Sr1,yr1,kr1,hr1,cr1]});import{DBOS as k90}from"@dbos-inc/dbos-sdk";async function Za8($){let Z=r8(),X=new Cb(Z.db);await dr1($.orgId,$.createdBy,X)}async function Xa8($){let Z=r8(),X=new Cb(Z.db);for(let Q of FE){let Y=Q.getId($.orgId),G=await X.findById(Y,$.orgId);if(!G)continue;let J=Q.selectedPrompts?[...Q.selectedPrompts]:null;if(G.connections.every((K)=>{let F=K.selected_prompts;if(J===null)return F===null;if(F===null)return!1;if(F.length!==J.length)return!1;return F.every((H,N)=>H===J[N])}))continue;await X.update(Y,$.createdBy,{connections:G.connections.map((K)=>({connection_id:K.connection_id,selected_tools:K.selected_tools,selected_resources:K.selected_resources,selected_prompts:J}))})}}async function Qa8($){await k90.runStep(()=>Za8($),{name:"installStudioPack"}),await k90.runStep(()=>Xa8($),{name:"backfillSelectedPrompts"})}async function rc0($){await k90.startWorkflow(Ya8,{workflowID:`install-studio-pack:${Ga8}:${$.orgId}`})($)}async function mr1(){let Z=await r8().db.selectFrom("member").select(["organizationId","userId"]).orderBy("createdAt","asc").execute(),X=new Map;for(let Q of Z)if(!X.has(Q.organizationId))X.set(Q.organizationId,Q.userId);await I90(Array.from(X),10,async([Q,Y])=>{try{await rc0({orgId:Q,createdBy:Y})}catch(G){console.error("[studio-pack-backfill] enqueue failed",{orgId:Q},G)}})}var Ya8,Ga8="v6";var V90=D(()=>{mG();Fg0();rx();Ya8=k90.registerWorkflow(Qa8,{name:"installStudioPackWorkflow"})});class ni{constructor(){this._messageQueue=[]}static createLinkedPair(){let $=new ni,Z=new ni;return $._otherTransport=Z,Z._otherTransport=$,[$,Z]}async start(){while(this._messageQueue.length>0){let $=this._messageQueue.shift();this.onmessage?.($.message,$.extra)}}async close(){let $=this._otherTransport;this._otherTransport=void 0,await $?.close(),this.onclose?.()}async send($,Z){if(!this._otherTransport)throw Error("Not connected");if(this._otherTransport.onmessage)this._otherTransport.onmessage($,{authInfo:Z?.authInfo});else this._otherTransport._messageQueue.push({message:$,extra:{authInfo:Z?.authInfo}})}}import{z as R8}from"zod";var pr1,ir1=1000,Ja8=500,nr1,tr1,or1,rr1,ar1,sr1,er1,$a1,Za1,Xa1;var ax=D(()=>{pr1=R8.record(R8.string(),R8.array(R8.string())),nr1=R8.record(R8.string(),R8.array(R8.string()).max(Ja8)).refine(($)=>Object.keys($).length<=ir1,{message:`Permissions cannot grant more than ${ir1} resources`}),tr1=R8.object({id:R8.string().describe("Unique identifier for the API key"),name:R8.string().describe("Human-readable name for the API key"),userId:R8.string().describe("ID of the user who owns this API key"),permissions:pr1.describe('Permissions granted to this API key. Format: { resource: [actions] } where resource is "self" for management tools or "conn_<UUID>" for connection-specific tools. Example: { "self": ["API_KEY_CREATE"], "conn_abc123": ["SEND_MESSAGE"] }'),expiresAt:R8.string().datetime().nullable().optional().describe("Expiration date of the API key (ISO 8601)"),createdAt:R8.string().datetime().describe("When the API key was created (ISO 8601)")}),or1=R8.object({name:R8.string().min(1).max(64).describe("Human-readable name for the API key"),permissions:nr1.describe(`Permissions to grant (REQUIRED \u2014 there is no implicit default). Format: { resource: [actions] }. Resource is "self" for management tools or "conn_<UUID>" for connection-specific tools. Actions are tool names (e.g., ["ORGANIZATION_GET"]) or ["*"] for all. Example: { "self": ["ORGANIZATION_GET", "COLLECTION_CONNECTIONS_LIST"] }. The key is authorized solely by this allowlist; the creator's role does not widen it.`),expiresIn:R8.number().positive().optional().describe("Expiration time in seconds. If not provided, key never expires."),metadata:R8.record(R8.string(),R8.unknown()).optional().describe("Additional metadata to store with the API key")}),rr1=R8.object({id:R8.string().describe("Unique identifier for the API key"),name:R8.string().describe("Human-readable name for the API key"),key:R8.string().describe("The actual API key value. STORE THIS SECURELY - it will not be shown again!"),permissions:pr1.describe('Permissions granted to this API key. Format: { resource: [actions] } where resource is "self" for management tools or "conn_<UUID>" for connection-specific tools'),expiresAt:R8.string().datetime().nullable().optional().describe("Expiration date of the API key (ISO 8601)"),createdAt:R8.string().datetime().describe("When the API key was created (ISO 8601)")}),ar1=R8.object({}),sr1=R8.object({items:R8.array(tr1).describe("List of API keys (without key values)")}),er1=R8.object({keyId:R8.string().describe("ID of the API key to update"),name:R8.string().min(1).max(64).optional().describe("New name for the API key"),permissions:nr1.optional().describe('New permissions. Format: { resource: [actions] } where resource is "self" for management tools or "conn_<UUID>" for connection-specific tools. Actions are tool names or "*" for all. Example: { "self": ["API_KEY_CREATE"] }. Replaces existing permissions.'),metadata:R8.record(R8.string(),R8.unknown()).optional().describe("New metadata. Replaces existing metadata.")}),$a1=R8.object({item:tr1.describe("The updated API key (without key value)")}),Za1=R8.object({keyId:R8.string().describe("ID of the API key to delete")}),Xa1=R8.object({success:R8.boolean().describe("Whether the deletion was successful"),keyId:R8.string().describe("ID of the deleted API key")})});var ac0;var Qa1=D(()=>{C4();M0();ax();ac0=u({name:"API_KEY_CREATE",description:"Create an API key with scoped permissions. The key value is returned only once \u2014 store it immediately.",annotations:{title:"Create API Key",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!1,openWorldHint:!1},inputSchema:or1,outputSchema:rr1,handler:async($,Z)=>{o(Z),await Z.access.check();let X=await Z.boundAuth.apiKey.create({name:$.name,permissions:$.permissions,expiresIn:$.expiresIn,metadata:{...$.metadata,organization:Z.organization}}),Q=X.expiresAt?X.expiresAt instanceof Date?X.expiresAt.toISOString():X.expiresAt:null,Y=X.createdAt instanceof Date?X.createdAt.toISOString():X.createdAt,G=o0(Z);if(G)x1.capture({distinctId:G,event:"api_key_created",...Z.organization?.id?{groups:{organization:Z.organization.id}}:{},properties:{key_id:X.id,key_name:X.name??$.name,organization_id:Z.organization?.id,has_expiry:!!Q}});return{id:X.id,name:X.name??$.name,key:X.key,permissions:X.permissions??{},expiresAt:Q,createdAt:Y}}})});var sc0;var Ya1=D(()=>{C4();M0();ax();sc0=u({name:"API_KEY_DELETE",description:"Delete and instantly revoke an API key. Cannot be undone.",annotations:{title:"Delete API Key",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:Za1,outputSchema:Xa1,handler:async($,Z)=>{o(Z),await Z.access.check();let X=o0(Z);if(!X)throw Error("User ID required to delete API key");let Y=(await Z.boundAuth.apiKey.list())?.find((K)=>K.id===$.keyId);if(!Y)throw Error("API key not found");let J=Y.metadata?.organization?.id,W=Z.organization?.id;if(J!==W)throw Error("Cannot delete API key from another organization");if(await Z.boundAuth.apiKey.delete($.keyId),W)x1.capture({distinctId:X,event:"api_key_deleted",groups:{organization:W},properties:{key_id:$.keyId,organization_id:W}});return{success:!0,keyId:$.keyId}}})});var ec0;var Ga1=D(()=>{M0();ax();ec0=u({name:"API_KEY_LIST",description:"List API keys for the current user in the current organization. Returns metadata only \u2014 key values are never shown after creation.",annotations:{title:"List API Keys",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:ar1,outputSchema:sr1,handler:async($,Z)=>{o(Z),await Z.access.check();let X=await Z.boundAuth.apiKey.list(),Q=Z.organization?.id;return{items:(X??[]).filter((G)=>{return G.metadata?.organization?.id===Q}).map((G)=>({id:G.id,name:G.name??"Unnamed Key",userId:G.userId,permissions:G.permissions??{},expiresAt:G.expiresAt?G.expiresAt instanceof Date?G.expiresAt.toISOString():G.expiresAt:null,createdAt:G.createdAt instanceof Date?G.createdAt.toISOString():G.createdAt}))}}})});var $l0;var Ja1=D(()=>{M0();ax();$l0=u({name:"API_KEY_UPDATE",description:"Update an API key's name, permissions, or metadata. The key value cannot be changed or retrieved.",annotations:{title:"Update API Key",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:er1,outputSchema:$a1,handler:async($,Z)=>{if(o(Z),await Z.access.check(),!o0(Z))throw Error("User ID required to update API key");let Y=(await Z.boundAuth.apiKey.list())?.find((F)=>F.id===$.keyId);if(!Y)throw Error(`API key not found: ${$.keyId}`);let J=Y.metadata?.organization?.id,W=Z.organization?.id;if(J!==W)throw Error("Cannot update API key from another organization");let K=await Z.boundAuth.apiKey.update({keyId:$.keyId,name:$.name,permissions:$.permissions,metadata:{...$.metadata,organization:Z.organization}});if(!K)throw Error(`Failed to update API key: ${$.keyId}`);return{item:{id:K.id,name:K.name??$.name??"Unnamed Key",userId:K.userId,permissions:K.permissions??{},expiresAt:K.expiresAt?K.expiresAt instanceof Date?K.expiresAt.toISOString():K.expiresAt:null,createdAt:K.createdAt instanceof Date?K.createdAt.toISOString():K.createdAt}}}})});var Wa1=D(()=>{Qa1();Ya1();Ga1();Ja1();ax()});function iB($){let Z=$.trim();if(!Z)return{ok:!1,error:"Enter a website URL."};let X=Ka8.test(Z),Q=Fa8.test(Z),Y=Ha8.test(Z);if(X&&!Q&&!Y)return{ok:!1,error:"Use an HTTP or HTTPS website URL."};let G=Q?Z:`https://${Z}`,J;try{J=new URL(G)}catch{return{ok:!1,error:"Enter a valid website URL."}}if(J.protocol!=="http:"&&J.protocol!=="https:")return{ok:!1,error:"Use an HTTP or HTTPS website URL."};let W=J.hostname.split(".");if(W.length<2||W.some((K)=>!K||!Na8.test(K)))return{ok:!1,error:"Enter a valid website URL."};return J.protocol="https:",{ok:!0,value:J.origin}}var Ka8,Fa8,Ha8,Na8;var ti=D(()=>{Ka8=/^[a-zA-Z][a-zA-Z\d+.-]*:/,Fa8=/^[a-zA-Z][a-zA-Z\d+.-]*:\/\//,Ha8=/^[^\s/:?#]+\.[^\s/:?#]+:\d+(?:[/?#]|$)/,Na8=/^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/i});import{z as mX}from"zod";function KK($){if($.baseUrl)return $.baseUrl.replace(/\/+$/,"");return(($.settings??b0()).reportsInternalApiUrl??Ua8).replace(/\/+$/,"")}function Fa1($={}){return`${KK($)}/api/v2/mcp`}function HE($){let Z=$.apiKey??($.settings??b0()).reportsInternalApiKey;if(!Z)throw Error("REPORTS_INTERNAL_API_KEY (or the legacy COMMERCE_DISCOVERY_INTERNAL_API_KEY) is required to set up reports.");return Z}function S90($){return new URL($).hostname}function Oa8($){return $==="ownership_unverified"||$==="already_claimed_by_other_org"}function Da8($,Z={}){switch($){case"ownership_unverified":{let X=Z.email?`O e-mail ${Z.email}`:"Este e-mail",Q=Z.domain?` ${Z.domain}`:" este site";return`${X} n\xE3o tem permiss\xE3o para reivindicar${Q}. Use um e-mail do dom\xEDnio do site ou pe\xE7a ao suporte para autorizar seu dom\xEDnio.`}case"already_claimed_by_other_org":return"Este site j\xE1 pertence a outra organiza\xE7\xE3o. Fale com o suporte para transferir o acesso.";case"unknown":return"N\xE3o foi poss\xEDvel configurar o Commerce Discovery. Tente novamente ou fale com o suporte.";default:return $}}async function La8($){let Z=await oi($);return Oa8(Z?.error)?Z.error:"unknown"}async function oi($){let Z=await $.text().catch(()=>"");if(!Z)return;try{return JSON.parse(Z)}catch{return}}async function Zl0($){let Z=`Commerce Discovery auth failed with status ${$.status}.`,X=await $.text().catch(()=>"");if(!X)return Z;try{let Q=JSON.parse(X),Y=typeof Q.error==="string"?Q.error:typeof Q.message==="string"?Q.message:null;return Y?`Commerce Discovery auth failed: ${Y}.`:Z}catch{return Z}}async function Na1($,Z={}){let X=KK(Z),Q=HE(Z),Y=Z.fetchImpl??fetch,G=S90($.siteUrl),J=`${X}/api/v2/internal/diagnostics/${encodeURIComponent(G)}/upgrade`,W=await Y(J,{method:"POST",headers:{Authorization:`Bearer ${Q}`,"Content-Type":"application/json"},body:JSON.stringify({org_id:$.orgId,...$.orgName?{name:$.orgName}:{},...$.email?{email:$.email}:{},...$.reportUrl?{report_url:$.reportUrl}:{}})});if(!W.ok){let F=await La8(W);throw new Ha1(F,{email:$.email,domain:G})}let K=Ba8.safeParse(await oi(W));if(!K.success)throw Error("Commerce Discovery auth response did not include a token.");return{authorizationToken:K.data.token}}async function Ua1($,Z={}){let X=KK(Z),Q=HE(Z),Y=Z.fetchImpl??fetch,G=S90($.siteUrl),J=`${X}/api/v2/internal/diagnostics/${encodeURIComponent(G)}/bindings`,W=await Y(J,{method:"POST",headers:{Authorization:`Bearer ${Q}`,"Content-Type":"application/json"},body:JSON.stringify({org_id:$.orgId,provider:$.provider,resource_id:$.resourceId})});if(W.status===409)return{ok:!1,reason:"resource_already_bound",detail:"Este recurso j\xE1 est\xE1 vinculado a outra loja. Se ele \xE9 seu, fale com o suporte para revis\xE3o manual."};if(W.status===422){let F=Ka1.safeParse(await oi(W));return{ok:!1,reason:F.success?F.data.reason??"verification_failed":"verification_failed",detail:(F.success?F.data.detail:void 0)??"N\xE3o foi poss\xEDvel verificar o acesso a este recurso."}}if(!W.ok)throw Error(await Zl0(W));let K=Ka1.safeParse(await oi(W));if(!K.success||!K.data.binding)throw Error("Commerce Discovery bind response did not include a binding.");return{ok:!0,resourceId:K.data.binding.resource_id,evidence:K.data.binding.evidence}}async function Ba1($,Z={}){let X=KK(Z),Q=HE(Z),Y=Z.fetchImpl??fetch,G=S90($.siteUrl),J=`${X}/api/v2/internal/diagnostics/${encodeURIComponent(G)}/run`,W=await Y(J,{method:"POST",headers:{Authorization:`Bearer ${Q}`,"Content-Type":"application/json"},body:JSON.stringify({org_id:$.orgId,...$.githubRepo?{github_repo:$.githubRepo}:{}})});if(W.status===409)return{triggered:!1,reason:"not_upgraded"};if(!W.ok)throw Error(await Zl0(W));return{triggered:!0}}async function Oa1($,Z={}){let X=KK(Z),Q=HE(Z),Y=Z.fetchImpl??fetch,G=S90($.siteUrl),J=`${X}/api/v2/internal/diagnostics/${encodeURIComponent(G)}/connections/status?org_id=${encodeURIComponent($.orgId)}`,W=await Y(J,{method:"GET",headers:{Authorization:`Bearer ${Q}`}});if(W.status===404||W.status===409)return{providers:{},claimed:!1};if(!W.ok)throw Error(await Zl0(W));let K=wa8.safeParse(await oi(W));return{providers:K.success?K.data.providers:{},claimed:!0}}var Ua8,Ba8,Ka1,Ha1,wa8;var NE=D(()=>{_8();R$();Ua8=new URL(dg1).origin,Ba8=mX.object({token:mX.string().min(1)}),Ka1=mX.object({binding:mX.object({resource_id:mX.string(),evidence:mX.string()}).optional(),reason:mX.string().optional(),detail:mX.string().optional()});Ha1=class Ha1 extends Error{code;constructor($,Z={}){super(Da8($,Z));this.name="CommerceDiscoveryClaimError",this.code=$}};wa8=mX.object({providers:mX.record(mX.string(),mX.object({connected:mX.boolean(),via:mX.enum(["oauth","sa"]).nullable(),resource:mX.string().nullable()}))})});import{z as hY}from"zod";var Ea8,ja8,Xl0;var Da1=D(()=>{ti();M0();NE();Ea8=hY.object({siteUrl:hY.string().min(1).describe("Website URL of the store being bound."),provider:hY.enum(["ga4","gsc"]).describe("Which Google source to bind: ga4 (Analytics) or gsc (Search Console)."),resourceId:hY.string().min(1).describe("The resource id the client typed: GA4 numeric property id, or GSC site (sc-domain:example.com or https://example.com/).")}),ja8=hY.discriminatedUnion("ok",[hY.object({ok:hY.literal(!0),resourceId:hY.string(),evidence:hY.string()}),hY.object({ok:hY.literal(!1),reason:hY.string(),detail:hY.string()})]),Xl0=u({name:"COMMERCE_DISCOVERY_BIND",description:"Bind a GA4 property or GSC site to the org's store via the shared service account (consent-free lane). The client grants deco-reader@\u2026 access to the resource and provides its id; Commerce Discovery verifies the resource belongs to this domain before persisting. Returns ok:false with an actionable pt-BR detail when verification fails or the resource is already bound elsewhere.",annotations:{title:"Bind Commerce Discovery Data Source",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},inputSchema:Ea8,outputSchema:ja8,handler:async($,Z)=>{o(Z);let X=t(Z);await Z.access.check();let Q=iB($.siteUrl);if(!Q.ok)throw Error(Q.error);return Ua1({siteUrl:Q.value,orgId:X.id,provider:$.provider,resourceId:$.resourceId.trim()})}})});import{z as FK}from"zod";var za8,Pa8,Ql0;var La1=D(()=>{ti();M0();NE();za8=FK.object({siteUrl:FK.string().min(1).describe("Website URL of the store to inspect.")}),Pa8=FK.object({providers:FK.record(FK.string(),FK.object({connected:FK.boolean(),via:FK.enum(["oauth","sa"]).nullable(),resource:FK.string().nullable()})),claimed:FK.boolean().describe("False when the site isn't claimed/upgraded for this org \u2014 providers is then empty because the status is unreadable, NOT because nothing is connected. The UI must warn instead of rendering existing bindings as disconnected.")}),Ql0=u({name:"COMMERCE_DISCOVERY_CONNECTION_STATUS",description:"Read per-provider connection status (ga4/gsc/vtex) for the org's store \u2014 { connected, via: oauth|sa, resource }. The single source of truth for whether a data source is connected, unifying the OAuth (Studio vault) and shared-SA binding lanes. Read-only.",annotations:{title:"Commerce Discovery Connection Status",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},inputSchema:za8,outputSchema:Pa8,handler:async($,Z)=>{o(Z);let X=t(Z);await Z.access.check();let Q=iB($.siteUrl);if(!Q.ok)throw Error(Q.error);return Oa1({siteUrl:Q.value,orgId:X.id})}})});import{z as ri}from"zod";var Aa8,Ta8,Yl0;var wa1=D(()=>{_8();ti();M0();NE();Aa8=ri.object({siteUrl:ri.string().min(1).describe("Website URL to run the diagnostic for.")}),Ta8=ri.object({triggered:ri.boolean(),reason:ri.string().optional()}),Yl0=u({name:"COMMERCE_DISCOVERY_RUN",description:"Trigger the Commerce Discovery diagnostic run for the current organization's store. Call once the data sources (GA4/GSC/VTEX) are connected \u2014 this run resolves credentials and produces the enriched report.",annotations:{title:"Run Commerce Discovery",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},inputSchema:Aa8,outputSchema:Ta8,handler:async($,Z)=>{o(Z);let X=t(Z);await Z.access.check();let Q=iB($.siteUrl);if(!Q.ok)throw Error(Q.error);let Y=C8.COMMERCE_DISCOVERY(X.id),J=(await Z.storage.connections.findById(Y,X.id))?.configuration_state,W=J&&typeof J==="object"&&typeof J.github_repo==="string"&&J.github_repo.length>0?J.github_repo:void 0;return Ba1({siteUrl:Q.value,orgId:X.id,githubRepo:W})}})});var pB=D(()=>{v80()});import{z as HK}from"zod";async function Ma8($,Z,X,Q){let Y=await $.storage.connections.findById(Z,X);if(Y)return Y;throw Q}async function ka8($,Z,X,Q){let Y=await $.storage.virtualMcps.findById(Z,X);if(Y)return Y;throw Q}var Gl0,Ra8=3600000,Ia8,qa8,Jl0;var Ea1=D(()=>{_8();ti();M0();lW();pB();NE();Gl0=e40,Ia8=HK.object({siteUrl:HK.string().min(1).describe("Website URL to configure.")}),qa8=HK.object({connection:u7,virtualMcp:c7,reportApp:HK.object({connectionId:HK.string(),virtualMcpId:HK.string(),toolName:HK.literal(Gl0)}),created:HK.object({connection:HK.boolean(),virtualMcp:HK.boolean()})});Jl0=u({name:"COMMERCE_DISCOVERY_SETUP",description:"Create or return the Commerce Discovery connection and virtual MCP for the current organization.",annotations:{title:"Set Up Commerce Discovery",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:Ia8,outputSchema:qa8,handler:async($,Z)=>{o(Z);let X=t(Z);await Z.access.check("COLLECTION_CONNECTIONS_CREATE");let Q=o0(Z);if(!Q)throw Error("User ID required to set up Commerce Discovery");let Y=iB($.siteUrl);if(!Y.ok)throw Error(Y.error);let G=C8.COMMERCE_DISCOVERY(X.id),J=Z60(X.id),W=new URLSearchParams({connection:G,tool:Gl0}),K={email:Z.auth.user?.email,reportUrl:`${Z.baseUrl}/${encodeURIComponent(X.slug??X.id)}/agents/${J}/app?${W.toString()}`},F=await Z.storage.connections.findById(G,X.id),H={connection:!1,virtualMcp:!1},N=await Na1({siteUrl:Y.value,orgId:X.id,orgName:X.name,...K}),U=Fa1();if(F)console.log("[commerce-discovery] syncing connection to claimed site",{orgId:X.id,siteUrl:Y.value,connectionId:G}),F=await Z.storage.connections.update(F.id,{connection_url:U,connection_token:N.authorizationToken,metadata:{...F.metadata??{},siteUrl:Y.value}});else{console.log("[commerce-discovery] creating connection",{orgId:X.id,siteUrl:Y.value,connectionId:G});try{let w=Xh1(X.id,N.authorizationToken,U);F=await Z.storage.connections.create({...w,metadata:{...w.metadata??{},siteUrl:Y.value},organization_id:X.id,created_by:Q}),H.connection=!0}catch(w){F=await Ma8(Z,G,X.id,w)}}let B=await Z.storage.virtualMcps.findById(J,X.id);if(!B){console.log("[commerce-discovery] creating virtual MCP",{orgId:X.id,siteUrl:Y.value,connectionId:F.id,virtualMcpId:J});try{B=await Z.storage.virtualMcps.create(X.id,Q,Qh1(X.id,F.id),{id:J}),H.virtualMcp=!0}catch(w){B=await ka8(Z,J,X.id,w)}}if(!B.pinned)B=await Z.storage.virtualMcps.update(B.id,Q,{pinned:!0});let O=await Z.db.selectFrom("organization").select(["createdAt"]).where("id","=",X.id).executeTakeFirst();if((O?Date.now()-new Date(O.createdAt).getTime():Number.POSITIVE_INFINITY)<Ra8){let E=(await Z.storage.organizationSettings.get(X.id))?.flags,j={};if(E?.reports_only==null)j.reports_only=!0;if(Object.keys(j).length>0)await Z.storage.organizationSettings.upsert(X.id,{flags:j})}return{connection:F,virtualMcp:B,reportApp:{connectionId:F.id,virtualMcpId:B.id,toolName:Gl0},created:H}}})});var ja1=D(()=>{Da1();La1();wa1();Ea1()});var Wl0=_((za1)=>{Object.defineProperty(za1,"__esModule",{value:!0});za1.kvPrefix=za1.KvWatchInclude=void 0;za1.KvWatchInclude={LastValue:"",AllHistory:"history",UpdatesOnly:"updates"};za1.kvPrefix="KV_"});var _a1=_((Sa1)=>{Object.defineProperty(Sa1,"__esModule",{value:!0});Sa1.KvStatusImpl=Sa1.Bucket=Sa1.Kvm=Sa1.kvOperationHdr=void 0;Sa1.Base64KeyCodec=Ca8;Sa1.NoopKvCodecs=Kl0;Sa1.defaultBucketOpts=Ta1;Sa1.validateKey=Ra1;Sa1.validateSearchKey=Ia1;Sa1.hasWildcards=qa1;Sa1.validateBucket=C90;var y5=AY(),Q5=Te(),x5=Wl0();function Ca8(){let $=(Z,X)=>{let Q=[];for(let Y of Z.split("."))switch(Y){case">":case"*":Q.push(Y);break;default:Q.push(X(Y));break}return Q.join(".")};return{encode(Z){return $(Z,btoa)},decode(Z){return $(Z,atob)}}}function Kl0(){return{key:{encode($){return $},decode($){return $}},value:{encode($){return typeof $==="string"?new TextEncoder().encode($):$},decode($){return $}}}}function Ta1(){return{replicas:1,history:1,timeout:2000,max_bytes:-1,maxValueSize:-1,codec:Kl0(),storage:Q5.StorageType.File}}Sa1.kvOperationHdr="KV-Operation";var Aa1="$KV",_a8=/^[-/=.\w]+$/,va8=/^[-/=.>*\w]+$/,fa8=/^[-\w]+$/;function Ra1($){if($.startsWith(".")||$.endsWith(".")||!_a8.test($))throw Error(`invalid key: ${$}`)}function Ia1($){if($.startsWith(".")||$.endsWith(".")||$.includes("..")||!va8.test($))throw Error(`invalid key: ${$}`)}function qa1($){if($.startsWith(".")||$.endsWith("."))throw Error(`invalid key: ${$}`);let Z=$.split("."),X=!1;for(let Q=0;Q<Z.length;Q++)switch(Z[Q]){case"*":X=!0;break;case">":if(Q!==Z.length-1)throw Error(`invalid key: ${$}`);X=!0;break;default:}return X}function C90($){if(!fa8.test($))throw Error(`invalid bucket name: ${$}`)}class Ma1{js;constructor($){this.js=(0,Q5.toJetStreamClient)($)}create($,Z={}){return this.#$($,Z)}open($,Z={}){return Z.bindOnly=!0,this.#$($,Z)}#$($,Z={}){let{ok:X,min:Q}=this.js.nc.features.get(y5.Feature.JS_KV);if(!X)return Promise.reject(Error(`kv is only supported on servers ${Q} or better`));if(Z.bindOnly)return sx.bind(this.js,$,Z);return sx.create(this.js,$,Z)}list(){let $=(X)=>{let Y=X.streams.filter((J)=>{return J.config.name.startsWith(x5.kvPrefix)});Y.forEach((J)=>{J.config.sealed=J.config.sealed||!1,J.config.deny_delete=J.config.deny_delete||!1,J.config.deny_purge=J.config.deny_purge||!1,J.config.allow_rollup_hdrs=J.config.allow_rollup_hdrs||!1});let G="";if(Y.length)G=this.js.nc.info?.cluster??"";return Y.map((J)=>{return new _90(J,G)})},Z=`${this.js.prefix}.STREAM.LIST`;return new Q5.ListerImpl(Z,$,this.js)}}Sa1.Kvm=Ma1;class sx{js;jsm;stream;bucket;direct;codec;prefix;editPrefix;useJsPrefix;_prefixLen;constructor($,Z,X){C90($),this.js=Z,this.jsm=X,this.bucket=$,this.prefix=Aa1,this.editPrefix="",this.useJsPrefix=!1,this._prefixLen=0}static async create($,Z,X={}){C90(Z);let Q=await $.jetstreamManager(),Y=new sx(Z,$,Q);return await Y.init(X),Y}static async bind($,Z,X={}){let Q=$.getOptions()?.checkAPI||X.bindOnly===!1,Y=await $.jetstreamManager(Q),G={config:{allow_direct:X.allow_direct}};C90(Z);let J=new sx(Z,$,Y);return G.config.name=X.streamName??J.bucketName(),Object.assign(J,G),J.stream=G.config.name,J.codec=X.codec||Kl0(),J.direct=G.config.allow_direct??!1,J.initializePrefixes(G),J}async init($={}){let Z=Object.assign(Ta1(),$);this.codec=Z.codec;let X={};if(this.stream=X.name=$.streamName??this.bucketName(),X.retention=Q5.RetentionPolicy.Limits,X.max_msgs_per_subject=Z.history,Z.max_bytes)X.max_bytes=Z.max_bytes;if(X.max_msg_size=Z.maxValueSize,X.storage=Z.storage,$.placement)X.placement=$.placement;if($.republish)X.republish=$.republish;if($.description)X.description=$.description;if($.markerTTL)X.allow_msg_ttl=!0,X.subject_delete_marker_ttl=(0,y5.nanos)(Z.markerTTL);if($.mirror){let F=Object.assign({},$.mirror);if(!F.name.startsWith(x5.kvPrefix))F.name=`${x5.kvPrefix}${F.name}`;X.mirror=F,X.mirror_direct=!0}else if($.sources){let F=$.sources.map((H)=>{let N=Object.assign({},H),U=N.name.startsWith(x5.kvPrefix)?N.name.substring(x5.kvPrefix.length):N.name;if(!N.name.startsWith(x5.kvPrefix))N.name=`${x5.kvPrefix}${N.name}`;if(!H.external&&U!==this.bucket)N.subject_transforms=[{src:`$KV.${U}.>`,dest:`$KV.${this.bucket}.>`}];return N});X.sources=F,X.subjects=[this.subjectForBucket()]}else X.subjects=[this.subjectForBucket()];if($.metadata)X.metadata=$.metadata;if(typeof $.compression==="boolean")X.compression=$.compression?Q5.StoreCompression.S2:Q5.StoreCompression.None;let Q=this.js.nc,Y=Q.getServerVersion(),G=Y?(0,y5.compare)(Y,(0,y5.parseSemVer)("2.7.2"))>=0:!1;X.discard=G?Q5.DiscardPolicy.New:Q5.DiscardPolicy.Old;let{ok:J,min:W}=Q.features.get(y5.Feature.JS_ALLOW_DIRECT);if(!J&&$.allow_direct===!0){let F=Y?`${Y.major}.${Y.minor}.${Y.micro}`:"unknown";return Promise.reject(Error(`allow_direct is not available on server version ${F} - requires ${W}`))}if($.allow_direct=typeof $.allow_direct==="boolean"?$.allow_direct:J,X.allow_direct=$.allow_direct,this.direct=X.allow_direct,X.num_replicas=Z.replicas,Z.ttl)X.max_age=(0,y5.nanos)(Z.ttl);X.allow_rollup_hdrs=!0;let K;try{if(K=await this.jsm.streams.info(X.name),!K.config.allow_direct&&this.direct===!0)this.direct=!1}catch(F){if(F.message==="stream not found")K=await this.jsm.streams.add(X);else throw F}this.initializePrefixes(K)}initializePrefixes($){this._prefixLen=0,this.prefix=`$KV.${this.bucket}`,this.useJsPrefix=this.js.apiPrefix!=="$JS.API";let{mirror:Z}=$.config;if(Z){let X=Z.name;if(X.startsWith(x5.kvPrefix))X=X.substring(x5.kvPrefix.length);if(Z.external&&Z.external.api!==""){let Q=Z.name.substring(x5.kvPrefix.length);this.useJsPrefix=!1,this.prefix=`$KV.${Q}`,this.editPrefix=`${Z.external.api}.$KV.${X}`}else this.editPrefix=this.prefix}}bucketName(){return this.stream??`${x5.kvPrefix}${this.bucket}`}subjectForBucket(){return`${this.prefix}.${this.bucket}.>`}subjectForKey($,Z=!1){let X=[];if(Z){if(this.useJsPrefix)X.push(this.js.apiPrefix);if(this.editPrefix!=="")X.push(this.editPrefix);else X.push(this.prefix)}else if(this.prefix)X.push(this.prefix);return X.push($),X.join(".")}fullKeyName($){if(this.prefix!=="")return`${this.prefix}.${$}`;return`${Aa1}.${this.bucket}.${$}`}get prefixLen(){if(this._prefixLen===0)this._prefixLen=this.prefix.length+1;return this._prefixLen}encodeKey($){let Z=[];for(let X of $.split("."))switch(X){case">":case"*":Z.push(X);break;default:Z.push(this.codec.key.encode(X));break}return Z.join(".")}decodeKey($){let Z=[];for(let X of $.split("."))switch(X){case">":case"*":Z.push(X);break;default:Z.push(this.codec.key.decode(X));break}return Z.join(".")}validateKey=Ra1;validateSearchKey=Ia1;hasWildcards=qa1;close(){return Promise.resolve()}dataLen($,Z){let X=Z?Z.get(Q5.JsHeaders.MessageSizeHdr)||"":"";if(X!=="")return parseInt(X,10);return $.length}smToEntry($){return new ka1(this.bucket,this.prefixLen,$,this.codec)}jmToWatchEntry($,Z){return new Va1(this.bucket,this.prefixLen,$,Z,this.codec)}async create($,Z,X){let Q;try{let G={previousSeq:0},J=await this._put($,Z,G,X);return Promise.resolve(J)}catch(G){if(Q=G,G instanceof Q5.JetStreamApiError){let J=G;if(J.code!==Q5.JetStreamApiCodes.StreamWrongLastSequence&&J.code!==Q5.JetStreamApiCodes.StreamWrongLastSequenceUnknown)return Promise.reject(G)}}let Y=0;try{let G=await this.get($);if(G?.operation==="DEL"||G?.operation==="PURGE")return Y=G!==null?G.revision:0,this._put($,Z,{previousSeq:Y},X);else return Promise.reject(Q)}catch(G){return Promise.reject(G)}}update($,Z,X,Q){if(X<=0)throw Error("version must be greater than 0");return this.put($,Z,{previousSeq:X,timeout:Q})}async _put($,Z,X={},Q){let Y=this.encodeKey($);this.validateKey(Y),Z=this.codec.value.encode(Z);let G={timeout:X?.timeout};if(X.previousSeq!==void 0){let J=(0,y5.headers)();G.headers=J,J.set(Q5.PubHeaders.ExpectedLastSubjectSequenceHdr,`${X.previousSeq}`)}if(Q)(G.headers||(0,y5.headers)()).set(Q5.PubHeaders.MessageTTL,Q);try{return(await this.js.publish(this.subjectForKey(Y,!0),Z,G)).seq}catch(J){return Promise.reject(J)}}put($,Z,X={}){return this._put($,Z,X)}async get($,Z){let X=this.encodeKey($);this.validateKey(X);let Q={last_by_subj:this.subjectForKey(X)};if(Z&&Z.revision>0)Q={seq:Z.revision};let Y=null;try{if(this.direct)Y=await this.jsm.direct.getMessage(this.bucketName(),Q);else Y=await this.jsm.streams.getMessage(this.bucketName(),Q);if(Y===null)return null;let G=this.smToEntry(Y);if(G.rawKey!==X)return null;return G}catch(G){throw G}}purge($,Z){return this._deleteOrPurge($,"PURGE",Z)}delete($,Z){return this._deleteOrPurge($,"DEL",Z)}async purgeDeletes($=1800000){let Z=[],X=await this.history({key:">"});await(async()=>{for await(let J of X)if(J.operation==="DEL"||J.operation==="PURGE")Z.push(J)})().then(),X.stop();let Q=Date.now()-$,Y=Z.map((J)=>{let W=this.subjectForKey(J.key);if(J.created.getTime()>=Q)return this.jsm.streams.purge(this.stream,{filter:W,keep:1});else return this.jsm.streams.purge(this.stream,{filter:W,keep:0})}),G=await Promise.all(Y);return G.unshift({success:!0,purged:0}),G.reduce((J,W)=>{return J.purged+=W.purged,J})}async _deleteOrPurge($,Z,X){if(!this.hasWildcards($))return this._doDeleteOrPurge($,Z,X);let Q=await this.keys($),Y=[];for await(let G of Q)if(Y.push(this._doDeleteOrPurge(G,Z)),Y.length===100)await Promise.all(Y),Y.length=0;if(Y.length>0)await Promise.all(Y)}async _doDeleteOrPurge($,Z,X){let Q=this.encodeKey($);this.validateKey(Q);let Y=(0,y5.headers)();if(Y.set(Sa1.kvOperationHdr,Z),Z==="PURGE"){let G=X;if(Y.set(Q5.JsHeaders.RollupHdr,Q5.JsHeaders.RollupValueSubject),typeof G?.ttl==="string"&&G.ttl!=="")Y.set(Q5.PubHeaders.MessageTTL,`${G.ttl}`)}if(X?.previousSeq)Y.set(Q5.PubHeaders.ExpectedLastSubjectSequenceHdr,`${X.previousSeq}`);await this.js.publish(this.subjectForKey(Q,!0),y5.Empty,{headers:Y})}_buildCC($,Z,X={}){let Y=(!Array.isArray($)?[$]:$).map((W)=>{let K=this.encodeKey(W);return this.validateSearchKey(W),this.fullKeyName(K)}),G=Q5.DeliverPolicy.LastPerSubject;if(Z===x5.KvWatchInclude.AllHistory)G=Q5.DeliverPolicy.All;if(Z===x5.KvWatchInclude.UpdatesOnly)G=Q5.DeliverPolicy.New;let J=void 0;if(Y.length===1)J=Y[0],Y=void 0;return Object.assign({deliver_policy:G,ack_policy:Q5.AckPolicy.None,filter_subjects:Y,filter_subject:J,flow_control:!0,idle_heartbeat:(0,y5.nanos)(5000)},X)}remove($){return this.purge($)}async history($={}){let Z=$.key??">",X={};X.headers_only=$.headers_only||!1;let Q=new y5.QueuedIteratorImpl,Y=()=>{Q.stop()},G=this._buildCC(Z,x5.KvWatchInclude.AllHistory,X),J=await this.js.consumers.getPushConsumer(this.stream,G);if(Q._data=J,(await J.info(!0)).num_pending===0)return Q.push(Y),Q;let K=await J.consume({callback:(F)=>{let H=this.jmToWatchEntry(F,!1);if(Q.push(H),Q.received++,F.info.pending===0)Q.push(Y)}});return K.closed().then(()=>{Q.push(Y)}),(async()=>{for await(let F of K.status())switch(F.type){case"heartbeat":Q.push(()=>{Q.stop()});break}})().then(),Q.iterClosed.then(()=>{K.stop()}),Q}canSetWatcherName(){let $=this.js.nc,{ok:Z}=$.features.get(y5.Feature.JS_NEW_CONSUMER_CREATE_API);return Z}async watch($={}){let Z=$.key??">",X=new y5.QueuedIteratorImpl,Q={};Q.headers_only=$.headers_only||!1;let Y=x5.KvWatchInclude.LastValue;if($.include===x5.KvWatchInclude.AllHistory)Y=x5.KvWatchInclude.AllHistory;else if($.include===x5.KvWatchInclude.UpdatesOnly)Y=x5.KvWatchInclude.UpdatesOnly;let G=$.ignoreDeletes===!0,J=this._buildCC(Z,Y,Q);if(J.name=`KV_WATCHER_${y5.nuid.next()}`,$.resumeFromRevision&&$.resumeFromRevision>0)J.deliver_policy=Q5.DeliverPolicy.StartSequence,J.opt_start_seq=$.resumeFromRevision;let W=await this.js.consumers.getPushConsumer(this.stream,J),F=(await W.info(!0)).num_pending,H=Y===x5.KvWatchInclude.UpdatesOnly||F===0;X._data=W;let N=0,U=await W.consume({callback:(B)=>{if(!H)N++,H=N>=F;let O=this.jmToWatchEntry(B,H);if(G&&O.operation==="DEL")return;X.push(O),X.received++}});return X.iterClosed.then(()=>{U.stop()}),U.closed().then(()=>{X.push(()=>{X.stop()})}),X}async keys($=">"){let Z=new y5.QueuedIteratorImpl,X=this._buildCC($,x5.KvWatchInclude.LastValue,{headers_only:!0}),Q=await this.js.consumers.getPushConsumer(this.stream,X);if((await Q.info()).num_pending===0)return Z.stop(),Z;Z._data=Q;let G=await Q.consume({callback:(J)=>{let W=J.headers?.get(Sa1.kvOperationHdr);if(W!=="DEL"&&W!=="PURGE"){let K=this.decodeKey(J.subject.substring(this.prefixLen));Z.push(K)}if(J.info.pending===0)G.stop()}});return(async()=>{for await(let J of G.status())switch(J.type){case"heartbeat":Z.push(()=>{Z.stop()});break}})().then(),G.closed().then(()=>{Z.push(()=>{Z.stop()})}),Z.iterClosed.then(()=>{G.stop()}),Z}purgeBucket($){return this.jsm.streams.purge(this.bucketName(),$)}destroy(){return this.jsm.streams.delete(this.bucketName())}async status(){let Z=this.js.nc.info?.cluster??"",X=this.bucketName(),Q=await this.jsm.streams.info(X);return new _90(Q,Z)}}Sa1.Bucket=sx;class _90{si;cluster;constructor($,Z=""){this.si=$,this.cluster=Z}get bucket(){return this.si.config.name.startsWith(x5.kvPrefix)?this.si.config.name.substring(x5.kvPrefix.length):this.si.config.name}get values(){return this.si.state.messages}get history(){return this.si.config.max_msgs_per_subject}get ttl(){return(0,y5.millis)(this.si.config.max_age)}get markerTTL(){if(typeof this.si.config.subject_delete_marker_ttl==="number")return(0,y5.millis)(this.si.config.subject_delete_marker_ttl);return 0}get bucket_location(){return this.cluster}get backingStore(){return this.si.config.storage}get storage(){return this.si.config.storage}get replicas(){return this.si.config.num_replicas}get description(){return this.si.config.description??""}get maxBucketSize(){return this.si.config.max_bytes}get maxValueSize(){return this.si.config.max_msg_size}get max_bytes(){return this.si.config.max_bytes}get placement(){return this.si.config.placement||{cluster:"",tags:[]}}get placementCluster(){return this.si.config.placement?.cluster??""}get republish(){return this.si.config.republish??{src:"",dest:""}}get streamInfo(){return this.si}get size(){return this.si.state.bytes}get metadata(){return this.si.config.metadata??{}}get compression(){if(this.si.config.compression)return this.si.config.compression!==Q5.StoreCompression.None;return!1}}Sa1.KvStatusImpl=_90;class ka1{bucket;sm;prefixLen;codec;constructor($,Z,X,Q){this.bucket=$,this.prefixLen=Z,this.sm=X,this.codec=Q}get rawKey(){return this.sm.subject.substring(this.prefixLen)}get key(){return this.codec.key.decode(this.rawKey)}get value(){return this.codec.value.decode(this.sm.data)}get delta(){return 0}get created(){return this.sm.time}get revision(){return this.sm.seq}get operation(){if(this.sm.header?.has("Nats-Marker-Reason")){if(this.sm.header?.get("Nats-Marker-Reason")==="MaxAge")return"PURGE"}return this.sm.header?.get(Sa1.kvOperationHdr)||"PUT"}get length(){let $=this.sm.header.get(Q5.JsHeaders.MessageSizeHdr)||"";if($!=="")return parseInt($,10);return this.sm.data.length}json($){return JSON.parse(y5.TD.decode(this.value),$)}string(){return y5.TD.decode(this.value)}}class Va1{bucket;sm;prefixLen;update;codec;constructor($,Z,X,Q,Y){this.bucket=$,this.prefixLen=Z,this.sm=X,this.update=Q,this.codec=Y}get rawKey(){return this.sm.subject.substring(this.prefixLen)}get key(){return this.codec.key.decode(this.rawKey)}get value(){return this.codec.value.decode(this.sm.data)}get created(){return new Date((0,y5.millis)(this.sm.info.timestampNanos))}get revision(){return this.sm.seq}get operation(){if(this.sm.headers?.has("Nats-Marker-Reason")){if(this.sm.headers?.get("Nats-Marker-Reason")==="MaxAge")return"PURGE"}return this.sm.headers?.get(Sa1.kvOperationHdr)||"PUT"}get delta(){return this.sm.info.pending}get length(){let $=this.sm.headers?.get(Q5.JsHeaders.MessageSizeHdr)||"";if($!=="")return parseInt($,10);return this.sm.data.length}get isUpdate(){return this.update}json($){return JSON.parse(y5.TD.decode(this.value),$)}string(){return y5.TD.decode(this.value)}}});var Fl0=_((k3)=>{Object.defineProperty(k3,"__esModule",{value:!0});k3.validateKey=k3.validateBucket=k3.NoopKvCodecs=k3.Kvm=k3.defaultBucketOpts=k3.Bucket=k3.Base64KeyCodec=k3.KvWatchInclude=k3.kvPrefix=void 0;var va1=Wl0();Object.defineProperty(k3,"kvPrefix",{enumerable:!0,get:function(){return va1.kvPrefix}});Object.defineProperty(k3,"KvWatchInclude",{enumerable:!0,get:function(){return va1.KvWatchInclude}});var UE=_a1();Object.defineProperty(k3,"Base64KeyCodec",{enumerable:!0,get:function(){return UE.Base64KeyCodec}});Object.defineProperty(k3,"Bucket",{enumerable:!0,get:function(){return UE.Bucket}});Object.defineProperty(k3,"defaultBucketOpts",{enumerable:!0,get:function(){return UE.defaultBucketOpts}});Object.defineProperty(k3,"Kvm",{enumerable:!0,get:function(){return UE.Kvm}});Object.defineProperty(k3,"NoopKvCodecs",{enumerable:!0,get:function(){return UE.NoopKvCodecs}});Object.defineProperty(k3,"validateBucket",{enumerable:!0,get:function(){return UE.validateBucket}});Object.defineProperty(k3,"validateKey",{enumerable:!0,get:function(){return UE.validateKey}})});var Hl0=_((nB)=>{Object.defineProperty(nB,"__esModule",{value:!0});nB.NoopKvCodecs=nB.Kvm=nB.defaultBucketOpts=nB.Bucket=nB.Base64KeyCodec=nB.KvWatchInclude=void 0;var ia8=Fl0();Object.defineProperty(nB,"KvWatchInclude",{enumerable:!0,get:function(){return ia8.KvWatchInclude}});var si=Fl0();Object.defineProperty(nB,"Base64KeyCodec",{enumerable:!0,get:function(){return si.Base64KeyCodec}});Object.defineProperty(nB,"Bucket",{enumerable:!0,get:function(){return si.Bucket}});Object.defineProperty(nB,"defaultBucketOpts",{enumerable:!0,get:function(){return si.defaultBucketOpts}});Object.defineProperty(nB,"Kvm",{enumerable:!0,get:function(){return si.Kvm}});Object.defineProperty(nB,"NoopKvCodecs",{enumerable:!0,get:function(){return si.NoopKvCodecs}})});function v90(){let $=new TextEncoder,Z=new TextDecoder;return{encode:(X)=>$.encode(JSON.stringify(X)),decode:(X)=>JSON.parse(Z.decode(X))}}class Nl0{options;kv=null;codec=v90();constructor($){this.options=$}async init(){let $=this.options.getJetStream();if(!$)return;this.kv=await new ba1.Kvm($).create(na8,{storage:fa1.StorageType.Memory})}async get($,Z){if(!this.kv)return null;try{let X=await this.kv.get(`${$}.${Z}`);if(!X?.value?.length)return null;if(X.operation==="DEL"||X.operation==="PURGE")return null;return this.codec.decode(X.value)}catch{return null}}async set($,Z,X){if(!this.kv)return;try{await this.kv.put(`${$}.${Z}`,this.codec.encode(X))}catch{}}async invalidate($){if(!this.kv)return;await Promise.all(["tools","resources","prompts"].map(async(X)=>{try{await this.kv.delete(`${X}.${$}`)}catch{}}))}teardown(){this.kv=null}}function ta8($,Z,X){if(X<=0)return!0;if($===void 0)return!0;return Z-$>=X}function xa1($){let Z=["tools","resources","prompts"];for(let X of Z){let Q=`${X}:${$}`;b90.delete(Q),$p.delete(Q)}}function f90($){return $ instanceof L1&&$.code===I1.MethodNotFound}function oa8($){return $ instanceof L1&&$.code===-32000&&/connection closed/i.test($.message)}async function oB($,Z,X,Q,Y,G=0){if(!Q)try{return await X()}catch(F){if(f90(F))return[];return ei.add(1,{type:$,outcome:"error",stage:"no_cache"}),null}let J=`${$}:${Z}`,W=await Q.get($,Z);if(W===null)try{let F=await X();return Q.set($,Z,F).catch(()=>{}),b90.set(J,Date.now()),ei.add(1,{type:$,outcome:"miss",stage:"miss"}),F}catch(F){if(f90(F))return Q.set($,Z,[]).catch(()=>{}),[];return ei.add(1,{type:$,outcome:"error",stage:"miss"}),null}if(ei.add(1,{type:$,outcome:"hit",stage:"hit"}),ta8(b90.get(J),Date.now(),G)&&!$p.has(J)){$p.add(J),b90.set(J,Date.now());let F=X().then((H)=>Q.set($,Z,H)).catch((H)=>{if(f90(H)||oa8(H)){if(f90(H))Q.set($,Z,[]).catch(()=>{});return}ei.add(1,{type:$,outcome:"error",stage:"revalidation"})}).finally(()=>$p.delete(J));Y?.(F)}return W}function Ul0($){ya1=$}function Q9(){return ya1}var fa1,ba1,ei,na8="DECOCMS_MCP_LISTS",$p,b90,tB=30000,ya1=null;var _Q=D(()=>{Z9();I6();fa1=V(OL(),1),ba1=V(Hl0(),1),ei=w$.createCounter("mcp_list_cache.fetches",{description:"MCP list cache fetch outcomes (hit, miss, error)",unit:"{fetches}"});$p=new Set;w$.createObservableGauge("mcp_list_cache.pending_revalidations",{description:"In-flight background MCP list revalidations on this pod",unit:"{revalidations}"}).addCallback(($)=>$.observe($p.size));b90=new Map});async function Bl0($,Z,X){let Q=new AbortController,Y,G=new Promise((W,K)=>{Y=setTimeout(()=>{Q.abort(),K(new ga1($.id,X))},X)}),J=(async()=>{let W=await U5($,Z,!0);try{return(await W.listTools(void 0,{timeout:X,signal:Q.signal})).tools}finally{await W.close().catch(()=>{})}})();J.catch(()=>{});try{return await Promise.race([J,G])}finally{if(Y)clearTimeout(Y)}}var ga1;var ha1=D(()=>{Zp();ga1=class ga1 extends Error{constructor($,Z){super(`listTools timed out after ${Z}ms for connection ${$}`);this.name="ListToolsTimeoutError"}}});function x90($){return(Z)=>{if(Z instanceof L1&&Z.code===I1.MethodNotFound)return $;throw Z}}var ua1=D(()=>{Z9()});function y90($,Z,X){let Q=rB($,Z,X,Q9()??void 0),Y=Lw(Q,{name:"studio-mcp-server",version:"1.0.0"},{capabilities:ra8,toolCallTimeoutMs:Vb});Y.server.setRequestHandler(cU,async()=>{return await Q.listResources().catch(x90({resources:[]}))}),Y.server.setRequestHandler(lU,async()=>{return await Q.listResourceTemplates().catch(x90({resourceTemplates:[]}))}),Y.server.setRequestHandler(dU,async()=>{return await Q.listPrompts().catch(x90({prompts:[]}))});let G=Y.close.bind(Y);return Y.close=async()=>{await G(),await Q.close().catch(()=>{})},Y}var ra8;var ca1=D(()=>{gX();Z9();Xp();_Q();ua1();ra8={tools:{},resources:{},prompts:{}}});var kH=D(()=>{Zp();ha1();ca1()});function Qp($,Z,X){if(Z.some((Q)=>Q!=="*"&&Q.startsWith("SELF::"))&&$.SELF===void 0)$.SELF={value:`${X}_self`}}function Yp($,Z){let X=new Map;for(let Q of Z){if(Q==="*")continue;let[Y,G]=k50(Q);if(!aa8.has(G))continue;let J=Ei(Y,$);if(typeof J!=="object"||J===null||!("value"in J))continue;let W=J.value;if(typeof W!=="string")continue;X.set(`${W}:${G}`,{targetConnectionId:W,scope:G})}return[...X.values()]}async function Gp($,Z,X,Q){for(let J of Z){if(J==="*")continue;let[W]=k50(J),K=Ei(W,$);if(K===void 0||K===null)throw Error(`Scope references key "${W}" but it's not present in state`)}let Y=um1($,Z),G=`${X}_self`;for(let J of Y){if(J===G)continue;let W=await Q.storage.connections.findById(J);if(!W||W.organization_id!==X)throw Error(`Referenced connection not found: ${J}`);try{await Q.access.check(J)}catch(K){throw Error(`Access denied to referenced connection: ${J}. ${K.message}`)}}}var aa8;var Ol0=D(()=>{wu0();F60();aa8=new Set([W60,K60])});import{z as la1}from"zod";var sa8,ea8,Dl0;var da1=D(()=>{C4();M0();R$();_Q();kH();Ol0();pi();lW();sa8=la1.object({data:q80.describe("Data for the new connection (id is auto-generated if not provided)")}),ea8=la1.object({item:u7.describe("The created connection entity")}),Dl0=u({name:"COLLECTION_CONNECTIONS_CREATE",description:"Create a new MCP connection. Auto-fetches and caches the server's tool list.",annotations:{title:"Create Connection",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!1,openWorldHint:!1},inputSchema:sa8,outputSchema:ea8,handler:async($,Z)=>{o(Z);let X=t(Z);await Z.access.check();let Q=o0(Z);if(!Q)throw Error("User ID required to create connection");let Y={...$.data,organization_id:X.id,created_by:Q};if(Y.id){if((await Z.storage.connections.findById(Y.id))?.organization_id===X.id)throw Error("Connection already exists in organization")}if(Y.connection_type==="VIRTUAL"){let N=of(Y.connection_url);if(!N)throw Error("VIRTUAL connection requires connection_url in format: virtual://$virtual_mcp_id");let U=await Z.storage.virtualMcps.findById(N);if(!U)throw Error(`Virtual MCP not found: ${N}`);if(U.organization_id!==X.id)throw Error("Virtual MCP does not belong to the current organization");Y.connection_url=rf(N)}if(Y.connection_type==="STDIO"&&!b0().localMode)throw Error("STDIO connections are only available in local mode (--local-mode).");let G=await mB({id:`pending-${Date.now()}`,title:Y.title,connection_type:Y.connection_type,connection_url:Y.connection_url,connection_token:Y.connection_token,connection_headers:Y.connection_headers}).catch(()=>null),J=G?.tools?.length?G.tools:null,W=G?.scopes?.length?G.scopes:Y.configuration_scopes??null,K=Y.configuration_state??null;if(K&&W?.length)Qp(K,W,X.id),await Gp(K,W,X.id,Z);let F=await Z.storage.connections.createNew({...Y,tools:null,configuration_state:K,configuration_scopes:W}),H=K&&W?.length?Yp(K,W):[];if(H.length>0){let N;try{await Z.storage.connectionCredentialVault.replaceGrantsForSubject({organizationId:X.id,subjectConnectionId:F.id,createdBy:Q,grants:H});let{plaintextToken:U,record:B}=await Z.storage.connectionCredentialVault.createOrRotateWorkloadToken({organizationId:X.id,subjectConnectionId:F.id});N=B.id,await(await U5(F,Z,!1)).callTool({name:"ON_MCP_CONFIGURATION",arguments:{state:K,scopes:W,firstRun:!0,vault:{baseUrl:Z.baseUrl,org:X.slug??X.id,subjectConnectionId:F.id,token:U}}})}catch(U){if(N)await Z.storage.connectionCredentialVault.revokeWorkloadToken({organizationId:X.id,subjectConnectionId:F.id,tokenId:N});throw await Z.storage.connections.delete(F.id),U}}if(J)Q9()?.set("tools",F.id,J).catch(()=>{});return x1.capture({distinctId:Q,event:"connection_created",groups:{organization:X.id},properties:{connection_id:F.id,connection_type:F.connection_type,app_name:F.app_name??null,organization_id:X.id,tools_count:J?.length??0}}),{item:F}}})});import{z as pG}from"zod/v4";import{z as ma1}from"zod/v4";import{z as g90}from"zod/v4";import{z as NK}from"zod/v4";import{z as Qs8}from"zod/v4";import{z as BE}from"zod/v4";import{z as UK}from"zod/v4";import{z as bZ}from"zod/v4";import{z as ia1}from"zod/v4";import{z as c90}from"zod/v4";import{z as qs8}from"zod/v4";import{z as pa1}from"zod/v4";import{z as h90}from"zod/v4";import{z as bs8}from"zod/v4";function Jp($,Z){if($===Z)return!0;if($==null||Z==null)return $===Z;if(typeof $!==typeof Z)return!1;if(Array.isArray($)&&Array.isArray(Z)){if($.length!==Z.length)return!1;return $.every((X,Q)=>Jp(X,Z[Q]))}if(typeof $==="object"&&typeof Z==="object"){let X=Object.keys($),Q=Object.keys(Z);if(X.length!==Q.length)return!1;return X.every((Y)=>Q.includes(Y)&&Jp($[Y],Z[Y]))}return!1}function Ts8(){return($)=>{if(!Array.isArray($))return!0;let Z=[];return $.every((X)=>{if(Z.some((Y)=>Jp(X,Y)))return!1;return Z.push(X),!0})}}function u90($,Z){return $.safeParse(Z).success}function B7($){if(typeof $==="boolean")return $?pG.any():pG.never();let Z={};for(let Y of hs8)Y.apply(Z,$);let X=[];if(Z.string!==!1)X.push(Z.string||pG.string());if(Z.number!==!1)X.push(Z.number||pG.number());if(Z.boolean!==!1)X.push(Z.boolean||pG.boolean());if(Z.null!==!1)X.push(Z.null||pG.null());if(Z.array!==!1)X.push(Z.array||pG.array(pG.any()));if(Z.tuple!==!1&&Z.tuple!==void 0)X.push(Z.tuple);if(Z.object!==!1)if(Z.object)X.push(Z.object);else{let Y=pG.custom((G)=>{return typeof G==="object"&&G!==null&&!Array.isArray(G)},"Must be an object, not an array");X.push(Y)}if(Z.file!==!1&&Z.file!==void 0)X.push(Z.file);let Q;if(X.length===0)Q=pG.never();else if(X.length===1)Q=X[0];else if(!Object.keys($).some((G)=>G!=="$schema"&&G!=="title"&&G!=="description"))Q=pG.any();else Q=pG.union(X);for(let Y of us8)Q=Y.apply(Q,$);return Q}var $s8=class{apply($,Z){if(!Z.type)return;let X=Array.isArray(Z.type)?Z.type:[Z.type],Q=new Set(X);if(!Q.has("string"))$.string=!1;if(!Q.has("number")&&!Q.has("integer"))$.number=!1;if(!Q.has("boolean"))$.boolean=!1;if(!Q.has("null"))$.null=!1;if(!Q.has("array"))$.array=!1;if(!Q.has("object"))$.object=!1;if(Q.has("integer")&&$.number!==!1){let Y=$.number||ma1.number();if(Y instanceof ma1.ZodNumber)$.number=Y.int()}}},Zs8=class{apply($,Z){if(Z.const===void 0)return;let X=Z.const;if($.string=!1,$.number=!1,$.boolean=!1,$.null=!1,$.array=!1,$.object=!1,typeof X==="string")$.string=g90.literal(X);else if(typeof X==="number")$.number=g90.literal(X);else if(typeof X==="boolean")$.boolean=g90.literal(X);else if(X===null)$.null=g90.null();else if(Array.isArray(X))$.array=void 0;else if(typeof X==="object")$.object=void 0}},Xs8=class{apply($,Z){if(!Z.enum)return;if(Z.enum.length===0){if(!Z.type)$.string=!1,$.number=!1,$.boolean=!1,$.null=!1,$.array=!1,$.object=!1;return}let X={string:Z.enum.filter((Q)=>typeof Q==="string"),number:Z.enum.filter((Q)=>typeof Q==="number"),boolean:Z.enum.filter((Q)=>typeof Q==="boolean"),null:Z.enum.filter((Q)=>Q===null),array:Z.enum.filter((Q)=>Array.isArray(Q)),object:Z.enum.filter((Q)=>typeof Q==="object"&&Q!==null&&!Array.isArray(Q))};$.string=this.createTypeSchema(X.string,"string"),$.number=this.createTypeSchema(X.number,"number"),$.boolean=this.createTypeSchema(X.boolean,"boolean"),$.null=X.null.length>0?NK.null():!1,$.array=X.array.length>0?void 0:!1,$.object=X.object.length>0?void 0:!1}createTypeSchema($,Z){if($.length===0)return!1;if($.length===1)return NK.literal($[0]);if(Z==="string")return NK.enum($);if(Z==="number"){let[X,Q,...Y]=$;return NK.union([NK.literal(X),NK.literal(Q),...Y.map((G)=>NK.literal(G))])}if(Z==="boolean")return NK.union([NK.literal(!0),NK.literal(!1)]);return!1}},Ys8=class{apply($,Z){let X=Z;if(X.type==="string"&&X.format==="binary"&&X.contentEncoding==="binary"){let Q=Qs8.file();if(X.minLength!==void 0)Q=Q.min(X.minLength);if(X.maxLength!==void 0)Q=Q.max(X.maxLength);if(X.contentMediaType!==void 0)Q=Q.mime(X.contentMediaType);$.file=Q,$.string=!1}}},Gs8=class{apply($,Z){let X=Z;if(Z.type===void 0&&(X.minLength!==void 0||X.maxLength!==void 0||X.pattern!==void 0)){if($.string===void 0)$.string=BE.string()}}},Js8=class{apply($,Z){let X=Z;if(X.minLength===void 0)return;if($.string!==!1){let Q=$.string||BE.string();if(Q instanceof BE.ZodString)$.string=Q.refine((Y)=>{return Array.from(Y).length>=X.minLength},{message:`String must be at least ${X.minLength} characters long`})}}},Ws8=class{apply($,Z){let X=Z;if(X.maxLength===void 0)return;if($.string!==!1){let Q=$.string||BE.string();if(Q instanceof BE.ZodString)$.string=Q.refine((Y)=>{return Array.from(Y).length<=X.maxLength},{message:`String must be at most ${X.maxLength} characters long`})}}},Ks8=class{apply($,Z){let X=Z;if(!X.pattern)return;if($.string!==!1){let Q=$.string||BE.string();if(Q instanceof BE.ZodString){let Y=new RegExp(X.pattern);$.string=Q.regex(Y)}}}},Fs8=class{apply($,Z){let X=Z;if(X.minimum===void 0)return;if($.number!==!1){let Q=$.number||UK.number();if(Q instanceof UK.ZodNumber)$.number=Q.min(X.minimum)}}},Hs8=class{apply($,Z){let X=Z;if(X.maximum===void 0)return;if($.number!==!1){let Q=$.number||UK.number();if(Q instanceof UK.ZodNumber)$.number=Q.max(X.maximum)}}},Ns8=class{apply($,Z){let X=Z;if(X.exclusiveMinimum===void 0)return;if($.number!==!1){let Q=$.number||UK.number();if(Q instanceof UK.ZodNumber)if(typeof X.exclusiveMinimum==="number")$.number=Q.gt(X.exclusiveMinimum);else $.number=!1}}},Us8=class{apply($,Z){let X=Z;if(X.exclusiveMaximum===void 0)return;if($.number!==!1){let Q=$.number||UK.number();if(Q instanceof UK.ZodNumber)if(typeof X.exclusiveMaximum==="number")$.number=Q.lt(X.exclusiveMaximum);else $.number=!1}}},Bs8=class{apply($,Z){let X=Z;if(X.multipleOf===void 0)return;if($.number!==!1){let Q=$.number||UK.number();if(Q instanceof UK.ZodNumber)$.number=Q.refine((Y)=>{if(X.multipleOf===0)return!1;let G=Y/X.multipleOf,J=Math.round(G),W=Math.min(Math.abs(Y)*Number.EPSILON*10,Math.abs(X.multipleOf)*Number.EPSILON*10);return Math.abs(G-J)<=W/Math.abs(X.multipleOf)},{message:`Must be a multiple of ${X.multipleOf}`})}}},Os8=class{apply($,Z){let X=Z;if(Z.type===void 0&&(X.minItems!==void 0||X.maxItems!==void 0||X.items!==void 0||X.prefixItems!==void 0)){if($.array===void 0)$.array=bZ.array(bZ.any())}}},Ds8=class{apply($,Z){let X=Z;if(X.minItems===void 0)return;if($.array!==!1)$.array=($.array||bZ.array(bZ.any())).min(X.minItems)}},Ls8=class{apply($,Z){let X=Z;if(X.maxItems===void 0)return;if($.array!==!1)$.array=($.array||bZ.array(bZ.any())).max(X.maxItems)}},ws8=class{apply($,Z){let X=Z;if($.array===!1)return;if(Array.isArray(X.items))$.array=$.array||bZ.array(bZ.any());else if(X.items&&typeof X.items!=="boolean"&&!X.prefixItems){let Q=B7(X.items),Y=bZ.array(Q);if($.array&&$.array instanceof bZ.ZodArray){let G=$.array._def;if(G.checks)G.checks.forEach((J)=>{if(J._zod&&J._zod.def){let W=J._zod.def;if(W.check==="min_length"&&W.minimum!==void 0)Y=Y.min(W.minimum);else if(W.check==="max_length"&&W.maximum!==void 0)Y=Y.max(W.maximum)}})}$.array=Y}else if(typeof X.items==="boolean"&&X.items===!1)if(!X.prefixItems)$.array=bZ.array(bZ.any()).max(0);else $.array=$.array||bZ.array(bZ.any());else if(typeof X.items==="boolean"&&X.items===!0)$.array=$.array||bZ.array(bZ.any());else if(X.prefixItems)$.array=$.array||bZ.array(bZ.any())}},Es8=class{apply($,Z){if(Z.type!=="array")return;let X=Z;if(!Array.isArray(X.items))return;if($.array===!1)return;let Q=X.items.map((G)=>B7(G)),Y;if(Q.length===0)Y=ia1.tuple([]);else Y=ia1.tuple(Q);if(X.minItems!==void 0&&X.minItems>Q.length)Y=!1;if(X.maxItems!==void 0&&X.maxItems<Q.length)Y=!1;$.tuple=Y,$.array=!1}},js8=class{apply($,Z){let X=Z;if($.object===!1)return;if(X.properties||X.required||X.additionalProperties!==void 0)$.object=$.object||c90.object({}).passthrough()}},zs8=class{apply($,Z){let X=Z;if(Z.type===void 0&&(X.maxProperties!==void 0||X.minProperties!==void 0)){if($.object===void 0)$.object=c90.object({}).passthrough()}}},Ps8=class{apply($,Z){let X=Z;if(X.maxProperties===void 0)return;if($.object!==!1){let Q=$.object||c90.object({}).passthrough();$.object=Q.refine((Y)=>Object.keys(Y).length<=X.maxProperties,{message:`Object must have at most ${X.maxProperties} properties`})}}},As8=class{apply($,Z){let X=Z;if(X.minProperties===void 0)return;if($.object!==!1){let Q=$.object||c90.object({}).passthrough();$.object=Q.refine((Y)=>Object.keys(Y).length>=X.minProperties,{message:`Object must have at least ${X.minProperties} properties`})}}},Rs8=class{apply($,Z){if(!Z.not)return $;let X=B7(Z.not);return $.refine((Q)=>!u90(X,Q),{message:"Value must not match the 'not' schema"})}},Is8=class{apply($,Z){if(Z.uniqueItems!==!0)return $;return $.refine(Ts8(),{message:"Array items must be unique"})}},Ms8=class{apply($,Z){if(!Z.allOf||Z.allOf.length===0)return $;return Z.allOf.map((Q)=>B7(Q)).reduce((Q,Y)=>qs8.intersection(Q,Y),$)}},ks8=class{apply($,Z){if(!Z.anyOf||Z.anyOf.length===0)return $;let X=Z.anyOf.length===1?B7(Z.anyOf[0]):pa1.union([B7(Z.anyOf[0]),B7(Z.anyOf[1]),...Z.anyOf.slice(2).map((Q)=>B7(Q))]);return pa1.intersection($,X)}},Vs8=class{apply($,Z){if(!Z.oneOf||Z.oneOf.length===0)return $;let X=Z.oneOf.map((Q)=>B7(Q));return $.refine((Q)=>{let Y=0;for(let G of X)if(G.safeParse(Q).success){if(Y++,Y>1)return!1}return Y===1},{message:"Value must match exactly one of the oneOf schemas"})}},Ss8=class{apply($,Z){let X=Z;if(X.prefixItems&&Array.isArray(X.prefixItems)){let Y=X.prefixItems.map((G)=>B7(G));return $.refine((G)=>{if(!Array.isArray(G))return!0;for(let J=0;J<Math.min(G.length,Y.length);J++)if(!u90(Y[J],G[J]))return!1;if(G.length>Y.length){if(typeof X.items==="boolean"&&X.items===!1)return!1;else if(X.items&&typeof X.items==="object"&&!Array.isArray(X.items)){let J=B7(X.items);for(let W=Y.length;W<G.length;W++)if(!u90(J,G[W]))return!1}}return!0},{message:"Array does not match prefixItems schema"})}return $}},Cs8=class{apply($,Z){let X=Z;if(!X.properties&&!X.required&&X.additionalProperties!==!1)return $;if($ instanceof h90.ZodObject||$ instanceof h90.ZodRecord){let Q={};if(X.properties){for(let[Y,G]of Object.entries(X.properties))if(G!==void 0)Q[Y]=B7(G)}if(X.required&&Array.isArray(X.required)){let Y=new Set(X.required);for(let G of Object.keys(Q))if(!Y.has(G))Q[G]=Q[G].optional()}else for(let Y of Object.keys(Q))Q[Y]=Q[Y].optional();if(X.additionalProperties===!1)return h90.object(Q);else return h90.object(Q).passthrough()}return $.refine((Q)=>{if(typeof Q!=="object"||Q===null||Array.isArray(Q))return!0;if(X.properties){for(let[Y,G]of Object.entries(X.properties))if(G!==void 0){if(Object.getOwnPropertyDescriptor(Q,Y)!==void 0){if(!B7(G).safeParse(Q[Y]).success)return!1}}}if(X.required&&Array.isArray(X.required)){for(let Y of X.required)if(Object.getOwnPropertyDescriptor(Q,Y)===void 0)return!1}if(X.additionalProperties===!1&&X.properties){let Y=new Set(Object.keys(X.properties));for(let G in Q)if(!Y.has(G))return!1}return!0},{message:"Object constraints validation failed"})}},_s8=class{apply($,Z){if(!Z.enum||Z.enum.length===0)return $;let X=Z.enum.filter((Q)=>Array.isArray(Q)||typeof Q==="object"&&Q!==null);if(X.length===0)return $;return $.refine((Q)=>{if(typeof Q!=="object"||Q===null)return!0;return X.some((Y)=>Jp(Q,Y))},{message:"Value must match one of the enum values"})}},vs8=class{apply($,Z){if(Z.const===void 0)return $;let X=Z.const;if(typeof X!=="object"||X===null)return $;return $.refine((Q)=>Jp(Q,X),{message:"Value must equal the const value"})}},fs8=class{apply($,Z){if(Z.description)$=$.describe(Z.description);return $}},xs8=class{apply($,Z){var X;let Q=Z;if(!((X=Q.required)==null?void 0:X.includes("__proto__"))||Z.type!==void 0)return $;return bs8.any().refine((Y)=>this.validateRequired(Y,Q.required),{message:"Missing required properties"})}validateRequired($,Z){if(typeof $!=="object"||$===null||Array.isArray($))return!0;return Z.every((X)=>Object.prototype.hasOwnProperty.call($,X))}},ys8=class{apply($,Z){var X;let Q=Z;if(Q.contains===void 0)return $;let Y=B7(Q.contains),G=(X=Q.minContains)!=null?X:1,J=Q.maxContains;return $.refine((W)=>{if(!Array.isArray(W))return!0;let K=0;for(let F of W)if(u90(Y,F))K++;if(K<G)return!1;if(J!==void 0&&K>J)return!1;return!0},{message:"Array must contain required items matching the schema"})}},gs8=class{apply($,Z){let{default:X}=Z;if(X===void 0)return $;if(!$.safeParse(X).success)return $;return $.default(X)}},hs8,us8;var na1=D(()=>{hs8=[new Zs8,new Xs8,new $s8,new Ys8,new Gs8,new Os8,new zs8,new Js8,new Ws8,new Ks8,new Fs8,new Hs8,new Ns8,new Us8,new Bs8,new Es8,new Ds8,new Ls8,new ws8,new Ps8,new As8,new js8],us8=[new xs8,new _s8,new vs8,new Ms8,new ks8,new Vs8,new Ss8,new Cs8,new ys8,new Rs8,new Is8,new gs8,new fs8]});class Ll0{constructor($){this._url=$}start(){if(this._socket)throw Error("WebSocketClientTransport already started! If using Client class, note that connect() calls start() automatically.");return new Promise(($,Z)=>{this._socket=new WebSocket(this._url,cs8),this._socket.onerror=(X)=>{let Q="error"in X?X.error:Error(`WebSocket error: ${JSON.stringify(X)}`);Z(Q),this.onerror?.(Q)},this._socket.onopen=()=>{$()},this._socket.onclose=()=>{this.onclose?.()},this._socket.onmessage=(X)=>{let Q;try{Q=vY.parse(JSON.parse(X.data))}catch(Y){this.onerror?.(Y);return}this.onmessage?.(Q)}})}async close(){this._socket?.close()}send($){return new Promise((Z,X)=>{if(!this._socket){X(Error("Not connected"));return}this._socket?.send(JSON.stringify($)),Z()})}}var cs8="mcp";var ta1=D(()=>{Z9()});function ls8($){let Z=$;if(!Z||typeof Z!=="object"||!("method"in Z))return null;switch(Z.method){case"initialize":{let X=Z?.params?.protocolVersion;if(!X)return null;return{type:"emit",message:{result:{protocolVersion:X,capabilities:{tools:{}},serverInfo:{name:"deco-chat-server",version:"1.0.0"}},jsonrpc:Z.jsonrpc??"2.0",id:Z.id}}}case"notifications/roots/list_changed":case"notifications/initialized":case"notifications/cancelled":case"notifications/progress":return{type:"suppress"};default:return null}}var l90;var wl0=D(()=>{jb();l90=class l90 extends oW{constructor($,Z){super($,Z)}send($,Z){let X=ls8($);if(X?.type==="emit")return this.onmessage?.(X.message),Promise.resolve();if(X?.type==="suppress")return Promise.resolve();return super.send($,Z)}}});var oa1,ra1=async($,Z,X)=>{let Q=ds8($.connection,Z,X);if(!Q)throw Error("Unknown MCP connection type");let Y=new oa1({name:$?.name??"MCP Client",version:"1.0.0"});return await Y.connect(Q),{client:Y}},ds8=($,Z,X)=>{if($.type==="Websocket")return new Ll0(new URL($.url));if($.type!=="SSE"&&$.type!=="HTTP")return null;let Y={...$.token?{authorization:`Bearer ${$.token}`}:{},...X??{},..."headers"in $?$.headers||{}:{}};if($.type==="SSE"){let G={requestInit:{headers:Y,signal:Z}};if($.token)G.eventSourceInit={fetch:(J,W)=>{return fetch(J,{...W,headers:{...Y,Accept:"text/event-stream"},signal:Z})}};return new jH(new URL($.url),G)}return new l90(new URL($.url),{requestInit:{headers:Y,signal:Z,credentials:"include"}})};var aa1=D(()=>{nW();rd();ta1();Z9();gX();wl0();oa1=class oa1 extends x9{constructor($,Z){super($,{jsonSchemaValidator:N5,...Z})}async listTools($,Z){return await this.request({method:"tools/list",params:$},Nd,Z)}}});function is8($,Z){if(OE.set($,Z),OE.size>ms8){let X=OE.keys().next().value;if(X!==void 0)OE.delete(X)}}function $s1($){let Z=(X)=>{if("connection"in $)return ra1({connection:$.connection},void 0,X);return $.client};return new Proxy({},{get(X,Q){if(Q==="toJSON")return null;if(typeof Q!=="string")throw Error("Name must be a string");if(Q==="listTools")return W;async function Y(K,F=Q){let H=$?.debugId?.(),N=H?{"x-trace-debug-id":H}:void 0,{client:U}=await Z(N),{structuredContent:B,isError:O,content:L}=await U.callTool({name:String(F),arguments:K});if(O){let E=L?.[0]?.text,j=typeof E==="string"?sa1(E):null,z=j?.code&&typeof $?.getErrorByStatusCode==="function"?$.getErrorByStatusCode(j.code,j.message,j.traceId):null;if(z)throw z;throw Error(`Tool ${String(F)} returned an error: ${JSON.stringify(B??L)}`)}if(B!==void 0)return B;let w=L?.[0]?.text;return typeof w==="string"?sa1(w):void 0}async function G(){let{client:K}=await Z(),{tools:F}=await K.listTools();return F}async function J(){if(!("connection"in $))return G();let K=$.connection,F=JSON.stringify(K);try{if(!OE.has(F))is8(F,G());return await OE.get(F)}catch(H){console.error("Failed to list tools",H),OE.delete(F);return}}async function W(){return(await J()??[]).map((F)=>ea1(F,Y))}return Y.asTool=async()=>{let F=(await J()??[]).find((H)=>H.name===Q);if(!F)throw Error(`Tool ${Q} not found`);return ea1(F,Y)},Y}})}var sa1=($)=>{try{return JSON.parse($)}catch{return $}},ms8=500,OE,ea1=($,Z)=>{return{...$,id:$.name,inputSchema:$.inputSchema?B7($.inputSchema):void 0,outputSchema:$.outputSchema?B7($.outputSchema):void 0,execute:(X)=>{return Z(X.context,$.name)}}};var Zs1=D(()=>{na1();aa1();OE=new Map});function aB($){return $s1($)}var ex;var El0=D(()=>{Zs1();ex=new Proxy({},{get($,Z){if(Z==="toJSON")return null;if(Z==="forConnection")return(X)=>aB({connection:X});if(Z==="forClient")return(X)=>aB({client:X});return globalThis[Z]}})});function d90($){return{isImplementedBy:(Z)=>{for(let X of $){let Q=typeof X.name==="string"?new RegExp(`^${X.name}$`):X.name,Y=Z.find((G)=>Q.test(G.name));if(!Y&&X.opt)continue;if(!Y)return!1}return!0}}}var BK=($)=>{return{...d90($),forClient:(Z)=>{return aB({client:Z})},forConnection:(Z)=>{return aB({connection:Z})}}};var DE=D(()=>{El0()});import{z as g5}from"zod";var Xs1,m90,Qs1,i90,Ys1,ps8;var Gs1=D(()=>{DE();Xs1=g5.object({specversion:g5.literal("1.0").describe("CloudEvents specification version"),id:g5.string().describe("Unique identifier for this event (UUID recommended)"),source:g5.string().describe("Connection ID of the event publisher"),type:g5.string().describe("Event type (e.g., 'order.created', 'user.signup')"),time:g5.string().datetime().optional().describe("Timestamp of when the event occurred (ISO 8601)"),subject:g5.string().optional().describe("Subject/resource identifier (e.g., order ID, user ID)"),datacontenttype:g5.string().optional().default("application/json").describe("Content type of the data attribute"),dataschema:g5.string().url().optional().describe("URI to the schema for the data attribute"),data:g5.unknown().optional().describe("Event payload (any JSON value)")}),m90=g5.object({events:g5.array(Xs1).min(1).describe("Batch of CloudEvents to process")}),Qs1=g5.object({success:g5.boolean().optional().describe("Whether this event was processed successfully"),error:g5.string().optional().describe("Error message for this event"),retryAfter:g5.number().int().positive().optional().describe("Re-deliver this event after this many ms")}),i90=g5.object({success:g5.boolean().optional().describe("Batch success - applies to events not in results"),error:g5.string().optional().describe("Batch error message - applies to events not in results"),processedCount:g5.number().int().min(0).optional().describe("Number of events successfully processed"),retryAfter:g5.number().int().positive().optional().describe("Batch retryAfter - applies to events not in results"),results:g5.record(g5.string(),Qs1).optional().describe("Per-event results keyed by event ID")}),Ys1=[{name:"ON_EVENTS",inputSchema:m90,outputSchema:i90}],ps8=BK(Ys1)});import{z as h5}from"zod";var Js1,Ws1,Ks1,Fs1,Hs1,Ns1,p90,jl0;var zl0=D(()=>{DE();Js1=h5.object({type:h5.literal("string"),enum:h5.array(h5.string()).optional(),description:h5.string().optional()}),Ws1=h5.object({type:h5.string(),description:h5.string(),paramsSchema:h5.record(h5.string(),Js1)}),Ks1=h5.object({}),Fs1=h5.object({triggers:h5.array(Ws1)}),Hs1=h5.object({type:h5.string(),params:h5.record(h5.string(),h5.string()),enabled:h5.boolean(),callbackUrl:h5.url().optional(),callbackToken:h5.string().min(1).optional()}),Ns1=h5.object({success:h5.boolean()}),p90=[{name:"TRIGGER_LIST",inputSchema:Ks1,outputSchema:Fs1},{name:"TRIGGER_CONFIGURE",inputSchema:Hs1,outputSchema:Ns1}],jl0=BK(p90)});import{z as k$}from"zod";var ns8,ts8,os8,rs8,as8,ss8,es8,$e8,Ze8,Xe8,Qe8,Ye8,LE;var Wp=D(()=>{ns8=k$.object({prefix:k$.string().optional().describe("Filter objects by prefix (e.g., 'folder/' for folder contents)"),maxKeys:k$.number().optional().default(1000).describe("Maximum number of keys to return (default: 1000)"),continuationToken:k$.string().optional().describe("Token for pagination from previous response"),delimiter:k$.string().optional().describe("Delimiter for grouping keys (typically '/'). When set, commonPrefixes returns folder paths.")}),ts8=k$.object({objects:k$.array(k$.object({key:k$.string().describe("Object key/path"),size:k$.number().describe("Object size in bytes"),lastModified:k$.string().describe("Last modified timestamp"),etag:k$.string().describe("Entity tag for the object")})),nextContinuationToken:k$.string().optional().describe("Token for fetching next page of results"),isTruncated:k$.boolean().describe("Whether there are more results available"),commonPrefixes:k$.array(k$.string()).optional().describe("Folder paths when delimiter is used (e.g., ['photos/2024/', 'photos/2025/'])")}),os8=k$.object({key:k$.string().describe("Object key/path to get metadata for")}),rs8=k$.object({contentType:k$.string().optional().describe("MIME type of the object"),contentLength:k$.number().describe("Size of the object in bytes"),lastModified:k$.string().describe("Last modified timestamp"),etag:k$.string().describe("Entity tag for the object"),metadata:k$.record(k$.string(),k$.string()).optional().describe("Custom metadata key-value pairs")}),as8=k$.object({key:k$.string().describe("Object key/path to generate URL for"),expiresIn:k$.number().optional().describe("URL expiration time in seconds (default: from state config or 3600)")}),ss8=k$.object({url:k$.string().describe("Presigned URL for downloading the object"),expiresIn:k$.number().describe("Expiration time in seconds that was used")}),es8=k$.object({key:k$.string().describe("Object key/path for the upload"),expiresIn:k$.number().optional().describe("URL expiration time in seconds (default: from state config or 3600)"),contentType:k$.string().optional().describe("MIME type for the object being uploaded")}),$e8=k$.object({url:k$.string().describe("Presigned URL for uploading the object"),expiresIn:k$.number().describe("Expiration time in seconds that was used")}),Ze8=k$.object({key:k$.string().describe("Object key/path to delete")}),Xe8=k$.object({success:k$.boolean().describe("Whether the deletion was successful"),key:k$.string().describe("The key that was deleted")}),Qe8=k$.object({keys:k$.array(k$.string()).max(1000).describe("Array of object keys/paths to delete (max 1000)")}),Ye8=k$.object({deleted:k$.array(k$.string()).describe("Array of successfully deleted keys"),errors:k$.array(k$.object({key:k$.string(),message:k$.string()})).describe("Array of errors for failed deletions")}),LE=[{name:"LIST_OBJECTS",inputSchema:ns8,outputSchema:ts8},{name:"GET_OBJECT_METADATA",inputSchema:os8,outputSchema:rs8},{name:"GET_PRESIGNED_URL",inputSchema:as8,outputSchema:ss8},{name:"PUT_PRESIGNED_URL",inputSchema:es8,outputSchema:$e8},{name:"DELETE_OBJECT",inputSchema:Ze8,outputSchema:Xe8},{name:"DELETE_OBJECTS",inputSchema:Qe8,outputSchema:Ye8}]});import{z as w6}from"zod";var Us1,Bs1,Os1,Kp,n90,t90,o90,r90,Ge8;var Pl0=D(()=>{DE();Us1=w6.object({primary:w6.string().optional().describe("Primary brand color (hex)"),secondary:w6.string().optional().describe("Secondary brand color (hex)"),accent:w6.string().optional().describe("Accent / highlight color (hex)"),background:w6.string().optional().describe("Background color (hex)"),foreground:w6.string().optional().describe("Foreground / text color (hex)")}),Bs1=w6.object({heading:w6.string().optional().describe("Font family for headings"),body:w6.string().optional().describe("Font family for body text"),code:w6.string().optional().describe("Font family for code / monospace")}),Os1=w6.object({logo:w6.string().optional().describe("Logo URL"),favicon:w6.string().optional().describe("Favicon URL"),ogImage:w6.string().optional().describe("Open Graph image URL")}),Kp=w6.object({id:w6.string(),name:w6.string().describe("Brand / company name"),domain:w6.string().optional().describe("Company domain (e.g. example.com)"),colors:Us1.optional().describe("Semantic color palette"),fonts:Bs1.optional().describe("Font families by role"),assets:Os1.optional().describe("Visual identity assets"),overview:w6.string().optional().describe("Company overview / description"),tagline:w6.string().optional().describe("Brand tagline"),tone:w6.string().optional().describe("Tone of voice description"),metadata:w6.record(w6.string(),w6.unknown()).optional().describe("Extra design tokens and metadata")}),n90=w6.object({id:w6.string().optional().describe("Brand ID. Omit to get the default brand.")}),t90=w6.object({}),o90=w6.object({items:w6.array(Kp)}),r90=[{name:"BRAND_GET",inputSchema:n90,outputSchema:Kp},{name:"BRAND_LIST",inputSchema:t90,outputSchema:o90,opt:!0}],Ge8=BK(r90)});var Al0=D(()=>{DE();Gs1();zl0();Wp();Pl0()});import{z as E8}from"zod";function VH($){return E8.object({items:E8.array($).describe("Array of collection items"),totalCount:E8.number().int().min(0).optional().describe("Total number of matching items (if available)"),hasMore:E8.boolean().optional().describe("Whether there are more items available")})}function Hp($){return E8.object({item:$.nullable().describe("The retrieved item, or null if not found")})}function Ke8($){return E8.object({data:$.partial().describe("Data for the new entity (id may be auto-generated)")})}function Fe8($){return E8.object({item:$.describe("The created entity with generated id")})}function He8($){return E8.object({id:E8.string().describe("ID of the entity to update"),data:$.partial().describe("Partial entity data to update")})}function Ne8($){return E8.object({item:$.describe("The updated entity")})}function Up($){return E8.object({item:$.describe("The deleted entity")})}function s90($,Z,X){let Q=$.toUpperCase(),Y=X?.readOnly??!1,G=[{name:`COLLECTION_${Q}_LIST`,inputSchema:V3,outputSchema:VH(Z)},{name:`COLLECTION_${Q}_GET`,inputSchema:Fp,outputSchema:Hp(Z)}];if(!Y)G.push({name:`COLLECTION_${Q}_CREATE`,inputSchema:Ke8(Z),outputSchema:Fe8(Z),opt:!0},{name:`COLLECTION_${Q}_UPDATE`,inputSchema:He8(Z),outputSchema:Ne8(Z),opt:!0},{name:`COLLECTION_${Q}_DELETE`,inputSchema:Np,outputSchema:Up(Z),opt:!0});return G}var a90,Je8,Ds1,We8,V3,Fp,Np;var nG=D(()=>{a90=E8.object({id:E8.string().describe("Unique identifier for the entity"),title:E8.string().describe("Human-readable title for the entity"),description:E8.string().nullish().describe("Description of the entity"),created_at:E8.string().datetime(),updated_at:E8.string().datetime(),created_by:E8.string().optional(),updated_by:E8.string().optional()}),Je8=E8.object({field:E8.array(E8.string()),operator:E8.enum(["eq","gt","gte","lt","lte","in","like","contains"]),value:E8.unknown()}),Ds1=E8.lazy(()=>E8.union([Je8,E8.object({operator:E8.enum(["and","or","not"]),conditions:E8.array(Ds1)})])),We8=E8.object({field:E8.array(E8.string()),direction:E8.enum(["asc","desc"]),nulls:E8.enum(["first","last"]).optional()}),V3=E8.object({where:Ds1.optional().describe("Filter expression"),orderBy:E8.array(We8).optional().describe("Sort expressions"),limit:E8.number().int().min(1).max(1000).optional().describe("Maximum number of items to return"),offset:E8.number().int().min(0).optional().describe("Number of items to skip")});Fp=E8.object({id:E8.string().describe("ID of the entity to retrieve")});Np=E8.object({id:E8.string().describe("ID of the entity to delete")})});import{z as $y}from"zod";var Ue8,Be8,Ls1;var ws1=D(()=>{nG();Ue8=a90.extend({avatar:$y.string().describe("URL or data URI to the assistant's avatar image"),system_prompt:$y.string().describe("System prompt that defines the assistant's behavior"),virtual_mcp_id:$y.string().describe("Virtual MCP ID to use for this assistant"),model:$y.object({id:$y.string().describe("Model ID"),connectionId:$y.string().describe("Connection ID that provides the model")}).describe("Selected model reference for this assistant")}),Be8=s90("assistant",Ue8),Ls1=[...Be8]});import{z as F0}from"zod";var Bp,SH,js1,Oe8,De8,zs1,Le8,we8,Ee8,je8,ze8,Pe8,Ps1,Ae8,Te8,Re8,Ie8,qe8,Me8,ke8,Ve8,Se8,Ce8,mQ5,_e8,iQ5,Es1,ve8,fe8,e90,pQ5;var As1=D(()=>{DE();nG();Bp=F0.lazy(()=>F0.union([F0.null(),F0.string(),F0.number(),F0.boolean(),F0.record(F0.string(),Bp),F0.array(Bp)])),SH=F0.record(F0.string(),F0.record(F0.string(),Bp)).optional().describe("Additional provider-specific options. Outer record keyed by provider name, inner by option key"),js1=F0.object({type:F0.literal("text"),text:F0.string().describe("The text content"),providerOptions:SH}),Oe8=F0.object({type:F0.literal("text"),text:F0.string().describe("The text content"),providerMetadata:F0.any().optional().describe("Additional provider-specific metadata")}),De8=F0.string().describe("File data as URL string"),zs1=F0.object({type:F0.literal("file"),filename:F0.string().optional().describe("Optional filename of the file"),data:De8,mediaType:F0.string().describe("IANA media type of the file (e.g., image/png, audio/mp3)"),providerOptions:SH}),Le8=F0.object({type:F0.literal("file"),mediaType:F0.string().describe("IANA media type of the file (e.g., image/png, audio/mp3)"),data:F0.string().describe("Generated file data as base64 encoded string")}),we8=F0.object({type:F0.literal("reasoning"),text:F0.string().describe("The reasoning text"),providerOptions:SH}),Ee8=F0.object({type:F0.literal("reasoning"),text:F0.string().describe("The reasoning text"),providerMetadata:F0.any().optional().describe("Additional provider-specific metadata")}),je8=F0.object({type:F0.literal("tool-call"),toolCallId:F0.string().describe("ID of the tool call, used to match with tool result"),toolName:F0.string().describe("Name of the tool being called"),input:F0.string().describe("Arguments of the tool call (JSON-serializable object matching tool input schema)"),providerExecuted:F0.boolean().optional().describe("Whether the tool call will be executed by the provider"),providerOptions:SH}),ze8=F0.object({type:F0.literal("tool-call"),toolCallId:F0.string().describe("ID of the tool call"),toolName:F0.string().describe("Name of the tool being called"),input:F0.string().describe("Stringified JSON object with the tool call arguments"),providerExecuted:F0.boolean().optional().describe("Whether the tool call will be executed by the provider"),providerMetadata:F0.any().optional().describe("Additional provider-specific metadata")}),Pe8=F0.union([F0.object({type:F0.literal("text"),value:F0.string()}),F0.object({type:F0.literal("json"),value:Bp}),F0.object({type:F0.literal("error-text"),value:F0.string()}),F0.object({type:F0.literal("error-json"),value:Bp}),F0.object({type:F0.literal("content"),value:F0.array(F0.union([F0.object({type:F0.literal("text"),text:F0.string().describe("Text content")}),F0.object({type:F0.literal("media"),data:F0.string().describe("Base-64 encoded media data"),mediaType:F0.string().describe("IANA media type")})]))}),F0.object({type:F0.literal("execution-denied"),reason:F0.string().optional()}),F0.string().describe("Raw or JSON-serialized output (e.g. from AI SDK mapToolResultOutput)")]),Ps1=F0.object({type:F0.literal("tool-result"),toolCallId:F0.string().describe("ID of the tool call that this result is associated with"),toolName:F0.string().describe("Name of the tool that generated this result"),output:Pe8.describe("Result of the tool call"),result:F0.unknown().describe("Unknown result of the tool call"),providerOptions:SH}),Ae8=F0.object({type:F0.literal("tool-result"),toolCallId:F0.string().describe("ID of the tool call that this result is associated with"),toolName:F0.string().describe("Name of the tool that generated this result"),result:F0.any().describe("Result of the tool call (JSON-serializable)"),isError:F0.boolean().optional().describe("Whether the result is an error or error message"),providerExecuted:F0.boolean().optional().describe("Whether the tool result was generated by the provider"),providerMetadata:F0.any().optional().describe("Additional provider-specific metadata")}),Te8=F0.union([F0.object({type:F0.literal("source"),sourceType:F0.literal("url"),id:F0.string().describe("The ID of the source"),url:F0.string().describe("The URL of the source"),title:F0.string().optional().describe("The title of the source"),providerMetadata:F0.any().optional().describe("Additional provider-specific metadata")}),F0.object({type:F0.literal("source"),sourceType:F0.literal("document"),id:F0.string().describe("The ID of the source"),mediaType:F0.string().describe("IANA media type of the document (e.g., application/pdf)"),title:F0.string().describe("The title of the document"),filename:F0.string().optional().describe("Optional filename of the document"),providerMetadata:F0.any().optional().describe("Additional provider-specific metadata")})]),Re8=F0.object({role:F0.literal("system"),content:F0.string().describe("System message content"),providerOptions:SH}),Ie8=F0.object({role:F0.literal("user"),content:F0.array(F0.union([js1,zs1])).describe("User message content parts (text or file)"),providerOptions:SH}),qe8=F0.object({role:F0.literal("assistant"),content:F0.array(F0.union([js1,zs1,we8,je8,Ps1])).describe("Assistant message content parts (text, file, reasoning, tool-call, or tool-result)"),providerOptions:SH}),Me8=F0.object({role:F0.literal("tool"),content:F0.array(Ps1).describe("Tool message content (tool results)"),providerOptions:SH}),ke8=F0.union([Re8,Ie8,qe8,Me8]),Ve8=F0.array(ke8).describe("A list of messages forming the prompt"),Se8=F0.object({prompt:Ve8.describe("A language model prompt is a standardized prompt type (array of messages with roles: system, user, assistant, tool)"),maxOutputTokens:F0.number().optional().describe("Maximum number of tokens to generate"),temperature:F0.number().optional().describe("Temperature setting. The range depends on the provider and model"),topP:F0.number().optional().describe("Nucleus sampling parameter"),topK:F0.number().optional().describe("Only sample from the top K options for each subsequent token. Used to remove long tail low probability responses"),presencePenalty:F0.number().optional().describe("Presence penalty setting. It affects the likelihood of the model to repeat information that is already in the prompt"),frequencyPenalty:F0.number().optional().describe("Frequency penalty setting. It affects the likelihood of the model to repeatedly use the same words or phrases"),seed:F0.number().optional().describe("The seed (integer) to use for random sampling. If set and supported by the model, calls will generate deterministic results"),stopSequences:F0.array(F0.string()).optional().describe("Stop sequences. If set, the model will stop generating text when one of the stop sequences is generated"),responseFormat:F0.union([F0.object({type:F0.literal("text")}),F0.object({type:F0.literal("json"),schema:F0.any().optional().describe("JSON schema that the generated output should conform to"),name:F0.string().optional().describe("Name of output that should be generated"),description:F0.string().optional().describe("Description of the output that should be generated")})]).optional().describe("Response format. The output can either be text or JSON. Default is text"),tools:F0.array(F0.any()).optional().describe("The tools that are available for the model"),toolChoice:F0.any().optional().describe("Specifies how the tool should be selected. Defaults to 'auto'"),includeRawChunks:F0.boolean().optional().describe("Include raw chunks in the stream. Only applicable for streaming calls"),abortSignal:F0.any().optional().describe("Abort signal for cancelling the operation"),providerOptions:F0.any().optional().describe("Additional provider-specific options")}),Ce8=F0.object({content:F0.array(F0.union([Oe8,Le8,Ee8,ze8,Ae8,Te8])).describe("Ordered content that the model has generated (text, tool-calls, reasoning, files, sources)"),finishReason:F0.enum(["stop","length","content-filter","tool-calls","error","other","unknown"]).describe("Reason why generation stopped"),usage:F0.looseObject({inputTokens:F0.number().optional(),outputTokens:F0.number().optional(),totalTokens:F0.number().optional(),reasoningTokens:F0.number().optional()}).describe("Usage information for the language model call"),providerMetadata:F0.any().optional().describe("Additional provider-specific metadata"),request:F0.object({body:F0.any().optional().describe("Request HTTP body sent to the provider API")}).optional().describe("Optional request information for telemetry and debugging"),response:F0.object({id:F0.string().optional().describe("ID for the generated response"),timestamp:F0.iso.datetime().optional().describe("Timestamp for the start of the generated response"),modelId:F0.string().optional().describe("The ID of the response model that was used"),headers:F0.record(F0.string(),F0.string()).optional().describe("Response headers"),body:F0.any().optional().describe("Response HTTP body")}).optional().describe("Optional response information for telemetry and debugging"),warnings:F0.array(F0.any()).describe("Warnings for the call, e.g. unsupported settings")}),mQ5=F0.object({stream:F0.any().describe("ReadableStream of LanguageModelV2StreamPart"),request:F0.object({body:F0.any().optional().describe("Request HTTP body sent to the provider API")}).optional().describe("Optional request information for telemetry and debugging"),response:F0.object({headers:F0.record(F0.string(),F0.string()).optional().describe("Response headers")}).optional().describe("Optional response data")}),_e8=F0.object({supportedUrls:F0.record(F0.string(),F0.array(F0.string())).describe("Supported URL patterns by media type for the provider")}),iQ5=F0.object({modelId:F0.string().describe("The ID of the model"),logo:F0.string().nullable(),description:F0.string().nullable(),capabilities:F0.array(F0.string()),limits:F0.object({contextWindow:F0.number(),maxOutputTokens:F0.number()}).nullable(),costs:F0.object({input:F0.number(),output:F0.number()}).nullable(),provider:F0.enum(["openai","anthropic","google","x-ai","deepseek","openai-compatible","openrouter"]).nullable()}),Es1=F0.object({modelId:F0.string().describe("The ID of the model"),callOptions:Se8}),ve8=a90.extend({logo:F0.string().nullable(),description:F0.string().nullable(),capabilities:F0.array(F0.string()),limits:F0.object({contextWindow:F0.number(),maxOutputTokens:F0.number()}).nullable(),costs:F0.object({input:F0.number(),output:F0.number()}).nullable(),provider:F0.enum(["openai","anthropic","google","xai","deepseek","openai-compatible","openrouter"]).nullable()}),fe8=s90("llm",ve8,{readOnly:!0}),e90=[{name:"LLM_METADATA",inputSchema:F0.object({modelId:F0.string().describe("The ID of the model")}),outputSchema:_e8},{name:"LLM_DO_STREAM",inputSchema:Es1},{name:"LLM_DO_GENERATE",inputSchema:Es1,outputSchema:Ce8},...fe8],pQ5=BK(e90)});import{z as wE}from"zod";var be8,Ts1;var Rs1=D(()=>{be8=wE.object({scopes:wE.array(wE.string()).describe("List of scopes available"),stateSchema:wE.record(wE.string(),wE.unknown()).describe("JSON Schema (draft-07) defining the state structure")}),Ts1=[{name:"MCP_CONFIGURATION",inputSchema:wE.object({}),outputSchema:be8}]});import{z as u5}from"zod";var xe8,ye8,Is1;var qs1=D(()=>{xe8=u5.object({}).strict(),ye8=u5.object({billing:u5.object({mode:u5.enum(["prepaid","postpaid"]),limitPeriod:u5.enum(["daily","weekly","monthly"]).nullable()}),limit:u5.object({total:u5.number().nullable(),remaining:u5.number().nullable(),reset:u5.string().nullable()}),usage:u5.object({total:u5.number(),daily:u5.number(),weekly:u5.number(),monthly:u5.number()}),alert:u5.object({enabled:u5.boolean(),threshold_usd:u5.number(),email:u5.string().nullable()}),connectionId:u5.string()}),Is1=[{name:"GATEWAY_USAGE",inputSchema:xe8,outputSchema:ye8},{name:"GATEWAY_SET_LIMIT",inputSchema:u5.object({}),outputSchema:u5.object({}),opt:!0},{name:"GATEWAY_SET_ALERT",inputSchema:u5.object({}),outputSchema:u5.object({}),opt:!0}]});import{z as Ms1}from"zod";function tG(){return SY()===null}function $Z0($,Z){return $===C8.DEV_ASSETS(Z)}function Zy($,Z){let X=ng1(Z,$),Q=new Date().toISOString();return{id:X.id??C8.DEV_ASSETS($),title:X.title,description:X.description??null,icon:X.icon??null,app_name:X.app_name??null,app_id:X.app_id??null,organization_id:$,created_by:"system",created_at:Q,updated_at:Q,connection_type:X.connection_type,connection_url:X.connection_url??null,connection_token:null,connection_headers:null,oauth_config:null,configuration_state:null,configuration_scopes:null,metadata:X.metadata??null,tools:ge8,bindings:["OBJECT_STORAGE"],status:"active"}}var ge8;var Xy=D(()=>{Xw();Wp();_8();ge8=LE.map(($)=>({name:$.name,description:`${$.name} operation for local file storage`,inputSchema:Ms1.toJSONSchema($.inputSchema),outputSchema:Ms1.toJSONSchema($.outputSchema)}))});function ks1($,Z){return $||Z===0}function Vs1($,Z,X,Q,Y){let G=Z?Y+1:Y,J=$.slice(0,X),W=Q+X<G;return{items:J,totalCount:G,hasMore:W}}function Ss1($,Z,X){if(!X)return{sqlOffset:$,sqlLimit:Z};if($===0)return{sqlOffset:0,sqlLimit:Math.max(Z-1,0)};return{sqlOffset:$-1,sqlLimit:Z}}function he8($,Z){if(Z.length===0)return;let[X,...Q]=Z,Y=X==="slug"?JB($):$[X];for(let G of Q){if(Y===null||typeof Y!=="object")return;Y=Y[G]}return Y}function ue8($){let X=$.replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/%/g,".*").replace(/_/g,".");return new RegExp(`^${X}$`,"i")}function ce8($,Z,X){if($===void 0)return!0;switch(Z){case"eq":return X===null?$===null:$===X;case"gt":return $>X;case"gte":return $>=X;case"lt":return $<X;case"lte":return $<=X;case"in":return Array.isArray(X)&&X.includes($);case"like":return typeof $==="string"&&ue8(String(X)).test($);case"contains":return String($).toLowerCase().includes(String(X).toLowerCase());default:return!0}}function Op($,Z){if(!Z)return!0;if("conditions"in Z){let{operator:Q,conditions:Y}=Z;if(Y.length===0)return!0;switch(Q){case"and":return Y.every((G)=>Op($,G));case"or":return Y.some((G)=>Op($,G));case"not":return!Y.every((G)=>Op($,G));default:return!0}}let X=he8($,Z.field);return ce8(X,Z.operator,Z.value)}var Cs1=D(()=>{Y60()});import{z as sB}from"zod";var le8=8,de8,me8,ie8,pe8,Tl0;var _s1=D(()=>{Al0();ws1();nG();As1();Rs1();Wp();qs1();_8();M0();$9();_Q();kH();Xy();lW();Y60();Cs1();de8=[{name:/^(COLLECTION_REGISTRY_APP_LIST|REGISTRY_ITEM_LIST)$/,inputSchema:sB.object({})}],me8={LLM:e90,LLMS:e90,ASSISTANTS:Ls1,MCP:Ts1,OBJECT_STORAGE:LE,AI_GATEWAY_BILLING:Is1,TRIGGER:p90,REGISTRY:de8,BRAND:r90},ie8=V3.extend({binding:sB.union([sB.array(sB.object({}).passthrough()),sB.object({}).passthrough(),sB.string()]).optional(),include_virtual:sB.boolean().optional().describe("Whether to include VIRTUAL connections in the results. Defaults to false."),slug:sB.string().optional().describe("Filter by connection slug. Matches against app_name, or a slug derived from connection_url or title.")}),pe8=VH(u7),Tl0=u({name:"COLLECTION_CONNECTIONS_LIST",description:"List all connections in the organization with filtering, sorting, and pagination",annotations:{title:"List Connections",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:ie8,outputSchema:pe8,handler:async($,Z)=>{await Z.access.check();let X=t(Z),Q=$.binding?typeof $.binding==="string"?(()=>{let E=me8[$.binding.toUpperCase()];if(!E)throw Error(`Unknown binding: ${$.binding}`);return E})():$.binding:void 0,Y=Q?d90(Q):void 0,G=!!Y,J=$.limit??100,W=$.offset??0,K=e5(),F=C8.DEV_ASSETS(X.id),H=Zy(X.id,K),N=(!$.slug||JB(H)===$.slug)&&Op(H,$.where),U=tG()&&!G&&N,{sqlOffset:B,sqlLimit:O}=Ss1(W,J,U),{items:L,totalCount:w}=await Z.storage.connections.list(X.id,{includeVirtual:$.include_virtual??!1,slug:$.slug,where:$.where,orderBy:$.orderBy,limit:G?void 0:O,offset:G?void 0:B});if(Y){let E=Q9(),j=C8.SELF(X.id);await I90(L,le8,async(z)=>{if(z.tools!==null)return;let A=z.id===j?async()=>{let{listManagementTools:I}=await Promise.resolve().then(() => (eB(),ZZ0));return I(Z)}:()=>Bl0(z,Z,G60),P=await oB("tools",z.id,A,E,(I)=>Z.pendingRevalidations.push(I),tB);if(P!==null)z.tools=P})}if(tG()&&ks1(G,W)&&N&&!L.some((E)=>E.id===F))L.unshift(H);if(G){let E=(await Promise.all(L.map(async(P)=>{if(!P.tools||P.tools.length===0)return null;return Y.isImplementedBy(P.tools.map((q)=>({name:q.name,inputSchema:q.inputSchema,outputSchema:q.outputSchema})))?P:null}))).filter((P)=>P!==null),j=E.length,z=E.slice(W,W+J),A=W+J<j;return{items:z,totalCount:j,hasMore:A}}return Vs1(L,U,J,W,w)}})});var ne8,Rl0;var vs1=D(()=>{nG();_8();M0();$9();_Q();kH();Xy();lW();ne8=Hp(u7),Rl0=u({name:"COLLECTION_CONNECTIONS_GET",description:"Get a connection's configuration, tools list, and status by ID.",annotations:{title:"Get Connection",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},_meta:{ui:{visibility:["app"]}},inputSchema:Fp,outputSchema:ne8,handler:async($,Z)=>{let X=t(Z);if(await Z.access.check(),tG()&&$Z0($.id,X.id))return{item:Zy(X.id,e5())};let Q=await Z.storage.connections.findById($.id);if(!Q||Q.organization_id!==X.id)return{item:null};if(Q.tools===null){let Y=C8.SELF(X.id),G=Q.id===Y?async()=>{let{listManagementTools:W}=await Promise.resolve().then(() => (eB(),ZZ0));return W(Z)}:async()=>{let W=await U5(Q,Z,!0);try{return(await W.listTools()).tools}finally{await W.close().catch(()=>{})}},J=await oB("tools",Q.id,G,Q9(),(W)=>Z.pendingRevalidations.push(W),tB);if(J!==null)Q.tools=J}return{item:Q}}})});class m6{db;vault;constructor($,Z){this.db=$;this.vault=Z}async get($){let Z=await this.db.selectFrom("downstream_tokens").selectAll().where("connectionId","=",$).executeTakeFirst();if(!Z)return null;return this.decryptToken(Z)}async upsert($){let Z=new Date().toISOString(),X=await this.vault.encrypt($.accessToken),Q=$.refreshToken?await this.vault.encrypt($.refreshToken):null,Y=$.clientSecret?await this.vault.encrypt($.clientSecret):null,G=$.expiresAt?.toISOString()??null,J=await this.db.insertInto("downstream_tokens").values({id:i$("dtok"),connectionId:$.connectionId,accessToken:X,refreshToken:Q,scope:$.scope,expiresAt:G,clientId:$.clientId,clientSecret:Y,tokenEndpoint:$.tokenEndpoint,createdAt:Z,updatedAt:Z}).onConflict((W)=>W.column("connectionId").doUpdateSet({accessToken:X,refreshToken:Q,scope:$.scope,expiresAt:G,clientId:$.clientId,clientSecret:Y,tokenEndpoint:$.tokenEndpoint,updatedAt:Z})).returning(["id","createdAt"]).executeTakeFirstOrThrow();return{id:J.id,connectionId:$.connectionId,accessToken:$.accessToken,refreshToken:$.refreshToken,scope:$.scope,expiresAt:$.expiresAt,createdAt:J.createdAt,updatedAt:Z,clientId:$.clientId,clientSecret:$.clientSecret,tokenEndpoint:$.tokenEndpoint}}async delete($){await this.db.deleteFrom("downstream_tokens").where("connectionId","=",$).execute()}isExpired($,Z=0){if(!$.expiresAt)return!1;let Q=($.expiresAt instanceof Date?$.expiresAt:new Date($.expiresAt)).getTime();if(Number.isNaN(Q))return!0;return Q-Z<Date.now()}async decryptToken($){let Z=await this.vault.decrypt($.accessToken),X=$.refreshToken?await this.vault.decrypt($.refreshToken):null,Q=$.clientSecret?await this.vault.decrypt($.clientSecret):null;return{id:$.id,connectionId:$.connectionId,accessToken:Z,refreshToken:X,scope:$.scope,expiresAt:$.expiresAt,createdAt:$.createdAt,updatedAt:$.updatedAt,clientId:$.clientId,clientSecret:Q,tokenEndpoint:$.tokenEndpoint}}}var oG=D(()=>{SZ()});function Qy(...$){if(ae8)console.log("[mcp-read-cache]",...$)}function se8($){return $.kind==="org"?"org":`u:${$.userId}`}function Il0($){if($===null||typeof $!=="object")return JSON.stringify($)??"null";if(Array.isArray($))return`[${$.map(Il0).join(",")}]`;return`{${Object.keys($).sort().map((X)=>`${JSON.stringify(X)}:${Il0($[X])}`).join(",")}}`}class YZ0{config;maxEntries;now;maxTotalBytes;store=new Map;revalidating=new Set;totalBytes=0;constructor($=te8,Z=oe8,X=()=>Date.now(),Q=re8){this.config=$;this.maxEntries=Z;this.now=X;this.maxTotalBytes=Q}stats(){return{entries:this.store.size,bytes:this.totalBytes}}deleteKey($){let Z=this.store.get($);if(Z)this.store.delete($),this.totalBytes-=Z.bytes}key($,Z,X,Q){return`${Z}:${se8(X)}:${$}:${Il0(Q)}`}storeSet($,Z,X,Q){let Y;try{Y=JSON.stringify(Z).length}catch{Qy("SKIP non-serializable",$);return}if(Y>Q){Qy("SKIP oversize",$,`${Y}b > cap ${Q}b`);return}this.deleteKey($);while(this.store.size>0&&(this.store.size>=this.maxEntries||this.totalBytes+Y>this.maxTotalBytes)){let G=this.store.keys().next().value;if(G===void 0)break;this.deleteKey(G)}this.store.set($,{value:Z,storedAt:X,bytes:Y}),this.totalBytes+=Y}async fetch($){let{type:Z,connectionId:X,scope:Q,params:Y,fetchLive:G,shouldCache:J,onRevalidation:W}=$,K=this.config[Z],F=this.key(Z,X,Q,Y),H=this.now(),N=this.store.get(F),U=N?H-N.storedAt:1/0;if(!N||U>K.maxStaleMs){XZ0.add(1,{type:Z,outcome:"miss"}),Qy(N?"EXPIRED":"MISS",F);let B=await G();if(J?.(B)??!0)this.storeSet(F,B,this.now(),K.maxValueBytes);else Qy("NOT-CACHED (shouldCache=false)",F);return B}if(this.store.delete(F),this.store.set(F,N),U>K.revalidateAfterMs&&!this.revalidating.has(F)){XZ0.add(1,{type:Z,outcome:"stale"}),Qy("STALE \u2192 serve + revalidate",F,`age=${U}ms`),this.revalidating.add(F);let B=G().then((O)=>{if(J?.(O)??!0)this.storeSet(F,O,this.now(),K.maxValueBytes)}).catch(()=>{XZ0.add(1,{type:Z,outcome:"error"})}).finally(()=>this.revalidating.delete(F));W?.(B)}else XZ0.add(1,{type:Z,outcome:"hit"}),Qy("HIT",F,`age=${U}ms`);return N.value}invalidate($){let Z=`${$}:`;for(let X of[...this.store.keys()])if(X.startsWith(Z))this.deleteKey(X)}}function Ml0(){return b0().mcpCacheEnabled}function GZ0(){return Ml0()?ql0:null}var XZ0,QZ0=1024,fs1,te8,oe8=2000,re8,ae8,ql0;var Dp=D(()=>{I6();R$();XZ0=w$.createCounter("mcp_read_cache.fetches",{description:"MCP read cache outcomes (hit, stale, miss, error)",unit:"{fetches}"}),fs1=QZ0*QZ0,te8={"tools/call":{revalidateAfterMs:30000,maxStaleMs:300000,maxValueBytes:512*QZ0},"resources/read":{revalidateAfterMs:60000,maxStaleMs:300000,maxValueBytes:4*fs1},"prompts/get":{revalidateAfterMs:60000,maxStaleMs:300000,maxValueBytes:512*QZ0}},re8=256*fs1,ae8=typeof process<"u"&&!!process.env?.MCP_CACHE_DEBUG;ql0=new YZ0;w$.createObservableGauge("mcp_read_cache.entries",{description:"Current entry count in the per-pod MCP read cache",unit:"{entries}"}).addCallback(($)=>$.observe(ql0.stats().entries));w$.createObservableGauge("mcp_read_cache.bytes",{description:"Approximate total bytes held in the per-pod MCP read cache",unit:"By"}).addCallback(($)=>$.observe(ql0.stats().bytes))});function ys1($){GZ0()?.invalidate($),xa1($)}function Yy($){ys1($);let Z=kl0?.();if(!Z)return;try{Z.publish(bs1,ee8.encode(JSON.stringify({connectionId:$,originId:xs1})))}catch(X){console.warn("[McpCacheInvalidation] publish failed (non-critical):",X)}}function gs1($){if(kl0=$,Lp)return;let Z=$();if(!Z)return;Lp=Z.subscribe(bs1),(async()=>{for await(let X of Lp)try{let Q=JSON.parse($04.decode(X.data));if(Q.originId===xs1)continue;ys1(Q.connectionId)}catch{}})().catch(console.error)}function hs1(){Lp?.unsubscribe(),Lp=null,kl0=void 0}var bs1="studio.mcp-cache.invalidate",xs1,ee8,$04,kl0,Lp=null;var wp=D(()=>{Dp();_Q();xs1=crypto.randomUUID(),ee8=new TextEncoder,$04=new TextDecoder});import{z as Vl0}from"zod";function X04($){let Z={...$};for(let X of Z04)delete Z[X];return Z}function Q04($,Z){return $.connection_url!==void 0?$.connection_url:Z}function J04($,Z){return $.length===Z.length&&$.every((X,Q)=>X===Z[Q])}var Z04,Y04,G04,Sl0;var us1=D(()=>{kH();oG();M0();R$();_Q();wp();Ol0();pi();lW();Z04=["id","organization_id","created_by","created_at"];Y04=Vl0.object({id:Vl0.string().describe("ID of the connection to update"),data:M80.describe("Partial connection data to update")}),G04=Vl0.object({item:u7.describe("The updated connection entity")});Sl0=u({name:"COLLECTION_CONNECTIONS_UPDATE",description:"Update a connection's configuration. Re-fetches tools from the server on URL change.",annotations:{title:"Update Connection",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:Y04,outputSchema:G04,handler:async($,Z)=>{o(Z);let X=t(Z);await Z.access.check();let Q=o0(Z);if(!Q)throw Error("User ID required to update connection");let{id:Y}=$,G=X04($.data),J=G.configuration_state!==void 0||G.configuration_scopes!==void 0,W=await Z.storage.connections.findById(Y);if(!W||W.organization_id!==X.id)throw Error("Connection not found in organization");let K=G.connection_type??W.connection_type,F=Q04(G,W.connection_url);if(K==="VIRTUAL"){let f=of(F);if(!f)throw Error("VIRTUAL connection requires connection_url in format: virtual://$virtual_mcp_id");let b=await Z.storage.virtualMcps.findById(f);if(!b)throw Error(`Virtual MCP not found: ${f}`);if(b.organization_id!==X.id)throw Error("Virtual MCP does not belong to the current organization");F=rf(f)}let H=G.configuration_state??W.configuration_state??{},N=G.configuration_scopes??W.configuration_scopes??[];if(J){if(G.configuration_state!==void 0)H=G.configuration_state??{};else if(H===null||H===void 0)H={};if(G.configuration_scopes!==void 0)N=G.configuration_scopes??[];if(N.length>0){let f=H;Qp(f,N,X.id),await Gp(f,N,X.id,Z)}}if(K==="STDIO"&&!b0().localMode)throw Error("STDIO connections are only available in local mode (--local-mode).");let U=G.connection_token??W.connection_token;if(!U)try{let b=await new m6(Z.db,Z.vault).get(Y);if(b?.accessToken)U=b.accessToken}catch{}let B=await mB({id:W.id,title:G.title??W.title,connection_type:K,connection_url:F,connection_token:U,connection_headers:G.connection_headers??W.connection_headers}).catch(()=>null),O=B?.tools?.length?B.tools:null,L=!1;if(G.configuration_scopes===void 0&&B?.scopes?.length)L=!J04(N,B.scopes),N=B.scopes;if(Qp(H,N,X.id),L&&N.length>0)await Gp(H,N,X.id,Z);let w=J||L,E=w?Yp(H,N):[],j=w?Yp(W.configuration_state??{},W.configuration_scopes??[]):[],z=W.configuration_state,A=z==null||Object.keys(z).length===0,P,I,q=async()=>{try{await Z.storage.connectionCredentialVault.replaceGrantsForSubject({organizationId:X.id,subjectConnectionId:Y,createdBy:Q,grants:j})}catch(f){console.error("Failed to restore credential grants after credential vault mutation failed",f)}},k={...G,connection_url:F,tools:null,configuration_state:H,configuration_scopes:N,updated_by:Q},S={...W,...k};if(w)try{if(await Z.storage.connectionCredentialVault.replaceGrantsForSubject({organizationId:X.id,subjectConnectionId:Y,createdBy:Q,grants:E}),E.length>0){if(!await Z.storage.connectionCredentialVault.findActiveWorkloadToken({organizationId:X.id,subjectConnectionId:Y})){let{plaintextToken:b,record:i}=await Z.storage.connectionCredentialVault.createOrRotateWorkloadToken({organizationId:X.id,subjectConnectionId:Y});I=i.id,P={baseUrl:Z.baseUrl,org:X.slug??X.id,subjectConnectionId:Y,token:b}}}}catch(f){if(I)await Z.storage.connectionCredentialVault.revokeWorkloadToken({organizationId:X.id,subjectConnectionId:Y,tokenId:I});throw await q(),f}if(w&&H&&N)try{await(await U5(S,Z,!1)).callTool({name:"ON_MCP_CONFIGURATION",arguments:{state:H,scopes:N,firstRun:A,...P?{vault:P}:{}}})}catch(f){if(console.error("Failed to invoke ON_MCP_CONFIGURATION callback",f),I)await Z.storage.connectionCredentialVault.revokeWorkloadToken({organizationId:X.id,subjectConnectionId:Y,tokenId:I});if(E.length>0)throw await q(),f}let m;try{m=await Z.storage.connections.update(Y,k)}catch(f){if(w){if(I)await Z.storage.connectionCredentialVault.revokeWorkloadToken({organizationId:X.id,subjectConnectionId:Y,tokenId:I});await q()}throw f}if(O)Q9()?.set("tools",Y,O).catch(()=>{});return Yy(Y),{item:m}}})});import{z as W04}from"zod";var K04,Cl0;var cs1=D(()=>{nG();C4();M0();_Q();wp();lW();K04=Np.extend({force:W04.boolean().optional().describe("If true, removes this connection from all agents that reference it before deleting")}),Cl0=u({name:"COLLECTION_CONNECTIONS_DELETE",description:"Permanently delete a connection. Set force=true to auto-remove from referencing Virtual MCPs.",annotations:{title:"Delete Connection",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:K04,outputSchema:Up(u7),handler:async($,Z)=>{o(Z);let X=t(Z);await Z.access.check();let Q=await Z.storage.connections.findById($.id);if(!Q)throw Error(`Connection not found: ${$.id}`);if(Q.organization_id!==X.id)throw Error("Connection not found in organization");if(Q.metadata?.isFixed===!0)throw Error("This connection is a fixed system connection and cannot be deleted");let G=await Z.storage.virtualMcps.listByConnectionId(X.id,$.id);if(G.length>0)if($.force)await Z.storage.virtualMcps.removeConnectionReferences($.id);else throw Error(JSON.stringify({code:"CONNECTION_IN_USE",agentNames:G.map((K)=>K.title)}));await Z.storage.connections.delete($.id);let J=await Z.storage.organizationSettings.get(X.id);if(J?.registry_config){let{registries:K,blockedMcps:F}=J.registry_config;if($.id in K){let{[$.id]:H,...N}=K;await Z.storage.organizationSettings.upsert(X.id,{registry_config:{registries:N,blockedMcps:F}})}}Q9()?.invalidate($.id).catch(()=>{}),Yy($.id);let W=o0(Z);if(W)x1.capture({distinctId:W,event:"connection_deleted",groups:{organization:X.id},properties:{connection_id:Q.id,connection_type:Q.connection_type,app_name:Q.app_name??null,organization_id:X.id,forced:$.force??!1}});return{item:Q}}})});import{z as Gy}from"zod";var _l0;var ls1=D(()=>{M0();_l0=u({name:"CONNECTION_TEST",description:"Test connection health and latency",annotations:{title:"Test Connection",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},inputSchema:Gy.object({id:Gy.string()}),outputSchema:Gy.object({id:Gy.string(),healthy:Gy.boolean(),latencyMs:Gy.number()}),handler:async($,Z)=>{let X=t(Z);await Z.access.check();let Q=await Z.storage.connections.findById($.id);if(!Q||Q.organization_id!==X.id)throw Error("Connection not found");let Y=await Z.storage.connections.testConnection($.id);return{id:$.id,...Y}}})});var ds1=D(()=>{da1();_s1();vs1();us1();cs1();ls1()});import{sql as _4}from"kysely";import{z as OK}from"zod";function ms1($){if($===null||$===void 0)return"NULL";if(typeof $==="number")return String($);if(typeof $==="boolean")return $?"TRUE":"FALSE";if(typeof $==="string")return`'${$.replace(/'/g,"''")}'`;if($ instanceof Date)return`'${$.toISOString()}'`;return`'${JSON.stringify($).replace(/'/g,"''")}'`}function N04($,Z){let X=$;for(let Y=Z.length;Y>=1;Y--){let G=`$${Y}`;if(X.includes(G))X=X.replaceAll(G,ms1(Z[Y-1]))}let Q=[];for(let Y=0;Y<X.length;Y++)if(X[Y]==="?")Q.push(Y);for(let Y=Math.min(Q.length,Z.length)-1;Y>=0;Y--){let G=Q[Y],J=ms1(Z[Y]);X=X.slice(0,G)+J+X.slice(G+1)}return X}function is1($){return $.replace(/-/g,"_")}function B04($){return`app_${is1($)}`}function O04($){return`app_role_${is1($)}`}function D04($){if($ instanceof Error){let Z=$.message.toLowerCase(),X=$.code;return X==="3F000"||X==="42704"||X==="22023"||Z.includes("schema")&&Z.includes("does not exist")||Z.includes("role")&&Z.includes("does not exist")}return!1}async function L04($,Z,X){if(await _4`CREATE SCHEMA IF NOT EXISTS ${_4.id(Z)}`.execute($),!(await _4`
|
|
890
890
|
SELECT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = ${X}) as exists
|
|
891
|
-
`.execute($)).rows[0]?.exists)await _4`CREATE ROLE ${_4.id(X)} NOLOGIN`.execute($);await _4`GRANT ${_4.id(X)} TO CURRENT_USER`.execute($),await _4`GRANT USAGE, CREATE ON SCHEMA ${_4.id(Z)} TO ${_4.id(X)}`.execute($),await _4`GRANT ALL ON ALL TABLES IN SCHEMA ${_4.id(Z)} TO ${_4.id(X)}`.execute($),await _4`GRANT ALL ON ALL SEQUENCES IN SCHEMA ${_4.id(Z)} TO ${_4.id(X)}`.execute($),await _4`ALTER DEFAULT PRIVILEGES IN SCHEMA ${_4.id(Z)} GRANT ALL ON TABLES TO ${_4.id(X)}`.execute($),await _4`ALTER DEFAULT PRIVILEGES IN SCHEMA ${_4.id(Z)} GRANT ALL ON SEQUENCES TO ${_4.id(X)}`.execute($),await _4`REVOKE ALL ON SCHEMA public FROM ${_4.id(X)}`.execute($)}async function w04($,Z,X,Q){try{return await $.transaction().execute(async(Y)=>{return await _4`SET LOCAL ROLE ${_4.id(X)}`.execute(Y),await _4`SET LOCAL search_path TO ${_4.id(Z)}`.execute(Y),await _4.raw(Q).execute(Y)})}catch(Y){if(D04(Y))return await L04($,Z,X),await $.transaction().execute(async(G)=>{return await _4`SET LOCAL ROLE ${_4.id(X)}`.execute(G),await _4`SET LOCAL search_path TO ${_4.id(Z)}`.execute(G),await _4.raw(Q).execute(G)});throw Y}}var H04,U04,ps1;var ns1=D(()=>{M0();H04=OK.object({results:OK.array(OK.unknown()).optional(),success:OK.boolean().optional()});U04=OK.object({sql:OK.string().describe("The SQL query to run"),params:OK.array(OK.any()).describe("The parameters to pass to the SQL query").optional()});ps1=u({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:U04,outputSchema:OK.object({result:OK.array(H04)}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=N04($.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 Q=B04(Z.connectionId),Y=O04(Z.connectionId);return{result:[{results:(await w04(Z.db,Q,Y,X)).rows,success:!0}]}}})});function JZ0($){let Z=$.access.getRole();if(!n7(Z))throw new RH("Only organization owners and admins can change org-wide pin status")}var vl0=D(()=>{SQ();ow()});async function WZ0($,Z,X){let Q=[...new Set(X)],Y=await Promise.all(Q.map((J)=>$.storage.connections.findById(J,Z))),G=Q.filter((J,W)=>!Y[W]);if(G.length>0)throw Error(`Connection not found: ${G.join(", ")}`)}function CH($){return $.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")}function KZ0($){let Z=2166136261;for(let X=0;X<$.length;X++)Z=Math.imul(Z^$.charCodeAt(X),16777619);return`a${(Z>>>0).toString(36).padStart(6,"0").slice(-6)}`}function Ep($){if($&&typeof $==="object"&&"gatewayClientId"in $&&typeof $.gatewayClientId==="string")return $.gatewayClientId;return}function jp($,Z){if(!Z)return $;let X=`${KZ0(Z)}_`;return $.startsWith(X)?$.slice(X.length):$}function j04($){return $.split(/[-_]/).map((Z)=>Z?Z.charAt(0).toUpperCase()+Z.slice(1):Z).join(" ")}var Jy;var ts1=D(()=>{nW();Jy=class Jy extends x9{static MAX_PAGES_PER_CLIENT=1000;clients;slugToKey=new Map;resolvedClients=new Map;toolsCache=null;resourcesCache=null;resourceTemplatesCache=null;promptsCache=null;resourceRouteMap=new Map;constructor($,Z){super(Z?.clientInfo??{name:"gateway-client",version:"1.0.0"},{capabilities:Z?.capabilities});this.clients=$;for(let X of Object.keys($)){let Q=KZ0(X);if(this.slugToKey.has(Q))throw Error(`GatewayClient: duplicate namespace code "${Q}" from keys "${this.slugToKey.get(Q)}" and "${X}"`);this.slugToKey.set(Q,X)}}namespace($,Z){return`${KZ0($)}_${Z}`}async resolveToolTarget($){let Z=$.indexOf("_");if(Z!==-1){let Q=$.slice(0,Z),Y=this.slugToKey.get(Q);if(Y)return[Y,$.slice(Z+1)]}let{tools:X}=await this.listTools();for(let Q of X){let Y=Ep(Q._meta);if(!Y)continue;if(jp(Q.name,Y)===$)return[Y,$]}if(Z===-1)throw Error(`GatewayClient: could not resolve tool "${$}" \u2014 no namespace prefix and not found in any client`);throw Error(`GatewayClient: unknown namespace "${$.slice(0,Z)}" in "${$}" and not found by original name in any client`)}async resolvePromptTarget($){let Z=$.indexOf("_");if(Z!==-1){let Q=$.slice(0,Z),Y=this.slugToKey.get(Q);if(Y)return[Y,$.slice(Z+1)]}let{prompts:X}=await this.listPrompts();for(let Q of X){let Y=Ep(Q._meta);if(!Y)continue;if(jp(Q.name,Y)===$)return[Y,$]}if(Z===-1)throw Error(`GatewayClient: could not resolve prompt "${$}" \u2014 no namespace prefix and not found in any client`);throw Error(`GatewayClient: unknown namespace "${$.slice(0,Z)}" in "${$}" and not found by original name in any client`)}resolveClient($){let Z=this.resolvedClients.get($);if(Z)return Z;let X=this.clients[$];if(!X)return Promise.reject(Error(`GatewayClient: unknown client key "${$}"`));let Q=X.client,Y;try{Y=typeof Q==="function"?Promise.resolve(Q()):Promise.resolve(Q)}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,X){try{let Q=await this.resolveClient($);return await Z(Q)}catch(Q){return console.warn(`GatewayClient: skipping ${X} from client "${$}" \u2014 ${Q?.message??Q}`),[]}}async paginate($,Z,X){let Q=[],Y,G=0;do{let J=await X(Y);Q.push(...J.items),Y=J.nextCursor,G++}while(Y&&G<Jy.MAX_PAGES_PER_CLIENT);if(Y)console.warn(`GatewayClient: client "${$}" exceeded ${Jy.MAX_PAGES_PER_CLIENT} pages listing ${Z} \u2014 truncating`);return Q}fetchAllTools($,Z){return this.paginate(Z,"tools",async(X)=>{let Q=await $.listTools(X?{cursor:X}:void 0);return{items:Q.tools,nextCursor:Q.nextCursor}})}fetchAllResources($,Z){return this.paginate(Z,"resources",async(X)=>{let Q=await $.listResources(X?{cursor:X}:void 0);return{items:Q.resources,nextCursor:Q.nextCursor}})}fetchAllResourceTemplates($,Z){return this.paginate(Z,"resource templates",async(X)=>{let Q=await $.listResourceTemplates(X?{cursor:X}:void 0);return{items:Q.resourceTemplates,nextCursor:Q.nextCursor}})}fetchAllPrompts($,Z){return this.paginate(Z,"prompts",async(X)=>{let Q=await $.listPrompts(X?{cursor:X}:void 0);return{items:Q.prompts,nextCursor:Q.nextCursor}})}listTools($,Z){if(!this.toolsCache)this.toolsCache=this.aggregateTools();return this.toolsCache}async aggregateTools(){let $=[];for(let[Z,X]of Object.entries(this.clients)){let Q=await this.listFromClient(Z,(J)=>this.fetchAllTools(J,Z),"tools"),Y=X.tools,G=Y?new Set(Y):null;for(let J of Q){if(G&&!G.has(J.name))continue;$.push({...J,name:this.namespace(Z,J.name),_meta:{...J._meta??{},gatewayClientId:Z}})}}return{tools:$}}listResources($,Z){if(!this.resourcesCache)this.resourcesCache=this.aggregateResources();return this.resourcesCache}async aggregateResources(){let $=new Set,Z=[],X=new Map;for(let[Q,Y]of Object.entries(this.clients)){let G=await this.listFromClient(Q,(K)=>this.fetchAllResources(K,Q),"resources"),J=Y.resources,W=J?new Set(J):null;for(let K of G){if(W&&!W.has(K.uri)&&!(K.name&&W.has(K.name)))continue;if($.has(K.uri)){console.warn(`GatewayClient: duplicate resource "${K.uri}" from client "${Q}" \u2014 skipping`);continue}$.add(K.uri),X.set(K.uri,Q),Z.push({...K,_meta:{...K._meta??{},gatewayClientId:Q}})}}return this.resourceRouteMap=X,{resources:Z}}listResourceTemplates($,Z){if(!this.resourceTemplatesCache)this.resourceTemplatesCache=this.aggregateResourceTemplates();return this.resourceTemplatesCache}async aggregateResourceTemplates(){let $=new Set,Z=[];for(let[X,Q]of Object.entries(this.clients)){let Y=await this.listFromClient(X,(G)=>this.fetchAllResourceTemplates(G,X),"resource templates");for(let G of Y){if($.has(G.uriTemplate)){console.warn(`GatewayClient: duplicate resource template "${G.uriTemplate}" from client "${X}" \u2014 skipping`);continue}$.add(G.uriTemplate),Z.push({...G,_meta:{...G._meta??{},gatewayClientId:X}})}}return{resourceTemplates:Z}}listPrompts($,Z){if(!this.promptsCache)this.promptsCache=this.aggregatePrompts();return this.promptsCache}async aggregatePrompts(){let $=[];for(let[Z,X]of Object.entries(this.clients)){let Q=await this.listFromClient(Z,(J)=>this.fetchAllPrompts(J,Z),"prompts"),Y=X.prompts,G=Y?new Set(Y):null;for(let J of Q){if(G&&!G.has(J.name))continue;$.push({...J,name:this.namespace(Z,J.name),title:J.title??j04(J.name),_meta:{...J._meta??{},gatewayClientId:Z}})}}return{prompts:$}}async callTool($,Z,X){let[Q,Y]=await this.resolveToolTarget($.name);return(await this.resolveClient(Q)).callTool({...$,name:Y},Z,X)}async readResource($,Z){let X=await this.resolveResourceRoute($.uri);return(await this.resolveClient(X)).readResource($)}async getPrompt($,Z){let[X,Q]=await this.resolvePromptTarget($.name);return(await this.resolveClient(X)).getPrompt({...$,name:Q})}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((X)=>X.close()).catch(()=>{}));await Promise.allSettled($),await super.close()}}});var FZ0=D(()=>{ts1()});function bl0($){return CH($)}function P04($,Z){let X=CH(Z)||"prompt";return`${String($).padStart(z04,"0")}-${X}`}async function xl0($,Z,X){try{await $.delete(HZ0,bl0(Z),{actor:X})}catch(Q){console.error("[agent-prompts] failed to delete prompts",{agentId:Z,err:Q})}}async function NZ0($,Z,X,Q){let Y=bl0(Z);await xl0($,Z,X),await Promise.all(Q.slice(0,fl0).map(async(G,J)=>{let W=P04(J,G.title),K={name:W,title:G.title,description:G.description,text:G.text};try{await $.write(HZ0,`${Y}/${W}.json`,JSON.stringify(K),{actor:X,contentType:"application/json"})}catch(F){console.error("[agent-prompts] failed to seed prompt",{agentId:Z,name:W,err:F})}}))}async function os1($,Z){let X=bl0(Z),Q;try{Q=await $.listDir(HZ0,X)}catch{return[]}let Y=Q.filter((J)=>J.kind==="file"&&J.path.endsWith(".json")).slice(0,fl0),G=[];for(let J of Y)try{let W=await $.read(HZ0,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 HZ0="agent-prompts",fl0=20,z04;var zp=D(()=>{FZ0();z04=String(fl0-1).length});function Wy($){if(!$)return $;let Z={...$};return delete Z.sandboxMap,Z}import{z as ss1}from"zod";function A04(){let $=rs1[Math.floor(Math.random()*rs1.length)];return`icon://${as1[Math.floor(Math.random()*as1.length)]}?color=${$}`}var rs1,as1,T04,R04,yl0;var es1=D(()=>{M0();pB();vl0();zp();rs1=["red","orange","amber","yellow","lime","green","emerald","cyan","sky","blue","indigo","violet","purple","fuchsia","pink","rose"],as1=["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"];T04=ss1.object({data:V80.describe("Data for the new virtual MCP")}),R04=ss1.object({item:c7.describe("The created virtual MCP entity")}),yl0=u({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:T04,outputSchema:R04,handler:async($,Z)=>{o(Z);let X=t(Z);await Z.access.check();let Q=o0(Z);if(!Q)throw Error("User ID required to create virtual MCP");if($.data.pinned===!0)JZ0(Z);let{prompts:Y,metadata:G,...J}=$.data,W=Wy(G);if(J.connections.length>0)await WZ0(Z,X.id,J.connections.map((H)=>H.connection_id));let K={...J,metadata:W,icon:J.icon??A04()},F=await Z.storage.virtualMcps.create(X.id,Q,K);if(Y?.length&&Z.orgFs&&F.id)await NZ0(Z.orgFs,F.id,Q,Y);return{item:F}}})});function I04($){let Z=[],X=0;while(X<$.length){let Q=$[X];if(Q==="%")Z.push(".*");else if(Q==="_")Z.push(".");else if(/[.*+?^${}()|[\]\\]/.test(Q))Z.push("\\"+Q);else Z.push(Q);X++}return Z.join("")}function $O($){return typeof $==="string"||typeof $==="number"}function gl0($,Z){let X=Z.split("."),Q=$;for(let Y of X){if(Q==null||typeof Q!=="object")return;Q=Q[Y]}return Q}function q04($,Z){return $.connections.some((X)=>X.connection_id===Z)}function UZ0($,Z){if("conditions"in Z){let{operator:W,conditions:K}=Z;switch(W){case"and":return K.every((F)=>UZ0($,F));case"or":return K.some((F)=>UZ0($,F));case"not":return!K.every((F)=>UZ0($,F));default:return!0}}let{field:X,operator:Q,value:Y}=Z,G=X.join(".");if(G==="connection_id"){if(Q!=="eq"||typeof Y!=="string")return!1;return q04($,Y)}let J=gl0($,G);switch(Q){case"eq":return J===Y;case"gt":return $O(J)&&$O(Y)&&J>Y;case"gte":return $O(J)&&$O(Y)&&J>=Y;case"lt":return $O(J)&&$O(Y)&&J<Y;case"lte":return $O(J)&&$O(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=I04(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 M04($,Z){return[...$].sort((X,Q)=>{for(let Y of Z){let G=Y.field.join("."),J=gl0(X,G),W=gl0(Q,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 k04,V04,hl0;var $e1=D(()=>{nG();M0();pB();k04=V3,V04=VH(c7),hl0=u({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:k04,outputSchema:V04,handler:async($,Z)=>{await Z.access.check();let X=t(Z),Q=$.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=Q?await Z.storage.virtualMcps.listByConnectionId(X.id,Q):await Z.storage.virtualMcps.list(X.id,Y!==void 0?{pinnedOnly:Y}:void 0);if($.where)J=J.filter((U)=>UZ0(U,$.where));if($.orderBy&&$.orderBy.length>0)J=M04(J,$.orderBy);let W=J.length,K=$.offset??0,F=$.limit??100,H=J.slice(K,K+F),N=K+F<W;return{items:H,totalCount:W,hasMore:N}}})});import{z as ul0}from"zod";var S04,C04,cl0;var Ze1=D(()=>{M0();pB();S04=ul0.object({id:ul0.string().describe("ID of the virtual MCP to retrieve")}),C04=ul0.object({item:c7.nullable().describe("The retrieved virtual MCP, or null if not found")}),cl0=u({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:S04,outputSchema:C04,handler:async($,Z)=>{o(Z);let X=t(Z);await Z.access.check();let Q=await Z.storage.virtualMcps.findById($.id);if(Q&&Q.organization_id!==X.id)return{item:null};if(!Q)return{item:null};return{item:Q}}})});function rG($){return ll0.test($)}function Xe1($){let Z=(X)=>typeof X==="string"?X.trim().toLowerCase():"";return Z($?.metadata?.siteSlug)||Z($?.title)||null}var ll0;var ZO=D(()=>{ll0=/^[a-z0-9][a-z0-9-]{0,59}$/});function Qe1($){let{nextTitle:Z,currentTitle:X,currentSiteSlug:Q}=$;if(Q?.trim())return null;if(Z===void 0||Z===X)return null;let Y=X?.trim().toLowerCase()??"";return rG(Y)?Y:null}var Ye1=D(()=>{ZO()});import{z as dl0}from"zod";var _04,v04,ml0;var Ge1=D(()=>{M0();zp();pB();vl0();Ye1();_04=dl0.object({id:dl0.string().describe("ID of the virtual MCP to update"),data:S80.describe("Partial virtual MCP data to update")}),v04=dl0.object({item:c7.describe("The updated virtual MCP entity")}),ml0=u({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:_04,outputSchema:v04,handler:async($,Z)=>{o(Z);let X=t(Z);await Z.access.check();let Q=o0(Z);if(!Q)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!==X.id)throw Error(`Virtual MCP not found: ${$.id}`);let{prompts:G,metadata:J,...W}=$.data,K=Wy(J);if(K&&Y.metadata)K={...Y.metadata,...K};else if(K===null&&Y.metadata?.sandboxMap)K={sandboxMap:Y.metadata.sandboxMap};let F={...W,...J!==void 0?{metadata:K}:{}},H=Qe1({nextTitle:F.title,currentTitle:Y.title,currentSiteSlug:Y.metadata?.siteSlug});if(H)F.metadata={...Y.metadata,...F.metadata,siteSlug:H};if(F.pinned!==void 0&&F.pinned!==Y.pinned)JZ0(Z);if(F.connections?.length)await WZ0(Z,X.id,F.connections.map((U)=>U.connection_id));let N=await Z.storage.virtualMcps.update($.id,Q,F);if(G!==void 0&&Z.orgFs)await NZ0(Z.orgFs,$.id,Q,G);return{item:N}}})});function f04($){if(!$)return!1;let Z=pl0.join("|");return new RegExp(`permission\\s+"?(?:${Z})"?\\s+is not allowed`,"i").test($)||/permissions exceed what the github app/i.test($)}function We1($){let Z={...$};for(let X of pl0)Z[X]="read";return Z}async function Ke1($,Z){let X={...Z};for(;;){let Q=await $(X);if(!Q.isError)return{result:Q,grantedPermissions:X};let Y=Q.content?.find((K)=>K.type==="text")?.text,G=pl0.find((K)=>(K in X));if(!G||!f04(Y))return{result:Q,grantedPermissions:X};let{[G]:J,...W}=X;X=W}}function b04($){if(!$||typeof $!=="object"||Array.isArray($))return Je1;let Z=$;if(Object.values(Z).some((X)=>typeof X!=="string"))return Je1;return Z}function x04($){if(typeof $!=="number"||!Number.isFinite($)||!Number.isInteger($)||$<=0)return;return $}function M5($){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 X=x04(Z.repositoryId);return{sourceConnectionId:typeof Z.sourceConnectionId==="string"?Z.sourceConnectionId:void 0,installationId:Z.installationId,repositoryId:X,owner:Z.owner,repo:Z.repo,permissions:b04(Z.permissions),grantProvider:Z.grantProvider==="github-mcp"?"github-mcp":void 0}}function EE($){return $.metadata?.orgShared===!0}function Fe1($){let Z=new Set,X=[];for(let Q of $??[]){if(Q.status!=="active")continue;let Y=M5(Q);if(Y===null)continue;let G=il0(Y.owner,Y.repo);if(Z.has(G))continue;Z.add(G),X.push(`${Y.owner}/${Y.repo}`)}return X}function BZ0($,Z,X){let Q=il0(Z,X),Y=($??[]).filter((G)=>{if(G.status&&G.status!=="active")return!1;let J=M5(G);return J!==null&&il0(J.owner,J.repo)===Q});return Y.find(EE)??Y[0]??null}var Je1,pl0,il0=($,Z)=>`${$}/${Z}`.toLowerCase();var vQ=D(()=>{Je1={contents:"write",metadata:"read",pull_requests:"write",issues:"write",checks:"read",deployments:"read"},pl0=["deployments","checks"]});function He1($){return yG($)!==null||$60($)!==null}var Ne1=D(()=>{_8()});import{z as nl0}from"zod";var y04,g04,tl0;var Ue1=D(()=>{vQ();oG();M0();zp();pB();Ne1();y04=nl0.object({id:nl0.string().describe("ID of the virtual MCP to delete")}),g04=nl0.object({item:c7.describe("The deleted virtual MCP entity")}),tl0=u({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:y04,outputSchema:g04,handler:async($,Z)=>{o(Z);let X=t(Z);if(await Z.access.check(),He1($.id))throw Error(`Virtual MCP not found: ${$.id}`);let Q=await Z.storage.virtualMcps.findById($.id);if(!Q)throw Error(`Virtual MCP not found: ${$.id}`);if(Q.organization_id!==X.id)throw Error(`Virtual MCP not found: ${$.id}`);await Z.storage.virtualMcps.delete($.id);try{if((await Z.storage.organizationSettings.get(X.id))?.main_agent_id===$.id)await Z.storage.organizationSettings.upsert(X.id,{main_agent_id:null})}catch(G){console.error("[VIRTUAL_MCP_DELETE] failed to clear main agent pointer",{id:$.id,error:G.message})}if(Z.orgFs)await xl0(Z.orgFs,$.id,o0(Z)??"system");let Y=Q.metadata?.githubRepo?.connectionId;if(Y)try{let G=await Z.storage.connections.findById(Y,X.id),J=G&&(EE(G)||(await Z.storage.virtualMcps.listByConnectionId(X.id,Y)).length>0||await Z.storage.connections.isReferencedByThread(Y));if(G&&M5(G)&&!J){let K=await new m6(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:Q}}})});import{z as fQ}from"zod";var h04,ol0;var Be1=D(()=>{M0();h04=fQ.object({id:fQ.string(),virtualMcpId:fQ.string(),pluginId:fQ.string(),connectionId:fQ.string().nullable(),settings:fQ.record(fQ.string(),fQ.unknown()).nullable(),createdAt:fQ.string(),updatedAt:fQ.string()}),ol0=u({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:fQ.object({virtualMcpId:fQ.string().describe("Virtual MCP ID"),pluginId:fQ.string().describe("Plugin ID")}),outputSchema:fQ.object({config:h04.nullable()}),handler:async($,Z)=>{o(Z);let X=t(Z);await Z.access.check();let{virtualMcpId:Q,pluginId:Y}=$,G=await Z.storage.connections.findById(Q);if(!G||G.organization_id!==X.id)return{config:null};if(G.connection_type!=="VIRTUAL")return{config:null};let J=await Z.storage.virtualMcpPluginConfigs.get(Q,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 xZ}from"zod";var u04,rl0;var Oe1=D(()=>{M0();Xy();$9();u04=xZ.object({id:xZ.string(),virtualMcpId:xZ.string(),pluginId:xZ.string(),connectionId:xZ.string().nullable(),settings:xZ.record(xZ.string(),xZ.unknown()).nullable(),createdAt:xZ.string(),updatedAt:xZ.string()}),rl0=u({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:xZ.object({virtualMcpId:xZ.string().describe("Virtual MCP ID"),pluginId:xZ.string().describe("Plugin ID"),connectionId:xZ.string().nullable().optional().describe("MCP connection to bind"),settings:xZ.record(xZ.string(),xZ.unknown()).nullable().optional().describe("Plugin-specific settings")}),outputSchema:xZ.object({config:u04}),handler:async($,Z)=>{o(Z);let X=t(Z);await Z.access.check();let{virtualMcpId:Q,pluginId:Y,connectionId:G,settings:J}=$,W=o0(Z),K=await Z.storage.connections.findById(Q);if(!K)throw Error(`Connection not found: ${Q}`);if(K.organization_id!==X.id)throw Error(`Connection not found: ${Q}`);if(K.connection_type!=="VIRTUAL")throw Error(`Connection not found: ${Q}`);let F=G?await Z.storage.connections.findById(G):null;if(G&&F&&F.organization_id!==X.id)throw Error(`Connection not found: ${G}`);if(G&&K.organization_id&&!F&&tG()&&$Z0(G,K.organization_id)){if(!W)throw Error("User ID required to create dev-assets connection");let N=Zy(K.organization_id,e5());await Z.storage.connections.create({...N,organization_id:K.organization_id,created_by:W})}else if(G&&!F)throw Error(`Connection not found: ${G}`);let H=await Z.storage.virtualMcpPluginConfigs.upsert(Q,Y,{connectionId:G,settings:J});return{config:{id:H.id,virtualMcpId:H.virtualMcpId,pluginId:H.pluginId,connectionId:H.connectionId,settings:H.settings,createdAt:H.createdAt instanceof Date?H.createdAt.toISOString():H.createdAt,updatedAt:H.updatedAt instanceof Date?H.updatedAt.toISOString():H.updatedAt}}}})});import{z as iX}from"zod";var c04,al0;var De1=D(()=>{M0();pB();c04=iX.object({connectionId:iX.string(),toolName:iX.string(),label:iX.string(),icon:iX.string().nullable().optional()}),al0=u({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:iX.object({virtualMcpId:iX.string().describe("Virtual MCP ID"),pinnedViews:iX.array(c04).describe("Pinned views to set for the virtual MCP sidebar"),layout:iX.object({defaultMainView:iX.object({type:iX.string(),id:iX.string().optional(),toolName:iX.string().optional()}).nullable().optional(),chatDefaultOpen:iX.boolean().nullable().optional()}).optional()}),outputSchema:iX.object({item:c7.nullable()}),handler:async($,Z)=>{o(Z);let X=t(Z);await Z.access.check();let{virtualMcpId:Q,pinnedViews:Y,layout:G}=$,J=o0(Z),W=await Z.storage.virtualMcps.findById(Q);if(!W)throw Error(`Virtual MCP not found: ${Q}`);if(W.organization_id!==X.id)throw Error(`Virtual MCP not found: ${Q}`);let K=W.metadata?.ui??{},F={...K,pinnedViews:Y.length>0?Y:null,layout:G??K.layout??null};return{item:await Z.storage.virtualMcps.update(Q,J??"system",{metadata:{...W.metadata,ui:F}})}}})});import{z as _H}from"zod";var l04,d04,sl0;var Le1=D(()=>{M0();l04=_H.object({ids:_H.array(_H.string()).max(1000).describe("Virtual MCP ids to look up")}),d04=_H.object({items:_H.array(_H.object({id:_H.string(),last_used_at:_H.string().optional(),last_used_by:_H.string().optional()}))}),sl0=u({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:l04,outputSchema:d04,handler:async($,Z)=>{o(Z),t(Z),await Z.access.check();let X=await Z.storage.threads.findLastUsedByVirtualMcpIds($.ids);return{items:$.ids.map((Q)=>({id:Q,last_used_at:X.get(Q)?.last_used_at,last_used_by:X.get(Q)?.last_used_by}))}}})});var we1=D(()=>{es1();$e1();Ze1();Ge1();Ue1();Be1();Oe1();De1();Le1()});import{z as r7}from"zod";var el0;var Ee1=D(()=>{I6();M0();el0=u({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:r7.object({startDate:r7.string().datetime().optional().describe("Filter by start date (ISO 8601 datetime string)"),endDate:r7.string().datetime().optional().describe("Filter by end date (ISO 8601 datetime string)"),virtualMcpIds:r7.array(r7.string()).max(100).optional().describe("Filter by specific agent (Virtual MCP) IDs"),excludeConnectionIds:r7.array(r7.string()).max(100).optional().describe("Exclude tool calls from these connection IDs"),limit:r7.number().int().min(1).max(1000).optional().describe("Max number of (agent, tool) cells to return")}),outputSchema:r7.object({cells:r7.array(r7.object({virtualMcpId:r7.string().nullable(),toolName:r7.string(),calls:r7.number(),errors:r7.number(),outputSize:r7.number().describe("Sum of tool-output character length \u2014 a proxy for context weight, not LLM token count")}))}),handler:async($,Z)=>{let X=t(Z);return await Z.access.check(),await HQ(),Z.storage.monitoring.queryToolCallHeatmap({organizationId:X.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 B5}from"zod";var $d0;var je1=D(()=>{I6();M0();$d0=u({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:B5.object({id:B5.string().describe("Log ID to fetch")}),outputSchema:B5.object({log:B5.object({id:B5.string().optional(),organizationId:B5.string(),connectionId:B5.string(),toolName:B5.string(),input:B5.record(B5.string(),B5.unknown()),output:B5.record(B5.string(),B5.unknown()),isError:B5.boolean(),errorMessage:B5.string().nullish(),durationMs:B5.number(),timestamp:B5.string(),userId:B5.string().nullish(),requestId:B5.string(),userAgent:B5.string().nullish(),virtualMcpId:B5.string().nullish(),properties:B5.record(B5.string(),B5.string()).nullish()}).nullable().describe("The monitoring log, or null if not found")}),handler:async($,Z)=>{await Z.access.check(),await HQ();let X=t(Z),Q=await Z.storage.monitoring.getById(X.id,$.id);if(!Q)return{log:null};return{log:{...Q,timestamp:Q.timestamp instanceof Date?Q.timestamp.toISOString():Q.timestamp}}}})});import{z as B8}from"zod";var i04,Zd0;var ze1=D(()=>{I6();M0();i04=B8.object({id:B8.string().optional().describe("Unique log identifier"),organizationId:B8.string().describe("Organization ID"),connectionId:B8.string().describe("Connection ID"),toolName:B8.string().describe("Name of the tool that was called"),isError:B8.boolean().describe("Whether the call resulted in an error"),errorMessage:B8.string().nullish().describe("Error message if applicable"),durationMs:B8.number().describe("Call duration in milliseconds"),timestamp:B8.string().describe("ISO 8601 timestamp of the call"),userId:B8.string().nullish().describe("User who triggered the call"),requestId:B8.string().describe("Unique request identifier"),userAgent:B8.string().nullish().describe("Client identifier (x-studio-client header)"),virtualMcpId:B8.string().nullish().describe("Virtual MCP (Agent) ID if routed through an agent"),properties:B8.record(B8.string(),B8.string()).nullish().describe("Custom key-value metadata attached to the log")}),Zd0=u({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:B8.object({connectionId:B8.string().optional().describe("Filter by connection ID"),excludeConnectionIds:B8.array(B8.string()).optional().describe("Exclude logs from these connection IDs (e.g. system connections)"),virtualMcpId:B8.string().optional().describe("Filter by Virtual MCP (Agent) ID"),toolName:B8.string().optional().describe("Filter by tool name"),isError:B8.boolean().optional().describe("Filter by error status"),startDate:B8.string().datetime().optional().describe("Filter by start date (ISO 8601 datetime string)"),endDate:B8.string().datetime().optional().describe("Filter by end date (ISO 8601 datetime string)"),limit:B8.number().default(20).describe("Maximum number of results"),offset:B8.number().default(0).describe("Offset for pagination"),properties:B8.record(B8.string(),B8.string()).optional().describe("Filter by exact property key=value matches"),propertyKeys:B8.array(B8.string()).optional().describe("Filter by logs that have these property keys"),propertyPatterns:B8.record(B8.string(),B8.string()).optional().describe("Filter by property value patterns (SQL LIKE, use % as wildcard)"),propertyInValues:B8.record(B8.string(),B8.string()).optional().describe("Filter by exact match within comma-separated values (e.g., user_tags in 'Engineering')")}),outputSchema:B8.object({logs:B8.array(i04).describe("Array of monitoring logs"),total:B8.number().describe("Total number of logs matching filters"),offset:B8.number().describe("Current offset for pagination"),limit:B8.number().describe("Current limit for pagination")}),handler:async($,Z)=>{await Z.access.check(),await HQ();let X=t(Z),Y=$.properties||$.propertyKeys||$.propertyPatterns||$.propertyInValues?{properties:$.properties,propertyKeys:$.propertyKeys,propertyPatterns:$.propertyPatterns,propertyInValues:$.propertyInValues}:void 0,G={organizationId:X.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,...F})=>({...F,timestamp:F.timestamp instanceof Date?F.timestamp.toISOString():F.timestamp})),total:J.total,offset:$.offset,limit:$.limit}}})});import{z as J$}from"zod";var Xd0;var Pe1=D(()=>{I6();M0();Xd0=u({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:J$.object({startDate:J$.string().datetime().optional().describe("Filter by start date (ISO 8601 datetime string)"),endDate:J$.string().datetime().optional().describe("Filter by end date (ISO 8601 datetime string)"),interval:J$.string().regex(/^\d+[mhd]$/).optional().describe("Bucket interval for timeseries data (e.g. 1m, 5m, 2h, 1d). When provided, returns timeseries array."),connectionIds:J$.array(J$.string()).max(100).optional().describe("Filter by specific connection IDs (max 100)"),excludeConnectionIds:J$.array(J$.string()).max(100).optional().describe("Exclude specific connection IDs (max 100)"),toolNames:J$.array(J$.string()).max(100).optional().describe("Filter by specific tool names (max 100)"),status:J$.enum(["success","error"]).optional().describe("Filter metrics by execution status"),topN:J$.number().int().min(1).max(20).optional().describe("When provided with interval, also return top tools and their timeseries"),userIds:J$.array(J$.string()).max(100).optional().describe("Filter LLM usage by user IDs (only applied when llmUsage is true)"),llmUsage:J$.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:J$.object({totalCalls:J$.number().describe("Total number of tool calls"),errorRate:J$.number().optional().describe("Error rate as a decimal (0 to 1)"),avgDurationMs:J$.number().describe("Average call duration in milliseconds"),errorRatePercent:J$.string().optional().describe("Error rate as a percentage string"),totalErrors:J$.number().optional().describe("Total number of errors"),p50DurationMs:J$.number().optional().describe("50th percentile duration in milliseconds"),p95DurationMs:J$.number().optional().describe("95th percentile duration in milliseconds"),connectionBreakdown:J$.array(J$.object({connectionId:J$.string(),calls:J$.number(),errors:J$.number(),errorRate:J$.number(),avgDurationMs:J$.number()})).optional().describe("Per-connection metric breakdown"),totalInputTokens:J$.number().optional().describe("Total input tokens (LLM usage mode)"),totalOutputTokens:J$.number().optional().describe("Total output tokens (LLM usage mode)"),totalTokens:J$.number().optional().describe("Total tokens (LLM usage mode)"),totalCostUsd:J$.number().optional().describe("Total USD cost (LLM usage mode; only non-zero for providers that report cost)"),topTools:J$.array(J$.object({toolName:J$.string(),connectionId:J$.string().nullable(),calls:J$.number(),inputTokens:J$.number().optional(),outputTokens:J$.number().optional(),costUsd:J$.number().optional()})).optional().describe("Top tools ranked by calls"),topToolsTimeseries:J$.array(J$.object({timestamp:J$.string(),toolName:J$.string(),calls:J$.number(),errors:J$.number(),avg:J$.number(),p95:J$.number()})).optional().describe("Per-tool metric timeseries for the top tools"),timeseries:J$.array(J$.object({timestamp:J$.string(),calls:J$.number(),errors:J$.number(),errorRate:J$.number(),avg:J$.number(),p50:J$.number(),p95:J$.number(),inputTokens:J$.number().optional(),outputTokens:J$.number().optional(),totalTokens:J$.number().optional(),costUsd:J$.number().optional()})).optional().describe("Timeseries data points bucketed by interval")}),handler:async($,Z)=>{let X=t(Z);if(await Z.access.check(),await HQ(),$.interval&&$.llmUsage)return Z.storage.monitoring.queryLlmUsageStats({organizationId:X.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:X.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:X.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 Q=await Z.storage.monitoring.getStats({organizationId:X.id,startDate:$.startDate?new Date($.startDate):void 0,endDate:$.endDate?new Date($.endDate):void 0});return{...Q,errorRatePercent:(Q.errorRate*100).toFixed(2)}}})});import{z as pX}from"zod";var Qd0;var Ae1=D(()=>{I6();M0();Qd0=u({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:pX.object({threadIds:pX.array(pX.string()).min(1).max(500).describe("Thread IDs to aggregate usage for (max 500)"),connectionId:pX.string().optional().describe("LLM connection ID (defaults to 'decopilot')"),startDate:pX.string().datetime().optional().describe("Filter by start date (ISO 8601 datetime string)"),endDate:pX.string().datetime().optional().describe("Filter by end date (ISO 8601 datetime string)")}),outputSchema:pX.object({items:pX.array(pX.object({threadId:pX.string(),calls:pX.number(),inputTokens:pX.number(),outputTokens:pX.number(),totalTokens:pX.number(),costUsd:pX.number()}))}),handler:async($,Z)=>{let X=t(Z);return await Z.access.check(),await HQ(),{items:await Z.storage.monitoring.queryThreadUsage({organizationId:X.id,connectionId:$.connectionId??"decopilot",threadIds:$.threadIds,startDate:$.startDate?new Date($.startDate):void 0,endDate:$.endDate?new Date($.endDate):void 0})}}})});var Te1=D(()=>{Ee1();je1();ze1();Pe1();Ae1()});function OZ0($){return typeof $==="string"&&n04.has($.trim().toLowerCase())}var n04;var Yd0=D(()=>{n04=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 uY}from"zod";var Gd0;var Re1=D(()=>{M0();Yd0();Gd0=u({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:uY.object({slug:uY.string().min(1).max(50).regex(/^[a-z0-9-]+$/,"Slug must be lowercase alphanumeric with hyphens").refine(($)=>!OZ0($),"Slug is reserved by Studio"),name:uY.string().min(1).max(255),description:uY.string().optional()}),outputSchema:uY.object({id:uY.string(),name:uY.string(),slug:uY.string(),logo:uY.string().nullable().optional(),metadata:uY.any().optional(),createdAt:uY.string().datetime().describe("ISO 8601 timestamp"),members:uY.array(uY.any()).optional()}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=o0(Z);if(!X)throw Error("User ID required to create organization");let Q=await Z.boundAuth.organization.create({name:$.name,slug:$.slug,metadata:$.description?{description:$.description}:void 0,userId:X});if(!Q)throw Error("Failed to create organization");return{...Q,createdAt:Q.createdAt instanceof Date?Q.createdAt.toISOString():Q.createdAt}}})});import{z as DK}from"zod";var Jd0;var Ie1=D(()=>{M0();Jd0=u({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(o(Z),await Z.access.check(),!o0(Z))throw Error("User ID required to list organizations");return{organizations:(await Z.boundAuth.organization.list()).map((Q)=>({...Q,createdAt:Q.createdAt instanceof Date?Q.createdAt.toISOString():Q.createdAt}))}}})});import{z as aG}from"zod";var Wd0;var qe1=D(()=>{M0();Wd0=u({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:aG.object({}),outputSchema:aG.object({id:aG.string(),name:aG.string(),slug:aG.string(),logo:aG.string().nullable().optional(),metadata:aG.any().optional(),createdAt:aG.string().datetime().describe("ISO 8601 timestamp"),members:aG.array(aG.any()).optional(),invitations:aG.array(aG.any()).optional()}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");let Q=await Z.boundAuth.organization.get(X);if(!Q)throw Error("No active organization found");let Y=new Date,G=Q.invitations?.filter((J)=>new Date(J.expiresAt)>Y);return{...Q,invitations:G,createdAt:Q.createdAt instanceof Date?Q.createdAt.toISOString():Q.createdAt}}})});import{z as S3}from"zod";var Kd0;var Me1=D(()=>{M0();Kd0=u({name:"ORGANIZATION_UPDATE",description:"Update an organization's name or description.",annotations:{title:"Update Organization",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:S3.object({id:S3.string(),name:S3.string().min(1).max(255).optional(),description:S3.string().optional()}),outputSchema:S3.object({id:S3.string(),name:S3.string(),slug:S3.string(),logo:S3.string().nullable().optional(),metadata:S3.any().optional(),createdAt:S3.string().datetime().describe("ISO 8601 timestamp")}),handler:async($,Z)=>{if(o(Z),await Z.access.check(),$.id!==Z.organization?.id)throw Error("Organization ID does not match authenticated organization");let X={};if($.name)X.name=$.name;if($.description!==void 0)X.metadata={description:$.description};let Q=await Z.boundAuth.organization.update({organizationId:$.id,data:X});if(!Q)throw Error("Failed to update organization");return{...Q,createdAt:Q.createdAt instanceof Date?Q.createdAt.toISOString():Q.createdAt}}})});import{z as Pp}from"zod";var Fd0;var ke1=D(()=>{M0();Fd0=u({name:"ORGANIZATION_DELETE",description:"Archive an organization (soft delete).",annotations:{title:"Delete Organization",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:Pp.object({id:Pp.string()}),outputSchema:Pp.object({success:Pp.boolean(),id:Pp.string()}),handler:async($,Z)=>{if(o(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);return await Z.boundAuth.organization.update({organizationId:$.id,data:{metadata:{...X?.metadata,archived:!0,archivedAt:new Date().toISOString()}}}),{success:!0,id:$.id}}})});import{z as $$}from"zod";function nX($,Z){let X=$?.[Z];return t04.has(Z)?X!==!1:X===!0}var Ap,Tp,vH,Ve1,XO,Rp,Ip,qp,Mp,t04,QO;var JZ=D(()=>{Ap=$$.object({title:$$.string(),url:$$.string(),icon:$$.string()}),Tp=$$.object({registries:$$.record($$.string(),$$.object({enabled:$$.boolean()})).describe("Per-registry enabled/disabled state. Key is connection ID. Absent registries are treated as enabled."),blockedMcps:$$.array($$.string()).describe("List of MCP app_name or app_id values to hide from the store.")}),vH=$$.object({keyId:$$.string(),modelId:$$.string(),title:$$.string().optional()}).nullable(),Ve1=$$.enum(["fast","smart","thinking","image","web_search","deep_research"]),XO=$$.enum(["fast","smart","thinking"]),Rp=$$.object({tiers:$$.object({fast:vH,smart:vH,thinking:vH,image:vH,web_search:vH,deep_research:vH})}),Ip=$$.object({tiers:$$.object({fast:vH.optional(),smart:vH.optional(),thinking:vH.optional()})}),qp=$$.object({ids:$$.array($$.string()).describe("Ordered list of custom virtual MCP agent ids to show on the home view.")}),Mp=$$.object({demo_mode:$$.boolean().optional().describe("Curated demo org: the commerce connect modal proceeds without a configured required data source."),reports_only:$$.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."),org_board_columns:$$.boolean().optional().describe("The task board's columns are this org's own, mirrored from its tracker, rather than the set Studio ships. Off means the canonical lanes, which is the only board most orgs want."),reviewer_enabled:$$.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:$$.boolean().optional().describe("Deprecated: see reviewer_enabled."),code_reviewer_enabled:$$.boolean().optional().describe("Deprecated: see reviewer_enabled."),auto_merge:$$.boolean().optional().describe("When the Reviewer approves a task's pull request, merge it automatically instead of leaving the merge to a human. If the merge is blocked by a conflict with the base branch, hand the PR back to the Super Agent to resolve the conflict (check out the branch, merge the base, push) so it can then merge."),cheap_reviewer_model:$$.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:$$.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:$$.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:$$.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."),delivery_lanes_enabled:$$.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:$$.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.")}),t04=new Set(["reviewer_enabled","cheap_reviewer_model"]);QO=$$.object({id:$$.string().describe("Brand context ID"),name:$$.string().describe("Company name"),domain:$$.string().describe("Company domain (e.g. example.com)"),overview:$$.string().describe("Company overview / description"),logo:$$.string().nullable().optional().describe("Logo URL"),favicon:$$.string().nullable().optional().describe("Favicon URL"),ogImage:$$.string().nullable().optional().describe("OG image URL"),fonts:$$.object({heading:$$.string().optional().describe("Font family for headings"),body:$$.string().optional().describe("Font family for body text"),code:$$.string().optional().describe("Font family for code / monospace")}).nullable().optional().describe("Font families by semantic role"),colors:$$.object({primary:$$.string().optional().describe("Primary brand color (hex)"),secondary:$$.string().optional().describe("Secondary brand color (hex)"),accent:$$.string().optional().describe("Accent / highlight color (hex)"),background:$$.string().optional().describe("Background color (hex)"),foreground:$$.string().optional().describe("Foreground / text color (hex)")}).nullable().optional().describe("Semantic color palette"),images:$$.array($$.record($$.string(),$$.unknown())).nullable().optional().describe("Brand images"),metadata:$$.record($$.string(),$$.unknown()).nullable().optional().describe("Extra design tokens (typography, components, spacing, layout, tone, etc.)"),archivedAt:$$.string().nullable().optional().describe("Archive timestamp (null to unarchive)"),isDefault:$$.boolean().optional().describe("Whether this is the default brand for the organization")})});import{z as fH}from"zod";var Hd0;var Se1=D(()=>{M0();JZ();Hd0=u({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:fH.object({}),outputSchema:fH.object({organizationId:fH.string(),sidebar_items:fH.array(Ap).nullable().optional(),enabled_plugins:fH.array(fH.string()).nullable().optional(),registry_config:Tp.nullable().optional(),simple_mode:Rp.nullable().optional(),default_home_agents:qp.nullable().optional(),flags:Mp.nullable().optional(),main_agent_id:fH.string().nullable().optional(),createdAt:fH.string().datetime().optional().describe("ISO 8601 timestamp"),updatedAt:fH.string().datetime().optional().describe("ISO 8601 timestamp")}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");let Q=await Z.storage.organizationSettings.get(X);if(!Q)return{organizationId:X};return{...Q,createdAt:Q.createdAt instanceof Date?Q.createdAt.toISOString():Q.createdAt,updatedAt:Q.updatedAt instanceof Date?Q.updatedAt.toISOString():Q.updatedAt}}})});import{z as bQ}from"zod";var Nd0;var Ce1=D(()=>{M0();JZ();Nd0=u({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:bQ.object({organizationId:bQ.string(),sidebar_items:bQ.array(Ap).optional(),enabled_plugins:bQ.array(bQ.string()).optional(),registry_config:Tp.optional(),simple_mode:Rp.optional(),default_home_agents:qp.optional(),flags:Mp.strict().optional().describe("Org boolean toggles. Shallow-merged into the stored flags: keys you pass win (explicit false persists), omitted keys keep their value."),main_agent_id:bQ.string().nullable().optional().describe("Virtual MCP id the org lands on instead of the Super Agent. Pass null to clear.")}),outputSchema:bQ.object({organizationId:bQ.string(),sidebar_items:bQ.array(Ap).nullable().optional(),enabled_plugins:bQ.array(bQ.string()).nullable().optional(),registry_config:Tp.nullable().optional(),simple_mode:Rp.nullable().optional(),default_home_agents:qp.nullable().optional(),flags:Mp.nullable().optional(),main_agent_id:bQ.string().nullable().optional(),createdAt:bQ.string().datetime().describe("ISO 8601 timestamp"),updatedAt:bQ.string().datetime().describe("ISO 8601 timestamp")}),handler:async($,Z)=>{if(o(Z),await Z.access.check(),t(Z).id!==$.organizationId)throw Error("Cannot update settings for a different organization");let Q=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,main_agent_id:$.main_agent_id});return{...Q,createdAt:Q.createdAt instanceof Date?Q.createdAt.toISOString():Q.createdAt,updatedAt:Q.updatedAt instanceof Date?Q.updatedAt.toISOString():Q.updatedAt}}})});import{z as C3}from"zod";var _e1,Ud0,Bd0;var ve1=D(()=>{M0();JZ();_e1=QO.extend({organizationId:C3.string(),archivedAt:C3.string().nullable().optional().describe("ISO 8601 timestamp"),createdAt:C3.string().describe("ISO 8601 timestamp"),updatedAt:C3.string().describe("ISO 8601 timestamp")}),Ud0=u({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:C3.object({includeArchived:C3.boolean().optional().describe("Include archived brands in the list")}),outputSchema:C3.object({items:C3.array(_e1)}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");return{items:(await Z.storage.brandContext.list(X,{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}))}}}),Bd0=u({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:C3.object({id:C3.string().describe("Brand context ID")}),outputSchema:_e1.extend({organizationId:C3.string()}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");let Q=await Z.storage.brandContext.get($.id,X);if(!Q)throw Error("Brand context not found");return{...Q,archivedAt:Q.archivedAt instanceof Date?Q.archivedAt.toISOString():Q.archivedAt,createdAt:Q.createdAt instanceof Date?Q.createdAt.toISOString():Q.createdAt,updatedAt:Q.updatedAt instanceof Date?Q.updatedAt.toISOString():Q.updatedAt}}})});import{z as jE}from"zod";var fe1,Od0,Dd0,Ld0;var be1=D(()=>{M0();JZ();fe1=QO.extend({organizationId:jE.string(),createdAt:jE.string().describe("ISO 8601 timestamp"),updatedAt:jE.string().describe("ISO 8601 timestamp")}),Od0=u({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:QO.omit({id:!0}),outputSchema:fe1,handler:async($,Z)=>{o(Z),await Z.access.check();let X=Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");let Q=await Z.storage.brandContext.create(X,{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{...Q,archivedAt:Q.archivedAt instanceof Date?Q.archivedAt.toISOString():Q.archivedAt,createdAt:Q.createdAt instanceof Date?Q.createdAt.toISOString():Q.createdAt,updatedAt:Q.updatedAt instanceof Date?Q.updatedAt.toISOString():Q.updatedAt}}}),Dd0=u({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:QO.partial().required({id:!0}),outputSchema:fe1,handler:async($,Z)=>{o(Z),await Z.access.check();let X=Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");if(!await Z.storage.brandContext.get($.id,X))throw Error("Brand context not found");let{id:Y,...G}=$;if(G.isDefault===!0)await Z.storage.brandContext.setDefault(Y,X);let J=await Z.storage.brandContext.update(Y,X,{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}}}),Ld0=u({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:jE.object({id:jE.string().describe("Brand context ID")}),outputSchema:jE.object({success:jE.boolean()}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");if(!await Z.storage.brandContext.get($.id,X))throw Error("Brand context not found");return await Z.storage.brandContext.update($.id,X,{archivedAt:new Date().toISOString(),isDefault:!1}),{success:!0}}})});async function DZ0($,Z,X){let Q=$.trim();if(!Q.startsWith("http"))Q=`https://${Q}`;let Y=await fetch("https://api.firecrawl.dev/v1/scrape",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${Z}`},body:JSON.stringify({url:Q,formats:["branding"]})});if(!Y.ok){let U=await Y.text().catch(()=>"");throw Error(`Firecrawl API error: ${Y.status} ${U.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=a04(J,W);return{name:W.title?.split(/[|\u2013\u2014]|\s+-\s+/).map((U)=>U.trim()).filter(Boolean)?.slice().sort((U,B)=>U.length-B.length)[0]??W.ogSiteName??X??$,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 a04($,Z){let X=$.images??{},Q=$.colors??{},Y={};for(let[H,N]of Object.entries(Q))if(typeof N==="string"&&N&&o04.has(H))Y[H]=N;let G={},W=($.typography??{}).fontFamilies??{};for(let[H,N]of Object.entries(W))if(typeof N==="string"&&N){let U=r04[H.toLowerCase()];if(U&&!G[U])G[U]=N}let K=$.fonts;if(Array.isArray(K))for(let H of K){let N=H.family;if(typeof N==="string"&&N&&!G.body)G.body=N}let F={};for(let H of["typography","components","spacing","layout","animations","icons","tone","personality","colorScheme"])if($[H]!==void 0)F[H]=$[H];return{logo:X.logo??null,favicon:X.favicon??null,ogImage:X.ogImage??Z.ogImage??null,fonts:Object.keys(G).length>0?G:null,colors:Object.keys(Y).length>0?Y:null,metadata:F}}var o04,r04;var wd0=D(()=>{o04=new Set(["primary","secondary","accent","background","foreground"]),r04={heading:"heading",headings:"heading",head:"heading",title:"heading",body:"body",primary:"body",text:"body",code:"code",monospace:"code",mono:"code"}});import{z as LZ0}from"zod";var s04,Ed0;var xe1=D(()=>{M0();wd0();JZ();s04=QO.pick({id:!0,name:!0,domain:!0,overview:!0,logo:!0,favicon:!0,ogImage:!0,fonts:!0,colors:!0}).extend({success:LZ0.boolean()}),Ed0=u({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:LZ0.object({domain:LZ0.string().describe("Website domain to extract brand from"),brandId:LZ0.string().optional().describe("Existing brand context ID to update (creates new if omitted)")}),outputSchema:s04,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)=>{o(Z),await Z.access.check();let X=Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");let Q=Z.firecrawlApiKey;if(!Q)throw Error("FIRECRAWL_API_KEY is not configured. Set the environment variable to enable brand extraction.");let Y=await DZ0($.domain,Q,$.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,X))throw Error("Brand context not found");return Z.storage.brandContext.update($.brandId,X,G)})():await Z.storage.brandContext.create(X,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 ye1($){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 X=Object.fromEntries(Object.entries(Z).filter(([Q])=>Q!=="tagline"&&Q!=="tone"));return Object.keys(X).length>0?X:void 0})()}}var jd0,zd0;var ge1=D(()=>{Pl0();M0();jd0=u({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:n90,outputSchema:Kp,handler:async($,Z)=>{o(Z),await Z.access.check();let X=Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");let Q=$.id?await Z.storage.brandContext.get($.id,X):await Z.storage.brandContext.getDefault(X);if(!Q)throw Error($.id?"Brand not found":"No default brand configured");return ye1(Q)}}),zd0=u({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:t90,outputSchema:o90,handler:async($,Z)=>{o(Z),await Z.access.check();let X=Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");return{items:(await Z.storage.brandContext.list(X)).map(ye1)}}})});import{resolveTxt as e04}from"dns/promises";function Pd0($){return`${$14}.${$.toLowerCase()}`}function he1(){return`deco-verify-${crypto.randomUUID().replace(/-/g,"")}`}async function ue1($,Z,X=e04){if(!Z)return!1;try{return(await X(Pd0($))).some((Y)=>Y.join("").trim()===Z)}catch{return!1}}var $14="_deco-verify";var ce1=()=>{};import{z as k5}from"zod";function YO($){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?Pd0($.domain):null,recordValue:Z?$.verificationToken:null}}function X14($){let Z=$.toLowerCase().trim();if(!Z14.test(Z))throw Error(`Invalid domain format: "${Z}". Must be a valid domain like "acme.com"`);if(_3.has(Z))throw Error(`Cannot claim generic email domain "${Z}". Only corporate domains are allowed.`);return Z}var Z14,Ad0,wZ0,Td0,Rd0,Id0,qd0,Md0;var le1=D(()=>{cY();ce1();M0();Z14=/^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$/,Ad0=k5.enum(["off","auto","request"]),wZ0=k5.object({id:k5.string(),domain:k5.string(),joinMode:Ad0,verificationStatus:k5.enum(["pending","verified"]),verificationMethod:k5.enum(["email","dns"]).nullable(),verifiedAt:k5.string().nullable(),recordName:k5.string().nullable(),recordValue:k5.string().nullable()});Td0=u({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:k5.object({}),outputSchema:k5.object({domains:k5.array(wZ0)}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=t(Z);return{domains:(await Z.storage.organizationDomains.listByOrganizationId(X.id)).map(YO)}}}),Rd0=u({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:k5.object({domain:k5.string().min(1).max(255).describe("Domain to claim, e.g. acme.com"),joinMode:Ad0.optional().describe("Initial join mode (only applied when the domain is trusted immediately via email match).")}),outputSchema:wZ0,handler:async($,Z)=>{o(Z),await Z.access.check();let X=t(Z),Q=X14($.domain),G=Z.auth.user?.email?.split("@")[1]?.toLowerCase(),J=Boolean(Z.auth.user?.emailVerified)&&G===Q,W=await Z.storage.organizationDomains.getByOrgAndDomain(X.id,Q);if(W){if(W.verificationStatus!=="verified"&&J){let F=await Z.storage.organizationDomains.markVerified(W.id,"email");return YO(F)}return YO(W)}let K=J?await Z.storage.organizationDomains.add(X.id,Q,{joinMode:$.joinMode??"off",verificationStatus:"verified",verificationMethod:"email"}):await Z.storage.organizationDomains.add(X.id,Q,{joinMode:"off",verificationStatus:"pending",verificationToken:he1()});return YO(K)}}),Id0=u({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:k5.object({id:k5.string(),joinMode:Ad0}),outputSchema:wZ0,handler:async($,Z)=>{o(Z),await Z.access.check();let X=t(Z),Q=await Z.storage.organizationDomains.getById($.id);if(!Q||Q.organizationId!==X.id)throw Error("Domain not found");if($.joinMode!=="off"&&Q.verificationStatus!=="verified")throw Error("Verify the domain before enabling auto-join or requests.");let Y=await Z.storage.organizationDomains.updateJoinMode($.id,$.joinMode);return YO(Y)}}),qd0=u({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:k5.object({id:k5.string()}),outputSchema:k5.object({verified:k5.boolean(),domain:wZ0}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=t(Z),Q=await Z.storage.organizationDomains.getById($.id);if(!Q||Q.organizationId!==X.id)throw Error("Domain not found");if(Q.verificationStatus==="verified")return{verified:!0,domain:YO(Q)};if(!Q.verificationToken)throw Error("Domain has no pending DNS verification.");if(!await ue1(Q.domain,Q.verificationToken))return{verified:!1,domain:YO(Q)};let G=await Z.storage.organizationDomains.markVerified($.id,"dns");return{verified:!0,domain:YO(G)}}}),Md0=u({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:k5.object({id:k5.string()}),outputSchema:k5.object({success:k5.boolean()}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=t(Z),Q=await Z.storage.organizationDomains.getById($.id);if(!Q||Q.organizationId!==X.id)throw Error("Domain not found");return await Z.storage.organizationDomains.removeById($.id),{success:!0}}})});function GO($){return($ instanceof Error?$.message.toLowerCase():"").includes("already a member")}import{z as z9}from"zod";var Q14,kd0,Vd0,Sd0;var de1=D(()=>{M0();C4();Q14=z9.object({id:z9.string(),userId:z9.string(),status:z9.enum(["pending","approved","denied"]),createdAt:z9.string(),user:z9.object({id:z9.string(),name:z9.string(),email:z9.string(),image:z9.string().nullable()}).nullable()}),kd0=u({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:z9.object({}),outputSchema:z9.object({requests:z9.array(Q14)}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=t(Z);return{requests:(await Z.storage.organizationJoinRequests.listPendingWithUser(X.id)).map((Y)=>({id:Y.id,userId:Y.userId,status:Y.status,createdAt:new Date(Y.createdAt).toISOString(),user:Y.user}))}}}),Vd0=u({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:z9.object({requestId:z9.string()}),outputSchema:z9.object({success:z9.boolean()}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=t(Z),Q=await Z.storage.organizationJoinRequests.getById($.requestId);if(!Q||Q.organizationId!==X.id)throw Error("Join request not found");if(Q.status!=="pending")throw Error("Join request has already been decided");let Y=o0(Z);if(!await Z.storage.organizationJoinRequests.decide(Q.id,"approved",Y??Q.userId))return{success:!0};try{await Z.boundAuth.organization.addMember({organizationId:X.id,userId:Q.userId,role:["user"]})}catch(J){if(!GO(J))throw J}if(Y)x1.capture({distinctId:Y,event:"organization_join_request_approved",groups:{organization:X.id},properties:{organization_id:X.id,user_id:Q.userId}});return{success:!0}}}),Sd0=u({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:z9.object({requestId:z9.string()}),outputSchema:z9.object({success:z9.boolean()}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=t(Z),Q=await Z.storage.organizationJoinRequests.getById($.requestId);if(!Q||Q.organizationId!==X.id)throw Error("Join request not found");if(Q.status!=="pending")throw Error("Join request has already been decided");let Y=o0(Z);if(await Z.storage.organizationJoinRequests.decide(Q.id,"denied",Y??Q.userId)&&Y)x1.capture({distinctId:Y,event:"organization_join_request_denied",groups:{organization:X.id},properties:{organization_id:X.id,user_id:Q.userId}});return{success:!0}}})});import{z as xQ}from"zod";var Cd0;var me1=D(()=>{C4();M0();SQ();Cd0=u({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:xQ.object({organizationId:xQ.string().optional(),userId:xQ.string(),role:xQ.array(xQ.string())}),outputSchema:xQ.object({id:xQ.string(),organizationId:xQ.string(),userId:xQ.string(),role:xQ.union([xQ.string(),xQ.array(xQ.string())]),createdAt:xQ.string().datetime().describe("ISO 8601 timestamp")}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=$.organizationId||Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");if(X!==Z.organization?.id)throw Error("Organization ID does not match authenticated organization");let Q=await Z.db.selectFrom("member").select(["role"]).where("userId","=",o0(Z)??"").where("organizationId","=",X).executeTakeFirst();if(!T50(Q?.role,$.role))throw Error(`Insufficient privileges to assign role "${$.role.join(",")}"`);let Y=await Z.boundAuth.organization.addMember({organizationId:X,userId:$.userId,role:$.role});if(!Y)throw Error("Failed to add member");let G=o0(Z);if(G)x1.capture({distinctId:G,event:"organization_member_added",groups:{organization:X},properties:{organization_id:X,added_user_id:$.userId,role:$.role}});return{...Y,role:Y.role,createdAt:Y.createdAt instanceof Date?Y.createdAt.toISOString():Y.createdAt}}})});import{z as Ky}from"zod";var _d0;var ie1=D(()=>{C4();M0();_d0=u({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:Ky.object({organizationId:Ky.string().optional(),memberIdOrEmail:Ky.string()}),outputSchema:Ky.object({success:Ky.boolean(),memberIdOrEmail:Ky.string()}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=$.organizationId||Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");if(X!==Z.organization?.id)throw Error("Organization ID does not match authenticated organization");let Q=await Z.boundAuth.organization.removeMember({organizationId:X,memberIdOrEmail:$.memberIdOrEmail});Z.invalidateMemberRole?.(Q.member.userId,X);let Y=o0(Z);if(Y)x1.capture({distinctId:Y,event:"organization_member_removed",groups:{organization:X},properties:{organization_id:X,member_id_or_email:$.memberIdOrEmail}});return{success:!0,memberIdOrEmail:$.memberIdOrEmail}}})});import{z as a7}from"zod";var vd0;var pe1=D(()=>{M0();vd0=u({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:a7.object({limit:a7.number().int().min(1).max(1000).optional(),offset:a7.number().int().min(0).optional()}),outputSchema:a7.object({members:a7.array(a7.object({id:a7.string(),organizationId:a7.string(),userId:a7.string(),role:a7.string(),createdAt:a7.string().datetime().describe("ISO 8601 timestamp"),user:a7.object({id:a7.string(),name:a7.string(),email:a7.string(),image:a7.string().optional()}).optional()}))}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");return{members:((await Z.boundAuth.organization.listMembers({organizationId:X,limit:$.limit,offset:$.offset}))?.members??[]).map((G)=>({...G,createdAt:G.createdAt instanceof Date?G.createdAt.toISOString():G.createdAt}))}}})});import{z as yZ}from"zod";var fd0;var ne1=D(()=>{C4();M0();SQ();fd0=u({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:yZ.object({organizationId:yZ.string().optional(),memberId:yZ.string(),role:yZ.array(yZ.string())}),outputSchema:yZ.object({id:yZ.string(),organizationId:yZ.string(),userId:yZ.string(),role:yZ.union([yZ.string(),yZ.array(yZ.string())]),createdAt:yZ.string().datetime().describe("ISO 8601 timestamp"),user:yZ.object({email:yZ.string(),name:yZ.string(),image:yZ.string().optional()})}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=$.organizationId||Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");let Q=await Z.db.selectFrom("member").select(["role"]).where("userId","=",o0(Z)??"").where("organizationId","=",X).executeTakeFirst();if(!T50(Q?.role,$.role))throw Error(`Insufficient privileges to assign role "${$.role.join(",")}"`);let Y=await Z.boundAuth.organization.updateMemberRole({organizationId:X,memberId:$.memberId,role:$.role});if(!Y)throw Error("Failed to update member role");Z.invalidateMemberRole?.(Y.userId,X);let G=o0(Z);if(G)x1.capture({distinctId:G,event:"organization_member_role_updated",groups:{organization:X},properties:{organization_id:X,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 te1(){if(kp&&Date.now()-kp.fetchedAt<600000)return kp.rate;try{let Z=await(await fetch("https://economia.awesomeapi.com.br/json/last/USD-BRL",{signal:AbortSignal.timeout(5000)})).json(),X=parseFloat(Z.USDBRL?.bid??"");if(Number.isNaN(X)||X<=0)throw Error("Invalid rate");return kp={rate:X,fetchedAt:Date.now()},X}catch{return kp?.rate??5.5}}function oe1($,Z,X){if(Z==="brl")return Math.round($/X);return $}var kp=null;function bd0($,Z="",X=new URLSearchParams){for(let[Q,Y]of Object.entries($)){if(Y===void 0||Y===null)continue;let G=Z?`${Z}[${Q}]`:Q;if(Array.isArray(Y))Y.forEach((J,W)=>{if(typeof J==="object"&&J!==null)bd0(J,`${G}[${W}]`,X);else X.append(`${G}[${W}]`,String(J))});else if(typeof Y==="object")bd0(Y,G,X);else X.append(G,String(Y))}return X}async function Vp($,Z){let X=b0().stripeSecretKey;if(!X)throw new lY(503,"billing is not configured");let Q=Z?.params?bd0(Z.params).toString():void 0,Y=await fetch(`${Y14}${$}`,{method:Z?.method??(Q?"POST":"GET"),headers:{Authorization:`Bearer ${X}`,...Q&&{"Content-Type":"application/x-www-form-urlencoded"}},body:Q,signal:AbortSignal.timeout(G14)}),G=await Y.json().catch(()=>({}));if(!Y.ok){let J=G.error?.message??`HTTP ${Y.status}`;throw new lY(Y.status,J)}return G}function re1($){return{billing_address_collection:"required",custom_fields:[{key:J14,label:{type:"custom",custom:"CPF / CNPJ"},type:"text",optional:!1,text:{minimum_length:W14,maximum_length:K14}}],...$&&{customer_update:{address:"auto",name:"auto"}}}}async function ae1($){let Z=b0().stripeOrgPriceId;if(!Z)throw new lY(503,"billing is not configured");let X=await Vp("/checkout/sessions",{params:{mode:"subscription",...re1(null),line_items:[{price:Z,quantity:1}],success_url:$.successUrl,cancel_url:$.cancelUrl,metadata:{orgId:$.organizationId},subscription_data:{metadata:{orgId:$.organizationId}}}});if(!X.url)throw new lY(500,"checkout session lacks url");return{url:X.url}}function F14($,Z){return Math.round($*(1+Z/100))}async function se1($){let Z=F14($.amountCents,$.feePercent),X=oe1($.amountCents,$.currency,await te1()),Q=b0().stripeTopupProductId,Y={kind:"topup",orgId:$.organizationId,creditCents:X},G=$.currency==="brl"?`Studio AI credits (R$ ${($.amountCents/100).toFixed(2)})`:`Studio AI credits ($${($.amountCents/100).toFixed(2)})`,J=await Vp("/checkout/sessions",{params:{mode:"payment",...$.customerId&&{customer:$.customerId},...re1($.customerId),line_items:[{quantity:1,price_data:{currency:$.currency,unit_amount:Z,...Q?{product:Q}:{product_data:{name:G}}}}],success_url:$.successUrl,cancel_url:$.cancelUrl,metadata:Y,payment_intent_data:{metadata:Y}}});if(!J.url)throw new lY(500,"checkout session lacks url");return{url:J.url}}async function EZ0($){let Z=await Vp("/billing_portal/sessions",{params:{customer:$.customerId,return_url:$.returnUrl}});if(!Z.url)throw new lY(500,"portal session lacks url");return{url:Z.url}}async function jZ0($){return Vp(`/subscriptions/${encodeURIComponent($)}`)}async function ee1($){await Vp(`/subscriptions/${encodeURIComponent($)}`,{method:"DELETE"})}var Y14="https://api.stripe.com/v1",lY,G14=15000,J14="taxid",W14=11,K14=18;var zE=D(()=>{R$();lY=class lY extends Error{status;constructor($,Z){super(`Stripe API ${$}: ${Z}`);this.status=$;this.name="StripeApiError"}}});function JO($,Z){let X=`/${encodeURIComponent($)}/settings`;return Z?`${X}/${Z}`:X}import{z as xd0}from"zod";var yd0;var $0$=D(()=>{zE();$9();M0();C4();yd0=u({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:xd0.object({}),outputSchema:xd0.object({url:xd0.string()}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=Z.organization?.id,Q=Z.organization?.slug;if(!X||!Q)throw Error("Organization context required");let Y=await Z.storage.organizationBilling.getBilling(X);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=`${f9()}${JO(Q,"members")}`,{url:J}=await ae1({organizationId:X,successUrl:`${G}?checkout=success`,cancelUrl:`${G}?checkout=canceled`});return yY({event:"subscription_checkout_started",organizationId:X,...Z.auth?.user?.id?{userId:Z.auth.user.id}:{}}),{url:J}}})});import{z as gd0}from"zod";var hd0;var Z0$=D(()=>{zE();$9();M0();hd0=u({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:gd0.object({}),outputSchema:gd0.object({url:gd0.string()}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=t(Z);if(!X.slug)throw Error("Organization context required");let Q=await Z.storage.organizationBilling.getBilling(X.id);if(!Q?.stripeCustomerId)throw Error("This organization has no billing account yet \u2014 subscribe first.");try{return await EZ0({customerId:Q.stripeCustomerId,returnUrl:`${f9()}${JO(X.slug,"members")}`})}catch(Y){if(Y instanceof lY)throw Error(Y.message);throw Y}}})});function zZ0($){return ud0[$%ud0.length]??H14}function yQ($){return $.createdBy==="system"}function U14($){if($?.reviewer_enabled===void 0&&$?.qa_agent_enabled===!1&&$?.code_reviewer_enabled===!1)return!1;return nX($,"reviewer_enabled")}function bH($){return U14($)?LK:[]}function B14($){return nX($,"delivery_lanes_enabled")}function EK($){return B14($)?"merged":"done"}function KO($,Z){if(!$)return!1;return[wK[Z],...N14].some((X)=>$.startsWith(`${X}:`))}function xH($,Z){if(Z)return new Date(Z).getTime();let X=0;for(let Q of $){if(Q.action!=="status_changed")continue;if(Q.data?.to!=="in_review")continue;X=Math.max(X,new Date(Q.occurredAt).getTime())}return X}function FO($,Z){let X=xH($,Z.cycleStartedAt),Q=new Map;for(let Y of $){if(Y.action!=="review_approved"&&Y.action!=="review_changes_requested")continue;if(new Date(Y.occurredAt).getTime()<X)continue;let G=Y.data??{};if(G.reviewer!=="reviewer")continue;if(Y.action==="review_approved"){if(Z?.verifiedOnly&&G.verified!==!0)continue;Q.set("reviewer","approved")}else Q.set("reviewer","changes_requested")}return Q}function WO($,Z,X){if(Z.length===0)return!1;let Q=FO($,X);return Z.every((Y)=>Q.get(Y)==="approved")}function Q0$($,Z,X){return WO($,Z,X)&&!WO($,Z,{...X,verifiedOnly:!0})}function Y0$($){let Z=null;for(let X of $){if(X.action!=="review_approved"&&X.action!=="review_changes_requested")continue;let Q=new Date(X.occurredAt).getTime();if(Z&&Q<Z.at)continue;let Y=X.data?.notes;Z={at:Q,notes:X.action==="review_changes_requested"&&typeof Y==="string"?Y:null}}return Z?.notes??null}var Z8="super-agent",ud0,H14,Sp='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.',X0$,cd0="chore",LK,wK,N14,Cp="NO VISUAL SURFACE",PZ0,AZ0,G0$="task-board.item.updated",J0$="task-board.item.deleted";var C6=D(()=>{JZ();ud0=["#9ca3af","#ef4444","#f97316","#f59e0b","#22c55e","#3b82f6","#a855f7","#ec4899"],H14=ud0[0];X0$="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.",LK=["reviewer"],wK={reviewer:"Reviewer"},N14=["QA Agent","Code Reviewer"];PZ0=["triage","todo","in_progress","in_review","approved","merged","post_deploy_validation","done","archived"],AZ0=["approved","merged","post_deploy_validation"]});function ld0($){return $==="trial"?"trial":"subscription"}function _p($,Z,X,Q={}){yY({event:Z,organizationId:X.organizationId,...$.auth?.user?.id?{userId:$.auth.user.id}:{},properties:{task_id:X.id,...Q}})}function dd0($){return $?.status==="active"||$?.status==="past_due"}function TZ0($,Z){if(dd0($))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 vp(){let $=b0();return{enforced:$.taskQuotaEnforced,freeTaskExecutions:$.freeTaskExecutions,monthlyTaskExecutions:$.monthlyTaskExecutions,maxRunsPerTask:$.maxRunsPerTask}}function HO(){return{...vp(),maxRunsPerTask:Number.POSITIVE_INFINITY}}async function Fy($,Z,X=vp()){if(!X.enforced||!yQ(Z))return;let Q=await $.storage.organizationBilling.taskClaim(Z.id);if(Q&&Q.runCount>=X.maxRunsPerTask)throw _p($,"task_quota_blocked",Z,{phase:"precheck",reason:"runs_exhausted"}),new tX("runs_exhausted");if(Q&&Q.state!=="released")return;let Y=await $.storage.organizationBilling.getBilling(Z.organizationId),G=TZ0(Y,X);if(await $.storage.organizationBilling.countTaskClaims(Z.organizationId,G.periodKey)>=G.limit)throw _p($,"task_quota_blocked",Z,{phase:"precheck",reason:G.exhaustedReason,billing_mode:ld0(G.periodKey),limit:G.limit}),new tX(G.exhaustedReason)}async function W0$($,Z,X=vp()){if(!X.enforced||!yQ(Z))return"skipped";let Q=await $.storage.organizationBilling.getBilling(Z.organizationId),Y=TZ0(Q,X),G=await $.storage.organizationBilling.claimTaskUnderLimit(Z.organizationId,Z.id,Y.periodKey,Y.limit,X.maxRunsPerTask);if(G==="exhausted")throw _p($,"task_quota_blocked",Z,{phase:"claim",reason:Y.exhaustedReason,billing_mode:ld0(Y.periodKey),limit:Y.limit}),new tX(Y.exhaustedReason);if(G==="runs_exhausted")throw _p($,"task_quota_blocked",Z,{phase:"claim",reason:"runs_exhausted"}),new tX("runs_exhausted");if(G==="claimed")_p($,"task_quota_claimed",Z,{billing_mode:ld0(Y.periodKey),period_key:Y.periodKey,limit:Y.limit});return G}async function K0$($,Z,X,Q){if(Q==="skipped")return;await $.rollbackTaskClaim(Z,X,{releaseSlot:Q==="claimed"}).catch((Y)=>console.error("[task-quota] rollback failed (stays charged)",Y))}async function F0$($,Z){let X=await $.storage.organizationBilling.taskClaim(Z);return!!X&&X.state!=="released"}async function H0$($,Z,X){if(await $.releaseTaskClaim(Z,X).catch((Y)=>{return console.error("[task-quota] refund failed (stays charged)",Y),!1}))yY({event:"task_quota_refunded",organizationId:Z,properties:{task_id:X}})}var O14="[SUBSCRIPTION_REQUIRED]",D14,tX;var sG=D(()=>{C6();C4();R$();D14={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"};tX=class tX extends Error{reason;constructor($){super(`${O14} ${D14[$]}`);this.reason=$;this.name="TaskQuotaError"}}});import{z as yH}from"zod";var md0;var N0$=D(()=>{M0();sG();md0=u({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:yH.object({}),outputSchema:yH.object({enforced:yH.boolean(),billingStatus:yH.string(),subscribed:yH.boolean(),hasBillingAccount:yH.boolean(),used:yH.number(),limit:yH.number(),currentPeriodEnd:yH.string().datetime().nullable()}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=t(Z),Q=vp(),Y=await Z.storage.organizationBilling.getBilling(X.id),G=TZ0(Y,Q),J=await Z.storage.organizationBilling.countTaskClaims(X.id,G.periodKey);return{enforced:Q.enforced,billingStatus:Y?.status??"none",subscribed:dd0(Y),hasBillingAccount:!!Y?.stripeCustomerId,used:J,limit:G.limit,currentPeriodEnd:Y?.currentPeriodEnd?.toISOString()??null}}})});var U0$=D(()=>{Re1();Ie1();qe1();Me1();ke1();Se1();Ce1();ve1();be1();xe1();ge1();le1();de1();me1();ie1();pe1();ne1();$0$();Z0$();N0$()});function jK($){if($==null)return"unknown error";if(typeof $==="string")return $;if($ instanceof Error)return $.message;return JSON.stringify($)}function RZ0($){if($===null||typeof $==="string"||typeof $==="number"||typeof $==="boolean")return!0;if(Array.isArray($))return $.every(RZ0);if(typeof $==="object")return Object.entries($).every(([Z,X])=>typeof Z==="string"&&(X===void 0||RZ0(X)));return!1}function id0($){return Array.isArray($)&&$.every(RZ0)}function fp($){return $!=null&&typeof $==="object"&&Object.entries($).every(([Z,X])=>typeof Z==="string"&&(X===void 0||RZ0(X)))}var c0$="vercel.ai.error",w14,B0$,O0$,J1,l0$="AI_APICallError",d0$,E14,D0$,L0$,Q4,m0$="AI_EmptyResponseBodyError",i0$,j14,w0$,E0$,IZ0,p0$="AI_InvalidArgumentError",n0$,z14,j0$,z0$,NO,t0$="AI_InvalidPromptError",o0$,P14,P0$,A0$,eG,r0$="AI_InvalidResponseDataError",a0$,A14,T0$,R0$,Hy,s0$="AI_JSONParseError",e0$,T14,I0$,q0$,gH,$1$="AI_LoadAPIKeyError",Z1$,R14,M0$,k0$,PE,X1$="AI_LoadSettingError",Q1$,I14,V0$,S0$,Y1$,G1$="AI_NoContentGeneratedError",J1$,q14,C0$,_0$,W1$,K1$="AI_NoSuchModelError",F1$,M14,v0$,f0$,c5,H1$="AI_TooManyEmbeddingValuesForCallError",N1$,k14,b0$,x0$,Ny,U1$="AI_TypeValidationError",B1$,V14,y0$,g0$,O5,O1$="AI_UnsupportedFunctionalityError",D1$,S14,h0$,u0$,v4;var a1=D(()=>{w14=Symbol.for(c0$),J1=class $ extends(O0$=Error,B0$=w14,O0$){constructor({name:Z,message:X,cause:Q}){super(X);this[B0$]=!0,this.name=Z,this.cause=Q}static isInstance(Z){return $.hasMarker(Z,c0$)}static hasMarker(Z,X){let Q=Symbol.for(X);return Z!=null&&typeof Z==="object"&&Q in Z&&typeof Z[Q]==="boolean"&&Z[Q]===!0}},d0$=`vercel.ai.error.${l0$}`,E14=Symbol.for(d0$),Q4=class extends(L0$=J1,D0$=E14,L0$){constructor({message:$,url:Z,requestBodyValues:X,statusCode:Q,responseHeaders:Y,responseBody:G,cause:J,isRetryable:W=Q!=null&&(Q===408||Q===409||Q===429||Q>=500),data:K}){super({name:l0$,message:$,cause:J});this[D0$]=!0,this.url=Z,this.requestBodyValues=X,this.statusCode=Q,this.responseHeaders=Y,this.responseBody=G,this.isRetryable=W,this.data=K}static isInstance($){return J1.hasMarker($,d0$)}},i0$=`vercel.ai.error.${m0$}`,j14=Symbol.for(i0$),IZ0=class extends(E0$=J1,w0$=j14,E0$){constructor({message:$="Empty response body"}={}){super({name:m0$,message:$});this[w0$]=!0}static isInstance($){return J1.hasMarker($,i0$)}};n0$=`vercel.ai.error.${p0$}`,z14=Symbol.for(n0$),NO=class extends(z0$=J1,j0$=z14,z0$){constructor({message:$,cause:Z,argument:X}){super({name:p0$,message:$,cause:Z});this[j0$]=!0,this.argument=X}static isInstance($){return J1.hasMarker($,n0$)}},o0$=`vercel.ai.error.${t0$}`,P14=Symbol.for(o0$),eG=class extends(A0$=J1,P0$=P14,A0$){constructor({prompt:$,message:Z,cause:X}){super({name:t0$,message:`Invalid prompt: ${Z}`,cause:X});this[P0$]=!0,this.prompt=$}static isInstance($){return J1.hasMarker($,o0$)}},a0$=`vercel.ai.error.${r0$}`,A14=Symbol.for(a0$),Hy=class extends(R0$=J1,T0$=A14,R0$){constructor({data:$,message:Z=`Invalid response data: ${JSON.stringify($)}.`}){super({name:r0$,message:Z});this[T0$]=!0,this.data=$}static isInstance($){return J1.hasMarker($,a0$)}},e0$=`vercel.ai.error.${s0$}`,T14=Symbol.for(e0$),gH=class extends(q0$=J1,I0$=T14,q0$){constructor({text:$,cause:Z}){super({name:s0$,message:`JSON parsing failed: Text: ${$}.
|
|
891
|
+
`.execute($)).rows[0]?.exists)await _4`CREATE ROLE ${_4.id(X)} NOLOGIN`.execute($);await _4`GRANT ${_4.id(X)} TO CURRENT_USER`.execute($),await _4`GRANT USAGE, CREATE ON SCHEMA ${_4.id(Z)} TO ${_4.id(X)}`.execute($),await _4`GRANT ALL ON ALL TABLES IN SCHEMA ${_4.id(Z)} TO ${_4.id(X)}`.execute($),await _4`GRANT ALL ON ALL SEQUENCES IN SCHEMA ${_4.id(Z)} TO ${_4.id(X)}`.execute($),await _4`ALTER DEFAULT PRIVILEGES IN SCHEMA ${_4.id(Z)} GRANT ALL ON TABLES TO ${_4.id(X)}`.execute($),await _4`ALTER DEFAULT PRIVILEGES IN SCHEMA ${_4.id(Z)} GRANT ALL ON SEQUENCES TO ${_4.id(X)}`.execute($),await _4`REVOKE ALL ON SCHEMA public FROM ${_4.id(X)}`.execute($)}async function w04($,Z,X,Q){try{return await $.transaction().execute(async(Y)=>{return await _4`SET LOCAL ROLE ${_4.id(X)}`.execute(Y),await _4`SET LOCAL search_path TO ${_4.id(Z)}`.execute(Y),await _4.raw(Q).execute(Y)})}catch(Y){if(D04(Y))return await L04($,Z,X),await $.transaction().execute(async(G)=>{return await _4`SET LOCAL ROLE ${_4.id(X)}`.execute(G),await _4`SET LOCAL search_path TO ${_4.id(Z)}`.execute(G),await _4.raw(Q).execute(G)});throw Y}}var H04,U04,ps1;var ns1=D(()=>{M0();H04=OK.object({results:OK.array(OK.unknown()).optional(),success:OK.boolean().optional()});U04=OK.object({sql:OK.string().describe("The SQL query to run"),params:OK.array(OK.unknown()).describe("The parameters to pass to the SQL query").optional()});ps1=u({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:U04,outputSchema:OK.object({result:OK.array(H04)}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=N04($.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 Q=B04(Z.connectionId),Y=O04(Z.connectionId);return{result:[{results:(await w04(Z.db,Q,Y,X)).rows,success:!0}]}}})});function JZ0($){let Z=$.access.getRole();if(!n7(Z))throw new RH("Only organization owners and admins can change org-wide pin status")}var vl0=D(()=>{SQ();ow()});async function WZ0($,Z,X){let Q=[...new Set(X)],Y=await Promise.all(Q.map((J)=>$.storage.connections.findById(J,Z))),G=Q.filter((J,W)=>!Y[W]);if(G.length>0)throw Error(`Connection not found: ${G.join(", ")}`)}function CH($){return $.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")}function KZ0($){let Z=2166136261;for(let X=0;X<$.length;X++)Z=Math.imul(Z^$.charCodeAt(X),16777619);return`a${(Z>>>0).toString(36).padStart(6,"0").slice(-6)}`}function Ep($){if($&&typeof $==="object"&&"gatewayClientId"in $&&typeof $.gatewayClientId==="string")return $.gatewayClientId;return}function jp($,Z){if(!Z)return $;let X=`${KZ0(Z)}_`;return $.startsWith(X)?$.slice(X.length):$}function j04($){return $.split(/[-_]/).map((Z)=>Z?Z.charAt(0).toUpperCase()+Z.slice(1):Z).join(" ")}var Jy;var ts1=D(()=>{nW();Jy=class Jy extends x9{static MAX_PAGES_PER_CLIENT=1000;clients;slugToKey=new Map;resolvedClients=new Map;toolsCache=null;resourcesCache=null;resourceTemplatesCache=null;promptsCache=null;resourceRouteMap=new Map;constructor($,Z){super(Z?.clientInfo??{name:"gateway-client",version:"1.0.0"},{capabilities:Z?.capabilities});this.clients=$;for(let X of Object.keys($)){let Q=KZ0(X);if(this.slugToKey.has(Q))throw Error(`GatewayClient: duplicate namespace code "${Q}" from keys "${this.slugToKey.get(Q)}" and "${X}"`);this.slugToKey.set(Q,X)}}namespace($,Z){return`${KZ0($)}_${Z}`}async resolveToolTarget($){let Z=$.indexOf("_");if(Z!==-1){let Q=$.slice(0,Z),Y=this.slugToKey.get(Q);if(Y)return[Y,$.slice(Z+1)]}let{tools:X}=await this.listTools();for(let Q of X){let Y=Ep(Q._meta);if(!Y)continue;if(jp(Q.name,Y)===$)return[Y,$]}if(Z===-1)throw Error(`GatewayClient: could not resolve tool "${$}" \u2014 no namespace prefix and not found in any client`);throw Error(`GatewayClient: unknown namespace "${$.slice(0,Z)}" in "${$}" and not found by original name in any client`)}async resolvePromptTarget($){let Z=$.indexOf("_");if(Z!==-1){let Q=$.slice(0,Z),Y=this.slugToKey.get(Q);if(Y)return[Y,$.slice(Z+1)]}let{prompts:X}=await this.listPrompts();for(let Q of X){let Y=Ep(Q._meta);if(!Y)continue;if(jp(Q.name,Y)===$)return[Y,$]}if(Z===-1)throw Error(`GatewayClient: could not resolve prompt "${$}" \u2014 no namespace prefix and not found in any client`);throw Error(`GatewayClient: unknown namespace "${$.slice(0,Z)}" in "${$}" and not found by original name in any client`)}resolveClient($){let Z=this.resolvedClients.get($);if(Z)return Z;let X=this.clients[$];if(!X)return Promise.reject(Error(`GatewayClient: unknown client key "${$}"`));let Q=X.client,Y;try{Y=typeof Q==="function"?Promise.resolve(Q()):Promise.resolve(Q)}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,X){try{let Q=await this.resolveClient($);return await Z(Q)}catch(Q){return console.warn(`GatewayClient: skipping ${X} from client "${$}" \u2014 ${Q?.message??Q}`),[]}}async paginate($,Z,X){let Q=[],Y,G=0;do{let J=await X(Y);Q.push(...J.items),Y=J.nextCursor,G++}while(Y&&G<Jy.MAX_PAGES_PER_CLIENT);if(Y)console.warn(`GatewayClient: client "${$}" exceeded ${Jy.MAX_PAGES_PER_CLIENT} pages listing ${Z} \u2014 truncating`);return Q}fetchAllTools($,Z){return this.paginate(Z,"tools",async(X)=>{let Q=await $.listTools(X?{cursor:X}:void 0);return{items:Q.tools,nextCursor:Q.nextCursor}})}fetchAllResources($,Z){return this.paginate(Z,"resources",async(X)=>{let Q=await $.listResources(X?{cursor:X}:void 0);return{items:Q.resources,nextCursor:Q.nextCursor}})}fetchAllResourceTemplates($,Z){return this.paginate(Z,"resource templates",async(X)=>{let Q=await $.listResourceTemplates(X?{cursor:X}:void 0);return{items:Q.resourceTemplates,nextCursor:Q.nextCursor}})}fetchAllPrompts($,Z){return this.paginate(Z,"prompts",async(X)=>{let Q=await $.listPrompts(X?{cursor:X}:void 0);return{items:Q.prompts,nextCursor:Q.nextCursor}})}listTools($,Z){if(!this.toolsCache)this.toolsCache=this.aggregateTools();return this.toolsCache}async aggregateTools(){let $=[];for(let[Z,X]of Object.entries(this.clients)){let Q=await this.listFromClient(Z,(J)=>this.fetchAllTools(J,Z),"tools"),Y=X.tools,G=Y?new Set(Y):null;for(let J of Q){if(G&&!G.has(J.name))continue;$.push({...J,name:this.namespace(Z,J.name),_meta:{...J._meta??{},gatewayClientId:Z}})}}return{tools:$}}listResources($,Z){if(!this.resourcesCache)this.resourcesCache=this.aggregateResources();return this.resourcesCache}async aggregateResources(){let $=new Set,Z=[],X=new Map;for(let[Q,Y]of Object.entries(this.clients)){let G=await this.listFromClient(Q,(K)=>this.fetchAllResources(K,Q),"resources"),J=Y.resources,W=J?new Set(J):null;for(let K of G){if(W&&!W.has(K.uri)&&!(K.name&&W.has(K.name)))continue;if($.has(K.uri)){console.warn(`GatewayClient: duplicate resource "${K.uri}" from client "${Q}" \u2014 skipping`);continue}$.add(K.uri),X.set(K.uri,Q),Z.push({...K,_meta:{...K._meta??{},gatewayClientId:Q}})}}return this.resourceRouteMap=X,{resources:Z}}listResourceTemplates($,Z){if(!this.resourceTemplatesCache)this.resourceTemplatesCache=this.aggregateResourceTemplates();return this.resourceTemplatesCache}async aggregateResourceTemplates(){let $=new Set,Z=[];for(let[X,Q]of Object.entries(this.clients)){let Y=await this.listFromClient(X,(G)=>this.fetchAllResourceTemplates(G,X),"resource templates");for(let G of Y){if($.has(G.uriTemplate)){console.warn(`GatewayClient: duplicate resource template "${G.uriTemplate}" from client "${X}" \u2014 skipping`);continue}$.add(G.uriTemplate),Z.push({...G,_meta:{...G._meta??{},gatewayClientId:X}})}}return{resourceTemplates:Z}}listPrompts($,Z){if(!this.promptsCache)this.promptsCache=this.aggregatePrompts();return this.promptsCache}async aggregatePrompts(){let $=[];for(let[Z,X]of Object.entries(this.clients)){let Q=await this.listFromClient(Z,(J)=>this.fetchAllPrompts(J,Z),"prompts"),Y=X.prompts,G=Y?new Set(Y):null;for(let J of Q){if(G&&!G.has(J.name))continue;$.push({...J,name:this.namespace(Z,J.name),title:J.title??j04(J.name),_meta:{...J._meta??{},gatewayClientId:Z}})}}return{prompts:$}}async callTool($,Z,X){let[Q,Y]=await this.resolveToolTarget($.name);return(await this.resolveClient(Q)).callTool({...$,name:Y},Z,X)}async readResource($,Z){let X=await this.resolveResourceRoute($.uri);return(await this.resolveClient(X)).readResource($)}async getPrompt($,Z){let[X,Q]=await this.resolvePromptTarget($.name);return(await this.resolveClient(X)).getPrompt({...$,name:Q})}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((X)=>X.close()).catch(()=>{}));await Promise.allSettled($),await super.close()}}});var FZ0=D(()=>{ts1()});function bl0($){return CH($)}function P04($,Z){let X=CH(Z)||"prompt";return`${String($).padStart(z04,"0")}-${X}`}async function xl0($,Z,X){try{await $.delete(HZ0,bl0(Z),{actor:X})}catch(Q){console.error("[agent-prompts] failed to delete prompts",{agentId:Z,err:Q})}}async function NZ0($,Z,X,Q){let Y=bl0(Z);await xl0($,Z,X),await Promise.all(Q.slice(0,fl0).map(async(G,J)=>{let W=P04(J,G.title),K={name:W,title:G.title,description:G.description,text:G.text};try{await $.write(HZ0,`${Y}/${W}.json`,JSON.stringify(K),{actor:X,contentType:"application/json"})}catch(F){console.error("[agent-prompts] failed to seed prompt",{agentId:Z,name:W,err:F})}}))}async function os1($,Z){let X=bl0(Z),Q;try{Q=await $.listDir(HZ0,X)}catch{return[]}let Y=Q.filter((J)=>J.kind==="file"&&J.path.endsWith(".json")).slice(0,fl0),G=[];for(let J of Y)try{let W=await $.read(HZ0,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 HZ0="agent-prompts",fl0=20,z04;var zp=D(()=>{FZ0();z04=String(fl0-1).length});function Wy($){if(!$)return $;let Z={...$};return delete Z.sandboxMap,Z}import{z as ss1}from"zod";function A04(){let $=rs1[Math.floor(Math.random()*rs1.length)];return`icon://${as1[Math.floor(Math.random()*as1.length)]}?color=${$}`}var rs1,as1,T04,R04,yl0;var es1=D(()=>{M0();pB();vl0();zp();rs1=["red","orange","amber","yellow","lime","green","emerald","cyan","sky","blue","indigo","violet","purple","fuchsia","pink","rose"],as1=["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"];T04=ss1.object({data:V80.describe("Data for the new virtual MCP")}),R04=ss1.object({item:c7.describe("The created virtual MCP entity")}),yl0=u({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:T04,outputSchema:R04,handler:async($,Z)=>{o(Z);let X=t(Z);await Z.access.check();let Q=o0(Z);if(!Q)throw Error("User ID required to create virtual MCP");if($.data.pinned===!0)JZ0(Z);let{prompts:Y,metadata:G,...J}=$.data,W=Wy(G);if(J.connections.length>0)await WZ0(Z,X.id,J.connections.map((H)=>H.connection_id));let K={...J,metadata:W,icon:J.icon??A04()},F=await Z.storage.virtualMcps.create(X.id,Q,K);if(Y?.length&&Z.orgFs&&F.id)await NZ0(Z.orgFs,F.id,Q,Y);return{item:F}}})});function I04($){let Z=[],X=0;while(X<$.length){let Q=$[X];if(Q==="%")Z.push(".*");else if(Q==="_")Z.push(".");else if(/[.*+?^${}()|[\]\\]/.test(Q))Z.push("\\"+Q);else Z.push(Q);X++}return Z.join("")}function $O($){return typeof $==="string"||typeof $==="number"}function gl0($,Z){let X=Z.split("."),Q=$;for(let Y of X){if(Q==null||typeof Q!=="object")return;Q=Q[Y]}return Q}function q04($,Z){return $.connections.some((X)=>X.connection_id===Z)}function UZ0($,Z){if("conditions"in Z){let{operator:W,conditions:K}=Z;switch(W){case"and":return K.every((F)=>UZ0($,F));case"or":return K.some((F)=>UZ0($,F));case"not":return!K.every((F)=>UZ0($,F));default:return!0}}let{field:X,operator:Q,value:Y}=Z,G=X.join(".");if(G==="connection_id"){if(Q!=="eq"||typeof Y!=="string")return!1;return q04($,Y)}let J=gl0($,G);switch(Q){case"eq":return J===Y;case"gt":return $O(J)&&$O(Y)&&J>Y;case"gte":return $O(J)&&$O(Y)&&J>=Y;case"lt":return $O(J)&&$O(Y)&&J<Y;case"lte":return $O(J)&&$O(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=I04(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 M04($,Z){return[...$].sort((X,Q)=>{for(let Y of Z){let G=Y.field.join("."),J=gl0(X,G),W=gl0(Q,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 k04,V04,hl0;var $e1=D(()=>{nG();M0();pB();k04=V3,V04=VH(c7),hl0=u({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:k04,outputSchema:V04,handler:async($,Z)=>{await Z.access.check();let X=t(Z),Q=$.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=Q?await Z.storage.virtualMcps.listByConnectionId(X.id,Q):await Z.storage.virtualMcps.list(X.id,Y!==void 0?{pinnedOnly:Y}:void 0);if($.where)J=J.filter((U)=>UZ0(U,$.where));if($.orderBy&&$.orderBy.length>0)J=M04(J,$.orderBy);let W=J.length,K=$.offset??0,F=$.limit??100,H=J.slice(K,K+F),N=K+F<W;return{items:H,totalCount:W,hasMore:N}}})});import{z as ul0}from"zod";var S04,C04,cl0;var Ze1=D(()=>{M0();pB();S04=ul0.object({id:ul0.string().describe("ID of the virtual MCP to retrieve")}),C04=ul0.object({item:c7.nullable().describe("The retrieved virtual MCP, or null if not found")}),cl0=u({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:S04,outputSchema:C04,handler:async($,Z)=>{o(Z);let X=t(Z);await Z.access.check();let Q=await Z.storage.virtualMcps.findById($.id);if(Q&&Q.organization_id!==X.id)return{item:null};if(!Q)return{item:null};return{item:Q}}})});function rG($){return ll0.test($)}function Xe1($){let Z=(X)=>typeof X==="string"?X.trim().toLowerCase():"";return Z($?.metadata?.siteSlug)||Z($?.title)||null}var ll0;var ZO=D(()=>{ll0=/^[a-z0-9][a-z0-9-]{0,59}$/});function Qe1($){let{nextTitle:Z,currentTitle:X,currentSiteSlug:Q}=$;if(Q?.trim())return null;if(Z===void 0||Z===X)return null;let Y=X?.trim().toLowerCase()??"";return rG(Y)?Y:null}var Ye1=D(()=>{ZO()});import{z as dl0}from"zod";var _04,v04,ml0;var Ge1=D(()=>{M0();zp();pB();vl0();Ye1();_04=dl0.object({id:dl0.string().describe("ID of the virtual MCP to update"),data:S80.describe("Partial virtual MCP data to update")}),v04=dl0.object({item:c7.describe("The updated virtual MCP entity")}),ml0=u({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:_04,outputSchema:v04,handler:async($,Z)=>{o(Z);let X=t(Z);await Z.access.check();let Q=o0(Z);if(!Q)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!==X.id)throw Error(`Virtual MCP not found: ${$.id}`);let{prompts:G,metadata:J,...W}=$.data,K=Wy(J);if(K&&Y.metadata)K={...Y.metadata,...K};else if(K===null&&Y.metadata?.sandboxMap)K={sandboxMap:Y.metadata.sandboxMap};let F={...W,...J!==void 0?{metadata:K}:{}},H=Qe1({nextTitle:F.title,currentTitle:Y.title,currentSiteSlug:Y.metadata?.siteSlug});if(H)F.metadata={...Y.metadata,...F.metadata,siteSlug:H};if(F.pinned!==void 0&&F.pinned!==Y.pinned)JZ0(Z);if(F.connections?.length)await WZ0(Z,X.id,F.connections.map((U)=>U.connection_id));let N=await Z.storage.virtualMcps.update($.id,Q,F);if(G!==void 0&&Z.orgFs)await NZ0(Z.orgFs,$.id,Q,G);return{item:N}}})});function f04($){if(!$)return!1;let Z=pl0.join("|");return new RegExp(`permission\\s+"?(?:${Z})"?\\s+is not allowed`,"i").test($)||/permissions exceed what the github app/i.test($)}function We1($){let Z={...$};for(let X of pl0)Z[X]="read";return Z}async function Ke1($,Z){let X={...Z};for(;;){let Q=await $(X);if(!Q.isError)return{result:Q,grantedPermissions:X};let Y=Q.content?.find((K)=>K.type==="text")?.text,G=pl0.find((K)=>(K in X));if(!G||!f04(Y))return{result:Q,grantedPermissions:X};let{[G]:J,...W}=X;X=W}}function b04($){if(!$||typeof $!=="object"||Array.isArray($))return Je1;let Z=$;if(Object.values(Z).some((X)=>typeof X!=="string"))return Je1;return Z}function x04($){if(typeof $!=="number"||!Number.isFinite($)||!Number.isInteger($)||$<=0)return;return $}function M5($){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 X=x04(Z.repositoryId);return{sourceConnectionId:typeof Z.sourceConnectionId==="string"?Z.sourceConnectionId:void 0,installationId:Z.installationId,repositoryId:X,owner:Z.owner,repo:Z.repo,permissions:b04(Z.permissions),grantProvider:Z.grantProvider==="github-mcp"?"github-mcp":void 0}}function EE($){return $.metadata?.orgShared===!0}function Fe1($){let Z=new Set,X=[];for(let Q of $??[]){if(Q.status!=="active")continue;let Y=M5(Q);if(Y===null)continue;let G=il0(Y.owner,Y.repo);if(Z.has(G))continue;Z.add(G),X.push(`${Y.owner}/${Y.repo}`)}return X}function BZ0($,Z,X){let Q=il0(Z,X),Y=($??[]).filter((G)=>{if(G.status&&G.status!=="active")return!1;let J=M5(G);return J!==null&&il0(J.owner,J.repo)===Q});return Y.find(EE)??Y[0]??null}var Je1,pl0,il0=($,Z)=>`${$}/${Z}`.toLowerCase();var vQ=D(()=>{Je1={contents:"write",metadata:"read",pull_requests:"write",issues:"write",checks:"read",deployments:"read"},pl0=["deployments","checks"]});function He1($){return yG($)!==null||$60($)!==null}var Ne1=D(()=>{_8()});import{z as nl0}from"zod";var y04,g04,tl0;var Ue1=D(()=>{vQ();oG();M0();zp();pB();Ne1();y04=nl0.object({id:nl0.string().describe("ID of the virtual MCP to delete")}),g04=nl0.object({item:c7.describe("The deleted virtual MCP entity")}),tl0=u({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:y04,outputSchema:g04,handler:async($,Z)=>{o(Z);let X=t(Z);if(await Z.access.check(),He1($.id))throw Error(`Virtual MCP not found: ${$.id}`);let Q=await Z.storage.virtualMcps.findById($.id);if(!Q)throw Error(`Virtual MCP not found: ${$.id}`);if(Q.organization_id!==X.id)throw Error(`Virtual MCP not found: ${$.id}`);await Z.storage.virtualMcps.delete($.id);try{if((await Z.storage.organizationSettings.get(X.id))?.main_agent_id===$.id)await Z.storage.organizationSettings.upsert(X.id,{main_agent_id:null})}catch(G){console.error("[VIRTUAL_MCP_DELETE] failed to clear main agent pointer",{id:$.id,error:G.message})}if(Z.orgFs)await xl0(Z.orgFs,$.id,o0(Z)??"system");let Y=Q.metadata?.githubRepo?.connectionId;if(Y)try{let G=await Z.storage.connections.findById(Y,X.id),J=G&&(EE(G)||(await Z.storage.virtualMcps.listByConnectionId(X.id,Y)).length>0||await Z.storage.connections.isReferencedByThread(Y));if(G&&M5(G)&&!J){let K=await new m6(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:Q}}})});import{z as fQ}from"zod";var h04,ol0;var Be1=D(()=>{M0();h04=fQ.object({id:fQ.string(),virtualMcpId:fQ.string(),pluginId:fQ.string(),connectionId:fQ.string().nullable(),settings:fQ.record(fQ.string(),fQ.unknown()).nullable(),createdAt:fQ.string(),updatedAt:fQ.string()}),ol0=u({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:fQ.object({virtualMcpId:fQ.string().describe("Virtual MCP ID"),pluginId:fQ.string().describe("Plugin ID")}),outputSchema:fQ.object({config:h04.nullable()}),handler:async($,Z)=>{o(Z);let X=t(Z);await Z.access.check();let{virtualMcpId:Q,pluginId:Y}=$,G=await Z.storage.connections.findById(Q);if(!G||G.organization_id!==X.id)return{config:null};if(G.connection_type!=="VIRTUAL")return{config:null};let J=await Z.storage.virtualMcpPluginConfigs.get(Q,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 xZ}from"zod";var u04,rl0;var Oe1=D(()=>{M0();Xy();$9();u04=xZ.object({id:xZ.string(),virtualMcpId:xZ.string(),pluginId:xZ.string(),connectionId:xZ.string().nullable(),settings:xZ.record(xZ.string(),xZ.unknown()).nullable(),createdAt:xZ.string(),updatedAt:xZ.string()}),rl0=u({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:xZ.object({virtualMcpId:xZ.string().describe("Virtual MCP ID"),pluginId:xZ.string().describe("Plugin ID"),connectionId:xZ.string().nullable().optional().describe("MCP connection to bind"),settings:xZ.record(xZ.string(),xZ.unknown()).nullable().optional().describe("Plugin-specific settings")}),outputSchema:xZ.object({config:u04}),handler:async($,Z)=>{o(Z);let X=t(Z);await Z.access.check();let{virtualMcpId:Q,pluginId:Y,connectionId:G,settings:J}=$,W=o0(Z),K=await Z.storage.connections.findById(Q);if(!K)throw Error(`Connection not found: ${Q}`);if(K.organization_id!==X.id)throw Error(`Connection not found: ${Q}`);if(K.connection_type!=="VIRTUAL")throw Error(`Connection not found: ${Q}`);let F=G?await Z.storage.connections.findById(G):null;if(G&&F&&F.organization_id!==X.id)throw Error(`Connection not found: ${G}`);if(G&&K.organization_id&&!F&&tG()&&$Z0(G,K.organization_id)){if(!W)throw Error("User ID required to create dev-assets connection");let N=Zy(K.organization_id,e5());await Z.storage.connections.create({...N,organization_id:K.organization_id,created_by:W})}else if(G&&!F)throw Error(`Connection not found: ${G}`);let H=await Z.storage.virtualMcpPluginConfigs.upsert(Q,Y,{connectionId:G,settings:J});return{config:{id:H.id,virtualMcpId:H.virtualMcpId,pluginId:H.pluginId,connectionId:H.connectionId,settings:H.settings,createdAt:H.createdAt instanceof Date?H.createdAt.toISOString():H.createdAt,updatedAt:H.updatedAt instanceof Date?H.updatedAt.toISOString():H.updatedAt}}}})});import{z as iX}from"zod";var c04,al0;var De1=D(()=>{M0();pB();c04=iX.object({connectionId:iX.string(),toolName:iX.string(),label:iX.string(),icon:iX.string().nullable().optional()}),al0=u({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:iX.object({virtualMcpId:iX.string().describe("Virtual MCP ID"),pinnedViews:iX.array(c04).describe("Pinned views to set for the virtual MCP sidebar"),layout:iX.object({defaultMainView:iX.object({type:iX.string(),id:iX.string().optional(),toolName:iX.string().optional()}).nullable().optional(),chatDefaultOpen:iX.boolean().nullable().optional()}).optional()}),outputSchema:iX.object({item:c7.nullable()}),handler:async($,Z)=>{o(Z);let X=t(Z);await Z.access.check();let{virtualMcpId:Q,pinnedViews:Y,layout:G}=$,J=o0(Z),W=await Z.storage.virtualMcps.findById(Q);if(!W)throw Error(`Virtual MCP not found: ${Q}`);if(W.organization_id!==X.id)throw Error(`Virtual MCP not found: ${Q}`);let K=W.metadata?.ui??{},F={...K,pinnedViews:Y.length>0?Y:null,layout:G??K.layout??null};return{item:await Z.storage.virtualMcps.update(Q,J??"system",{metadata:{...W.metadata,ui:F}})}}})});import{z as _H}from"zod";var l04,d04,sl0;var Le1=D(()=>{M0();l04=_H.object({ids:_H.array(_H.string()).max(1000).describe("Virtual MCP ids to look up")}),d04=_H.object({items:_H.array(_H.object({id:_H.string(),last_used_at:_H.string().optional(),last_used_by:_H.string().optional()}))}),sl0=u({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:l04,outputSchema:d04,handler:async($,Z)=>{o(Z),t(Z),await Z.access.check();let X=await Z.storage.threads.findLastUsedByVirtualMcpIds($.ids);return{items:$.ids.map((Q)=>({id:Q,last_used_at:X.get(Q)?.last_used_at,last_used_by:X.get(Q)?.last_used_by}))}}})});var we1=D(()=>{es1();$e1();Ze1();Ge1();Ue1();Be1();Oe1();De1();Le1()});import{z as r7}from"zod";var el0;var Ee1=D(()=>{I6();M0();el0=u({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:r7.object({startDate:r7.string().datetime().optional().describe("Filter by start date (ISO 8601 datetime string)"),endDate:r7.string().datetime().optional().describe("Filter by end date (ISO 8601 datetime string)"),virtualMcpIds:r7.array(r7.string()).max(100).optional().describe("Filter by specific agent (Virtual MCP) IDs"),excludeConnectionIds:r7.array(r7.string()).max(100).optional().describe("Exclude tool calls from these connection IDs"),limit:r7.number().int().min(1).max(1000).optional().describe("Max number of (agent, tool) cells to return")}),outputSchema:r7.object({cells:r7.array(r7.object({virtualMcpId:r7.string().nullable(),toolName:r7.string(),calls:r7.number(),errors:r7.number(),outputSize:r7.number().describe("Sum of tool-output character length \u2014 a proxy for context weight, not LLM token count")}))}),handler:async($,Z)=>{let X=t(Z);return await Z.access.check(),await HQ(),Z.storage.monitoring.queryToolCallHeatmap({organizationId:X.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 B5}from"zod";var $d0;var je1=D(()=>{I6();M0();$d0=u({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:B5.object({id:B5.string().describe("Log ID to fetch")}),outputSchema:B5.object({log:B5.object({id:B5.string().optional(),organizationId:B5.string(),connectionId:B5.string(),toolName:B5.string(),input:B5.record(B5.string(),B5.unknown()),output:B5.record(B5.string(),B5.unknown()),isError:B5.boolean(),errorMessage:B5.string().nullish(),durationMs:B5.number(),timestamp:B5.string(),userId:B5.string().nullish(),requestId:B5.string(),userAgent:B5.string().nullish(),virtualMcpId:B5.string().nullish(),properties:B5.record(B5.string(),B5.string()).nullish()}).nullable().describe("The monitoring log, or null if not found")}),handler:async($,Z)=>{await Z.access.check(),await HQ();let X=t(Z),Q=await Z.storage.monitoring.getById(X.id,$.id);if(!Q)return{log:null};return{log:{...Q,timestamp:Q.timestamp instanceof Date?Q.timestamp.toISOString():Q.timestamp}}}})});import{z as B8}from"zod";var i04,Zd0;var ze1=D(()=>{I6();M0();i04=B8.object({id:B8.string().optional().describe("Unique log identifier"),organizationId:B8.string().describe("Organization ID"),connectionId:B8.string().describe("Connection ID"),toolName:B8.string().describe("Name of the tool that was called"),isError:B8.boolean().describe("Whether the call resulted in an error"),errorMessage:B8.string().nullish().describe("Error message if applicable"),durationMs:B8.number().describe("Call duration in milliseconds"),timestamp:B8.string().describe("ISO 8601 timestamp of the call"),userId:B8.string().nullish().describe("User who triggered the call"),requestId:B8.string().describe("Unique request identifier"),userAgent:B8.string().nullish().describe("Client identifier (x-studio-client header)"),virtualMcpId:B8.string().nullish().describe("Virtual MCP (Agent) ID if routed through an agent"),properties:B8.record(B8.string(),B8.string()).nullish().describe("Custom key-value metadata attached to the log")}),Zd0=u({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:B8.object({connectionId:B8.string().optional().describe("Filter by connection ID"),excludeConnectionIds:B8.array(B8.string()).optional().describe("Exclude logs from these connection IDs (e.g. system connections)"),virtualMcpId:B8.string().optional().describe("Filter by Virtual MCP (Agent) ID"),toolName:B8.string().optional().describe("Filter by tool name"),isError:B8.boolean().optional().describe("Filter by error status"),startDate:B8.string().datetime().optional().describe("Filter by start date (ISO 8601 datetime string)"),endDate:B8.string().datetime().optional().describe("Filter by end date (ISO 8601 datetime string)"),limit:B8.number().default(20).describe("Maximum number of results"),offset:B8.number().default(0).describe("Offset for pagination"),properties:B8.record(B8.string(),B8.string()).optional().describe("Filter by exact property key=value matches"),propertyKeys:B8.array(B8.string()).optional().describe("Filter by logs that have these property keys"),propertyPatterns:B8.record(B8.string(),B8.string()).optional().describe("Filter by property value patterns (SQL LIKE, use % as wildcard)"),propertyInValues:B8.record(B8.string(),B8.string()).optional().describe("Filter by exact match within comma-separated values (e.g., user_tags in 'Engineering')")}),outputSchema:B8.object({logs:B8.array(i04).describe("Array of monitoring logs"),total:B8.number().describe("Total number of logs matching filters"),offset:B8.number().describe("Current offset for pagination"),limit:B8.number().describe("Current limit for pagination")}),handler:async($,Z)=>{await Z.access.check(),await HQ();let X=t(Z),Y=$.properties||$.propertyKeys||$.propertyPatterns||$.propertyInValues?{properties:$.properties,propertyKeys:$.propertyKeys,propertyPatterns:$.propertyPatterns,propertyInValues:$.propertyInValues}:void 0,G={organizationId:X.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,...F})=>({...F,timestamp:F.timestamp instanceof Date?F.timestamp.toISOString():F.timestamp})),total:J.total,offset:$.offset,limit:$.limit}}})});import{z as J$}from"zod";var Xd0;var Pe1=D(()=>{I6();M0();Xd0=u({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:J$.object({startDate:J$.string().datetime().optional().describe("Filter by start date (ISO 8601 datetime string)"),endDate:J$.string().datetime().optional().describe("Filter by end date (ISO 8601 datetime string)"),interval:J$.string().regex(/^\d+[mhd]$/).optional().describe("Bucket interval for timeseries data (e.g. 1m, 5m, 2h, 1d). When provided, returns timeseries array."),connectionIds:J$.array(J$.string()).max(100).optional().describe("Filter by specific connection IDs (max 100)"),excludeConnectionIds:J$.array(J$.string()).max(100).optional().describe("Exclude specific connection IDs (max 100)"),toolNames:J$.array(J$.string()).max(100).optional().describe("Filter by specific tool names (max 100)"),status:J$.enum(["success","error"]).optional().describe("Filter metrics by execution status"),topN:J$.number().int().min(1).max(20).optional().describe("When provided with interval, also return top tools and their timeseries"),userIds:J$.array(J$.string()).max(100).optional().describe("Filter LLM usage by user IDs (only applied when llmUsage is true)"),llmUsage:J$.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:J$.object({totalCalls:J$.number().describe("Total number of tool calls"),errorRate:J$.number().optional().describe("Error rate as a decimal (0 to 1)"),avgDurationMs:J$.number().describe("Average call duration in milliseconds"),errorRatePercent:J$.string().optional().describe("Error rate as a percentage string"),totalErrors:J$.number().optional().describe("Total number of errors"),p50DurationMs:J$.number().optional().describe("50th percentile duration in milliseconds"),p95DurationMs:J$.number().optional().describe("95th percentile duration in milliseconds"),connectionBreakdown:J$.array(J$.object({connectionId:J$.string(),calls:J$.number(),errors:J$.number(),errorRate:J$.number(),avgDurationMs:J$.number()})).optional().describe("Per-connection metric breakdown"),totalInputTokens:J$.number().optional().describe("Total input tokens (LLM usage mode)"),totalOutputTokens:J$.number().optional().describe("Total output tokens (LLM usage mode)"),totalTokens:J$.number().optional().describe("Total tokens (LLM usage mode)"),totalCostUsd:J$.number().optional().describe("Total USD cost (LLM usage mode; only non-zero for providers that report cost)"),topTools:J$.array(J$.object({toolName:J$.string(),connectionId:J$.string().nullable(),calls:J$.number(),inputTokens:J$.number().optional(),outputTokens:J$.number().optional(),costUsd:J$.number().optional()})).optional().describe("Top tools ranked by calls"),topToolsTimeseries:J$.array(J$.object({timestamp:J$.string(),toolName:J$.string(),calls:J$.number(),errors:J$.number(),avg:J$.number(),p95:J$.number()})).optional().describe("Per-tool metric timeseries for the top tools"),timeseries:J$.array(J$.object({timestamp:J$.string(),calls:J$.number(),errors:J$.number(),errorRate:J$.number(),avg:J$.number(),p50:J$.number(),p95:J$.number(),inputTokens:J$.number().optional(),outputTokens:J$.number().optional(),totalTokens:J$.number().optional(),costUsd:J$.number().optional()})).optional().describe("Timeseries data points bucketed by interval")}),handler:async($,Z)=>{let X=t(Z);if(await Z.access.check(),await HQ(),$.interval&&$.llmUsage)return Z.storage.monitoring.queryLlmUsageStats({organizationId:X.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:X.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:X.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 Q=await Z.storage.monitoring.getStats({organizationId:X.id,startDate:$.startDate?new Date($.startDate):void 0,endDate:$.endDate?new Date($.endDate):void 0});return{...Q,errorRatePercent:(Q.errorRate*100).toFixed(2)}}})});import{z as pX}from"zod";var Qd0;var Ae1=D(()=>{I6();M0();Qd0=u({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:pX.object({threadIds:pX.array(pX.string()).min(1).max(500).describe("Thread IDs to aggregate usage for (max 500)"),connectionId:pX.string().optional().describe("LLM connection ID (defaults to 'decopilot')"),startDate:pX.string().datetime().optional().describe("Filter by start date (ISO 8601 datetime string)"),endDate:pX.string().datetime().optional().describe("Filter by end date (ISO 8601 datetime string)")}),outputSchema:pX.object({items:pX.array(pX.object({threadId:pX.string(),calls:pX.number(),inputTokens:pX.number(),outputTokens:pX.number(),totalTokens:pX.number(),costUsd:pX.number()}))}),handler:async($,Z)=>{let X=t(Z);return await Z.access.check(),await HQ(),{items:await Z.storage.monitoring.queryThreadUsage({organizationId:X.id,connectionId:$.connectionId??"decopilot",threadIds:$.threadIds,startDate:$.startDate?new Date($.startDate):void 0,endDate:$.endDate?new Date($.endDate):void 0})}}})});var Te1=D(()=>{Ee1();je1();ze1();Pe1();Ae1()});function OZ0($){return typeof $==="string"&&n04.has($.trim().toLowerCase())}var n04;var Yd0=D(()=>{n04=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 uY}from"zod";var Gd0;var Re1=D(()=>{M0();Yd0();Gd0=u({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:uY.object({slug:uY.string().min(1).max(50).regex(/^[a-z0-9-]+$/,"Slug must be lowercase alphanumeric with hyphens").refine(($)=>!OZ0($),"Slug is reserved by Studio"),name:uY.string().min(1).max(255),description:uY.string().optional()}),outputSchema:uY.object({id:uY.string(),name:uY.string(),slug:uY.string(),logo:uY.string().nullable().optional(),metadata:uY.any().optional(),createdAt:uY.string().datetime().describe("ISO 8601 timestamp"),members:uY.array(uY.any()).optional()}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=o0(Z);if(!X)throw Error("User ID required to create organization");let Q=await Z.boundAuth.organization.create({name:$.name,slug:$.slug,metadata:$.description?{description:$.description}:void 0,userId:X});if(!Q)throw Error("Failed to create organization");return{...Q,createdAt:Q.createdAt instanceof Date?Q.createdAt.toISOString():Q.createdAt}}})});import{z as DK}from"zod";var Jd0;var Ie1=D(()=>{M0();Jd0=u({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(o(Z),await Z.access.check(),!o0(Z))throw Error("User ID required to list organizations");return{organizations:(await Z.boundAuth.organization.list()).map((Q)=>({...Q,createdAt:Q.createdAt instanceof Date?Q.createdAt.toISOString():Q.createdAt}))}}})});import{z as aG}from"zod";var Wd0;var qe1=D(()=>{M0();Wd0=u({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:aG.object({}),outputSchema:aG.object({id:aG.string(),name:aG.string(),slug:aG.string(),logo:aG.string().nullable().optional(),metadata:aG.any().optional(),createdAt:aG.string().datetime().describe("ISO 8601 timestamp"),members:aG.array(aG.any()).optional(),invitations:aG.array(aG.any()).optional()}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");let Q=await Z.boundAuth.organization.get(X);if(!Q)throw Error("No active organization found");let Y=new Date,G=Q.invitations?.filter((J)=>new Date(J.expiresAt)>Y);return{...Q,invitations:G,createdAt:Q.createdAt instanceof Date?Q.createdAt.toISOString():Q.createdAt}}})});import{z as S3}from"zod";var Kd0;var Me1=D(()=>{M0();Kd0=u({name:"ORGANIZATION_UPDATE",description:"Update an organization's name or description.",annotations:{title:"Update Organization",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:S3.object({id:S3.string(),name:S3.string().min(1).max(255).optional(),description:S3.string().optional()}),outputSchema:S3.object({id:S3.string(),name:S3.string(),slug:S3.string(),logo:S3.string().nullable().optional(),metadata:S3.any().optional(),createdAt:S3.string().datetime().describe("ISO 8601 timestamp")}),handler:async($,Z)=>{if(o(Z),await Z.access.check(),$.id!==Z.organization?.id)throw Error("Organization ID does not match authenticated organization");let X={};if($.name)X.name=$.name;if($.description!==void 0)X.metadata={description:$.description};let Q=await Z.boundAuth.organization.update({organizationId:$.id,data:X});if(!Q)throw Error("Failed to update organization");return{...Q,createdAt:Q.createdAt instanceof Date?Q.createdAt.toISOString():Q.createdAt}}})});import{z as Pp}from"zod";var Fd0;var ke1=D(()=>{M0();Fd0=u({name:"ORGANIZATION_DELETE",description:"Archive an organization (soft delete).",annotations:{title:"Delete Organization",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:Pp.object({id:Pp.string()}),outputSchema:Pp.object({success:Pp.boolean(),id:Pp.string()}),handler:async($,Z)=>{if(o(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);return await Z.boundAuth.organization.update({organizationId:$.id,data:{metadata:{...X?.metadata,archived:!0,archivedAt:new Date().toISOString()}}}),{success:!0,id:$.id}}})});import{z as $$}from"zod";function nX($,Z){let X=$?.[Z];return t04.has(Z)?X!==!1:X===!0}var Ap,Tp,vH,Ve1,XO,Rp,Ip,qp,Mp,t04,QO;var JZ=D(()=>{Ap=$$.object({title:$$.string(),url:$$.string(),icon:$$.string()}),Tp=$$.object({registries:$$.record($$.string(),$$.object({enabled:$$.boolean()})).describe("Per-registry enabled/disabled state. Key is connection ID. Absent registries are treated as enabled."),blockedMcps:$$.array($$.string()).describe("List of MCP app_name or app_id values to hide from the store.")}),vH=$$.object({keyId:$$.string(),modelId:$$.string(),title:$$.string().optional()}).nullable(),Ve1=$$.enum(["fast","smart","thinking","image","web_search","deep_research"]),XO=$$.enum(["fast","smart","thinking"]),Rp=$$.object({tiers:$$.object({fast:vH,smart:vH,thinking:vH,image:vH,web_search:vH,deep_research:vH})}),Ip=$$.object({tiers:$$.object({fast:vH.optional(),smart:vH.optional(),thinking:vH.optional()})}),qp=$$.object({ids:$$.array($$.string()).describe("Ordered list of custom virtual MCP agent ids to show on the home view.")}),Mp=$$.object({demo_mode:$$.boolean().optional().describe("Curated demo org: the commerce connect modal proceeds without a configured required data source."),reports_only:$$.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."),org_board_columns:$$.boolean().optional().describe("The task board's columns are this org's own, mirrored from its tracker, rather than the set Studio ships. Off means the canonical lanes, which is the only board most orgs want."),reviewer_enabled:$$.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:$$.boolean().optional().describe("Deprecated: see reviewer_enabled."),code_reviewer_enabled:$$.boolean().optional().describe("Deprecated: see reviewer_enabled."),auto_merge:$$.boolean().optional().describe("When the Reviewer approves a task's pull request, merge it automatically instead of leaving the merge to a human. If the merge is blocked by a conflict with the base branch, hand the PR back to the Super Agent to resolve the conflict (check out the branch, merge the base, push) so it can then merge."),cheap_reviewer_model:$$.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:$$.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:$$.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:$$.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."),delivery_lanes_enabled:$$.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:$$.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.")}),t04=new Set(["reviewer_enabled","cheap_reviewer_model"]);QO=$$.object({id:$$.string().describe("Brand context ID"),name:$$.string().describe("Company name"),domain:$$.string().describe("Company domain (e.g. example.com)"),overview:$$.string().describe("Company overview / description"),logo:$$.string().nullable().optional().describe("Logo URL"),favicon:$$.string().nullable().optional().describe("Favicon URL"),ogImage:$$.string().nullable().optional().describe("OG image URL"),fonts:$$.object({heading:$$.string().optional().describe("Font family for headings"),body:$$.string().optional().describe("Font family for body text"),code:$$.string().optional().describe("Font family for code / monospace")}).nullable().optional().describe("Font families by semantic role"),colors:$$.object({primary:$$.string().optional().describe("Primary brand color (hex)"),secondary:$$.string().optional().describe("Secondary brand color (hex)"),accent:$$.string().optional().describe("Accent / highlight color (hex)"),background:$$.string().optional().describe("Background color (hex)"),foreground:$$.string().optional().describe("Foreground / text color (hex)")}).nullable().optional().describe("Semantic color palette"),images:$$.array($$.record($$.string(),$$.unknown())).nullable().optional().describe("Brand images"),metadata:$$.record($$.string(),$$.unknown()).nullable().optional().describe("Extra design tokens (typography, components, spacing, layout, tone, etc.)"),archivedAt:$$.string().nullable().optional().describe("Archive timestamp (null to unarchive)"),isDefault:$$.boolean().optional().describe("Whether this is the default brand for the organization")})});import{z as fH}from"zod";var Hd0;var Se1=D(()=>{M0();JZ();Hd0=u({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:fH.object({}),outputSchema:fH.object({organizationId:fH.string(),sidebar_items:fH.array(Ap).nullable().optional(),enabled_plugins:fH.array(fH.string()).nullable().optional(),registry_config:Tp.nullable().optional(),simple_mode:Rp.nullable().optional(),default_home_agents:qp.nullable().optional(),flags:Mp.nullable().optional(),main_agent_id:fH.string().nullable().optional(),createdAt:fH.string().datetime().optional().describe("ISO 8601 timestamp"),updatedAt:fH.string().datetime().optional().describe("ISO 8601 timestamp")}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");let Q=await Z.storage.organizationSettings.get(X);if(!Q)return{organizationId:X};return{...Q,createdAt:Q.createdAt instanceof Date?Q.createdAt.toISOString():Q.createdAt,updatedAt:Q.updatedAt instanceof Date?Q.updatedAt.toISOString():Q.updatedAt}}})});import{z as bQ}from"zod";var Nd0;var Ce1=D(()=>{M0();JZ();Nd0=u({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:bQ.object({organizationId:bQ.string(),sidebar_items:bQ.array(Ap).optional(),enabled_plugins:bQ.array(bQ.string()).optional(),registry_config:Tp.optional(),simple_mode:Rp.optional(),default_home_agents:qp.optional(),flags:Mp.strict().optional().describe("Org boolean toggles. Shallow-merged into the stored flags: keys you pass win (explicit false persists), omitted keys keep their value."),main_agent_id:bQ.string().nullable().optional().describe("Virtual MCP id the org lands on instead of the Super Agent. Pass null to clear.")}),outputSchema:bQ.object({organizationId:bQ.string(),sidebar_items:bQ.array(Ap).nullable().optional(),enabled_plugins:bQ.array(bQ.string()).nullable().optional(),registry_config:Tp.nullable().optional(),simple_mode:Rp.nullable().optional(),default_home_agents:qp.nullable().optional(),flags:Mp.nullable().optional(),main_agent_id:bQ.string().nullable().optional(),createdAt:bQ.string().datetime().describe("ISO 8601 timestamp"),updatedAt:bQ.string().datetime().describe("ISO 8601 timestamp")}),handler:async($,Z)=>{if(o(Z),await Z.access.check(),t(Z).id!==$.organizationId)throw Error("Cannot update settings for a different organization");let Q=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,main_agent_id:$.main_agent_id});return{...Q,createdAt:Q.createdAt instanceof Date?Q.createdAt.toISOString():Q.createdAt,updatedAt:Q.updatedAt instanceof Date?Q.updatedAt.toISOString():Q.updatedAt}}})});import{z as C3}from"zod";var _e1,Ud0,Bd0;var ve1=D(()=>{M0();JZ();_e1=QO.extend({organizationId:C3.string(),archivedAt:C3.string().nullable().optional().describe("ISO 8601 timestamp"),createdAt:C3.string().describe("ISO 8601 timestamp"),updatedAt:C3.string().describe("ISO 8601 timestamp")}),Ud0=u({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:C3.object({includeArchived:C3.boolean().optional().describe("Include archived brands in the list")}),outputSchema:C3.object({items:C3.array(_e1)}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");return{items:(await Z.storage.brandContext.list(X,{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}))}}}),Bd0=u({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:C3.object({id:C3.string().describe("Brand context ID")}),outputSchema:_e1.extend({organizationId:C3.string()}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");let Q=await Z.storage.brandContext.get($.id,X);if(!Q)throw Error("Brand context not found");return{...Q,archivedAt:Q.archivedAt instanceof Date?Q.archivedAt.toISOString():Q.archivedAt,createdAt:Q.createdAt instanceof Date?Q.createdAt.toISOString():Q.createdAt,updatedAt:Q.updatedAt instanceof Date?Q.updatedAt.toISOString():Q.updatedAt}}})});import{z as jE}from"zod";var fe1,Od0,Dd0,Ld0;var be1=D(()=>{M0();JZ();fe1=QO.extend({organizationId:jE.string(),createdAt:jE.string().describe("ISO 8601 timestamp"),updatedAt:jE.string().describe("ISO 8601 timestamp")}),Od0=u({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:QO.omit({id:!0}),outputSchema:fe1,handler:async($,Z)=>{o(Z),await Z.access.check();let X=Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");let Q=await Z.storage.brandContext.create(X,{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{...Q,archivedAt:Q.archivedAt instanceof Date?Q.archivedAt.toISOString():Q.archivedAt,createdAt:Q.createdAt instanceof Date?Q.createdAt.toISOString():Q.createdAt,updatedAt:Q.updatedAt instanceof Date?Q.updatedAt.toISOString():Q.updatedAt}}}),Dd0=u({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:QO.partial().required({id:!0}),outputSchema:fe1,handler:async($,Z)=>{o(Z),await Z.access.check();let X=Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");if(!await Z.storage.brandContext.get($.id,X))throw Error("Brand context not found");let{id:Y,...G}=$;if(G.isDefault===!0)await Z.storage.brandContext.setDefault(Y,X);let J=await Z.storage.brandContext.update(Y,X,{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}}}),Ld0=u({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:jE.object({id:jE.string().describe("Brand context ID")}),outputSchema:jE.object({success:jE.boolean()}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");if(!await Z.storage.brandContext.get($.id,X))throw Error("Brand context not found");return await Z.storage.brandContext.update($.id,X,{archivedAt:new Date().toISOString(),isDefault:!1}),{success:!0}}})});async function DZ0($,Z,X){let Q=$.trim();if(!Q.startsWith("http"))Q=`https://${Q}`;let Y=await fetch("https://api.firecrawl.dev/v1/scrape",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${Z}`},body:JSON.stringify({url:Q,formats:["branding"]})});if(!Y.ok){let U=await Y.text().catch(()=>"");throw Error(`Firecrawl API error: ${Y.status} ${U.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=a04(J,W);return{name:W.title?.split(/[|\u2013\u2014]|\s+-\s+/).map((U)=>U.trim()).filter(Boolean)?.slice().sort((U,B)=>U.length-B.length)[0]??W.ogSiteName??X??$,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 a04($,Z){let X=$.images??{},Q=$.colors??{},Y={};for(let[H,N]of Object.entries(Q))if(typeof N==="string"&&N&&o04.has(H))Y[H]=N;let G={},W=($.typography??{}).fontFamilies??{};for(let[H,N]of Object.entries(W))if(typeof N==="string"&&N){let U=r04[H.toLowerCase()];if(U&&!G[U])G[U]=N}let K=$.fonts;if(Array.isArray(K))for(let H of K){let N=H.family;if(typeof N==="string"&&N&&!G.body)G.body=N}let F={};for(let H of["typography","components","spacing","layout","animations","icons","tone","personality","colorScheme"])if($[H]!==void 0)F[H]=$[H];return{logo:X.logo??null,favicon:X.favicon??null,ogImage:X.ogImage??Z.ogImage??null,fonts:Object.keys(G).length>0?G:null,colors:Object.keys(Y).length>0?Y:null,metadata:F}}var o04,r04;var wd0=D(()=>{o04=new Set(["primary","secondary","accent","background","foreground"]),r04={heading:"heading",headings:"heading",head:"heading",title:"heading",body:"body",primary:"body",text:"body",code:"code",monospace:"code",mono:"code"}});import{z as LZ0}from"zod";var s04,Ed0;var xe1=D(()=>{M0();wd0();JZ();s04=QO.pick({id:!0,name:!0,domain:!0,overview:!0,logo:!0,favicon:!0,ogImage:!0,fonts:!0,colors:!0}).extend({success:LZ0.boolean()}),Ed0=u({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:LZ0.object({domain:LZ0.string().describe("Website domain to extract brand from"),brandId:LZ0.string().optional().describe("Existing brand context ID to update (creates new if omitted)")}),outputSchema:s04,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)=>{o(Z),await Z.access.check();let X=Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");let Q=Z.firecrawlApiKey;if(!Q)throw Error("FIRECRAWL_API_KEY is not configured. Set the environment variable to enable brand extraction.");let Y=await DZ0($.domain,Q,$.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,X))throw Error("Brand context not found");return Z.storage.brandContext.update($.brandId,X,G)})():await Z.storage.brandContext.create(X,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 ye1($){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 X=Object.fromEntries(Object.entries(Z).filter(([Q])=>Q!=="tagline"&&Q!=="tone"));return Object.keys(X).length>0?X:void 0})()}}var jd0,zd0;var ge1=D(()=>{Pl0();M0();jd0=u({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:n90,outputSchema:Kp,handler:async($,Z)=>{o(Z),await Z.access.check();let X=Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");let Q=$.id?await Z.storage.brandContext.get($.id,X):await Z.storage.brandContext.getDefault(X);if(!Q)throw Error($.id?"Brand not found":"No default brand configured");return ye1(Q)}}),zd0=u({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:t90,outputSchema:o90,handler:async($,Z)=>{o(Z),await Z.access.check();let X=Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");return{items:(await Z.storage.brandContext.list(X)).map(ye1)}}})});import{resolveTxt as e04}from"dns/promises";function Pd0($){return`${$14}.${$.toLowerCase()}`}function he1(){return`deco-verify-${crypto.randomUUID().replace(/-/g,"")}`}async function ue1($,Z,X=e04){if(!Z)return!1;try{return(await X(Pd0($))).some((Y)=>Y.join("").trim()===Z)}catch{return!1}}var $14="_deco-verify";var ce1=()=>{};import{z as k5}from"zod";function YO($){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?Pd0($.domain):null,recordValue:Z?$.verificationToken:null}}function X14($){let Z=$.toLowerCase().trim();if(!Z14.test(Z))throw Error(`Invalid domain format: "${Z}". Must be a valid domain like "acme.com"`);if(_3.has(Z))throw Error(`Cannot claim generic email domain "${Z}". Only corporate domains are allowed.`);return Z}var Z14,Ad0,wZ0,Td0,Rd0,Id0,qd0,Md0;var le1=D(()=>{cY();ce1();M0();Z14=/^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$/,Ad0=k5.enum(["off","auto","request"]),wZ0=k5.object({id:k5.string(),domain:k5.string(),joinMode:Ad0,verificationStatus:k5.enum(["pending","verified"]),verificationMethod:k5.enum(["email","dns"]).nullable(),verifiedAt:k5.string().nullable(),recordName:k5.string().nullable(),recordValue:k5.string().nullable()});Td0=u({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:k5.object({}),outputSchema:k5.object({domains:k5.array(wZ0)}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=t(Z);return{domains:(await Z.storage.organizationDomains.listByOrganizationId(X.id)).map(YO)}}}),Rd0=u({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:k5.object({domain:k5.string().min(1).max(255).describe("Domain to claim, e.g. acme.com"),joinMode:Ad0.optional().describe("Initial join mode (only applied when the domain is trusted immediately via email match).")}),outputSchema:wZ0,handler:async($,Z)=>{o(Z),await Z.access.check();let X=t(Z),Q=X14($.domain),G=Z.auth.user?.email?.split("@")[1]?.toLowerCase(),J=Boolean(Z.auth.user?.emailVerified)&&G===Q,W=await Z.storage.organizationDomains.getByOrgAndDomain(X.id,Q);if(W){if(W.verificationStatus!=="verified"&&J){let F=await Z.storage.organizationDomains.markVerified(W.id,"email");return YO(F)}return YO(W)}let K=J?await Z.storage.organizationDomains.add(X.id,Q,{joinMode:$.joinMode??"off",verificationStatus:"verified",verificationMethod:"email"}):await Z.storage.organizationDomains.add(X.id,Q,{joinMode:"off",verificationStatus:"pending",verificationToken:he1()});return YO(K)}}),Id0=u({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:k5.object({id:k5.string(),joinMode:Ad0}),outputSchema:wZ0,handler:async($,Z)=>{o(Z),await Z.access.check();let X=t(Z),Q=await Z.storage.organizationDomains.getById($.id);if(!Q||Q.organizationId!==X.id)throw Error("Domain not found");if($.joinMode!=="off"&&Q.verificationStatus!=="verified")throw Error("Verify the domain before enabling auto-join or requests.");let Y=await Z.storage.organizationDomains.updateJoinMode($.id,$.joinMode);return YO(Y)}}),qd0=u({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:k5.object({id:k5.string()}),outputSchema:k5.object({verified:k5.boolean(),domain:wZ0}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=t(Z),Q=await Z.storage.organizationDomains.getById($.id);if(!Q||Q.organizationId!==X.id)throw Error("Domain not found");if(Q.verificationStatus==="verified")return{verified:!0,domain:YO(Q)};if(!Q.verificationToken)throw Error("Domain has no pending DNS verification.");if(!await ue1(Q.domain,Q.verificationToken))return{verified:!1,domain:YO(Q)};let G=await Z.storage.organizationDomains.markVerified($.id,"dns");return{verified:!0,domain:YO(G)}}}),Md0=u({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:k5.object({id:k5.string()}),outputSchema:k5.object({success:k5.boolean()}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=t(Z),Q=await Z.storage.organizationDomains.getById($.id);if(!Q||Q.organizationId!==X.id)throw Error("Domain not found");return await Z.storage.organizationDomains.removeById($.id),{success:!0}}})});function GO($){return($ instanceof Error?$.message.toLowerCase():"").includes("already a member")}import{z as z9}from"zod";var Q14,kd0,Vd0,Sd0;var de1=D(()=>{M0();C4();Q14=z9.object({id:z9.string(),userId:z9.string(),status:z9.enum(["pending","approved","denied"]),createdAt:z9.string(),user:z9.object({id:z9.string(),name:z9.string(),email:z9.string(),image:z9.string().nullable()}).nullable()}),kd0=u({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:z9.object({}),outputSchema:z9.object({requests:z9.array(Q14)}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=t(Z);return{requests:(await Z.storage.organizationJoinRequests.listPendingWithUser(X.id)).map((Y)=>({id:Y.id,userId:Y.userId,status:Y.status,createdAt:new Date(Y.createdAt).toISOString(),user:Y.user}))}}}),Vd0=u({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:z9.object({requestId:z9.string()}),outputSchema:z9.object({success:z9.boolean()}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=t(Z),Q=await Z.storage.organizationJoinRequests.getById($.requestId);if(!Q||Q.organizationId!==X.id)throw Error("Join request not found");if(Q.status!=="pending")throw Error("Join request has already been decided");let Y=o0(Z);if(!await Z.storage.organizationJoinRequests.decide(Q.id,"approved",Y??Q.userId))return{success:!0};try{await Z.boundAuth.organization.addMember({organizationId:X.id,userId:Q.userId,role:["user"]})}catch(J){if(!GO(J))throw J}if(Y)x1.capture({distinctId:Y,event:"organization_join_request_approved",groups:{organization:X.id},properties:{organization_id:X.id,user_id:Q.userId}});return{success:!0}}}),Sd0=u({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:z9.object({requestId:z9.string()}),outputSchema:z9.object({success:z9.boolean()}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=t(Z),Q=await Z.storage.organizationJoinRequests.getById($.requestId);if(!Q||Q.organizationId!==X.id)throw Error("Join request not found");if(Q.status!=="pending")throw Error("Join request has already been decided");let Y=o0(Z);if(await Z.storage.organizationJoinRequests.decide(Q.id,"denied",Y??Q.userId)&&Y)x1.capture({distinctId:Y,event:"organization_join_request_denied",groups:{organization:X.id},properties:{organization_id:X.id,user_id:Q.userId}});return{success:!0}}})});import{z as xQ}from"zod";var Cd0;var me1=D(()=>{C4();M0();SQ();Cd0=u({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:xQ.object({organizationId:xQ.string().optional(),userId:xQ.string(),role:xQ.array(xQ.string())}),outputSchema:xQ.object({id:xQ.string(),organizationId:xQ.string(),userId:xQ.string(),role:xQ.union([xQ.string(),xQ.array(xQ.string())]),createdAt:xQ.string().datetime().describe("ISO 8601 timestamp")}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=$.organizationId||Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");if(X!==Z.organization?.id)throw Error("Organization ID does not match authenticated organization");let Q=await Z.db.selectFrom("member").select(["role"]).where("userId","=",o0(Z)??"").where("organizationId","=",X).executeTakeFirst();if(!T50(Q?.role,$.role))throw Error(`Insufficient privileges to assign role "${$.role.join(",")}"`);let Y=await Z.boundAuth.organization.addMember({organizationId:X,userId:$.userId,role:$.role});if(!Y)throw Error("Failed to add member");let G=o0(Z);if(G)x1.capture({distinctId:G,event:"organization_member_added",groups:{organization:X},properties:{organization_id:X,added_user_id:$.userId,role:$.role}});return{...Y,role:Y.role,createdAt:Y.createdAt instanceof Date?Y.createdAt.toISOString():Y.createdAt}}})});import{z as Ky}from"zod";var _d0;var ie1=D(()=>{C4();M0();_d0=u({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:Ky.object({organizationId:Ky.string().optional(),memberIdOrEmail:Ky.string()}),outputSchema:Ky.object({success:Ky.boolean(),memberIdOrEmail:Ky.string()}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=$.organizationId||Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");if(X!==Z.organization?.id)throw Error("Organization ID does not match authenticated organization");let Q=await Z.boundAuth.organization.removeMember({organizationId:X,memberIdOrEmail:$.memberIdOrEmail});Z.invalidateMemberRole?.(Q.member.userId,X);let Y=o0(Z);if(Y)x1.capture({distinctId:Y,event:"organization_member_removed",groups:{organization:X},properties:{organization_id:X,member_id_or_email:$.memberIdOrEmail}});return{success:!0,memberIdOrEmail:$.memberIdOrEmail}}})});import{z as a7}from"zod";var vd0;var pe1=D(()=>{M0();vd0=u({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:a7.object({limit:a7.number().int().min(1).max(1000).optional(),offset:a7.number().int().min(0).optional()}),outputSchema:a7.object({members:a7.array(a7.object({id:a7.string(),organizationId:a7.string(),userId:a7.string(),role:a7.string(),createdAt:a7.string().datetime().describe("ISO 8601 timestamp"),user:a7.object({id:a7.string(),name:a7.string(),email:a7.string(),image:a7.string().optional()}).optional()}))}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");return{members:((await Z.boundAuth.organization.listMembers({organizationId:X,limit:$.limit,offset:$.offset}))?.members??[]).map((G)=>({...G,createdAt:G.createdAt instanceof Date?G.createdAt.toISOString():G.createdAt}))}}})});import{z as yZ}from"zod";var fd0;var ne1=D(()=>{C4();M0();SQ();fd0=u({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:yZ.object({organizationId:yZ.string().optional(),memberId:yZ.string(),role:yZ.array(yZ.string())}),outputSchema:yZ.object({id:yZ.string(),organizationId:yZ.string(),userId:yZ.string(),role:yZ.union([yZ.string(),yZ.array(yZ.string())]),createdAt:yZ.string().datetime().describe("ISO 8601 timestamp"),user:yZ.object({email:yZ.string(),name:yZ.string(),image:yZ.string().optional()})}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=$.organizationId||Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");let Q=await Z.db.selectFrom("member").select(["role"]).where("userId","=",o0(Z)??"").where("organizationId","=",X).executeTakeFirst();if(!T50(Q?.role,$.role))throw Error(`Insufficient privileges to assign role "${$.role.join(",")}"`);let Y=await Z.boundAuth.organization.updateMemberRole({organizationId:X,memberId:$.memberId,role:$.role});if(!Y)throw Error("Failed to update member role");Z.invalidateMemberRole?.(Y.userId,X);let G=o0(Z);if(G)x1.capture({distinctId:G,event:"organization_member_role_updated",groups:{organization:X},properties:{organization_id:X,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 te1(){if(kp&&Date.now()-kp.fetchedAt<600000)return kp.rate;try{let Z=await(await fetch("https://economia.awesomeapi.com.br/json/last/USD-BRL",{signal:AbortSignal.timeout(5000)})).json(),X=parseFloat(Z.USDBRL?.bid??"");if(Number.isNaN(X)||X<=0)throw Error("Invalid rate");return kp={rate:X,fetchedAt:Date.now()},X}catch{return kp?.rate??5.5}}function oe1($,Z,X){if(Z==="brl")return Math.round($/X);return $}var kp=null;function bd0($,Z="",X=new URLSearchParams){for(let[Q,Y]of Object.entries($)){if(Y===void 0||Y===null)continue;let G=Z?`${Z}[${Q}]`:Q;if(Array.isArray(Y))Y.forEach((J,W)=>{if(typeof J==="object"&&J!==null)bd0(J,`${G}[${W}]`,X);else X.append(`${G}[${W}]`,String(J))});else if(typeof Y==="object")bd0(Y,G,X);else X.append(G,String(Y))}return X}async function Vp($,Z){let X=b0().stripeSecretKey;if(!X)throw new lY(503,"billing is not configured");let Q=Z?.params?bd0(Z.params).toString():void 0,Y=await fetch(`${Y14}${$}`,{method:Z?.method??(Q?"POST":"GET"),headers:{Authorization:`Bearer ${X}`,...Q&&{"Content-Type":"application/x-www-form-urlencoded"}},body:Q,signal:AbortSignal.timeout(G14)}),G=await Y.json().catch(()=>({}));if(!Y.ok){let J=G.error?.message??`HTTP ${Y.status}`;throw new lY(Y.status,J)}return G}function re1($){return{billing_address_collection:"required",custom_fields:[{key:J14,label:{type:"custom",custom:"CPF / CNPJ"},type:"text",optional:!1,text:{minimum_length:W14,maximum_length:K14}}],...$&&{customer_update:{address:"auto",name:"auto"}}}}async function ae1($){let Z=b0().stripeOrgPriceId;if(!Z)throw new lY(503,"billing is not configured");let X=await Vp("/checkout/sessions",{params:{mode:"subscription",...re1(null),line_items:[{price:Z,quantity:1}],success_url:$.successUrl,cancel_url:$.cancelUrl,metadata:{orgId:$.organizationId},subscription_data:{metadata:{orgId:$.organizationId}}}});if(!X.url)throw new lY(500,"checkout session lacks url");return{url:X.url}}function F14($,Z){return Math.round($*(1+Z/100))}async function se1($){let Z=F14($.amountCents,$.feePercent),X=oe1($.amountCents,$.currency,await te1()),Q=b0().stripeTopupProductId,Y={kind:"topup",orgId:$.organizationId,creditCents:X},G=$.currency==="brl"?`Studio AI credits (R$ ${($.amountCents/100).toFixed(2)})`:`Studio AI credits ($${($.amountCents/100).toFixed(2)})`,J=await Vp("/checkout/sessions",{params:{mode:"payment",...$.customerId&&{customer:$.customerId},...re1($.customerId),line_items:[{quantity:1,price_data:{currency:$.currency,unit_amount:Z,...Q?{product:Q}:{product_data:{name:G}}}}],success_url:$.successUrl,cancel_url:$.cancelUrl,metadata:Y,payment_intent_data:{metadata:Y}}});if(!J.url)throw new lY(500,"checkout session lacks url");return{url:J.url}}async function EZ0($){let Z=await Vp("/billing_portal/sessions",{params:{customer:$.customerId,return_url:$.returnUrl}});if(!Z.url)throw new lY(500,"portal session lacks url");return{url:Z.url}}async function jZ0($){return Vp(`/subscriptions/${encodeURIComponent($)}`)}async function ee1($){await Vp(`/subscriptions/${encodeURIComponent($)}`,{method:"DELETE"})}var Y14="https://api.stripe.com/v1",lY,G14=15000,J14="taxid",W14=11,K14=18;var zE=D(()=>{R$();lY=class lY extends Error{status;constructor($,Z){super(`Stripe API ${$}: ${Z}`);this.status=$;this.name="StripeApiError"}}});function JO($,Z){let X=`/${encodeURIComponent($)}/settings`;return Z?`${X}/${Z}`:X}import{z as xd0}from"zod";var yd0;var $0$=D(()=>{zE();$9();M0();C4();yd0=u({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:xd0.object({}),outputSchema:xd0.object({url:xd0.string()}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=Z.organization?.id,Q=Z.organization?.slug;if(!X||!Q)throw Error("Organization context required");let Y=await Z.storage.organizationBilling.getBilling(X);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=`${f9()}${JO(Q,"members")}`,{url:J}=await ae1({organizationId:X,successUrl:`${G}?checkout=success`,cancelUrl:`${G}?checkout=canceled`});return yY({event:"subscription_checkout_started",organizationId:X,...Z.auth?.user?.id?{userId:Z.auth.user.id}:{}}),{url:J}}})});import{z as gd0}from"zod";var hd0;var Z0$=D(()=>{zE();$9();M0();hd0=u({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:gd0.object({}),outputSchema:gd0.object({url:gd0.string()}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=t(Z);if(!X.slug)throw Error("Organization context required");let Q=await Z.storage.organizationBilling.getBilling(X.id);if(!Q?.stripeCustomerId)throw Error("This organization has no billing account yet \u2014 subscribe first.");try{return await EZ0({customerId:Q.stripeCustomerId,returnUrl:`${f9()}${JO(X.slug,"members")}`})}catch(Y){if(Y instanceof lY)throw Error(Y.message);throw Y}}})});function zZ0($){return ud0[$%ud0.length]??H14}function yQ($){return $.createdBy==="system"}function U14($){if($?.reviewer_enabled===void 0&&$?.qa_agent_enabled===!1&&$?.code_reviewer_enabled===!1)return!1;return nX($,"reviewer_enabled")}function bH($){return U14($)?LK:[]}function B14($){return nX($,"delivery_lanes_enabled")}function EK($){return B14($)?"merged":"done"}function KO($,Z){if(!$)return!1;return[wK[Z],...N14].some((X)=>$.startsWith(`${X}:`))}function xH($,Z){if(Z)return new Date(Z).getTime();let X=0;for(let Q of $){if(Q.action!=="status_changed")continue;if(Q.data?.to!=="in_review")continue;X=Math.max(X,new Date(Q.occurredAt).getTime())}return X}function FO($,Z){let X=xH($,Z.cycleStartedAt),Q=new Map;for(let Y of $){if(Y.action!=="review_approved"&&Y.action!=="review_changes_requested")continue;if(new Date(Y.occurredAt).getTime()<X)continue;let G=Y.data??{};if(G.reviewer!=="reviewer")continue;if(Y.action==="review_approved"){if(Z?.verifiedOnly&&G.verified!==!0)continue;Q.set("reviewer","approved")}else Q.set("reviewer","changes_requested")}return Q}function WO($,Z,X){if(Z.length===0)return!1;let Q=FO($,X);return Z.every((Y)=>Q.get(Y)==="approved")}function Q0$($,Z,X){return WO($,Z,X)&&!WO($,Z,{...X,verifiedOnly:!0})}function Y0$($){let Z=null;for(let X of $){if(X.action!=="review_approved"&&X.action!=="review_changes_requested")continue;let Q=new Date(X.occurredAt).getTime();if(Z&&Q<Z.at)continue;let Y=X.data?.notes;Z={at:Q,notes:X.action==="review_changes_requested"&&typeof Y==="string"?Y:null}}return Z?.notes??null}var Z8="super-agent",ud0,H14,Sp='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.',X0$,cd0="chore",LK,wK,N14,Cp="NO VISUAL SURFACE",PZ0,AZ0,G0$="task-board.item.updated",J0$="task-board.item.deleted";var C6=D(()=>{JZ();ud0=["#9ca3af","#ef4444","#f97316","#f59e0b","#22c55e","#3b82f6","#a855f7","#ec4899"],H14=ud0[0];X0$="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.",LK=["reviewer"],wK={reviewer:"Reviewer"},N14=["QA Agent","Code Reviewer"];PZ0=["triage","todo","in_progress","in_review","approved","merged","post_deploy_validation","done","archived"],AZ0=["approved","merged","post_deploy_validation"]});function ld0($){return $==="trial"?"trial":"subscription"}function _p($,Z,X,Q={}){yY({event:Z,organizationId:X.organizationId,...$.auth?.user?.id?{userId:$.auth.user.id}:{},properties:{task_id:X.id,...Q}})}function dd0($){return $?.status==="active"||$?.status==="past_due"}function TZ0($,Z){if(dd0($))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 vp(){let $=b0();return{enforced:$.taskQuotaEnforced,freeTaskExecutions:$.freeTaskExecutions,monthlyTaskExecutions:$.monthlyTaskExecutions,maxRunsPerTask:$.maxRunsPerTask}}function HO(){return{...vp(),maxRunsPerTask:Number.POSITIVE_INFINITY}}async function Fy($,Z,X=vp()){if(!X.enforced||!yQ(Z))return;let Q=await $.storage.organizationBilling.taskClaim(Z.id);if(Q&&Q.runCount>=X.maxRunsPerTask)throw _p($,"task_quota_blocked",Z,{phase:"precheck",reason:"runs_exhausted"}),new tX("runs_exhausted");if(Q&&Q.state!=="released")return;let Y=await $.storage.organizationBilling.getBilling(Z.organizationId),G=TZ0(Y,X);if(await $.storage.organizationBilling.countTaskClaims(Z.organizationId,G.periodKey)>=G.limit)throw _p($,"task_quota_blocked",Z,{phase:"precheck",reason:G.exhaustedReason,billing_mode:ld0(G.periodKey),limit:G.limit}),new tX(G.exhaustedReason)}async function W0$($,Z,X=vp()){if(!X.enforced||!yQ(Z))return"skipped";let Q=await $.storage.organizationBilling.getBilling(Z.organizationId),Y=TZ0(Q,X),G=await $.storage.organizationBilling.claimTaskUnderLimit(Z.organizationId,Z.id,Y.periodKey,Y.limit,X.maxRunsPerTask);if(G==="exhausted")throw _p($,"task_quota_blocked",Z,{phase:"claim",reason:Y.exhaustedReason,billing_mode:ld0(Y.periodKey),limit:Y.limit}),new tX(Y.exhaustedReason);if(G==="runs_exhausted")throw _p($,"task_quota_blocked",Z,{phase:"claim",reason:"runs_exhausted"}),new tX("runs_exhausted");if(G==="claimed")_p($,"task_quota_claimed",Z,{billing_mode:ld0(Y.periodKey),period_key:Y.periodKey,limit:Y.limit});return G}async function K0$($,Z,X,Q){if(Q==="skipped")return;await $.rollbackTaskClaim(Z,X,{releaseSlot:Q==="claimed"}).catch((Y)=>console.error("[task-quota] rollback failed (stays charged)",Y))}async function F0$($,Z){let X=await $.storage.organizationBilling.taskClaim(Z);return!!X&&X.state!=="released"}async function H0$($,Z,X){if(await $.releaseTaskClaim(Z,X).catch((Y)=>{return console.error("[task-quota] refund failed (stays charged)",Y),!1}))yY({event:"task_quota_refunded",organizationId:Z,properties:{task_id:X}})}var O14="[SUBSCRIPTION_REQUIRED]",D14,tX;var sG=D(()=>{C6();C4();R$();D14={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"};tX=class tX extends Error{reason;constructor($){super(`${O14} ${D14[$]}`);this.reason=$;this.name="TaskQuotaError"}}});import{z as yH}from"zod";var md0;var N0$=D(()=>{M0();sG();md0=u({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:yH.object({}),outputSchema:yH.object({enforced:yH.boolean(),billingStatus:yH.string(),subscribed:yH.boolean(),hasBillingAccount:yH.boolean(),used:yH.number(),limit:yH.number(),currentPeriodEnd:yH.string().datetime().nullable()}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=t(Z),Q=vp(),Y=await Z.storage.organizationBilling.getBilling(X.id),G=TZ0(Y,Q),J=await Z.storage.organizationBilling.countTaskClaims(X.id,G.periodKey);return{enforced:Q.enforced,billingStatus:Y?.status??"none",subscribed:dd0(Y),hasBillingAccount:!!Y?.stripeCustomerId,used:J,limit:G.limit,currentPeriodEnd:Y?.currentPeriodEnd?.toISOString()??null}}})});var U0$=D(()=>{Re1();Ie1();qe1();Me1();ke1();Se1();Ce1();ve1();be1();xe1();ge1();le1();de1();me1();ie1();pe1();ne1();$0$();Z0$();N0$()});function jK($){if($==null)return"unknown error";if(typeof $==="string")return $;if($ instanceof Error)return $.message;return JSON.stringify($)}function RZ0($){if($===null||typeof $==="string"||typeof $==="number"||typeof $==="boolean")return!0;if(Array.isArray($))return $.every(RZ0);if(typeof $==="object")return Object.entries($).every(([Z,X])=>typeof Z==="string"&&(X===void 0||RZ0(X)));return!1}function id0($){return Array.isArray($)&&$.every(RZ0)}function fp($){return $!=null&&typeof $==="object"&&Object.entries($).every(([Z,X])=>typeof Z==="string"&&(X===void 0||RZ0(X)))}var c0$="vercel.ai.error",w14,B0$,O0$,J1,l0$="AI_APICallError",d0$,E14,D0$,L0$,Q4,m0$="AI_EmptyResponseBodyError",i0$,j14,w0$,E0$,IZ0,p0$="AI_InvalidArgumentError",n0$,z14,j0$,z0$,NO,t0$="AI_InvalidPromptError",o0$,P14,P0$,A0$,eG,r0$="AI_InvalidResponseDataError",a0$,A14,T0$,R0$,Hy,s0$="AI_JSONParseError",e0$,T14,I0$,q0$,gH,$1$="AI_LoadAPIKeyError",Z1$,R14,M0$,k0$,PE,X1$="AI_LoadSettingError",Q1$,I14,V0$,S0$,Y1$,G1$="AI_NoContentGeneratedError",J1$,q14,C0$,_0$,W1$,K1$="AI_NoSuchModelError",F1$,M14,v0$,f0$,c5,H1$="AI_TooManyEmbeddingValuesForCallError",N1$,k14,b0$,x0$,Ny,U1$="AI_TypeValidationError",B1$,V14,y0$,g0$,O5,O1$="AI_UnsupportedFunctionalityError",D1$,S14,h0$,u0$,v4;var a1=D(()=>{w14=Symbol.for(c0$),J1=class $ extends(O0$=Error,B0$=w14,O0$){constructor({name:Z,message:X,cause:Q}){super(X);this[B0$]=!0,this.name=Z,this.cause=Q}static isInstance(Z){return $.hasMarker(Z,c0$)}static hasMarker(Z,X){let Q=Symbol.for(X);return Z!=null&&typeof Z==="object"&&Q in Z&&typeof Z[Q]==="boolean"&&Z[Q]===!0}},d0$=`vercel.ai.error.${l0$}`,E14=Symbol.for(d0$),Q4=class extends(L0$=J1,D0$=E14,L0$){constructor({message:$,url:Z,requestBodyValues:X,statusCode:Q,responseHeaders:Y,responseBody:G,cause:J,isRetryable:W=Q!=null&&(Q===408||Q===409||Q===429||Q>=500),data:K}){super({name:l0$,message:$,cause:J});this[D0$]=!0,this.url=Z,this.requestBodyValues=X,this.statusCode=Q,this.responseHeaders=Y,this.responseBody=G,this.isRetryable=W,this.data=K}static isInstance($){return J1.hasMarker($,d0$)}},i0$=`vercel.ai.error.${m0$}`,j14=Symbol.for(i0$),IZ0=class extends(E0$=J1,w0$=j14,E0$){constructor({message:$="Empty response body"}={}){super({name:m0$,message:$});this[w0$]=!0}static isInstance($){return J1.hasMarker($,i0$)}};n0$=`vercel.ai.error.${p0$}`,z14=Symbol.for(n0$),NO=class extends(z0$=J1,j0$=z14,z0$){constructor({message:$,cause:Z,argument:X}){super({name:p0$,message:$,cause:Z});this[j0$]=!0,this.argument=X}static isInstance($){return J1.hasMarker($,n0$)}},o0$=`vercel.ai.error.${t0$}`,P14=Symbol.for(o0$),eG=class extends(A0$=J1,P0$=P14,A0$){constructor({prompt:$,message:Z,cause:X}){super({name:t0$,message:`Invalid prompt: ${Z}`,cause:X});this[P0$]=!0,this.prompt=$}static isInstance($){return J1.hasMarker($,o0$)}},a0$=`vercel.ai.error.${r0$}`,A14=Symbol.for(a0$),Hy=class extends(R0$=J1,T0$=A14,R0$){constructor({data:$,message:Z=`Invalid response data: ${JSON.stringify($)}.`}){super({name:r0$,message:Z});this[T0$]=!0,this.data=$}static isInstance($){return J1.hasMarker($,a0$)}},e0$=`vercel.ai.error.${s0$}`,T14=Symbol.for(e0$),gH=class extends(q0$=J1,I0$=T14,q0$){constructor({text:$,cause:Z}){super({name:s0$,message:`JSON parsing failed: Text: ${$}.
|
|
892
892
|
Error message: ${jK(Z)}`,cause:Z});this[I0$]=!0,this.text=$}static isInstance($){return J1.hasMarker($,e0$)}},Z1$=`vercel.ai.error.${$1$}`,R14=Symbol.for(Z1$),PE=class extends(k0$=J1,M0$=R14,k0$){constructor({message:$}){super({name:$1$,message:$});this[M0$]=!0}static isInstance($){return J1.hasMarker($,Z1$)}},Q1$=`vercel.ai.error.${X1$}`,I14=Symbol.for(Q1$),Y1$=class extends(S0$=J1,V0$=I14,S0$){constructor({message:$}){super({name:X1$,message:$});this[V0$]=!0}static isInstance($){return J1.hasMarker($,Q1$)}},J1$=`vercel.ai.error.${G1$}`,q14=Symbol.for(J1$),W1$=class extends(_0$=J1,C0$=q14,_0$){constructor({message:$="No content generated."}={}){super({name:G1$,message:$});this[C0$]=!0}static isInstance($){return J1.hasMarker($,J1$)}},F1$=`vercel.ai.error.${K1$}`,M14=Symbol.for(F1$),c5=class extends(f0$=J1,v0$=M14,f0$){constructor({errorName:$=K1$,modelId:Z,modelType:X,message:Q=`No such ${X}: ${Z}`}){super({name:$,message:Q});this[v0$]=!0,this.modelId=Z,this.modelType=X}static isInstance($){return J1.hasMarker($,F1$)}},N1$=`vercel.ai.error.${H1$}`,k14=Symbol.for(N1$),Ny=class extends(x0$=J1,b0$=k14,x0$){constructor($){super({name:H1$,message:`Too many values for a single embedding call. The ${$.provider} model "${$.modelId}" can only embed up to ${$.maxEmbeddingsPerCall} values per call, but ${$.values.length} values were provided.`});this[b0$]=!0,this.provider=$.provider,this.modelId=$.modelId,this.maxEmbeddingsPerCall=$.maxEmbeddingsPerCall,this.values=$.values}static isInstance($){return J1.hasMarker($,N1$)}},B1$=`vercel.ai.error.${U1$}`,V14=Symbol.for(B1$),O5=class $ extends(g0$=J1,y0$=V14,g0$){constructor({value:Z,cause:X,context:Q}){let Y="Type validation failed";if(Q==null?void 0:Q.field)Y+=` for ${Q.field}`;if((Q==null?void 0:Q.entityName)||(Q==null?void 0:Q.entityId)){Y+=" (";let G=[];if(Q.entityName)G.push(Q.entityName);if(Q.entityId)G.push(`id: "${Q.entityId}"`);Y+=G.join(", "),Y+=")"}super({name:U1$,message:`${Y}: Value: ${JSON.stringify(Z)}.
|
|
893
893
|
Error message: ${jK(X)}`,cause:X});this[y0$]=!0,this.value=Z,this.context=Q}static isInstance(Z){return J1.hasMarker(Z,B1$)}static wrap({value:Z,cause:X,context:Q}){var Y,G,J;if($.isInstance(X)&&X.value===Z&&((Y=X.context)==null?void 0:Y.field)===(Q==null?void 0:Q.field)&&((G=X.context)==null?void 0:G.entityName)===(Q==null?void 0:Q.entityName)&&((J=X.context)==null?void 0:J.entityId)===(Q==null?void 0:Q.entityId))return X;return new $({value:Z,cause:X,context:Q})}},D1$=`vercel.ai.error.${O1$}`,S14=Symbol.for(D1$),v4=class extends(u0$=J1,h0$=S14,u0$){constructor({functionality:$,message:Z=`'${$}' functionality not supported.`}){super({name:O1$,message:Z});this[h0$]=!0,this.functionality=$}static isInstance($){return J1.hasMarker($,D1$)}}});import*as VZ0 from"zod/v4";import{ZodFirstPartyTypeKind as O4}from"zod/v3";import{ZodFirstPartyTypeKind as t14}from"zod/v3";import{ZodFirstPartyTypeKind as qZ0}from"zod/v3";function r$(...$){return $.reduce((Z,X)=>({...Z,...X!=null?X:{}}),{})}function MZ0({tools:$=[],providerToolNames:Z,resolveProviderToolName:X}){var Q;let Y={},G={};for(let J of $)if(J.type==="provider"){let W=(Q=X==null?void 0:X(J))!=null?Q:(J.id in Z)?Z[J.id]:void 0;if(W==null)continue;Y[J.name]=W,G[W]=J.name}return{toProviderToolName:(J)=>{var W;return(W=Y[J])!=null?W:J},toCustomToolName:(J)=>{var W;return(W=G[J])!=null?W:J}}}async function hQ($,Z){if($==null)return Promise.resolve();let X=Z==null?void 0:Z.abortSignal;return new Promise((Q,Y)=>{if(X==null?void 0:X.aborted){Y(L1$());return}let G=setTimeout(()=>{J(),Q()},$),J=()=>{clearTimeout(G),X==null||X.removeEventListener("abort",W)},W=()=>{J(),Y(L1$())};X==null||X.addEventListener("abort",W)})}function L1$(){return new DOMException("Delay was aborted","AbortError")}function Uy($){return Object.fromEntries([...$.headers])}function P9($){let Z=$.replace(/-/g,"+").replace(/_/g,"/"),X=_14(Z);return Uint8Array.from(X,(Q)=>Q.codePointAt(0))}function cQ($){let Z="";for(let X=0;X<$.length;X++)Z+=String.fromCodePoint($[X]);return C14(Z)}function KZ($){return $ instanceof Uint8Array?cQ($):$}function A1$($,Z={}){let{useArrayBrackets:X=!0}=Z,Q=new FormData;for(let[Y,G]of Object.entries($)){if(G==null)continue;if(Array.isArray(G)){if(G.length===1){Q.append(Y,G[0]);continue}let J=X?`${Y}[]`:Y;for(let W of G)Q.append(J,W);continue}Q.append(Y,G)}return Q}async function bp($){var Z;try{await((Z=$.body)==null?void 0:Z.cancel())}catch(X){}}function f14($=globalThis){return $.window!=null}function b14($){let Z;try{Z=new URL($)}catch(Q){throw new WZ({url:$,message:`Invalid URL: ${$}`})}if(Z.protocol==="data:")return;if(Z.protocol!=="http:"&&Z.protocol!=="https:")throw new WZ({url:$,message:`URL scheme must be http, https, or data, got ${Z.protocol}`});let X=Z.hostname.toLowerCase().replace(/\.+$/,"");if(!X)throw new WZ({url:$,message:"URL must have a hostname"});if(X==="localhost"||X.endsWith(".local")||X.endsWith(".localhost"))throw new WZ({url:$,message:`URL with hostname ${X} is not allowed`});if(X.startsWith("[")&&X.endsWith("]")){let Q=X.slice(1,-1);if(y14(Q))throw new WZ({url:$,message:`URL with IPv6 address ${X} is not allowed`});return}if(I1$(X)){if(q1$(X))throw new WZ({url:$,message:`URL with IP address ${X} is not allowed`});return}}function I1$($){let Z=$.split(".");if(Z.length!==4)return!1;return Z.every((X)=>{let Q=Number(X);return Number.isInteger(Q)&&Q>=0&&Q<=255&&String(Q)===X})}function q1$($){let Z=$.split(".").map(Number),[X,Q,Y]=Z;if(X===0)return!0;if(X===10)return!0;if(X===100&&Q>=64&&Q<=127)return!0;if(X===127)return!0;if(X===169&&Q===254)return!0;if(X===172&&Q>=16&&Q<=31)return!0;if(X===192&&Q===0&&Y===0)return!0;if(X===192&&Q===168)return!0;if(X===198&&(Q===18||Q===19))return!0;if(X>=240)return!0;return!1}function x14($){let Z=$.toLowerCase(),X=Z.indexOf("%");if(X!==-1)Z=Z.slice(0,X);let Q=Z.split("::");if(Q.length>2)return null;let Y=(J)=>{if(J==="")return[];let W=[],K=J.split(":");for(let F=0;F<K.length;F++){let H=K[F];if(H.includes(".")){if(F!==K.length-1||!I1$(H))return null;let[N,U,B,O]=H.split(".").map(Number);W.push(N<<8|U,B<<8|O);continue}if(!/^[0-9a-f]{1,4}$/.test(H))return null;W.push(parseInt(H,16))}return W},G=Y(Q[0]);if(G===null)return null;if(Q.length===2){let J=Y(Q[1]);if(J===null)return null;let W=8-G.length-J.length;if(W<0)return null;return[...G,...Array(W).fill(0),...J]}return G.length===8?G:null}function y14($){let Z=x14($);if(Z===null)return!0;let X=(Y)=>Z.slice(0,Y).every((G)=>G===0);if(X(7)&&(Z[7]===0||Z[7]===1))return!0;if((Z[0]&65024)===64512)return!0;if((Z[0]&65472)===65152)return!0;if((Z[0]&65472)===65216)return!0;if((Z[0]&65280)===65280)return!0;if(X(6)||X(5)&&Z[5]===65535||X(4)&&Z[4]===65535&&Z[5]===0||Z[0]===100&&Z[1]===65435&&Z[2]===0&&Z[3]===0&&Z[4]===0&&Z[5]===0||Z[0]===100&&Z[1]===65435&&Z[2]===1){let Y=Z[6]>>8&255,G=Z[6]&255,J=Z[7]>>8&255,W=Z[7]&255;return q1$(`${Y}.${G}.${J}.${W}`)}return!1}async function rd0({url:$,headers:Z,abortSignal:X,maxRedirects:Q=g14}){let Y={signal:X};if(Z!==void 0)Y.headers=Z;let G=$;for(let J=0;J<=Q;J++){b14(G);let W=await fetch(G,{...Y,redirect:"manual"});if(W.type==="opaqueredirect"){if(!f14())throw new WZ({url:$,message:`Redirect from ${G} could not be validated and was blocked`});return await fetch(G,{...Y,redirect:"follow"})}let K=W.headers.get("location");if(W.status>=300&&W.status<400&&K){await bp(W),G=new URL(K,G).toString();continue}return W}throw new WZ({url:$,message:`Too many redirects (max ${Q})`})}async function ad0({response:$,url:Z,maxBytes:X=kZ0}){let Q=$.headers.get("content-length");if(Q!=null){let H=parseInt(Q,10);if(!isNaN(H)&&H>X)throw await bp($),new WZ({url:Z,message:`Download of ${Z} exceeded maximum size of ${X} bytes (Content-Length: ${H}).`})}let Y=$.body;if(Y==null)return new Uint8Array(0);let G=Y.getReader(),J=[],W=0;try{while(!0){let{done:H,value:N}=await G.read();if(H)break;if(W+=N.length,W>X)throw new WZ({url:Z,message:`Download of ${Z} exceeded maximum size of ${X} bytes.`});J.push(N)}}finally{try{await G.cancel()}finally{G.releaseLock()}}let K=new Uint8Array(W),F=0;for(let H of J)K.set(H,F),F+=H.length;return K}async function sd0($,Z){var X,Q;try{let Y=await rd0({url:$,abortSignal:Z==null?void 0:Z.abortSignal});if(!Y.ok)throw await bp(Y),new WZ({url:$,statusCode:Y.status,statusText:Y.statusText});let G=await ad0({response:Y,url:$,maxBytes:(X=Z==null?void 0:Z.maxBytes)!=null?X:kZ0}),J=(Q=Y.headers.get("content-type"))!=null?Q:void 0;return new Blob([G],J?{type:J}:void 0)}catch(Y){if(WZ.isInstance(Y))throw Y;throw new WZ({url:$,cause:Y})}}function By($){if($==null)return"unknown error";if(typeof $==="string")return $;if($ instanceof Error)return $.message;return JSON.stringify($)}function gQ($){return($ instanceof Error||$ instanceof DOMException)&&($.name==="AbortError"||$.name==="ResponseAborted"||$.name==="TimeoutError")}function c14($){if(!($ instanceof Error))return!1;let Z=$.code;if(typeof Z==="string"&&u14.includes(Z))return!0;return!1}function M1$({error:$,url:Z,requestBodyValues:X}){if(gQ($))return $;if($ instanceof TypeError&&h14.includes($.message.toLowerCase())){let Q=$.cause;if(Q!=null)return new Q4({message:`Cannot connect to API: ${Q.message}`,cause:Q,url:Z,requestBodyValues:X,isRetryable:!0})}if(c14($))return new Q4({message:`Cannot connect to API: ${$.message}`,cause:$,url:Z,requestBodyValues:X,isRetryable:!0});return $}function UO($=globalThis){var Z,X,Q;if($.window)return"runtime/browser";if((Z=$.navigator)==null?void 0:Z.userAgent)return`runtime/${$.navigator.userAgent.toLowerCase()}`;if((Q=(X=$.process)==null?void 0:X.versions)==null?void 0:Q.node)return`runtime/node.js/${$.process.version.substring(0)}`;if($.EdgeRuntime)return"runtime/vercel-edge";return"runtime/unknown"}function BO($){if($==null)return{};let Z={};if($ instanceof Headers)$.forEach((X,Q)=>{Z[Q.toLowerCase()]=X});else{if(!Array.isArray($))$=Object.entries($);for(let[X,Q]of $)if(Q!=null)Z[X.toLowerCase()]=Q}return Z}function t4($,...Z){let X=new Headers(BO($)),Q=X.get("user-agent")||"";return X.set("user-agent",[Q,...Z].filter(Boolean).join(" ")),Object.fromEntries(X.entries())}function TE($){return $!=null}function V1$($,Z){try{return new URL($).origin===new URL(Z).origin}catch(X){return!1}}function S1$({mediaType:$,url:Z,supportedUrls:X}){return Z=Z.toLowerCase(),$=$.toLowerCase(),Object.entries(X).map(([Q,Y])=>{let G=Q.toLowerCase();return G==="*"||G==="*/*"?{mediaTypePrefix:"",regexes:Y}:{mediaTypePrefix:G.replace(/\*/,""),regexes:Y}}).filter(({mediaTypePrefix:Q})=>$.startsWith(Q)).flatMap(({regexes:Q})=>Q).some((Q)=>Q.test(Z))}function Oy({apiKey:$,environmentVariableName:Z,apiKeyParameterName:X="apiKey",description:Q}){if(typeof $==="string")return $;if($!=null)throw new PE({message:`${Q} API key must be a string.`});if(typeof process>"u")throw new PE({message:`${Q} API key is missing. Pass it using the '${X}' parameter. Environment variables are not supported in this environment.`});if($=process.env[Z],$==null)throw new PE({message:`${Q} API key is missing. Pass it using the '${X}' parameter or the ${Z} environment variable.`});if(typeof $!=="string")throw new PE({message:`${Q} API key must be a string. The value of the ${Z} environment variable is not a string.`});return $}function zK({settingValue:$,environmentVariableName:Z}){if(typeof $==="string")return $;if($!=null||typeof process>"u")return;if($=process.env[Z],$==null||typeof $!=="string")return;return $}function C1$($){var Z;let[X,Q=""]=$.toLowerCase().split("/");return(Z={mpeg:"mp3","x-wav":"wav",opus:"ogg",mp4:"m4a","x-m4a":"m4a"}[Q])!=null?Z:Q}function j1$($){let Z=JSON.parse($);if(Z===null||typeof Z!=="object")return Z;if(d14.test($)===!1&&m14.test($)===!1)return Z;return i14(Z)}function i14($){let Z=[$];while(Z.length){let X=Z;Z=[];for(let Q of X){if(Object.prototype.hasOwnProperty.call(Q,"__proto__"))throw SyntaxError("Object contains forbidden prototype property");if(Object.prototype.hasOwnProperty.call(Q,"constructor")&&Q.constructor!==null&&typeof Q.constructor==="object"&&Object.prototype.hasOwnProperty.call(Q.constructor,"prototype"))throw SyntaxError("Object contains forbidden prototype property");for(let Y in Q){let G=Q[Y];if(G&&typeof G==="object")Z.push(G)}}}return $}function ed0($){let{stackTraceLimit:Z}=Error;try{Error.stackTraceLimit=0}catch(X){return j1$($)}try{return j1$($)}finally{Error.stackTraceLimit=Z}}function $m0($){if($.type==="object"||Array.isArray($.type)&&$.type.includes("object")){$.additionalProperties=!1;let{properties:X}=$;if(X!=null)for(let Q of Object.keys(X))X[Q]=AE(X[Q])}if($.items!=null)$.items=Array.isArray($.items)?$.items.map(AE):AE($.items);if($.anyOf!=null)$.anyOf=$.anyOf.map(AE);if($.allOf!=null)$.allOf=$.allOf.map(AE);if($.oneOf!=null)$.oneOf=$.oneOf.map(AE);let{definitions:Z}=$;if(Z!=null)for(let X of Object.keys(Z))Z[X]=AE(Z[X]);return $}function AE($){if(typeof $==="boolean")return $;return $m0($)}function dY(){return{}}function o14($,Z){var X,Q,Y;let G={type:"array"};if(((X=$.type)==null?void 0:X._def)&&((Y=(Q=$.type)==null?void 0:Q._def)==null?void 0:Y.typeName)!==t14.ZodAny)G.items=E6($.type._def,{...Z,currentPath:[...Z.currentPath,"items"]});if($.minLength)G.minItems=$.minLength.value;if($.maxLength)G.maxItems=$.maxLength.value;if($.exactLength)G.minItems=$.exactLength.value,G.maxItems=$.exactLength.value;return G}function r14($){let Z={type:"integer",format:"int64"};if(!$.checks)return Z;for(let X of $.checks)switch(X.kind){case"min":if(X.inclusive)Z.minimum=X.value;else Z.exclusiveMinimum=X.value;break;case"max":if(X.inclusive)Z.maximum=X.value;else Z.exclusiveMaximum=X.value;break;case"multipleOf":Z.multipleOf=X.value;break}return Z}function a14(){return{type:"boolean"}}function _1$($,Z){return E6($.type._def,Z)}function v1$($,Z,X){let Q=X!=null?X:Z.dateStrategy;if(Array.isArray(Q))return{anyOf:Q.map((Y,G)=>v1$($,Z,Y))};switch(Q){case"string":case"format:date-time":return{type:"string",format:"date-time"};case"format:date":return{type:"string",format:"date"};case"integer":return e14($)}}function $$4($,Z){return{...E6($.innerType._def,Z),default:$.defaultValue()}}function Z$4($,Z){return Z.effectStrategy==="input"?E6($.schema._def,Z):dY()}function X$4($){return{type:"string",enum:Array.from($.values)}}function Y$4($,Z){let X=[E6($.left._def,{...Z,currentPath:[...Z.currentPath,"allOf","0"]}),E6($.right._def,{...Z,currentPath:[...Z.currentPath,"allOf","1"]})].filter((Y)=>!!Y),Q=[];return X.forEach((Y)=>{if(Q$4(Y))Q.push(...Y.allOf);else{let G=Y;if("additionalProperties"in Y&&Y.additionalProperties===!1){let{additionalProperties:J,...W}=Y;G=W}Q.push(G)}}),Q.length?{allOf:Q}:void 0}function G$4($){let Z=typeof $.value;if(Z!=="bigint"&&Z!=="number"&&Z!=="boolean"&&Z!=="string")return{type:Array.isArray($.value)?"array":"object"};return{type:Z==="bigint"?"integer":Z,const:$.value}}function f1$($,Z){let X={type:"string"};if($.checks)for(let Q of $.checks)switch(Q.kind){case"min":X.minLength=typeof X.minLength==="number"?Math.max(X.minLength,Q.value):Q.value;break;case"max":X.maxLength=typeof X.maxLength==="number"?Math.min(X.maxLength,Q.value):Q.value;break;case"email":switch(Z.emailStrategy){case"format:email":f3(X,"email",Q.message,Z);break;case"format:idn-email":f3(X,"idn-email",Q.message,Z);break;case"pattern:zod":oX(X,v3.email,Q.message,Z);break}break;case"url":f3(X,"uri",Q.message,Z);break;case"uuid":f3(X,"uuid",Q.message,Z);break;case"regex":oX(X,Q.regex,Q.message,Z);break;case"cuid":oX(X,v3.cuid,Q.message,Z);break;case"cuid2":oX(X,v3.cuid2,Q.message,Z);break;case"startsWith":oX(X,RegExp(`^${nd0(Q.value,Z)}`),Q.message,Z);break;case"endsWith":oX(X,RegExp(`${nd0(Q.value,Z)}$`),Q.message,Z);break;case"datetime":f3(X,"date-time",Q.message,Z);break;case"date":f3(X,"date",Q.message,Z);break;case"time":f3(X,"time",Q.message,Z);break;case"duration":f3(X,"duration",Q.message,Z);break;case"length":X.minLength=typeof X.minLength==="number"?Math.max(X.minLength,Q.value):Q.value,X.maxLength=typeof X.maxLength==="number"?Math.min(X.maxLength,Q.value):Q.value;break;case"includes":{oX(X,RegExp(nd0(Q.value,Z)),Q.message,Z);break}case"ip":{if(Q.version!=="v6")f3(X,"ipv4",Q.message,Z);if(Q.version!=="v4")f3(X,"ipv6",Q.message,Z);break}case"base64url":oX(X,v3.base64url,Q.message,Z);break;case"jwt":oX(X,v3.jwt,Q.message,Z);break;case"cidr":{if(Q.version!=="v6")oX(X,v3.ipv4Cidr,Q.message,Z);if(Q.version!=="v4")oX(X,v3.ipv6Cidr,Q.message,Z);break}case"emoji":oX(X,v3.emoji(),Q.message,Z);break;case"ulid":{oX(X,v3.ulid,Q.message,Z);break}case"base64":{switch(Z.base64Strategy){case"format:binary":{f3(X,"binary",Q.message,Z);break}case"contentEncoding:base64":{X.contentEncoding="base64";break}case"pattern:zod":{oX(X,v3.base64,Q.message,Z);break}}break}case"nanoid":oX(X,v3.nanoid,Q.message,Z);case"toLowerCase":case"toUpperCase":case"trim":break;default:}return X}function nd0($,Z){return Z.patternStrategy==="escape"?W$4($):$}function W$4($){let Z="";for(let X=0;X<$.length;X++){if(!J$4.has($[X]))Z+="\\";Z+=$[X]}return Z}function f3($,Z,X,Q){var Y;if($.format||((Y=$.anyOf)==null?void 0:Y.some((G)=>G.format))){if(!$.anyOf)$.anyOf=[];if($.format)$.anyOf.push({format:$.format}),delete $.format;$.anyOf.push({format:Z,...X&&Q.errorMessages&&{errorMessage:{format:X}}})}else $.format=Z}function oX($,Z,X,Q){var Y;if($.pattern||((Y=$.allOf)==null?void 0:Y.some((G)=>G.pattern))){if(!$.allOf)$.allOf=[];if($.pattern)$.allOf.push({pattern:$.pattern}),delete $.pattern;$.allOf.push({pattern:P1$(Z,Q),...X&&Q.errorMessages&&{errorMessage:{pattern:X}}})}else $.pattern=P1$(Z,Q)}function P1$($,Z){var X;if(!Z.applyRegexFlags||!$.flags)return $.source;let Q={i:$.flags.includes("i"),m:$.flags.includes("m"),s:$.flags.includes("s")},Y=Q.i?$.source.toLowerCase():$.source,G="",J=!1,W=!1,K=!1;for(let F=0;F<Y.length;F++){if(J){G+=Y[F],J=!1;continue}if(Q.i){if(W){if(Y[F].match(/[a-z]/)){if(K)G+=Y[F],G+=`${Y[F-2]}-${Y[F]}`.toUpperCase(),K=!1;else if(Y[F+1]==="-"&&((X=Y[F+2])==null?void 0:X.match(/[a-z]/)))G+=Y[F],K=!0;else G+=`${Y[F]}${Y[F].toUpperCase()}`;continue}}else if(Y[F].match(/[a-z]/)){G+=`[${Y[F]}${Y[F].toUpperCase()}]`;continue}}if(Q.m){if(Y[F]==="^"){G+=`(^|(?<=[\r
|
|
894
894
|
]))`;continue}else if(Y[F]==="$"){G+=`($|(?=[\r
|
|
@@ -1408,7 +1408,7 @@ ${G}`.trim().slice(0,zF$)}function ZO4($){let Z=$.fields.priority?.name?.toLower
|
|
|
1408
1408
|
|
|
1409
1409
|
${O}`});if(!L)continue;try{await $.storage.jiraIntegrations.createCommentLink({commentId:L.id,organizationId:W,jiraCommentId:B.id})}catch(w){if(w.code==="23505"){await $.storage.taskBoard.deleteComment(L.id,W,hK);continue}throw w}}}class PF${ctx;organizationId;ids=new Map;constructor($,Z){this.ctx=$;this.organizationId=Z}async seed($){if($.length===0)return;let Z=await this.ctx.storage.sprints.upsertManyFromJira(this.organizationId,$.map(EF$));for(let[X,Q]of Z)this.ids.set(X,Q)}async localIdFor($){if(!$)return null;let Z=this.ids.get($.id);if(Z)return Z;let X=await this.ctx.storage.sprints.upsertFromJira(this.organizationId,EF$($));return this.ids.set($.id,X),X}}function EF$($){return{jiraSprintId:$.id,name:$.name,state:$.state,startsAt:$.startsAt,endsAt:$.endsAt}}function XO4($,Z){if($.size===0)return[];return Z.filter((X)=>!$.has(X.jiraIssueId))}async function QO4($,Z,X,Q){let Y=Z.organizationId,G=await X.searchIssueIds(`(${Q}) AND issuetype IN standardIssueTypes()`);if(G.size===0)return console.warn(`[jira] scope for org ${Y} came back empty \u2014 skipping reconciliation rather than archiving the whole board`),0;let J=XO4(G,await $.storage.jiraIntegrations.listLinkedIssuesOnBoard(Y));if(J.length===0)return 0;for(let W of J){let K=await $.storage.taskBoard.getById(W.itemId,Y);if(!K||K.status==="archived")continue;let F=await $.storage.taskBoard.update(W.itemId,Y,{status:"archived"},hK);await $.storage.taskBoard.recordActivity({taskBoardItemId:W.itemId,action:"status_changed",actorId:null,data:{from:K.status,to:"archived"}}),x$(Y,F),console.log(`[jira] ${W.jiraIssueKey} is no longer in board ${Z.boardId}'s scope \u2014 archived its card`)}return J.length}async function YO4($,Z){let{organizationId:X,boardId:Q}=Z;if(!Q)throw Error("No Jira board selected");let Y=TK$(Z.statusMapping);if(Y.size===0)throw Error("No status mapping configured");let G=Z.lastSyncedAt===null||Z.rescanPending,J=new BJ(Z.siteUrl,Z.email,Z.apiToken),{accountId:W}=await J.myself(),K=new No0(J),F=new Date,H=await J.getBoardScopeJql(Q),N=aB4(Z,H,F),U=new PF$($,X);await U.seed(await J.listBoardSprints(Q));let B={created:0,updated:0,unchanged:0,skipped:0,archived:0,unmappedStatuses:[]},O=new Set,L,w,E=0,j=0;while(E<Uo0&&j<jF$){j++;let P=await J.searchIssues({jql:N,nextPageToken:w});if(w=P.nextPageToken??void 0,P.issues.length===0){if(!w)break;continue}let I=await $.storage.jiraIntegrations.getLinksByIssueIds(X,P.issues.map((q)=>q.id));await K.resolve(P.issues.flatMap((q)=>[...Yt(q.fields.description),...(q.fields.comment?.comments??[]).flatMap((k)=>Yt(k.body))]));for(let q of P.issues){if(E>=Uo0)break;E++;let k=new Date(q.fields.updated);if(Number.isNaN(k.getTime()))throw Error(`Unparseable updated on ${q.key}`);let S=Y.get(q.fields.status.name);if(!S||!DF$(q)){if(!S&&DF$(q))O.add(q.fields.status.name);B.skipped++,L=k;continue}let m=I.get(q.id);if(m&&sB4(m.jiraUpdatedAt,k,G)){B.unchanged++,L=k;continue}let f=q.fields.status.name,b={title:q.fields.summary,description:await $O4(Z.siteUrl,q,K),priority:ZO4(q),sprintId:await U.localIdFor(oK$(q.sprints))};if(m){let i=m.jiraStatus!==f,c=await $.storage.taskBoard.getById(m.itemId,X),r=await $.storage.taskBoard.update(m.itemId,X,{...b,...i?{status:S}:{}},hK);if(await $.storage.jiraIntegrations.touchLink(m.itemId,{jiraStatus:f}),c&&i&&c.status!==S)await $.storage.taskBoard.recordActivity({taskBoardItemId:m.itemId,action:"status_changed",actorId:null,data:{from:c.status,to:S}});if(i&&!G)r=await LF$($,Z,r);await wF$($,Z,J,q,m.itemId,W,K),await $.storage.jiraIntegrations.touchLink(m.itemId,{jiraUpdatedAt:k}),x$(X,r),B.updated++}else{let i=await $.storage.taskBoard.create({organizationId:X,...b,status:S,by:hK});try{await $.storage.jiraIntegrations.createLink({itemId:i.id,organizationId:X,jiraIssueId:q.id,jiraIssueKey:q.key,jiraUpdatedAt:new Date(0),jiraStatus:f})}catch(c){if(c.code==="23505"){await $.storage.taskBoard.delete(i.id,X,hK),B.unchanged++,L=k;continue}throw c}if(!G)i=await LF$($,Z,i);await wF$($,Z,J,q,i.id,W,K),await $.storage.jiraIntegrations.touchLink(i.id,{jiraUpdatedAt:k}),x$(X,i),B.created++}L=k}if(!w)break}B.unmappedStatuses=[...O].sort();let z=eB4(E,j);if(!z)B.archived=await QO4($,Z,J,H);let A=G&&z;if(L===void 0&&E===0)return{counts:B,watermark:F,rescanPending:A};return{counts:B,watermark:L,rescanPending:A}}var hK="jira",Uo0=500,oB4=5,jF$=25,zF$=1e4,rB4;var ZL0=D(()=>{xD0();C6();JN();E5();$L0();Xo0();rB4={highest:"urgent",high:"high",medium:"medium",low:"low",lowest:"low"}});var AF$={};J4(AF$,{setJiraSyncRuntime:()=>Lo0,registerJiraSyncWorkflow:()=>Eo0,maybeEnqueueJiraStatusPush:()=>zO4,enqueueJiraCommentPush:()=>wo0});import{DBOS as YQ,SchedulerMode as GO4}from"@dbos-inc/dbos-sdk";function Lo0($){XL0=$}function Jt(){if(!XL0)throw Error("[jira] sync runtime not initialized \u2014 setJiraSyncRuntime() must run before the workflow fires");return XL0}function WN(){let{db:$,encryptionKey:Z}=Jt();return new qC($,new CY(Z))}function WO4(){return new QQ(Jt().db)}async function KO4($){try{let{db:Z}=Jt(),X=await WN().getById($);if(!X)return{id:$,error:"integration no longer exists"};if(!X.enabled)return{id:$};let Q=await o3(Z,X.organizationId);if(!Q)return{id:$,error:"organization no longer exists"};let Y=await Ug(Q,X);return"error"in Y?{id:$,error:Y.error}:{id:$}}catch(Z){return{id:$,error:Z instanceof Error?Z.message:String(Z)}}}async function FO4($,Z){let X=await YQ.runStep(()=>WN().listEnabledIds(),{name:"loadJiraIntegrations"});for(let Q of X){let Y=await YQ.runStep(()=>KO4(Q),{name:`syncJira:${Q}`});if(Y.error)console.warn(`[jira] sync ${Y.id} failed: ${Y.error}`)}}async function NO4($){let Z=WN();if(!(await Z.getByOrg($.organizationId))?.enabled)return null;let Q=await Z.getLinkByItemId($.taskBoardItemId,$.organizationId);if(!Q)return null;if(await Z.hasCommentLink($.commentId))return null;return{jiraIssueId:Q.jiraIssueId}}async function UO4($){return(await Jt().db.selectFrom("organization").select("slug").where("id","=",$).executeTakeFirst())?.slug??null}async function BO4($,Z,X){let Q=await WN().getByOrg($);if(!Q?.enabled)return null;let G=(await o3(Jt().db,$))?.orgFs;if(!G)return null;let J=new BJ(Q.siteUrl,Q.email,Q.apiToken);return BF$(X,{read:(W)=>G.read(W.volume,W.path).catch((K)=>{if(K instanceof VG)return null;throw K}),listAttachments:()=>J.listAttachments(Z),upload:(W)=>J.addAttachment(Z,W),mediaIdFor:(W)=>J.resolveMediaId(W)})}async function OO4($,Z,X){let Q=WN(),Y=await Q.getByOrg($.organizationId);if(!Y?.enabled)return null;let G=await Q.getLinkByItemId($.taskBoardItemId,$.organizationId);if(!G)return null;if(await Q.hasCommentLink($.commentId))return null;return(await new BJ(Y.siteUrl,Y.email,Y.apiToken).addComment(G.jiraIssueId,Z,{header:`${$.authorLabel} \xB7 via Studio:`,media:new Map(X)})).id}async function DO4($,Z){try{await WN().createCommentLink({commentId:$.commentId,organizationId:$.organizationId,jiraCommentId:Z})}catch(X){if(X.code!=="23505")throw X}}async function LO4($){let Z=$.body.slice(0,HO4),X=await YQ.runStep(()=>NO4($),{name:"resolveCommentTarget",retriesAllowed:!0,maxAttempts:3});if(!X)return;let Q=[],Y=bK$(Z);if(Y.length>0){let J=await YQ.runStep(()=>UO4($.organizationId),{name:"readOrgSlug",retriesAllowed:!0,maxAttempts:3});for(let W of UF$(Y,J??""))try{let K=await YQ.runStep(()=>BO4($.organizationId,X.jiraIssueId,W),{name:`attachCommentImage:${W.name}`,retriesAllowed:!0,maxAttempts:3});if(K)Q.push([W.target,K])}catch(K){if(!zK$(K))throw K;console.warn(`[jira] could not attach ${W.ref.path}:`,K)}}let G=await YQ.runStep(()=>OO4($,Z,Q),{name:"postCommentToJira",retriesAllowed:!1});if(!G)return;await YQ.runStep(()=>DO4($,G),{name:"recordCommentLink",retriesAllowed:!0,maxAttempts:4})}async function wO4($){let Z=WN(),X=await Z.getByOrg($.organizationId);if(!X?.enabled)return null;let Q=await Z.getLinkByItemId($.itemId,$.organizationId);if(!Q)return null;let Y=await WO4().getById($.itemId,$.organizationId);if(!Y)return null;if(mt0(X.statusMapping,Y.status,Q.jiraStatus))return null;let J=await new BJ(X.siteUrl,X.email,X.apiToken).listTransitions(Q.jiraIssueId),W=IK$({mapping:X.statusMapping,lane:Y.status,currentJiraStatus:Q.jiraStatus,availableTransitions:J.map((F)=>F.to.name)});if(W.kind!=="transition"){if(W.kind==="unreachable")console.warn(`[jira] ${Q.jiraIssueKey} is ${Y.status} on the board, but its workflow offers no transition to ${W.targets.join(" / ")} \u2014 `+"the card will not move on the Jira board");return null}let K=J.find((F)=>F.to.name===W.targetName);if(!K)return null;return{jiraIssueId:Q.jiraIssueId,transitionId:K.id,targetName:W.targetName}}async function EO4($,Z){let X=WN(),Q=await X.getByOrg($.organizationId);if(!Q?.enabled)return;let Y=await X.getLinkByItemId($.itemId,$.organizationId);if(!Y||Y.jiraStatus===Z.targetName)return;let G=new BJ(Q.siteUrl,Q.email,Q.apiToken);if(await G.getStatusName(Z.jiraIssueId)===Z.targetName){await X.touchLink($.itemId,{jiraStatus:Z.targetName});return}await G.transitionIssue(Z.jiraIssueId,Z.transitionId),await X.touchLink($.itemId,{jiraStatus:Z.targetName})}async function jO4($){let Z=await YQ.runStep(()=>wO4($),{name:"resolveStatusTransition",retriesAllowed:!0,maxAttempts:3});if(!Z)return;await YQ.runStep(()=>EO4($,Z),{name:"executeStatusTransition",retriesAllowed:!0,maxAttempts:3})}function zO4($,Z){if(Z.updatedBy===hK)return;if(!Do0||!XL0)return;let X=Do0;(async()=>{if(!await WN().getLinkByItemId(Z.id,$))return;await YQ.startWorkflow(X,{queueName:sD,workflowID:`jira-status:${Z.id}:${Z.status}:${Date.parse(Z.updatedAt)}`,enqueueOptions:{queuePartitionKey:$}})({organizationId:$,itemId:Z.id})})().catch((Q)=>{console.warn(`[jira] status push enqueue failed for ${Z.id}:`,Q instanceof Error?Q.message:Q)})}async function wo0($,Z){try{if(!Oo0)return;if(!await $.storage.jiraIntegrations.getLinkByItemId(Z.taskBoardItemId,Z.organizationId))return;await YQ.startWorkflow(Oo0,{queueName:sD,workflowID:`jira-cmt-push:${Z.commentId}`,enqueueOptions:{queuePartitionKey:Z.organizationId}})(Z)}catch(X){console.warn(`[jira] comment push enqueue failed for ${Z.commentId}:`,X instanceof Error?X.message:X)}}function Eo0(){if(Bo0)return;Bo0=YQ.registerWorkflow(FO4,{name:"jiraSyncWorkflow"}),YQ.registerScheduled(Bo0,{name:"jiraSyncWorkflow",crontab:JO4,mode:GO4.ExactlyOncePerIntervalWhenActive}),Oo0=YQ.registerWorkflow(LO4,{name:"jiraCommentPushWorkflow"}),Do0=YQ.registerWorkflow(jO4,{name:"jiraStatusPushWorkflow"})}var JO4="2-59/10 * * * *",XL0=null,HO4=30000,Bo0=null,Oo0=null,Do0=null;var QL0=D(()=>{PK$();bU();Fg();pD0();xK();Gw();$L0();OF$();et0();ZL0()});function YL0($,Z,X,Q){yY({event:$,organizationId:Z,properties:{task_id:X.id,reports_task:yQ(X),...Q}})}function x$($,Z){C5.emit($,{id:crypto.randomUUID(),type:G0$,source:"task-board",subject:Z.id,data:Z,time:new Date().toISOString()}),Promise.resolve().then(() => (QL0(),AF$)).then((X)=>X.maybeEnqueueJiraStatusPush($,Z)).catch((X)=>{console.warn("[jira] status push hook unavailable:",X)})}function TF$($,Z){C5.emit($,{id:crypto.randomUUID(),type:J0$,source:"task-board",subject:Z,data:{id:Z},time:new Date().toISOString()})}function PO4($,Z){return $?[$]:Z}async function VC($,Z,X){let Q=$.metadata?.runMetadata?.taskBoardItemId,Y=!Q&&X?await $.storage.taskBoard.linkedTaskIds(X,Z):[];return PO4(Q,Y)}async function RF$($,Z,X){let Q=$.organization?.id;if(!Q)return;try{for(let Y of await VC($,Q,X)){let G=await $.storage.taskBoard.getById(Y,Q);if(!G||GN[Z]<=GN[G.status])continue;let J=await $.storage.taskBoard.update(Y,Q,{status:Z},$.auth?.user?.id??G.updatedBy);if(await $.storage.taskBoard.recordActivity({taskBoardItemId:Y,action:"status_changed",actorId:null,data:{from:G.status,to:Z}}).catch((W)=>console.error("[task-board] activity log write failed",W)),x$(Q,J),Z==="in_progress")YL0("task_run_started",Q,J,{from:G.status})}}catch(Y){console.error("[task-board] run transition failed",Y)}}async function GL0($,Z){let X=$.organization?.id;if(!X)return;try{for(let Q of await VC($,X,Z)){let Y=await $.storage.taskBoard.openReviewCycleIfInProgress(Q,X);if(!Y)continue;x$(X,Y),YL0("task_run_completed",X,Y,{from:"in_progress",via:"pr_open"})}}catch(Q){console.error("[task-board] review-cycle open failed",Q)}}async function JL0($,Z,X,Q){let Y=$.organization?.id;if(!Y)return;try{let G=mD0(Z);if(!G)return;let J=await VC($,Y,Q);for(let W of J)await $.storage.taskBoard.linkPr({taskBoardItemId:W,organizationId:Y,url:G.url,prNumber:G.number,repoOwner:G.owner,repoName:G.repo,connectionId:X??null})}catch(G){console.error("[task-board] PR capture failed",G)}}async function Bg($,Z,X,Q){try{let Y=await $.advanceLinkedTasksToReviewOnThreadFinish(Z,X);for(let G of Y)x$(X,G),YL0("task_run_completed",X,G,{from:"in_progress",via:"thread_finish"});for(let G of Y)await $.clearRunRetry(G.id,X).catch(()=>{})}catch(Y){console.error("[task-board] thread-finish transition failed",Y)}await jo0($,Z,X),await zo0($,Q,Z,X)}function IF$($){return GN[$.status]>=GN.in_review||Boolean($.reviewCycleStartedAt)}async function jo0($,Z,X){try{let Q=await $.failedRunInfo(Z,X);if(!Q)return;let Y=BK$(Q);for(let G of await $.linkedTaskIds(Z,X)){let J=await $.getById(G,X);if(!J)continue;if(IF$(J))await $.relabelDeliveredFailure(Z,X,RO4).catch(()=>{});if(J.status!=="in_progress")continue;if(J.reviewCycleStartedAt)continue;if(J.threads.some((F)=>F.hasMessages&&F.status==="in_progress"))continue;let W=J.retryAttempts;if(W<Y){let F=aZ(TO4,AO4,W,2,0.5);if(!await $.scheduleRunRetry(G,X,W+1,new Date(Date.now()+F)))continue;await $.recordActivity({taskBoardItemId:G,action:"status_changed",actorId:null,data:{from:"in_progress",to:"in_progress",retry:W+1,of:Y,reason:Q.errorText??Q.kind}}).catch(()=>{});continue}let K=await $.returnToTodoAfterFailure(G,X,J.updatedBy);if(!K)continue;await $.recordActivity({taskBoardItemId:G,action:"status_changed",actorId:null,data:{from:"in_progress",to:"todo",reason:Q.errorText??Q.kind,retriesSpent:W}}).catch(()=>{}),x$(X,K),YL0("task_run_failed",X,J,{reason:Q.kind??"error",retries_spent:W})}}catch(Q){console.error("[task-board] failed-run reaction failed",Q)}}async function zo0($,Z,X,Q){try{for(let Y of await $.linkedTaskIds(X,Q)){let G=await $.getById(Y,Q);if(!G)continue;if(IF$(G))continue;if(G.threads.some((W)=>W.hasMessages&&(W.status===null||!Zt.has(W.status))))continue;if((await $.listPrs(Y,Q)).length>0)continue;await H0$(Z,Q,Y)}}catch(Y){console.error("[task-board] quota refund pass failed",Y)}}async function Po0($,Z){if(Z.status!=="in_progress"||!sQ(Z))return;try{let X=await $.storage.taskBoard.update(Z.id,Z.organizationId,{status:"in_review"},Z.updatedBy);await $.storage.taskBoard.recordActivity({taskBoardItemId:Z.id,action:"status_changed",actorId:null,data:{from:Z.status,to:"in_review"}}).catch(()=>{}),x$(Z.organizationId,X)}catch(X){console.error(`[task-board] parking ${Z.id} for review failed`,X)}}async function uK($,Z,X){let Q=Z.organizationId;if(Z.assigneeId!==Z8)return!1;try{await Po0($,Z);let Y=await $.storage.taskBoard.unassignSuperAgent(Z.id,Q,Z.updatedBy);if(!Y)return!1;return await z6($,{taskBoardItemId:Z.id,action:"assignee_changed",actorId:null,data:{from:Z.assigneeId,to:null,reason:X}}),console.warn(`[task-board] ${Z.id} handed to a human: ${X}`),x$(Q,Y),!0}catch(Y){return console.error(`[task-board] handing ${Z.id} to a human failed`,Y),!1}}async function qF$($,Z,X){if(!(X instanceof tX))return!1;if(X.reason!=="runs_exhausted")return!1;return await uK($,Z,"per-task run limit reached \u2014 the Super Agent can no longer re-dispatch "+"itself on this task. Re-run it manually to continue."),!0}async function MF$($,Z){let X=$.organization?.id;if(!X)return;try{let Q=await $.storage.taskBoard.reopenLinkedTasksOnThreadRun(Z,X);for(let Y of Q)x$(X,Y)}catch(Q){console.error("[task-board] thread-run reopen failed",Q)}}function kF$($){return $.includes("create_pull_request")||$.includes("createPullRequest")}function VF$($){if(IO4.test($))return!0;return qO4.test($)&&MO4.test($)}var AO4=30000,TO4=120000,RO4="Run ended after it had already delivered \u2014 the task moved on without it",IO4,qO4,MO4;var E5=D(()=>{sG();C4();xK();Kg();OK$();W4();en();C6();WX();yK();IO4=/\bgh\s+pr\s+create\b/,qO4=/api\.github\.com\/repos\/[^\s"']+\/pulls\b/,MO4=/(?:-X|--request)\s+POST/});function kO4($){if($.status==="completed")return"advance";if($.status==="failed"&&$.messageStorageVersion===2&&($.harnessId==="decopilot"||$.harnessId==="claude-code"))return"nudge";return"none"}function VO4($){return["This task is still In Progress on the board and your last run ended without finishing it.","","Look at what you already did (`git log`, `git status`, and the messages above), then either:","- finish the remaining work (and open the PR, if it needed code changes),","- or, if it's actually done, say so in one line \u2014 the board moves the card for you,",$==="decopilot"?"- or, if you're blocked on something only a human knows, call the `user_ask` tool.":"- or, if you're blocked on something only a human knows, say what you need and stop.","","Don't start over and don't redo work you already committed or pushed. You are on the same branch as before \u2014 push to it and update your existing pull request rather than opening a second one."].join(`
|
|
1410
1410
|
`)}async function SO4($,Z,X){await Gg($,Z,X,{messageId:`stall-nudge-${Z.id}-${X.id}`,prompt:VO4(X.harness_id),workflowID:`stall-nudge:${Z.id}:${X.id}`})}async function CO4($,Z){let X=await $.storage.threads.get(Z);if(!X)return{action:"none",thread:null};return{action:kO4({status:X.status,messageStorageVersion:X.message_storage_version,harnessId:X.harness_id}),thread:X}}function _O4($,Z=Date.now()){if($.status!=="in_progress")return!1;if($.run_started_at)return!1;return an($,Z)}async function vO4($,Z){let X=[];for(let Q of Z.threads){if(Q.status!=="in_progress")continue;let Y=await $.storage.threads.get(Q.threadId);if(!Y||!_O4(Y))continue;if(await $.storage.threads.markRunFailed(Q.threadId,Ao0,"abandoned"))X.push(Q.threadId),console.warn(`[task-board] failed never-started thread ${Q.threadId} on ${Z.id}`)}return X}async function SF$($,Z){let X=$.organization?.id;if(!X)return;for(let Q of Z){if(Q.status==="in_progress")try{if((await vO4($,Q)).length>0)continue}catch(J){console.error(`[task-board] reaping threads for ${Q.id} failed`,J)}let Y;try{Y=Q.repo!=null&&(await $.storage.taskBoard.listPrs(Q.id,X)).length>0}catch(J){console.error(`[task-board] listPrs for ${Q.id} failed`,J);continue}if(!ct0(Q,Y))continue;let G=Q.threads.find((J)=>J.hasMessages);if(!G)continue;try{let{action:J,thread:W}=await CO4($,G.threadId);if(J==="none"||!W)continue;if(J==="advance")await Bg($.storage.taskBoard,G.threadId,X,$.storage.organizationBilling);else await SO4($,Q,W)}catch(J){console.error(`[task-board] stall recovery failed for ${Q.id}`,J)}}}var Ao0="Run never started \u2014 no pod picked it up before the idle window elapsed";var To0=D(()=>{gD0();xK();E5()});import{z as OJ}from"zod";var fO4,SC;var Ro0=D(()=>{xD0();M0();vQ();WJ();To0();fO4=OJ.object({key:OJ.string(),title:OJ.string(),position:OJ.number(),role:OJ.string().nullable()}),SC=u({name:"TASK_BOARD_ITEM_LIST",description:"List all task board items for the organization, plus the `owner/name` repos this organization has imported (the valid values for a task's `repo` field).",annotations:{title:"List Task Board Items",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:OJ.object({}),outputSchema:OJ.object({items:OJ.array(ty),repos:OJ.array(OJ.string()),sprints:OJ.array(CJ$),columns:OJ.array(fO4)}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");let[Q,{items:Y},G,J]=await Promise.all([Z.storage.taskBoard.list(X),Z.storage.connections.list(X,{slug:"mcp-github"}),Z.storage.sprints.listByOrg(X),Yg(Z,X).then((K)=>K.columns())]),W=Fe1(Y);return SF$(Z,Q),{items:Q,repos:W,sprints:G,columns:J}}})});import{z as $G}from"zod";function yO4($){return xO4.some((Z)=>$[Z]!==void 0)}function gO4($,Z){let X=[];for(let{field:G,action:J}of bO4){if(Z[G]===$[G])continue;X.push({action:J,data:{from:$[G],to:Z[G]}})}if(Z.description!==$.description)X.push({action:"description_changed"});let Q=new Set($.tags.map((G)=>G.id));if(Z.tags.length!==$.tags.length||Z.tags.some((G)=>!Q.has(G.id)))X.push({action:"tags_changed",data:{from:$.tags,to:Z.tags}});return X}function hO4($,Z){if($!==Z8)return!1;if(!Z)return!1;return Z.assigneeId!==Z8?!0:Z.status==="todo"}function cO4($,Z,X){let Q=$!==void 0&&uO4.has($),Y=Z!==void 0&&sQ(Z);return X&&Q&&Y}function Io0($,Z){return $!==void 0&&dt0($)&&!Z}var bO4,xO4,uO4,CC;var WL0=D(()=>{M0();JZ();WJ();yK();mn0();JN();WX();uO();E5();Kg();sG();bO4=[{field:"status",action:"status_changed"},{field:"assigneeId",action:"assignee_changed"},{field:"priority",action:"priority_changed"},{field:"type",action:"type_changed"},{field:"dueDate",action:"due_date_changed"},{field:"title",action:"title_changed"}],xO4=["title","description","status","priority","type","assigneeId","repo","dueDate","sortOrder","tagIds"];uO4=new Set(["approved","merged","post_deploy_validation","done","archived"]);CC=u({name:"TASK_BOARD_ITEM_UPDATE",description:"Update a task board item's fields (title, description, status, priority, assignee), and/or link a chat thread to it.",annotations:{title:"Update Task Board Item",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:$G.object({id:$G.string(),title:$G.string().min(1).max(ZD0).optional(),description:$G.string().max($D0).nullable().optional(),status:i3.optional(),priority:LC.optional(),type:gn.optional(),assigneeId:$G.string().nullable().optional(),repo:$G.string().max(XD0).nullable().optional(),dueDate:$G.string().datetime().nullable().optional(),sortOrder:$G.number().optional(),tagIds:$G.array($G.string()).max(1000).optional(),linkThreadId:$G.string().optional(),prUrl:$G.string().nullable().optional().describe("GitHub pull request URL to link to this task, e.g. https://github.com/owner/repo/pull/123. Pass it after opening a PR for an existing card; linking one is what starts its review.")}),outputSchema:$G.object({item:ty}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");let Q=$.prUrl?tO($.prUrl):null;if($.prUrl&&!Q)throw Error(`Not a GitHub pull request URL: ${$.prUrl} (expected https://github.com/<owner>/<repo>/pull/<number>)`);if($.assigneeId)await QD0(Z,X,$.assigneeId);if($.linkThreadId){if(!await Z.storage.taskBoard.getById($.id,X))throw Error(`Task board item not found: ${$.id}`);if(!await Z.storage.threads.get($.linkThreadId))throw Error(`Thread not found: ${$.linkThreadId}`);await Z.storage.taskBoard.linkThread($.id,$.linkThreadId,X)}let Y=yO4($),G=Y?await Z.storage.taskBoard.getById($.id,X):null;if(Y&&!G)throw Error(`Task board item not found: ${$.id}`);if($.status!==void 0&&dt0($.status)){let H=await Z.storage.organizationSettings.get(X);if(Io0($.status,nX(H?.flags,"delivery_lanes_enabled")))throw Error("Delivery lanes are not enabled for this organization \u2014 enable "+"them in Settings before moving a task to Approved, Merged, or Post-deploy Validation.")}let J=eH.getStore()!==void 0;if(cO4($.status,G??void 0,J))throw Error("This task is under review \u2014 a run can't move it to Done or Archived. "+"Leave it for the reviewer; only a person, or TASK_BOARD_REVIEW_DECISION on a reviewer's own run, closes out a task under review.");let W=$.assigneeId!==void 0&&$.assigneeId!==(G?.assigneeId??null),K=hO4($.assigneeId,G);if(G&&yQ(G)){if($.title!==void 0||$.description!==void 0||$.priority!==void 0)throw Error("This task was generated from your report and can't be edited \u2014 create your own task instead.");if(K)await Fy(Z,G,HO())}if($.tagIds!==void 0){let H=await Z.storage.tags.listOrgTags(X),N=new Set(H.map((U)=>U.id));for(let U of $.tagIds)if(!N.has(U))throw Error(`Tag not found: ${U}`);await Z.storage.taskBoard.setItemTags($.id,$.tagIds,o0(Z))}let F;if(Y)F=await Z.storage.taskBoard.update($.id,X,{title:$.title,description:$.description,status:K?"todo":$.status,priority:$.priority,type:$.type,assigneeId:$.assigneeId,assignedBy:W?$.assigneeId?o0(Z):null:void 0,repo:$.repo,dueDate:$.dueDate,sortOrder:$.sortOrder},o0(Z));else{let H=await Z.storage.taskBoard.getById($.id,X);if(!H)throw Error(`Task board item not found: ${$.id}`);F=H}if(Q)await Z.storage.taskBoard.linkPr({taskBoardItemId:F.id,organizationId:X,url:Q.url,prNumber:Q.number,repoOwner:Q.owner,repoName:Q.repo,connectionId:null});if(G){let H=o0(Z),N=gO4(G,F);if(N.length>0)await DK$(Z,N.map((U)=>({taskBoardItemId:F.id,actorId:H,...U,alsoSubscribe:U.action==="assignee_changed"&&F.assigneeId!==Z8?[F.assigneeId]:void 0})))}if(G&&F.description!==G.description)await Z.storage.notifications.notifyMentions({taskBoardItemId:F.id,organizationId:X,actorId:o0(Z),body:F.description??"",previousBody:G.description});if(Y||$.linkThreadId||Q)x$(X,F);if(K)await sO(Z,F,{userInitiated:!0});return{item:F}}})});import{z as KL0}from"zod";var _C;var qo0=D(()=>{M0();E5();_C=u({name:"TASK_BOARD_ITEM_DELETE",description:"Delete a task board item. A reports-pushed task also dismisses its finding, so the next diagnostic import won't re-create the card.",annotations:{title:"Delete Task Board Item",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:KL0.object({id:KL0.string()}),outputSchema:KL0.object({success:KL0.boolean()}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");if(!await Z.storage.taskBoard.delete($.id,X,o0(Z)??"system"))throw Error(`Task board item not found: ${$.id}`);return TF$(X,$.id),{success:!0}}})});function vC($){if($.length===0)return!1;let Z=new Map;for(let X of $){let Q=`${X.repoOwner}/${X.repoName}`.toLowerCase(),Y=Z.get(Q);if(Y)Y.push(X);else Z.set(Q,[X])}return[...Z.values()].every(lO4)}function lO4($){return $.some((Z)=>Z.merged===!0)&&$.every((Z)=>Z.merged===!0||Z.state==="closed")}async function dO4($,Z,X,Q){let Y=await $.storage.taskBoard.getById(X,Z);if(!Y||Y.status!=="done")return!1;let G=await $.storage.taskBoard.listPrs(X,Z),J=await Promise.all(G.map(async(K)=>({...K,...await Q($,Z,K)})));if(!vC(J))return!1;let W=await $.storage.taskBoard.update(X,Z,{status:"archived"},Y.updatedBy);return await z6($,{taskBoardItemId:X,action:"status_changed",actorId:null,data:{from:"done",to:"archived",reason:"merged_pr_auto_archive"}}),x$(Z,W),!0}async function CF$($,Z,X,Q=HL0){let Y=0;for(let G of X)try{if(await dO4($,Z,G,Q))Y+=1}catch(J){console.error(`[task-board-archive] ${G} failed`,J)}return{archived:Y}}function FL0($){let Z=new Map;for(let{id:X,organizationId:Q}of $){let Y=Z.get(Q);if(Y)Y.push(X);else Z.set(Q,[X])}return[...Z].map(([X,Q])=>({organizationId:X,itemIds:Q}))}var Og=D(()=>{WX();ZG();E5()});function mO4($){let Z=new Map($.map((G)=>[G.id,G])),X=new Map;for(let G of ny($)){let J=_F$(G.owner,G.repo);X.set(J,[...X.get(J)??[],G])}if(X.size!==1)return null;let Q=[...X.values()][0],Y=Q.find((G)=>{let J=Z.get(G.connectionId);return J?EE(J):!1})??Q[0];return{connectionId:Y.connectionId,owner:Y.owner,name:Y.repo,installationId:Y.installationId,url:`https://github.com/${Y.owner}/${Y.repo}`}}async function NL0($,Z){if(!Is())return console.warn(`[task-board] claude-code skipped for org ${Z}: `+"hosted sandbox unavailable \u2014 running Decopilot"),null;try{let{items:X}=await $.storage.connections.list(Z,{slug:"mcp-github"}),Q=mO4(X);if(Q)return{repo:Q};let Y=new Map;for(let J of ny(X)){let W=_F$(J.owner,J.repo);if(!Y.has(W))Y.set(W,{connectionId:J.connectionId,repo:`${J.owner}/${J.repo}`})}let G=Y;if(G.size===0)return console.warn(`[task-board] claude-code skipped for org ${Z}: `+"no importable repos \u2014 running Decopilot"),null;return console.warn(`[task-board] claude-code for org ${Z}: ${G.size} importable repos \u2014 the run picks one with TASK_ADD_REPO`),{choices:[...G.values()]}}catch(X){return console.warn("[task-board] repo lookup for claude-code failed",X),null}}function vF$($,Z,X){let Q=["You've been assigned this task. Complete it and finish with a pull request if it makes sense (like a coding task) or is explicitly requested.","","You are running AUTONOMOUSLY \u2014 no human is watching, so drive this to "+"completion yourself. Make reasonable decisions and move on; do not stop to ask for confirmation.","",`Title: ${$.title}`];if($.description)Q.push("","Description:",$.description);if(Q.push("",Z?`The repository ${Z.owner}/${Z.name} is already cloned at your working directory, on its own branch. \`git\` and \`gh\` are authenticated. ${Sp}`:["Your working directory is EMPTY: this organization has several repositories, so nothing has been cloned yet. FIRST call `mcp__studio__TASK_ADD_REPO` with the connectionId of the repository this task is about. It clones that repository into your working directory and waits for the checkout, so once it returns the repository is there on its own branch and `git` and `gh` are authenticated. Do not read files, run `git`, or run `gh` before it returns; there is nothing there yet.","","Repositories in this organization:",...(X?.repoChoices??[]).map((Y)=>`- ${Y.repo} (connectionId: ${Y.connectionId})`),X?.repoChoices?.length?"Start with the one the task is about. If it turns out to need a change in "+"another of them too, call `mcp__studio__TASK_ADD_REPO` again \u2014 repositories "+"accumulate, so a second call adds a checkout beside the first rather than replacing it. Each lands in its own directory and keeps its own git remote, so open one pull request per repository you changed.":"Call `mcp__studio__TASK_ADD_REPO` with no arguments to list them."].join(`
|
|
1411
|
-
`),""),X?.resolveConflict&&X.pr)Q.push(`Pull request #${X.pr.number} (${X.pr.url}) is approved but has a MERGE CONFLICT with its base branch.`,`Check that branch out (\`gh pr checkout ${X.pr.number}\`), merge or rebase the base branch into it, resolve the conflicts, and push to update the SAME pull request \u2014 do NOT open a new one. Resolve by preserving BOTH sides' intent; never blindly discard either side, and change only what the conflict requires.`,"");else if(X?.feedback)Q.push(X.pr?`A reviewer requested changes on pull request #${X.pr.number} (${X.pr.url}):`:"A reviewer requested changes on your previous work:",X.feedback,X.pr?`Check that branch out (\`gh pr checkout ${X.pr.number}\`) before editing, address the feedback, then push to update the SAME pull request \u2014 do NOT open a new one.`:"Address this feedback.","");else if(X?.pr)Q.push(`This task already has an open pull request #${X.pr.number} (${X.pr.url}), and you are already on its branch.`,"Continue that work: commit and push to update the SAME pull request \u2014 do NOT open a new one. If it already does everything the task asks, say so and stop rather than changing it.","");return Q.push("How to finish:","- Make the change, commit it, push the branch, and open a pull request"+(X?.pr?" \u2014 or push to the existing one, per the instruction above.":"."),"- Change only what the task needs. Don't refactor around it.","- The change must be REACHABLE from the surface the task names: edit the component that route actually renders, not one that merely looks like the right place. A change nothing imports is dead code, and it is the most common reason a task comes back rejected.","- Before handing over, VERIFY the task's outcome LOCALLY, in the sandbox: exercise the affected code path (the dev server hot-reloads, so hit the route it renders) and confirm the behaviour actually happens. A green test suite is not the bar. Do NOT wait for, or verify against, the PR's deploy preview \u2014 a reviewer checks that after you hand over.","- As soon as `gh pr create` prints the URL, call `mcp__studio__TASK_BOARD_ITEM_PR_LINK` with that url. Do this even if you also mention the PR in a comment \u2014 the reviewers are dispatched from the linked PR, not from your message.",'- If the task turns out to need no code change, do NOT open a PR: explain why in a comment on the task (`mcp__studio__TASK_BOARD_COMMENT_CREATE`) and move it to "done". There is nothing for a reviewer to review, so leaving it for one would strand it.',`- Anything a reviewer should know (a decision you made, something you found and deliberately left alone, a question) goes on the task as a comment: \`mcp__studio__TASK_BOARD_COMMENT_CREATE\` with taskBoardItemId "${$.id}". Read what's already there first with \`mcp__studio__TASK_BOARD_COMMENT_LIST\` \u2014 a comment may be addressed to you.`,"",`(task id: ${$.id})`),Q.join(`
|
|
1411
|
+
`),""),X?.resolveConflict&&X.pr)Q.push(`Pull request #${X.pr.number} (${X.pr.url}) is approved but has a MERGE CONFLICT with its base branch.`,`Check that branch out (\`gh pr checkout ${X.pr.number}\`), merge or rebase the base branch into it, resolve the conflicts, and push to update the SAME pull request \u2014 do NOT open a new one. Resolve by preserving BOTH sides' intent; never blindly discard either side, and change only what the conflict requires.`,"");else if(X?.feedback)Q.push(X.pr?`A reviewer requested changes on pull request #${X.pr.number} (${X.pr.url}):`:"A reviewer requested changes on your previous work:",X.feedback,X.pr?`Check that branch out (\`gh pr checkout ${X.pr.number}\`) before editing, address the feedback, then push to update the SAME pull request \u2014 do NOT open a new one.`:"Address this feedback.","");else if(X?.pr)Q.push(`This task already has an open pull request #${X.pr.number} (${X.pr.url}), and you are already on its branch.`,"Continue that work: commit and push to update the SAME pull request \u2014 do NOT open a new one. If it already does everything the task asks, say so and stop rather than changing it.","");return Q.push("How to finish:","- Make the change, commit it, push the branch, and open a pull request"+(X?.pr?" \u2014 or push to the existing one, per the instruction above.":"."),"- Change only what the task needs. Don't refactor around it.","- The change must be REACHABLE from the surface the task names: edit the component that route actually renders, not one that merely looks like the right place. A change nothing imports is dead code, and it is the most common reason a task comes back rejected.","- Before handing over, VERIFY the task's outcome LOCALLY, in the sandbox: exercise the affected code path (the dev server hot-reloads, so hit the route it renders) and confirm the behaviour actually happens. A green test suite is not the bar. Do NOT wait for, or verify against, the PR's deploy preview \u2014 a reviewer checks that after you hand over.","- For a VISUAL change that means LOOKING at it: `qa-screenshot <url> <path>.png [--mobile] [--full] [--selector=<css>]` renders the page in headless Chromium \u2014 it reaches your own dev server on localhost, and unlike `curl` it runs the page's JS, so lazily-rendered sections are actually there. Then `Read` the file: a screenshot you never opened is not verification. It is already installed; do NOT look for playwright in the repo's `node_modules` or start a browser yourself.","- As soon as `gh pr create` prints the URL, call `mcp__studio__TASK_BOARD_ITEM_PR_LINK` with that url. Do this even if you also mention the PR in a comment \u2014 the reviewers are dispatched from the linked PR, not from your message.",'- If the task turns out to need no code change, do NOT open a PR: explain why in a comment on the task (`mcp__studio__TASK_BOARD_COMMENT_CREATE`) and move it to "done". There is nothing for a reviewer to review, so leaving it for one would strand it.',`- Anything a reviewer should know (a decision you made, something you found and deliberately left alone, a question) goes on the task as a comment: \`mcp__studio__TASK_BOARD_COMMENT_CREATE\` with taskBoardItemId "${$.id}". Read what's already there first with \`mcp__studio__TASK_BOARD_COMMENT_LIST\` \u2014 a comment may be addressed to you.`,"",`(task id: ${$.id})`),Q.join(`
|
|
1412
1412
|
`)}var _F$=($,Z)=>`${$}/${Z}`.toLowerCase();var Mo0=D(()=>{aO0();vQ();C6();R$()});import{createHmac as iO4,randomBytes as pO4,timingSafeEqual as nO4}from"crypto";function tO4(){if(UL0)return UL0;let $;try{let Z=b0();$=Z.studioJwtSecret??Z.betterAuthSecret}catch{$=void 0}return UL0=$?Buffer.from($):pO4(32),UL0}function ko0($,Z,X){return`rtok_${iO4("sha256",tO4()).update(`${$}:${Z}:${X.toISOString()}`).digest("base64url")}`}function fF$($,Z,X,Q){let Y=Buffer.from($),G=Buffer.from(ko0(Z,X,Q));return Y.length===G.length&&nO4(Y,G)}var UL0=null;var Vo0=D(()=>{R$()});import{createHash as oO4}from"crypto";function Wt($,Z){if($.status===null||bF$.has($.status))return!1;return!an({updated_at:$.lastActiveAt,last_progress_at:null},Z)}function rO4($,Z){return $.threads.some((X)=>!LK.some((Q)=>KO(X.title,Q))&&Wt(X,Z))}function eO4($,Z){return Z-$>=sO4}async function BL0($,Z,X){let Q=await $.storage.organizationSettings.get(Z.organizationId),Y=bH(Q?.flags);if(Y.length===0)return;if(rO4(Z,Date.now()))return;let G=nX(Q?.flags,"cheap_reviewer_model")?"reviewer":"default",J=await $.storage.taskBoard.listActivity(Z.id,Z.organizationId),W=Z.reviewCycleStartedAt,K=xH(J,W),F=new Date(K),H=FO(J,{cycleStartedAt:W});await Promise.all(Y.map(async(N)=>{let U=H.has(N);if(!U){let O=JD4(J,K),L=GD4(Z,N,K,O);if(L){await HD4($,Z,N,L).catch((w)=>console.error(`[task-board] ${N} verdict nudge failed`,w));return}if(KD4(O,Date.now()))return}if(QD4(Z,N,K,Date.now(),U)){await uK($,Z,`${wK[N]} failed ${So0} times on `+"this review \u2014 it will not be retried");return}if(X?.previewMatchesHead===!1){if(eO4(K,Date.now()))await uK($,Z,"the pull request's deploy preview is not showing its latest commit (its checks never went green), so the Reviewer cannot verify this change against what the PR actually does");return}if(YD4(Z,N,K,Date.now(),U))return;let B=$D4(Z,N,K,Date.now(),U);await BD4($,Z,N,F,B,G).catch((O)=>console.error(`[task-board] ${N} reviewer enqueue failed`,O))}))}function $D4($,Z,X,Q=Date.now(),Y=!0){return $.threads.filter((G)=>KO(G.title,Z)&&Co0(G,Q,Y)&&new Date(G.createdAt).getTime()>=X).length}function ZD4($,Z){if(!$||!Z||!("choices"in Z))return null;return Z.choices.find((X)=>X.repo===$)?.connectionId??null}function XD4($,Z,X){let Q=$.threads.filter((Y)=>KO(Y.title,Z)&&Y.status==="completed"&&new Date(Y.createdAt).getTime()<X).map((Y)=>new Date(Y.lastActiveAt).getTime()).filter((Y)=>Number.isFinite(Y));return Q.length===0?0:Math.max(...Q)}function Co0($,Z,X=!0){if($.status==="failed")return!0;if($.status!==null&&bF$.has($.status))return!X;return $.status!==null&&!Wt($,Z)}function xF$($,Z,X,Q=Date.now()){return $.threads.filter((Y)=>{if(!KO(Y.title,Z))return!1;return Wt(Y,Q)||new Date(Y.createdAt).getTime()>=X})}function QD4($,Z,X,Q=Date.now(),Y=!0){let G=xF$($,Z,X,Q);return G.length>0&&G.every((J)=>Co0(J,Q,Y))&&G.length>=So0}function YD4($,Z,X,Q=Date.now(),Y=!0){let G=xF$($,Z,X,Q);if(G.length===0)return!1;if(G.some((W)=>Wt(W,Q)))return!0;let J=G.filter((W)=>Co0(W,Q,Y));if(J.length>=So0)return!0;return J.length!==G.length}function GD4($,Z,X,Q,Y=Date.now()){return $.threads.find((G)=>KO(G.title,Z)&&G.status==="completed"&&!Wt(G,Y)&&new Date(G.createdAt).getTime()>=X&&!Q.has(G.threadId))??null}function JD4($,Z){let X=new Map;for(let Q of $){if(Q.action!=="review_verdict_requested")continue;let Y=new Date(Q.occurredAt).getTime();if(Y<Z)continue;let G=Q.data?.threadId;if(typeof G==="string")X.set(G,Y)}return X}function KD4($,Z){for(let X of $.values())if(Z-X<WD4)return!0;return!1}function FD4($){return[`Your ${wK[$]} run ended without recording a decision, so the task is stuck: nothing ships and nobody is told why. A review that reaches no verdict is not a review.`,"","Do exactly ONE thing in this run and then stop:","- Call `TASK_BOARD_REVIEW_DECISION` now, with the verdict your review already reached and notes that say what you checked.","- Approve ONLY if you actually exercised the change and it holds. If you could not finish \u2014 a check never came back, a preview never rendered, you ran out of room \u2014 `request_changes` and say exactly what is unresolved. That hands the card to a person, which is the correct outcome for an unfinished review.","- Do NOT re-run the review, do NOT change any code, and do NOT wait on any background task: whatever you know right now is the verdict."].join(`
|
|
1413
1413
|
`)}async function HD4($,Z,X,Q){let Y=await $.storage.threads.get(Q.threadId);if(!Y||Y.message_storage_version!==2)return;await $.storage.taskBoard.recordActivity({taskBoardItemId:Z.id,action:"review_verdict_requested",actorId:null,data:{reviewer:X,threadId:Q.threadId}}),console.warn(`[task-board] ${X} reviewer on ${Z.id} completed with no verdict \u2014 `+"asking for one"),await Gg($,Z,Y,{messageId:`review-verdict-${Q.threadId}`,prompt:FD4(X),workflowID:`review-verdict:${Q.threadId}`,runClass:"reviewer"})}function ND4($,Z,X,Q){return`review:${$}:${Z}:${X.toISOString()}:${Q}`}function UD4($){return`thrd_${oO4("sha256").update($).digest("hex").slice(0,32)}`}async function BD4($,Z,X,Q,Y,G){let J=Z.organizationId,W=ko0(Z.id,X,Q),K=await NL0($,J),F=K&&"repo"in K?K.repo:null,H=K!==null,N=XD4(Z,X,Q.getTime()),U=ZD4(Z.repo,K),B=H?"mcp__studio__TASK_BOARD_ITEM_PRS_GET":"TASK_BOARD_ITEM_PRS_GET",O=H?"mcp__studio__TASK_BOARD_REVIEW_DECISION":"TASK_BOARD_REVIEW_DECISION",L=H?"mcp__studio__TASK_BOARD_COMMENT_CREATE":"TASK_BOARD_COMMENT_CREATE",w=H?"mcp__studio__TASK_BOARD_COMMENT_LIST":"TASK_BOARD_COMMENT_LIST",E=[aO4[X],"","You are running AUTONOMOUSLY \u2014 no human is watching this run. Making the "+'approve / request-changes call IS your job; you are the decision-maker, not an assistant asking a human to decide. NEVER use `user_ask` to ask whether to approve, or to confirm an obvious call ("Approve the PR?"). Reserve `user_ask` for a genuine, unresolvable blocker only a human can clear (e.g. a missing credential, or a requirement so ambiguous you '+"truly cannot judge the outcome) \u2014 that should be rare. When in doubt "+"between asking and deciding, DECIDE.","","Do NOT merge the pull request \u2014 the board does that itself once your "+"approval is in. Pushing fixes to the PR's own branch is expected of you; opening a second pull request, force-pushing, or touching any other ref is not."].join(`
|
|
1414
1414
|
`),j=[...H?[]:[E,""],`Task title: ${Z.title}`,Z.description?`
|
|
@@ -2921,7 +2921,7 @@ Respond with the structured verdict and a short reason.`,sc$;var $l$=D(()=>{D4()
|
|
|
2921
2921
|
${G.join(`
|
|
2922
2922
|
`)}`:Y}function kN6($){let Z=new Set;for(let X of $)for(let Q of X.split(`
|
|
2923
2923
|
`)){let Y=Q.trim();if(/^Co-authored-by:\s/i.test(Y))Z.add(Y)}return[...Z]}var bl$=200,jN6=12,PN6,TN6=300,P71=3;var A71=D(()=>{dD();UT0();PN6={aheadBy:0,behindBy:0,files:[]}});function SN6($){if(!$||$.includes(".."))return!1;return VN6.test($)}function yl$($){let Z=typeof $.__resolveType==="string"?$.__resolveType:null;if(!Z||!SN6(Z))return null;let{__resolveType:X,...Q}=$;return{resolveType:Z,payload:Q}}function gl$($,Z){return`${$.replace(/\/+$/,"")}/deco/invoke/${Z}`}var VN6;var hl$=D(()=>{VN6=/^[\w./@-]+$/});function Os($,Z){let X=$?.githubRepo;if(!X?.owner||!X?.name)return null;if(!X.connectionId)return X;if(!Z.includes(X.connectionId))return null;return X}async function ul$($,Z,X,Q){if(!Q.connectionId)throw new Uv("Push requires a connected GitHub account. Connect mcp-github for this project and restart the sandbox.");let Y=$.organization?.id;if(!Y)throw new Uv(G9);await MO({ctx:$,connectionId:Q.connectionId,organizationId:Y,forceRefresh:!0,onLegacyMintError:(H)=>{let N=H instanceof Error?H.message:G9;throw new Uv(N)}});let{cloneUrl:G,gitUserName:J,gitUserEmail:W}=await MK(Q.connectionId,Q.owner,Q.name,$.db,$.vault).catch((H)=>{let{code:N,message:U}=T5$(H instanceof Error?H.message:String(H));throw N?new Uv(U):H}),K=du($),F=await Z.proxyDaemonRequest(X,"/_sandbox/config",{method:"PUT",headers:new Headers({"content-type":"application/json"}),body:JSON.stringify({git:{repository:{cloneUrl:G},identity:{userName:J,userEmail:W}},...K?{operator:K}:{}})});if(!F.ok){let H=await qO(F,CN6).catch(()=>F.statusText);throw Error(`Failed to refresh sandbox git credentials (${F.status}): ${H}`)}}var CN6=10485760,Uv;var T71=D(()=>{QJ();ZT0();Wn();Li0();qy();Uv=class Uv extends Error{constructor($){super($);this.name="GitPushAuthError"}}});function vN6($){let Z=$.startsWith("thread:")?$.slice(7):$;if(!Z||Z.length>255||Z.includes("..")||Z.startsWith("/")||Z.endsWith("/")||Z.endsWith(".lock")||!_N6.test(Z))throw Error(`Invalid branch name: ${$}`)}function Bv($){return AbortSignal.any([$.req.raw.signal,AbortSignal.timeout(bN6)])}async function yN6($,Z){let X=$.var.studioContext,Q=ZJ(Z.branch),Y=$.req.query("thread")??Q,G=Y&&Y===Q?Z.branchThread:Y?await X.storage.threads.get(Y).catch(()=>null):null,J=G?.virtual_mcp_id===Z.virtualMcpId?G:null,W=DC(J?.metadata?.runtime);if(W)return W;let K=pO0(Z.virtualMcpMetadata),F=K==="cms"?await Y71(X,{claimName:Z.claimName}):"alive",H=K==="cms"&&F!=="alive"?"cms":"sandbox",N=!!J&&(F==="gone"||F==="alive"&&K==="cms");if(N&&J)xn(X,J.id,H);if(K==="cms")console.log("sandbox proxy: no runtime stamp",{route:$.req.path,method:$.req.method,reason:J?"unstamped":"threadless",liveness:F,resolved:H,stamped:N});return H}async function gN6($){let Z=$.get("vmClaim");if(Z.runner)return Z.runner;try{return await ZQ($.var.studioContext)}catch{return null}}function Ov($){let{runner:Z}=$.get("vmClaim");if(!Z)return $.json({error:"No sandbox runner configured"},503);return Z}async function tu($){let{virtualMcpMetadata:Z,connectionIds:X}=$.get("vmClaim"),Q=$.var.studioContext,Y=Os(Z,X);if(!Y)throw new u4(404,"AUTH","repo","Project has no GitHub repository");let G=t(Q);return XT0(Q,G.id,Y)}function R71($,Z){if(Z instanceof WA0)return $.json({error:Z.message},429,{...P5,...Z.retryAfterMs===null?{}:{"Retry-After":String(Math.ceil(Z.retryAfterMs/1000))}});if(Z instanceof u4){let Q=Z.status===404?404:Z.status===409||Z.status===422?409:502;return $.json({error:Z.message},Q,P5)}let X=Z instanceof Error?Z.message:String(Z);return $.json({error:X},502,P5)}async function dl$($,Z,X){let Q;try{Q=await fetch(Z,X)}catch{return $.json({error:"Preview unreachable"},502)}let Y;try{Y=await Q.text()}catch{return $.json({error:"Preview unreachable"},502)}return new Response(Y,{status:Q.status,headers:{"content-type":Q.headers.get("content-type")??"application/json"}})}async function ml$($){try{let Z=await tu($),X=await BT0(Z,$.get("vmClaim").branch);return $.json(X,200,P5)}catch(Z){return R71($,Z)}}function Ds($,Z){let Q=(LT0.get($)??Promise.resolve()).catch(()=>{}).then(Z),Y=Q.catch(()=>{});return LT0.set($,Y),Y.finally(()=>{if(LT0.get($)===Y)LT0.delete($)}),Q}async function tZ($,Z,X){if(!X?.runner&&$.get("vmClaim").runtime==="cms")return $.json({error:"sandbox not found: this session is sandbox-less"},404,P5);let Q=X?.runner??Ov($);if(Q instanceof Response)return Q;let{claimName:Y,userId:G,projectRef:J}=$.get("vmClaim"),W=X?.method??"POST",K=null,F=new Headers;if(X?.jsonBody!==void 0)K=X.jsonBody,F.set("content-type","application/json");else if(X?.forwardJsonBody)K=await $.req.text(),F.set("content-type","application/json");let H=X?.signal,N={method:W,headers:F,body:K,...H?{signal:H}:{}},U=async()=>{let B=await Q.proxyDaemonRequest(Y,Z,N);if(X?.map404to410&&B.status===404){try{await B.body?.cancel()}catch{}if(await Q.adoptLiveClaim({userId:G,projectRef:J},Y))B=await Q.proxyDaemonRequest(Y,Z,N);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",...P5}})}}let O=await B.text(),L=X?.redactRepoDir?hN6(O):O,w=B.headers.get("content-type")??"application/json";return new Response(L,{status:B.status,headers:{"content-type":w,...P5}})};try{if(H){let B=U();return B.catch(()=>{}),await Promise.race([B,new Promise((L,w)=>{if(H.aborted)return w(H.reason);H.addEventListener("abort",()=>w(H.reason),{once:!0})})])}return await U()}catch(B){let O=B instanceof Error?B.message:String(B);return $.json({error:`Daemon unreachable: ${O}`},502)}}function hN6($){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 wT0($,Z,X,Q="GET",Y){let G=await $.proxyDaemonRequest(Z,X,{method:Q,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,X,{method:Q,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 uN6($){return il$.includes($)}var _N6,cl$=524288,fN6=65536,bN6=1e4,ll$=2000,xN6,LT0,P5,il$,pl$=()=>{let $=new H1;$.use("/:virtualMcpId/:branch/*",xN6),$.post("/:virtualMcpId/:branch/write",(X)=>tZ(X,"/_sandbox/write",{forwardJsonBody:!0,signal:Bv(X)})),$.post("/:virtualMcpId/:branch/unlink",(X)=>tZ(X,"/_sandbox/unlink",{forwardJsonBody:!0,signal:Bv(X)})),$.post("/:virtualMcpId/:branch/mkdir",(X)=>tZ(X,"/_sandbox/mkdir",{forwardJsonBody:!0,signal:Bv(X)})),$.post("/:virtualMcpId/:branch/rename",(X)=>tZ(X,"/_sandbox/rename",{forwardJsonBody:!0,signal:Bv(X)})),$.post("/:virtualMcpId/:branch/read",(X)=>tZ(X,"/_sandbox/read",{forwardJsonBody:!0,signal:Bv(X)})),$.post("/:virtualMcpId/:branch/glob",(X)=>tZ(X,"/_sandbox/glob",{forwardJsonBody:!0,signal:Bv(X)})),$.post("/:virtualMcpId/:branch/grep",(X)=>tZ(X,"/_sandbox/grep",{forwardJsonBody:!0,signal:Bv(X)})),$.post("/:virtualMcpId/:branch/exec/:script",async(X)=>{let Q=X.req.param("script");if(!Q)return X.json({error:"missing script name"},400);return tZ(X,`/_sandbox/exec/${encodeURIComponent(Q)}`)}),$.post("/:virtualMcpId/:branch/exec/:script/kill",async(X)=>{let Q=X.req.param("script");if(!Q)return X.json({error:"missing script name"},400);return tZ(X,`/_sandbox/exec/${encodeURIComponent(Q)}/kill`)}),$.get("/:virtualMcpId/:branch/config",(X)=>tZ(X,"/_sandbox/config",{method:"GET",map404to410:!0,redactRepoDir:!0})),$.put("/:virtualMcpId/:branch/config",(X)=>tZ(X,"/_sandbox/config",{method:"PUT",forwardJsonBody:!0,map404to410:!0})),$.post("/:virtualMcpId/:branch/setup/:step",async(X)=>{let Q=X.req.param("step");if(!Q||!uN6(Q))return X.json({error:`step must be one of: ${il$.join(", ")}`},400);let Y=X.get("vmClaim"),G=await Y71(X.var.studioContext,{claimName:Y.claimName})==="gone"?null:await gN6(X);if(!G)return X.json({error:"sandbox not found: nothing is running at this ref"},404,P5);if(Q==="start"){let J=t(X.var.studioContext),W=Ry(Y.virtualMcpMetadata);try{await K70({ctx:X.var.studioContext,runner:G,handle:Y.claimName,orgId:J.id,userId:Y.callerUserId,entries:W})}catch(K){let F=K instanceof Error?K.message:String(K);return X.json({error:`Failed to push env to daemon: ${F}`},502)}}return tZ(X,`/_sandbox/setup/${Q}`,{signal:X.req.raw.signal,map404to410:!0,runner:G})}),$.get("/:virtualMcpId/:branch/events",(X)=>{let Q=X.get("vmClaim");if(!Q.runner)return mN(X,async(Y)=>{await Y.writeSSE({event:"phase",data:JSON.stringify({kind:"failed",reason:"unknown",message:"No sandbox runner configured on this studio instance."})})});return pc$(X,{ctx:X.var.studioContext,claimName:Q.claimName,runner:Q.runner,virtualMcpId:Q.virtualMcpId,branch:Q.branch,userId:Q.userId,projectRef:Q.projectRef,virtualMcpMetadata:Q.virtualMcpMetadata})}),$.get("/:virtualMcpId/:branch/git/status",(X)=>{if(X.get("vmClaim").runtime==="cms")return ml$(X);return Z(X)});let Z=(X)=>tZ(X,"/_sandbox/git/status",{method:"GET",map404to410:!0,signal:AbortSignal.any([X.req.raw.signal,AbortSignal.timeout(ll$)])});return $.post("/:virtualMcpId/:branch/git/status",(X)=>{if(X.get("vmClaim").runtime==="cms")return ml$(X);return tZ(X,"/_sandbox/git/status",{map404to410:!0,signal:AbortSignal.any([X.req.raw.signal,AbortSignal.timeout(ll$)])})}),$.post("/:virtualMcpId/:branch/git/diff",async(X)=>{let Q=X.get("vmClaim");if(Q.runtime==="cms")try{let Y=await X.req.json().catch(()=>({})),G=await tu(X),J=await OT0(G,Q.branch,Y.base);return X.json(J,200,P5)}catch(Y){return R71(X,Y)}return tZ(X,"/_sandbox/git/diff",{forwardJsonBody:!0,map404to410:!0})}),$.post("/:virtualMcpId/:branch/git/publish",async(X)=>{if(X.get("vmClaim").runtime==="cms")return X.json({ok:!0},200,P5);let Q=Ov(X);if(Q instanceof Response)return Q;let{claimName:Y,virtualMcpMetadata:G,connectionIds:J}=X.get("vmClaim"),W=X.var.studioContext;return Ds(Y,async()=>{try{await G71(W,Q,Y);let K=Os(G,J);if(K)await ul$(W,Q,Y,K)}catch(K){if(K instanceof Uv)return X.json({error:K.message},403,P5);let F=K instanceof Error?K.message:String(K);return X.json({error:F},502,P5)}return tZ(X,"/_sandbox/git/publish",{forwardJsonBody:!0,map404to410:!0})})}),$.post("/:virtualMcpId/:branch/git/discard",async(X)=>{let Q=X.get("vmClaim");if(Q.runtime==="cms")return Ds(Q.claimName,async()=>{let Y=await X.req.json().catch(()=>({})),G=Array.isArray(Y.filepaths)?Y.filepaths.filter((J)=>typeof J==="string"):[];if(G.length===0)return X.json({error:"filepaths is required"},400,P5);try{let J=await tu(X);return await xl$(J,Q.branch,G),X.json({ok:!0},200,P5)}catch(J){let W=J instanceof u4&&J.status===409?409:502,K=J instanceof Error?J.message:String(J);return X.json({error:K},W,P5)}});return Ds(Q.claimName,()=>tZ(X,"/_sandbox/git/discard",{forwardJsonBody:!0,map404to410:!0}))}),$.post("/:virtualMcpId/:branch/git/rebase",async(X)=>{let Q=X.get("vmClaim");if(Q.runtime==="cms")return Ds(Q.claimName,async()=>{try{let W=await X.req.json().catch(()=>({})),K=await tu(X),F=W.base??await K.getDefaultBranch();return await DT0(K,Q.branch,F),X.json({ok:!0},200,P5)}catch(W){return R71(X,W)}});let Y=Ov(X);if(Y instanceof Response)return Y;let{claimName:G}=X.get("vmClaim"),J=X.var.studioContext;return Ds(G,async()=>{try{await G71(J,Y,G)}catch(W){let K=W instanceof Error?W.message:String(W);return X.json({error:K},502,P5)}return tZ(X,"/_sandbox/git/rebase",{forwardJsonBody:!0,map404to410:!0})})}),$.post("/:virtualMcpId/:branch/git/suggest-commit",p5({maxSize:cl$,onError:(X)=>X.json({error:"Payload too large"},413,P5)}),async(X)=>{let Q=X.get("vmClaim"),Y=null;if(Q.runtime!=="cms"){let F=Ov(X);if(F instanceof Response)return F;Y=F}let{claimName:G,userId:J,projectRef:W}=Q,K=X.var.studioContext;try{let F=await X.req.json().catch(()=>({})),H=F.status,N=F.diff,U=N!=null&&typeof N.diffs==="object"&&N.diffs!==null,[B,O]=K71(H)&&U?[H,N]:Y?await Promise.all([wT0(Y,G,"/_sandbox/git/status","GET",{userId:J,projectRef:W}),wT0(Y,G,"/_sandbox/git/diff","GET",{userId:J,projectRef:W})]):await(async()=>{let w=await tu(X);return Promise.all([BT0(w,Q.branch),OT0(w,Q.branch)])})(),L=await ac$(K,B,O);return X.json(L,200,P5)}catch(F){let H=F instanceof Error?F.message:String(F);if(H==="SANDBOX_GONE")return X.json({error:"Sandbox handle is gone. The sandbox needs to be re-provisioned."},410,P5);return X.json({error:H},502,P5)}}),$.post("/:virtualMcpId/:branch/git/judge-review",p5({maxSize:cl$,onError:(X)=>X.json({error:"Payload too large"},413,P5)}),async(X)=>{let Q=X.get("vmClaim"),Y=null;if(Q.runtime!=="cms"){let F=Ov(X);if(F instanceof Response)return F;Y=F}let{claimName:G,userId:J,projectRef:W}=Q,K=X.var.studioContext;try{let F=await X.req.json().catch(()=>({})),H=F.status,N=F.diff,U=N!=null&&typeof N.diffs==="object"&&N.diffs!==null,[B,O]=K71(H)&&U?[H,N]:Y?await Promise.all([wT0(Y,G,"/_sandbox/git/status","GET",{userId:J,projectRef:W}),wT0(Y,G,"/_sandbox/git/diff","GET",{userId:J,projectRef:W})]):await(async()=>{let w=await tu(X);return Promise.all([BT0(w,Q.branch),OT0(w,Q.branch)])})(),L=await ec$(K,B,O,typeof F.language==="string"?F.language:void 0);return X.json(L,200,P5)}catch(F){let H=F instanceof Error?F.message:String(F);if(H==="SANDBOX_GONE")return X.json({error:"Sandbox handle is gone. The sandbox needs to be re-provisioned."},410,P5);return X.json({error:H},502,P5)}}),$.get("/:virtualMcpId/:branch/preview-fetch",async(X)=>{let Q=Ov(X);if(Q instanceof Response)return Q;let{claimName:Y}=X.get("vmClaim"),G=X.req.query("path");if(!G||!G.startsWith("/")||G.startsWith("//")||G.includes("..")||G.includes("\\"))return X.json({error:"Path not allowed"},403);let J;try{J=await Q.getPreviewUrl(Y)}catch{return X.json({error:"Preview not available"},502)}if(!J)return X.json({error:"Preview not available"},502);let W=J.replace(/\/+$/,"");return dl$(X,`${W}${G}`)}),$.post("/:virtualMcpId/:branch/preview-invoke",p5({maxSize:fN6,onError:(X)=>X.json({error:"Payload too large"},413)}),async(X)=>{let Q=Ov(X);if(Q instanceof Response)return Q;let{claimName:Y}=X.get("vmClaim"),G;try{G=await Q.getPreviewUrl(Y)}catch{return X.json({error:"Preview not available"},502)}if(!G)return X.json({error:"Preview not available"},502);let J;try{J=await X.req.json()}catch{return X.json({error:"Invalid JSON body"},400)}if(!J||typeof J!=="object"||Array.isArray(J))return X.json({error:"Invalid JSON body"},400);let W=yl$(J);if(!W)return X.json({error:"Invalid or missing __resolveType"},400);let K=gl$(G,W.resolveType);return dl$(X,K,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(W.payload),signal:AbortSignal.timeout(30000)})}),$};var nl$=D(()=>{U8();jF();lu();Q71();Xn();dc$();h3();my();mc$();m3();ic$();nc$();Bi0();Gn();N71();$l$();B71();dD();A71();hl$();T71();_N6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;xN6=$T0(async($,Z)=>{let X=$.var.studioContext;try{o(X)}catch{return $.json({error:"Unauthorized"},401)}let Q=o0(X);if(!Q)return $.json({error:"Unauthorized"},401);let Y;try{Y=t(X)}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{vN6(J)}catch(L){let w=L instanceof Error?L.message:String(L);return $.json({error:w},400)}let W=await X.storage.virtualMcps.findById(G);if(!W||W.organization_id!==Y.id)return $.json({error:"Virtual MCP not found"},404);let K=$n({orgId:Y.id,virtualMcpId:G,branch:J}),F=await Wi0(X,J),H=Ki0(F,Q),N=lc$({userId:H,projectRef:K}),U=W.metadata??null,B=await yN6($,{claimName:N,branch:J,virtualMcpId:G,sandboxUserId:H,virtualMcpMetadata:U,branchThread:F});if(B==="cms")return $.set("vmClaim",{claimName:N,callerUserId:Q,runner:null,virtualMcpId:G,branch:J,userId:H,projectRef:K,virtualMcpMetadata:U,connectionIds:W.connections?.map((L)=>L.connection_id)??[],runtime:B}),Z();let O;try{O=await ZQ(X)}catch{O=null}if(!O)return $.json({error:"No sandbox runner found"},404);return $.set("vmClaim",{claimName:N,callerUserId:Q,runner:O,virtualMcpId:G,branch:J,userId:H,projectRef:K,virtualMcpMetadata:U,connectionIds:W.connections?.map((L)=>L.connection_id)??[],runtime:B}),Z()});LT0=new Map;P5={"Cache-Control":"no-store, no-cache, must-revalidate",Pragma:"no-cache"};il$=["clone","install","start"]});function tl$($,Z,X){let Q=I71.get($);if(!Q)Q={pending:null,running:!1},I71.set($,Q);if(!Q.pending)Q.pending={set:new Map,del:new Set,deps:Z,resolvers:[],rejecters:[]};let Y=Q.pending;Y.deps=Z;for(let[J,W]of Object.entries(X.set??{}))Y.set.set(J,W),Y.del.delete(J);for(let J of X.delete??[])Y.del.add(J),Y.set.delete(J);let G=new Promise((J,W)=>{Y.resolvers.push(J),Y.rejecters.push(W)});if(!Q.running)lN6($,Q);return G}async function lN6($,Z){Z.running=!0;try{while(Z.pending){let X=Z.pending;Z.pending=null;try{let Q=await dN6(X);for(let Y of X.resolvers)Y(Q)}catch(Q){for(let Y of X.rejecters)Y(Q)}}}finally{if(Z.running=!1,!Z.pending)I71.delete($)}}async function dN6($){let{client:Z,branch:X,packagePath:Q}=$.deps;for(let Y=0;;Y++){let G=await nu(Z,X),J=await Z.getCommitTreeSha(G),W=await Z.getDecofileTree(J,Q),K=j71(W,Q),F=[],H=new Map(K.map((O)=>[O.path,{stem:O.stem,sha:O.sha}]));for(let[O,L]of $.set){let w=z71(K,O),E=`${JSON.stringify(L,null,2)}
|
|
2924
|
-
`,j=await Z.createBlob(E);await _l$(Z.owner,Z.repo,j,E);let z=w[0]??`${NT0(Q)}/${O71(O)}.json`;F.push({path:z,mode:"100644",type:"blob",sha:j});let A=z.slice(z.lastIndexOf("/")+1,-5);H.set(z,{stem:A,sha:j,content:E});for(let P of w.slice(1))F.push({path:P,mode:"100644",type:"blob",sha:null}),H.delete(P)}for(let O of $.del)for(let L of z71(K,O))F.push({path:L,mode:"100644",type:"blob",sha:null}),H.delete(L);if(F.length===0)return G;let N=Q?`${Q}/.deco/blocks.gen.json`:".deco/blocks.gen.json";if(W.some((O)=>O.type==="blob"&&O.path===N)){let O=await Promise.all([...H.values()].map(async(j)=>({stem:j.stem,content:j.content??await Z.getBlobText(j.sha)}))),{decofile:L,skipped:w}=Hs(O);if(w.length>0)console.warn("decofile gen: dropped blocks that were not valid JSON",{repo:`${Z.owner}/${Z.repo}`,branch:X,packagePath:Q,blocks:w.map((j)=>j.key)});let E=await Z.createBlob(L);F.push({path:N,mode:"100644",type:"blob",sha:E})}let U=await Z.createTree(J,F),B=await Z.createCommit({message:mN6($),treeSha:U,parentShas:[G]});try{return await Z.updateRef(X,B),B}catch(O){if(!(O instanceof u4&&O.status===422)||Y>=cN6-1)throw O;await L$(aZ(2000,200,Y,2,0.5))}}}function mN6($){let Z=(Y)=>{let G=Y.slice(0,3).join(", ");return Y.length>3?`${G} (+${Y.length-3} more)`:G},X=[];if($.set.size>0)X.push(`update ${Z([...$.set.keys()])}`);if($.del.size>0)X.push(`delete ${Z([...$.del])}`);let Q=`chore(decofile): ${X.join("; ")}`;return Zi0(Q,$.deps.coAuthor)}var cN6=3,I71;var ol$=D(()=>{uO0();YT0();W4();dD();UT0();I71=new Map});import{createHmac as rl$,randomBytes as iN6,timingSafeEqual as pN6}from"crypto";function al$(){if(ET0)return ET0;let $;try{let Z=b0();$=Z.studioJwtSecret??Z.betterAuthSecret}catch{$=void 0}return ET0=$?Buffer.from($):iN6(32),ET0}function q71($){let Z=$.nowMs??Date.now(),X={o:$.organizationId,m:$.virtualMcpId,b:$.branch,e:Math.floor((Z+nN6)/1000)},Q=Buffer.from(JSON.stringify(X)).toString("base64url"),Y=rl$("sha256",al$()).update(Q).digest("base64url");return`${Q}.${Y}`}function sl$($,Z){let X=$.indexOf(".");if(X<0)return!1;let Q=$.slice(0,X),Y=Buffer.from($.slice(X+1)),G=Buffer.from(rl$("sha256",al$()).update(Q).digest("base64url"));if(Y.length!==G.length||!pN6(Y,G))return!1;let J;try{J=JSON.parse(Buffer.from(Q,"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 nN6=21600000,ET0=null;var el$=D(()=>{R$()});import{z as ou}from"zod";function oN6($){return $.length>0&&$.length<=255&&!$.includes("..")&&!$.endsWith("/")&&!$.endsWith(".lock")&&tN6.test($)}function Yd$($){return $.req.header("x-forwarded-host")??new URL($.req.url).host}async function Ls($){let Z=$.get("decofileScope");return XT0($.var.studioContext,Z.organizationId,Z.githubRepo)}function ws($,Z){if(Z instanceof u4){let Q=Z.status===404?404:Z.status===409?409:Z.status===422?409:502;return $.json({error:Z.message},Q)}let X=Z instanceof Error?Z.message:String(Z);return $.json({error:X},500)}function Gd$(){let $=new H1;return $.use("/:virtualMcpId/:branch",Qd$),$.use("/:virtualMcpId/:branch/*",Qd$),$.get("/:virtualMcpId/:branch",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await Ls(Z),Y=await vl$(Q,X.branch,X.packagePath,{createBranchIfMissing:!!X.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(!X.userId)return Z.body(Y.decofile,200,{...G,"content-type":"application/json"});let J=q71({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.body(`{"version":${JSON.stringify(Y.sha)},"token":${JSON.stringify(J)},"apiHost":${JSON.stringify(Yd$(Z))},"decofile":${Y.decofile}}`,200,{...G,"content-type":"application/json"})}catch(Q){return ws(Z,Q)}}),$.get("/:virtualMcpId/:branch/meta",async(Z)=>{let X=Z.get("decofileScope"),Q=X.packagePath?`${X.packagePath}/.deco/meta.gen.json`:".deco/meta.gen.json";try{let Y=await Ls(Z),G=await Y.getFileTextAtRef(X.branch,Q);if(G===null){let J=await Y.getDefaultBranch();if(J!==X.branch)G=await Y.getFileTextAtRef(J,Q)}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 ws(Z,Y)}}),$.patch("/:virtualMcpId/:branch",aN6,async(Z)=>{let X=Z.get("decofileScope"),Q=Z.var.studioContext,Y=sN6.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{QT0(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);try{let J=await Ls(Z),W=await tl$(`${X.organizationId}/${X.virtualMcpId}/${X.branch}`,{client:J,branch:X.branch,packagePath:X.packagePath,coAuthor:du(Q)},G),K=q71({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.json({version:W,token:K,apiHost:Yd$(Z)})}catch(J){return ws(Z,J)}}),$.post("/:virtualMcpId/:branch/publish",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await Ls(Z),Y=await Q.getDefaultBranch();if(Y===X.branch)return Z.json({error:"Branch is already the default branch"},400);let G=`chore(decofile): publish ${X.branch}`;try{let J;try{J=await Q.mergeBranch(Y,X.branch,G)}catch(W){if(!(W instanceof u4&&W.status===409))throw W;await DT0(Q,X.branch,Y),J=await Q.mergeBranch(Y,X.branch,G)}return J?Z.json({result:"merged",sha:J}):Z.json({result:"up-to-date"})}catch(J){if(J instanceof u4&&J.status===409)return Z.json({error:"merge-conflict"},409);if(J instanceof u4&&J.status===405){let K=await Q.findOpenPullRequest(Y,X.branch)??await Q.createPullRequest({base:Y,head:X.branch,title:`Publish ${X.branch}`});return Z.json({result:"pull-request",number:K.number,url:K.html_url})}throw J}}catch(Q){return ws(Z,Q)}}),$.get("/:virtualMcpId/:branch/status",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await Ls(Z),Y=await Q.getDefaultBranch();if(Y===X.branch)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0,lastCommitAt:null});try{let[{aheadBy:G,behindBy:J},W]=await Promise.all([Q.compare(Y,X.branch),Q.getBranchHead(X.branch)]);return Z.json({baseBranch:Y,aheadBy:G,behindBy:J,lastCommitAt:W.committedAt})}catch(G){if(G instanceof u4&&G.status===404)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0,lastCommitAt:null});throw G}}catch(Q){return ws(Z,Q)}}),$}var tN6,$d$=500,Zd$=1048576,Xd$=1024,rN6=8388608,aN6,sN6,Qd$;var Jd$=D(()=>{yn0();YT0();U8();jF();Q71();ZT0();T71();B71();ol$();el$();A71();dD();UT0();tN6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;aN6=p5({maxSize:rN6,onError:($)=>$.json({error:"Payload too large"},413)}),sN6=ou.object({set:ou.record(ou.string(),ou.unknown()).optional(),delete:ou.array(ou.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)<=$d$,{message:`Patch cannot touch more than ${$d$} blocks`}).refine(($)=>Object.values($.set??{}).every((Z)=>JSON.stringify(Z).length<=Zd$),{message:`Each block must be at most ${Zd$} bytes`}).refine(($)=>[...Object.keys($.set??{}),...$.delete??[]].every((Z)=>Z.length<=Xd$),{message:`Each block key must be at most ${Xd$} characters`}),Qd$=$T0(async($,Z)=>{let X=$.var.studioContext,Q=X.organization;if(!Q)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(!oN6(G))return $.json({error:`Invalid branch name: ${G}`},400);let J=X.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||!sl$(B,{organizationId:Q.id,virtualMcpId:Y,branch:G}))return $.json({error:"Unauthorized"},401)}let W=await X.storage.virtualMcps.findById(Y);if(!W||W.organization_id!==Q.id)return $.json({error:"Virtual MCP not found"},404);let K=W.metadata??null;if(!iO0(K))return $.json({error:"Project has no preview server configured"},404);let H=W.connections?.map((B)=>B.connection_id)??[],N=Os(K,H);if(!N)return $.json({error:"Project has no GitHub repository"},404);let U=K?.runtime;return $.set("decofileScope",{organizationId:Q.id,virtualMcpId:Y,branch:G,packagePath:U?.path?.replace(/^\/+|\/+$/g,"")||null,githubRepo:N,userId:J}),Z()})});var Wd$=($)=>{let Z=new H1;if(Z.use("*",Xv),Z.route("/",wA0()),Z.route("/",Tg$()),Z.route("/",Vc$()),Z.route("/",qc$()),Z.route("/",aA0()),Z.route("/tools",xc$()),Z.route("/",vc$()),Z.route("/",Gc$({kvStorage:$.kvStorage})),Z.route("/",Qc$()),Z.route("/fs",jc$({getConnection:$.getNatsConnection})),Z.route("/sandbox",pl$()),Z.route("/decofile",Gd$()),Z.route("/",Tc$()),Z.route("/deco-sites",jA0()),Z.route("/sso",NA0()),Z.route("/",sA0({tokenStorage:$.tokenStorage,automationEventDispatcher:$.automationEventDispatcher})),Z.route("/webhooks",Dg$()),$.mountDevAssets)Z.route("/dev-assets",zA0({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("/",bb$()),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",Pc$()),Z.route("/mcp",Pw0()),Z.route("/mcp/self",rA0()),Z.route("/mcp",Rw0()),Z.all("/oauth-proxy/:connectionId/*",$.oauthProxyHandler),Z.get("/watch",$.watchHandler),Z};var Kd$=D(()=>{U8();I91();Lg$();V91();PA0();xa();T91();Yc$();Jc$();zc$();dt();w91();Iw0();rZ1();Ac$();Rc$();Mc$();Sc$();fc$();sZ1();yc$();eZ1();Aw0();nl$();Jd$()});function eN6($){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 $U6=async($,Z)=>{if(!$.get("studioContext").auth.user?.id)return $.json({error:"Unauthorized"},401);return Z()},Fd$=()=>{let $=new H1;return $.use("*",$U6),$.get("/",async(Z)=>{let X=b0(),Q=X.decoSupabaseUrl,Y=X.decoSupabaseServiceKey;if(!Q||!Y)return Z.json({apps:[]});try{let G=await nZ(Q,Y,"apps?select=name,title,description,logo,category,vendors(alias,url)");return Z.json({apps:eN6(G)})}catch(G){return console.error("[deco-apps] GET error:",G),Z.json({error:"Failed to fetch apps"},502)}}),$};var Hd$=D(()=>{U8();R$();DP0()});import{z as M1}from"zod";function RF($,Z="invalid_request_error",X=null,Q=null){return{error:{message:$,type:Z,param:X,code:Q}}}function HU6($){if(!$)return null;let Z=$.indexOf(":");if(Z===-1)return{credentialId:null,modelId:$};let X=$.substring(0,Z),Q=$.substring(Z+1);if(!X||!Q)return null;return{credentialId:X,modelId:Q}}function NU6($,Z,X){try{return JSON.parse($)}catch{throw new Bd$(`Invalid JSON in tool call arguments for function '${X}' (tool_call_id: ${Z}): ${$}`)}}function UU6($){let Z={};for(let X of $)if(X.role==="assistant"&&X.tool_calls)for(let Q of X.tool_calls)Z[Q.id]=Q.function.name;return $.map((X)=>{switch(X.role){case"system":return{role:"system",content:X.content};case"user":if(typeof X.content==="string")return{role:"user",content:X.content};return{role:"user",content:X.content.map((Y)=>{if(Y.type==="text")return{type:"text",text:Y.text};return{type:"image",image:Y.image_url.url}})};case"assistant":if(X.tool_calls&&X.tool_calls.length>0)return{role:"assistant",content:X.tool_calls.map((Y)=>({type:"tool-call",toolCallId:Y.id,toolName:Y.function.name,input:NU6(Y.function.arguments,Y.id,Y.function.name)}))};return{role:"assistant",content:X.content??""};case"tool":let Q=Z[X.tool_call_id]??"unknown";return{role:"tool",content:[{type:"tool-result",toolCallId:X.tool_call_id,toolName:Q,output:{type:"text",value:X.content}}]}}})}function BU6($){let Z=$.map((X)=>{let Q=X.function.parameters?iY(X.function.parameters):iY({type:"object",properties:{}});return[X.function.name,I$({description:X.function.description,inputSchema:Q})]});return Object.fromEntries(Z)}function OU6($){if(!$)return;return{openai:{response_format:$}}}function DU6(){return`chatcmpl-${crypto.randomUUID().replace(/-/g,"").substring(0,29)}`}function Nd$($,Z,X,Q,Y,G){let J={model:$,messages:Z,tools:X,temperature:Q.temperature,maxTokens:Q.max_tokens,topP:Q.top_p,frequencyPenalty:Q.frequency_penalty,presencePenalty:Q.presence_penalty,stopSequences:Q.stop?Array.isArray(Q.stop)?Q.stop:[Q.stop]:void 0,abortSignal:G};return Y?{...J,providerOptions:Y}:J}function Ud$($){if($==="tool-calls")return"tool_calls";if($==="length")return"length";return"stop"}var ZU6=256,XU6,QU6,YU6,GU6,JU6,WU6,KU6,FU6,Bd$,Od$,Dd$;var Ld$=D(()=>{D4();U8();lu();TN();XU6=M1.object({type:M1.literal("function"),function:M1.object({name:M1.string(),description:M1.string().optional(),parameters:M1.record(M1.string(),M1.unknown()).optional()})}),QU6=M1.object({id:M1.string(),type:M1.literal("function"),function:M1.object({name:M1.string(),arguments:M1.string()})}),YU6=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(QU6).optional()}),M1.object({role:M1.literal("tool"),content:M1.string(),tool_call_id:M1.string()})]),GU6=M1.object({type:M1.literal("text")}),JU6=M1.object({type:M1.literal("json_object")}),WU6=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()})}),KU6=M1.union([GU6,JU6,WU6]),FU6=M1.object({model:M1.string().describe("Format: 'model_id' or 'credential_id:model_id'"),messages:M1.array(YU6),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(XU6).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:KU6.optional(),user:M1.string().optional()});Bd$=class Bd$ extends Error{constructor($){super($);this.name="MessageConversionError"}};Od$=new H1;Od$.post("/:org/v1/chat/completions",async($)=>{let Z=$.get("studioContext"),X=$.req.param("org");try{if(!Z.auth.apiKey?.id)return $.json(RF("API key authentication required. Provide a valid API key via Authorization header.","authentication_error"),401);if(!Z.organization)return $.json(RF("Organization context is required. Ensure your API key has organization metadata.","invalid_request_error","organization"),400);if((Z.organization.slug??Z.organization.id)!==X)return $.json(RF("Organization mismatch. The API key's organization does not match the requested organization.","invalid_request_error","organization"),403);let Q=await $.req.json(),Y=FU6.safeParse(Q);if(!Y.success){let w=Y.error.issues[0]??{message:"Invalid request",path:[]};return $.json(RF(`Invalid request: ${w.message}`,"invalid_request_error",w.path.length>0?w.path.join("."):null),400)}let G=Y.data,J=HU6(G.model);if(!J)return $.json(RF("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)=>Ww(j.providerId));if(!E)return $.json(RF("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 F;try{F=await Z.aiProviders.activate(W,Z.organization.id)}catch{return $.json(RF(`AI provider credential not found or inaccessible: ${W}`,"invalid_request_error","model"),404)}let H=F.aiSdk.languageModel(K),N=UU6(G.messages),U=G.tools?BU6(G.tools):void 0,B=OU6(G.response_format),O=DU6(),L=Math.floor(Date.now()/1000);if(G.stream)return mN($,async(w)=>{let E=Nd$(H,N,U,G,B,$.req.raw.signal);try{let j=PO(E),z=!1,A=0,P="",I=async()=>{if(P.length===0)return;let q=P;P="",await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{content:q},finish_reason:null}]})})};for await(let q of j.fullStream){if(!z&&(q.type==="text-delta"||q.type==="tool-call"))await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{role:"assistant",content:""},finish_reason:null}]})}),z=!0;if(q.type==="text-delta"){if(P+=q.text,P.length>=ZU6)await I()}else if(q.type==="tool-call"){await I();let k=A++;await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{tool_calls:[{index:k,id:q.toolCallId,type:"function",function:{name:q.toolName,arguments:JSON.stringify(q.input)}}]},finish_reason:null}]})})}else if(q.type==="finish")await I(),await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{},finish_reason:Ud$(q.finishReason)}],usage:q.totalUsage?{prompt_tokens:q.totalUsage.inputTokens??0,completion_tokens:q.totalUsage.outputTokens??0,total_tokens:q.totalUsage.totalTokens??0}:void 0})})}await I(),await w.writeSSE({data:"[DONE]"})}catch(j){let z=j;console.error("[openai-compat:stream] Error:",z.message),await w.writeSSE({data:JSON.stringify({error:{message:z.message,type:"server_error"}})})}});else{let w=Nd$(H,N,U,G,B,$.req.raw.signal),E=await jO(w),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:L,model:G.model,choices:[{index:0,message:j,finish_reason:Ud$(E.finishReason)}],usage:{prompt_tokens:E.usage?.inputTokens??0,completion_tokens:E.usage?.outputTokens??0,total_tokens:E.usage?.totalTokens??0}})}}catch(Q){let Y=Q;if(Y.name==="AbortError")return $.json(RF("Request aborted","invalid_request_error"),400);if(Y.name==="MessageConversionError")return $.json(RF(Y.message,"invalid_request_error","messages"),400);return console.error("[openai-compat] Error:",Y.message,Y.stack),$.json(RF(Y.message,"server_error"),500)}});Dd$=Od$});function LU6($){if(typeof $!=="object"||$===null)return!1;let X=$.githubRepo?.url;return typeof X==="string"&&X.length>0}function wd$(){let $=new H1;return $.use("*",async(Z,X)=>{await X(),Z.header("Cache-Control","private, no-store"),Z.header("Vary","Cookie")}),$.get("/",async(Z)=>{let X=Z.get("studioContext"),Q=o0(X);if(!Q)return Z.json({error:"Authentication required"},401);let G=(Z.req.query("site")??"").trim().toLowerCase();if(!rG(G))return Z.json({error:"Invalid site slug"},400);let J=await X.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","=",Q).execute(),W=[];for(let F of J){if(!F.slug||vZ(F))continue;let H=await X.storage.virtualMcps.list(F.id);for(let N of H){if(Xe1(N)!==G)continue;if(!LU6(N.metadata))continue;W.push({orgSlug:F.slug,orgName:F.name??F.slug,project:{id:N.id,title:N.title,icon:N.icon??null}})}}let K={matches:W};return Z.json(K)}),$}var Ed$=D(()=>{U8();ZO()});var zd$;var jd$=D(()=>{zd$={name:"decocms",version:"4.297.4",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 jU6(){let $=process.env.POSTHOG_KEY;if(!$)return null;return{key:$,host:process.env.POSTHOG_HOST??EU6}}var Pd$,EU6="https://ph.studio.decocms.com",Ad$;var Td$=D(()=>{U8();c50();yC();$9();R$();K91();jd$();Pd$=new H1;Pd$.get("/",($)=>{let Z={version:zd$.version,theme:qi1(),...IH().logo&&{logo:IH().logo},...HN()&&{internalUrl:Z_1()},...b0().enableDecoImport&&{enableDecoImport:!0},brandExtractEnabled:!!b0().firecrawlApiKey,auth:Iy$(),posthog:jU6(),googleMapsApiKey:process.env.GOOGLE_MAPS_API_KEY?.trim()||null,runtime:{agentSandbox:Is()}};return $.header("Cache-Control","no-store"),$.json({success:!0,config:Z})});Ad$=Pd$});function ru($){let Z=($??"").trim().toLowerCase();return Z=Z.replace(/^https?:\/\//,""),Z=Z.replace(/^www\./,""),Z=Z.split(/[/?#]/)[0]??"",Z.replace(/\/+$/,"")}function M71($){return(ru($).split(".")[0]||$).replace(/[-_]/g," ").split(" ").filter(Boolean).map((X)=>X.charAt(0).toUpperCase()+X.slice(1)).join(" ")}function Id$($,Z=64){return`https://www.google.com/s2/favicons?domain=${encodeURIComponent(ru($))}&sz=${Z}`}function Rd$($,Z){let X=$.trim();if(X.length<=Z)return X;let Q=X.slice(0,Z-1),Y=Q.lastIndexOf(" ");return`${(Y>Z*0.6?Q.slice(0,Y):Q).trimEnd()}\u2026`}function qd$($){let{brand:Z,domain:X,score:Q,verdict:Y}=$,G=typeof Q==="number"?`${Z} commerce report \u2014 ${Math.round(Q)}/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()?Rd$(`${Y.trim().replace(/\s+/g," ")} \u2014 ${J}`,200):Rd$(`How does ${X} really perform? ${J}`,200);return{title:G,description:W}}import{z as l0}from"zod";var Dv,zU6,PU6,AU6,TU6,Md$;var kd$=D(()=>{Dv=l0.enum(["good","bad","neutral"]),zU6=l0.preprocess(($)=>{if(Array.isArray($))return{kind:"text",value:$.find((X)=>X!==null&&typeof X!=="object")??""};return $!==null&&typeof $==="object"?$:{kind:"text",value:$}},l0.object({kind:l0.enum(["text","number","sparkline","badge","score"]).catch("text"),value:l0.coerce.string().optional(),tone:Dv.optional(),muted:l0.boolean().optional(),delta:l0.coerce.string().optional(),deltaDir:l0.enum(["up","down","neutral"]).optional(),points:l0.array(l0.coerce.number()).optional(),label:l0.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 $})),PU6=l0.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},l0.array(zU6)),AU6={key:l0.coerce.string(),title:l0.coerce.string(),eyebrow:l0.coerce.string().optional(),headline:l0.coerce.string(),annotation:l0.coerce.string().optional(),methodology:l0.coerce.string().optional(),sources:l0.array(l0.object({name:l0.coerce.string(),logoUrl:l0.coerce.string()})).optional()},TU6=l0.discriminatedUnion("template",[l0.object({template:l0.literal("cover"),score:l0.object({value:l0.coerce.number(),max:l0.coerce.number().optional(),grade:l0.coerce.string().optional(),label:l0.coerce.string().optional()}).optional(),brandImage:l0.coerce.string().optional(),screenshot:l0.coerce.string().optional(),mobileScreenshot:l0.coerce.string().optional()}),l0.object({template:l0.literal("cta"),ctaUrl:l0.coerce.string().optional(),ctaLabel:l0.coerce.string().optional(),bullets:l0.array(l0.coerce.string()).optional()}),l0.object({template:l0.literal("series"),points:l0.array(l0.coerce.number()).min(2),xLabels:l0.array(l0.coerce.string()).min(1),unit:l0.coerce.string().optional(),callout:l0.object({index:l0.coerce.number(),value:l0.coerce.string(),tone:Dv.optional()})}),l0.object({template:l0.literal("threshold"),value:l0.coerce.string().default(""),metricLabel:l0.coerce.string().optional(),ratio:l0.coerce.number(),thresholdRatio:l0.coerce.number().optional(),thresholdLabel:l0.coerce.string().default(""),tone:Dv.optional()}),l0.object({template:l0.literal("stats"),stats:l0.array(l0.object({value:l0.coerce.string(),label:l0.coerce.string(),tone:Dv.optional()})).min(1)}),l0.object({template:l0.literal("bars"),items:l0.array(l0.object({value:l0.coerce.string(),label:l0.coerce.string(),ratio:l0.coerce.number(),tone:Dv.optional()})).min(1)}),l0.object({template:l0.literal("gauges"),gauges:l0.array(l0.object({label:l0.coerce.string(),value:l0.coerce.string(),status:l0.enum(["good","warn","bad"]).catch("warn"),caption:l0.coerce.string().optional(),ratio:l0.coerce.number().optional()})).min(1)}),l0.object({template:l0.literal("checklist"),checks:l0.array(l0.object({label:l0.coerce.string(),status:l0.enum(["pass","fail","warn"]).catch("fail"),value:l0.coerce.string().optional()})).min(1)}),l0.object({template:l0.literal("table"),columns:l0.array(l0.object({label:l0.coerce.string(),align:l0.enum(["left","right"]).optional()})).min(1),rows:l0.array(PU6).min(1),highlightRow:l0.coerce.number().optional()}),l0.object({template:l0.literal("products"),products:l0.array(l0.object({name:l0.coerce.string(),price:l0.coerce.string().optional(),image:l0.coerce.string().optional(),url:l0.coerce.string().optional()})).min(1)}),l0.object({template:l0.literal("list"),entries:l0.array(l0.object({label:l0.coerce.string(),severity:l0.enum(["error","warning","notice"]).catch("notice")})).min(1),moreCount:l0.coerce.number().optional()}),l0.object({template:l0.literal("keywords"),volumeLabel:l0.coerce.string().optional(),keywords:l0.array(l0.object({term:l0.coerce.string(),volume:l0.coerce.string(),position:l0.coerce.number().catch(0)})).min(1)}),l0.object({template:l0.literal("competitor"),metricLabel:l0.coerce.string().optional(),competitors:l0.array(l0.object({name:l0.coerce.string(),value:l0.coerce.string(),tone:Dv.optional(),isYou:l0.boolean().optional()})).min(1)}),l0.object({template:l0.literal("scorecard"),rivalLabel:l0.coerce.string().optional(),dimensions:l0.array(l0.object({label:l0.coerce.string(),you:l0.coerce.string(),rival:l0.coerce.string().optional(),rivalName:l0.coerce.string().optional(),tone:Dv.optional()})).min(1)})]),Md$=l0.object({...AU6,template:TU6})});function jT0($){let Z=[],X=[...$.sections].sort((Y,G)=>Y.position-G.position).map((Y)=>{let G=Md$.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),Q=X.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:Q},slides:X},drops:Z}}var k71=D(()=>{kd$()});import{join as Vd$}from"path";async function IU6($){try{let Z=await fetch(`${KK({})}/api/v2/public/diagnostics/${encodeURIComponent($)}`,{headers:{Accept:"application/json"},signal:AbortSignal.timeout(RU6)});if(!Z.ok)return null;let X=await Z.json(),{deck:Q}=jT0(X);if(!Q.slides.length)return null;let Y=Q.slides.find((W)=>W.template.template==="cover"),G=Y?.template,J=G&&G.template==="cover"?G:void 0;return{brand:Q.meta.brand?.trim()||M71($),score:Q.meta.scores?.cover??J?.score?.value,verdict:Y?.annotation?.trim()||Y?.headline?.trim()||void 0}}catch{return null}}function LG($){return $.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function qU6($,Z){let X=ru($),Q=Z?.brand?.trim()||M71(X),Y=Id$(X,128),J=`${(b0().baseUrl??"https://studio.decocms.com").replace(/\/+$/,"")}/report/${encodeURIComponent(X)}`,{title:W,description:K}=qd$({brand:Q,domain:X,score:Z?.score,verdict:Z?.verdict}),F=`${J}/og.png`,H=`${Q} commerce report by decocms`;return[`<title>${LG(W)}</title>`,`<meta name="description" content="${LG(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="${LG(W)}" />`,`<meta property="og:description" content="${LG(K)}" />`,`<meta property="og:url" content="${LG(J)}" />`,`<meta property="og:image" content="${LG(F)}" />`,'<meta property="og:image:width" content="1200" />','<meta property="og:image:height" content="630" />',`<meta property="og:image:alt" content="${LG(H)}" />`,'<meta name="twitter:card" content="summary_large_image" />',`<meta name="twitter:title" content="${LG(W)}" />`,`<meta name="twitter:description" content="${LG(K)}" />`,`<meta name="twitter:image" content="${LG(F)}" />`,`<meta name="twitter:image:alt" content="${LG(H)}" />`,`<link rel="canonical" href="${LG(J)}" />`,`<link rel="icon" href="${LG(Y)}" sizes="any" />`].join(`
|
|
2924
|
+
`,j=await Z.createBlob(E);await _l$(Z.owner,Z.repo,j,E);let z=w[0]??`${NT0(Q)}/${O71(O)}.json`;F.push({path:z,mode:"100644",type:"blob",sha:j});let A=z.slice(z.lastIndexOf("/")+1,-5);H.set(z,{stem:A,sha:j,content:E});for(let P of w.slice(1))F.push({path:P,mode:"100644",type:"blob",sha:null}),H.delete(P)}for(let O of $.del)for(let L of z71(K,O))F.push({path:L,mode:"100644",type:"blob",sha:null}),H.delete(L);if(F.length===0)return G;let N=Q?`${Q}/.deco/blocks.gen.json`:".deco/blocks.gen.json";if(W.some((O)=>O.type==="blob"&&O.path===N)){let O=await Promise.all([...H.values()].map(async(j)=>({stem:j.stem,content:j.content??await Z.getBlobText(j.sha)}))),{decofile:L,skipped:w}=Hs(O);if(w.length>0)console.warn("decofile gen: dropped blocks that were not valid JSON",{repo:`${Z.owner}/${Z.repo}`,branch:X,packagePath:Q,blocks:w.map((j)=>j.key)});let E=await Z.createBlob(L);F.push({path:N,mode:"100644",type:"blob",sha:E})}let U=await Z.createTree(J,F),B=await Z.createCommit({message:mN6($),treeSha:U,parentShas:[G]});try{return await Z.updateRef(X,B),B}catch(O){if(!(O instanceof u4&&O.status===422)||Y>=cN6-1)throw O;await L$(aZ(2000,200,Y,2,0.5))}}}function mN6($){let Z=(Y)=>{let G=Y.slice(0,3).join(", ");return Y.length>3?`${G} (+${Y.length-3} more)`:G},X=[];if($.set.size>0)X.push(`update ${Z([...$.set.keys()])}`);if($.del.size>0)X.push(`delete ${Z([...$.del])}`);let Q=`chore(decofile): ${X.join("; ")}`;return Zi0(Q,$.deps.coAuthor)}var cN6=3,I71;var ol$=D(()=>{uO0();YT0();W4();dD();UT0();I71=new Map});import{createHmac as rl$,randomBytes as iN6,timingSafeEqual as pN6}from"crypto";function al$(){if(ET0)return ET0;let $;try{let Z=b0();$=Z.studioJwtSecret??Z.betterAuthSecret}catch{$=void 0}return ET0=$?Buffer.from($):iN6(32),ET0}function q71($){let Z=$.nowMs??Date.now(),X={o:$.organizationId,m:$.virtualMcpId,b:$.branch,e:Math.floor((Z+nN6)/1000)},Q=Buffer.from(JSON.stringify(X)).toString("base64url"),Y=rl$("sha256",al$()).update(Q).digest("base64url");return`${Q}.${Y}`}function sl$($,Z){let X=$.indexOf(".");if(X<0)return!1;let Q=$.slice(0,X),Y=Buffer.from($.slice(X+1)),G=Buffer.from(rl$("sha256",al$()).update(Q).digest("base64url"));if(Y.length!==G.length||!pN6(Y,G))return!1;let J;try{J=JSON.parse(Buffer.from(Q,"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 nN6=21600000,ET0=null;var el$=D(()=>{R$()});import{z as ou}from"zod";function oN6($){return $.length>0&&$.length<=255&&!$.includes("..")&&!$.endsWith("/")&&!$.endsWith(".lock")&&tN6.test($)}function Yd$($){return $.req.header("x-forwarded-host")??new URL($.req.url).host}async function Ls($){let Z=$.get("decofileScope");return XT0($.var.studioContext,Z.organizationId,Z.githubRepo)}function ws($,Z){if(Z instanceof u4){let Q=Z.status===404?404:Z.status===409?409:Z.status===422?409:502;return $.json({error:Z.message},Q)}let X=Z instanceof Error?Z.message:String(Z);return $.json({error:X},500)}function Gd$(){let $=new H1;return $.use("/:virtualMcpId/:branch",Qd$),$.use("/:virtualMcpId/:branch/*",Qd$),$.get("/:virtualMcpId/:branch",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await Ls(Z),Y=await vl$(Q,X.branch,X.packagePath,{createBranchIfMissing:!!X.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(!X.userId)return Z.body(Y.decofile,200,{...G,"content-type":"application/json"});let J=q71({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.body(`{"version":${JSON.stringify(Y.sha)},"token":${JSON.stringify(J)},"apiHost":${JSON.stringify(Yd$(Z))},"decofile":${Y.decofile}}`,200,{...G,"content-type":"application/json"})}catch(Q){return ws(Z,Q)}}),$.get("/:virtualMcpId/:branch/meta",async(Z)=>{let X=Z.get("decofileScope"),Q=X.packagePath?`${X.packagePath}/.deco/meta.gen.json`:".deco/meta.gen.json";try{let Y=await Ls(Z),G=await Y.getFileTextAtRef(X.branch,Q);if(G===null){let J=await Y.getDefaultBranch();if(J!==X.branch)G=await Y.getFileTextAtRef(J,Q)}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 ws(Z,Y)}}),$.patch("/:virtualMcpId/:branch",aN6,async(Z)=>{let X=Z.get("decofileScope"),Q=Z.var.studioContext,Y=sN6.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{QT0(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);try{let J=await Ls(Z),W=await tl$(`${X.organizationId}/${X.virtualMcpId}/${X.branch}`,{client:J,branch:X.branch,packagePath:X.packagePath,coAuthor:du(Q)},G),K=q71({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.json({version:W,token:K,apiHost:Yd$(Z)})}catch(J){return ws(Z,J)}}),$.post("/:virtualMcpId/:branch/publish",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await Ls(Z),Y=await Q.getDefaultBranch();if(Y===X.branch)return Z.json({error:"Branch is already the default branch"},400);let G=`chore(decofile): publish ${X.branch}`;try{let J;try{J=await Q.mergeBranch(Y,X.branch,G)}catch(W){if(!(W instanceof u4&&W.status===409))throw W;await DT0(Q,X.branch,Y),J=await Q.mergeBranch(Y,X.branch,G)}return J?Z.json({result:"merged",sha:J}):Z.json({result:"up-to-date"})}catch(J){if(J instanceof u4&&J.status===409)return Z.json({error:"merge-conflict"},409);if(J instanceof u4&&J.status===405){let K=await Q.findOpenPullRequest(Y,X.branch)??await Q.createPullRequest({base:Y,head:X.branch,title:`Publish ${X.branch}`});return Z.json({result:"pull-request",number:K.number,url:K.html_url})}throw J}}catch(Q){return ws(Z,Q)}}),$.get("/:virtualMcpId/:branch/status",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await Ls(Z),Y=await Q.getDefaultBranch();if(Y===X.branch)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0,lastCommitAt:null});try{let[{aheadBy:G,behindBy:J},W]=await Promise.all([Q.compare(Y,X.branch),Q.getBranchHead(X.branch)]);return Z.json({baseBranch:Y,aheadBy:G,behindBy:J,lastCommitAt:W.committedAt})}catch(G){if(G instanceof u4&&G.status===404)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0,lastCommitAt:null});throw G}}catch(Q){return ws(Z,Q)}}),$}var tN6,$d$=500,Zd$=1048576,Xd$=1024,rN6=8388608,aN6,sN6,Qd$;var Jd$=D(()=>{yn0();YT0();U8();jF();Q71();ZT0();T71();B71();ol$();el$();A71();dD();UT0();tN6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;aN6=p5({maxSize:rN6,onError:($)=>$.json({error:"Payload too large"},413)}),sN6=ou.object({set:ou.record(ou.string(),ou.unknown()).optional(),delete:ou.array(ou.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)<=$d$,{message:`Patch cannot touch more than ${$d$} blocks`}).refine(($)=>Object.values($.set??{}).every((Z)=>JSON.stringify(Z).length<=Zd$),{message:`Each block must be at most ${Zd$} bytes`}).refine(($)=>[...Object.keys($.set??{}),...$.delete??[]].every((Z)=>Z.length<=Xd$),{message:`Each block key must be at most ${Xd$} characters`}),Qd$=$T0(async($,Z)=>{let X=$.var.studioContext,Q=X.organization;if(!Q)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(!oN6(G))return $.json({error:`Invalid branch name: ${G}`},400);let J=X.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||!sl$(B,{organizationId:Q.id,virtualMcpId:Y,branch:G}))return $.json({error:"Unauthorized"},401)}let W=await X.storage.virtualMcps.findById(Y);if(!W||W.organization_id!==Q.id)return $.json({error:"Virtual MCP not found"},404);let K=W.metadata??null;if(!iO0(K))return $.json({error:"Project has no preview server configured"},404);let H=W.connections?.map((B)=>B.connection_id)??[],N=Os(K,H);if(!N)return $.json({error:"Project has no GitHub repository"},404);let U=K?.runtime;return $.set("decofileScope",{organizationId:Q.id,virtualMcpId:Y,branch:G,packagePath:U?.path?.replace(/^\/+|\/+$/g,"")||null,githubRepo:N,userId:J}),Z()})});var Wd$=($)=>{let Z=new H1;if(Z.use("*",Xv),Z.route("/",wA0()),Z.route("/",Tg$()),Z.route("/",Vc$()),Z.route("/",qc$()),Z.route("/",aA0()),Z.route("/tools",xc$()),Z.route("/",vc$()),Z.route("/",Gc$({kvStorage:$.kvStorage})),Z.route("/",Qc$()),Z.route("/fs",jc$({getConnection:$.getNatsConnection})),Z.route("/sandbox",pl$()),Z.route("/decofile",Gd$()),Z.route("/",Tc$()),Z.route("/deco-sites",jA0()),Z.route("/sso",NA0()),Z.route("/",sA0({tokenStorage:$.tokenStorage,automationEventDispatcher:$.automationEventDispatcher})),Z.route("/webhooks",Dg$()),$.mountDevAssets)Z.route("/dev-assets",zA0({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("/",bb$()),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",Pc$()),Z.route("/mcp",Pw0()),Z.route("/mcp/self",rA0()),Z.route("/mcp",Rw0()),Z.all("/oauth-proxy/:connectionId/*",$.oauthProxyHandler),Z.get("/watch",$.watchHandler),Z};var Kd$=D(()=>{U8();I91();Lg$();V91();PA0();xa();T91();Yc$();Jc$();zc$();dt();w91();Iw0();rZ1();Ac$();Rc$();Mc$();Sc$();fc$();sZ1();yc$();eZ1();Aw0();nl$();Jd$()});function eN6($){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 $U6=async($,Z)=>{if(!$.get("studioContext").auth.user?.id)return $.json({error:"Unauthorized"},401);return Z()},Fd$=()=>{let $=new H1;return $.use("*",$U6),$.get("/",async(Z)=>{let X=b0(),Q=X.decoSupabaseUrl,Y=X.decoSupabaseServiceKey;if(!Q||!Y)return Z.json({apps:[]});try{let G=await nZ(Q,Y,"apps?select=name,title,description,logo,category,vendors(alias,url)");return Z.json({apps:eN6(G)})}catch(G){return console.error("[deco-apps] GET error:",G),Z.json({error:"Failed to fetch apps"},502)}}),$};var Hd$=D(()=>{U8();R$();DP0()});import{z as M1}from"zod";function RF($,Z="invalid_request_error",X=null,Q=null){return{error:{message:$,type:Z,param:X,code:Q}}}function HU6($){if(!$)return null;let Z=$.indexOf(":");if(Z===-1)return{credentialId:null,modelId:$};let X=$.substring(0,Z),Q=$.substring(Z+1);if(!X||!Q)return null;return{credentialId:X,modelId:Q}}function NU6($,Z,X){try{return JSON.parse($)}catch{throw new Bd$(`Invalid JSON in tool call arguments for function '${X}' (tool_call_id: ${Z}): ${$}`)}}function UU6($){let Z={};for(let X of $)if(X.role==="assistant"&&X.tool_calls)for(let Q of X.tool_calls)Z[Q.id]=Q.function.name;return $.map((X)=>{switch(X.role){case"system":return{role:"system",content:X.content};case"user":if(typeof X.content==="string")return{role:"user",content:X.content};return{role:"user",content:X.content.map((Y)=>{if(Y.type==="text")return{type:"text",text:Y.text};return{type:"image",image:Y.image_url.url}})};case"assistant":if(X.tool_calls&&X.tool_calls.length>0)return{role:"assistant",content:X.tool_calls.map((Y)=>({type:"tool-call",toolCallId:Y.id,toolName:Y.function.name,input:NU6(Y.function.arguments,Y.id,Y.function.name)}))};return{role:"assistant",content:X.content??""};case"tool":let Q=Z[X.tool_call_id]??"unknown";return{role:"tool",content:[{type:"tool-result",toolCallId:X.tool_call_id,toolName:Q,output:{type:"text",value:X.content}}]}}})}function BU6($){let Z=$.map((X)=>{let Q=X.function.parameters?iY(X.function.parameters):iY({type:"object",properties:{}});return[X.function.name,I$({description:X.function.description,inputSchema:Q})]});return Object.fromEntries(Z)}function OU6($){if(!$)return;return{openai:{response_format:$}}}function DU6(){return`chatcmpl-${crypto.randomUUID().replace(/-/g,"").substring(0,29)}`}function Nd$($,Z,X,Q,Y,G){let J={model:$,messages:Z,tools:X,temperature:Q.temperature,maxTokens:Q.max_tokens,topP:Q.top_p,frequencyPenalty:Q.frequency_penalty,presencePenalty:Q.presence_penalty,stopSequences:Q.stop?Array.isArray(Q.stop)?Q.stop:[Q.stop]:void 0,abortSignal:G};return Y?{...J,providerOptions:Y}:J}function Ud$($){if($==="tool-calls")return"tool_calls";if($==="length")return"length";return"stop"}var ZU6=256,XU6,QU6,YU6,GU6,JU6,WU6,KU6,FU6,Bd$,Od$,Dd$;var Ld$=D(()=>{D4();U8();lu();TN();XU6=M1.object({type:M1.literal("function"),function:M1.object({name:M1.string(),description:M1.string().optional(),parameters:M1.record(M1.string(),M1.unknown()).optional()})}),QU6=M1.object({id:M1.string(),type:M1.literal("function"),function:M1.object({name:M1.string(),arguments:M1.string()})}),YU6=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(QU6).optional()}),M1.object({role:M1.literal("tool"),content:M1.string(),tool_call_id:M1.string()})]),GU6=M1.object({type:M1.literal("text")}),JU6=M1.object({type:M1.literal("json_object")}),WU6=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()})}),KU6=M1.union([GU6,JU6,WU6]),FU6=M1.object({model:M1.string().describe("Format: 'model_id' or 'credential_id:model_id'"),messages:M1.array(YU6),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(XU6).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:KU6.optional(),user:M1.string().optional()});Bd$=class Bd$ extends Error{constructor($){super($);this.name="MessageConversionError"}};Od$=new H1;Od$.post("/:org/v1/chat/completions",async($)=>{let Z=$.get("studioContext"),X=$.req.param("org");try{if(!Z.auth.apiKey?.id)return $.json(RF("API key authentication required. Provide a valid API key via Authorization header.","authentication_error"),401);if(!Z.organization)return $.json(RF("Organization context is required. Ensure your API key has organization metadata.","invalid_request_error","organization"),400);if((Z.organization.slug??Z.organization.id)!==X)return $.json(RF("Organization mismatch. The API key's organization does not match the requested organization.","invalid_request_error","organization"),403);let Q=await $.req.json(),Y=FU6.safeParse(Q);if(!Y.success){let w=Y.error.issues[0]??{message:"Invalid request",path:[]};return $.json(RF(`Invalid request: ${w.message}`,"invalid_request_error",w.path.length>0?w.path.join("."):null),400)}let G=Y.data,J=HU6(G.model);if(!J)return $.json(RF("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)=>Ww(j.providerId));if(!E)return $.json(RF("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 F;try{F=await Z.aiProviders.activate(W,Z.organization.id)}catch{return $.json(RF(`AI provider credential not found or inaccessible: ${W}`,"invalid_request_error","model"),404)}let H=F.aiSdk.languageModel(K),N=UU6(G.messages),U=G.tools?BU6(G.tools):void 0,B=OU6(G.response_format),O=DU6(),L=Math.floor(Date.now()/1000);if(G.stream)return mN($,async(w)=>{let E=Nd$(H,N,U,G,B,$.req.raw.signal);try{let j=PO(E),z=!1,A=0,P="",I=async()=>{if(P.length===0)return;let q=P;P="",await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{content:q},finish_reason:null}]})})};for await(let q of j.fullStream){if(!z&&(q.type==="text-delta"||q.type==="tool-call"))await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{role:"assistant",content:""},finish_reason:null}]})}),z=!0;if(q.type==="text-delta"){if(P+=q.text,P.length>=ZU6)await I()}else if(q.type==="tool-call"){await I();let k=A++;await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{tool_calls:[{index:k,id:q.toolCallId,type:"function",function:{name:q.toolName,arguments:JSON.stringify(q.input)}}]},finish_reason:null}]})})}else if(q.type==="finish")await I(),await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{},finish_reason:Ud$(q.finishReason)}],usage:q.totalUsage?{prompt_tokens:q.totalUsage.inputTokens??0,completion_tokens:q.totalUsage.outputTokens??0,total_tokens:q.totalUsage.totalTokens??0}:void 0})})}await I(),await w.writeSSE({data:"[DONE]"})}catch(j){let z=j;console.error("[openai-compat:stream] Error:",z.message),await w.writeSSE({data:JSON.stringify({error:{message:z.message,type:"server_error"}})})}});else{let w=Nd$(H,N,U,G,B,$.req.raw.signal),E=await jO(w),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:L,model:G.model,choices:[{index:0,message:j,finish_reason:Ud$(E.finishReason)}],usage:{prompt_tokens:E.usage?.inputTokens??0,completion_tokens:E.usage?.outputTokens??0,total_tokens:E.usage?.totalTokens??0}})}}catch(Q){let Y=Q;if(Y.name==="AbortError")return $.json(RF("Request aborted","invalid_request_error"),400);if(Y.name==="MessageConversionError")return $.json(RF(Y.message,"invalid_request_error","messages"),400);return console.error("[openai-compat] Error:",Y.message,Y.stack),$.json(RF(Y.message,"server_error"),500)}});Dd$=Od$});function LU6($){if(typeof $!=="object"||$===null)return!1;let X=$.githubRepo?.url;return typeof X==="string"&&X.length>0}function wd$(){let $=new H1;return $.use("*",async(Z,X)=>{await X(),Z.header("Cache-Control","private, no-store"),Z.header("Vary","Cookie")}),$.get("/",async(Z)=>{let X=Z.get("studioContext"),Q=o0(X);if(!Q)return Z.json({error:"Authentication required"},401);let G=(Z.req.query("site")??"").trim().toLowerCase();if(!rG(G))return Z.json({error:"Invalid site slug"},400);let J=await X.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","=",Q).execute(),W=[];for(let F of J){if(!F.slug||vZ(F))continue;let H=await X.storage.virtualMcps.list(F.id);for(let N of H){if(Xe1(N)!==G)continue;if(!LU6(N.metadata))continue;W.push({orgSlug:F.slug,orgName:F.name??F.slug,project:{id:N.id,title:N.title,icon:N.icon??null}})}}let K={matches:W};return Z.json(K)}),$}var Ed$=D(()=>{U8();ZO()});var zd$;var jd$=D(()=>{zd$={name:"decocms",version:"4.297.6",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 jU6(){let $=process.env.POSTHOG_KEY;if(!$)return null;return{key:$,host:process.env.POSTHOG_HOST??EU6}}var Pd$,EU6="https://ph.studio.decocms.com",Ad$;var Td$=D(()=>{U8();c50();yC();$9();R$();K91();jd$();Pd$=new H1;Pd$.get("/",($)=>{let Z={version:zd$.version,theme:qi1(),...IH().logo&&{logo:IH().logo},...HN()&&{internalUrl:Z_1()},...b0().enableDecoImport&&{enableDecoImport:!0},brandExtractEnabled:!!b0().firecrawlApiKey,auth:Iy$(),posthog:jU6(),googleMapsApiKey:process.env.GOOGLE_MAPS_API_KEY?.trim()||null,runtime:{agentSandbox:Is()}};return $.header("Cache-Control","no-store"),$.json({success:!0,config:Z})});Ad$=Pd$});function ru($){let Z=($??"").trim().toLowerCase();return Z=Z.replace(/^https?:\/\//,""),Z=Z.replace(/^www\./,""),Z=Z.split(/[/?#]/)[0]??"",Z.replace(/\/+$/,"")}function M71($){return(ru($).split(".")[0]||$).replace(/[-_]/g," ").split(" ").filter(Boolean).map((X)=>X.charAt(0).toUpperCase()+X.slice(1)).join(" ")}function Id$($,Z=64){return`https://www.google.com/s2/favicons?domain=${encodeURIComponent(ru($))}&sz=${Z}`}function Rd$($,Z){let X=$.trim();if(X.length<=Z)return X;let Q=X.slice(0,Z-1),Y=Q.lastIndexOf(" ");return`${(Y>Z*0.6?Q.slice(0,Y):Q).trimEnd()}\u2026`}function qd$($){let{brand:Z,domain:X,score:Q,verdict:Y}=$,G=typeof Q==="number"?`${Z} commerce report \u2014 ${Math.round(Q)}/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()?Rd$(`${Y.trim().replace(/\s+/g," ")} \u2014 ${J}`,200):Rd$(`How does ${X} really perform? ${J}`,200);return{title:G,description:W}}import{z as l0}from"zod";var Dv,zU6,PU6,AU6,TU6,Md$;var kd$=D(()=>{Dv=l0.enum(["good","bad","neutral"]),zU6=l0.preprocess(($)=>{if(Array.isArray($))return{kind:"text",value:$.find((X)=>X!==null&&typeof X!=="object")??""};return $!==null&&typeof $==="object"?$:{kind:"text",value:$}},l0.object({kind:l0.enum(["text","number","sparkline","badge","score"]).catch("text"),value:l0.coerce.string().optional(),tone:Dv.optional(),muted:l0.boolean().optional(),delta:l0.coerce.string().optional(),deltaDir:l0.enum(["up","down","neutral"]).optional(),points:l0.array(l0.coerce.number()).optional(),label:l0.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 $})),PU6=l0.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},l0.array(zU6)),AU6={key:l0.coerce.string(),title:l0.coerce.string(),eyebrow:l0.coerce.string().optional(),headline:l0.coerce.string(),annotation:l0.coerce.string().optional(),methodology:l0.coerce.string().optional(),sources:l0.array(l0.object({name:l0.coerce.string(),logoUrl:l0.coerce.string()})).optional()},TU6=l0.discriminatedUnion("template",[l0.object({template:l0.literal("cover"),score:l0.object({value:l0.coerce.number(),max:l0.coerce.number().optional(),grade:l0.coerce.string().optional(),label:l0.coerce.string().optional()}).optional(),brandImage:l0.coerce.string().optional(),screenshot:l0.coerce.string().optional(),mobileScreenshot:l0.coerce.string().optional()}),l0.object({template:l0.literal("cta"),ctaUrl:l0.coerce.string().optional(),ctaLabel:l0.coerce.string().optional(),bullets:l0.array(l0.coerce.string()).optional()}),l0.object({template:l0.literal("series"),points:l0.array(l0.coerce.number()).min(2),xLabels:l0.array(l0.coerce.string()).min(1),unit:l0.coerce.string().optional(),callout:l0.object({index:l0.coerce.number(),value:l0.coerce.string(),tone:Dv.optional()})}),l0.object({template:l0.literal("threshold"),value:l0.coerce.string().default(""),metricLabel:l0.coerce.string().optional(),ratio:l0.coerce.number(),thresholdRatio:l0.coerce.number().optional(),thresholdLabel:l0.coerce.string().default(""),tone:Dv.optional()}),l0.object({template:l0.literal("stats"),stats:l0.array(l0.object({value:l0.coerce.string(),label:l0.coerce.string(),tone:Dv.optional()})).min(1)}),l0.object({template:l0.literal("bars"),items:l0.array(l0.object({value:l0.coerce.string(),label:l0.coerce.string(),ratio:l0.coerce.number(),tone:Dv.optional()})).min(1)}),l0.object({template:l0.literal("gauges"),gauges:l0.array(l0.object({label:l0.coerce.string(),value:l0.coerce.string(),status:l0.enum(["good","warn","bad"]).catch("warn"),caption:l0.coerce.string().optional(),ratio:l0.coerce.number().optional()})).min(1)}),l0.object({template:l0.literal("checklist"),checks:l0.array(l0.object({label:l0.coerce.string(),status:l0.enum(["pass","fail","warn"]).catch("fail"),value:l0.coerce.string().optional()})).min(1)}),l0.object({template:l0.literal("table"),columns:l0.array(l0.object({label:l0.coerce.string(),align:l0.enum(["left","right"]).optional()})).min(1),rows:l0.array(PU6).min(1),highlightRow:l0.coerce.number().optional()}),l0.object({template:l0.literal("products"),products:l0.array(l0.object({name:l0.coerce.string(),price:l0.coerce.string().optional(),image:l0.coerce.string().optional(),url:l0.coerce.string().optional()})).min(1)}),l0.object({template:l0.literal("list"),entries:l0.array(l0.object({label:l0.coerce.string(),severity:l0.enum(["error","warning","notice"]).catch("notice")})).min(1),moreCount:l0.coerce.number().optional()}),l0.object({template:l0.literal("keywords"),volumeLabel:l0.coerce.string().optional(),keywords:l0.array(l0.object({term:l0.coerce.string(),volume:l0.coerce.string(),position:l0.coerce.number().catch(0)})).min(1)}),l0.object({template:l0.literal("competitor"),metricLabel:l0.coerce.string().optional(),competitors:l0.array(l0.object({name:l0.coerce.string(),value:l0.coerce.string(),tone:Dv.optional(),isYou:l0.boolean().optional()})).min(1)}),l0.object({template:l0.literal("scorecard"),rivalLabel:l0.coerce.string().optional(),dimensions:l0.array(l0.object({label:l0.coerce.string(),you:l0.coerce.string(),rival:l0.coerce.string().optional(),rivalName:l0.coerce.string().optional(),tone:Dv.optional()})).min(1)})]),Md$=l0.object({...AU6,template:TU6})});function jT0($){let Z=[],X=[...$.sections].sort((Y,G)=>Y.position-G.position).map((Y)=>{let G=Md$.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),Q=X.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:Q},slides:X},drops:Z}}var k71=D(()=>{kd$()});import{join as Vd$}from"path";async function IU6($){try{let Z=await fetch(`${KK({})}/api/v2/public/diagnostics/${encodeURIComponent($)}`,{headers:{Accept:"application/json"},signal:AbortSignal.timeout(RU6)});if(!Z.ok)return null;let X=await Z.json(),{deck:Q}=jT0(X);if(!Q.slides.length)return null;let Y=Q.slides.find((W)=>W.template.template==="cover"),G=Y?.template,J=G&&G.template==="cover"?G:void 0;return{brand:Q.meta.brand?.trim()||M71($),score:Q.meta.scores?.cover??J?.score?.value,verdict:Y?.annotation?.trim()||Y?.headline?.trim()||void 0}}catch{return null}}function LG($){return $.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function qU6($,Z){let X=ru($),Q=Z?.brand?.trim()||M71(X),Y=Id$(X,128),J=`${(b0().baseUrl??"https://studio.decocms.com").replace(/\/+$/,"")}/report/${encodeURIComponent(X)}`,{title:W,description:K}=qd$({brand:Q,domain:X,score:Z?.score,verdict:Z?.verdict}),F=`${J}/og.png`,H=`${Q} commerce report by decocms`;return[`<title>${LG(W)}</title>`,`<meta name="description" content="${LG(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="${LG(W)}" />`,`<meta property="og:description" content="${LG(K)}" />`,`<meta property="og:url" content="${LG(J)}" />`,`<meta property="og:image" content="${LG(F)}" />`,'<meta property="og:image:width" content="1200" />','<meta property="og:image:height" content="630" />',`<meta property="og:image:alt" content="${LG(H)}" />`,'<meta name="twitter:card" content="summary_large_image" />',`<meta name="twitter:title" content="${LG(W)}" />`,`<meta name="twitter:description" content="${LG(K)}" />`,`<meta name="twitter:image" content="${LG(F)}" />`,`<meta name="twitter:image:alt" content="${LG(H)}" />`,`<link rel="canonical" href="${LG(J)}" />`,`<link rel="icon" href="${LG(Y)}" sizes="any" />`].join(`
|
|
2925
2925
|
`)}function MU6($,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}
|
|
2926
2926
|
</head>`)}function Sd$($){let Z=new H1;return Z.get("/:domain/og.png",async(X)=>{let Q=ru(X.req.param("domain")),Y=async()=>{let G=$?Bun.file(Vd$($,"report-og-fallback.png")):null;if(!G||!await G.exists())return X.notFound();return X.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(`${KK({})}/api/v2/public/diagnostics/${encodeURIComponent(Q)}/og.png`,{signal:AbortSignal.timeout(kU6)}),J=G.headers.get("content-type")??"";if(!G.ok||!J.startsWith("image/")||!G.body)return Y();return X.body(G.body,200,{"Content-Type":J,"Cache-Control":"public, max-age=0, s-maxage=604800"})}catch{return Y()}}),Z.get("/:domain",async(X)=>{let Q=X.req.param("domain"),Y=$?Vd$($,"index.html"):null,G=Y?Bun.file(Y):null;if(!G||!await G.exists())return X.notFound();let J=await G.text();try{let W=await IU6(ru(Q)),K=qU6(Q,W);return X.html(MU6(J,K),200,{"Cache-Control":"public, max-age=0, s-maxage=300"})}catch{return X.html(J)}}),Z}var RU6=2500,kU6=1e4;var Cd$=D(()=>{U8();k71();NE();R$()});function Es($,Z){return fetch(`${KK({})}${$}`,Z)}async function VU6($,Z,X){let Q=new URLSearchParams;if(Z)Q.set("pw",Z);if(X)Q.set("lang",X);let Y=Q.toString()?`?${Q.toString()}`:"",G=await Es(`/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}=jT0(J);return{status:W.slides.length?"ready":"empty",deck:W,scanned_at:J.scanned_at,drops:K}}var SU6,pN,_d$=async($,Z)=>{if(!$.get("reportUser"))return $.json({error:"Authentication required"},401);await Z();return},vd$;var fd$=D(()=>{U8();cY();NE();k71();SU6=new Set(["complete","errored","terminated","unknown"]),pN=new H1;pN.use("*",async($,Z)=>{let X=await Q8.api.getSession({headers:$.req.raw.headers});$.set("reportUser",X?.user?.id?{email:X.user.email}:void 0),await Z(),$.header("Cache-Control","private, no-store"),$.header("Vary","Cookie");return});pN.use("/link-token/*",_d$);pN.use("/suggest",_d$);pN.get("/site/:domain",async($)=>{let Z=$.req.param("domain").trim();if(!Z)return $.json({error:"domain is required"},400);let X=$.get("reportUser"),Q=$.req.query("key")?.trim()||void 0,Y=$.req.query("lang")?.trim()||void 0;try{let G=await VU6(Z,Q,Y);if($.header("Cache-Control","private, no-store"),X||!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)}});pN.post("/run",async($)=>{let Z=$.get("reportUser"),X;try{X=await $.req.json()}catch{return $.json({error:"invalid JSON"},400)}let Q=typeof X.domain==="string"?X.domain.trim():"";if(!Q)return $.json({error:"domain is required"},400);let Y=Z?.email,G=typeof X.distinctId==="string"&&X.distinctId.trim()&&X.distinctId.length<=200?X.distinctId.trim():void 0;try{let J=await Es("/api/v2/diagnostics/run",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${HE({})}`},body:JSON.stringify({url:Q,...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)}});pN.get("/status",async($)=>{let Z=$.req.query("id");if(!Z)return $.json({error:"id is required"},400);try{let X=await Es(`/api/v2/diagnostics/status?id=${encodeURIComponent(Z)}`,{headers:{Authorization:`Bearer ${HE({})}`}});if(!X.ok)return $.json({error:`status HTTP ${X.status}`},502);let Y=(await X.json()).status??"unknown",G={done:SU6.has(Y),status:Y};return $.json(G)}catch{return $.json({error:"status failed"},502)}});pN.get("/link-token/:id",async($)=>{let Z=$.req.param("id");try{let X=await Es(`/api/v2/public/link-tokens/${encodeURIComponent(Z)}`,{headers:{Accept:"application/json"}});if(X.status===404)return $.json(null);if(!X.ok)return $.json({error:`link token HTTP ${X.status}`},502);return $.json(await X.json())}catch{return $.json({error:"link token resolve failed"},502)}});pN.get("/suggest",async($)=>{let Z=($.req.query("q")??"").trim().slice(0,64);if(Z.length<2)return $.json({suggestions:[]});try{let X=await Es(`/api/v2/public/suggest?q=${encodeURIComponent(Z)}`,{headers:{Accept:"application/json"}});if(!X.ok)return $.json({suggestions:[]});let Q=await X.json();return $.json({suggestions:Array.isArray(Q.suggestions)?Q.suggestions:[]})}catch{return $.json({suggestions:[]})}});vd$=pN});import{createHmac as CU6,timingSafeEqual as _U6}from"crypto";function xd$($,Z,X,Q=Date.now()){if(!Z||!X)return!1;let Y,G=[];for(let F of Z.split(",")){let H=F.indexOf("=");if(H<=0)continue;let N=F.slice(0,H).trim(),U=F.slice(H+1).trim();if(N==="t")Y=U;else if(N==="v1")G.push(U)}if(!Y||G.length===0)return!1;let J=Number(Y);if(!Number.isFinite(J)||Math.abs(Q/1000-J)>vU6)return!1;let W=CU6("sha256",X).update(`${Y}.${$}`).digest("hex"),K=Buffer.from(W,"hex");return G.some((F)=>{let H=Buffer.from(F,"hex");return K.length===H.length&&_U6(K,H)})}function yd$($){let Z;try{Z=JSON.parse($)}catch{return null}let X=gJ(Z),Q=gJ(gJ(X?.data)?.object);if(!X||typeof X.type!=="string"||!Q)return null;return{id:IF(X.id),type:X.type,created:typeof X.created==="number"?X.created:void 0,livemode:typeof X.livemode==="boolean"?X.livemode:void 0,data:{object:Q}}}function gd$($){switch($){case"active":case"trialing":return"active";case"past_due":return"past_due";default:return"canceled"}}function IF($){return typeof $==="string"?$:void 0}function gJ($){return typeof $==="object"&&$!==null?$:void 0}function zT0($){return typeof $==="number"?new Date($*1000):null}function C71($){return IF($)??IF(gJ($)?.id)}function fU6($){return C71($.subscription)??IF(gJ(gJ($.parent)?.subscription_details)?.subscription)}function bU6($){let Z=zT0($.current_period_end);if(Z)return Z;let X=gJ($.items)?.data;if(!Array.isArray(X))return null;let Q=0;for(let Y of X){let G=gJ(Y)?.current_period_end;if(typeof G==="number"&&G>Q)Q=G}return Q>0?new Date(Q*1000):null}function V71($,Z){let X=zT0($.created);return!!X&&!!Z.lastStripeEventAt&&X<Z.lastStripeEventAt}function S71($,Z){let X=zT0($.created);if(!X)return;return Z.lastStripeEventAt&&Z.lastStripeEventAt>X?void 0:X}async function xU6($,Z){let X=Z.data.object;switch(Z.type){case"checkout.session.completed":case"checkout.session.async_payment_succeeded":{let Q=IF(gJ(X.metadata)?.orgId);if(!Q)return{handled:!1,reason:"no orgId"};if(IF(gJ(X.metadata)?.kind)==="topup"){if(X.mode!=="payment")return{handled:!1,reason:"topup with wrong mode"};if(IF(X.payment_status)!=="paid")return{handled:!1,reason:"payment not confirmed"};let J=IF(X.id);if(!J)return console.error("stripe webhook: topup session without id",{eventId:Z.id,organizationId:Q}),{handled:!1,reason:"topup session without id"};let W=Number(gJ(X.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:Q,creditCents:gJ(X.metadata)?.creditCents}),{handled:!1,reason:"bad topup metadata"};return{handled:!0,organizationId:Q,topUp:{creditCents:W,referenceId:`stripe-topup:${J}`}}}if(X.mode!=="subscription")return{handled:!1,reason:"not a subscription checkout"};if(IF(X.payment_status)!=="paid")return{handled:!1,reason:"payment not confirmed"};let Y=await $.getBilling(Q);if(!Y)return{handled:!1,reason:"unknown org"};let G=C71(X.subscription);if(Y.stripeSubscriptionId&&G&&Y.stripeSubscriptionId!==G)return console.error("stripe webhook: refused checkout rebind",{organizationId:Q,eventId:Z.id}),{handled:!1,reason:"org already bound to another subscription",orphanSubscriptionId:G};if(V71(Z,Y))return{handled:!1,reason:"stale event"};return await $.updateStripeState(Q,{stripeCustomerId:C71(X.customer),stripeSubscriptionId:G,status:"active",lastStripeEventAt:S71(Z,Y)}),{handled:!0,organizationId:Q}}case"customer.subscription.updated":case"customer.subscription.deleted":{let Q=IF(X.id);if(!Q)return{handled:!1,reason:"no sub id"};let Y=await $.getBillingByStripeSubscriptionId(Q);if(!Y)return{handled:!1,reason:"unknown subscription"};let G=Z.type==="customer.subscription.deleted";if(!G&&V71(Z,Y))return{handled:!1,reason:"stale event"};let J=G?"canceled":gd$(X.status);return await $.updateStripeState(Y.organizationId,{status:J,currentPeriodEnd:bU6(X),...G&&{stripeSubscriptionId:null},lastStripeEventAt:S71(Z,Y)}),{handled:!0,organizationId:Y.organizationId}}case"invoice.paid":{let Q=fU6(X);if(!Q)return{handled:!1,reason:"no sub id"};let Y=await $.getBillingByStripeSubscriptionId(Q);if(!Y)return{handled:!1,reason:"unknown subscription"};if(V71(Z,Y))return{handled:!1,reason:"stale event"};return await $.updateStripeState(Y.organizationId,{status:"active",currentPeriodEnd:zT0(X.period_end),lastStripeEventAt:S71(Z,Y)}),{handled:!0,organizationId:Y.organizationId}}default:return{handled:!1,reason:`unhandled event ${Z.type}`}}}function yU6($,Z){if(!Z.handled||$.livemode===!1)return null;let X=$.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:gd$(X.status),...typeof X.cancel_at_period_end==="boolean"?{cancel_at_period_end:X.cancel_at_period_end}:{}}};case"invoice.paid":if(X.billing_reason==="subscription_create")return null;return{name:"subscription_renewed",organizationId:Z.organizationId,properties:{}};default:return null}}function bd$($,Z){let X=yU6($,Z);if(!X)return;yY({event:X.name,organizationId:X.organizationId,...$.id?{uuid:fn1(`stripe:${$.id}:${X.name}`)}:{},...$.created?{timestamp:new Date($.created*1000)}:{},properties:X.properties})}async function hd$($){let Z=new YK(r8().db),X=await xU6(Z,$);if(!(X.handled&&X.topUp))bd$($,X);if(X.handled&&X.topUp)await Yj$({organizationId:X.organizationId,amountCents:X.topUp.creditCents,referenceId:X.topUp.referenceId}),bd$($,X);if(!X.handled&&X.orphanSubscriptionId)try{await ee1(X.orphanSubscriptionId),console.error("stripe webhook: canceled orphan subscription",{subscriptionId:X.orphanSubscriptionId,eventId:$.id})}catch(Q){if(!(Q instanceof lY&&(Q.status===400||Q.status===404)))throw Q}return X}var vU6=300;var ud$=D(()=>{mG();C4();z50();zE();c01()});var gU6=1048576,_71;var cd$=D(()=>{U8();jF();R$();ud$();_71=new H1;_71.post("/webhook",p5({maxSize:gU6,onError:($)=>$.json({error:"payload too large"},413)}),async($)=>{let Z=b0().stripeWebhookSecret;if(!Z)return $.json({error:"stripe billing not configured"},503);let X=await $.req.text();if(!xd$(X,$.req.header("stripe-signature"),Z))return $.json({error:"invalid signature"},400);let Y=yd$(X);if(!Y)return $.json({error:"invalid payload"},400);let G=await hd$(Y);return console.log("stripe webhook",{eventId:Y.id,type:Y.type,livemode:Y.livemode,...G}),$.json({received:!0})})});import{timingSafeEqual as hU6}from"crypto";function cU6($,Z,X){if(!Z?.startsWith("sha256="))return!1;let Q=new Bun.CryptoHasher("sha256",X).update($).digest("hex"),Y=Z.slice(7);if(Y.length!==Q.length)return!1;return hU6(Buffer.from(Y),Buffer.from(Q))}var uU6=5242880,v71;var ld$=D(()=>{U8();jF();m3();v71=new H1;v71.post("/webhook",p5({maxSize:uU6,onError:($)=>$.json({error:"payload too large"},413)}),async($)=>{let Z=process.env.GITHUB_WEBHOOK_SECRET;if(!Z)return $.json({error:"github webhook not configured"},503);let X=await $.req.text();if(!cU6(X,$.req.header("x-hub-signature-256"),Z))return $.json({error:"invalid signature"},400);if($.req.header("x-github-event")!=="push")return $.json({ok:!0,ignored:"event"});let Q;try{Q=JSON.parse(X)}catch{return $.json({error:"invalid payload"},400)}let Y=Q.ref,G=Q.repository?.full_name;if(!Y||!G)return $.json({ok:!0,ignored:"shape"});let W=(await bn0())?.markTenantPoolsDirty(G,Y)??[];return $.json({ok:!0,pools:W})})});function dd$($,Z){if(Z.startsWith("text/html")||Z.startsWith("image/svg"))$.set("Content-Security-Policy","sandbox allow-scripts allow-modals allow-same-origin")}var md$,lU6,dU6,id$;var pd$=D(()=>{U8();A3();wg();Xy();md$=new H1,lU6=["range","if-none-match","if-modified-since"],dU6=["content-type","content-length","content-range","accept-ranges","etag","last-modified"];md$.get("/:org/files/*",async($)=>{let Z=$.get("studioContext"),X=Z.organization?.id;if(!Z.auth?.user?.id){if(Tu($))return $.redirect(`/login?next=${encodeURIComponent($.req.path)}`,302);throw new Z$(401,{message:"Authentication required"})}if(!X)throw new Z$(401,{message:"Organization context required"});let Q=$.req.path.replace(/^.*\/files\//,"");if(!Q)throw new Z$(400,{message:"Missing file key"});let Y=await Ot(Q,Z);if(!Y)throw new Z$(503,{message:"Object storage not configured"});if(Y.startsWith("data:")&&tG()){let K=Y.match(/^data:([^;]+);base64,(.+)$/s);if(!K)throw new Z$(500,{message:"Invalid data URL from storage"});let[,F,H]=K,N=Buffer.from(H,"base64"),U=new Headers({"Content-Type":F,"Cache-Control":"private, max-age=86400"});return dd$(U,F),new Response(N,{status:200,headers:U})}let G=new Headers;for(let K of lU6){let F=$.req.header(K);if(F)G.set(K,F)}let J=await fetch(Y,{headers:G});if(J.status===403||J.status===404)throw new Z$(404,{message:"File not found"});if(!J.ok&&J.status!==304&&J.status!==416)throw console.error(`[files] upstream storage error ${J.status} for key:`,Q),new Z$(502,{message:"Upstream storage error"});let W=new Headers;for(let K of dU6){let F=J.headers.get(K);if(F)W.set(K,F)}return W.set("Cache-Control","private, max-age=86400"),dd$(W,W.get("content-type")??""),new Response(J.body,{status:J.status,headers:W})});id$=md$});var js=_((Lv)=>{var mU6=Lv&&Lv.__createBinding||(Object.create?function($,Z,X,Q){if(Q===void 0)Q=X;var Y=Object.getOwnPropertyDescriptor(Z,X);if(!Y||("get"in Y?!Z.__esModule:Y.writable||Y.configurable))Y={enumerable:!0,get:function(){return Z[X]}};Object.defineProperty($,Q,Y)}:function($,Z,X,Q){if(Q===void 0)Q=X;$[Q]=Z[X]}),iU6=Lv&&Lv.__exportStar||function($,Z){for(var X in $)if(X!=="default"&&!Object.prototype.hasOwnProperty.call(Z,X))mU6(Z,$,X)};Object.defineProperty(Lv,"__esModule",{value:!0});iU6(AY(),Lv)});var od$=_((nd$)=>{Object.defineProperty(nd$,"__esModule",{value:!0});nd$.version=void 0;nd$.version="3.4.0"});var sd$=_((qF)=>{var pU6=qF&&qF.__importDefault||function($){return $&&$.__esModule?$:{default:$}};Object.defineProperty(qF,"__esModule",{value:!0});qF.NodeTransport=qF.VERSION=void 0;qF.nodeResolveHost=sU6;var s6=js(),nU6=j0("net"),f71=j0("tls"),tU6=j0("path"),rd$=j0("fs"),oU6=pU6(j0("dns")),rU6=od$();qF.VERSION=rU6.version;var aU6="nats.js";class ad${socket;version;lang;yields=[];signal=(0,s6.deferred)();closedNotification=(0,s6.deferred)();options;connected=!1;tlsName="";done=!1;closeError;constructor(){this.lang=aU6,this.version=qF.VERSION}async connect($,Z){this.tlsName=$.tlsName,this.options=Z;let{tls:X}=this.options,{handshakeFirst:Q}=X||{};try{if(Q===!0)this.socket=await this.tlsFirst($);else this.socket=await this.dial($);if(this.done)this.socket?.destroy();let Y=await this.peekInfo();(0,s6.checkOptions)(Y,Z);let{tls_required:G,tls_available:J}=Y,W=J===!0&&Z.tls!==null;if(!Q&&(G||W))this.socket=await this.startTLS();if(this.done)this.socket?.destroy();if(G&&this.socket.encrypted!==!0)throw s6.errors.InvalidArgumentError.format("tls","is not available on this server");return this.connected=!0,this.setupHandlers(),this.signal.resolve(),Promise.resolve()}catch(Y){let G=Y;if(!G)G=new s6.errors.ConnectionError("error connecting - node provided an undefined error");let{code:J}=G,W=J==="ECONNREFUSED"?new s6.errors.ConnectionError("connection refused",{cause:G}):G;throw this.socket?.destroy(),W}}dial($){let Z=(0,s6.deferred)(),X,Q=(0,nU6.createConnection)($.port,$.hostname,()=>{Z.resolve(Q),Q.removeAllListeners()});return Q.on("error",(Y)=>{X=Y}),Q.on("close",()=>{Q.removeAllListeners(),Z.reject(X)}),Q.setNoDelay(!0),Z}get isClosed(){return this.done}close($){return this._closed($,!1)}peekInfo(){let $=(0,s6.deferred)(),Z;return this.socket.on("data",(X)=>{this.yields.push(X);let Q=s6.DataBuffer.concat(...this.yields),Y=(0,s6.extractProtocolMessage)(Q);if(Y!=="")try{let G=s6.INFO.exec(Y);if(!G)throw Error("unexpected response from server");let J=JSON.parse(G[1]);$.resolve(J)}catch(G){$.reject(G)}finally{this.socket.removeAllListeners()}}),this.socket.on("error",(X)=>{Z=X}),this.socket.on("close",()=>{this.socket.removeAllListeners(),$.reject(Z)}),$}loadFile($){if(!$)return Promise.resolve();let Z=(0,s6.deferred)();try{if($=(0,tU6.resolve)($),!(0,rd$.existsSync)($))Z.reject(Error(`${$} doesn't exist`));(0,rd$.readFile)($,(X,Q)=>{if(X)return Z.reject(X);Z.resolve(Q)})}catch(X){Z.reject(X)}return Z}async loadClientCerts(){let $={},{certFile:Z,cert:X,caFile:Q,ca:Y,keyFile:G,key:J}=this.options.tls;try{if(Z){let W=await this.loadFile(Z);if(W)$.cert=W}else if(X)$.cert=X;if(G){let W=await this.loadFile(G);if(W)$.key=W}else if(J)$.key=J;if(Q){let W=await this.loadFile(Q);if(W)$.ca=[W]}else if(Y)$.ca=Y;return Promise.resolve($)}catch(W){return Promise.reject(W)}}async tlsFirst($){let Z,X={servername:this.tlsName,rejectUnauthorized:!0};if(this.socket)X.socket=this.socket;if(typeof this.options.tls==="object")try{let Y=await this.loadClientCerts()||{};X=(0,s6.extend)(X,this.options.tls,Y)}catch(Y){return Promise.reject(new s6.errors.ConnectionError(Y.message,{cause:Y}))}let Q=(0,s6.deferred)();try{let Y=(0,f71.connect)($.port,$.hostname,X,()=>{Y.removeAllListeners(),Q.resolve(Y)});Y.on("error",(G)=>{Z=G}),Y.on("secureConnect",()=>{if(X.rejectUnauthorized===!1)return;if(!Y.authorized)throw Y.authorizationError}),Y.on("close",()=>{Q.reject(Z),Y.removeAllListeners()}),Y.setNoDelay(!0)}catch(Y){Q.reject(new s6.errors.ConnectionError(Y.message,{cause:Y}))}return Q}async startTLS(){let $,Z={socket:this.socket,servername:this.tlsName,rejectUnauthorized:!0};if(typeof this.options.tls==="object")try{let Q=await this.loadClientCerts()||{};Z=(0,s6.extend)(Z,this.options.tls,Q)}catch(Q){return Promise.reject(new s6.errors.ConnectionError(Q.message,{cause:Q}))}let X=(0,s6.deferred)();try{let Q=(0,f71.connect)(Z,()=>{Q.removeAllListeners(),X.resolve(Q)});Q.on("error",(Y)=>{$=Y}),Q.on("secureConnect",()=>{if(Z.rejectUnauthorized===!1)return;if(!Q.authorized)throw Q.authorizationError}),Q.on("close",()=>{X.reject($),Q.removeAllListeners()})}catch(Q){X.reject(new s6.errors.ConnectionError(Q.message,{cause:Q}))}return X}setupHandlers(){let $;this.socket.on("data",(Z)=>{return this.yields.push(Z),this.signal.resolve()}),this.socket.on("error",(Z)=>{$=Z}),this.socket.on("end",()=>{if(this.socket?.destroyed)return;this.socket?.write(new Uint8Array(0),()=>{this.socket?.end()})}),this.socket.on("close",()=>{this._closed($,!1)})}[Symbol.asyncIterator](){return this.iterate()}async*iterate(){while(!0){if(this.yields.length===0)await this.signal;let $=this.yields;this.yields=[];for(let Z=0;Z<$.length;Z++){if(this.options.debug)console.info(`> ${(0,s6.render)($[Z])}`);yield $[Z]}if(this.done)break;else if(this.yields.length===0)$.length=0,this.yields=$,this.signal=(0,s6.deferred)()}}discard(){if(this.done=!0,this.socket)try{this.socket.removeAllListeners(),this.socket.destroy()}catch{}}disconnect(){this._closed(void 0,!0).then().catch()}isEncrypted(){return this.socket instanceof f71.TLSSocket}_send($){if(this.isClosed||this.socket===void 0)return Promise.resolve();if(this.options.debug)console.info(`< ${(0,s6.render)($)}`);let Z=(0,s6.deferred)();try{this.socket.write($,(X)=>{if(X){if(this.options.debug)console.error(`!!! ${(0,s6.render)($)}: ${X}`);return Z.reject(X)}return Z.resolve()})}catch(X){if(this.options.debug)console.error(`!!! ${(0,s6.render)($)}: ${X}`);Z.reject(X)}return Z}send($){this._send($).catch((X)=>{})}async _closed($,Z=!0){if(!this.connected)return;if(this.done){this.socket?.destroy();return}if(this.closeError=$,!$&&this.socket&&Z)try{await this._send(new TextEncoder().encode(""))}catch(X){if(this.options.debug)console.log("transport close terminated with an error",X)}try{if(this.socket)this.socket.removeAllListeners(),this.socket?.destroy(),this.socket=void 0}catch(X){console.log(X)}this.done=!0,this.closedNotification.resolve(this.closeError)}closed(){return this.closedNotification}}qF.NodeTransport=ad$;function sU6($){let Z=(0,s6.deferred)();return oU6.default.lookup($,{all:!0},(X,Q)=>{if(X){Z.reject(X);return}let Y=[];for(let G of Q)Y.push(G.address);if(Y.length===0)Y.push($);Z.resolve(Y)}),Z}});var Qm$=_((Xm$)=>{Object.defineProperty(Xm$,"__esModule",{value:!0});Xm$.connect=eU6;var ed$=sd$(),$m$=js(),Zm$=js();function eU6($={}){if((0,Zm$.hasWsProtocol)($))return Promise.reject(Zm$.errors.InvalidArgumentError.format("servers","node client doesn't support websockets, use the 'wsconnect' function instead"));return(0,$m$.setTransportFactory)({factory:()=>{return new ed$.NodeTransport},dnsResolveFn:ed$.nodeResolveHost}),$m$.NatsConnectionImpl.connect($)}});var Ym$=_((nN)=>{var ZB6=nN&&nN.__createBinding||(Object.create?function($,Z,X,Q){if(Q===void 0)Q=X;var Y=Object.getOwnPropertyDescriptor(Z,X);if(!Y||("get"in Y?!Z.__esModule:Y.writable||Y.configurable))Y={enumerable:!0,get:function(){return Z[X]}};Object.defineProperty($,Q,Y)}:function($,Z,X,Q){if(Q===void 0)Q=X;$[Q]=Z[X]}),XB6=nN&&nN.__exportStar||function($,Z){for(var X in $)if(X!=="default"&&!Object.prototype.hasOwnProperty.call(Z,X))ZB6(Z,$,X)};Object.defineProperty(nN,"__esModule",{value:!0});nN.connect=void 0;var QB6=Qm$();Object.defineProperty(nN,"connect",{enumerable:!0,get:function(){return QB6.connect}});XB6(js(),nN)});function Km$($){let Z=$?.connectFn??WB6,X=null,Q=null,Y=!1,G=!1,J=!1,W=[];function K(){return X!==null&&!X.isClosed()&&!X.isDraining()&&!J}function F(){console.log(`[NatsProvider] fireReady: ${W.length} callbacks`);for(let U of W)try{U()}catch{}}function H(U){(async()=>{for await(let B of U.status())if(B.type==="disconnect")console.log("[NatsProvider] Disconnected"),J=!0;else if(B.type==="reconnect")console.log("[NatsProvider] Reconnected, re-firing ready callbacks"),J=!1,Q=null,F()})().catch(()=>{})}async function N(U,B){let O=0;while(!G)try{X=await Z({servers:U,timeout:JB6,reconnect:!0,maxReconnectAttempts:-1,...B?{authenticator:B}:{}}),console.log(`[NatsProvider] Connected to ${X.getServer()} after ${O} attempt(s)`),Q=null,J=!1,H(X),F();return}catch{O++;let L=aZ(GB6,YB6,O-1,2,0.5);await L$(L)}}return{init(U,B){if(Y)return;Y=!0,G=!1;let O=B?.creds?Gm$.credsAuthenticator(new TextEncoder().encode(B.creds)):void 0;N(U,O).catch(()=>{})},isConnected(){return K()},getConnection(){return K()?X:null},getJetStream(){if(!K())return null;if(!Q)Q=Wm$.jetstream(X);return Q},onReady(U){if(W.push(U),K())try{U()}catch{}},async drain(){if(G=!0,Y=!1,Q=null,J=!1,X){let U=X;X=null,await U.drain().catch(()=>{})}}}}function WB6($){return Jm$.connect($)}var Gm$,Jm$,Wm$,YB6=100,GB6=3000,JB6=3000;var Fm$=D(()=>{W4();Gm$=V(Pc(),1),Jm$=V(Ym$(),1),Wm$=V(OL(),1)});function b71($,Z){return`${$}.${Z}`}class x71{cache;constructor($){this.cache=Yu({ttlMs:$?.ttlMs??KB6,maxSize:$?.maxSize??FB6})}async get($,Z){return this.cache.get(b71($,Z))??null}async set($,Z,X){this.cache.set(b71($,Z),X)}async invalidate($,Z){this.cache.delete(b71($,Z))}teardown(){this.cache.clear()}}var KB6=600000,FB6=5000;var Hm$=()=>{};function PT0($,Z){return`${$}:${Z}`}function y71($){let Z=Yu({ttlMs:$?.ttlMs??HB6,maxSize:$?.maxSize??NB6}),X=$?.getConnection,Q=crypto.randomUUID(),Y=new TextEncoder,G=new TextDecoder,J=null;function W(K,F){let H=X?.();if(!H)return;try{H.publish(Nm$,Y.encode(JSON.stringify({organizationId:K,keyId:F,originId:Q})))}catch(N){console.warn("[ProviderKeyCache] Publish failed (non-critical):",N)}}return{get(K,F){return Z.get(PT0(K,F))},set(K,F,H){Z.set(PT0(K,F),H)},invalidate(K,F){Z.delete(PT0(K,F)),W(K,F)},start(){if(J)return;let K=X?.();if(!K)return;J=K.subscribe(Nm$),(async()=>{for await(let F of J)try{let H=JSON.parse(G.decode(F.data));if(H.originId===Q)continue;Z.delete(PT0(H.organizationId,H.keyId))}catch{}})().catch(console.error)},teardown(){J?.unsubscribe(),J=null,Z.clear()}}}var Nm$="studio.ai-provider-keys.invalidate",HB6=30000,NB6=5000;var Um$=()=>{};class g71{options;subscription=null;onCancel=null;encoder=new TextEncoder;originId=crypto.randomUUID();constructor($){this.options=$}async start($){if($)this.onCancel=$;if(this.subscription)return;if(!this.onCancel)return;let Z=this.options.getConnection();if(!Z)return;let X=new TextDecoder,Q=Z.subscribe("studio.decopilot.cancel");this.subscription=Q,(async()=>{for await(let Y of Q)try{let G=JSON.parse(X.decode(Y.data));if(G.originId===this.originId)continue;this.onCancel?.(G.taskId)}catch{}})().catch(console.error)}broadcast($){if(/[.*>\s]/.test($)){console.warn("[NatsCancelBroadcast] Invalid threadId, skipping broadcast");return}this.onCancel?.($);try{let Z=this.options.getConnection();if(!Z)return;let X=this.encoder.encode(JSON.stringify({taskId:$,originId:this.originId}));Z.publish("studio.decopilot.cancel",X)}catch(Z){console.warn("[NatsCancelBroadcast] Publish failed (non-critical):",Z)}}async stop(){this.subscription?.unsubscribe(),this.subscription=null,this.onCancel=null}}var Bm$=($)=>{let Z;return()=>Z??=$()},h71,u71;var Om$=D(()=>{I6();h71=Bm$(()=>w$.createHistogram("decopilot.stream.encode_ms",{description:"Per-chunk JSON.stringify+encode time for decopilot stream",unit:"ms"})),u71=Bm$(()=>w$.createCounter("decopilot.stream.published_chunks",{description:"Logical decopilot stream chunks published to JetStream",unit:"{chunks}"}))});function EB6($=wm$){return{name:pK,subjects:[`${Xa0}.>`],storage:EW.StorageType.File,max_age:OB6,max_bytes:LB6,max_msgs_per_subject:wB6,discard:EW.DiscardPolicy.Old,retention:EW.RetentionPolicy.Limits,duplicate_window:DB6,num_replicas:$}}class Em${chunks=0;encodeMs=0;maxMs=0;bytes=0;windowStart=performance.now();constructor(){setInterval(()=>this.flush(),1e4).unref?.()}record($,Z){if(this.chunks++,this.encodeMs+=$,$>this.maxMs)this.maxMs=$;this.bytes+=Z}flush(){let $=performance.now(),Z=$-this.windowStart;if(this.chunks>0&&Z>0)console.warn(JSON.stringify({msg:"stream-encode-trace",windowMs:Math.round(Z),chunks:this.chunks,encodeMs:Math.round(this.encodeMs),pctOfLoop:+(this.encodeMs/Z*100).toFixed(1),maxChunkMs:+this.maxMs.toFixed(2),mbEncoded:+(this.bytes/1048576).toFixed(2)}));this.chunks=0,this.encodeMs=0,this.maxMs=0,this.bytes=0,this.windowStart=$}}function Dm$($){let Z=Lm$.headers();for(let[X,Q]of Object.entries($))Z.set(X,Q);return Z}function AB6($,Z){let X=0;return{publish(Q,Y,G,J){Q.publish(Y,G,J?{headers:J}:void 0).catch((W)=>{if(X++,BB6().add(1,{"org.id":Z??"unknown"}),X===1||X%100===0)console.warn(`[Decopilot] JetStream publish failed for thread ${$} (${X} total):`,W)})},get errorCount(){return X}}}function TB6($,Z){return $.info?.cluster?Z:1}function RB6($){if(!($ instanceof Error))return!1;if(/non-clustered/i.test($.message))return!0;return/replicas?\b/i.test($.message)&&/not supported|can ?not|exceed|insufficient|greater than/i.test($.message)}class c71{options;js=null;jsm=null;constructor($){this.options=$}async init(){let $=this.options.getConnection();if(!$){console.log("[Decopilot] StreamBuffer.init skipped: NATS not connected yet");return}let Z=async(Q,Y)=>{let G=EB6(Y);try{await Q.streams.info(pK),await Q.streams.update(pK,G)}catch(J){if(J instanceof Error&&J.message.includes("stream not found"))await Q.streams.add(G),await Q.streams.update(pK,G);else if(J instanceof Error&&/can ?not change.*storage|storage type/i.test(J.message))await Q.streams.delete(pK),await Q.streams.add(G);else throw J}},X=await g6(async()=>{let Q=this.options.getJetStreamManager?await this.options.getJetStreamManager():await EW.jetstreamManager($),Y=TB6($,wm$);try{await Z(Q,Y)}catch(G){if(Y<=1||!RB6(G))throw G;console.warn(`[Decopilot] StreamBuffer: NATS rejected num_replicas=${Y} (${G.message}); falling back to an unreplicated stream`),await Z(Q,1)}return Q},{maxAttempts:5,minTimeout:250,maxTimeout:4000,jitter:0.5,isRetriable:kg});this.js=this.options.getJetStream(),this.jsm=X,console.log(`[Decopilot] StreamBuffer.init ${this.js?"ready":"degraded (js=null)"}`)}pump($,Z,X,Q){let Y=this.js;if(!Y)return console.warn(`[Decopilot] pump: JetStream client unavailable for thread ${Z}; chunks NOT published to NATS`),Promise.resolve();let G=AB6(Z,Q),J=!1,W=()=>{if(J)return;J=!0;let F=nB$(Z);Y.publish(F.subject,F.data).catch(()=>{})};X.addEventListener("abort",W,{once:!0});let K=(F)=>{let H=performance.now(),N=Ya0(F,{runId:Z}),U=performance.now()-H;h71().record(U),u71().add(1,{"org.id":Q??"unknown"}),PB6?.record(U,N.reduce((B,O)=>B+O.data.length,0));for(let B of N)G.publish(Y,B.subject,B.data,B.headers?Dm$(B.headers):void 0)};return(async()=>{let F=$.getReader(),H=0,N=0,U;try{while(!0){let{done:B,value:O}=await F.read();if(B)break;if(K(O),N++,++H>=64)H=0,await new Promise((L)=>setImmediate(L))}}catch(B){U=B,console.warn(`[Decopilot] stream pump error for thread ${Z}:`,B?.message??B)}finally{if(F.releaseLock(),W(),zB6)console.warn(JSON.stringify({msg:"decopilot-stream-diag",event:"pump-done",taskId:Z,publishedChunks:N,publishErrors:G.errorCount}))}if(U!==void 0)throw U})()}async publishSerialized($,Z){try{return await g6(()=>$.publish(Z.subject,Z.data,{...Z.headers?{headers:Dm$(Z.headers)}:{},...Z.msgId?{msgID:Z.msgId}:{}}),{maxAttempts:6,minTimeout:250,maxTimeout:5000,jitter:0.5,isRetriable:kg}),!0}catch(X){return console.error(`[Decopilot] publish failed after retries subject=${Z.subject}`,X),!1}}async publishRawChunk($,Z,X){let Q=this.js;if(!Q)return!1;let Y=performance.now(),G=Ya0(Z,{runId:$,dedup:X});h71().record(performance.now()-Y),u71().add(1);for(let J of G)if(!await this.publishSerialized(Q,J))return!1;return!0}async publishDone($,Z,X){let Q=this.js;if(!Q)return!1;let Y=pB$({runId:$,fenceToken:Z,finalSeq:X});return await this.publishSerialized(Q,Y)}async createTailStream($,Z,X){let Q=this.js;if(!Q)return console.warn(`[Decopilot] createTailStream: JetStream client unavailable for thread ${$}; no live tail`),null;let Y=X?.deliverPolicy==="new"?EW.DeliverPolicy.New:EW.DeliverPolicy.All,G=X?.closeOnDone??!1,J=GD($),W;try{W=await g6(async()=>{return(await Q.consumers.get(pK,{filter_subjects:J,deliver_policy:Y})).consume()},{maxAttempts:6,minTimeout:250,maxTimeout:5000,jitter:0.5,isRetriable:kg})}catch(L){return console.warn("[Decopilot] JetStream tail unavailable (non-critical):",L?.message??L),null}let H=Zw0({messages:async function*(){try{for await(let L of W)yield{subject:L.subject,data:L.data,headers:L.headers}}finally{W.stop()}}(),onCancel:()=>W.stop()}).pipeThrough(aL0()).pipeThrough(sL0()).getReader(),N=!1,U=()=>{if(N)return;N=!0;try{H.releaseLock()}catch{}},B=!1,O=()=>{if(B)return;B=!0,W.stop(),H.cancel().catch(()=>{}),U()};return Z?.addEventListener("abort",O,{once:!0}),new ReadableStream({async pull(L){for(;;){let{done:w,value:E}=await H.read();if(w){O(),L.close();return}let j=E;if(j.kind==="done"){if(G){O(),L.close();return}continue}L.enqueue(j.chunk);return}},cancel(){O()}})}purge($){if(!this.jsm)return;this.jsm.streams.purge(pK,{filter:GD($)}).catch(()=>{})}teardown(){this.js=null,this.jsm=null}}var EW,Lm$,UB6=($)=>{let Z;return()=>Z??=$()},BB6,OB6=86400000000000,DB6=120000000000,LB6=4294967296,wm$,wB6=500000,jB6,zB6,PB6;var jm$=D(()=>{W4();Ga0();Xw0();eL0();I6();Om$();EW=V(OL(),1),Lm$=V(Pc(),1),BB6=UB6(()=>w$.createCounter("decopilot.stream.publish_errors",{description:"Number of JetStream publish failures for decopilot stream chunks",unit:"{errors}"})),wm$=Math.max(1,Number(process.env.DECOPILOT_STREAM_REPLICAS??3)||3);jB6=process.env.STREAM_ENCODE_TRACE==="1",zB6=process.env.DECOPILOT_STREAM_TRACE==="1";PB6=jB6?new Em$:null});function AT0($,Z,X,Q){if(!Q)return!1;return $.emit(Z,cW(X,Q.status,{title:Q.title??void 0,virtualMcpId:Q.virtual_mcp_id??void 0,createdBy:Q.created_by??void 0,triggerId:Q.trigger_id??null,branch:Q.branch??null,harnessId:Q.harness_id??void 0,createdAt:Q.created_at,updatedAt:Q.updated_at})),!0}var zm$=D(()=>{_8()});class l71{storage;options;timer=null;constructor($,Z={}){this.storage=$;this.options=Z}start(){if(this.timer)return;let $=this.options.intervalMs??300000;this.timer=setInterval(()=>{this.runOnce()},$)}async runOnce(){let $=this.options.staleAfterMs??3600000;try{let Z=await this.storage.sweepAbandoned($);if(Z>0)console.log(`[async-research-sweeper] marked ${Z} stale jobs as abandoned`);return Z}catch(Z){return console.error("[async-research-sweeper] sweep failed",Z),0}}dispose(){if(this.timer)clearInterval(this.timer),this.timer=null}}async function Pm$($,Z,X){let Q=Z.organizationId;if(!sQ(Z))return!1;if(!vC(X))return!1;if(await $.storage.taskBoard.hasHumanRejectedDone(Z.id,Q))return!1;let Y=await $.storage.organizationSettings.get(Q),G=EK(Y?.flags),J=await $.storage.taskBoard.update(Z.id,Q,{status:G},Z.updatedBy);return await z6($,{taskBoardItemId:Z.id,action:"status_changed",actorId:null,data:{from:Z.status,to:G,reason:"pr_merged"}}),x$(Q,J),console.log(`[task-board-review-sweeper] ${Z.id}: linked PR already merged \u2014 moved to ${G}`),!0}var Am$=D(()=>{C6();WX();Og();yK();E5()});function CB6($){return $ instanceof tX}function _B6($,Z){return Z-$>=VB6}class d71{taskBoard;contextFactory;billing;options;timer=null;running=!1;cursor=null;constructor($,Z,X,Q={}){this.taskBoard=$;this.contextFactory=Z;this.billing=X;this.options=Q}start(){if(this.timer)return;let $=this.options.intervalMs??IB6;this.timer=setInterval(()=>{this.runOnce()},$),this.timer.unref()}async runOnce(){if(this.running)return 0;this.running=!0;let $=0;try{let Z=this.options.batchSize??MB6,X=this.options.itemIntervalMs??qB6,Q=new Date(Date.now()-X),Y=await this.taskBoard.listItemsPendingReview(Z,this.cursor,Q),G=Y.at(-1);this.cursor=Y.length===Z&&G?{updatedAt:G.updatedAt,id:G.id}:null;for(let{id:J,organizationId:W}of Y)try{if(await this.reconcileItem(J,W,Q))$++}catch(K){console.error(`[task-board-review-sweeper] ${J} failed`,K)}await this.reapNeverStartedThreads(Z),$+=await this.dispatchDueRetries(Z),await this.reactToUnhandledFailures(Z)}catch(Z){console.error("[task-board-review-sweeper] sweep failed",Z)}finally{this.running=!1}return $}async reapNeverStartedThreads($){try{let Z=await this.taskBoard.failNeverStartedLinkedThreads($,new Date(Date.now()-Rt0),Ao0);for(let X of Z)console.warn(`[task-board-review-sweeper] failed never-started thread ${X.threadId} on ${X.itemId}`)}catch(Z){console.error("[task-board-review-sweeper] reaping failed",Z)}}async reactToUnhandledFailures($){let Z=await this.taskBoard.listItemsStuckAfterFailure($,new Date(Date.now()-SB6));for(let{id:X,organizationId:Q,threadId:Y}of Z)try{console.warn(`[task-board-review-sweeper] reacting to an unhandled failure on ${X}`),await jo0(this.taskBoard,Y,Q),await zo0(this.taskBoard,this.billing,Y,Q)}catch(G){console.error(`[task-board-review-sweeper] unhandled-failure reaction for ${X} failed`,G)}}async dispatchDueRetries($){let Z=0,X=await this.taskBoard.listItemsDueForRetry($,new Date);for(let{id:Q,organizationId:Y,attempts:G}of X)try{if(!await this.taskBoard.claimDueRetry(Q,Y,new Date))continue;let J=await this.taskBoard.getById(Q,Y);if(!J||J.status!=="in_progress"||J.assigneeId!==Z8)continue;let W=await this.contextFactory(Y,J.assignedBy??J.createdBy);if(!W)continue;await KN(W,J,{runClass:"retry"}),Z++,console.warn(`[task-board-review-sweeper] re-dispatched ${Q} after a failure (attempt ${G})`)}catch(J){if(console.error(`[task-board-review-sweeper] retry dispatch for ${Q} failed`,J),CB6(J)){await this.returnToTodo(Q,Y,J instanceof Error?J.message:String(J));continue}await this.taskBoard.scheduleRunRetry(Q,Y,G,new Date(Date.now()+kB6)).catch((W)=>console.error(`[task-board-review-sweeper] re-arming ${Q} failed`,W))}return Z}async returnToTodo($,Z,X){try{let Q=await this.taskBoard.getById($,Z);if(!Q||Q.status!=="in_progress")return;let Y=await this.taskBoard.returnToTodoAfterFailure($,Z,Q.updatedBy);if(!Y)return;await this.taskBoard.recordActivity({taskBoardItemId:$,action:"status_changed",actorId:null,data:{from:"in_progress",to:"todo",reason:X}}).catch(()=>{}),x$(Z,Y)}catch(Q){console.error(`[task-board-review-sweeper] returning ${$} to todo failed`,Q)}}async handOffReviewWithoutPr($,Z){let X=await this.taskBoard.listActivity(Z.id,Z.organizationId);if(!_B6(xH(X,Z.reviewCycleStartedAt),Date.now()))return;await uK($,Z,"no pull request is linked to this task \u2014 there is nothing for a "+"reviewer to review")}async reconcileItem($,Z,X){if(!await this.taskBoard.claimSweep($,Z,X))return!1;let Q=await this.taskBoard.getById($,Z);if(!Q)return!1;if(!sQ(Q))return!1;let Y=Q.assigneeId===Z8,G=await this.taskBoard.listPrs($,Z),J=await this.contextFactory(Z,Q.assignedBy??Q.createdBy);if(!J)return!1;if(G.length===0){if(Y)await this.handOffReviewWithoutPr(J,Q);return!1}let W=await Promise.all(G.map(async(K)=>({...K,...await Lg(Z,K)})));if(W.every((K)=>K.state===null))console.warn(`[task-board-review-sweeper] ${$}: no live PR state from GitHub (${W.length} PR(s)) \u2014 proceeding on unknown`);if(await Pm$(J,Q,W))return!0;if(await bO$(J,Q))return!0;if(!Y)return!1;if(!co0(W))return!1;return await BL0(J,Q,{previewMatchesHead:lo0(W)}),!0}dispose(){if(this.timer)clearInterval(this.timer),this.timer=null}}var IB6=60000,qB6=300000,MB6=50,kB6=60000,VB6=900000,SB6=120000;var Tm$=D(()=>{C6();_o0();JN();bt();yK();Am$();E5();sG();To0();ZG();Ht()});import{readdir as vB6,rm as TT0}from"fs/promises";import{join as RT0}from"path";async function IT0($){let Z=new Date;Z.setUTCDate(Z.getUTCDate()-fB6),Z.setUTCHours(0,0,0,0);let X=0;try{let Q=await wv($);for(let Y of Q)if(/^\d{4}$/.test(Y))X+=await Rm$($,Y,Z);else if(!Y.startsWith(".")){let G=RT0($,Y),J=await wv(G);for(let K of J){if(!/^\d{4}$/.test(K))continue;X+=await Rm$(G,K,Z)}if((await wv(G)).length===0)await TT0(G,{recursive:!0,force:!0})}}catch(Q){console.warn("monitoring retention cleanup failed:",Q)}return X}async function Rm$($,Z,X){let Q=0,Y=RT0($,Z),G=await wv(Y);for(let W of G){if(!/^\d{2}$/.test(W))continue;let K=RT0(Y,W),F=await wv(K);for(let N of F){if(!/^\d{2}$/.test(N))continue;let U=new Date(`${Z}-${W}-${N}T00:00:00Z`);if(isNaN(U.getTime()))continue;if(U<X){let B=RT0(K,N);await TT0(B,{recursive:!0,force:!0}),Q++}}if((await wv(K)).length===0)await TT0(K,{recursive:!0,force:!0})}if((await wv(Y)).length===0)await TT0(Y,{recursive:!0,force:!0});return Q}async function wv($){try{return(await vB6($)).filter((X)=>!X.startsWith("."))}catch{return[]}}var fB6=30;var m71=()=>{};import{DBOS as i71,SchedulerMode as bB6}from"@dbos-inc/dbos-sdk";async function yB6(){let $=[uJ(),Ev(),SF()],Z=0;for(let X of $)try{Z+=await IT0(X)}catch(Q){console.error("[monitoring-retention] cleanup failed:",Q)}return console.log(`[monitoring-retention] deleted ${Z} day-dir(s) across ${$.length} signal dir(s)`),{deleted:Z,dirs:$.length}}async function gB6($,Z){await i71.runStep(()=>yB6(),{name:"monitoringRetention"})}function qm$(){if(Im$)return;Im$=!0;let $=i71.registerWorkflow(gB6,{name:"monitoringRetentionWorkflow"});i71.registerScheduled($,{name:"monitoringRetentionWorkflow",crontab:xB6,mode:bB6.ExactlyOncePerIntervalWhenActive})}var xB6="23 4 * * *",Im$=!1;var Mm$=D(()=>{EY();m71()});function km$($){return async(Z,X)=>{let Q=await $.db.selectFrom("member").innerJoin("organization","organization.id","member.organizationId").select(["member.role","organization.id as orgId","organization.slug as orgSlug","organization.name as orgName"]).where("member.userId","=",X).where("member.organizationId","=",Z).executeTakeFirst();if(!Q)return console.warn(`[automationContextFactory] User ${X} not found in org ${Z} \u2014 returning null`),null;let Y=await UJ.create();Y.auth.user={id:X,role:Q.role},Y.organization={id:Q.orgId,slug:Q.orgSlug,name:Q.orgName};let G=await Et($.db,Z,Q.role);return Y.boundAuth=i51({auth:Y.authInstance,headers:new Headers,role:Q.role,permissions:G,userId:X}),Y.access=new tw(X,void 0,Y.boundAuth,Q.role,"self"),oO(Y,{id:Q.orgId,slug:Q.orgSlug}),Y}}var Vm$=D(()=>{ow();rO()});function hB6(){return[{name:"Postgres",status:"pending",port:0},{name:"NATS",status:"pending",port:0}]}function uB6(){return{services:hB6(),migrationsStatus:"pending",serverUrl:null,logs:[]}}function lB6(){for(let $ of cB6)$()}function Sm$($){let Z=[...p71.logs,$];p71={...p71,logs:Z.length>500?Z.slice(-500):Z},lB6()}function n71(){return dB6}var p71,cB6,dB6=!1;var t71=D(()=>{p71=uB6(),cB6=new Set});import{EventEmitter as mB6}from"events";var o71;var Cm$=D(()=>{t71();o71=new mB6;o71.on("request",($)=>{Sm$($)})});function _m$(){return async($,Z)=>{let X=Date.now(),Q=$.req.method,Y=$.req.path;if(Y==="/api/auth/get-session"||Y.includes("favicon")){await Z();return}let G="",J=!1;if(Y.startsWith("/mcp")&&Q==="POST"){J=!0;try{if($.req.header("Content-Type")?.includes("application/json")){let U=await $.req.raw.clone().json();if(U.method==="tools/call"&&U.params?.name){let B=au(U.params.name),O=U.params.arguments||{},L=Object.keys(O).map((E)=>au(E)),w=L.length>0?L.slice(0,3).join(",")+(L.length>3?"\u2026":""):"";G=`${J5.tool}${B}${J5.dim}(${w})${J5.reset}`}else if(U.method)G=`${J5.dim}${au(U.method)}${J5.reset}`}}catch{}}let W=au(Y);if(Y.startsWith("/mcp/conn_")){let H=Y.split("/")[2]??"";W=`/mcp/${J5.mcp}${au(H.slice(0,12))}\u2026${J5.reset}`}else if(Y==="/mcp")W=`${J5.mcp}/mcp${J5.reset}`;else if(Y==="/mcp/registry")W=`${J5.mcp}/mcp/registry${J5.reset}`;let K=pB6(Q),F=J?"\u25C0":"\u2190";if(!n71())console.log(`${J5.dim}${F}${J5.reset} ${K}${Q}${J5.reset} ${W}${G?` ${G}`:""}`);try{await Z()}finally{let H=Date.now()-X,N=$.res.status,U=iB6(N),B=H<1000?`${H}ms`:`${(H/1000).toFixed(1)}s`,O=J?"\u25B6":"\u2192";if(!n71())console.log(`${J5.dim}${O}${J5.reset} ${K}${Q}${J5.reset} ${W}${G?` ${G}`:""} ${U}${N}${J5.reset} ${J5.duration}${B}${J5.reset}`);o71.emit("request",{method:Q,path:au(Y),status:N,duration:H,timestamp:new Date})}}}var J5,iB6=($)=>{if($>=500)return J5.serverError;if($>=400)return J5.clientError;if($>=300)return J5.redirect;return J5.ok},pB6=($)=>{return J5[$]||J5.reset},au=($)=>{return $.replace(/\r/g,"").replace(/\n/g,"").replace(/\x1b\[[0-9;]*m/g,"").replace(/[\x00-\x1f\x7f-\x9f]/g,"")};var vm$=D(()=>{t71();Cm$();J5={reset:"\x1B[0m",dim:"\x1B[2m",bold:"\x1B[1m",GET:"\x1B[36m",POST:"\x1B[33m",PUT:"\x1B[35m",DELETE:"\x1B[31m",ok:"\x1B[32m",redirect:"\x1B[36m",clientError:"\x1B[33m",serverError:"\x1B[31m",mcp:"\x1B[35m",tool:"\x1B[96m",duration:"\x1B[90m"}});import{createHmac as ym$}from"crypto";import{mkdir as nB6,readdir as tB6,rm as fm$,stat as gm$}from"fs/promises";import{join as a71,relative as oB6}from"path";import{z as P$}from"zod";function um$($){let Z=$.replace(/[^a-zA-Z0-9_-]/g,"_");return a71(rB6,Z)}function cm$($){return $.replace(/^\/+/,"").replace(/\.\./g,"")}function r71($,Z){let X=um$($),Q=cm$(Z);return a71(X,Q)}function aB6($,Z,X,Q){let Y=b0().encryptionKey||"dev-secret",G=`${$}:${Z}:${X}:${Q}`;return ym$("sha256",Y).update(G).digest("hex")}function xm$($,Z,X,Q,Y){let G=Math.floor(Date.now()/1000)+Q,J=aB6(Z,X,G,Y),W=new URL(`/api/dev-assets/${Z}/${cm$(X)}`,$);return W.searchParams.set("expires",G.toString()),W.searchParams.set("signature",J),W.searchParams.set("method",Y),W.toString()}function lm$($,Z,X){let Q=`${$}:${Z.getTime()}:${X}`;return`"${ym$("md5","etag").update(Q).digest("hex")}"`}async function dm$($,Z,X,Q,Y){try{let G=await tB6($,{withFileTypes:!0});for(let J of G){let W=a71($,J.name),F=oB6(Z,W).replace(/\\/g,"/");if(X&&!F.startsWith(X))continue;if(J.isDirectory())if(Q){let H=F+"/";if(!X||H.startsWith(X)){if(!(X?F.slice(X.length):F).includes("/"))Y.commonPrefixes.add(H)}}else await dm$(W,Z,X,Q,Y);else if(J.isFile()){if(Q&&X){let H=F.slice(X.length);if(H.includes(Q)){let N=H.indexOf(Q),U=X+H.slice(0,N+1);Y.commonPrefixes.add(U);continue}}try{let H=await gm$(W);Y.objects.push({key:F,size:H.size,lastModified:H.mtime.toISOString(),etag:lm$(W,H.mtime,H.size)})}catch{}}}}catch{}}function mm$($,Z){let Q=t($).id;return[{name:"LIST_OBJECTS",description:"List objects in the local assets directory with pagination support",inputSchema:P$.object({prefix:P$.string().optional(),maxKeys:P$.number().optional().default(1000),continuationToken:P$.string().optional(),delimiter:P$.string().optional()}),outputSchema:P$.object({objects:P$.array(P$.object({key:P$.string(),size:P$.number(),lastModified:P$.string(),etag:P$.string()})),nextContinuationToken:P$.string().optional(),isTruncated:P$.boolean(),commonPrefixes:P$.array(P$.string()).optional()}),handler:async(Y)=>{let G=Y,J=G.prefix||"",W=G.maxKeys??1000,K=G.delimiter,F=G.continuationToken,H=um$(Q);await nB6(H,{recursive:!0});let N={objects:[],commonPrefixes:new Set};await dm$(H,H,J,K,N),N.objects.sort((w,E)=>w.key.localeCompare(E.key));let U=0;if(F){if(U=N.objects.findIndex((w)=>w.key>F),U===-1)U=N.objects.length}let B=N.objects.slice(U,U+W),O=U+W<N.objects.length,L=O?B[B.length-1]?.key:void 0;return{objects:B,isTruncated:O,nextContinuationToken:L,commonPrefixes:Array.from(N.commonPrefixes).sort()}}},{name:"GET_OBJECT_METADATA",description:"Get metadata for a file in the local assets directory",inputSchema:P$.object({key:P$.string()}),outputSchema:P$.object({contentType:P$.string().optional(),contentLength:P$.number(),lastModified:P$.string(),etag:P$.string(),metadata:P$.record(P$.string(),P$.string()).optional()}),handler:async(Y)=>{let G=Y,J=r71(Q,G.key),W=await gm$(J);return{contentType:C91(G.key),contentLength:W.size,lastModified:W.mtime.toISOString(),etag:lm$(J,W.mtime,W.size)}}},{name:"GET_PRESIGNED_URL",description:"Generate a presigned URL for downloading a file from local storage",inputSchema:P$.object({key:P$.string(),expiresIn:P$.number().optional()}),outputSchema:P$.object({url:P$.string(),expiresIn:P$.number()}),handler:async(Y)=>{let G=Y,J=G.expiresIn??bm$;return{url:xm$(Z,Q,G.key,J,"GET"),expiresIn:J}}},{name:"PUT_PRESIGNED_URL",description:"Generate a presigned URL for uploading a file to local storage",inputSchema:P$.object({key:P$.string(),expiresIn:P$.number().optional(),contentType:P$.string().optional()}),outputSchema:P$.object({url:P$.string(),expiresIn:P$.number()}),handler:async(Y)=>{let G=Y,J=G.expiresIn??bm$;return{url:xm$(Z,Q,G.key,J,"PUT"),expiresIn:J}}},{name:"DELETE_OBJECT",description:"Delete a single file from local storage",inputSchema:P$.object({key:P$.string()}),outputSchema:P$.object({success:P$.boolean(),key:P$.string()}),handler:async(Y)=>{let G=Y,J=r71(Q,G.key);try{return await fm$(J),{success:!0,key:G.key}}catch{return{success:!1,key:G.key}}}},{name:"DELETE_OBJECTS",description:"Delete multiple files from local storage",inputSchema:P$.object({keys:P$.array(P$.string()).max(1000)}),outputSchema:P$.object({deleted:P$.array(P$.string()),errors:P$.array(P$.object({key:P$.string(),message:P$.string()}))}),handler:async(Y)=>{let G=Y,J=[],W=[];return await Promise.all(G.keys.map(async(K)=>{let F=r71(Q,K);try{await fm$(F),J.push(K)}catch(H){W.push({key:K,message:H instanceof Error?H.message:"Unknown error"})}})),{deleted:J,errors:W}}}]}async function s71($,Z,X){let Q=mm$(Z,X),Y=new tW({name:"dev-assets-mcp",version:"1.0.0"},{capabilities:{tools:{}},jsonSchemaValidator:N5});for(let J of Q){let W="shape"in J.inputSchema?J.inputSchema.shape:P$.object({}).shape,K=J.outputSchema&&"shape"in J.outputSchema?J.outputSchema.shape:P$.object({}).shape;Y.registerTool(J.name,{description:J.description??"",inputSchema:W,outputSchema:K,annotations:J.annotations,_meta:J._meta},async(F)=>{try{let H=await J.handler(F);return{content:[{type:"text",text:JSON.stringify(H)}],structuredContent:H}}catch(H){return{content:[{type:"text",text:`Error: ${H.message}`}],isError:!0}}})}let G=new GQ({enableJsonResponse:$.headers.get("Accept")?.includes("application/json")??!1});return await Y.connect(G),AJ(Y,G,$,"mcp:dev-assets")}async function im$($,Z,X,Q){let G=mm$(X,Q).find((J)=>J.name===$);if(!G)return{content:[{type:"text",text:`Tool not found: ${$}`}],isError:!0};try{let J=await G.handler(Z);return{content:[{type:"text",text:JSON.stringify(J)}]}}catch(J){return{content:[{type:"text",text:J instanceof Error?J.message:String(J)}],isError:!0}}}var rB6="./data/assets",bm$=3600,hm$,pm$;var nm$=D(()=>{R$();fg();U8();md();Z_();gX();PA0();hm$=new H1;hm$.all("/",async($)=>{let Z=$.get("studioContext"),X=new URL($.req.url),Q=`${X.protocol}//${X.host}`;return s71($.req.raw,Z,Q)});pm$=hm$});var tm$={};J4(tm$,{mountDevRoutes:()=>sB6});function sB6($,Z){$.all("/mcp/:connectionId{.*_dev-assets$}",Z,async(Q)=>{let Y=Q.get("studioContext"),G=new URL(Q.req.url),J=`${G.protocol}//${G.host}`;return s71(Q.req.raw,Y,J)}),$.all("/mcp/:connectionId{.*_dev-assets$}/call-tool/:toolName",Z,async(Q)=>{let Y=Q.get("studioContext"),G=new URL(Q.req.url),J=`${G.protocol}//${G.host}`,W=Q.req.param("toolName");if(!W)return Q.json({error:"Missing tool name"},400);let K=await Q.req.json(),F=await im$(W,K,Y,J);if(F.isError)return Q.json(F.content,500);return Q.json(F.content)}),$.use("/mcp/dev-assets",Z),$.route("/mcp/dev-assets",pm$);let X=new H1;X.use("*",LW({mountPath:"/api/dev-assets"})),X.route("/",zA0({orgFromPath:!1})),$.route("/api/dev-assets",X)}var om$=D(()=>{U8();R91();PA0();nm$()});import{sql as eB6}from"kysely";import{randomUUID as rm$}from"crypto";import{z as $O6}from"zod";async function XO6($){let Z=new Date().toISOString(),X=rm$(),Q=C8.SELF($.organizationId),Y="registry.publish_request.created",G={requestId:$.request.id,requestedId:$.request.requested_id,title:$.request.title,status:$.request.status,createdAt:$.request.created_at,requester:{name:$.request.requester_name,email:$.request.requester_email}};await $.db.insertInto("events").values({id:X,organization_id:$.organizationId,type:"registry.publish_request.created",source:Q,specversion:"1.0",subject:$.request.id,time:Z,datacontenttype:"application/json",dataschema:null,data:JSON.stringify(G),cron:null,status:"pending",attempts:0,last_error:null,next_retry_at:null,created_at:Z,updated_at:Z}).execute();let J=await $.db.selectFrom("event_subscriptions").select(["id"]).where("organization_id","=",$.organizationId).where("enabled","=",1).where("event_type","=","registry.publish_request.created").where((W)=>W.or([W("publisher","is",null),W("publisher","=",Q)])).execute();if(J.length>0)await $.db.insertInto("event_deliveries").values(J.map((W)=>({id:rm$(),event_id:X,subscription_id:W.id,status:"pending",attempts:0,last_error:null,delivered_at:null,next_retry_at:null,created_at:Z}))).execute();try{await eB6`SELECT
|
|
2927
2927
|
pg_notify('studio_events', ${X}),
|