decocms 4.344.1 → 4.344.2

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.
Files changed (255) hide show
  1. package/dist/client/assets/{AlertCircle-BjMuYxmi.js → AlertCircle-C0qny1px.js} +1 -1
  2. package/dist/client/assets/{AreaChart-P5pArksK.js → AreaChart-BNxcydhF.js} +1 -1
  3. package/dist/client/assets/{ArrowLeft-BwC_u33Q.js → ArrowLeft-B2XPOt0B.js} +1 -1
  4. package/dist/client/assets/{ArrowUp-B8VhBtFx.js → ArrowUp-Bhh1sF6B.js} +1 -1
  5. package/dist/client/assets/{Check-DxQeYFcE.js → Check-CmQ2oLwV.js} +1 -1
  6. package/dist/client/assets/{CheckCircle-C_IlU8js.js → CheckCircle-5VIyydf8.js} +1 -1
  7. package/dist/client/assets/{ChevronRight-DPUKyX3B.js → ChevronRight-B27Hv5xi.js} +1 -1
  8. package/dist/client/assets/{ChevronSelectorVertical-YzQi0PQX.js → ChevronSelectorVertical-C16IZ1zE.js} +1 -1
  9. package/dist/client/assets/{ChevronUp-C9LCQ5Al.js → ChevronUp-DjhaEVdT.js} +1 -1
  10. package/dist/client/assets/{Copy01-MwHtzLVF.js → Copy01-hpwMZEjO.js} +1 -1
  11. package/dist/client/assets/{CreditCard01-Bi3-77w1.js → CreditCard01-_mA3pKi1.js} +1 -1
  12. package/dist/client/assets/{DotsVertical-B1I-mCuU.js → DotsVertical-BdoeS7iv.js} +1 -1
  13. package/dist/client/assets/{Download01-DGJEMDLc.js → Download01-LaiEzG3K.js} +1 -1
  14. package/dist/client/assets/{ErrorBarContext-DJ1fmyx8.js → ErrorBarContext-GHNxgIhL.js} +1 -1
  15. package/dist/client/assets/{Eye-D5g3w0j_.js → Eye-Dv6k5qFi.js} +1 -1
  16. package/dist/client/assets/{GitBranch01-CnlwY1P_.js → GitBranch01--7681EQG.js} +1 -1
  17. package/dist/client/assets/{Globe01-BLWkbDkc.js → Globe01-DbmZ0o2m.js} +1 -1
  18. package/dist/client/assets/{HardDrive-DQDOqSUK.js → HardDrive-DhrO38sr.js} +1 -1
  19. package/dist/client/assets/{Image01-vgxUXrTy.js → Image01-B__pNkrA.js} +1 -1
  20. package/dist/client/assets/{Key01-BmgHvr4E.js → Key01-B99AObCK.js} +1 -1
  21. package/dist/client/assets/{Link01-tJAsKN4V.js → Link01-BqiRcefs.js} +1 -1
  22. package/dist/client/assets/{LinkExternal01-DhLc5AVD.js → LinkExternal01-uMPfzQw5.js} +1 -1
  23. package/dist/client/assets/{Monitor01-BC_tYrvH.js → Monitor01-meoYyhOW.js} +1 -1
  24. package/dist/client/assets/{Package-gYdvPjZu.js → Package-Cz3ieF2n.js} +1 -1
  25. package/dist/client/assets/{Palette-CqySYNVO.js → Palette-CYkdSv-c.js} +1 -1
  26. package/dist/client/assets/{Play-Un8C-mAg.js → Play-CYQqcuRA.js} +1 -1
  27. package/dist/client/assets/{Plus-D6AiOZHV.js → Plus-C93pYF67.js} +1 -1
  28. package/dist/client/assets/{SearchMd-By0JhV4t.js → SearchMd-BgrahhLJ.js} +1 -1
  29. package/dist/client/assets/{Sector-DHsJol83.js → Sector-DA4aDIUa.js} +1 -1
  30. package/dist/client/assets/{Settings02-ClicUXGp.js → Settings02-CF6_FXnL.js} +1 -1
  31. package/dist/client/assets/{Share07-J9Tcg72Q.js → Share07-DNrUoDK2.js} +1 -1
  32. package/dist/client/assets/{Shield01-CRcKuFYE.js → Shield01-BK6WsY_Q.js} +1 -1
  33. package/dist/client/assets/{Stars01-Dmq72XcE.js → Stars01-CMlFN1iY.js} +1 -1
  34. package/dist/client/assets/{Sun-BXZfuBXP.js → Sun-DcyZD3fZ.js} +1 -1
  35. package/dist/client/assets/{Tool01-DJvWUPsn.js → Tool01-CJk3kST-.js} +1 -1
  36. package/dist/client/assets/{Tool02-eg3_S9Ak.js → Tool02-C5AbXwYZ.js} +1 -1
  37. package/dist/client/assets/{Trash01-C8iWkF21.js → Trash01-DXUyyosw.js} +1 -1
  38. package/dist/client/assets/{TrendUp01-vUbGui7n.js → TrendUp01-BpraasBt.js} +1 -1
  39. package/dist/client/assets/{Upload01-iR-rddab.js → Upload01-CAEKyOZy.js} +1 -1
  40. package/dist/client/assets/{User01-B5-Ys5vY.js → User01-By3UU9_0.js} +1 -1
  41. package/dist/client/assets/{UserSquare-gcGLnQoD.js → UserSquare-C9Yj5vKH.js} +1 -1
  42. package/dist/client/assets/{Users01-BVSUwlTI.js → Users01-BnSJOwH_.js} +1 -1
  43. package/dist/client/assets/{Users03-B9pTZPgz.js → Users03-Br54yZny.js} +1 -1
  44. package/dist/client/assets/{XCircle-4-8Jmfe4.js → XCircle-xCNpg4_3.js} +1 -1
  45. package/dist/client/assets/{XClose-COktzEMg.js → XClose-D6CVjuQD.js} +1 -1
  46. package/dist/client/assets/{Zap-g0qt0BwC.js → Zap-B9B8yhi7.js} +1 -1
  47. package/dist/client/assets/{ZoomOut-B_R5roqc.js → ZoomOut-C6ZLfLr7.js} +1 -1
  48. package/dist/client/assets/{access-gate-DLbpI8LF.js → access-gate-BqfCjr72.js} +1 -1
  49. package/dist/client/assets/{agent-icon-CCMiedCg.js → agent-icon-Sokr2wRV.js} +1 -1
  50. package/dist/client/assets/{agents-list-BQlnHJ-C.js → agents-list-ClI3IQyW.js} +1 -1
  51. package/dist/client/assets/{ai-providers-C8Gfn0sX.js → ai-providers-BiPyBRlR.js} +1 -1
  52. package/dist/client/assets/{alert-C6LsdoJV.js → alert-CFcbNqtp.js} +1 -1
  53. package/dist/client/assets/{alert-dialog-CJkXwWO9.js → alert-dialog-CNldqZsO.js} +1 -1
  54. package/dist/client/assets/{analytics-tab-C9SAGUgS.js → analytics-tab-BQJ-onyb.js} +1 -1
  55. package/dist/client/assets/api-keys-ChG3M8Mw.js +1 -0
  56. package/dist/client/assets/{api-keys-Cfd6NXQe.js → api-keys-WzJqP8Kj.js} +1 -1
  57. package/dist/client/assets/app-editor-8aYF0SAd.js +1 -0
  58. package/dist/client/assets/{auth-BPPezCXD.js → auth-DwMcGIkW.js} +1 -1
  59. package/dist/client/assets/{auth-catchall-BdTMMjlD.js → auth-catchall-DhQ_dsU6.js} +1 -1
  60. package/dist/client/assets/{auth-entry-B9uhggZP.js → auth-entry-H_tkAl6r.js} +1 -1
  61. package/dist/client/assets/{auth-split-layout-CN54sM56.js → auth-split-layout-DDvsORYF.js} +1 -1
  62. package/dist/client/assets/{authenticate-and-persist-oauth-Cu9y6SFV.js → authenticate-and-persist-oauth-CUqRnEoc.js} +1 -1
  63. package/dist/client/assets/{automation-list-row-BfHNI8Ry.js → automation-list-row-czAKSqCd.js} +1 -1
  64. package/dist/client/assets/{automation-runs-xfHBNYfm.js → automation-runs-B1sDggeq.js} +1 -1
  65. package/dist/client/assets/{automations-BG7aFgC9.js → automations-mh1wCA2E.js} +1 -1
  66. package/dist/client/assets/{autosend-CzXMxIBc.js → autosend-C2M3oMWg.js} +1 -1
  67. package/dist/client/assets/{avatar-cGgzX6Q8.js → avatar-E3Ku78Qr.js} +1 -1
  68. package/dist/client/assets/{badge-BOpZ6PkI.js → badge-C1plUCvU.js} +1 -1
  69. package/dist/client/assets/{block-document-Cx3WrG1X.js → block-document-DnS9PwNb.js} +1 -1
  70. package/dist/client/assets/{breadcrumb-KhPwJDYK.js → breadcrumb-CEOyoxxM.js} +1 -1
  71. package/dist/client/assets/{buckets-oJeZKYCe.js → buckets-C25mccgP.js} +1 -1
  72. package/dist/client/assets/{bulk-category-panel-B3zkGj5A.js → bulk-category-panel-6WLeyrzh.js} +1 -1
  73. package/dist/client/assets/{capability-load-error-D4HyCPBw.js → capability-load-error-DaASiLKE.js} +1 -1
  74. package/dist/client/assets/{cards-7EkyDZYV.js → cards-DrEtEuSA.js} +1 -1
  75. package/dist/client/assets/{category-editor-6SA3LNZv.js → category-editor-B09JH3m-.js} +1 -1
  76. package/dist/client/assets/{cdn-tab-DnbzvYlD.js → cdn-tab-CZ1Rz28V.js} +1 -1
  77. package/dist/client/assets/{chart-D3GNpA8E.js → chart-DLN94Yuh.js} +1 -1
  78. package/dist/client/assets/{chat-context-CXRs08s6.js → chat-context-Cj5PFaOM.js} +1 -1
  79. package/dist/client/assets/{checkbox-CpzwVXNS.js → checkbox-CVnXYBps.js} +1 -1
  80. package/dist/client/assets/{choose-editor-B4YWcnMg.js → choose-editor-BE92k8jI.js} +1 -1
  81. package/dist/client/assets/{cli-auth-success-CgbANE02.js → cli-auth-success-BMGCM_8X.js} +1 -1
  82. package/dist/client/assets/{client-icons-rTmmY4Qu.js → client-icons-C2e6COqB.js} +1 -1
  83. package/dist/client/assets/{collection-detail-5_RmbhhY.js → collection-detail-x7ykT2Ry.js} +1 -1
  84. package/dist/client/assets/{collection-display-button-CxDVHK3I.js → collection-display-button-CfIQymG1.js} +1 -1
  85. package/dist/client/assets/{collection-search-l1m_ppUw.js → collection-search-DxOane-0.js} +1 -1
  86. package/dist/client/assets/{collection-table-wrapper-Cnb9LKHS.js → collection-table-wrapper-CpVYdRK4.js} +1 -1
  87. package/dist/client/assets/{collection-tabs-CwMFKn1n.js → collection-tabs-CyauGvwq.js} +1 -1
  88. package/dist/client/assets/{command-BYlxLxTL.js → command-Hj_raW8k.js} +1 -1
  89. package/dist/client/assets/{commerce-onboarding-DjThyQh0.js → commerce-onboarding-CuLqtbcy.js} +1 -1
  90. package/dist/client/assets/{connect-Bkm3_g-O.js → connect-Xz6c3641.js} +1 -1
  91. package/dist/client/assets/{connect-layout-COVIZNxi.js → connect-layout-K-hZ0_ym.js} +1 -1
  92. package/dist/client/assets/{connection-C7aOtOZ9.js → connection-BmloY6wm.js} +1 -1
  93. package/dist/client/assets/{connection-card-FoQxvuJf.js → connection-card-DkeFitC9.js} +1 -1
  94. package/dist/client/assets/{connection-detail-DKMftkhe.js → connection-detail-DsNeFFvP.js} +1 -1
  95. package/dist/client/assets/{connection-form-helpers-BuJtasnZ.js → connection-form-helpers-BqIKeSnw.js} +1 -1
  96. package/dist/client/assets/{connections-FZxsmgMU.js → connections-aykt3abn.js} +1 -1
  97. package/dist/client/assets/{create-organization-dialog-G4OcSS8l.js → create-organization-dialog-BX0CUO0j.js} +1 -1
  98. package/dist/client/assets/{decopilot-sse-pool-L93pnfSs.js → decopilot-sse-pool-DZr2L-JD.js} +1 -1
  99. package/dist/client/assets/{dialog-OBxzAzom.js → dialog-DQfbJCC6.js} +1 -1
  100. package/dist/client/assets/{domain-settings-BRznnLr6.js → domain-settings-A8c7ke5N.js} +1 -1
  101. package/dist/client/assets/{drawer-C2xrNU8r.js → drawer-B9bDs4Ls.js} +1 -1
  102. package/dist/client/assets/{dropdown-menu-D7LCoNMq.js → dropdown-menu-DOECFeLR.js} +1 -1
  103. package/dist/client/assets/{e2e-tab-ntnPl-ca.js → e2e-tab-Blf2Ap_9.js} +1 -1
  104. package/dist/client/assets/{editor-CCRpAUKq.js → editor-fUuz2MTe.js} +1 -1
  105. package/dist/client/assets/{empty-state-DHwnQMV_.js → empty-state-13O4lRlk.js} +1 -1
  106. package/dist/client/assets/{empty-state-ADGxJSqy.js → empty-state-DB7HW5VU.js} +1 -1
  107. package/dist/client/assets/{extract-connection-data-BbqgTPgH.js → extract-connection-data-B45ll6gx.js} +1 -1
  108. package/dist/client/assets/{file-explorer-Bw3GSfQk.js → file-explorer-rIcSF1Wr.js} +1 -1
  109. package/dist/client/assets/{file-type-icon-CAW_viSw.js → file-type-icon-GIi5lUDa.js} +1 -1
  110. package/dist/client/assets/{folder-icon-SMGV3EMO.js → folder-icon-1B7OaZuC.js} +1 -1
  111. package/dist/client/assets/{form-S1ZESyeH.js → form-D1uCY5P6.js} +1 -1
  112. package/dist/client/assets/{general-SIMm3O8G.js → general-Co5dzuX-.js} +1 -1
  113. package/dist/client/assets/{github-icon-DbAmZ8nk.js → github-icon-BCHup1mY.js} +1 -1
  114. package/dist/client/assets/{hooks-B2R9sLxn.js → hooks-Bp1NdkLZ.js} +1 -1
  115. package/dist/client/assets/{hosting-tab-Ijx0TIC2.js → hosting-tab-WhehOhV2.js} +1 -1
  116. package/dist/client/assets/{index-7sFGYlJb.js → index-B-SFzwQ0.js} +1 -1
  117. package/dist/client/assets/{index-BchAOKlj.js → index-BQcoMXia.js} +2 -2
  118. package/dist/client/assets/{index-Buw64iTd.js → index-BqWHsoZ7.js} +1 -1
  119. package/dist/client/assets/{index-DPgRZdG6.js → index-Bwb7o3GW.js} +1 -1
  120. package/dist/client/assets/{index-Un5MjpBc.js → index-BxhlSimQ.js} +1 -1
  121. package/dist/client/assets/{index-CY2FHft8.js → index-CvfUTEg1.js} +1 -1
  122. package/dist/client/assets/{index-BPhWztnJ.js → index-D7qUeb84.js} +6 -6
  123. package/dist/client/assets/{index-lO6vP97d.js → index-DF7KW54C.js} +1 -1
  124. package/dist/client/assets/{index-Dhhe2yhg.js → index-DgzjHRte.js} +1 -1
  125. package/dist/client/assets/{index-DhTvONYT.js → index-DppZ6Cuh.js} +1 -1
  126. package/dist/client/assets/{index-redirect-BK-AVO2r.js → index-redirect-CHqT86li.js} +1 -1
  127. package/dist/client/assets/{infiniteQueryObserver-DdVambif.js → infiniteQueryObserver-B6kEjjrG.js} +1 -1
  128. package/dist/client/assets/{infra-billing-C3sspPa6.js → infra-billing-DZmmt6zX.js} +1 -1
  129. package/dist/client/assets/{input-DHP0RHlp.js → input-CMpXoJQQ.js} +1 -1
  130. package/dist/client/assets/{integration-icon-W2Q5PIck.js → integration-icon-KBoNAUV5.js} +1 -1
  131. package/dist/client/assets/{invite-member-dialog-CtEorK5c.js → invite-member-dialog-DzmoZ7z0.js} +1 -1
  132. package/dist/client/assets/{label-C7PK-lHw.js → label-DodRSPBl.js} +1 -1
  133. package/dist/client/assets/{layout-BnKlqv03.js → layout-p84CPw_W.js} +1 -1
  134. package/dist/client/assets/{login-BgsirZAt.js → login-qaDZ6pfK.js} +1 -1
  135. package/dist/client/assets/{markdown-BsIXLS3b.js → markdown-CXIAcTBJ.js} +1 -1
  136. package/dist/client/assets/{mcp-app-renderer-BTHF0AHF.js → mcp-app-renderer-iVlibFiT.js} +1 -1
  137. package/dist/client/assets/{mcp-oauth-DEWFOPkn.js → mcp-oauth-Cahsr_xA.js} +1 -1
  138. package/dist/client/assets/{members-jBFFi-vT.js → members-CVoitCGA.js} +1 -1
  139. package/dist/client/assets/{monaco-editor-DZADfW6r.js → monaco-editor-Dlrh6WT0.js} +1 -1
  140. package/dist/client/assets/{monitoring-stats-row-hKlWAt04.js → monitoring-stats-row-UUJjSC2L.js} +1 -1
  141. package/dist/client/assets/{multi-select-BLvZSTa1.js → multi-select-C9FaGgMm.js} +1 -1
  142. package/dist/client/assets/{oauth-callback-C51UB2D9.js → oauth-callback-BrsfA7zh.js} +1 -1
  143. package/dist/client/assets/{oauth-callback-ai-provider-Dsv963Ta.js → oauth-callback-ai-provider-CijU2vJE.js} +1 -1
  144. package/dist/client/assets/{onboarding-BYN-WZdf.js → onboarding-CkcuLiZT.js} +1 -1
  145. package/dist/client/assets/{org-layout-p6eqD620.js → org-layout-C1jBywh4.js} +1 -1
  146. package/dist/client/assets/{organization-choice-BLk1I6v9.js → organization-choice-CpltQ7-f.js} +1 -1
  147. package/dist/client/assets/{orgs-D_gvdKOu.js → orgs-WhkmcxJ0.js} +1 -1
  148. package/dist/client/assets/{page-seo-form-BDlAG2ny.js → page-seo-form-DCTcv1uv.js} +1 -1
  149. package/dist/client/assets/{popover-DkmR2lA6.js → popover-1HuPDlq4.js} +1 -1
  150. package/dist/client/assets/{post-calendar-CZISCbTj.js → post-calendar-MP1XEDcJ.js} +1 -1
  151. package/dist/client/assets/{post-editor-CYhhN1_z.js → post-editor-U0U-5c0E.js} +1 -1
  152. package/dist/client/assets/{primitives-CdRr57q-.js → primitives-KfqX5TVa.js} +1 -1
  153. package/dist/client/assets/{profile-CBONxCiy.js → profile-v9KeCx-y.js} +1 -1
  154. package/dist/client/assets/{project-app-view-BhoARCjd.js → project-app-view-BwZk6Udn.js} +1 -1
  155. package/dist/client/assets/{project-icon-DamXOjp8.js → project-icon-DMd26Pls.js} +1 -1
  156. package/dist/client/assets/{prompts-B6rAIvaw.js → prompts-CBgpH6_D.js} +1 -1
  157. package/dist/client/assets/record-editor-COIIYg4K.js +1 -0
  158. package/dist/client/assets/redirect-editor-CsEXUbgi.js +1 -0
  159. package/dist/client/assets/registry-C8XSrdWL.js +2 -0
  160. package/dist/client/assets/{registry-layout-DXwkRZOQ.js → registry-layout-CzT3YaK7.js} +1 -1
  161. package/dist/client/assets/{reports-BdxqpCo4.js → reports-DjQdnDXe.js} +1 -1
  162. package/dist/client/assets/{repositories-CGubii5t.js → repositories-AYkI0R1m.js} +1 -1
  163. package/dist/client/assets/{repository-import-picker-BJ-zN9Ij.js → repository-import-picker-C4ReqfSZ.js} +1 -1
  164. package/dist/client/assets/{repository-picker-BX_XSV19.js → repository-picker-D40DSLJP.js} +1 -1
  165. package/dist/client/assets/{require-capability--DOt2ERE.js → require-capability-BiJ9J6gK.js} +1 -1
  166. package/dist/client/assets/{required-auth-layout-Dy1_df_6.js → required-auth-layout-CCzrqs7a.js} +1 -1
  167. package/dist/client/assets/{reset-password-98jWo32P.js → reset-password-DzD5F-bQ.js} +1 -1
  168. package/dist/client/assets/{review-settings-CMYzZWK1.js → review-settings-ChCihbTS.js} +1 -1
  169. package/dist/client/assets/{roles-CPs9PioP.js → roles-DkR-RRyj.js} +1 -1
  170. package/dist/client/assets/{schema-C65nFTu4.js → schema-DM4fDgzo.js} +1 -1
  171. package/dist/client/assets/{scroll-area-TfVnAKMc.js → scroll-area-DWyWk7Jv.js} +1 -1
  172. package/dist/client/assets/{search-input-BQUFx9US.js → search-input-BrPxku06.js} +1 -1
  173. package/dist/client/assets/{secrets-C2HdSGM-.js → secrets-hNPljrJ4.js} +1 -1
  174. package/dist/client/assets/{sections-editor-BkMJ_oh_.js → sections-editor-DnGZRBS3.js} +1 -1
  175. package/dist/client/assets/{select-DrxveWhw.js → select-Biz9Nswo.js} +1 -1
  176. package/dist/client/assets/{select-model-Chu6b8mZ.js → select-model-BgSq1LgM.js} +1 -1
  177. package/dist/client/assets/{self-tool-result-DTVcCRcK.js → self-tool-result-klr6v5UO.js} +1 -1
  178. package/dist/client/assets/{seo-editor-CuepF3pb.js → seo-editor-DfcoS9MP.js} +1 -1
  179. package/dist/client/assets/settings-layout-BxIBM9qK.js +1 -0
  180. package/dist/client/assets/{settings-sidebar-DLrns6Fj.js → settings-sidebar-BeUFOMYU.js} +1 -1
  181. package/dist/client/assets/{shell-controls-CQiUgtRO.js → shell-controls-DUYrjBrP.js} +1 -1
  182. package/dist/client/assets/{shell-layout-BqV6fEBV.js → shell-layout-DedSudP1.js} +1 -1
  183. package/dist/client/assets/{skill-preview-CllyAILl.js → skill-preview-KNzIWmHY.js} +1 -1
  184. package/dist/client/assets/{skills-CFONQWW-.js → skills-SswbLa5T.js} +1 -1
  185. package/dist/client/assets/{sso-0n7r8-x_.js → sso-CXJr0VQP.js} +1 -1
  186. package/dist/client/assets/{store-B9HWO6cb.js → store-Dfdc4PHh.js} +1 -1
  187. package/dist/client/assets/store-registry-7tXK9BjC.js +2 -0
  188. package/dist/client/assets/{switch-D_cjCTgk.js → switch-vGB5Iw30.js} +1 -1
  189. package/dist/client/assets/{synced-repos-CoVXAmDk.js → synced-repos-CUidyAWL.js} +1 -1
  190. package/dist/client/assets/{table-Cf1yQntK.js → table-DSdoGDbv.js} +1 -1
  191. package/dist/client/assets/{tabs-od0SPK7S.js → tabs-B-iSBwwB.js} +1 -1
  192. package/dist/client/assets/{task-board-BnIBnE9V.js → task-board-YGgzMS53.js} +1 -1
  193. package/dist/client/assets/{task-route-C8eS62da.js → task-route-Ce5mQ3Za.js} +1 -1
  194. package/dist/client/assets/{tasks-Bd3sMm2P.js → tasks-Bse92t-v.js} +1 -1
  195. package/dist/client/assets/{textarea-CtTIh5eo.js → textarea-BHyVakeU.js} +1 -1
  196. package/dist/client/assets/{thread-intent-BUdj1oNO.js → thread-intent-Du1_x4Jo.js} +1 -1
  197. package/dist/client/assets/{thread-route-BuMLLPC9.js → thread-route-FbwK7fgk.js} +1 -1
  198. package/dist/client/assets/{toggle-group-CRdE5vQF.js → toggle-group-Dax2ER5x.js} +1 -1
  199. package/dist/client/assets/{toolbar-CsP7VfFt.js → toolbar-BwnpNgw5.js} +1 -1
  200. package/dist/client/assets/{toolbar-icon-button-BuEXzagv.js → toolbar-icon-button-MI8EHgxl.js} +1 -1
  201. package/dist/client/assets/{track-0QXSC0aR.js → track-BHRpjdS1.js} +1 -1
  202. package/dist/client/assets/{types-KEdMbDrR.js → types-CksA11PS.js} +1 -1
  203. package/dist/client/assets/{use-ai-providers-BdW_wf1z.js → use-ai-providers-CR5aXXx9.js} +1 -1
  204. package/dist/client/assets/{use-automations-DKOxPPAq.js → use-automations-CR3y-cno.js} +1 -1
  205. package/dist/client/assets/{use-autosave-BFL8sOAH.js → use-autosave-DZ8ozoxR.js} +1 -1
  206. package/dist/client/assets/{use-connection-BRPceU75.js → use-connection-DevEmQgx.js} +1 -1
  207. package/dist/client/assets/{use-copy-BeP1DGCD.js → use-copy-BwhkoVWT.js} +1 -1
  208. package/dist/client/assets/{use-create-virtual-mcp-DhSsOf3L.js → use-create-virtual-mcp-DSbrYl04.js} +1 -1
  209. package/dist/client/assets/{use-date-fns-locale-CqGJGe22.js → use-date-fns-locale-CsR-muSU.js} +1 -1
  210. package/dist/client/assets/{use-debounced-autosave-ORs7hX9x.js → use-debounced-autosave-DKLFJ5dE.js} +1 -1
  211. package/dist/client/assets/{use-debounced-value-8ClMD96D.js → use-debounced-value-HSbVg15K.js} +1 -1
  212. package/dist/client/assets/{use-decopilot-events-kIL4-9J-.js → use-decopilot-events-BjUmeoBW.js} +1 -1
  213. package/dist/client/assets/{use-delete-connection-DtqNWOLX.js → use-delete-connection-Cwrx1UQB.js} +1 -1
  214. package/dist/client/assets/{use-deployment-admin-Cm6pk0-i.js → use-deployment-admin-cCGiEL7u.js} +1 -1
  215. package/dist/client/assets/{use-destination-route-DSB7ygJ3.js → use-destination-route-Cy6Wb0tP.js} +1 -1
  216. package/dist/client/assets/{use-file-configs-CI0rcz5W.js → use-file-configs-BvYm0UJv.js} +1 -1
  217. package/dist/client/assets/{use-infinite-scroll-c0yQIbtU.js → use-infinite-scroll-DltgLysD.js} +1 -1
  218. package/dist/client/assets/{use-join-requests-Dpj6-Adj.js → use-join-requests-DDT_8QXv.js} +1 -1
  219. package/dist/client/assets/{use-mcp-auth-status-DhNUxu5f.js → use-mcp-auth-status-DEs88obf.js} +1 -1
  220. package/dist/client/assets/{use-mcp-client-dKCIRAKY.js → use-mcp-client-Bcw5zCo1.js} +1 -1
  221. package/dist/client/assets/{use-mcp-prompts-W9hu3OsJ.js → use-mcp-prompts-ShaK7Sn1.js} +1 -1
  222. package/dist/client/assets/{use-mcp-tools-Ci7UuYIf.js → use-mcp-tools-BbuyA-nn.js} +1 -1
  223. package/dist/client/assets/{use-members-DfzsBCnJ.js → use-members-DWHm6J5E.js} +1 -1
  224. package/dist/client/assets/{use-navigate-to-agent-DsVT2aJv.js → use-navigate-to-agent-C5VUtvNR.js} +1 -1
  225. package/dist/client/assets/{use-org-auth-client-C1YRjV3w.js → use-org-auth-client-U6rTeVug.js} +1 -1
  226. package/dist/client/assets/{use-org-notice-Cpu85Ukm.js → use-org-notice-D-KSDtqd.js} +1 -1
  227. package/dist/client/assets/{use-org-sso-C2KOoYeA.js → use-org-sso-DRZKsxoE.js} +1 -1
  228. package/dist/client/assets/{use-organization-roles-t96LTPe2.js → use-organization-roles-Bc3vsckc.js} +1 -1
  229. package/dist/client/assets/{use-organization-settings-ux6449Xl.js → use-organization-settings-CvNxIv-E.js} +1 -1
  230. package/dist/client/assets/{use-panel-navigate-BvI2J3ls.js → use-panel-navigate-ByHiKiT-.js} +1 -1
  231. package/dist/client/assets/{use-registry-connections-D8Shk9Ny.js → use-registry-connections-esc0qiTG.js} +1 -1
  232. package/dist/client/assets/{use-secrets-DFHzz6hG.js → use-secrets-DsTKtQMN.js} +1 -1
  233. package/dist/client/assets/{use-section-preview-base-jzmCaiCf.js → use-section-preview-base-DcluO2Ni.js} +1 -1
  234. package/dist/client/assets/{use-status-sounds-DudWi0tR.js → use-status-sounds-kmyo4ncc.js} +1 -1
  235. package/dist/client/assets/{use-tags-BN2t59T_.js → use-tags-dH77QWAi.js} +1 -1
  236. package/dist/client/assets/{use-view-mode-DXxOuUTm.js → use-view-mode-CWAbp_M4.js} +1 -1
  237. package/dist/client/assets/{use-virtual-mcp-CE2lvrwN.js → use-virtual-mcp-DQRWXbcv.js} +1 -1
  238. package/dist/client/assets/useInfiniteQuery-D4aaR12K.js +1 -0
  239. package/dist/client/assets/useSuspenseInfiniteQuery-FTKrOF08.js +1 -0
  240. package/dist/client/assets/{users-COCvGep8.js → users-CQ9RsvIu.js} +1 -1
  241. package/dist/client/assets/{variant-calendar-NUEWKCfJ.js → variant-calendar-Cm-vJHJd.js} +1 -1
  242. package/dist/client/assets/{view-mode-toggle-uxtdvGkq.js → view-mode-toggle-BAznsDzK.js} +1 -1
  243. package/dist/client/index.html +1 -1
  244. package/dist/server/cli.js +3 -3
  245. package/dist/server/server.js +3 -3
  246. package/package.json +1 -1
  247. package/dist/client/assets/api-keys-D7hTNuqp.js +0 -1
  248. package/dist/client/assets/app-editor-CnMywu3-.js +0 -1
  249. package/dist/client/assets/record-editor-BGBP-klp.js +0 -1
  250. package/dist/client/assets/redirect-editor-BwCGTNSS.js +0 -1
  251. package/dist/client/assets/registry-XT_AT1wH.js +0 -2
  252. package/dist/client/assets/settings-layout-7f7HAulD.js +0 -1
  253. package/dist/client/assets/store-registry-tVyVxLd9.js +0 -2
  254. package/dist/client/assets/useInfiniteQuery-rTw2vfoi.js +0 -1
  255. package/dist/client/assets/useSuspenseInfiniteQuery-C9r2I39H.js +0 -1
@@ -106,7 +106,7 @@ You are running the brand-context onboarding for the user's organization. Your o
106
106
  4. Do NOT call any other tools in this thread. Do NOT call \`brand_context_setup\` more than once.
107
107
 
108
108
  If the tool returns an error, surface the error message to the user and ask whether they want to try a different URL.
109
- `.trim();Pc1=YJ("site-diagnostics_"),Z85=Pc1.is,Q85=Pc1.get,Ac1=YJ("commerce-discovery_"),X85=Ac1.is,i50=Ac1.get;NE={AUTOMATION_MANAGER:YJ("studio-automation-manager_"),CONNECTION_MANAGER:YJ("studio-connection-manager_"),API_KEY_MANAGER:YJ("studio-api-key-manager_"),STORE_MANAGER:YJ("studio-store-manager_"),BRAND_MANAGER:YJ("studio-brand-manager_"),USAGE_MANAGER:YJ("studio-usage-manager_")},GJ={AUTOMATION_MANAGER:NE.AUTOMATION_MANAGER.get,CONNECTION_MANAGER:NE.CONNECTION_MANAGER.get,API_KEY_MANAGER:NE.API_KEY_MANAGER.get,STORE_MANAGER:NE.STORE_MANAGER.get,BRAND_MANAGER:NE.BRAND_MANAGER.get,USAGE_MANAGER:NE.USAGE_MANAGER.get};Ou0=["studio-agent-manager_","studio-task-manager_"],Y85=Ou0.map(YJ)});function kc1($){return $.toLowerCase().replace(/[^a-z0-9]/g,"")}function Hl8($){return kc1($).includes("deepresearch")}function Vc1($){let Z=kc1($);if(Z.includes("deepresearch"))return!1;return Fl8.some((Q)=>Z.includes(Q))}function Ul8($){return $.asyncResearch!==!0&&Vc1($.modelId)}function Nl8($){return $.asyncResearch===!0||Hl8($.modelId)||Vc1($.modelId)}function mx($,Z,Q,X){for(let Y of Q){let G=$.find((J)=>J.modelId===Y);if(G)return{keyId:Z,modelId:G.modelId,title:G.title}}for(let Y of Q){let G=$.find((J)=>J.modelId.includes(Y));if(G)return{keyId:Z,modelId:G.modelId,title:G.title}}if(X){let Y=$.find(X);if(Y)return{keyId:Z,modelId:Y.modelId,title:Y.title}}return null}function Sc1($,Z){let Q={chat:{fast:null,smart:null,thinking:null},image:null,webSearch:null,deepResearch:null};for(let X of $){let Y=Z[X.id]??[],G=X.providerId;if(!Q.chat.fast)Q.chat.fast=mx(Y,X.id,Xl8[G]??[]);if(!Q.chat.smart)Q.chat.smart=mx(Y,X.id,Yl8[G]??[]);if(!Q.chat.thinking)Q.chat.thinking=mx(Y,X.id,Gl8[G]??[]);if(!Q.image)Q.image=mx(Y,X.id,Jl8[G]??[],(J)=>J.capabilities?.includes("image")===!0);if(!Q.webSearch)Q.webSearch=mx(Y,X.id,Wl8[G]??[],Ul8);if(!Q.deepResearch)Q.deepResearch=mx(Y,X.id,Kl8[G]??[],Nl8)}return Q}var Xl8,Yl8,Gl8,Jl8,Wl8,Kl8,Fl8;var Cc1=D(()=>{Xl8={anthropic:["claude-haiku-4-5","claude-haiku"],openrouter:["qwen/qwen3.5-flash","anthropic/claude-haiku-4.5","anthropic/claude-haiku","google/gemini-3-flash"],deco:["qwen/qwen3.5-flash","anthropic/claude-haiku"],llmapi:["claude-haiku-4-5","claude-haiku","gpt-4o-mini"],google:["gemini-2.5-flash","gemini-3-flash"]},Yl8={anthropic:["claude-sonnet-5","claude-sonnet"],openrouter:["anthropic/claude-sonnet-5","anthropic/claude-sonnet","anthropic/claude-opus-4.8","google/gemini-3-pro"],deco:["anthropic/claude-sonnet-5","anthropic/claude-sonnet","anthropic/claude"],llmapi:["claude-sonnet-4-6","claude-sonnet"],google:["gemini-3-pro","gemini-3-flash"]},Gl8={anthropic:["claude-opus-4-8","claude-sonnet-5","claude-sonnet","claude-fable-5"],openrouter:["anthropic/claude-opus-4.8:extended","anthropic/claude-opus-4.8","anthropic/claude-sonnet-5:extended","anthropic/claude-sonnet-5","google/gemini-3-pro","anthropic/claude-fable-5"],deco:["anthropic/claude-opus","anthropic/claude-sonnet-4.6","anthropic/claude-sonnet","anthropic/claude-fable"],llmapi:["claude-opus-4-8","claude-opus","claude-sonnet-4-6"],google:["gemini-3-pro"]},Jl8={openrouter:["openai/gpt-image-1","google/gemini-2.0-flash-image"],deco:["openai/gpt-image-1","google/gemini-2.0-flash-image"],llmapi:["gemini-2.5-flash-image","gpt-image-1"],google:["gemini-2.0-flash-image"]},Wl8={openrouter:["perplexity/sonar","perplexity/sonar-pro"],deco:["perplexity/sonar","perplexity/sonar-pro"]},Kl8={openrouter:["perplexity/deep-research","perplexity/sonar-pro"],deco:["perplexity/deep-research","perplexity/sonar-pro"]};Fl8=["sonar","searchpreview","online"]});function p50($){if(!$)return;let Z={};for(let Q in $){let X=$[Q];if(typeof X==="object"&&X!==null){let Y={};for(let G of Bl8)if(G in X)Y[G]=X[G];Z[Q]=Y}}return Object.keys(Z).length>0?Z:void 0}var Bl8;var _c1=D(()=>{Bl8=["usage","cost","model"]});var k8=D(()=>{E60();Mc1();Cc1();_c1()});function n50($){return $.toLowerCase().trim().replace(/\//g,"-").replace(/[^a-z0-9\s_-]+/g,"").replace(/[\s_-]+/g,"-").replace(/^-+|-+$/g,"")}function mB($){if($.app_name)return $.app_name;if($.connection_url)try{let Z=new URL($.connection_url),X=((Z.port?`${Z.hostname}-${Z.port}`:Z.hostname)+Z.pathname).replace(/\/+$/,"");return n50(X)}catch{return n50($.connection_url)}if($.title)return n50($.title);return $.id??"unknown"}var t50=()=>{};var ix=300000,o50=5000,r50=1e4,Du0=3,wu0=30000,vc1=65000,s50=1000,px=3,fc1=5,bc1=60000,xc1=300000,Lu0=60000;function yc1(){if(eF.size<s50)return;let $=null,Z=1/0;for(let[Q,X]of eF)if(X.lastFailureAt<Z)Z=X.lastFailureAt,$=Q;if($)eF.delete($)}function gc1($){let Z=eF.get($);if(!Z)return yc1(),eF.set($,{consecutiveFailures:1,disabled:!1,lastFailureAt:Date.now()}),{consecutiveFailures:1,thresholdCrossed:1>=px};return Z.consecutiveFailures++,Z.lastFailureAt=Date.now(),{consecutiveFailures:Z.consecutiveFailures,thresholdCrossed:Z.consecutiveFailures>=px}}function Eu0($){let Z=eF.get($);if(Z){Z.disabled=!0;return}yc1(),eF.set($,{consecutiveFailures:px,disabled:!0,lastFailureAt:Date.now()})}function hc1($){return eF.get($)?.disabled??!1}function uc1($){eF.delete($)}var eF;var lc1=D(()=>{eF=new Map});import{sql as p$}from"kysely";function dc1($){if($.length===0)return null;let Z=$[0];if($.length===1&&Dl8.has(Z))return p$.ref(Z);if($.length===2&&cc1.has(Z)){let Q=$[1];return p$`${p$.ref(Z)}->>${p$.lit(Q)}`}if($.length>2&&cc1.has(Z)){let Q=`{${$.slice(1).join(",")}}`;return p$`${p$.ref(Z)}#>>${p$.lit(Q)}`}return null}function mc1($){if("conditions"in $){let{operator:G,conditions:J}=$;if(J.length===0)return p$`true`;let W=J.map((K)=>mc1(K));switch(G){case"and":return p$`(${p$.join(W,p$` AND `)})`;case"or":return p$`(${p$.join(W,p$` OR `)})`;case"not":return p$`NOT (${p$.join(W,p$` AND `)})`;default:return p$`true`}}let{field:Z,operator:Q,value:X}=$,Y=dc1(Z);if(!Y)return p$`true`;switch(Q){case"eq":return X===null?p$`${Y} IS NULL`:p$`${Y} = ${p$.val(X)}`;case"gt":return p$`${Y} > ${p$.val(X)}`;case"gte":return p$`${Y} >= ${p$.val(X)}`;case"lt":return p$`${Y} < ${p$.val(X)}`;case"lte":return p$`${Y} <= ${p$.val(X)}`;case"in":if(!Array.isArray(X)||X.length===0)return p$`false`;return p$`${Y} IN (${p$.join(X.map((G)=>p$.val(G)))})`;case"like":return p$`${Y} ILIKE ${p$.val(X)}`;case"contains":{let G=String(X).replace(/[%_\\]/g,"\\$&");return p$`${Y} ILIKE ${p$.val(`%${G}%`)}`}default:return p$`true`}}class Li{db;vault;constructor($,Z){this.db=$;this.vault=Z}async create($){let Z=$.id??M8("conn"),Q=new Date().toISOString(),X=await this.db.selectFrom("connections").select("organization_id").where("id","=",Z).executeTakeFirst();if(X){if(X.organization_id!==$.organization_id)throw Error("Connection ID already exists");return this.update(Z,$)}let Y=mB($),G=await this.serializeConnection({...$,id:$.id??Z,slug:Y,status:"active",created_at:Q,updated_at:Q}),J;try{J=await this.db.insertInto("connections").values(G).returningAll().executeTakeFirst()}catch(W){if(W instanceof Error&&(W.message.includes("duplicate key")||W.message.includes("unique constraint")))throw Error("Connection ID already exists");throw W}if(!J)throw Error(`Failed to create connection with id: ${Z}`);return this.deserializeConnection(J)}async createNew($){let Z=$.id??M8("conn"),Q=new Date().toISOString(),X=mB($),Y=await this.serializeConnection({...$,id:Z,slug:X,status:"active",created_at:Q,updated_at:Q}),G;try{G=await this.db.insertInto("connections").values(Y).returningAll().executeTakeFirst()}catch(J){if(J instanceof Error&&(J.message.includes("duplicate key")||J.message.includes("unique constraint")))throw Error("Connection ID already exists");throw J}if(!G)throw Error(`Failed to create connection with id: ${Z}`);return this.deserializeConnection(G)}async findById($,Z){let Q=GQ($);if(Q)return Ic1(Z??Q);let X=this.db.selectFrom("connections").selectAll().where("id","=",$);if(Z)X=X.where("organization_id","=",Z);let Y=await X.executeTakeFirst();return Y?this.deserializeConnection(Y):null}async findBySanitizedId($){let Z=$.replace(/-/g,"_"),Q=await this.db.selectFrom("connections").selectAll().where(p$`replace(id, '-', '_')`,"=",Z).where("id","!=",$).executeTakeFirst();return Q?this.deserializeConnection(Q):null}async list($,Z){let Q=this.db.selectFrom("connections").selectAll().where("organization_id","=",$);if(!Z?.includeVirtual)Q=Q.where("connection_type","!=","VIRTUAL");if(Z?.slug)Q=Q.where("slug","=",Z.slug);if(Z?.where)Q=Q.where(mc1(Z.where));let G=(await this.db.selectFrom(Q.as("filtered")).select(p$`count(*)::int`.as("count")).executeTakeFirst())?.count??0;if(Z?.orderBy&&Z.orderBy.length>0)for(let K of Z.orderBy){let H=dc1(K.field);if(!H)continue;let F=K.direction==="desc"?p$`desc`:p$`asc`,U=K.nulls==="first"?p$`nulls first`:p$`nulls last`;Q=Q.orderBy(p$`${H} ${F} ${U}`)}if(Z?.limit!==void 0)Q=Q.limit(Z.limit);if(Z?.offset)Q=Q.offset(Z.offset);let J=await Q.execute();return{items:await Promise.all(J.map((K)=>this.deserializeConnection(K))),totalCount:G}}async update($,Z){let{id:Q,organization_id:X,created_by:Y,created_at:G,...J}=Z;if(Z=J,Object.keys(Z).length===0){let U=await this.findById($);if(!U)throw Error("Connection not found");return U}let W={...Z},K=await this.db.selectFrom("connections").select(["app_name","connection_url","title"]).where("id","=",$).executeTakeFirst();if(K){let U=(N)=>Z[N]===void 0?K[N]:Z[N];W.slug=mB({app_name:U("app_name"),connection_url:U("connection_url"),title:U("title"),id:$})}let H=await this.serializeConnection({...W,updated_at:new Date().toISOString()}),F=await this.db.updateTable("connections").set(H).where("id","=",$).returningAll().executeTakeFirst();if(!F)throw Error("Connection not found after update");return this.deserializeConnection(F)}async isReferencedByThread($){return await this.db.selectFrom("threads").select("id").where(p$`metadata -> 'githubRepo' ->> 'connectionId' = ${$}`).limit(1).executeTakeFirst()!==void 0}async delete($){await this.db.deleteFrom("connections").where("id","=",$).execute()}async testConnection($,Z){let Q=await this.findById($);if(!Q)throw Error("Connection not found");let X=Date.now();if(Q.connection_type==="STDIO")return{healthy:!0,latencyMs:Date.now()-X};if(!Q.connection_url)return{healthy:!1,latencyMs:Date.now()-X};try{if(await cx(Q.connection_url))return{healthy:!1,latencyMs:Date.now()-X};let G=Q.connection_headers,J=await dB()(Q.connection_url,{method:"POST",signal:AbortSignal.timeout(1e4),headers:{"Content-Type":"application/json",...Q.connection_token&&{Authorization:`Bearer ${Q.connection_token}`},...G?.headers,...Z},body:JSON.stringify({jsonrpc:"2.0",method:"ping",id:1})});return{healthy:J.ok||J.status===404,latencyMs:Date.now()-X}}catch{return{healthy:!1,latencyMs:Date.now()-X}}}async serializeConnection($){let Z={};for(let[Q,X]of Object.entries($)){if(X===void 0)continue;if(Q==="tools")continue;if(Q==="connection_token"&&X)Z[Q]=await this.vault.encrypt(X);else if(Q==="configuration_state"&&X){let Y=JSON.stringify(X);Z[Q]=await this.vault.encrypt(Y)}else if(Q==="oauth_config"&&X)Z[Q]=await this.vault.encrypt(JSON.stringify(X));else if(Q==="connection_headers"&&X){let Y=X;if(OK(Y)&&Y.envVars){let G={};for(let[J,W]of Object.entries(Y.envVars))G[J]=await this.vault.encrypt(W);Z[Q]=JSON.stringify({...Y,envVars:G})}else Z[Q]=JSON.stringify(Y)}else if(Ol8.includes(Q))Z[Q]=X?JSON.stringify(X):null;else Z[Q]=X}return Z}async handleDecryptFailures($,Z){let Q=`connection ${$.id} (org: ${$.organization_id}, type: ${$.connection_type}, title: ${$.title})`;if(hc1($.id))return;if($.status!=="active"){Eu0($.id);return}let{thresholdCrossed:X}=gc1($.id);if(!X){for(let{label:Y,error:G}of Z)console.error(`Failed to decrypt ${Y} for ${Q}:`,G);return}try{await this.db.updateTable("connections").set({status:"error"}).where("id","=",$.id).execute(),Eu0($.id),console.error(`Disabled ${Q} after ${px} consecutive decryption failures.`,Z[0]?.error)}catch(Y){console.error(`Failed to disable ${Q} after decryption failures:`,Y)}}async deserializeConnection($){let Z=[],Q=null;if($.connection_token)try{Q=await this.vault.decrypt($.connection_token)}catch(W){Z.push({label:"connection token",error:W})}let X=null;if($.configuration_state)try{let W=await this.vault.decrypt($.configuration_state);X=JSON.parse(W)}catch(W){Z.push({label:"configuration state",error:W})}let Y=null;if(typeof $.oauth_config==="string")try{Y=JSON.parse(await this.vault.decrypt($.oauth_config))}catch{try{Y=JSON.parse($.oauth_config)}catch(W){Z.push({label:"oauth config",error:W})}}else Y=$.oauth_config;if(Z.length>0)await this.handleDecryptFailures($,Z);else if($.connection_token||$.configuration_state||$.oauth_config)uc1($.id);let G=null;if($.connection_headers)try{let W=JSON.parse($.connection_headers);if(OK(W)&&W.envVars){let K={};for(let[H,F]of Object.entries(W.envVars))try{K[H]=await this.vault.decrypt(F)}catch{K[H]=F}G={...W,envVars:K}}else G=W}catch(W){console.error(`Failed to parse connection_headers for connection ${$.id} (org: ${$.organization_id}, type: ${$.connection_type}, title: ${$.title}):`,W)}let J=(W)=>{if(W===null)return null;if(typeof W==="string")try{return JSON.parse(W)}catch{return null}return W};return{id:$.id,organization_id:$.organization_id,created_by:$.created_by,updated_by:$.updated_by??void 0,title:$.title,description:$.description,icon:$.icon,app_name:$.app_name,app_id:$.app_id,slug:$.slug,connection_type:$.connection_type,connection_url:$.connection_url,connection_token:Q,connection_headers:G,oauth_config:Y,configuration_state:X,configuration_scopes:J($.configuration_scopes),metadata:J($.metadata),tools:null,bindings:J($.bindings),status:$.status,created_at:$.created_at,updated_at:$.updated_at}}}var Ol8,Dl8,cc1;var ju0=D(()=>{wK();FE();YQ();k8();t50();lc1();Ol8=["connection_headers","configuration_scopes","metadata","bindings"],Dl8=new Set(["id","organization_id","created_by","updated_by","title","description","icon","app_name","app_id","slug","connection_type","connection_url","status","created_at","updated_at"]),cc1=new Set(["metadata","configuration_scopes","bindings"])});import{createHash as wl8,randomBytes as Ll8,timingSafeEqual as V85}from"crypto";function jl8($){return $.toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function Pu0($){return wl8("sha256").update($).digest("hex")}function nc1($){let Z=zu0.length+1,Q=Z+pc1;if(!$.startsWith(`${zu0}_`)||$.length<=Q+1||$[Q]!=="_")return null;let X=$.slice(Z,Q),Y=$.slice(Q+1);if(!ic1.test(X)||!ic1.test(Y))return null;return X}function tc1(){let $=jl8(Ll8(El8)),Z=$.slice(0,pc1),Q=`${zu0}_${Z}_${$}`;return{plaintext:Q,prefix:Z,hash:Pu0(Q)}}var zu0="stv",El8=32,pc1=12,ic1;var oc1=D(()=>{ic1=/^[A-Za-z0-9_-]+$/});function rc1($){return{id:$.id,organizationId:$.organization_id,subjectConnectionId:$.subject_connection_id,tokenHash:$.token_hash,tokenPrefix:$.token_prefix,name:$.name,revokedAt:$.revoked_at,lastUsedAt:$.last_used_at,createdAt:$.created_at,updatedAt:$.updated_at}}class Au0{db;constructor($){this.db=$}async createOrRotateWorkloadToken($){let Z=$.name??"default";return await this.db.transaction().execute(async(X)=>{if(!await X.selectFrom("connections").select("id").where("id","=",$.subjectConnectionId).where("organization_id","=",$.organizationId).executeTakeFirst())throw Error("Subject connection not found in organization");let G=tc1(),J=new Date().toISOString();await X.updateTable("connection_workload_tokens").set({revoked_at:J,updated_at:J}).where("organization_id","=",$.organizationId).where("subject_connection_id","=",$.subjectConnectionId).where("name","=",Z).where("revoked_at","is",null).execute();let W=await X.insertInto("connection_workload_tokens").values({id:M8("cwt"),organization_id:$.organizationId,subject_connection_id:$.subjectConnectionId,token_hash:G.hash,token_prefix:G.prefix,name:Z,revoked_at:null,last_used_at:null,created_at:J,updated_at:J}).returningAll().executeTakeFirstOrThrow();return{plaintextToken:G.plaintext,record:rc1(W)}})}async findActiveWorkloadToken($){let Z=await this.db.selectFrom("connection_workload_tokens").selectAll().where("organization_id","=",$.organizationId).where("subject_connection_id","=",$.subjectConnectionId).where("name","=",$.name??"default").where("revoked_at","is",null).executeTakeFirst();return Z?rc1(Z):null}async revokeWorkloadToken($){let Z=new Date().toISOString();await this.db.updateTable("connection_workload_tokens").set({revoked_at:Z,updated_at:Z}).where("id","=",$.tokenId).where("organization_id","=",$.organizationId).where("subject_connection_id","=",$.subjectConnectionId).where("revoked_at","is",null).execute()}async authenticateWorkloadToken($){let Z=nc1($);if(!Z)return null;let Q=Pu0($),X=await this.db.selectFrom("connection_workload_tokens").select(["id","organization_id","subject_connection_id","token_prefix"]).where("token_prefix","=",Z).where("token_hash","=",Q).where("revoked_at","is",null).executeTakeFirst();if(!X)return null;let Y=new Date().toISOString();return await this.db.updateTable("connection_workload_tokens").set({last_used_at:Y,updated_at:Y}).where("id","=",X.id).execute(),{tokenId:X.id,tokenPrefix:X.token_prefix,organizationId:X.organization_id,subjectConnectionId:X.subject_connection_id}}async replaceGrantsForSubject($){await this.db.transaction().execute(async(Z)=>{if(!await Z.selectFrom("connections").select("id").where("id","=",$.subjectConnectionId).where("organization_id","=",$.organizationId).executeTakeFirst())throw Error("Referenced connection not found in organization");let X=[...new Set($.grants.map((J)=>J.targetConnectionId))];if(X.length>0){if((await Z.selectFrom("connections").select("id").where("organization_id","=",$.organizationId).where("id","in",X).execute()).length!==X.length)throw Error("Referenced connection not found in organization")}if(await Z.deleteFrom("connection_credential_grants").where("organization_id","=",$.organizationId).where("subject_connection_id","=",$.subjectConnectionId).execute(),$.grants.length===0)return;let Y=new Date().toISOString(),G=$.grants.map((J)=>({id:M8("ccg"),organization_id:$.organizationId,subject_connection_id:$.subjectConnectionId,target_connection_id:J.targetConnectionId,scope:J.scope,created_by:$.createdBy,created_at:Y,updated_at:Y}));await Z.insertInto("connection_credential_grants").values(G).execute()})}async hasGrant($){return!!await this.db.selectFrom("connection_credential_grants").select("id").where("organization_id","=",$.organizationId).where("subject_connection_id","=",$.subjectConnectionId).where("target_connection_id","=",$.targetConnectionId).where("scope","=",$.scope).executeTakeFirst()}}var a50="credential:access-token:read",e50="credential:configuration:read";var $90=D(()=>{YQ();oc1()});function sc1($,Z){let Q=!1,X={...$},Y=$.pinnedViews;if(Array.isArray(Y)){let W=Y.filter((K)=>K.connectionId!==Z);if(W.length!==Y.length)Q=!0,X.pinnedViews=W.length>0?W:null}let G=$.homeTile;if(G&&G.connectionId===Z)Q=!0,X.homeTile=null;let J=$.homeTiles;if(Array.isArray(J)){let W=J.filter((K)=>K.connectionId!==Z);if(W.length!==J.length)Q=!0,X.homeTiles=W.length>0?W:null}return{ui:X,changed:Q}}function zl8($){return $.replace(/\\/g,"\\\\").replace(/%/g,"\\%").replace(/_/g,"\\_")}function ac1($){let Z=$?.githubRepo?.repositoryId;return typeof Z==="string"&&Z.length>0?Z:null}class nx{db;constructor($){this.db=$}async create($,Z,Q,X){let Y=X?.id??M8("vir"),G=new Date().toISOString();await this.db.transaction().execute(async(W)=>{if(await W.insertInto("connections").values({id:Y,organization_id:$,created_by:Z,updated_by:Z,title:Q.title,description:Q.description??null,icon:Q.icon??null,app_name:null,app_id:null,connection_type:"VIRTUAL",pinned:Q.pinned??!1,connection_url:`virtual://${Y}`,connection_token:null,connection_headers:null,oauth_config:null,configuration_state:null,configuration_scopes:null,metadata:Q.metadata?JSON.stringify(Q.metadata):null,repository_id:ac1(Q.metadata),bindings:null,status:Q.status??"active",created_at:G,updated_at:G}).execute(),Q.connections.length>0)await W.insertInto("connection_aggregations").values(Q.connections.map((K)=>({id:M8("agg"),parent_connection_id:Y,child_connection_id:K.connection_id,selected_tools:K.selected_tools?JSON.stringify(K.selected_tools):null,selected_resources:K.selected_resources?JSON.stringify(K.selected_resources):null,selected_prompts:K.selected_prompts?JSON.stringify(K.selected_prompts):null,dependency_mode:"direct",created_at:G}))).execute()});let J=await this.findById(Y);if(!J)throw Error(`Failed to create virtual MCP with id: ${Y}`);return J}async findById($,Z){let Q=GQ($);if(Q)return{...Bu0(Z??Q),pinned:!1,connections:[]};let X=m50($);if(X)return{...zc1(Z??X),pinned:!1,connections:[]};return this.findByIdInternal(this.db,$)}async findByIdInternal($,Z){let Q=await $.selectFrom("connections").selectAll().where("id","=",Z).where("connection_type","=","VIRTUAL").executeTakeFirst();if(!Q)return null;let X=await $.selectFrom("connection_aggregations").selectAll().where("parent_connection_id","=",Z).where("dependency_mode","=","direct").execute();return this.deserializeVirtualMCPEntity(Q,X)}async searchAcrossMemberships($){let{userId:Z,term:Q,limit:X,offset:Y=0,organizationId:G}=$,J=`%${zl8(Q)}%`,W=this.db.selectFrom("connections").innerJoin("member",(H)=>H.onRef("member.organizationId","=","connections.organization_id").on("member.userId","=",Z)).innerJoin("organization","organization.id","connections.organization_id").where("connections.connection_type","=","VIRTUAL").where((H)=>H.or([H("connections.title","ilike",J),H("connections.description","ilike",J)]));if(G)W=W.where("connections.organization_id","=",G);return(await W.select(["connections.id as id","connections.title as title","connections.icon as icon","connections.metadata as metadata","connections.organization_id as organization_id","organization.name as organization_name","organization.slug as organization_slug","organization.metadata as organization_metadata"]).orderBy("connections.updated_at","desc").orderBy("connections.id","asc").limit(X).offset(Y).execute()).map((H)=>({id:H.id,title:H.title,icon:H.icon,metadata:this.parseJson(H.metadata),organization_id:H.organization_id,organization_name:H.organization_name,organization_slug:H.organization_slug,organization_metadata:H.organization_metadata}))}async list($,Z){let Q=this.db.selectFrom("connections").selectAll().where("organization_id","=",$).where("connection_type","=","VIRTUAL");if(Z?.pinnedOnly)Q=Q.where("pinned","=",!0);let X=await Q.orderBy("created_at","asc").orderBy("id","asc").execute(),Y=X.map((W)=>W.id);if(Y.length===0)return[];let G=await this.db.selectFrom("connection_aggregations").selectAll().where("parent_connection_id","in",Y).where("dependency_mode","=","direct").execute(),J=new Map;for(let W of G){let K=J.get(W.parent_connection_id)??[];K.push(W),J.set(W.parent_connection_id,K)}return X.map((W)=>this.deserializeVirtualMCPEntity(W,J.get(W.id)??[]))}async listByIds($,Z){if(Z.length===0)return[];let Q=await this.db.selectFrom("connections").selectAll().where("id","in",Z).where("organization_id","=",$).where("connection_type","=","VIRTUAL").execute();if(Q.length===0)return[];let X=Q.map((J)=>J.id),Y=await this.db.selectFrom("connection_aggregations").selectAll().where("parent_connection_id","in",X).where("dependency_mode","=","direct").execute(),G=new Map;for(let J of Y){let W=G.get(J.parent_connection_id)??[];W.push(J),G.set(J.parent_connection_id,W)}return Q.map((J)=>this.deserializeVirtualMCPEntity(J,G.get(J.id)??[]))}async listByConnectionId($,Z){let X=(await this.db.selectFrom("connection_aggregations").select("parent_connection_id").where("child_connection_id","=",Z).execute()).map((K)=>K.parent_connection_id);if(X.length===0)return[];let Y=await this.db.selectFrom("connections").selectAll().where("id","in",X).where("organization_id","=",$).where("connection_type","=","VIRTUAL").execute();if(Y.length===0)return[];let G=Y.map((K)=>K.id),J=await this.db.selectFrom("connection_aggregations").selectAll().where("parent_connection_id","in",G).where("dependency_mode","=","direct").execute(),W=new Map;for(let K of J){let H=W.get(K.parent_connection_id)??[];H.push(K),W.set(K.parent_connection_id,H)}return Y.map((K)=>this.deserializeVirtualMCPEntity(K,W.get(K.id)??[]))}async update($,Z,Q){let X=new Date().toISOString(),Y={updated_at:X,updated_by:Z};if(Q.title!==void 0)Y.title=Q.title;if(Q.description!==void 0)Y.description=Q.description;if(Q.icon!==void 0)Y.icon=Q.icon;if(Q.status!==void 0)Y.status=Q.status;if(Q.pinned!==void 0)Y.pinned=Q.pinned;if(Q.metadata!==void 0)Y.repository_id=ac1(Q.metadata),Y.metadata=Q.metadata?JSON.stringify(Q.metadata):null;let G=[];await this.db.transaction().execute(async(W)=>{if(await W.updateTable("connections").set(Y).where("id","=",$).where("connection_type","=","VIRTUAL").execute(),Q.connections!==void 0){let K=await W.selectFrom("connection_aggregations").select("child_connection_id").where("parent_connection_id","=",$).where("dependency_mode","=","direct").execute(),H=new Set(K.map((U)=>U.child_connection_id));if(await W.deleteFrom("connection_aggregations").where("parent_connection_id","=",$).where("dependency_mode","=","direct").execute(),Q.connections.length>0)await W.insertInto("connection_aggregations").values(Q.connections.map((U)=>({id:M8("agg"),parent_connection_id:$,child_connection_id:U.connection_id,selected_tools:U.selected_tools?JSON.stringify(U.selected_tools):null,selected_resources:U.selected_resources?JSON.stringify(U.selected_resources):null,selected_prompts:U.selected_prompts?JSON.stringify(U.selected_prompts):null,dependency_mode:"direct",created_at:X}))).execute();let F=new Set(Q.connections.map((U)=>U.connection_id));for(let U of H)if(!F.has(U))G.push(U)}});for(let W of G)await this.cleanOrphanedPinnedViews([$],W);let J=await this.findById($);if(!J)throw Error("Virtual MCP not found after update");return J}async delete($){await this.db.transaction().execute(async(Z)=>{await Z.deleteFrom("threads").where("virtual_mcp_id","=",$).execute(),await Z.deleteFrom("connection_aggregations").where("parent_connection_id","=",$).execute(),await Z.deleteFrom("connections").where("id","=",$).where("connection_type","=","VIRTUAL").execute()})}async removeConnectionReferences($){let Z=await this.db.selectFrom("connection_aggregations").select("parent_connection_id").where("child_connection_id","=",$).execute();await this.db.deleteFrom("connection_aggregations").where("child_connection_id","=",$).execute(),await this.cleanOrphanedPinnedViews(Z.map((Q)=>Q.parent_connection_id),$)}async cleanOrphanedPinnedViews($,Z){for(let Q of $){let X=await this.db.selectFrom("connections").select("metadata").where("id","=",Q).executeTakeFirst();if(!X?.metadata)continue;let Y;try{Y=typeof X.metadata==="string"?JSON.parse(X.metadata):X.metadata}catch{continue}let G=Y.ui??null;if(!G)continue;let{ui:J,changed:W}=sc1(G,Z);if(!W)continue;let K={...Y,ui:J};await this.db.updateTable("connections").set({metadata:JSON.stringify(K)}).where("id","=",Q).execute()}}deserializeVirtualMCPEntity($,Z){let Q=$.created_at instanceof Date?$.created_at.toISOString():$.created_at,X=$.updated_at instanceof Date?$.updated_at.toISOString():$.updated_at,Y=$.status==="active"?"active":"inactive",G=this.parseJson($.metadata),{sandboxMap:J,...W}=G??{},K=J!==void 0?_y0(J):void 0;return{id:$.id,organization_id:$.organization_id,title:$.title,description:$.description,icon:$.icon,status:Y,pinned:$.pinned,created_at:Q,updated_at:X,created_by:$.created_by,updated_by:$.updated_by??void 0,metadata:{...W,instructions:G?.instructions??null,...K!==void 0?{sandboxMap:K}:{}},connections:Z.map((H)=>({connection_id:H.child_connection_id,selected_tools:this.parseJson(H.selected_tools),selected_resources:this.parseJson(H.selected_resources),selected_prompts:this.parseJson(H.selected_prompts)}))}}parseJson($){if($===null)return null;if(typeof $==="string")try{return JSON.parse($)}catch{return null}return $}}function ec1($){let Z=new Map,Q=(X,Y)=>{let G=Z.get(X);if(G)return G;let J=Y();return Z.set(X,J),J};return new Proxy($,{get(X,Y,G){if(Y==="list")return(J,W)=>Q(`list:${J}:${W?.pinnedOnly?1:0}`,()=>X.list(J,W));if(Y==="create"||Y==="update"||Y==="delete"||Y==="removeConnectionReferences")return(...J)=>{return Z.clear(),X[Y](...J)};return Reflect.get(X,Y,G)}})}var Tu0=D(()=>{YQ();k8()});function OE($){let Z=String($??"");if(Z&&!Z.includes("T"))return Z.replace(" ","T")+"Z";return Z}function P$($){return $.replace(/\0/g,"").replace(/\\/g,"\\\\").replace(/'/g,"''")}function n8($){let Z=Number($??0);return Number.isFinite(Z)?Z:0}function Al8($){if(!Pl8.has($))throw Error(`Invalid groupByColumn: ${$}`);return $}function Ru0($){if(!Tl8.test($))throw Error(`Invalid JSONPath: ${$}`);if($.startsWith("$."))return $;if($.startsWith("."))return`$${$}`;return`$.${$}`}function ku0($){return $.replace(/^\$\./,"").split(".").map((Q)=>`'${P$(Q)}'`).join(", ")}function Il8($){let Z=Rl8.exec($);if(!Z||!Z[1]||!Z[2])throw Error(`Invalid interval: ${$}`);let Q=parseInt(Z[1],10),X=Z[2],Y=ql8[X];if(Q<1||Q>Y)throw Error(`Invalid interval amount: ${Q}${X} (max ${Y}${X})`);return{amount:Q,unit:X}}function iB($,Z,Q="timestamp"){let{amount:X,unit:Y}=Il8($),J={m:"MINUTE",h:"HOUR",d:"DAY"}[Y];if(Z==="duckdb")return`time_bucket(INTERVAL '${X} ${J}', CAST(${Q} AS TIMESTAMP))`;return`toStartOfInterval(${Q}, INTERVAL ${X} ${J})`}function Ei($,Z,Q){if(Q==="duckdb")return`json_extract_string(${$}, '${Z}')`;let X=ku0(Z);return`JSONExtractString(${$}, ${X})`}function Ml8($,Z,Q){if(Q==="duckdb")return`CAST(json_extract_string(${$}, '${Z}') AS DOUBLE)`;let X=ku0(Z);return`JSONExtractFloat(${$}, ${X})`}function $d1($,Z,Q){if(Q==="duckdb")return`TRY_CAST(json_extract_string(${$}, '${Z}') AS DOUBLE)`;let X=ku0(Z);return`toFloat64OrZero(JSONExtractString(${$}, ${X}))`}function qu0($){if($===null||$===void 0)return{};if(typeof $==="object")return $;let Z=String($);try{return JSON.parse(Z)}catch{return{_decocms_truncated:Z}}}function Iu0($){return{id:String($.id??""),organizationId:String($.organization_id??""),connectionId:String($.connection_id??""),toolName:String($.tool_name??""),input:qu0($.input),output:qu0($.output),isError:$.is_error===1||$.is_error===!0||$.is_error==="1"||typeof $.is_error==="bigint"&&$.is_error===1n,errorMessage:$.error_message!=null?String($.error_message):null,durationMs:Number($.duration_ms??0),timestamp:(()=>{if($.timestamp instanceof Date)return $.timestamp.toISOString();let Z=String($.timestamp??""),Q=new Date(Z.includes("T")?Z:Z.replace(" ","T")+"Z");return Number.isNaN(Q.getTime())?Z:Q.toISOString()})(),userId:$.user_id!=null?String($.user_id):null,requestId:String($.request_id??""),userAgent:$.user_agent!=null?String($.user_agent):null,virtualMcpId:$.virtual_mcp_id!=null?String($.virtual_mcp_id):null,properties:$.properties?qu0($.properties):null}}function Yd1($,Z){let Q=[];if($.properties)for(let[X,Y]of Object.entries($.properties)){let G=P$(X),J=P$(Y);if(Z==="duckdb")Q.push(`json_extract_string(properties, '$.${G}') = '${J}'`);else Q.push(`JSONExtractString(properties, '${G}') = '${J}'`)}if($.propertyKeys)for(let X of $.propertyKeys){let Y=P$(X);if(Z==="duckdb")Q.push(`json_extract_string(properties, '$.${Y}') IS NOT NULL AND json_extract_string(properties, '$.${Y}') != ''`);else Q.push(`JSONExtractString(properties, '${Y}') IS NOT NULL AND JSONExtractString(properties, '${Y}') != ''`)}if($.propertyPatterns)for(let[X,Y]of Object.entries($.propertyPatterns)){let G=P$(X),J=P$(Y);if(Z==="duckdb")Q.push(`json_extract_string(properties, '$.${G}') ILIKE '${J}'`);else Q.push(`JSONExtractString(properties, '${G}') ILIKE '${J}'`)}if($.propertyInValues)for(let[X,Y]of Object.entries($.propertyInValues)){let G=P$(X),J=P$(Y);if(Z==="duckdb")Q.push(`list_contains(string_split(json_extract_string(properties, '$.${G}'), ','), '${J}')`);else Q.push(`has(splitByChar(',', JSONExtractString(properties, '${G}')), '${J}')`)}return Q}function Qd1($,Z){let Q=[];if(WJ(Q,Z?.startDate,$),!Z)return Q;if(Z.connectionIds?.length){let X=Z.connectionIds.map((Y)=>`'${P$(Y)}'`).join(",");Q.push(`connection_id IN (${X})`)}if(Z.toolNames?.length){let X=Z.toolNames.map((Y)=>`'${P$(Y)}'`).join(",");Q.push(`tool_name IN (${X})`)}if(Z.virtualMcpIds?.length){let X=Z.virtualMcpIds.map((Y)=>`'${P$(Y)}'`).join(",");Q.push(`virtual_mcp_id IN (${X})`)}if(Z.endDate)Q.push(JJ(Z.endDate,$));if(Z.propertyFilters)Q.push(...Yd1(Z.propertyFilters,$));return Q}function Xd1($,Z,Q="timestamp"){if(Z==="duckdb")return`CAST(${Q} AS TIMESTAMP) >= TIMESTAMP '${$.toISOString()}'`;if(Q==="bucket")return`${Q} >= parseDateTimeBestEffort('${$.toISOString()}')`;return`${Q} >= parseDateTime64BestEffort('${$.toISOString()}', 9)`}function JJ($,Z,Q="timestamp"){if(Z==="duckdb")return`CAST(${Q} AS TIMESTAMP) <= TIMESTAMP '${$.toISOString()}'`;if(Q==="bucket")return`${Q} <= parseDateTimeBestEffort('${$.toISOString()}')`;return`${Q} <= parseDateTime64BestEffort('${$.toISOString()}', 9)`}function WJ($,Z,Q,X="timestamp"){if(Z)$.push(Xd1(Z,Q,X));else if(Q==="clickhouse")$.push(Xd1(new Date(Date.now()-kl8),Q,X))}class Vu0{engine;sourceFactory;metricEngine;metricSourceFactory;dialect;metricsFromLogs;constructor($,Z,Q,X,Y="clickhouse",G=!1){this.engine=$;this.sourceFactory=Z;this.metricEngine=Q;this.metricSourceFactory=X;this.dialect=Y;this.metricsFromLogs=G}async query($){if(!$.organizationId)throw Error("organizationId is required");let Z=this.sourceFactory($.organizationId,{startDate:$.startDate,endDate:$.endDate}),Q=[`organization_id = '${P$($.organizationId)}'`];if($.connectionId)Q.push(`connection_id = '${P$($.connectionId)}'`);if($.excludeConnectionIds?.length){let N=$.excludeConnectionIds.map((B)=>`'${P$(B)}'`).join(",");Q.push(`connection_id NOT IN (${N})`)}if($.virtualMcpId)Q.push(`virtual_mcp_id = '${P$($.virtualMcpId)}'`);if($.toolName)Q.push(`tool_name = '${P$($.toolName)}'`);if($.isError!==void 0)Q.push(`is_error = ${$.isError?1:0}`);if(WJ(Q,$.startDate,this.dialect),$.endDate)Q.push(JJ($.endDate,this.dialect));if($.propertyFilters)Q.push(...Yd1($.propertyFilters,this.dialect));let X=1000,Y=Math.min(Math.max(1,Math.floor($.limit??50)),X),G=Math.max(0,Math.floor($.offset??0)),J=Q.join(" AND ");if(this.dialect==="duckdb"){let N=`SELECT ${Zd1}, count(*) OVER () AS _total FROM ${Z} WHERE ${J} ORDER BY timestamp DESC LIMIT ${Y} OFFSET ${G}`,B=await this.engine.query(N);if(B.length===0)return{logs:[],total:0};let O=Number(B[0]._total??0);return{logs:B.map(Iu0),total:O}}let W=`SELECT count(*) AS total FROM ${Z} WHERE ${J}`,K=`SELECT ${Zd1} FROM ${Z} WHERE ${J} ORDER BY timestamp DESC LIMIT ${Y} OFFSET ${G}`,[H,F]=await Promise.all([this.engine.query(W),this.engine.query(K)]),U=Number(H[0]?.total??0);return{logs:F.map(Iu0),total:U}}async getById($,Z){if(!$||!Z)return null;let X=`SELECT * FROM ${this.sourceFactory($)} WHERE organization_id = '${P$($)}' AND id = '${P$(Z)}' LIMIT 1`,Y=await this.engine.query(X);if(Y.length===0)return null;return Iu0(Y[0])}async getStats($){if(!$.organizationId)throw Error("organizationId is required");let Z=this.sourceFactory($.organizationId,{startDate:$.startDate,endDate:$.endDate}),Q=[`organization_id = '${P$($.organizationId)}'`];if(WJ(Q,$.startDate,this.dialect),$.endDate)Q.push(JJ($.endDate,this.dialect));let X=`SELECT count(*) AS total_calls, coalesce(sum(CASE WHEN is_error = 1 THEN 1.0 ELSE 0.0 END) / NULLIF(count(*), 0), 0) AS error_rate, coalesce(avg(duration_ms), 0) AS avg_duration_ms FROM ${Z} WHERE ${Q.join(" AND ")}`,G=(await this.engine.query(X))[0]??{};return{totalCalls:Number(G.total_calls??0),errorRate:Number(G.error_rate??0),avgDurationMs:Number(G.avg_duration_ms??0)}}async queryToolCallHeatmap($){if(!$.organizationId)throw Error("organizationId is required");let Z=this.sourceFactory($.organizationId,{startDate:$.startDate,endDate:$.endDate}),Q=[`organization_id = '${P$($.organizationId)}'`,"type = 'tool_call'"];if($.filters?.virtualMcpIds?.length){let J=$.filters.virtualMcpIds.map((W)=>`'${P$(W)}'`).join(",");Q.push(`virtual_mcp_id IN (${J})`)}if($.filters?.excludeConnectionIds?.length){let J=$.filters.excludeConnectionIds.map((W)=>`'${P$(W)}'`).join(",");Q.push(`connection_id NOT IN (${J})`)}if(WJ(Q,$.startDate,this.dialect),$.endDate)Q.push(JJ($.endDate,this.dialect));let X=Math.min(Math.max(1,Math.floor($.limit??500)),1000),Y=`SELECT virtual_mcp_id, tool_name, count(*) AS calls, coalesce(sum(CASE WHEN is_error = 1 THEN 1 ELSE 0 END), 0) AS errors, coalesce(sum(length(output)), 0) AS output_size FROM ${Z} WHERE ${Q.join(" AND ")} GROUP BY virtual_mcp_id, tool_name ORDER BY calls DESC LIMIT ${X}`;return{cells:(await this.engine.query(Y)).map((J)=>({virtualMcpId:J.virtual_mcp_id?String(J.virtual_mcp_id):null,toolName:String(J.tool_name??""),calls:Number(J.calls??0),errors:Number(J.errors??0),outputSize:Number(J.output_size??0)}))}}async queryLlmUsageStats($){let Z={totalCalls:0,totalErrors:0,avgDurationMs:0,p50DurationMs:0,p95DurationMs:0,totalInputTokens:0,totalOutputTokens:0,totalTokens:0,totalCostUsd:0,topTools:[],timeseries:[]};if(!$.organizationId||!$.connectionId)return Z;let Q=this.dialect,X=Q==="clickhouse",Y=this.sourceFactory($.organizationId,{startDate:$.startDate,endDate:$.endDate}),G=iB($.interval,Q,"timestamp"),J=(E)=>`coalesce(${$d1("properties",`$.${E}`,Q)}, 0)`,W=X?"count()":"count(*)",K=X?"countIf(is_error = 1)":"count(*) FILTER (WHERE is_error = 1)",H=(E)=>X?`quantile(${E})(duration_ms)`:`quantile_cont(duration_ms, ${E})`,F=[`organization_id = '${P$($.organizationId)}'`,`connection_id = '${P$($.connectionId)}'`];if(WJ(F,$.startDate,Q),$.endDate)F.push(JJ($.endDate,Q));if($.userIds?.length){let E=$.userIds.slice(0,100).map((j)=>`'${P$(j)}'`).join(",");F.push(`user_id IN (${E})`)}let U=F.join(" AND "),N=Math.min(Math.max(1,Math.floor($.topN??5)),20),B=`${W} AS calls,
109
+ `.trim();Pc1=YJ("site-diagnostics_"),Z85=Pc1.is,Q85=Pc1.get,Ac1=YJ("commerce-discovery_"),X85=Ac1.is,i50=Ac1.get;NE={AUTOMATION_MANAGER:YJ("studio-automation-manager_"),CONNECTION_MANAGER:YJ("studio-connection-manager_"),API_KEY_MANAGER:YJ("studio-api-key-manager_"),STORE_MANAGER:YJ("studio-store-manager_"),BRAND_MANAGER:YJ("studio-brand-manager_"),USAGE_MANAGER:YJ("studio-usage-manager_")},GJ={AUTOMATION_MANAGER:NE.AUTOMATION_MANAGER.get,CONNECTION_MANAGER:NE.CONNECTION_MANAGER.get,API_KEY_MANAGER:NE.API_KEY_MANAGER.get,STORE_MANAGER:NE.STORE_MANAGER.get,BRAND_MANAGER:NE.BRAND_MANAGER.get,USAGE_MANAGER:NE.USAGE_MANAGER.get};Ou0=["studio-agent-manager_","studio-task-manager_"],Y85=Ou0.map(YJ)});function kc1($){return $.toLowerCase().replace(/[^a-z0-9]/g,"")}function Hl8($){return kc1($).includes("deepresearch")}function Vc1($){let Z=kc1($);if(Z.includes("deepresearch"))return!1;return Fl8.some((Q)=>Z.includes(Q))}function Ul8($){return $.asyncResearch!==!0&&Vc1($.modelId)}function Nl8($){return $.asyncResearch===!0||Hl8($.modelId)||Vc1($.modelId)}function mx($,Z,Q,X){for(let Y of Q){let G=$.find((J)=>J.modelId===Y);if(G)return{keyId:Z,modelId:G.modelId,title:G.title}}for(let Y of Q){let G=$.find((J)=>J.modelId.includes(Y));if(G)return{keyId:Z,modelId:G.modelId,title:G.title}}if(X){let Y=$.find(X);if(Y)return{keyId:Z,modelId:Y.modelId,title:Y.title}}return null}function Sc1($,Z){let Q={chat:{fast:null,smart:null,thinking:null},image:null,webSearch:null,deepResearch:null};for(let X of $){let Y=Z[X.id]??[],G=X.providerId;if(!Q.chat.fast)Q.chat.fast=mx(Y,X.id,Xl8[G]??[]);if(!Q.chat.smart)Q.chat.smart=mx(Y,X.id,Yl8[G]??[]);if(!Q.chat.thinking)Q.chat.thinking=mx(Y,X.id,Gl8[G]??[]);if(!Q.image)Q.image=mx(Y,X.id,Jl8[G]??[],(J)=>J.capabilities?.includes("image")===!0);if(!Q.webSearch)Q.webSearch=mx(Y,X.id,Wl8[G]??[],Ul8);if(!Q.deepResearch)Q.deepResearch=mx(Y,X.id,Kl8[G]??[],Nl8)}return Q}var Xl8,Yl8,Gl8,Jl8,Wl8,Kl8,Fl8;var Cc1=D(()=>{Xl8={anthropic:["claude-haiku-4-5","claude-haiku"],openrouter:["qwen/qwen3.5-flash","anthropic/claude-haiku-4.5","anthropic/claude-haiku","google/gemini-3-flash"],deco:["qwen/qwen3.5-flash","anthropic/claude-haiku"],llmapi:["claude-haiku-4-5","claude-haiku","gpt-4o-mini"],google:["gemini-2.5-flash","gemini-3-flash"]},Yl8={anthropic:["claude-sonnet-5","claude-sonnet"],openrouter:["anthropic/claude-sonnet-5","anthropic/claude-sonnet","anthropic/claude-opus-4.8","google/gemini-3-pro"],deco:["anthropic/claude-sonnet-5","anthropic/claude-sonnet","anthropic/claude"],llmapi:["claude-sonnet-4-6","claude-sonnet"],google:["gemini-3-pro","gemini-3-flash"]},Gl8={anthropic:["claude-opus-4-8","claude-sonnet-5","claude-sonnet","claude-fable-5"],openrouter:["anthropic/claude-opus-4.8:extended","anthropic/claude-opus-4.8","anthropic/claude-sonnet-5:extended","anthropic/claude-sonnet-5","google/gemini-3-pro","anthropic/claude-fable-5"],deco:["anthropic/claude-opus","anthropic/claude-sonnet-4.6","anthropic/claude-sonnet","anthropic/claude-fable"],llmapi:["claude-opus-4-8","claude-opus","claude-sonnet-4-6"],google:["gemini-3-pro"]},Jl8={openrouter:["openai/gpt-image-1","google/gemini-2.0-flash-image"],deco:["openai/gpt-image-1","google/gemini-2.0-flash-image"],llmapi:["gemini-2.5-flash-image","gpt-image-1"],google:["gemini-2.0-flash-image"]},Wl8={openrouter:["perplexity/sonar","perplexity/sonar-pro"],deco:["perplexity/sonar","perplexity/sonar-pro"]},Kl8={openrouter:["perplexity/deep-research","perplexity/sonar-pro"],deco:["perplexity/deep-research","perplexity/sonar-pro"]};Fl8=["sonar","searchpreview","online"]});function p50($){if(!$)return;let Z={};for(let Q in $){let X=$[Q];if(typeof X==="object"&&X!==null){let Y={};for(let G of Bl8)if(G in X)Y[G]=X[G];Z[Q]=Y}}return Object.keys(Z).length>0?Z:void 0}var Bl8;var _c1=D(()=>{Bl8=["usage","cost","model"]});var k8=D(()=>{E60();Mc1();Cc1();_c1()});function n50($){return $.toLowerCase().trim().replace(/\//g,"-").replace(/[^a-z0-9\s_-]+/g,"").replace(/[\s_-]+/g,"-").replace(/^-+|-+$/g,"")}function mB($){if($.app_name)return $.app_name;if($.connection_url)try{let Z=new URL($.connection_url),X=((Z.port?`${Z.hostname}-${Z.port}`:Z.hostname)+Z.pathname).replace(/\/+$/,"");return n50(X)}catch{return n50($.connection_url)}if($.title)return n50($.title);return $.id??"unknown"}var t50=()=>{};var ix=300000,o50=5000,r50=1e4,Du0=3,wu0=30000,vc1=65000,s50=1000,px=3,fc1=5,bc1=60000,xc1=300000,Lu0=60000;function yc1(){if(eF.size<s50)return;let $=null,Z=1/0;for(let[Q,X]of eF)if(X.lastFailureAt<Z)Z=X.lastFailureAt,$=Q;if($)eF.delete($)}function gc1($){let Z=eF.get($);if(!Z)return yc1(),eF.set($,{consecutiveFailures:1,disabled:!1,lastFailureAt:Date.now()}),{consecutiveFailures:1,thresholdCrossed:1>=px};return Z.consecutiveFailures++,Z.lastFailureAt=Date.now(),{consecutiveFailures:Z.consecutiveFailures,thresholdCrossed:Z.consecutiveFailures>=px}}function Eu0($){let Z=eF.get($);if(Z){Z.disabled=!0;return}yc1(),eF.set($,{consecutiveFailures:px,disabled:!0,lastFailureAt:Date.now()})}function hc1($){return eF.get($)?.disabled??!1}function uc1($){eF.delete($)}var eF;var lc1=D(()=>{eF=new Map});import{sql as p$}from"kysely";function dc1($){if($.length===0)return null;let Z=$[0];if($.length===1&&Dl8.has(Z))return p$.ref(Z);if($.length===2&&cc1.has(Z)){let Q=$[1];return p$`${p$.ref(Z)}->>${p$.lit(Q)}`}if($.length>2&&cc1.has(Z)){let Q=`{${$.slice(1).join(",")}}`;return p$`${p$.ref(Z)}#>>${p$.lit(Q)}`}return null}function mc1($){if("conditions"in $){let{operator:G,conditions:J}=$;if(J.length===0)return p$`true`;let W=J.map((K)=>mc1(K));switch(G){case"and":return p$`(${p$.join(W,p$` AND `)})`;case"or":return p$`(${p$.join(W,p$` OR `)})`;case"not":return p$`NOT (${p$.join(W,p$` AND `)})`;default:return p$`true`}}let{field:Z,operator:Q,value:X}=$,Y=dc1(Z);if(!Y)return p$`true`;switch(Q){case"eq":return X===null?p$`${Y} IS NULL`:p$`${Y} = ${p$.val(X)}`;case"gt":return p$`${Y} > ${p$.val(X)}`;case"gte":return p$`${Y} >= ${p$.val(X)}`;case"lt":return p$`${Y} < ${p$.val(X)}`;case"lte":return p$`${Y} <= ${p$.val(X)}`;case"in":if(!Array.isArray(X)||X.length===0)return p$`false`;return p$`${Y} IN (${p$.join(X.map((G)=>p$.val(G)))})`;case"like":return p$`${Y} ILIKE ${p$.val(X)}`;case"contains":{let G=String(X).replace(/[%_\\]/g,"\\$&");return p$`${Y} ILIKE ${p$.val(`%${G}%`)}`}default:return p$`true`}}class Li{db;vault;constructor($,Z){this.db=$;this.vault=Z}async create($){let Z=$.id??M8("conn"),Q=new Date().toISOString(),X=await this.db.selectFrom("connections").select("organization_id").where("id","=",Z).executeTakeFirst();if(X){if(X.organization_id!==$.organization_id)throw Error("Connection ID already exists");return this.update(Z,$)}let Y=mB($),G=await this.serializeConnection({...$,id:$.id??Z,slug:Y,status:"active",created_at:Q,updated_at:Q}),J;try{J=await this.db.insertInto("connections").values(G).returningAll().executeTakeFirst()}catch(W){if(W instanceof Error&&(W.message.includes("duplicate key")||W.message.includes("unique constraint")))throw Error("Connection ID already exists");throw W}if(!J)throw Error(`Failed to create connection with id: ${Z}`);return this.deserializeConnection(J)}async createNew($){let Z=$.id??M8("conn"),Q=new Date().toISOString(),X=mB($),Y=await this.serializeConnection({...$,id:Z,slug:X,status:"active",created_at:Q,updated_at:Q}),G;try{G=await this.db.insertInto("connections").values(Y).returningAll().executeTakeFirst()}catch(J){if(J instanceof Error&&(J.message.includes("duplicate key")||J.message.includes("unique constraint")))throw Error("Connection ID already exists");throw J}if(!G)throw Error(`Failed to create connection with id: ${Z}`);return this.deserializeConnection(G)}async findById($,Z){let Q=GQ($);if(Q)return Ic1(Z??Q);let X=this.db.selectFrom("connections").selectAll().where("id","=",$);if(Z)X=X.where("organization_id","=",Z);let Y=await X.executeTakeFirst();return Y?this.deserializeConnection(Y):null}async findBySanitizedId($){let Z=$.replace(/-/g,"_"),Q=await this.db.selectFrom("connections").selectAll().where(p$`replace(id, '-', '_')`,"=",Z).where("id","!=",$).executeTakeFirst();return Q?this.deserializeConnection(Q):null}async list($,Z){let Q=this.db.selectFrom("connections").selectAll().where("organization_id","=",$);if(!Z?.includeVirtual)Q=Q.where("connection_type","!=","VIRTUAL");if(Z?.slug)Q=Q.where("slug","=",Z.slug);if(Z?.where)Q=Q.where(mc1(Z.where));let G=(await this.db.selectFrom(Q.as("filtered")).select(p$`count(*)::int`.as("count")).executeTakeFirst())?.count??0;if(Z?.orderBy&&Z.orderBy.length>0)for(let K of Z.orderBy){let H=dc1(K.field);if(!H)continue;let F=K.direction==="desc"?p$`desc`:p$`asc`,U=K.nulls==="first"?p$`nulls first`:p$`nulls last`;Q=Q.orderBy(p$`${H} ${F} ${U}`)}if(Z?.limit!==void 0)Q=Q.limit(Z.limit);if(Z?.offset)Q=Q.offset(Z.offset);let J=await Q.execute();return{items:await Promise.all(J.map((K)=>this.deserializeConnection(K))),totalCount:G}}async update($,Z){let{id:Q,organization_id:X,created_by:Y,created_at:G,...J}=Z;if(Z=J,Object.keys(Z).length===0){let U=await this.findById($);if(!U)throw Error("Connection not found");return U}let W={...Z},K=await this.db.selectFrom("connections").select(["app_name","connection_url","title"]).where("id","=",$).executeTakeFirst();if(K){let U=(N)=>Z[N]===void 0?K[N]:Z[N];W.slug=mB({app_name:U("app_name"),connection_url:U("connection_url"),title:U("title"),id:$})}let H=await this.serializeConnection({...W,updated_at:new Date().toISOString()}),F=await this.db.updateTable("connections").set(H).where("id","=",$).returningAll().executeTakeFirst();if(!F)throw Error("Connection not found after update");return this.deserializeConnection(F)}async isReferencedByThread($){return await this.db.selectFrom("threads").select("id").where(p$`metadata -> 'githubRepo' ->> 'connectionId' = ${$}`).limit(1).executeTakeFirst()!==void 0}async delete($){await this.db.deleteFrom("connections").where("id","=",$).execute()}async testConnection($,Z){let Q=await this.findById($);if(!Q)throw Error("Connection not found");let X=Date.now();if(Q.connection_type==="STDIO")return{healthy:!0,latencyMs:Date.now()-X};if(!Q.connection_url)return{healthy:!1,latencyMs:Date.now()-X};try{if(await cx(Q.connection_url))return{healthy:!1,latencyMs:Date.now()-X};let G=Q.connection_headers,J=await dB()(Q.connection_url,{method:"POST",signal:AbortSignal.timeout(1e4),headers:{"Content-Type":"application/json",...Q.connection_token&&{Authorization:`Bearer ${Q.connection_token}`},...G?.headers,...Z},body:JSON.stringify({jsonrpc:"2.0",method:"ping",id:1})});return{healthy:J.ok||J.status===404,latencyMs:Date.now()-X}}catch{return{healthy:!1,latencyMs:Date.now()-X}}}async serializeConnection($){let Z={};for(let[Q,X]of Object.entries($)){if(X===void 0)continue;if(Q==="tools")continue;if(Q==="connection_token"&&X)Z[Q]=await this.vault.encrypt(X);else if(Q==="configuration_state"&&X){let Y=JSON.stringify(X);Z[Q]=await this.vault.encrypt(Y)}else if(Q==="oauth_config"&&X)Z[Q]=await this.vault.encrypt(JSON.stringify(X));else if(Q==="connection_headers"&&X){let Y=X;if(OK(Y)&&Y.envVars){let G={};for(let[J,W]of Object.entries(Y.envVars))G[J]=await this.vault.encrypt(W);Z[Q]=JSON.stringify({...Y,envVars:G})}else Z[Q]=JSON.stringify(Y)}else if(Ol8.includes(Q))Z[Q]=X?JSON.stringify(X):null;else Z[Q]=X}return Z}async handleDecryptFailures($,Z){let Q=`connection ${$.id} (org: ${$.organization_id}, type: ${$.connection_type}, title: ${$.title})`;if(hc1($.id))return;if($.status!=="active"){Eu0($.id);return}let{thresholdCrossed:X}=gc1($.id);if(!X){for(let{label:Y,error:G}of Z)console.error(`Failed to decrypt ${Y} for ${Q}:`,G);return}try{await this.db.updateTable("connections").set({status:"error"}).where("id","=",$.id).execute(),Eu0($.id),console.error(`Disabled ${Q} after ${px} consecutive decryption failures.`,Z[0]?.error)}catch(Y){console.error(`Failed to disable ${Q} after decryption failures:`,Y)}}async deserializeConnection($){let Z=[],Q=null;if($.connection_token)try{Q=await this.vault.decrypt($.connection_token)}catch(K){Z.push({label:"connection token",error:K})}let X=null;if($.configuration_state)try{let K=await this.vault.decrypt($.configuration_state);X=JSON.parse(K)}catch(K){Z.push({label:"configuration state",error:K})}let Y=null;if(typeof $.oauth_config==="string")try{Y=JSON.parse(await this.vault.decrypt($.oauth_config))}catch{try{Y=JSON.parse($.oauth_config)}catch(K){Z.push({label:"oauth config",error:K})}}else Y=$.oauth_config;let G=null,J=!1;if($.connection_headers)try{let K=JSON.parse($.connection_headers);if(OK(K)&&K.envVars){J=!0;let H={};for(let[F,U]of Object.entries(K.envVars))try{H[F]=await this.vault.decrypt(U)}catch(N){H[F]="",Z.push({label:`env var "${F}"`,error:N})}G={...K,envVars:H}}else G=K}catch(K){console.error(`Failed to parse connection_headers for connection ${$.id} (org: ${$.organization_id}, type: ${$.connection_type}, title: ${$.title}):`,K)}if(Z.length>0)await this.handleDecryptFailures($,Z);else if($.connection_token||$.configuration_state||$.oauth_config||J)uc1($.id);let W=(K)=>{if(K===null)return null;if(typeof K==="string")try{return JSON.parse(K)}catch{return null}return K};return{id:$.id,organization_id:$.organization_id,created_by:$.created_by,updated_by:$.updated_by??void 0,title:$.title,description:$.description,icon:$.icon,app_name:$.app_name,app_id:$.app_id,slug:$.slug,connection_type:$.connection_type,connection_url:$.connection_url,connection_token:Q,connection_headers:G,oauth_config:Y,configuration_state:X,configuration_scopes:W($.configuration_scopes),metadata:W($.metadata),tools:null,bindings:W($.bindings),status:$.status,created_at:$.created_at,updated_at:$.updated_at}}}var Ol8,Dl8,cc1;var ju0=D(()=>{wK();FE();YQ();k8();t50();lc1();Ol8=["connection_headers","configuration_scopes","metadata","bindings"],Dl8=new Set(["id","organization_id","created_by","updated_by","title","description","icon","app_name","app_id","slug","connection_type","connection_url","status","created_at","updated_at"]),cc1=new Set(["metadata","configuration_scopes","bindings"])});import{createHash as wl8,randomBytes as Ll8,timingSafeEqual as V85}from"crypto";function jl8($){return $.toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function Pu0($){return wl8("sha256").update($).digest("hex")}function nc1($){let Z=zu0.length+1,Q=Z+pc1;if(!$.startsWith(`${zu0}_`)||$.length<=Q+1||$[Q]!=="_")return null;let X=$.slice(Z,Q),Y=$.slice(Q+1);if(!ic1.test(X)||!ic1.test(Y))return null;return X}function tc1(){let $=jl8(Ll8(El8)),Z=$.slice(0,pc1),Q=`${zu0}_${Z}_${$}`;return{plaintext:Q,prefix:Z,hash:Pu0(Q)}}var zu0="stv",El8=32,pc1=12,ic1;var oc1=D(()=>{ic1=/^[A-Za-z0-9_-]+$/});function rc1($){return{id:$.id,organizationId:$.organization_id,subjectConnectionId:$.subject_connection_id,tokenHash:$.token_hash,tokenPrefix:$.token_prefix,name:$.name,revokedAt:$.revoked_at,lastUsedAt:$.last_used_at,createdAt:$.created_at,updatedAt:$.updated_at}}class Au0{db;constructor($){this.db=$}async createOrRotateWorkloadToken($){let Z=$.name??"default";return await this.db.transaction().execute(async(X)=>{if(!await X.selectFrom("connections").select("id").where("id","=",$.subjectConnectionId).where("organization_id","=",$.organizationId).executeTakeFirst())throw Error("Subject connection not found in organization");let G=tc1(),J=new Date().toISOString();await X.updateTable("connection_workload_tokens").set({revoked_at:J,updated_at:J}).where("organization_id","=",$.organizationId).where("subject_connection_id","=",$.subjectConnectionId).where("name","=",Z).where("revoked_at","is",null).execute();let W=await X.insertInto("connection_workload_tokens").values({id:M8("cwt"),organization_id:$.organizationId,subject_connection_id:$.subjectConnectionId,token_hash:G.hash,token_prefix:G.prefix,name:Z,revoked_at:null,last_used_at:null,created_at:J,updated_at:J}).returningAll().executeTakeFirstOrThrow();return{plaintextToken:G.plaintext,record:rc1(W)}})}async findActiveWorkloadToken($){let Z=await this.db.selectFrom("connection_workload_tokens").selectAll().where("organization_id","=",$.organizationId).where("subject_connection_id","=",$.subjectConnectionId).where("name","=",$.name??"default").where("revoked_at","is",null).executeTakeFirst();return Z?rc1(Z):null}async revokeWorkloadToken($){let Z=new Date().toISOString();await this.db.updateTable("connection_workload_tokens").set({revoked_at:Z,updated_at:Z}).where("id","=",$.tokenId).where("organization_id","=",$.organizationId).where("subject_connection_id","=",$.subjectConnectionId).where("revoked_at","is",null).execute()}async authenticateWorkloadToken($){let Z=nc1($);if(!Z)return null;let Q=Pu0($),X=await this.db.selectFrom("connection_workload_tokens").select(["id","organization_id","subject_connection_id","token_prefix"]).where("token_prefix","=",Z).where("token_hash","=",Q).where("revoked_at","is",null).executeTakeFirst();if(!X)return null;let Y=new Date().toISOString();return await this.db.updateTable("connection_workload_tokens").set({last_used_at:Y,updated_at:Y}).where("id","=",X.id).execute(),{tokenId:X.id,tokenPrefix:X.token_prefix,organizationId:X.organization_id,subjectConnectionId:X.subject_connection_id}}async replaceGrantsForSubject($){await this.db.transaction().execute(async(Z)=>{if(!await Z.selectFrom("connections").select("id").where("id","=",$.subjectConnectionId).where("organization_id","=",$.organizationId).executeTakeFirst())throw Error("Referenced connection not found in organization");let X=[...new Set($.grants.map((J)=>J.targetConnectionId))];if(X.length>0){if((await Z.selectFrom("connections").select("id").where("organization_id","=",$.organizationId).where("id","in",X).execute()).length!==X.length)throw Error("Referenced connection not found in organization")}if(await Z.deleteFrom("connection_credential_grants").where("organization_id","=",$.organizationId).where("subject_connection_id","=",$.subjectConnectionId).execute(),$.grants.length===0)return;let Y=new Date().toISOString(),G=$.grants.map((J)=>({id:M8("ccg"),organization_id:$.organizationId,subject_connection_id:$.subjectConnectionId,target_connection_id:J.targetConnectionId,scope:J.scope,created_by:$.createdBy,created_at:Y,updated_at:Y}));await Z.insertInto("connection_credential_grants").values(G).execute()})}async hasGrant($){return!!await this.db.selectFrom("connection_credential_grants").select("id").where("organization_id","=",$.organizationId).where("subject_connection_id","=",$.subjectConnectionId).where("target_connection_id","=",$.targetConnectionId).where("scope","=",$.scope).executeTakeFirst()}}var a50="credential:access-token:read",e50="credential:configuration:read";var $90=D(()=>{YQ();oc1()});function sc1($,Z){let Q=!1,X={...$},Y=$.pinnedViews;if(Array.isArray(Y)){let W=Y.filter((K)=>K.connectionId!==Z);if(W.length!==Y.length)Q=!0,X.pinnedViews=W.length>0?W:null}let G=$.homeTile;if(G&&G.connectionId===Z)Q=!0,X.homeTile=null;let J=$.homeTiles;if(Array.isArray(J)){let W=J.filter((K)=>K.connectionId!==Z);if(W.length!==J.length)Q=!0,X.homeTiles=W.length>0?W:null}return{ui:X,changed:Q}}function zl8($){return $.replace(/\\/g,"\\\\").replace(/%/g,"\\%").replace(/_/g,"\\_")}function ac1($){let Z=$?.githubRepo?.repositoryId;return typeof Z==="string"&&Z.length>0?Z:null}class nx{db;constructor($){this.db=$}async create($,Z,Q,X){let Y=X?.id??M8("vir"),G=new Date().toISOString();await this.db.transaction().execute(async(W)=>{if(await W.insertInto("connections").values({id:Y,organization_id:$,created_by:Z,updated_by:Z,title:Q.title,description:Q.description??null,icon:Q.icon??null,app_name:null,app_id:null,connection_type:"VIRTUAL",pinned:Q.pinned??!1,connection_url:`virtual://${Y}`,connection_token:null,connection_headers:null,oauth_config:null,configuration_state:null,configuration_scopes:null,metadata:Q.metadata?JSON.stringify(Q.metadata):null,repository_id:ac1(Q.metadata),bindings:null,status:Q.status??"active",created_at:G,updated_at:G}).execute(),Q.connections.length>0)await W.insertInto("connection_aggregations").values(Q.connections.map((K)=>({id:M8("agg"),parent_connection_id:Y,child_connection_id:K.connection_id,selected_tools:K.selected_tools?JSON.stringify(K.selected_tools):null,selected_resources:K.selected_resources?JSON.stringify(K.selected_resources):null,selected_prompts:K.selected_prompts?JSON.stringify(K.selected_prompts):null,dependency_mode:"direct",created_at:G}))).execute()});let J=await this.findById(Y);if(!J)throw Error(`Failed to create virtual MCP with id: ${Y}`);return J}async findById($,Z){let Q=GQ($);if(Q)return{...Bu0(Z??Q),pinned:!1,connections:[]};let X=m50($);if(X)return{...zc1(Z??X),pinned:!1,connections:[]};return this.findByIdInternal(this.db,$)}async findByIdInternal($,Z){let Q=await $.selectFrom("connections").selectAll().where("id","=",Z).where("connection_type","=","VIRTUAL").executeTakeFirst();if(!Q)return null;let X=await $.selectFrom("connection_aggregations").selectAll().where("parent_connection_id","=",Z).where("dependency_mode","=","direct").execute();return this.deserializeVirtualMCPEntity(Q,X)}async searchAcrossMemberships($){let{userId:Z,term:Q,limit:X,offset:Y=0,organizationId:G}=$,J=`%${zl8(Q)}%`,W=this.db.selectFrom("connections").innerJoin("member",(H)=>H.onRef("member.organizationId","=","connections.organization_id").on("member.userId","=",Z)).innerJoin("organization","organization.id","connections.organization_id").where("connections.connection_type","=","VIRTUAL").where((H)=>H.or([H("connections.title","ilike",J),H("connections.description","ilike",J)]));if(G)W=W.where("connections.organization_id","=",G);return(await W.select(["connections.id as id","connections.title as title","connections.icon as icon","connections.metadata as metadata","connections.organization_id as organization_id","organization.name as organization_name","organization.slug as organization_slug","organization.metadata as organization_metadata"]).orderBy("connections.updated_at","desc").orderBy("connections.id","asc").limit(X).offset(Y).execute()).map((H)=>({id:H.id,title:H.title,icon:H.icon,metadata:this.parseJson(H.metadata),organization_id:H.organization_id,organization_name:H.organization_name,organization_slug:H.organization_slug,organization_metadata:H.organization_metadata}))}async list($,Z){let Q=this.db.selectFrom("connections").selectAll().where("organization_id","=",$).where("connection_type","=","VIRTUAL");if(Z?.pinnedOnly)Q=Q.where("pinned","=",!0);let X=await Q.orderBy("created_at","asc").orderBy("id","asc").execute(),Y=X.map((W)=>W.id);if(Y.length===0)return[];let G=await this.db.selectFrom("connection_aggregations").selectAll().where("parent_connection_id","in",Y).where("dependency_mode","=","direct").execute(),J=new Map;for(let W of G){let K=J.get(W.parent_connection_id)??[];K.push(W),J.set(W.parent_connection_id,K)}return X.map((W)=>this.deserializeVirtualMCPEntity(W,J.get(W.id)??[]))}async listByIds($,Z){if(Z.length===0)return[];let Q=await this.db.selectFrom("connections").selectAll().where("id","in",Z).where("organization_id","=",$).where("connection_type","=","VIRTUAL").execute();if(Q.length===0)return[];let X=Q.map((J)=>J.id),Y=await this.db.selectFrom("connection_aggregations").selectAll().where("parent_connection_id","in",X).where("dependency_mode","=","direct").execute(),G=new Map;for(let J of Y){let W=G.get(J.parent_connection_id)??[];W.push(J),G.set(J.parent_connection_id,W)}return Q.map((J)=>this.deserializeVirtualMCPEntity(J,G.get(J.id)??[]))}async listByConnectionId($,Z){let X=(await this.db.selectFrom("connection_aggregations").select("parent_connection_id").where("child_connection_id","=",Z).execute()).map((K)=>K.parent_connection_id);if(X.length===0)return[];let Y=await this.db.selectFrom("connections").selectAll().where("id","in",X).where("organization_id","=",$).where("connection_type","=","VIRTUAL").execute();if(Y.length===0)return[];let G=Y.map((K)=>K.id),J=await this.db.selectFrom("connection_aggregations").selectAll().where("parent_connection_id","in",G).where("dependency_mode","=","direct").execute(),W=new Map;for(let K of J){let H=W.get(K.parent_connection_id)??[];H.push(K),W.set(K.parent_connection_id,H)}return Y.map((K)=>this.deserializeVirtualMCPEntity(K,W.get(K.id)??[]))}async update($,Z,Q){let X=new Date().toISOString(),Y={updated_at:X,updated_by:Z};if(Q.title!==void 0)Y.title=Q.title;if(Q.description!==void 0)Y.description=Q.description;if(Q.icon!==void 0)Y.icon=Q.icon;if(Q.status!==void 0)Y.status=Q.status;if(Q.pinned!==void 0)Y.pinned=Q.pinned;if(Q.metadata!==void 0)Y.repository_id=ac1(Q.metadata),Y.metadata=Q.metadata?JSON.stringify(Q.metadata):null;let G=[];await this.db.transaction().execute(async(W)=>{if(await W.updateTable("connections").set(Y).where("id","=",$).where("connection_type","=","VIRTUAL").execute(),Q.connections!==void 0){let K=await W.selectFrom("connection_aggregations").select("child_connection_id").where("parent_connection_id","=",$).where("dependency_mode","=","direct").execute(),H=new Set(K.map((U)=>U.child_connection_id));if(await W.deleteFrom("connection_aggregations").where("parent_connection_id","=",$).where("dependency_mode","=","direct").execute(),Q.connections.length>0)await W.insertInto("connection_aggregations").values(Q.connections.map((U)=>({id:M8("agg"),parent_connection_id:$,child_connection_id:U.connection_id,selected_tools:U.selected_tools?JSON.stringify(U.selected_tools):null,selected_resources:U.selected_resources?JSON.stringify(U.selected_resources):null,selected_prompts:U.selected_prompts?JSON.stringify(U.selected_prompts):null,dependency_mode:"direct",created_at:X}))).execute();let F=new Set(Q.connections.map((U)=>U.connection_id));for(let U of H)if(!F.has(U))G.push(U)}});for(let W of G)await this.cleanOrphanedPinnedViews([$],W);let J=await this.findById($);if(!J)throw Error("Virtual MCP not found after update");return J}async delete($){await this.db.transaction().execute(async(Z)=>{await Z.deleteFrom("threads").where("virtual_mcp_id","=",$).execute(),await Z.deleteFrom("connection_aggregations").where("parent_connection_id","=",$).execute(),await Z.deleteFrom("connections").where("id","=",$).where("connection_type","=","VIRTUAL").execute()})}async removeConnectionReferences($){let Z=await this.db.selectFrom("connection_aggregations").select("parent_connection_id").where("child_connection_id","=",$).execute();await this.db.deleteFrom("connection_aggregations").where("child_connection_id","=",$).execute(),await this.cleanOrphanedPinnedViews(Z.map((Q)=>Q.parent_connection_id),$)}async cleanOrphanedPinnedViews($,Z){for(let Q of $){let X=await this.db.selectFrom("connections").select("metadata").where("id","=",Q).executeTakeFirst();if(!X?.metadata)continue;let Y;try{Y=typeof X.metadata==="string"?JSON.parse(X.metadata):X.metadata}catch{continue}let G=Y.ui??null;if(!G)continue;let{ui:J,changed:W}=sc1(G,Z);if(!W)continue;let K={...Y,ui:J};await this.db.updateTable("connections").set({metadata:JSON.stringify(K)}).where("id","=",Q).execute()}}deserializeVirtualMCPEntity($,Z){let Q=$.created_at instanceof Date?$.created_at.toISOString():$.created_at,X=$.updated_at instanceof Date?$.updated_at.toISOString():$.updated_at,Y=$.status==="active"?"active":"inactive",G=this.parseJson($.metadata),{sandboxMap:J,...W}=G??{},K=J!==void 0?_y0(J):void 0;return{id:$.id,organization_id:$.organization_id,title:$.title,description:$.description,icon:$.icon,status:Y,pinned:$.pinned,created_at:Q,updated_at:X,created_by:$.created_by,updated_by:$.updated_by??void 0,metadata:{...W,instructions:G?.instructions??null,...K!==void 0?{sandboxMap:K}:{}},connections:Z.map((H)=>({connection_id:H.child_connection_id,selected_tools:this.parseJson(H.selected_tools),selected_resources:this.parseJson(H.selected_resources),selected_prompts:this.parseJson(H.selected_prompts)}))}}parseJson($){if($===null)return null;if(typeof $==="string")try{return JSON.parse($)}catch{return null}return $}}function ec1($){let Z=new Map,Q=(X,Y)=>{let G=Z.get(X);if(G)return G;let J=Y();return Z.set(X,J),J};return new Proxy($,{get(X,Y,G){if(Y==="list")return(J,W)=>Q(`list:${J}:${W?.pinnedOnly?1:0}`,()=>X.list(J,W));if(Y==="create"||Y==="update"||Y==="delete"||Y==="removeConnectionReferences")return(...J)=>{return Z.clear(),X[Y](...J)};return Reflect.get(X,Y,G)}})}var Tu0=D(()=>{YQ();k8()});function OE($){let Z=String($??"");if(Z&&!Z.includes("T"))return Z.replace(" ","T")+"Z";return Z}function P$($){return $.replace(/\0/g,"").replace(/\\/g,"\\\\").replace(/'/g,"''")}function n8($){let Z=Number($??0);return Number.isFinite(Z)?Z:0}function Al8($){if(!Pl8.has($))throw Error(`Invalid groupByColumn: ${$}`);return $}function Ru0($){if(!Tl8.test($))throw Error(`Invalid JSONPath: ${$}`);if($.startsWith("$."))return $;if($.startsWith("."))return`$${$}`;return`$.${$}`}function ku0($){return $.replace(/^\$\./,"").split(".").map((Q)=>`'${P$(Q)}'`).join(", ")}function Il8($){let Z=Rl8.exec($);if(!Z||!Z[1]||!Z[2])throw Error(`Invalid interval: ${$}`);let Q=parseInt(Z[1],10),X=Z[2],Y=ql8[X];if(Q<1||Q>Y)throw Error(`Invalid interval amount: ${Q}${X} (max ${Y}${X})`);return{amount:Q,unit:X}}function iB($,Z,Q="timestamp"){let{amount:X,unit:Y}=Il8($),J={m:"MINUTE",h:"HOUR",d:"DAY"}[Y];if(Z==="duckdb")return`time_bucket(INTERVAL '${X} ${J}', CAST(${Q} AS TIMESTAMP))`;return`toStartOfInterval(${Q}, INTERVAL ${X} ${J})`}function Ei($,Z,Q){if(Q==="duckdb")return`json_extract_string(${$}, '${Z}')`;let X=ku0(Z);return`JSONExtractString(${$}, ${X})`}function Ml8($,Z,Q){if(Q==="duckdb")return`CAST(json_extract_string(${$}, '${Z}') AS DOUBLE)`;let X=ku0(Z);return`JSONExtractFloat(${$}, ${X})`}function $d1($,Z,Q){if(Q==="duckdb")return`TRY_CAST(json_extract_string(${$}, '${Z}') AS DOUBLE)`;let X=ku0(Z);return`toFloat64OrZero(JSONExtractString(${$}, ${X}))`}function qu0($){if($===null||$===void 0)return{};if(typeof $==="object")return $;let Z=String($);try{return JSON.parse(Z)}catch{return{_decocms_truncated:Z}}}function Iu0($){return{id:String($.id??""),organizationId:String($.organization_id??""),connectionId:String($.connection_id??""),toolName:String($.tool_name??""),input:qu0($.input),output:qu0($.output),isError:$.is_error===1||$.is_error===!0||$.is_error==="1"||typeof $.is_error==="bigint"&&$.is_error===1n,errorMessage:$.error_message!=null?String($.error_message):null,durationMs:Number($.duration_ms??0),timestamp:(()=>{if($.timestamp instanceof Date)return $.timestamp.toISOString();let Z=String($.timestamp??""),Q=new Date(Z.includes("T")?Z:Z.replace(" ","T")+"Z");return Number.isNaN(Q.getTime())?Z:Q.toISOString()})(),userId:$.user_id!=null?String($.user_id):null,requestId:String($.request_id??""),userAgent:$.user_agent!=null?String($.user_agent):null,virtualMcpId:$.virtual_mcp_id!=null?String($.virtual_mcp_id):null,properties:$.properties?qu0($.properties):null}}function Yd1($,Z){let Q=[];if($.properties)for(let[X,Y]of Object.entries($.properties)){let G=P$(X),J=P$(Y);if(Z==="duckdb")Q.push(`json_extract_string(properties, '$.${G}') = '${J}'`);else Q.push(`JSONExtractString(properties, '${G}') = '${J}'`)}if($.propertyKeys)for(let X of $.propertyKeys){let Y=P$(X);if(Z==="duckdb")Q.push(`json_extract_string(properties, '$.${Y}') IS NOT NULL AND json_extract_string(properties, '$.${Y}') != ''`);else Q.push(`JSONExtractString(properties, '${Y}') IS NOT NULL AND JSONExtractString(properties, '${Y}') != ''`)}if($.propertyPatterns)for(let[X,Y]of Object.entries($.propertyPatterns)){let G=P$(X),J=P$(Y);if(Z==="duckdb")Q.push(`json_extract_string(properties, '$.${G}') ILIKE '${J}'`);else Q.push(`JSONExtractString(properties, '${G}') ILIKE '${J}'`)}if($.propertyInValues)for(let[X,Y]of Object.entries($.propertyInValues)){let G=P$(X),J=P$(Y);if(Z==="duckdb")Q.push(`list_contains(string_split(json_extract_string(properties, '$.${G}'), ','), '${J}')`);else Q.push(`has(splitByChar(',', JSONExtractString(properties, '${G}')), '${J}')`)}return Q}function Qd1($,Z){let Q=[];if(WJ(Q,Z?.startDate,$),!Z)return Q;if(Z.connectionIds?.length){let X=Z.connectionIds.map((Y)=>`'${P$(Y)}'`).join(",");Q.push(`connection_id IN (${X})`)}if(Z.toolNames?.length){let X=Z.toolNames.map((Y)=>`'${P$(Y)}'`).join(",");Q.push(`tool_name IN (${X})`)}if(Z.virtualMcpIds?.length){let X=Z.virtualMcpIds.map((Y)=>`'${P$(Y)}'`).join(",");Q.push(`virtual_mcp_id IN (${X})`)}if(Z.endDate)Q.push(JJ(Z.endDate,$));if(Z.propertyFilters)Q.push(...Yd1(Z.propertyFilters,$));return Q}function Xd1($,Z,Q="timestamp"){if(Z==="duckdb")return`CAST(${Q} AS TIMESTAMP) >= TIMESTAMP '${$.toISOString()}'`;if(Q==="bucket")return`${Q} >= parseDateTimeBestEffort('${$.toISOString()}')`;return`${Q} >= parseDateTime64BestEffort('${$.toISOString()}', 9)`}function JJ($,Z,Q="timestamp"){if(Z==="duckdb")return`CAST(${Q} AS TIMESTAMP) <= TIMESTAMP '${$.toISOString()}'`;if(Q==="bucket")return`${Q} <= parseDateTimeBestEffort('${$.toISOString()}')`;return`${Q} <= parseDateTime64BestEffort('${$.toISOString()}', 9)`}function WJ($,Z,Q,X="timestamp"){if(Z)$.push(Xd1(Z,Q,X));else if(Q==="clickhouse")$.push(Xd1(new Date(Date.now()-kl8),Q,X))}class Vu0{engine;sourceFactory;metricEngine;metricSourceFactory;dialect;metricsFromLogs;constructor($,Z,Q,X,Y="clickhouse",G=!1){this.engine=$;this.sourceFactory=Z;this.metricEngine=Q;this.metricSourceFactory=X;this.dialect=Y;this.metricsFromLogs=G}async query($){if(!$.organizationId)throw Error("organizationId is required");let Z=this.sourceFactory($.organizationId,{startDate:$.startDate,endDate:$.endDate}),Q=[`organization_id = '${P$($.organizationId)}'`];if($.connectionId)Q.push(`connection_id = '${P$($.connectionId)}'`);if($.excludeConnectionIds?.length){let N=$.excludeConnectionIds.map((B)=>`'${P$(B)}'`).join(",");Q.push(`connection_id NOT IN (${N})`)}if($.virtualMcpId)Q.push(`virtual_mcp_id = '${P$($.virtualMcpId)}'`);if($.toolName)Q.push(`tool_name = '${P$($.toolName)}'`);if($.isError!==void 0)Q.push(`is_error = ${$.isError?1:0}`);if(WJ(Q,$.startDate,this.dialect),$.endDate)Q.push(JJ($.endDate,this.dialect));if($.propertyFilters)Q.push(...Yd1($.propertyFilters,this.dialect));let X=1000,Y=Math.min(Math.max(1,Math.floor($.limit??50)),X),G=Math.max(0,Math.floor($.offset??0)),J=Q.join(" AND ");if(this.dialect==="duckdb"){let N=`SELECT ${Zd1}, count(*) OVER () AS _total FROM ${Z} WHERE ${J} ORDER BY timestamp DESC LIMIT ${Y} OFFSET ${G}`,B=await this.engine.query(N);if(B.length===0)return{logs:[],total:0};let O=Number(B[0]._total??0);return{logs:B.map(Iu0),total:O}}let W=`SELECT count(*) AS total FROM ${Z} WHERE ${J}`,K=`SELECT ${Zd1} FROM ${Z} WHERE ${J} ORDER BY timestamp DESC LIMIT ${Y} OFFSET ${G}`,[H,F]=await Promise.all([this.engine.query(W),this.engine.query(K)]),U=Number(H[0]?.total??0);return{logs:F.map(Iu0),total:U}}async getById($,Z){if(!$||!Z)return null;let X=`SELECT * FROM ${this.sourceFactory($)} WHERE organization_id = '${P$($)}' AND id = '${P$(Z)}' LIMIT 1`,Y=await this.engine.query(X);if(Y.length===0)return null;return Iu0(Y[0])}async getStats($){if(!$.organizationId)throw Error("organizationId is required");let Z=this.sourceFactory($.organizationId,{startDate:$.startDate,endDate:$.endDate}),Q=[`organization_id = '${P$($.organizationId)}'`];if(WJ(Q,$.startDate,this.dialect),$.endDate)Q.push(JJ($.endDate,this.dialect));let X=`SELECT count(*) AS total_calls, coalesce(sum(CASE WHEN is_error = 1 THEN 1.0 ELSE 0.0 END) / NULLIF(count(*), 0), 0) AS error_rate, coalesce(avg(duration_ms), 0) AS avg_duration_ms FROM ${Z} WHERE ${Q.join(" AND ")}`,G=(await this.engine.query(X))[0]??{};return{totalCalls:Number(G.total_calls??0),errorRate:Number(G.error_rate??0),avgDurationMs:Number(G.avg_duration_ms??0)}}async queryToolCallHeatmap($){if(!$.organizationId)throw Error("organizationId is required");let Z=this.sourceFactory($.organizationId,{startDate:$.startDate,endDate:$.endDate}),Q=[`organization_id = '${P$($.organizationId)}'`,"type = 'tool_call'"];if($.filters?.virtualMcpIds?.length){let J=$.filters.virtualMcpIds.map((W)=>`'${P$(W)}'`).join(",");Q.push(`virtual_mcp_id IN (${J})`)}if($.filters?.excludeConnectionIds?.length){let J=$.filters.excludeConnectionIds.map((W)=>`'${P$(W)}'`).join(",");Q.push(`connection_id NOT IN (${J})`)}if(WJ(Q,$.startDate,this.dialect),$.endDate)Q.push(JJ($.endDate,this.dialect));let X=Math.min(Math.max(1,Math.floor($.limit??500)),1000),Y=`SELECT virtual_mcp_id, tool_name, count(*) AS calls, coalesce(sum(CASE WHEN is_error = 1 THEN 1 ELSE 0 END), 0) AS errors, coalesce(sum(length(output)), 0) AS output_size FROM ${Z} WHERE ${Q.join(" AND ")} GROUP BY virtual_mcp_id, tool_name ORDER BY calls DESC LIMIT ${X}`;return{cells:(await this.engine.query(Y)).map((J)=>({virtualMcpId:J.virtual_mcp_id?String(J.virtual_mcp_id):null,toolName:String(J.tool_name??""),calls:Number(J.calls??0),errors:Number(J.errors??0),outputSize:Number(J.output_size??0)}))}}async queryLlmUsageStats($){let Z={totalCalls:0,totalErrors:0,avgDurationMs:0,p50DurationMs:0,p95DurationMs:0,totalInputTokens:0,totalOutputTokens:0,totalTokens:0,totalCostUsd:0,topTools:[],timeseries:[]};if(!$.organizationId||!$.connectionId)return Z;let Q=this.dialect,X=Q==="clickhouse",Y=this.sourceFactory($.organizationId,{startDate:$.startDate,endDate:$.endDate}),G=iB($.interval,Q,"timestamp"),J=(E)=>`coalesce(${$d1("properties",`$.${E}`,Q)}, 0)`,W=X?"count()":"count(*)",K=X?"countIf(is_error = 1)":"count(*) FILTER (WHERE is_error = 1)",H=(E)=>X?`quantile(${E})(duration_ms)`:`quantile_cont(duration_ms, ${E})`,F=[`organization_id = '${P$($.organizationId)}'`,`connection_id = '${P$($.connectionId)}'`];if(WJ(F,$.startDate,Q),$.endDate)F.push(JJ($.endDate,Q));if($.userIds?.length){let E=$.userIds.slice(0,100).map((j)=>`'${P$(j)}'`).join(",");F.push(`user_id IN (${E})`)}let U=F.join(" AND "),N=Math.min(Math.max(1,Math.floor($.topN??5)),20),B=`${W} AS calls,
110
110
  ${K} AS errors,
111
111
  avg(duration_ms) AS avg,
112
112
  sum(${J("input_tokens")}) AS in_tok,
@@ -2678,7 +2678,7 @@ Hint: Configure a valid Google account email in Monitor Configuration > Contexto
2678
2678
 
2679
2679
  `).trim(),N=F.length>0?`Not executed tools (${F.length}/${$.tools.length}): ${F.join(", ")}`:"",B=[U,N].filter((O)=>O.length>0).join(`
2680
2680
 
2681
- `);return{toolResults:K,agentSummary:B.length>0?B:null,unexecutedTools:F}}finally{await Z.close?.().catch(()=>{})}}async function lZ1($,Z){let Q=$.storage.registry,X=$.organization.id,Y=await Q.monitorConnections.findByItemId(X,Z.id);if(Y){if(await $.storage.connections.findById(Y.connection_id,X))return Y.connection_id}let G=$Y6(Z);if(!G)throw Error(`Registry item ${Z.id} has no remote URL`);if(cB(G))throw Error(`Registry item ${Z.id} targets a private network URL, refusing to create a monitor connection`);let J=aX6($),W=eX6(Z),K=await $.storage.connections.create({organization_id:X,created_by:J,title:`[MCP Tester] ${Z.title}`,description:`Auto-created monitor connection for ${Z.id}`,app_name:"private-registry-monitor",app_id:`${Hf}:monitor`,connection_type:W,connection_url:G,metadata:{monitorConnection:!0,registryItemId:Z.id,pluginId:Hf}});return await Q.monitorConnections.upsert({organization_id:X,item_id:Z.id,connection_id:K.id,auth_status:"none"}),K.id}async function FY6($){let Z=$.ctx.storage.registry;switch($.action){case"unlisted":return await Z.items.update($.organizationId,$.item.id,{is_unlisted:!0}),"unlisted";case"remove_public":return await Z.items.update($.organizationId,$.item.id,{is_public:!1}),"removed_public";case"remove_private":case"remove_all":return await Z.items.delete($.organizationId,$.item.id),$.action==="remove_all"?"removed_all":"removed_private";default:return"none"}}async function UY6($){let Z=Date.now();if($.signal.aborted)throw Error("Run cancelled");let Q="passed",X=!1,Y=!1,G=null,J="none",W=null,K=[],H=null,F=async()=>{await $.onProgress?.({status:Q,connectionOk:X,toolsListed:Y,toolResults:[...K],agentSummary:W,errorMessage:G,actionTaken:J,durationMs:Date.now()-Z})};try{let U=await lZ1($.ctx,$.item);H=await $.ctx.createMCPProxy(U),X=!0;let B=(await $e(H.listTools?H.listTools():Promise.resolve({tools:[]}),$.monitorConfig.perMcpTimeoutMs,`listTools ${$.item.id}`)).tools??[];if(Y=!0,$.monitorConfig.monitorMode!=="health_check")K.push(...B.map((O)=>uZ1(O.name))),await F();if($.monitorConfig.monitorMode==="full_agent"){let O=await HY6({ctx:$.ctx,monitorConfig:$.monitorConfig,item:$.item,proxy:H,tools:B,signal:$.signal,onProgress:async(w)=>{K.length=0,K.push(...ay$({discoveredTools:B,executedResults:w})),Q=w.some((L)=>!L.success)?"failed":"passed",await F()}});if(K.length=0,K.push(...ay$({discoveredTools:B,executedResults:O.toolResults})),W=O.agentSummary,O.toolResults.some((w)=>!w.success))Q="failed";if(O.unexecutedTools.length>0){if(Q="failed",!G)G=`Agent skipped ${O.unexecutedTools.length} tool(s): ${O.unexecutedTools.join(", ")}`}}else if($.monitorConfig.monitorMode!=="health_check"){for(let O=0;O<B.length;O++){let w=B[O];if(!w||$.signal.aborted)throw Error("Run cancelled");let L=Date.now();try{let E={},j=await $e(H.callTool({name:w.name,arguments:E}),$.monitorConfig.perToolTimeoutMs,`tool ${w.name}`),z=!j.isError,P=Date.now()-L;ey$(K,{toolName:w.name,success:z,input:E,durationMs:P,outputPreview:Xg$(j.structuredContent??j.content),error:z?null:xT0(j.content?.find((A)=>A.type==="text")?.text?.slice(0,300)??"Tool returned error")}),await F()}catch(E){let j=Date.now()-L,z=E instanceof Error?E.message:String(E);ey$(K,{toolName:w.name,success:!1,durationMs:j,error:xT0(z)}),await F()}}if(K.some((O)=>!O.success))Q="failed"}else for(let O of B)K.push(uZ1(O.name));if($.canApplyFailureAction&&Q==="failed"&&$.monitorConfig.onFailure!=="none")J=await FY6({ctx:$.ctx,organizationId:$.organizationId,item:$.item,action:$.monitorConfig.onFailure})}catch(U){if(G=U instanceof Error?U.message:String(U),ZY6(U))Q="needs_auth",await $.ctx.storage.registry.monitorConnections.updateAuthStatus($.organizationId,$.item.id,"needs_auth");else Q="error"}finally{await H?.close?.().catch(()=>{})}return{status:Q,connectionOk:X,toolsListed:Y,toolResults:K,agentSummary:W,errorMessage:G,actionTaken:J,durationMs:Date.now()-Z}}async function NY6($){let Z=$.ctx.storage.registry,X=(await Z.items.list($.organizationId,{includeUnlisted:!0})).items.filter((F)=>{if($.monitorConfig.testPublicOnly&&!F.is_public)return!1;if($.monitorConfig.testPrivateOnly&&F.is_public)return!1;return!0}),Y=$.monitorConfig.includePendingRequests?(await Z.publishRequests.list($.organizationId,{status:"pending",limit:500})).items.map((F)=>BY6(F)):[],G=[...X.map((F)=>({item:F,source:"registry_item"})),...Y.map((F)=>({item:F,source:"publish_request"}))];if(G.length===0){await Z.monitorRuns.update($.organizationId,$.runId,{total_items:0,status:"completed",started_at:new Date().toISOString(),finished_at:new Date().toISOString()});return}await Z.monitorRuns.update($.organizationId,$.runId,{total_items:G.length,status:"running",started_at:new Date().toISOString()});let J=0,W=0,K=0,H=0;for(let F=0;F<G.length;F++){let U=G[F],N=U?.item;if(!N||$.signal.aborted){await Z.monitorRuns.update($.organizationId,$.runId,{status:"cancelled",current_item_id:null,finished_at:new Date().toISOString()});return}await Z.monitorRuns.update($.organizationId,$.runId,{current_item_id:N.id});let B=null,O=async(L)=>{if(!B){B=(await Z.monitorResults.create({run_id:$.runId,organization_id:$.organizationId,item_id:N.id,item_title:N.title,status:L.status,error_message:L.errorMessage,connection_ok:L.connectionOk,tools_listed:L.toolsListed,tool_results:L.toolResults,agent_summary:L.agentSummary,duration_ms:L.durationMs,action_taken:L.actionTaken})).id;return}await Z.monitorResults.update($.organizationId,B,{status:L.status,error_message:L.errorMessage,connection_ok:L.connectionOk,tools_listed:L.toolsListed,tool_results:L.toolResults,agent_summary:L.agentSummary,duration_ms:L.durationMs,action_taken:L.actionTaken})},w=await UY6({ctx:$.ctx,organizationId:$.organizationId,item:N,monitorConfig:$.monitorConfig,signal:$.signal,canApplyFailureAction:U.source==="registry_item",onProgress:O});if(await O({status:w.status,connectionOk:w.connectionOk,toolsListed:w.toolsListed,toolResults:w.toolResults,agentSummary:w.agentSummary,errorMessage:w.errorMessage,actionTaken:w.actionTaken,durationMs:w.durationMs}),J+=1,w.status==="passed")W+=1;else if(w.status==="failed"||w.status==="error")K+=1;else H+=1;await Z.monitorRuns.update($.organizationId,$.runId,{tested_items:J,passed_items:W,failed_items:K,skipped_items:H})}await Z.monitorRuns.update($.organizationId,$.runId,{status:"completed",current_item_id:null,finished_at:new Date().toISOString()})}function BY6($){return{id:`${_w}${$.id}`,title:$.title,description:$.description,_meta:$._meta,server:$.server,is_public:!1,is_unlisted:!0,created_at:$.created_at,updated_at:$.updated_at}}async function OY6($,Z){let Q=sX6($);await Q.access.check();let X=Q.storage.registry,Y=await X.monitorRuns.create({organization_id:Q.organization.id,status:"pending",config_snapshot:Z,started_at:null}),G=new AbortController;return bT0.set(Y.id,G),NY6({ctx:Q,runId:Y.id,organizationId:Q.organization.id,monitorConfig:Z,signal:G.signal}).catch(async(J)=>{await X.monitorRuns.update(Q.organization.id,Y.id,{status:"failed",current_item_id:null,finished_at:new Date().toISOString()}).catch(()=>{}),rX6(`Run ${Y.id} failed with uncaught error:`,J)}).finally(()=>{bT0.delete(Y.id)}),{run:{id:Y.id}}}var bT0,nX6="[MONITOR-AGENT]",tX6,oX6="health_check: not called",Jg$;var yT0=D(()=>{q0();S4();FE();Il();DN();bT0=new Map,tX6=Sy$;Jg$=g({name:"REGISTRY_MONITOR_RUN_START",description:"Start an MCP registry monitor run with an isolated set of monitor connections.",inputSchema:xy$,outputSchema:yy$,handler:async($,Z)=>{let Q=n(Z);await Z.access.check();let X=by$($.config??{}),{run:Y}=await OY6(Z,X),J=await Z.storage.registry.monitorRuns.findById(Q.id,Y.id);if(!J)throw Error(`Failed to load monitor run ${Y.id}`);return{run:J}}})});var Wg$;var Kg$=D(()=>{q0();DN();Wg$=g({name:"REGISTRY_MONITOR_RUN_LIST",description:"List MCP registry monitor runs",inputSchema:uy$,outputSchema:ly$,handler:async($,Z)=>{let Q=n(Z);return await Z.access.check(),Z.storage.registry.monitorRuns.list(Q.id,$)}})});var Hg$;var Fg$=D(()=>{q0();DN();Hg$=g({name:"REGISTRY_MONITOR_RUN_GET",description:"Get details for one MCP registry monitor run",inputSchema:cy$,outputSchema:dy$,handler:async($,Z)=>{let Q=n(Z);return await Z.access.check(),{run:await Z.storage.registry.monitorRuns.findById(Q.id,$.runId)}}})});var Ug$;var Ng$=D(()=>{q0();DN();yT0();Ug$=g({name:"REGISTRY_MONITOR_RUN_CANCEL",description:"Cancel a running MCP registry monitor run",inputSchema:gy$,outputSchema:hy$,handler:async($,Z)=>{let Q=n(Z);await Z.access.check();let X=Z.storage.registry;if(!await X.monitorRuns.findById(Q.id,$.runId))throw Error(`Monitor run not found: ${$.runId}`);return Qg$($.runId),{run:await X.monitorRuns.update(Q.id,$.runId,{status:"cancelled",current_item_id:null,finished_at:new Date().toISOString()})}}})});var Bg$;var Og$=D(()=>{q0();DN();Bg$=g({name:"REGISTRY_MONITOR_RESULT_LIST",description:"List results for a given MCP registry monitor run",inputSchema:my$,outputSchema:iy$,handler:async($,Z)=>{let Q=n(Z);return await Z.access.check(),Z.storage.registry.monitorResults.listByRun(Q.id,$.runId,{status:$.status,limit:$.limit,offset:$.offset})}})});var Dg$;var wg$=D(()=>{q0();DN();Il();Dg$=g({name:"REGISTRY_MONITOR_CONNECTION_LIST",description:"List monitor connection mappings for private registry MCP monitor runs, including auth status",inputSchema:py$,outputSchema:ny$,handler:async($,Z)=>{let Q=n(Z);await Z.access.check();let X=Z.storage.registry,Y=await X.monitorConnections.list(Q.id);return{items:await Promise.all(Y.map(async(J)=>{let W=await X.items.findById(Q.id,J.item_id);if(!W&&J.item_id.startsWith(_w)){let F=J.item_id.slice(_w.length),U=await X.publishRequests.findById(Q.id,F);if(U)W={id:J.item_id,title:U.title,description:U.description,_meta:U._meta,server:U.server,is_public:!1,is_unlisted:!0,created_at:U.created_at,updated_at:U.updated_at}}let K=W?.server.remotes?.find((F)=>F.url)?.url??null,H=J.item_id.startsWith(_w)?"request":"store";return{mapping:J,item:W,remoteUrl:K,source:H}}))}}})});function DY6($){return{id:`${_w}${$.id}`,title:$.title,description:$.description,_meta:$._meta,server:$.server,is_public:!1,is_unlisted:!0,created_at:$.created_at,updated_at:$.updated_at}}var Lg$;var Eg$=D(()=>{q0();DN();yT0();Il();Lg$=g({name:"REGISTRY_MONITOR_CONNECTION_SYNC",description:"Ensure every registry item has a dedicated monitor connection mapping for MCP monitors",inputSchema:ty$,outputSchema:oy$,handler:async($,Z)=>{let Q=n(Z);await Z.access.check();let X=Z.storage.registry,Y=(await X.items.list(Q.id,{includeUnlisted:!0})).items,J=(await X.publishRequests.list(Q.id,{status:"pending",limit:500})).items.map(DY6),W=[...Y,...J],K=await X.monitorConnections.list(Q.id),H=new Set(K.map((U)=>U.item_id)),F=0;for(let U of W){if(!U.server.remotes?.some((N)=>N.url))continue;try{await lZ1(Z,U)}catch(N){console.warn(`[REGISTRY_MONITOR_CONNECTION_SYNC] Skipping ${U.id}:`,N instanceof Error?N.message:N);continue}if(!H.has(U.id))F+=1}return{created:F,updated:Math.max(W.length-F,0)}}})});var jg$;var zg$=D(()=>{q0();DN();jg$=g({name:"REGISTRY_MONITOR_CONNECTION_UPDATE_AUTH",description:"Update the auth_status of a monitor connection mapping (by core connection ID)",inputSchema:ry$,outputSchema:sy$,handler:async({connectionId:$,authStatus:Z},Q)=>{let X=n(Q);await Q.access.check();let Y=Q.storage.registry,G=X.id,J=await Y.monitorConnections.findByConnectionId(G,$);if(!J)throw Error(`No monitor connection mapping found for connection ${$}`);return await Y.monitorConnections.updateAuthStatus(G,J.item_id,Z),{success:!0}}})});function wY6($){if(!$)return{};if(typeof $==="string")try{return JSON.parse($)}catch{return{}}if(typeof $==="object")return $;return{}}async function Ze($,Z){let X=(await $.db.selectFrom("virtual_mcp_plugin_configs").innerJoin("connections","connections.id","virtual_mcp_plugin_configs.virtual_mcp_id").select(["virtual_mcp_plugin_configs.settings as settings"]).where("connections.organization_id","=",Z).where("virtual_mcp_plugin_configs.plugin_id","=",Hf).execute()).map((G)=>wY6(G.settings)),Y={acceptPublishRequests:X.some((G)=>G.acceptPublishRequests===!0),requireApiToken:X.some((G)=>G.requireApiToken===!0),storePrivateOnly:X.some((G)=>G.storePrivateOnly===!0)};if(Y.acceptPublishRequests||Y.requireApiToken||Y.storePrivateOnly)return Y;for(let G of X)if(Object.keys(G).length>0)return G;return{}}var Pg$=D(()=>{Il()});import{z as cZ1}from"zod";function LY6($,Z){if(!Z)return $;let Q={field:["is_public"],operator:"eq",value:!1};if(!$)return Q;return{operator:"and",conditions:[$,Q]}}function EY6($){let Z=new Map,Q=new Map;for(let Y of $){let G=LK(Y._meta);for(let J of G?.tags??[])Z.set(J,(Z.get(J)??0)+1);for(let J of G?.categories??[])Q.set(J,(Q.get(J)??0)+1)}let X=(Y)=>Array.from(Y.entries()).map(([G,J])=>({value:G,count:J})).sort((G,J)=>G.value.localeCompare(J.value));return{tags:X(Z),categories:X(Q)}}var Ag$,Tg$,Rg$,qg$;var Ig$=D(()=>{q0();P9();Pg$();Ag$=g({name:"COLLECTION_REGISTRY_APP_LIST",description:"List registry items for Store discovery. Supports private-only mode from plugin settings.",inputSchema:Pl,outputSchema:Al,handler:async($,Z)=>{let Q=n(Z);await Z.access.check();let X=Z.storage.registry,Y=await Ze(Z,Q.id);return X.items.list(Q.id,{...$,where:LY6($.where,Y.storePrivateOnly===!0)})}}),Tg$=g({name:"COLLECTION_REGISTRY_APP_GET",description:"Get a registry item for Store details. Respects private-only mode from plugin settings.",inputSchema:oH,outputSchema:Kf,handler:async($,Z)=>{let Q=n(Z);await Z.access.check();let X=Z.storage.registry,Y=await Ze(Z,Q.id),G=$.id??$.name;if(!G)return{item:null};let J=await X.items.findByIdOrName(Q.id,G);if(!J)return{item:null};if(Y.storePrivateOnly&&J.is_public)return{item:null};return{item:J}}}),Rg$=g({name:"COLLECTION_REGISTRY_APP_VERSIONS",description:"Get registry item versions for Store details. Respects private-only mode from plugin settings.",inputSchema:oH,outputSchema:cZ1.object({versions:cZ1.array(dW)}),handler:async($,Z)=>{let Q=n(Z);await Z.access.check();let X=Z.storage.registry,Y=await Ze(Z,Q.id),G=$.id??$.name;if(!G)return{versions:[]};let J=await X.items.findByIdOrName(Q.id,G);if(!J)return{versions:[]};if(Y.storePrivateOnly&&J.is_public)return{versions:[]};return{versions:[J]}}}),qg$=g({name:"COLLECTION_REGISTRY_APP_FILTERS",description:"List Store filter facets for registry items. Respects private-only mode from plugin settings.",inputSchema:cZ1.object({}),outputSchema:Tl,handler:async($,Z)=>{let Q=n(Z);await Z.access.check();let X=Z.storage.registry;if(!(await Ze(Z,Q.id)).storePrivateOnly)return X.items.getFilters(Q.id);let G=await X.items.list(Q.id,{limit:1e4,where:{field:["is_public"],operator:"eq",value:!1}});return EY6(G.items)}})});var Mg$;var kg$=D(()=>{rx$();ax$();$y$();Qy$();FE();Yy$();Jy$();Ky$();Fy$();Ny$();Dy$();Ly$();jy$();Py$();Ty$();qy$();My$();Vy$();yT0();Kg$();Fg$();Ng$();Og$();wg$();Eg$();zg$();Ig$();Mg$=[Ag$,Tg$,Rg$,qg$,Wy$,Hy$,Gy$,Oy$,ex$,ox$,Uy$,Zy$,Xy$,Wc1,sx$,wy$,Ey$,zy$,Ay$,Ry$,Iy$,ky$,Jg$,Wg$,Hg$,Ug$,Bg$,Dg$,Lg$,jg$]});import{z as Ml}from"zod";var dZ1;var Vg$=D(()=>{q0();FW();jo();GY();dZ1=g({name:"SANDBOX_DELETE",description:"Delete a sandbox.",annotations:{title:"Delete VM Preview",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:Ml.object({virtualMcpId:Ml.string().describe("Virtual MCP ID that owns this VM"),branch:Ml.string().min(1).describe("Branch whose vm should be deleted (sandboxMap[userId][branch])"),removeWorktree:Ml.boolean().optional().default(!1).describe("Also reclaim the sandbox's workspace (local worktree + disk). Ignored by hosted teardown, whose filesystem is already destroyed.")}),outputSchema:Ml.object({success:Ml.boolean()}),handler:async($,Z)=>{let Q;try{Q=await kF$($,Z)}catch(W){if(W instanceof Error&&W.message==="Virtual MCP not found")return{success:!0};throw W}let{entry:X,userId:Y,sandboxUserId:G}=Q;if(!X)return{success:!0};let J=await Ho0(Z);return await ED(Z.storage.virtualMcps,$.virtualMcpId,Y,G,$.branch),await J.delete(X.sandboxHandle).catch((W)=>console.error(`[SANDBOX_DELETE] ${k7} ${X.sandboxHandle}: ${W instanceof Error?W.message:String(W)}`)),{success:!0}}})});var Sg$=D(()=>{To();Vg$()});import{z as wN}from"zod";function TY6($){try{return JSON.parse($)}catch(Z){throw Error(`GitHub /user/installations returned invalid JSON: ${$.slice(0,300)}`,{cause:Z})}}var PY6="https://api.github.com",AY6=15000,mZ1;var Cg$=D(()=>{q0();LJ();tX();s3();Xt();Cg();mZ1=g({name:"GITHUB_LIST_USER_ORGS",description:"List GitHub App installations (orgs/accounts) accessible to the authenticated user.",annotations:{title:"List GitHub User Orgs",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:wN.object({connectionId:wN.string().describe("ID of the mcp-github connection to use")}),outputSchema:wN.object({installations:wN.array(wN.object({installationId:wN.number(),login:wN.string(),avatarUrl:wN.string(),type:wN.string()}))}),handler:async($,Z)=>{await Z.access.check();let Q=Z.organization?.id;if(!Q)throw Error("Organization context required");let X=await Z.storage.connections.findById($.connectionId,Q);if(!X)throw Error("Connection not found");if(t5(X))throw Error("Repo-scoped connections cannot list installations \u2014 use an org-level mcp-github connection");let Y=new z5(Z.db,Z.vault),G=await Y.get($.connectionId);if(!G)throw Error("No GitHub token found. Ensure the mcp-github connection is authenticated.");let J=G.accessToken;if(XD(G)&&Y.isExpired(G,Ft)){let U=await gT0(G,Y);if(!U)throw Error(wZ);J=U,G=await Y.get($.connectionId)??G}let W=[],K=1,H=100,F=async(U)=>fetch(`${PY6}/user/installations?per_page=${H}&page=${K}`,{headers:{Authorization:`Bearer ${U}`,Accept:"application/vnd.github+json","X-GitHub-Api-Version":"2022-11-28"},signal:AbortSignal.timeout(AY6)});while(!0){let U=await F(J);if(U.status===401){let B=await Y.get($.connectionId);if(!B||!XD(B))throw Error(wZ);let O=await gT0(B,Y);if(!O)throw Error(wZ);if(J=O,U=await F(J),U.status===401)throw Error(wZ)}if($D(U.headers,{lane:"rest",operation:"list_user_installations",installation:Up0}),aO(U)){let B=U.headers.get("retry-after")!==null?"secondary":"primary";ZD({lane:"rest",operation:"list_user_installations",installation:Up0,kind:B});let O=eO(U.headers);throw Error(`GitHub ${B} rate limit reached${O===null?"":`; retry in ${Math.ceil(O/1000)}s`}`)}if(!U.ok)throw Error(`GitHub /user/installations failed: ${U.status}`);let N=TY6(await U.text());for(let B of N.installations)W.push({installationId:B.id,login:B.account.login,avatarUrl:B.account.avatar_url,type:B.account.type});if(N.installations.length<H)break;K++}return{installations:W}}})});var _g$=D(()=>{Cg$()});import{z as iZ1}from"zod";function hT0($){return{repositoryId:$.repositoryId,ref:$.repoUrl?QW($.repoUrl):null,connectionId:$.connectionId}}var LN,vg$="No credential for this repository \u2014 link it in Settings \u2192 Repositories";var pZ1=D(()=>{y5();LN={repositoryId:iZ1.string().optional().describe("Connected repository (REPOSITORY_LINK) to act on"),repoUrl:iZ1.string().optional().describe("Any URL of the repository \u2014 its provider and host are read from it"),connectionId:iZ1.string().optional().describe("Legacy: a repo-scoped mcp-github connection in this org")}});import{z as mW}from"zod";var nZ1;var fg$=D(()=>{q0();tZ();pZ1();nZ1=g({name:"REPOSITORY_SEARCH_BRANCHES",description:"Search a repository's branches by a case-insensitive substring of the branch name, filtered server-side by the provider.",annotations:{title:"Search Repository Branches",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:mW.object({...LN,query:mW.string().describe("Substring to match against branch names. Empty returns the first branches alphabetically."),limit:mW.number().int().min(1).max(100).default(30),cursor:mW.string().nullish().describe("Opaque cursor from a previous call's `nextCursor`, to read the next window")}),outputSchema:mW.object({branches:mW.array(mW.object({name:mW.string(),author:mW.string().nullable()})),totalCount:mW.number(),nextCursor:mW.string().nullable()}),handler:async($,Z)=>{await Z.access.check();let Q=Z.organization?.id;if(!Q)throw Error("Organization context required");return(await yp0(Z,Q,hT0($))).searchBranches({query:$.query,limit:$.limit,cursor:$.cursor})}})});import{z as g$}from"zod";function xg$($){let{credentialConnectionId:Z,...Q}=$;return{...Q,servable:Wt($)}}function tZ1($){let{legacyConnectionId:Z,...Q}=$;return Q}async function yg$($,Z,Q){let X=await $.storage.gitProviderAccounts.get(Q,Z);if(!X)throw Error("Git account not found");return X}var qY6,bg$,gg$,hg$,ug$,lg$,cg$,dg$,mg$,ig$;var pg$=D(()=>{Nt();y5();q0();tZ();fg$();qY6=g$.object({ref:b8$,externalId:g$.string(),defaultBranch:g$.string().nullable(),webUrl:g$.string(),visibility:g$.enum(["public","private","internal"]),description:g$.string().nullable(),updatedAt:g$.string().nullable()}),bg$=x8$.extend({servable:g$.boolean()});gg$=g({name:"GIT_PROVIDER_CAPABILITIES",description:"Which git providers this deployment can connect through Studio-owned credentials, and the URLs that start each connect flow.",annotations:{title:"Git provider capabilities",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},_meta:{ui:{visibility:"app"}},inputSchema:g$.object({}),outputSchema:g$.object({github:g$.object({configured:g$.boolean(),connectPath:g$.string().nullable(),installPath:g$.string().nullable()}),gitlab:g$.object({oauthHosts:g$.array(g$.string()),connectPath:g$.string().nullable()})}),handler:async($,Z)=>{t(Z);let Q=n(Z),X=`/api/${Q.slug??Q.id}/git-providers`,Y=y4$(),G=Y.github.configured;return{github:{configured:G,connectPath:G?`${X}/github/connect`:null,installPath:G?`${X}/github/install`:null},gitlab:{oauthHosts:Y.gitlab.hosts,connectPath:Y.gitlab.configured?`${X}/gitlab/connect`:null}}}}),hg$=g({name:"GIT_ACCOUNT_LIST",description:"List the git provider accounts connected to this organization.",annotations:{title:"List git accounts",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},_meta:{ui:{visibility:"app"}},inputSchema:g$.object({}),outputSchema:g$.object({accounts:g$.array(bg$)}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=n(Z);return{accounts:(await Z.storage.gitProviderAccounts.listByOrg(Q.id)).map(xg$)}}}),ug$=g({name:"GIT_ACCOUNT_CONNECT_TOKEN",description:"Connect a git provider account with a personal, project or group access token. Validates the token against the provider before storing it encrypted. Use this for self-managed GitLab instances (no OAuth application) or when OAuth is not wanted.",annotations:{title:"Connect git account with a token",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:g$.object({type:an.describe("Provider; only gitlab accepts tokens today"),host:g$.string().min(1).describe("Provider host, e.g. gitlab.com or gitlab.acme.com"),token:g$.string().min(1).describe("Access token with api scope")}),outputSchema:g$.object({account:bg$}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=n(Z),X=$.host.trim().toLowerCase();if(!/^[a-z0-9.-]+(:[0-9]+)?$/.test(X))throw Error("host must be a bare hostname, optionally with a port");let Y=await v4$($.type,X,$.token),G=await Z.storage.gitProviderAccounts.upsert({organizationId:Q.id,type:$.type,host:X,authKind:"token",externalAccountId:Y.externalAccountId,login:Y.login,avatarUrl:Y.avatarUrl,createdBy:n0(Z)??null});return await Z.storage.gitProviderAccountCredentials.upsert({connectionId:G.id,accessToken:$.token,refreshToken:null,scope:null,expiresAt:null,clientId:null,clientSecret:null,tokenEndpoint:null}),{account:xg$(G)}}}),lg$=g({name:"GIT_ACCOUNT_DELETE",description:"Disconnect a git provider account. Its repositories stay linked but lose credentials (they become anonymous clones) until linked to another account.",annotations:{title:"Disconnect git account",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},_meta:{ui:{visibility:"app"}},inputSchema:g$.object({id:g$.string()}),outputSchema:g$.object({deleted:g$.boolean()}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=n(Z);return{deleted:await Z.storage.gitProviderAccounts.delete($.id,Q.id)}}}),cg$=g({name:"REPOSITORY_LIST",description:"List the repositories linked to this organization.",annotations:{title:"List repositories",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},_meta:{ui:{visibility:"app"}},inputSchema:g$.object({accountId:g$.string().optional().describe("Only repositories of this account")}),outputSchema:g$.object({repositories:g$.array(Gp0.extend({usable:g$.boolean()}))}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=n(Z),X=await Z.storage.repositories.listByOrg(Q.id,{accountId:$.accountId}),Y=await JD(Z,Q.id),G=new Set(Y.map((J)=>J.webUrl.toLowerCase()));return{repositories:X.map((J)=>({...tZ1(J),usable:G.has(J.webUrl.toLowerCase())}))}}}),dg$=g({name:"REPOSITORY_SEARCH",description:"Search the repositories an account can reach on its provider (not yet linked). Feeds the repository picker.",annotations:{title:"Search provider repositories",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:g$.object({accountId:g$.string(),query:g$.string().optional(),page:g$.number().int().min(1).optional(),perPage:g$.number().int().min(1).max(100).optional()}),outputSchema:g$.object({repositories:g$.array(qY6),hasMore:g$.boolean()}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=n(Z),X=await yg$(Z,Q.id,$.accountId);return qj({db:Z.db,vault:Z.vault},X).listRepos({query:$.query,page:$.page,perPage:$.perPage})}}),mg$=g({name:"REPOSITORY_LINK",description:"Link a repository to the organization. With an account, the repository is verified against the provider and its facts (id, default branch, visibility) recorded; without one it is linked as an anonymous public clone.",annotations:{title:"Link repository",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:g$.object({url:g$.string().min(1).describe("Repository URL (https or ssh), or a bare path like owner/name when accountId is given"),accountId:g$.string().optional().describe("Account whose credentials access the repository")}),outputSchema:g$.object({repository:Gp0}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=n(Z),X=n0(Z)??null;if(!$.accountId){let H=QW($.url);if(!H)throw Error("Could not recognise the repository URL. Use a full https URL from GitHub or GitLab.");let F=await Z.storage.repositories.upsert({organizationId:Q.id,ref:H,createdBy:X});return{repository:tZ1(F)}}let Y=await yg$(Z,Q.id,$.accountId),G=QW($.url,{provider:Y.type,host:Y.host});if(!G)throw Error("Could not recognise the repository URL or path");if(G.host!==Y.host)throw Error(`Repository is on ${G.host} but the account is on ${Y.host}`);let W=await qj({db:Z.db,vault:Z.vault},Y).getRepo(G);if(!W)throw Error(`${G.path} was not found on ${G.host} or the account cannot access it`);let K=await Z.storage.repositories.upsert({organizationId:Q.id,ref:W.ref,accountId:Y.id,externalId:W.externalId,defaultBranch:W.defaultBranch,visibility:W.visibility,createdBy:X});return{repository:tZ1(K)}}}),ig$=g({name:"REPOSITORY_DELETE",description:"Unlink a repository from the organization. Agents, tasks and syncs that referenced it keep working off their legacy metadata until relinked.",annotations:{title:"Unlink repository",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},_meta:{ui:{visibility:"app"}},inputSchema:g$.object({id:g$.string()}),outputSchema:g$.object({deleted:g$.boolean()}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=n(Z);return{deleted:await Z.storage.repositories.delete($.id,Q.id)}}})});import{z as Q$}from"zod";async function kl($,Z){let Q=$.organization?.id;if(!Q)throw Error("Organization context required");let X=await Ut($,Q,hT0(Z));if(!X)throw Error(vg$);return X}var MY6,kY6,uT0,VY6,ng$,tg$,og$,rg$,sg$,ag$;var eg$=D(()=>{q0();tZ();pZ1();MY6=Q$.object({id:Q$.string().nullable(),name:Q$.string(),state:Q$.enum(["queued","running","completed"]),conclusion:Q$.enum(["success","failure","neutral","cancelled","skipped","timed_out","action_required"]).nullable(),url:Q$.string().nullable(),durationMs:Q$.number().nullable(),summary:Q$.string().nullable()}),kY6=Q$.object({id:Q$.string(),author:Q$.string(),body:Q$.string(),createdAt:Q$.string(),updatedAt:Q$.string(),url:Q$.string()}),uT0=Q$.object({number:Q$.number(),url:Q$.string(),title:Q$.string(),body:Q$.string(),state:Q$.enum(["open","closed","merged"]),draft:Q$.boolean(),mergedAt:Q$.string().nullable(),base:Q$.string(),head:Q$.string(),headSha:Q$.string(),headRepoPath:Q$.string().nullable(),author:Q$.string(),conflicting:Q$.boolean().nullable(),checks:Q$.enum(["pending","passing","failing"]).nullable(),changedFiles:Q$.number().nullable()}),VY6=uT0.extend({checkRuns:Q$.array(MY6),comments:Q$.array(kY6),unresolvedConversations:Q$.number(),reviewBlocked:Q$.boolean()}),ng$=g({name:"CHANGE_REQUEST_STATE",description:"Read a branch's change request with its CI runs, review state and comments.",annotations:{title:"Read Change Request State",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:Q$.object({...LN,branch:Q$.string().describe("Head branch of the change request to read")}),outputSchema:Q$.object({changeRequest:VY6.nullable()}),handler:async($,Z)=>{return await Z.access.check(),{changeRequest:await(await kl(Z,$)).readDetailed({branch:$.branch})}}}),tg$=g({name:"CHANGE_REQUEST_LAST_MERGED",description:"Read the most recently merged change request into a base branch \u2014 in Fast Preview, the last publish.",annotations:{title:"Read Last Merged Change Request",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:Q$.object({...LN,base:Q$.string().describe("Branch it was merged into")}),outputSchema:Q$.object({changeRequest:uT0.nullable()}),handler:async($,Z)=>{return await Z.access.check(),{changeRequest:await(await kl(Z,$)).lastMergedInto($.base)}}}),og$=g({name:"CHANGE_REQUEST_LIST_OPEN",description:"List a repository's open change requests, most recently updated first.",annotations:{title:"List Open Change Requests",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:Q$.object({...LN,limit:Q$.number().int().min(1).max(100).default(50)}),outputSchema:Q$.object({changeRequests:Q$.array(uT0)}),handler:async($,Z)=>{return await Z.access.check(),{changeRequests:await(await kl(Z,$)).listOpen($.limit)}}}),rg$=g({name:"CHANGE_REQUEST_CHECK_LOG",description:"Read one CI run's report \u2014 a GitHub check run's output markdown, or the tail of a GitLab job's trace.",annotations:{title:"Read CI Run Report",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:Q$.object({...LN,checkId:Q$.string().describe("Provider id of the run, from its listing")}),outputSchema:Q$.object({report:Q$.string().nullable()}),handler:async($,Z)=>{return await Z.access.check(),{report:await(await kl(Z,$)).readCheckLog($.checkId)}}}),sg$=g({name:"CHANGE_REQUEST_OPEN",description:"Propose a branch onto another. Returns the branch's existing change request instead of failing when it already has one.",annotations:{title:"Open Change Request",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:Q$.object({...LN,head:Q$.string().describe("Branch being proposed"),base:Q$.string().describe("Branch it should land on"),title:Q$.string(),body:Q$.string().optional()}),outputSchema:Q$.object({changeRequest:uT0,existed:Q$.boolean()}),handler:async($,Z)=>{await Z.access.check();let Q=await kl(Z,$),X=await Q.readForBranch($.head);if(X&&X.state==="open"){if($.body&&$.body!==X.body)await Q.describe(X.number,$.body);return{changeRequest:$.body?{...X,body:$.body}:X,existed:!0}}return{changeRequest:await Q.open({head:$.head,base:$.base,title:$.title,body:$.body}),existed:!1}}}),ag$=g({name:"CHANGE_REQUEST_MERGE",description:"Land a change request. Reports why it could not merge rather than throwing.",annotations:{title:"Merge Change Request",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:Q$.object({...LN,number:Q$.number().int().positive(),strategy:Q$.enum(["any","squash"]).default("any").describe("`squash` when the result must be one commit; `any` uses whatever the repository allows"),commitTitle:Q$.string().optional(),commitMessage:Q$.string().optional()}),outputSchema:Q$.object({merged:Q$.boolean(),reason:Q$.enum(["conflict","blocked","rate_limited","not_found","error"]).optional(),detail:Q$.string().optional()}),handler:async($,Z)=>{await Z.access.check();let X=await(await kl(Z,$)).merge($.number,{strategy:$.strategy,commitTitle:$.commitTitle,commitMessage:$.commitMessage});return X.merged?{merged:!0}:{merged:!1,reason:X.reason,detail:X.detail}}})});import{z as _6}from"zod";function lT0($){if(!$)return"";return typeof $==="string"?$:$.toISOString()}function $h$($){let Z=$.trim();return Z.length>0?Z:void 0}function Zh$($,Z){return $===void 0||$.includes(Z)}var CY6,_Y6,vY6,fY6,bY6,xY6,oZ1;var Qh$=D(()=>{q0();os0();CY6=["thread","task"],_Y6=_6.object({type:_6.literal("thread"),id:_6.string(),title:_6.string(),created_at:_6.string(),updated_at:_6.string(),virtual_mcp_id:_6.string().nullable(),run_config:_6.record(_6.string(),_6.unknown()).nullable(),status:_6.string().nullable()}),vY6=_6.object({type:_6.literal("task"),id:_6.string(),title:_6.string(),created_at:_6.string(),updated_at:_6.string(),key:_6.string().nullable(),status:_6.string().nullable(),repo:_6.string().nullable()}),fY6=_6.discriminatedUnion("type",[_Y6,vY6]),bY6=_6.object({query:_6.string().max(256).describe("Free-text search query. Empty string returns the most recently updated resources."),limit:_6.number().int().min(1).max(50).optional().describe("Maximum results per resource type (default: 20)."),types:_6.array(_6.enum(CY6)).optional().describe("Restrict the search to specific resource types. Omit to search across all available types.")}),xY6=_6.object({items:_6.array(fY6),totalCount:_6.number()});oZ1=g({name:"GLOBAL_SEARCH",description:"Search across organization resources by free-text query. Returns a typed union of matches (currently: threads and task-board cards). New resource types may be added over time without changes to the call shape.",annotations:{title:"Global Search",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:bY6,outputSchema:xY6,handler:async($,Z)=>{await Z.access.check();let Q=n(Z),X=$.limit??20,Y=Zh$($.types,"thread"),G=Zh$($.types,"task"),J=[],W=0;if(Y){let{threads:K,total:H}=await Z.storage.threads.list(void 0,{limit:X,offset:0,search:$h$($.query),includeArchived:!1});W+=H;for(let F of K)J.push({type:"thread",id:F.id,title:F.title??"",created_at:lT0(F.created_at),updated_at:lT0(F.updated_at),virtual_mcp_id:F.virtual_mcp_id??null,run_config:F.run_config??null,status:CJ(F).status})}if(G){let K=await Z.storage.taskBoard.searchByTitle(Q.id,$h$($.query)??"",X);W+=K.length;for(let H of K)J.push({type:"task",id:H.id,title:H.title??"",created_at:lT0(H.createdAt),updated_at:lT0(H.updatedAt),key:Q.slug?rL0(Q.slug,H.keySeq):null,status:H.status??null,repo:H.repo??null})}return{items:J,totalCount:W}}})});var Xh$=D(()=>{Qh$()});var d70={};T4(d70,{toolSubsetMCP:()=>rZ1,managementMCP:()=>Zu,managementContextStore:()=>aU,listManagementTools:()=>gY6,TOOL_BY_NAME:()=>Vl,CORE_TOOLS:()=>Gh$});import{z as Yh$}from"zod";async function gY6($){let Z=await Zu($),[Q,X]=Fn.createLinkedPair();await Z.connect(X);let Y=new d9({name:"tools-hydration",version:"1.0.0"},{jsonSchemaValidator:j5});try{return await Y.connect(Q),(await Y.listTools()).tools}finally{await Y.close().catch(()=>{}),await Z.close().catch(()=>{})}}var Gh$,Vl,rZ1=($,Z)=>{let Q=new TK({name:$,version:"1.0.0"},{capabilities:{tools:{}},jsonSchemaValidator:j5});for(let X of Z){let Y=Vl.get(X);if(!Y){console.warn(`[${$}] unknown tool "${X}" \u2014 not registered`);continue}let{config:G,handler:J}=na(Y);Q.registerTool(Y.name,G,J)}return Q},Zu=async($)=>{let Z=new TK({name:"mcp-cms-management",version:"1.0.0"},{capabilities:{tools:{},prompts:{},resources:{}},jsonSchemaValidator:j5});for(let Y of Vl.values()){let{config:G,handler:J}=na(Y);Z.registerTool(Y.name,G,J)}let Q=zT0();for(let Y of Q){let G=Y.arguments?.length?Object.fromEntries(Y.arguments.map((J)=>{let W=J.required?Yh$.string():Yh$.string().optional();return[J.name,J.description?W.describe(J.description):W]})):void 0;Z.registerPrompt(Y.name,{title:Y.title,description:Y.description,...G?{argsSchema:G}:{}},(J)=>{return{messages:[{role:"user",content:{type:"text",text:typeof Y.text==="function"?Y.text(J??{}):Y.text}}]}})}if($.organization?.id){let Y=await $.storage.brandContext.list($.organization.id),G=new Set;for(let J of Y){let W=J.name.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,""),K=W?`brand-${W}`:`brand-${J.id}`;if(G.has(K))K=`${K}-${J.id.slice(0,8)}`;G.add(K);let H=[`# Brand: ${J.name}`,"",`**Domain:** ${J.domain}`,"","## Overview",J.overview];if(J.colors){let U=Object.entries(J.colors).filter(([,N])=>N);if(U.length>0){H.push("","## Colors");for(let[N,B]of U)H.push(`- **${N}:** ${B}`)}}if(J.fonts){let U=Object.entries(J.fonts).filter(([,N])=>N);if(U.length>0){H.push("","## Fonts");for(let[N,B]of U)H.push(`- ${B} (${N})`)}}if(J.logo)H.push("",`**Logo:** ${J.logo}`);if(J.favicon)H.push(`**Favicon:** ${J.favicon}`);if(J.ogImage)H.push(`**OG Image:** ${J.ogImage}`);if(J.images&&J.images.length>0){H.push("","## Images");for(let U of J.images){let N=Object.entries(U).map(([B,O])=>`${B}: ${O}`).join(", ");H.push(`- ${N}`)}}let F=H.join(`
2681
+ `);return{toolResults:K,agentSummary:B.length>0?B:null,unexecutedTools:F}}finally{await Z.close?.().catch(()=>{})}}async function lZ1($,Z){let Q=$.storage.registry,X=$.organization.id,Y=await Q.monitorConnections.findByItemId(X,Z.id);if(Y){if(await $.storage.connections.findById(Y.connection_id,X))return Y.connection_id}let G=$Y6(Z);if(!G)throw Error(`Registry item ${Z.id} has no remote URL`);if(cB(G))throw Error(`Registry item ${Z.id} targets a private network URL, refusing to create a monitor connection`);let J=aX6($),W=eX6(Z),K=await $.storage.connections.create({organization_id:X,created_by:J,title:`[MCP Tester] ${Z.title}`,description:`Auto-created monitor connection for ${Z.id}`,app_name:"private-registry-monitor",app_id:`${Hf}:monitor`,connection_type:W,connection_url:G,metadata:{monitorConnection:!0,registryItemId:Z.id,pluginId:Hf}});return await Q.monitorConnections.upsert({organization_id:X,item_id:Z.id,connection_id:K.id,auth_status:"none"}),K.id}async function FY6($){let Z=$.ctx.storage.registry;switch($.action){case"unlisted":return await Z.items.update($.organizationId,$.item.id,{is_unlisted:!0}),"unlisted";case"remove_public":return await Z.items.update($.organizationId,$.item.id,{is_public:!1}),"removed_public";case"remove_private":case"remove_all":return await Z.items.delete($.organizationId,$.item.id),$.action==="remove_all"?"removed_all":"removed_private";default:return"none"}}async function UY6($){let Z=Date.now();if($.signal.aborted)throw Error("Run cancelled");let Q="passed",X=!1,Y=!1,G=null,J="none",W=null,K=[],H=null,F=async()=>{await $.onProgress?.({status:Q,connectionOk:X,toolsListed:Y,toolResults:[...K],agentSummary:W,errorMessage:G,actionTaken:J,durationMs:Date.now()-Z})};try{let U=await lZ1($.ctx,$.item);H=await $.ctx.createMCPProxy(U),X=!0;let B=(await $e(H.listTools?H.listTools():Promise.resolve({tools:[]}),$.monitorConfig.perMcpTimeoutMs,`listTools ${$.item.id}`)).tools??[];if(Y=!0,$.monitorConfig.monitorMode!=="health_check")K.push(...B.map((O)=>uZ1(O.name))),await F();if($.monitorConfig.monitorMode==="full_agent"){let O=await HY6({ctx:$.ctx,monitorConfig:$.monitorConfig,item:$.item,proxy:H,tools:B,signal:$.signal,onProgress:async(w)=>{K.length=0,K.push(...ay$({discoveredTools:B,executedResults:w})),Q=w.some((L)=>!L.success)?"failed":"passed",await F()}});if(K.length=0,K.push(...ay$({discoveredTools:B,executedResults:O.toolResults})),W=O.agentSummary,O.toolResults.some((w)=>!w.success))Q="failed";if(O.unexecutedTools.length>0){if(Q="failed",!G)G=`Agent skipped ${O.unexecutedTools.length} tool(s): ${O.unexecutedTools.join(", ")}`}}else if($.monitorConfig.monitorMode!=="health_check"){for(let O=0;O<B.length;O++){let w=B[O];if(!w||$.signal.aborted)throw Error("Run cancelled");let L=Date.now();try{let E={},j=await $e(H.callTool({name:w.name,arguments:E}),$.monitorConfig.perToolTimeoutMs,`tool ${w.name}`),z=!j.isError,P=Date.now()-L;ey$(K,{toolName:w.name,success:z,input:E,durationMs:P,outputPreview:Xg$(j.structuredContent??j.content),error:z?null:xT0(j.content?.find((A)=>A.type==="text")?.text?.slice(0,300)??"Tool returned error")}),await F()}catch(E){let j=Date.now()-L,z=E instanceof Error?E.message:String(E);ey$(K,{toolName:w.name,success:!1,durationMs:j,error:xT0(z)}),await F()}}if(K.some((O)=>!O.success))Q="failed"}else for(let O of B)K.push(uZ1(O.name));if($.canApplyFailureAction&&Q==="failed"&&$.monitorConfig.onFailure!=="none")J=await FY6({ctx:$.ctx,organizationId:$.organizationId,item:$.item,action:$.monitorConfig.onFailure})}catch(U){if(G=U instanceof Error?U.message:String(U),ZY6(U))Q="needs_auth",await $.ctx.storage.registry.monitorConnections.updateAuthStatus($.organizationId,$.item.id,"needs_auth");else Q="error"}finally{await H?.close?.().catch(()=>{})}return{status:Q,connectionOk:X,toolsListed:Y,toolResults:K,agentSummary:W,errorMessage:G,actionTaken:J,durationMs:Date.now()-Z}}async function NY6($){let Z=$.ctx.storage.registry,X=(await Z.items.list($.organizationId,{includeUnlisted:!0})).items.filter((F)=>{if($.monitorConfig.testPublicOnly&&!F.is_public)return!1;if($.monitorConfig.testPrivateOnly&&F.is_public)return!1;return!0}),Y=$.monitorConfig.includePendingRequests?(await Z.publishRequests.list($.organizationId,{status:"pending",limit:500})).items.map((F)=>BY6(F)):[],G=[...X.map((F)=>({item:F,source:"registry_item"})),...Y.map((F)=>({item:F,source:"publish_request"}))];if(G.length===0){await Z.monitorRuns.update($.organizationId,$.runId,{total_items:0,status:"completed",started_at:new Date().toISOString(),finished_at:new Date().toISOString()});return}await Z.monitorRuns.update($.organizationId,$.runId,{total_items:G.length,status:"running",started_at:new Date().toISOString()});let J=0,W=0,K=0,H=0;for(let F=0;F<G.length;F++){let U=G[F],N=U?.item;if(!N||$.signal.aborted){await Z.monitorRuns.update($.organizationId,$.runId,{status:"cancelled",current_item_id:null,finished_at:new Date().toISOString()});return}await Z.monitorRuns.update($.organizationId,$.runId,{current_item_id:N.id});let B=null,O=async(L)=>{if(!B){B=(await Z.monitorResults.create({run_id:$.runId,organization_id:$.organizationId,item_id:N.id,item_title:N.title,status:L.status,error_message:L.errorMessage,connection_ok:L.connectionOk,tools_listed:L.toolsListed,tool_results:L.toolResults,agent_summary:L.agentSummary,duration_ms:L.durationMs,action_taken:L.actionTaken})).id;return}await Z.monitorResults.update($.organizationId,B,{status:L.status,error_message:L.errorMessage,connection_ok:L.connectionOk,tools_listed:L.toolsListed,tool_results:L.toolResults,agent_summary:L.agentSummary,duration_ms:L.durationMs,action_taken:L.actionTaken})},w=await UY6({ctx:$.ctx,organizationId:$.organizationId,item:N,monitorConfig:$.monitorConfig,signal:$.signal,canApplyFailureAction:U.source==="registry_item",onProgress:O});if(await O({status:w.status,connectionOk:w.connectionOk,toolsListed:w.toolsListed,toolResults:w.toolResults,agentSummary:w.agentSummary,errorMessage:w.errorMessage,actionTaken:w.actionTaken,durationMs:w.durationMs}),J+=1,w.status==="passed")W+=1;else if(w.status==="failed"||w.status==="error")K+=1;else H+=1;await Z.monitorRuns.update($.organizationId,$.runId,{tested_items:J,passed_items:W,failed_items:K,skipped_items:H})}await Z.monitorRuns.update($.organizationId,$.runId,{status:"completed",current_item_id:null,finished_at:new Date().toISOString()})}function BY6($){return{id:`${_w}${$.id}`,title:$.title,description:$.description,_meta:$._meta,server:$.server,is_public:!1,is_unlisted:!0,created_at:$.created_at,updated_at:$.updated_at}}async function OY6($,Z){let Q=sX6($);await Q.access.check();let X=Q.storage.registry,Y=await X.monitorRuns.create({organization_id:Q.organization.id,status:"pending",config_snapshot:Z,started_at:null}),G=new AbortController;return bT0.set(Y.id,G),NY6({ctx:Q,runId:Y.id,organizationId:Q.organization.id,monitorConfig:Z,signal:G.signal}).catch(async(J)=>{await X.monitorRuns.update(Q.organization.id,Y.id,{status:"failed",current_item_id:null,finished_at:new Date().toISOString()}).catch(()=>{}),rX6(`Run ${Y.id} failed with uncaught error:`,J)}).finally(()=>{bT0.delete(Y.id)}),{run:{id:Y.id}}}var bT0,nX6="[MONITOR-AGENT]",tX6,oX6="health_check: not called",Jg$;var yT0=D(()=>{q0();S4();FE();Il();DN();bT0=new Map,tX6=Sy$;Jg$=g({name:"REGISTRY_MONITOR_RUN_START",description:"Start an MCP registry monitor run with an isolated set of monitor connections.",inputSchema:xy$,outputSchema:yy$,handler:async($,Z)=>{let Q=n(Z);await Z.access.check();let X=by$($.config??{}),{run:Y}=await OY6(Z,X),J=await Z.storage.registry.monitorRuns.findById(Q.id,Y.id);if(!J)throw Error(`Failed to load monitor run ${Y.id}`);return{run:J}}})});var Wg$;var Kg$=D(()=>{q0();DN();Wg$=g({name:"REGISTRY_MONITOR_RUN_LIST",description:"List MCP registry monitor runs",inputSchema:uy$,outputSchema:ly$,handler:async($,Z)=>{let Q=n(Z);return await Z.access.check(),Z.storage.registry.monitorRuns.list(Q.id,$)}})});var Hg$;var Fg$=D(()=>{q0();DN();Hg$=g({name:"REGISTRY_MONITOR_RUN_GET",description:"Get details for one MCP registry monitor run",inputSchema:cy$,outputSchema:dy$,handler:async($,Z)=>{let Q=n(Z);return await Z.access.check(),{run:await Z.storage.registry.monitorRuns.findById(Q.id,$.runId)}}})});var Ug$;var Ng$=D(()=>{q0();DN();yT0();Ug$=g({name:"REGISTRY_MONITOR_RUN_CANCEL",description:"Cancel a running MCP registry monitor run",inputSchema:gy$,outputSchema:hy$,handler:async($,Z)=>{let Q=n(Z);await Z.access.check();let X=Z.storage.registry;if(!await X.monitorRuns.findById(Q.id,$.runId))throw Error(`Monitor run not found: ${$.runId}`);return Qg$($.runId),{run:await X.monitorRuns.update(Q.id,$.runId,{status:"cancelled",current_item_id:null,finished_at:new Date().toISOString()})}}})});var Bg$;var Og$=D(()=>{q0();DN();Bg$=g({name:"REGISTRY_MONITOR_RESULT_LIST",description:"List results for a given MCP registry monitor run",inputSchema:my$,outputSchema:iy$,handler:async($,Z)=>{let Q=n(Z);return await Z.access.check(),Z.storage.registry.monitorResults.listByRun(Q.id,$.runId,{status:$.status,limit:$.limit,offset:$.offset})}})});var Dg$;var wg$=D(()=>{q0();DN();Il();Dg$=g({name:"REGISTRY_MONITOR_CONNECTION_LIST",description:"List monitor connection mappings for private registry MCP monitor runs, including auth status",inputSchema:py$,outputSchema:ny$,handler:async($,Z)=>{let Q=n(Z);await Z.access.check();let X=Z.storage.registry,Y=await X.monitorConnections.list(Q.id);return{items:await Promise.all(Y.map(async(J)=>{let W=await X.items.findById(Q.id,J.item_id);if(!W&&J.item_id.startsWith(_w)){let F=J.item_id.slice(_w.length),U=await X.publishRequests.findById(Q.id,F);if(U)W={id:J.item_id,title:U.title,description:U.description,_meta:U._meta,server:U.server,is_public:!1,is_unlisted:!0,created_at:U.created_at,updated_at:U.updated_at}}let K=W?.server.remotes?.find((F)=>F.url)?.url??null,H=J.item_id.startsWith(_w)?"request":"store";return{mapping:J,item:W,remoteUrl:K,source:H}}))}}})});function DY6($){return{id:`${_w}${$.id}`,title:$.title,description:$.description,_meta:$._meta,server:$.server,is_public:!1,is_unlisted:!0,created_at:$.created_at,updated_at:$.updated_at}}var Lg$;var Eg$=D(()=>{q0();DN();yT0();Il();Lg$=g({name:"REGISTRY_MONITOR_CONNECTION_SYNC",description:"Ensure every registry item has a dedicated monitor connection mapping for MCP monitors",inputSchema:ty$,outputSchema:oy$,handler:async($,Z)=>{let Q=n(Z);await Z.access.check();let X=Z.storage.registry,Y=(await X.items.list(Q.id,{includeUnlisted:!0})).items,J=(await X.publishRequests.list(Q.id,{status:"pending",limit:500})).items.map(DY6),W=[...Y,...J],K=await X.monitorConnections.list(Q.id),H=new Set(K.map((U)=>U.item_id)),F=0;for(let U of W){if(!U.server.remotes?.some((N)=>N.url))continue;try{await lZ1(Z,U)}catch(N){console.warn(`[REGISTRY_MONITOR_CONNECTION_SYNC] Skipping ${U.id}:`,N instanceof Error?N.message:N);continue}if(!H.has(U.id))F+=1}return{created:F,updated:Math.max(W.length-F,0)}}})});var jg$;var zg$=D(()=>{q0();DN();jg$=g({name:"REGISTRY_MONITOR_CONNECTION_UPDATE_AUTH",description:"Update the auth_status of a monitor connection mapping (by core connection ID)",inputSchema:ry$,outputSchema:sy$,handler:async({connectionId:$,authStatus:Z},Q)=>{let X=n(Q);await Q.access.check();let Y=Q.storage.registry,G=X.id,J=await Y.monitorConnections.findByConnectionId(G,$);if(!J)throw Error(`No monitor connection mapping found for connection ${$}`);return await Y.monitorConnections.updateAuthStatus(G,J.item_id,Z),{success:!0}}})});function wY6($){if(!$)return{};if(typeof $==="string")try{return JSON.parse($)}catch{return{}}if(typeof $==="object")return $;return{}}async function Ze($,Z){let X=(await $.db.selectFrom("virtual_mcp_plugin_configs").innerJoin("connections","connections.id","virtual_mcp_plugin_configs.virtual_mcp_id").select(["virtual_mcp_plugin_configs.settings as settings"]).where("connections.organization_id","=",Z).where("virtual_mcp_plugin_configs.plugin_id","=",Hf).execute()).map((G)=>wY6(G.settings)),Y={acceptPublishRequests:X.some((G)=>G.acceptPublishRequests===!0),requireApiToken:X.some((G)=>G.requireApiToken===!0),storePrivateOnly:X.some((G)=>G.storePrivateOnly===!0)};if(Y.acceptPublishRequests||Y.requireApiToken||Y.storePrivateOnly)return Y;for(let G of X)if(Object.keys(G).length>0)return G;return{}}var Pg$=D(()=>{Il()});import{z as cZ1}from"zod";function LY6($,Z){if(!Z)return $;let Q={field:["is_public"],operator:"eq",value:!1};if(!$)return Q;return{operator:"and",conditions:[$,Q]}}function EY6($){let Z=new Map,Q=new Map;for(let Y of $){let G=LK(Y._meta);for(let J of G?.tags??[])Z.set(J,(Z.get(J)??0)+1);for(let J of G?.categories??[])Q.set(J,(Q.get(J)??0)+1)}let X=(Y)=>Array.from(Y.entries()).map(([G,J])=>({value:G,count:J})).sort((G,J)=>G.value.localeCompare(J.value));return{tags:X(Z),categories:X(Q)}}var Ag$,Tg$,Rg$,qg$;var Ig$=D(()=>{q0();P9();Pg$();Ag$=g({name:"COLLECTION_REGISTRY_APP_LIST",description:"List registry items for Store discovery. Supports private-only mode from plugin settings.",inputSchema:Pl,outputSchema:Al,handler:async($,Z)=>{let Q=n(Z);await Z.access.check();let X=Z.storage.registry,Y=await Ze(Z,Q.id);return X.items.list(Q.id,{...$,where:LY6($.where,Y.storePrivateOnly===!0)})}}),Tg$=g({name:"COLLECTION_REGISTRY_APP_GET",description:"Get a registry item for Store details. Respects private-only mode from plugin settings.",inputSchema:oH,outputSchema:Kf,handler:async($,Z)=>{let Q=n(Z);await Z.access.check();let X=Z.storage.registry,Y=await Ze(Z,Q.id),G=$.id??$.name;if(!G)return{item:null};let J=await X.items.findByIdOrName(Q.id,G);if(!J)return{item:null};if(Y.storePrivateOnly&&J.is_public)return{item:null};return{item:J}}}),Rg$=g({name:"COLLECTION_REGISTRY_APP_VERSIONS",description:"Get registry item versions for Store details. Respects private-only mode from plugin settings.",inputSchema:oH,outputSchema:cZ1.object({versions:cZ1.array(dW)}),handler:async($,Z)=>{let Q=n(Z);await Z.access.check();let X=Z.storage.registry,Y=await Ze(Z,Q.id),G=$.id??$.name;if(!G)return{versions:[]};let J=await X.items.findByIdOrName(Q.id,G);if(!J)return{versions:[]};if(Y.storePrivateOnly&&J.is_public)return{versions:[]};return{versions:[J]}}}),qg$=g({name:"COLLECTION_REGISTRY_APP_FILTERS",description:"List Store filter facets for registry items. Respects private-only mode from plugin settings.",inputSchema:cZ1.object({}),outputSchema:Tl,handler:async($,Z)=>{let Q=n(Z);await Z.access.check();let X=Z.storage.registry;if(!(await Ze(Z,Q.id)).storePrivateOnly)return X.items.getFilters(Q.id);let G=await X.items.list(Q.id,{limit:1e4,where:{field:["is_public"],operator:"eq",value:!1}});return EY6(G.items)}})});var Mg$;var kg$=D(()=>{rx$();ax$();$y$();Qy$();FE();Yy$();Jy$();Ky$();Fy$();Ny$();Dy$();Ly$();jy$();Py$();Ty$();qy$();My$();Vy$();yT0();Kg$();Fg$();Ng$();Og$();wg$();Eg$();zg$();Ig$();Mg$=[Ag$,Tg$,Rg$,qg$,Wy$,Hy$,Gy$,Oy$,ex$,ox$,Uy$,Zy$,Xy$,Wc1,sx$,wy$,Ey$,zy$,Ay$,Ry$,Iy$,ky$,Jg$,Wg$,Hg$,Ug$,Bg$,Dg$,Lg$,jg$]});import{z as Ml}from"zod";var dZ1;var Vg$=D(()=>{q0();FW();jo();GY();dZ1=g({name:"SANDBOX_DELETE",description:"Delete a sandbox.",annotations:{title:"Delete VM Preview",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:Ml.object({virtualMcpId:Ml.string().describe("Virtual MCP ID that owns this VM"),branch:Ml.string().min(1).describe("Branch whose vm should be deleted (sandboxMap[userId][branch])"),removeWorktree:Ml.boolean().optional().default(!1).describe("Also reclaim the sandbox's workspace (local worktree + disk). Ignored by hosted teardown, whose filesystem is already destroyed.")}),outputSchema:Ml.object({success:Ml.boolean()}),handler:async($,Z)=>{let Q;try{Q=await kF$($,Z)}catch(W){if(W instanceof Error&&W.message==="Virtual MCP not found")return{success:!0};throw W}let{entry:X,userId:Y,sandboxUserId:G}=Q;if(!X)return{success:!0};let J=await Ho0(Z);return await ED(Z.storage.virtualMcps,$.virtualMcpId,Y,G,$.branch),await J.delete(X.sandboxHandle).catch((W)=>console.error(`[SANDBOX_DELETE] ${k7} ${X.sandboxHandle}: ${W instanceof Error?W.message:String(W)}`)),{success:!0}}})});var Sg$=D(()=>{To();Vg$()});import{z as wN}from"zod";function TY6($){try{return JSON.parse($)}catch(Z){throw Error(`GitHub /user/installations returned invalid JSON: ${$.slice(0,300)}`,{cause:Z})}}var PY6="https://api.github.com",AY6=15000,mZ1;var Cg$=D(()=>{q0();LJ();tX();s3();Xt();Cg();mZ1=g({name:"GITHUB_LIST_USER_ORGS",description:"List GitHub App installations (orgs/accounts) accessible to the authenticated user.",annotations:{title:"List GitHub User Orgs",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:wN.object({connectionId:wN.string().describe("ID of the mcp-github connection to use")}),outputSchema:wN.object({installations:wN.array(wN.object({installationId:wN.number(),login:wN.string(),avatarUrl:wN.string(),type:wN.string()}))}),handler:async($,Z)=>{await Z.access.check();let Q=Z.organization?.id;if(!Q)throw Error("Organization context required");let X=await Z.storage.connections.findById($.connectionId,Q);if(!X)throw Error("Connection not found");if(t5(X))throw Error("Repo-scoped connections cannot list installations \u2014 use an org-level mcp-github connection");let Y=new z5(Z.db,Z.vault),G=await Y.get($.connectionId);if(!G)throw Error("No GitHub token found. Ensure the mcp-github connection is authenticated.");let J=G.accessToken;if(XD(G)&&Y.isExpired(G,Ft)){let U=await gT0(G,Y);if(!U)throw Error(wZ);J=U,G=await Y.get($.connectionId)??G}let W=[],K=1,H=100,F=async(U)=>fetch(`${PY6}/user/installations?per_page=${H}&page=${K}`,{headers:{Authorization:`Bearer ${U}`,Accept:"application/vnd.github+json","X-GitHub-Api-Version":"2022-11-28"},signal:AbortSignal.timeout(AY6)});while(!0){let U=await F(J);if(U.status===401){let B=await Y.get($.connectionId);if(!B||!XD(B))throw Error(wZ);let O=await gT0(B,Y);if(!O)throw Error(wZ);if(J=O,U=await F(J),U.status===401)throw Error(wZ)}if($D(U.headers,{lane:"rest",operation:"list_user_installations",installation:Up0}),aO(U)){await U.body?.cancel().catch(()=>{});let B=U.headers.get("retry-after")!==null?"secondary":"primary";ZD({lane:"rest",operation:"list_user_installations",installation:Up0,kind:B});let O=eO(U.headers);throw Error(`GitHub ${B} rate limit reached${O===null?"":`; retry in ${Math.ceil(O/1000)}s`}`)}if(!U.ok)throw await U.body?.cancel().catch(()=>{}),Error(`GitHub /user/installations failed: ${U.status}`);let N=TY6(await U.text());for(let B of N.installations)W.push({installationId:B.id,login:B.account.login,avatarUrl:B.account.avatar_url,type:B.account.type});if(N.installations.length<H)break;K++}return{installations:W}}})});var _g$=D(()=>{Cg$()});import{z as iZ1}from"zod";function hT0($){return{repositoryId:$.repositoryId,ref:$.repoUrl?QW($.repoUrl):null,connectionId:$.connectionId}}var LN,vg$="No credential for this repository \u2014 link it in Settings \u2192 Repositories";var pZ1=D(()=>{y5();LN={repositoryId:iZ1.string().optional().describe("Connected repository (REPOSITORY_LINK) to act on"),repoUrl:iZ1.string().optional().describe("Any URL of the repository \u2014 its provider and host are read from it"),connectionId:iZ1.string().optional().describe("Legacy: a repo-scoped mcp-github connection in this org")}});import{z as mW}from"zod";var nZ1;var fg$=D(()=>{q0();tZ();pZ1();nZ1=g({name:"REPOSITORY_SEARCH_BRANCHES",description:"Search a repository's branches by a case-insensitive substring of the branch name, filtered server-side by the provider.",annotations:{title:"Search Repository Branches",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:mW.object({...LN,query:mW.string().describe("Substring to match against branch names. Empty returns the first branches alphabetically."),limit:mW.number().int().min(1).max(100).default(30),cursor:mW.string().nullish().describe("Opaque cursor from a previous call's `nextCursor`, to read the next window")}),outputSchema:mW.object({branches:mW.array(mW.object({name:mW.string(),author:mW.string().nullable()})),totalCount:mW.number(),nextCursor:mW.string().nullable()}),handler:async($,Z)=>{await Z.access.check();let Q=Z.organization?.id;if(!Q)throw Error("Organization context required");return(await yp0(Z,Q,hT0($))).searchBranches({query:$.query,limit:$.limit,cursor:$.cursor})}})});import{z as g$}from"zod";function xg$($){let{credentialConnectionId:Z,...Q}=$;return{...Q,servable:Wt($)}}function tZ1($){let{legacyConnectionId:Z,...Q}=$;return Q}async function yg$($,Z,Q){let X=await $.storage.gitProviderAccounts.get(Q,Z);if(!X)throw Error("Git account not found");return X}var qY6,bg$,gg$,hg$,ug$,lg$,cg$,dg$,mg$,ig$;var pg$=D(()=>{Nt();y5();q0();tZ();fg$();qY6=g$.object({ref:b8$,externalId:g$.string(),defaultBranch:g$.string().nullable(),webUrl:g$.string(),visibility:g$.enum(["public","private","internal"]),description:g$.string().nullable(),updatedAt:g$.string().nullable()}),bg$=x8$.extend({servable:g$.boolean()});gg$=g({name:"GIT_PROVIDER_CAPABILITIES",description:"Which git providers this deployment can connect through Studio-owned credentials, and the URLs that start each connect flow.",annotations:{title:"Git provider capabilities",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},_meta:{ui:{visibility:"app"}},inputSchema:g$.object({}),outputSchema:g$.object({github:g$.object({configured:g$.boolean(),connectPath:g$.string().nullable(),installPath:g$.string().nullable()}),gitlab:g$.object({oauthHosts:g$.array(g$.string()),connectPath:g$.string().nullable()})}),handler:async($,Z)=>{t(Z);let Q=n(Z),X=`/api/${Q.slug??Q.id}/git-providers`,Y=y4$(),G=Y.github.configured;return{github:{configured:G,connectPath:G?`${X}/github/connect`:null,installPath:G?`${X}/github/install`:null},gitlab:{oauthHosts:Y.gitlab.hosts,connectPath:Y.gitlab.configured?`${X}/gitlab/connect`:null}}}}),hg$=g({name:"GIT_ACCOUNT_LIST",description:"List the git provider accounts connected to this organization.",annotations:{title:"List git accounts",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},_meta:{ui:{visibility:"app"}},inputSchema:g$.object({}),outputSchema:g$.object({accounts:g$.array(bg$)}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=n(Z);return{accounts:(await Z.storage.gitProviderAccounts.listByOrg(Q.id)).map(xg$)}}}),ug$=g({name:"GIT_ACCOUNT_CONNECT_TOKEN",description:"Connect a git provider account with a personal, project or group access token. Validates the token against the provider before storing it encrypted. Use this for self-managed GitLab instances (no OAuth application) or when OAuth is not wanted.",annotations:{title:"Connect git account with a token",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:g$.object({type:an.describe("Provider; only gitlab accepts tokens today"),host:g$.string().min(1).describe("Provider host, e.g. gitlab.com or gitlab.acme.com"),token:g$.string().min(1).describe("Access token with api scope")}),outputSchema:g$.object({account:bg$}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=n(Z),X=$.host.trim().toLowerCase();if(!/^[a-z0-9.-]+(:[0-9]+)?$/.test(X))throw Error("host must be a bare hostname, optionally with a port");let Y=await v4$($.type,X,$.token),G=await Z.storage.gitProviderAccounts.upsert({organizationId:Q.id,type:$.type,host:X,authKind:"token",externalAccountId:Y.externalAccountId,login:Y.login,avatarUrl:Y.avatarUrl,createdBy:n0(Z)??null});return await Z.storage.gitProviderAccountCredentials.upsert({connectionId:G.id,accessToken:$.token,refreshToken:null,scope:null,expiresAt:null,clientId:null,clientSecret:null,tokenEndpoint:null}),{account:xg$(G)}}}),lg$=g({name:"GIT_ACCOUNT_DELETE",description:"Disconnect a git provider account. Its repositories stay linked but lose credentials (they become anonymous clones) until linked to another account.",annotations:{title:"Disconnect git account",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},_meta:{ui:{visibility:"app"}},inputSchema:g$.object({id:g$.string()}),outputSchema:g$.object({deleted:g$.boolean()}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=n(Z);return{deleted:await Z.storage.gitProviderAccounts.delete($.id,Q.id)}}}),cg$=g({name:"REPOSITORY_LIST",description:"List the repositories linked to this organization.",annotations:{title:"List repositories",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},_meta:{ui:{visibility:"app"}},inputSchema:g$.object({accountId:g$.string().optional().describe("Only repositories of this account")}),outputSchema:g$.object({repositories:g$.array(Gp0.extend({usable:g$.boolean()}))}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=n(Z),X=await Z.storage.repositories.listByOrg(Q.id,{accountId:$.accountId}),Y=await JD(Z,Q.id),G=new Set(Y.map((J)=>J.webUrl.toLowerCase()));return{repositories:X.map((J)=>({...tZ1(J),usable:G.has(J.webUrl.toLowerCase())}))}}}),dg$=g({name:"REPOSITORY_SEARCH",description:"Search the repositories an account can reach on its provider (not yet linked). Feeds the repository picker.",annotations:{title:"Search provider repositories",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:g$.object({accountId:g$.string(),query:g$.string().optional(),page:g$.number().int().min(1).optional(),perPage:g$.number().int().min(1).max(100).optional()}),outputSchema:g$.object({repositories:g$.array(qY6),hasMore:g$.boolean()}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=n(Z),X=await yg$(Z,Q.id,$.accountId);return qj({db:Z.db,vault:Z.vault},X).listRepos({query:$.query,page:$.page,perPage:$.perPage})}}),mg$=g({name:"REPOSITORY_LINK",description:"Link a repository to the organization. With an account, the repository is verified against the provider and its facts (id, default branch, visibility) recorded; without one it is linked as an anonymous public clone.",annotations:{title:"Link repository",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:g$.object({url:g$.string().min(1).describe("Repository URL (https or ssh), or a bare path like owner/name when accountId is given"),accountId:g$.string().optional().describe("Account whose credentials access the repository")}),outputSchema:g$.object({repository:Gp0}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=n(Z),X=n0(Z)??null;if(!$.accountId){let H=QW($.url);if(!H)throw Error("Could not recognise the repository URL. Use a full https URL from GitHub or GitLab.");let F=await Z.storage.repositories.upsert({organizationId:Q.id,ref:H,createdBy:X});return{repository:tZ1(F)}}let Y=await yg$(Z,Q.id,$.accountId),G=QW($.url,{provider:Y.type,host:Y.host});if(!G)throw Error("Could not recognise the repository URL or path");if(G.host!==Y.host)throw Error(`Repository is on ${G.host} but the account is on ${Y.host}`);let W=await qj({db:Z.db,vault:Z.vault},Y).getRepo(G);if(!W)throw Error(`${G.path} was not found on ${G.host} or the account cannot access it`);let K=await Z.storage.repositories.upsert({organizationId:Q.id,ref:W.ref,accountId:Y.id,externalId:W.externalId,defaultBranch:W.defaultBranch,visibility:W.visibility,createdBy:X});return{repository:tZ1(K)}}}),ig$=g({name:"REPOSITORY_DELETE",description:"Unlink a repository from the organization. Agents, tasks and syncs that referenced it keep working off their legacy metadata until relinked.",annotations:{title:"Unlink repository",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},_meta:{ui:{visibility:"app"}},inputSchema:g$.object({id:g$.string()}),outputSchema:g$.object({deleted:g$.boolean()}),handler:async($,Z)=>{t(Z),await Z.access.check();let Q=n(Z);return{deleted:await Z.storage.repositories.delete($.id,Q.id)}}})});import{z as Q$}from"zod";async function kl($,Z){let Q=$.organization?.id;if(!Q)throw Error("Organization context required");let X=await Ut($,Q,hT0(Z));if(!X)throw Error(vg$);return X}var MY6,kY6,uT0,VY6,ng$,tg$,og$,rg$,sg$,ag$;var eg$=D(()=>{q0();tZ();pZ1();MY6=Q$.object({id:Q$.string().nullable(),name:Q$.string(),state:Q$.enum(["queued","running","completed"]),conclusion:Q$.enum(["success","failure","neutral","cancelled","skipped","timed_out","action_required"]).nullable(),url:Q$.string().nullable(),durationMs:Q$.number().nullable(),summary:Q$.string().nullable()}),kY6=Q$.object({id:Q$.string(),author:Q$.string(),body:Q$.string(),createdAt:Q$.string(),updatedAt:Q$.string(),url:Q$.string()}),uT0=Q$.object({number:Q$.number(),url:Q$.string(),title:Q$.string(),body:Q$.string(),state:Q$.enum(["open","closed","merged"]),draft:Q$.boolean(),mergedAt:Q$.string().nullable(),base:Q$.string(),head:Q$.string(),headSha:Q$.string(),headRepoPath:Q$.string().nullable(),author:Q$.string(),conflicting:Q$.boolean().nullable(),checks:Q$.enum(["pending","passing","failing"]).nullable(),changedFiles:Q$.number().nullable()}),VY6=uT0.extend({checkRuns:Q$.array(MY6),comments:Q$.array(kY6),unresolvedConversations:Q$.number(),reviewBlocked:Q$.boolean()}),ng$=g({name:"CHANGE_REQUEST_STATE",description:"Read a branch's change request with its CI runs, review state and comments.",annotations:{title:"Read Change Request State",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:Q$.object({...LN,branch:Q$.string().describe("Head branch of the change request to read")}),outputSchema:Q$.object({changeRequest:VY6.nullable()}),handler:async($,Z)=>{return await Z.access.check(),{changeRequest:await(await kl(Z,$)).readDetailed({branch:$.branch})}}}),tg$=g({name:"CHANGE_REQUEST_LAST_MERGED",description:"Read the most recently merged change request into a base branch \u2014 in Fast Preview, the last publish.",annotations:{title:"Read Last Merged Change Request",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:Q$.object({...LN,base:Q$.string().describe("Branch it was merged into")}),outputSchema:Q$.object({changeRequest:uT0.nullable()}),handler:async($,Z)=>{return await Z.access.check(),{changeRequest:await(await kl(Z,$)).lastMergedInto($.base)}}}),og$=g({name:"CHANGE_REQUEST_LIST_OPEN",description:"List a repository's open change requests, most recently updated first.",annotations:{title:"List Open Change Requests",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:Q$.object({...LN,limit:Q$.number().int().min(1).max(100).default(50)}),outputSchema:Q$.object({changeRequests:Q$.array(uT0)}),handler:async($,Z)=>{return await Z.access.check(),{changeRequests:await(await kl(Z,$)).listOpen($.limit)}}}),rg$=g({name:"CHANGE_REQUEST_CHECK_LOG",description:"Read one CI run's report \u2014 a GitHub check run's output markdown, or the tail of a GitLab job's trace.",annotations:{title:"Read CI Run Report",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:Q$.object({...LN,checkId:Q$.string().describe("Provider id of the run, from its listing")}),outputSchema:Q$.object({report:Q$.string().nullable()}),handler:async($,Z)=>{return await Z.access.check(),{report:await(await kl(Z,$)).readCheckLog($.checkId)}}}),sg$=g({name:"CHANGE_REQUEST_OPEN",description:"Propose a branch onto another. Returns the branch's existing change request instead of failing when it already has one.",annotations:{title:"Open Change Request",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:Q$.object({...LN,head:Q$.string().describe("Branch being proposed"),base:Q$.string().describe("Branch it should land on"),title:Q$.string(),body:Q$.string().optional()}),outputSchema:Q$.object({changeRequest:uT0,existed:Q$.boolean()}),handler:async($,Z)=>{await Z.access.check();let Q=await kl(Z,$),X=await Q.readForBranch($.head);if(X&&X.state==="open"){if($.body&&$.body!==X.body)await Q.describe(X.number,$.body);return{changeRequest:$.body?{...X,body:$.body}:X,existed:!0}}return{changeRequest:await Q.open({head:$.head,base:$.base,title:$.title,body:$.body}),existed:!1}}}),ag$=g({name:"CHANGE_REQUEST_MERGE",description:"Land a change request. Reports why it could not merge rather than throwing.",annotations:{title:"Merge Change Request",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1,openWorldHint:!0},_meta:{ui:{visibility:"app"}},inputSchema:Q$.object({...LN,number:Q$.number().int().positive(),strategy:Q$.enum(["any","squash"]).default("any").describe("`squash` when the result must be one commit; `any` uses whatever the repository allows"),commitTitle:Q$.string().optional(),commitMessage:Q$.string().optional()}),outputSchema:Q$.object({merged:Q$.boolean(),reason:Q$.enum(["conflict","blocked","rate_limited","not_found","error"]).optional(),detail:Q$.string().optional()}),handler:async($,Z)=>{await Z.access.check();let X=await(await kl(Z,$)).merge($.number,{strategy:$.strategy,commitTitle:$.commitTitle,commitMessage:$.commitMessage});return X.merged?{merged:!0}:{merged:!1,reason:X.reason,detail:X.detail}}})});import{z as _6}from"zod";function lT0($){if(!$)return"";return typeof $==="string"?$:$.toISOString()}function $h$($){let Z=$.trim();return Z.length>0?Z:void 0}function Zh$($,Z){return $===void 0||$.includes(Z)}var CY6,_Y6,vY6,fY6,bY6,xY6,oZ1;var Qh$=D(()=>{q0();os0();CY6=["thread","task"],_Y6=_6.object({type:_6.literal("thread"),id:_6.string(),title:_6.string(),created_at:_6.string(),updated_at:_6.string(),virtual_mcp_id:_6.string().nullable(),run_config:_6.record(_6.string(),_6.unknown()).nullable(),status:_6.string().nullable()}),vY6=_6.object({type:_6.literal("task"),id:_6.string(),title:_6.string(),created_at:_6.string(),updated_at:_6.string(),key:_6.string().nullable(),status:_6.string().nullable(),repo:_6.string().nullable()}),fY6=_6.discriminatedUnion("type",[_Y6,vY6]),bY6=_6.object({query:_6.string().max(256).describe("Free-text search query. Empty string returns the most recently updated resources."),limit:_6.number().int().min(1).max(50).optional().describe("Maximum results per resource type (default: 20)."),types:_6.array(_6.enum(CY6)).optional().describe("Restrict the search to specific resource types. Omit to search across all available types.")}),xY6=_6.object({items:_6.array(fY6),totalCount:_6.number()});oZ1=g({name:"GLOBAL_SEARCH",description:"Search across organization resources by free-text query. Returns a typed union of matches (currently: threads and task-board cards). New resource types may be added over time without changes to the call shape.",annotations:{title:"Global Search",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:bY6,outputSchema:xY6,handler:async($,Z)=>{await Z.access.check();let Q=n(Z),X=$.limit??20,Y=Zh$($.types,"thread"),G=Zh$($.types,"task"),J=[],W=0;if(Y){let{threads:K,total:H}=await Z.storage.threads.list(void 0,{limit:X,offset:0,search:$h$($.query),includeArchived:!1});W+=H;for(let F of K)J.push({type:"thread",id:F.id,title:F.title??"",created_at:lT0(F.created_at),updated_at:lT0(F.updated_at),virtual_mcp_id:F.virtual_mcp_id??null,run_config:F.run_config??null,status:CJ(F).status})}if(G){let K=await Z.storage.taskBoard.searchByTitle(Q.id,$h$($.query)??"",X);W+=K.length;for(let H of K)J.push({type:"task",id:H.id,title:H.title??"",created_at:lT0(H.createdAt),updated_at:lT0(H.updatedAt),key:Q.slug?rL0(Q.slug,H.keySeq):null,status:H.status??null,repo:H.repo??null})}return{items:J,totalCount:W}}})});var Xh$=D(()=>{Qh$()});var d70={};T4(d70,{toolSubsetMCP:()=>rZ1,managementMCP:()=>Zu,managementContextStore:()=>aU,listManagementTools:()=>gY6,TOOL_BY_NAME:()=>Vl,CORE_TOOLS:()=>Gh$});import{z as Yh$}from"zod";async function gY6($){let Z=await Zu($),[Q,X]=Fn.createLinkedPair();await Z.connect(X);let Y=new d9({name:"tools-hydration",version:"1.0.0"},{jsonSchemaValidator:j5});try{return await Y.connect(Q),(await Y.listTools()).tools}finally{await Y.close().catch(()=>{}),await Z.close().catch(()=>{})}}var Gh$,Vl,rZ1=($,Z)=>{let Q=new TK({name:$,version:"1.0.0"},{capabilities:{tools:{}},jsonSchemaValidator:j5});for(let X of Z){let Y=Vl.get(X);if(!Y){console.warn(`[${$}] unknown tool "${X}" \u2014 not registered`);continue}let{config:G,handler:J}=na(Y);Q.registerTool(Y.name,G,J)}return Q},Zu=async($)=>{let Z=new TK({name:"mcp-cms-management",version:"1.0.0"},{capabilities:{tools:{},prompts:{},resources:{}},jsonSchemaValidator:j5});for(let Y of Vl.values()){let{config:G,handler:J}=na(Y);Z.registerTool(Y.name,G,J)}let Q=zT0();for(let Y of Q){let G=Y.arguments?.length?Object.fromEntries(Y.arguments.map((J)=>{let W=J.required?Yh$.string():Yh$.string().optional();return[J.name,J.description?W.describe(J.description):W]})):void 0;Z.registerPrompt(Y.name,{title:Y.title,description:Y.description,...G?{argsSchema:G}:{}},(J)=>{return{messages:[{role:"user",content:{type:"text",text:typeof Y.text==="function"?Y.text(J??{}):Y.text}}]}})}if($.organization?.id){let Y=await $.storage.brandContext.list($.organization.id),G=new Set;for(let J of Y){let W=J.name.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,""),K=W?`brand-${W}`:`brand-${J.id}`;if(G.has(K))K=`${K}-${J.id.slice(0,8)}`;G.add(K);let H=[`# Brand: ${J.name}`,"",`**Domain:** ${J.domain}`,"","## Overview",J.overview];if(J.colors){let U=Object.entries(J.colors).filter(([,N])=>N);if(U.length>0){H.push("","## Colors");for(let[N,B]of U)H.push(`- **${N}:** ${B}`)}}if(J.fonts){let U=Object.entries(J.fonts).filter(([,N])=>N);if(U.length>0){H.push("","## Fonts");for(let[N,B]of U)H.push(`- ${B} (${N})`)}}if(J.logo)H.push("",`**Logo:** ${J.logo}`);if(J.favicon)H.push(`**Favicon:** ${J.favicon}`);if(J.ogImage)H.push(`**OG Image:** ${J.ogImage}`);if(J.images&&J.images.length>0){H.push("","## Images");for(let U of J.images){let N=Object.entries(U).map(([B,O])=>`${B}: ${O}`).join(", ");H.push(`- ${N}`)}}let F=H.join(`
2682
2682
  `);Z.prompt(K,`Brand context for ${J.name}`,()=>({messages:[{role:"user",content:{type:"text",text:F}}]}))}}let X=zb$();for(let Y of X)Z.resource(Y.name,Y.uri,{description:Y.description,mimeType:Y.mimeType??"text/markdown"},async(G)=>{return{contents:[{uri:typeof G==="string"?G:G.href,mimeType:Y.mimeType??"text/markdown",text:Y.text}]}});return Z};var gO=D(()=>{AK();Hi();XQ();T0$();b0$();N$$();w$$();_$$();g$$();v8$();eE$();Wj$();Bj$();Ej$();Gz$();Hz$();BT$();LT$();zT$();Af$();Sf$();_f$();gf$();of$();PZ1();PT0();PT0();pb$();kg$();Sg$();_g$();pg$();eg$();Xh$();Gh$=[ji0,zi0,Pi0,Ai0,Ti0,Ri0,qi0,$j$,Qj$,Yj$,Gj$,o_,p_,n_,t_,L01,E01,j01,P01,A01,T01,i_,R01,M01,k01,V01,S01,Ka0,f01,b01,x01,y01,C01,_01,jo0,Ii0,Mi0,ki0,Vi0,Si0,_i0,vi0,fi0,yi0,gi0,hi0,ui0,li0,ci0,di0,mi0,ii0,pi0,ni0,ti0,si0,ei0,Yp0,JZ1,BZ1,OZ1,Im0,Kj,Hj,mm0,im0,pm0,Em0,wm0,Om0,Dm0,Uj,Nj,Bj,Oj,Dj,D$$,Bi0,Oi0,Di0,wi0,Li0,Hm0,Um0,Nm0,Fm0,M11,k11,V11,m01,k_,V_,p01,n01,S_,h01,u01,l01,c01,d01,t01,o01,r01,z11,P11,A11,T11,R11,q11,I11,wj,Lj,Ej,Ni0,k81,V81,S81,C81,_81,v81,f81,b81,x81,y81,g81,l81,c81,OT$,DT$,wT$,i81,p81,e91,ZZ1,QZ1,XZ1,YZ1,GZ1,Cf$,vf$,ff$,bf$,xf$,yf$,mf$,if$,pf$,nf$,tf$,EZ1,jZ1,zZ1,f_,b_,x_,y_,AZ1,TZ1,RZ1,qZ1,IZ1,MZ1,...Mg$,Zs0,dZ1,mZ1,gg$,hg$,ug$,lg$,cg$,dg$,mg$,ig$,nZ1,ng$,tg$,og$,rg$,sg$,ag$,oZ1],Vl=new Map(Gh$.map(($)=>[$.name,$]))});import{z as Jh$}from"zod";function hY6($){return[{permissions:{self:["*"]},getTools:async()=>{let{CORE_TOOLS:Z}=await Promise.resolve().then(() => (gO(),d70));return Z.map((Q)=>{return{name:Q.name,inputSchema:Jh$.toJSONSchema(Q.inputSchema,{unrepresentable:"any"}),outputSchema:Q.outputSchema?Jh$.toJSONSchema(Q.outputSchema,{unrepresentable:"any"}):void 0,description:Q.description}})},data:Bc1(K9(),$)},{data:Nc1()},{data:Uc1($)}]}async function Wh$($,Z){try{let Q=Z8(),X=M0();await Q.db.insertInto("organization_billing").values({organization_id:$}).onConflict((W)=>W.column("organization_id").doNothing()).execute();let Y=new oQ(X.encryptionKey),G=new Li(Q.db,Y),J=hY6($);await Promise.all(J.map(async(W)=>{let K=null;if(W.permissions)K=(await Q8.api.createApiKey({body:{name:`${W.data.app_name??crypto.randomUUID()}-mcp`,userId:Z,permissions:W.permissions,rateLimitEnabled:!1,metadata:{organization:{id:$},purpose:"default-org-connections"}}}))?.key;let H=await Fg({id:"pending",title:W.data.title,connection_type:W.data.connection_type,connection_url:W.data.connection_url,connection_token:W.data.connection_token??K,connection_headers:W.data.connection_headers}).catch(()=>null),F=await W.getTools?.()??H?.tools??null,U=H?.scopes?.length?H.scopes:null,N=W.data.id?W.data.id.startsWith(`${$}_`)?W.data.id:`${$}_${W.data.id}`:void 0;await G.create({...W.data,id:N,tools:F,configuration_scopes:U,organization_id:$,created_by:Z,connection_token:W.data.connection_token??K})}));try{await Km0({orgId:$,createdBy:Z})}catch(W){console.error("Failed to enqueue studio pack install:",W)}if(X.aiGatewayEnabled&&X.studioProvisionSecretKey&&MO.provisionKey)try{let W=await UK(Z),K=await MO.provisionKey(W,$);await new Kn(Q.db,Y).upsert({providerId:"deco",label:"Auto-provisioned",apiKey:K,organizationId:$,createdBy:Z})}catch(W){console.error("Failed to auto-provision Deco AI Gateway key:",W)}}catch(Q){console.error("Error creating default MCP connections:",Q)}}var Kh$=D(()=>{k8();F70();C5();NJ();zB();pd0();ju0();N70();E$();JG();w70();jB()});import{createHash as uY6}from"crypto";function Hh$($){let Z=$;while(Z?.[cT0])Z=Z[cT0];return Z}function aZ1($){let{objectStorage:Z,baseUrl:Q,orgSlug:X,prefix:Y="connection-icons",maxBytes:G=cY6,dryRun:J=!1}=$;return async(W)=>{if(typeof W!=="string")return W;let K=W.match(lY6);if(!K)return W;if(!Z||!X)return W;let[,H,F]=K,U=H.toLowerCase(),N=mY6[U];if(!N)return W;if(Math.floor(F.length*3/4)>G)return console.warn(`[asset-hoister] asset exceeds ${G} bytes, keeping inline`),W;let B=Buffer.from(F,"base64"),O=uY6("sha256").update(B).digest("hex"),w=`${Y}/${O}.${N}`;if(J)return ab(Q,X,w);try{return await Z.put(w,B,{contentType:U}),ab(Q,X,w)}catch(L){return console.error("[asset-hoister] upload failed, keeping inline asset:",L),W}}}async function sZ1($,Z,Q=0){if(Q>dY6)return $;if(typeof $==="string")return await Z($)??$;if(Array.isArray($)){let X=await Promise.all($.map((Y)=>sZ1(Y,Z,Q+1)));return X.some((Y,G)=>Y!==$[G])?X:$}if($!==null&&typeof $==="object"){let X=Object.entries($),Y=await Promise.all(X.map(([,W])=>sZ1(W,Z,Q+1))),G=!1,J={};return X.forEach(([W,K],H)=>{if(J[W]=Y[H],Y[H]!==K)G=!0}),G?J:$}return $}async function Qe($,Z){let Q={...$};if(typeof Q.icon==="string")Q.icon=await Z(Q.icon);if(Q.metadata!==null&&typeof Q.metadata==="object")Q.metadata=await sZ1(Q.metadata,Z);return Q}function iY6($,Z){return new Proxy($,{get(Q,X,Y){if(X===cT0)return Q;if(X==="create")return async(J)=>Q.create(await Qe(J,Z));if(X==="createNew")return async(J)=>Q.createNew(await Qe(J,Z));if(X==="update")return async(J,W)=>Q.update(J,await Qe(W,Z));let G=Reflect.get(Q,X,Y);return typeof G==="function"?G.bind(Q):G}})}function pY6($,Z){return new Proxy($,{get(Q,X,Y){if(X===cT0)return Q;if(X==="create")return async(J,W,K,H)=>Q.create(J,W,await Qe(K,Z),H);if(X==="update")return async(J,W,K)=>Q.update(J,W,await Qe(K,Z));let G=Reflect.get(Q,X,Y);return typeof G==="function"?G.bind(Q):G}})}function eZ1($,Z){let Q=aZ1(Z);if(Fh$($.connections))$.connections=iY6(Hh$($.connections),Q);if(Fh$($.virtualMcps))$.virtualMcps=pY6(Hh$($.virtualMcps),Q)}function Fh$($){return $!==null&&typeof $==="object"}var lY6,cY6=5242880,dY6=64,cT0,mY6;var $71=D(()=>{T3();lY6=/^data:((?:image|audio|video)\/[^;,]+)(?:;[^,]+)?;base64,(.+)$/is,cT0=Symbol("assetHoistingTarget"),mY6={"image/png":"png","image/jpeg":"jpg","image/gif":"gif","image/webp":"webp","image/x-icon":"ico","image/vnd.microsoft.icon":"ico","audio/mpeg":"mp3","audio/mp4":"m4a","audio/wav":"wav","audio/x-wav":"wav","audio/ogg":"ogg","audio/webm":"weba","audio/aac":"aac","video/mp4":"mp4","video/webm":"webm","video/ogg":"ogv","video/quicktime":"mov"}});async function Uh$($,Z){let Q=tY();if(!Q)return Z;let X=await Z8().db.selectFrom("organization").select("slug").where("id","=",$).executeTakeFirst();if(!X?.slug)return Z;return await aZ1({objectStorage:R3(Q,$),baseUrl:K9(),orgSlug:X.slug,prefix:"org-logos"})(Z)??Z}var Nh$=D(()=>{NJ();dL();$71();C5()});function nY6($,Z){let Q=$.email.split("@")[1]?.toLowerCase()??null;return{distinctId:$.id,properties:{$set:{email:$.email,name:$.name,email_verified:$.emailVerified},$set_once:{first_seen_at:Z.toISOString(),signup_email_domain:Q}}}}function Z71($){V1.identify(nY6($,new Date))}var Bh$=D(()=>{g4()});import{adminAc as Oh$,memberAc as tY6}from"@decocms/better-auth/plugins/organization/access";function X71($){let Z=["*",...$];return{user:{self:[...P60],...tY6.statements},admin:{self:Z,...Oh$.statements},owner:{self:Z,...Oh$.statements}}}function oY6($,Z){for(let[Q,X]of Object.entries(Z)){let Y=$[Q];if(!Y)return!1;for(let G of X)if(!Y.includes(G)&&!Y.includes("*"))return!1}return!0}function Dh$($,Z,Q){if(!$)return"fallback";if($.includes(","))return"fallback";if(!Nx.includes($))return"fallback";let X=Q[$];if(!X)return"fallback";return oY6(X,Z)?"grant":"deny"}function wh$(){if(!Q71){let $=Object.values(oL()).flatMap((Z)=>Z.map((Q)=>Q.name));Q71=X71($)}return Q71}var Q71;var Y71=D(()=>{Ux();rQ()});import{decodeJwt as rY6}from"jose";import{sql as Xe}from"kysely";async function eY6($){let{user:Z,token:Q}=$;if(!Q?.idToken)return;let X;try{X=rY6(Q.idToken)}catch{return}let{preferred_username:Y,upn:G}=X,J=[Y,G].filter((H)=>typeof H==="string"&&H.length>0&&H.toLowerCase()!==Z.email.toLowerCase()).map((H)=>H.toLowerCase());if(J.length===0)return;let{db:W}=Z8(),K=await W.selectFrom("user").selectAll().where("email","in",J).where("id","!=",Z.id).executeTakeFirst();if(!K)return;try{await W.transaction().execute(async(H)=>{await Xe`UPDATE "account" SET "userId" = ${K.id} WHERE "userId" = ${Z.id}`.execute(H),await Xe`UPDATE "session" SET "userId" = ${K.id} WHERE "userId" = ${Z.id}`.execute(H),await Xe`
2683
2683
  UPDATE "member" SET "userId" = ${K.id}
2684
2684
  WHERE "userId" = ${Z.id}
@@ -2926,7 +2926,7 @@ Respond with ONLY a JSON object of this shape, and nothing else:
2926
2926
  ${G.join(`
2927
2927
  `)}`:Y}function Jj6($){let Z=new Set;for(let Q of $)for(let X of Q.split(`
2928
2928
  `)){let Y=X.trim();if(/^Co-authored-by:\s/i.test(Y))Z.add(Y)}return[...Z]}var Ln$=200,rE6=12,aE6,$j6=300,wR0=3;var kY1=D(()=>{tZ();DR0();aE6={aheadBy:0,behindBy:0,files:[]}});function Kj6($){if(!$||$.includes(".."))return!1;return Wj6.test($)}function jn$($){let Z=typeof $.__resolveType==="string"?$.__resolveType:null;if(!Z||!Kj6(Z))return null;let{__resolveType:Q,...X}=$;return{resolveType:Z,payload:X}}function zn$($,Z){return`${$.replace(/\/+$/,"")}/deco/invoke/${Z}`}var Wj6;var Pn$=D(()=>{Wj6=/^[\w./@-]+$/});function $00($,Z){let Q=$?.githubRepo;if(!Q?.owner||!Q?.name)return null;if(!Q.connectionId)return Q;if(!Z.includes(Q.connectionId))return null;return Q}async function Tn$($,Z,Q,X){let Y=$.organization?.id;if(!Y)throw new gw(wZ);let G=await GD($.storage,Y,X);if(G&&await EU($.storage,G)){let F=await tK($,G,{forceRefresh:!0}).catch((U)=>{throw new gw(U instanceof Error?U.message:wZ)});await An$($,Z,Q,F);return}let J=X.connectionId??G?.legacyConnectionId;if(!J)throw new gw("Push requires a connected git account. Connect the repository's provider for this project and restart the sandbox.");await gg({ctx:$,connectionId:J,organizationId:Y,forceRefresh:!0,onLegacyMintError:(F)=>{let U=F instanceof Error?F.message:wZ;throw new gw(U)}});let{cloneUrl:W,gitUserName:K,gitUserEmail:H}=await oK(J,X.owner,X.name,$.db,$.vault).catch((F)=>{let{code:U,message:N}=p4$(F instanceof Error?F.message:String(F));throw U?new gw(N):F});await An$($,Z,Q,{cloneUrl:W,gitUserName:K,gitUserEmail:H})}async function An$($,Z,Q,X){let{cloneUrl:Y,gitUserName:G,gitUserEmail:J}=X,W=Yc($),K=await Z.proxyDaemonRequest(Q,"/_sandbox/config",{method:"PUT",headers:new Headers({"content-type":"application/json"}),body:JSON.stringify({git:{repository:{cloneUrl:Y},identity:{userName:G,userEmail:J}},...W?{operator:W}:{}})});if(!K.ok){let H=await bD(K,Hj6).catch(()=>K.statusText);throw Error(`Failed to refresh sandbox git credentials (${K.status}): ${H}`)}}var Hj6=10485760,gw;var VY1=D(()=>{LJ();JR0();Po();vQ0();Dt();tZ();gw=class gw extends Error{constructor($){super($);this.name="GitPushAuthError"}}});function Uj6($){let Z=$.startsWith("thread:")?$.slice(7):$;if(!Z||Z.length>255||Z.includes("..")||Z.startsWith("/")||Z.endsWith("/")||Z.endsWith(".lock")||!Fj6.test(Z))throw Error(`Invalid branch name: ${$}`)}function If($){return AbortSignal.any([$.req.raw.signal,AbortSignal.timeout(Bj6)])}async function Dj6($,Z){let Q=$.var.studioContext,X=XH(Z.branch),Y=$.req.query("thread")??X,G=Y&&Y===X?Z.branchThread:Y?await Q.storage.threads.get(Y).catch(()=>null):null,J=G?.virtual_mcp_id===Z.virtualMcpId?G:null,W=R_(J?.metadata?.runtime);if(W)return W;let K=AL0(Z.virtualMcpMetadata),H=K==="cms"?await KY1(Q,{claimName:Z.claimName}):"alive",F=K==="cms"&&H!=="alive"?"cms":"sandbox",U=!!J&&(H==="gone"||H==="alive"&&K==="cms");if(U&&J)Ao(Q,J.id,F);if(K==="cms")console.log("sandbox proxy: no runtime stamp",{route:$.req.path,method:$.req.method,reason:J?"unstamped":"threadless",liveness:H,resolved:F,stamped:U});return F}async function wj6($){let Z=$.get("vmClaim");if(Z.runner)return Z.runner;try{return await EX($.var.studioContext)}catch{return null}}function Mf($){let{runner:Z}=$.get("vmClaim");if(!Z)return $.json({error:"No sandbox runner configured"},503);return Z}async function Hc($){let{virtualMcpMetadata:Z,connectionIds:Q}=$.get("vmClaim"),X=$.var.studioContext,Y=$00(Z,Q);if(!Y)throw new A1({provider:"github",status:404,message:"Project has no GitHub repository"});let G=n(X);return xg(X,G.id,Y)}function SY1($,Z){let Q=Z instanceof Error?Z.message:String(Z),X=f8$(Z);if(X!==void 0)return $.json({error:Q},429,{...N5,...X===null?{}:{"Retry-After":String(Math.ceil(X/1000))}});if(Z instanceof x5)return $.json({error:Q},409,N5);let Y=zJ(Z);if(Y!==null){let G=Y===404?404:Y===409||Y===422?409:502;return $.json({error:Q},G,N5)}return $.json({error:Q},502,N5)}async function In$($,Z,Q){let X;try{X=await fetch(Z,Q)}catch{return $.json({error:"Preview unreachable"},502)}let Y;try{Y=await X.text()}catch{return $.json({error:"Preview unreachable"},502)}return new Response(Y,{status:X.status,headers:{"content-type":X.headers.get("content-type")??"application/json"}})}async function Mn$($){try{let Z=await Hc($),Q=await LR0(Z,$.get("vmClaim").branch);return $.json(Q,200,N5)}catch(Z){return SY1($,Z)}}function Z00($,Z){let X=(zR0.get($)??Promise.resolve()).catch(()=>{}).then(Z),Y=X.catch(()=>{});return zR0.set($,Y),Y.finally(()=>{if(zR0.get($)===Y)zR0.delete($)}),X}async function G7($,Z,Q){if(!Q?.runner&&$.get("vmClaim").runtime==="cms")return $.json({error:"sandbox not found: this session is sandbox-less"},404,N5);let X=Q?.runner??Mf($);if(X instanceof Response)return X;let{claimName:Y,userId:G,projectRef:J}=$.get("vmClaim"),W=Q?.method??"POST",K=null,H=new Headers;if(Q?.jsonBody!==void 0)K=Q.jsonBody,H.set("content-type","application/json");else if(Q?.forwardJsonBody)K=await $.req.text(),H.set("content-type","application/json");let F=Q?.signal,U={method:W,headers:H,body:K,...F?{signal:F}:{}},N=async()=>{let B=await X.proxyDaemonRequest(Y,Z,U);if(Q?.map404to410&&B.status===404){try{await B.body?.cancel()}catch{}if(await X.adoptLiveClaim({userId:G,projectRef:J},Y))B=await X.proxyDaemonRequest(Y,Z,U);if(B.status===404){try{await B.body?.cancel()}catch{}return new Response(JSON.stringify({error:"Sandbox handle is gone. The sandbox needs to be re-provisioned."}),{status:410,headers:{"content-type":"application/json",...N5}})}}let O=await B.text(),w=Q?.redactRepoDir?Lj6(O):O,L=B.headers.get("content-type")??"application/json";return new Response(w,{status:B.status,headers:{"content-type":L,...N5}})};try{if(F){let B=N();return B.catch(()=>{}),await Promise.race([B,new Promise((w,L)=>{if(F.aborted)return L(F.reason);F.addEventListener("abort",()=>L(F.reason),{once:!0})})])}return await N()}catch(B){let O=B instanceof Error?B.message:String(B);return $.json({error:`Daemon unreachable: ${O}`},502)}}function Lj6($){try{let Z=JSON.parse($);if(Z&&typeof Z==="object"&&!Array.isArray(Z)&&"repoDir"in Z)return JSON.stringify({...Z,repoDir:null})}catch{}return $}async function PR0($,Z,Q,X="GET",Y){let G=await $.proxyDaemonRequest(Z,Q,{method:X,headers:new Headers,body:null});if(G.status===404&&Y){try{await G.body?.cancel()}catch{}if(await $.adoptLiveClaim(Y,Z))G=await $.proxyDaemonRequest(Z,Q,{method:X,headers:new Headers,body:null})}if(G.status===404){try{await G.body?.cancel()}catch{}throw Error("SANDBOX_GONE")}let J=await G.text();if(!G.ok){let W=`Daemon error (${G.status})`;try{W=JSON.parse(J).error??W}catch{}throw Error(W)}return JSON.parse(J)}function Ej6($){return kn$.includes($)}var Fj6,Rn$=524288,Nj6=65536,Bj6=1e4,qn$=2000,Oj6,zR0,N5,kn$,Vn$=()=>{let $=new Q1;$.use("/:virtualMcpId/:branch/*",Oj6),$.post("/:virtualMcpId/:branch/write",(Q)=>G7(Q,"/_sandbox/write",{forwardJsonBody:!0,signal:If(Q)})),$.post("/:virtualMcpId/:branch/unlink",(Q)=>G7(Q,"/_sandbox/unlink",{forwardJsonBody:!0,signal:If(Q)})),$.post("/:virtualMcpId/:branch/mkdir",(Q)=>G7(Q,"/_sandbox/mkdir",{forwardJsonBody:!0,signal:If(Q)})),$.post("/:virtualMcpId/:branch/rename",(Q)=>G7(Q,"/_sandbox/rename",{forwardJsonBody:!0,signal:If(Q)})),$.post("/:virtualMcpId/:branch/read",(Q)=>G7(Q,"/_sandbox/read",{forwardJsonBody:!0,signal:If(Q)})),$.post("/:virtualMcpId/:branch/glob",(Q)=>G7(Q,"/_sandbox/glob",{forwardJsonBody:!0,signal:If(Q)})),$.post("/:virtualMcpId/:branch/grep",(Q)=>G7(Q,"/_sandbox/grep",{forwardJsonBody:!0,signal:If(Q)})),$.post("/:virtualMcpId/:branch/exec/:script",async(Q)=>{let X=Q.req.param("script");if(!X)return Q.json({error:"missing script name"},400);return G7(Q,`/_sandbox/exec/${encodeURIComponent(X)}`)}),$.post("/:virtualMcpId/:branch/exec/:script/kill",async(Q)=>{let X=Q.req.param("script");if(!X)return Q.json({error:"missing script name"},400);return G7(Q,`/_sandbox/exec/${encodeURIComponent(X)}/kill`)}),$.get("/:virtualMcpId/:branch/config",(Q)=>G7(Q,"/_sandbox/config",{method:"GET",map404to410:!0,redactRepoDir:!0})),$.put("/:virtualMcpId/:branch/config",(Q)=>G7(Q,"/_sandbox/config",{method:"PUT",forwardJsonBody:!0,map404to410:!0})),$.post("/:virtualMcpId/:branch/setup/:step",async(Q)=>{let X=Q.req.param("step");if(!X||!Ej6(X))return Q.json({error:`step must be one of: ${kn$.join(", ")}`},400);let Y=Q.get("vmClaim"),G=await KY1(Q.var.studioContext,{claimName:Y.claimName})==="gone"?null:await wj6(Q);if(!G)return Q.json({error:"sandbox not found: nothing is running at this ref"},404,N5);if(X==="start"){let J=n(Q.var.studioContext),W=zh(Y.virtualMcpMetadata);try{await EL0({ctx:Q.var.studioContext,runner:G,handle:Y.claimName,orgId:J.id,userId:Y.callerUserId,entries:W})}catch(K){let H=K instanceof Error?K.message:String(K);return Q.json({error:`Failed to push env to daemon: ${H}`},502)}}return G7(Q,`/_sandbox/setup/${X}`,{signal:Q.req.raw.signal,map404to410:!0,runner:G})}),$.get("/:virtualMcpId/:branch/events",(Q)=>{let X=Q.get("vmClaim");if(!X.runner)return MN(Q,async(Y)=>{await Y.writeSSE({event:"phase",data:JSON.stringify({kind:"failed",reason:"unknown",message:"No sandbox runner configured on this studio instance."})})});return kp$(Q,{ctx:Q.var.studioContext,claimName:X.claimName,runner:X.runner,virtualMcpId:X.virtualMcpId,branch:X.branch,userId:X.userId,projectRef:X.projectRef,virtualMcpMetadata:X.virtualMcpMetadata})}),$.get("/:virtualMcpId/:branch/git/status",(Q)=>{if(Q.get("vmClaim").runtime==="cms")return Mn$(Q);return Z(Q)});let Z=(Q)=>G7(Q,"/_sandbox/git/status",{method:"GET",map404to410:!0,signal:AbortSignal.any([Q.req.raw.signal,AbortSignal.timeout(qn$)])});return $.post("/:virtualMcpId/:branch/git/status",(Q)=>{if(Q.get("vmClaim").runtime==="cms")return Mn$(Q);return G7(Q,"/_sandbox/git/status",{map404to410:!0,signal:AbortSignal.any([Q.req.raw.signal,AbortSignal.timeout(qn$)])})}),$.post("/:virtualMcpId/:branch/git/diff",async(Q)=>{let X=Q.get("vmClaim");if(X.runtime==="cms")try{let Y=await Q.req.json().catch(()=>({})),G=await Hc(Q),J=await ER0(G,X.branch,Y.base);return Q.json(J,200,N5)}catch(Y){return SY1(Q,Y)}return G7(Q,"/_sandbox/git/diff",{forwardJsonBody:!0,map404to410:!0})}),$.post("/:virtualMcpId/:branch/git/publish",async(Q)=>{if(Q.get("vmClaim").runtime==="cms")return Q.json({ok:!0},200,N5);let X=Mf(Q);if(X instanceof Response)return X;let{claimName:Y,virtualMcpMetadata:G,connectionIds:J}=Q.get("vmClaim"),W=Q.var.studioContext;return Z00(Y,async()=>{try{await HY1(W,X,Y);let K=$00(G,J);if(K)await Tn$(W,X,Y,K)}catch(K){if(K instanceof gw)return Q.json({error:K.message},403,N5);let H=K instanceof Error?K.message:String(K);return Q.json({error:H},502,N5)}return G7(Q,"/_sandbox/git/publish",{forwardJsonBody:!0,map404to410:!0})})}),$.post("/:virtualMcpId/:branch/git/discard",async(Q)=>{let X=Q.get("vmClaim");if(X.runtime==="cms")return Z00(X.claimName,async()=>{let Y=await Q.req.json().catch(()=>({})),G=Array.isArray(Y.filepaths)?Y.filepaths.filter((J)=>typeof J==="string"):[];if(G.length===0)return Q.json({error:"filepaths is required"},400,N5);try{let J=await Hc(Q);return await En$(J,X.branch,G),Q.json({ok:!0},200,N5)}catch(J){let W=zJ(J)===409||J instanceof x5?409:502,K=J instanceof Error?J.message:String(J);return Q.json({error:K},W,N5)}});return Z00(X.claimName,()=>G7(Q,"/_sandbox/git/discard",{forwardJsonBody:!0,map404to410:!0}))}),$.post("/:virtualMcpId/:branch/git/rebase",async(Q)=>{let X=Q.get("vmClaim");if(X.runtime==="cms")return Z00(X.claimName,async()=>{try{let W=await Q.req.json().catch(()=>({})),K=await Hc(Q),H=W.base??await K.getDefaultBranch();return await jR0(K,X.branch,H),Q.json({ok:!0},200,N5)}catch(W){return SY1(Q,W)}});let Y=Mf(Q);if(Y instanceof Response)return Y;let{claimName:G}=Q.get("vmClaim"),J=Q.var.studioContext;return Z00(G,async()=>{try{await HY1(J,Y,G)}catch(W){let K=W instanceof Error?W.message:String(W);return Q.json({error:K},502,N5)}return G7(Q,"/_sandbox/git/rebase",{forwardJsonBody:!0,map404to410:!0})})}),$.post("/:virtualMcpId/:branch/git/suggest-commit",Z9({maxSize:Rn$,onError:(Q)=>Q.json({error:"Payload too large"},413,N5)}),async(Q)=>{let X=Q.get("vmClaim"),Y=null;if(X.runtime!=="cms"){let H=Mf(Q);if(H instanceof Response)return H;Y=H}let{claimName:G,userId:J,projectRef:W}=X,K=Q.var.studioContext;try{let H=await Q.req.json().catch(()=>({})),F=H.status,U=H.diff,N=U!=null&&typeof U.diffs==="object"&&U.diffs!==null,[B,O]=NY1(F)&&N?[F,U]:Y?await Promise.all([PR0(Y,G,"/_sandbox/git/status","GET",{userId:J,projectRef:W}),PR0(Y,G,"/_sandbox/git/diff","GET",{userId:J,projectRef:W})]):await(async()=>{let L=await Hc(Q);return Promise.all([LR0(L,X.branch),ER0(L,X.branch)])})(),w=await vp$(K,B,O);return Q.json(w,200,N5)}catch(H){let F=H instanceof Error?H.message:String(H);if(F==="SANDBOX_GONE")return Q.json({error:"Sandbox handle is gone. The sandbox needs to be re-provisioned."},410,N5);return Q.json({error:F},502,N5)}}),$.post("/:virtualMcpId/:branch/git/judge-review",Z9({maxSize:Rn$,onError:(Q)=>Q.json({error:"Payload too large"},413,N5)}),async(Q)=>{let X=Q.get("vmClaim"),Y=null;if(X.runtime!=="cms"){let H=Mf(Q);if(H instanceof Response)return H;Y=H}let{claimName:G,userId:J,projectRef:W}=X,K=Q.var.studioContext;try{let H=await Q.req.json().catch(()=>({})),F=H.status,U=H.diff,N=U!=null&&typeof U.diffs==="object"&&U.diffs!==null,[B,O]=NY1(F)&&N?[F,U]:Y?await Promise.all([PR0(Y,G,"/_sandbox/git/status","GET",{userId:J,projectRef:W}),PR0(Y,G,"/_sandbox/git/diff","GET",{userId:J,projectRef:W})]):await(async()=>{let L=await Hc(Q);return Promise.all([LR0(L,X.branch),ER0(L,X.branch)])})(),w=await bp$(K,B,O,typeof H.language==="string"?H.language:void 0);return Q.json(w,200,N5)}catch(H){let F=H instanceof Error?H.message:String(H);if(F==="SANDBOX_GONE")return Q.json({error:"Sandbox handle is gone. The sandbox needs to be re-provisioned."},410,N5);return Q.json({error:F},502,N5)}}),$.get("/:virtualMcpId/:branch/preview-fetch",async(Q)=>{let X=Mf(Q);if(X instanceof Response)return X;let{claimName:Y}=Q.get("vmClaim"),G=Q.req.query("path");if(!G||!G.startsWith("/")||G.startsWith("//")||G.includes("..")||G.includes("\\"))return Q.json({error:"Path not allowed"},403);let J;try{J=await X.getPreviewUrl(Y)}catch{return Q.json({error:"Preview not available"},502)}if(!J)return Q.json({error:"Preview not available"},502);let W=J.replace(/\/+$/,"");return In$(Q,`${W}${G}`)}),$.post("/:virtualMcpId/:branch/preview-invoke",Z9({maxSize:Nj6,onError:(Q)=>Q.json({error:"Payload too large"},413)}),async(Q)=>{let X=Mf(Q);if(X instanceof Response)return X;let{claimName:Y}=Q.get("vmClaim"),G;try{G=await X.getPreviewUrl(Y)}catch{return Q.json({error:"Preview not available"},502)}if(!G)return Q.json({error:"Preview not available"},502);let J;try{J=await Q.req.json()}catch{return Q.json({error:"Invalid JSON body"},400)}if(!J||typeof J!=="object"||Array.isArray(J))return Q.json({error:"Invalid JSON body"},400);let W=jn$(J);if(!W)return Q.json({error:"Invalid or missing __resolveType"},400);let K=zn$(G,W.resolveType);return In$(Q,K,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(W.payload),signal:AbortSignal.timeout(30000)})}),$};var Sn$=D(()=>{u$();rH();Xc();WY1();Lo();qp$();RJ();Ph();Ip$();FW();Mp$();Vp$();ar0();jo();DY1();xp$();tZ();lZ();kY1();Pn$();VY1();Fj6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;Oj6=GR0(async($,Z)=>{let Q=$.var.studioContext;try{t(Q)}catch{return $.json({error:"Unauthorized"},401)}let X=n0(Q);if(!X)return $.json({error:"Unauthorized"},401);let Y;try{Y=n(Q)}catch{return $.json({error:"Organization scope required"},403)}let G=$.req.param("virtualMcpId"),J=$.req.param("branch");if(!G||!J)return $.json({error:"virtualMcpId and branch are required"},400);try{Uj6(J)}catch(w){let L=w instanceof Error?w.message:String(w);return $.json({error:L},400)}let W=await Q.storage.virtualMcps.findById(G);if(!W||W.organization_id!==Y.id)return $.json({error:"Virtual MCP not found"},404);let K=ut({orgId:Y.id,virtualMcpId:G,branch:J}),H=await Bo0(Q,J),F=Oo0(H,X),U=Rp$({userId:F,projectRef:K}),N=W.metadata??null,B=await Dj6($,{claimName:U,branch:J,virtualMcpId:G,sandboxUserId:F,virtualMcpMetadata:N,branchThread:H});if(B==="cms")return $.set("vmClaim",{claimName:U,callerUserId:X,runner:null,virtualMcpId:G,branch:J,userId:F,projectRef:K,virtualMcpMetadata:N,connectionIds:W.connections?.map((w)=>w.connection_id)??[],runtime:B}),Z();let O;try{O=await EX(Q)}catch{O=null}if(!O)return $.json({error:"No sandbox runner found"},404);return $.set("vmClaim",{claimName:U,callerUserId:X,runner:O,virtualMcpId:G,branch:J,userId:F,projectRef:K,virtualMcpMetadata:N,connectionIds:W.connections?.map((w)=>w.connection_id)??[],runtime:B}),Z()});zR0=new Map;N5={"Cache-Control":"no-store, no-cache, must-revalidate",Pragma:"no-cache"};kn$=["clone","install","start"]});function Cn$($,Z,Q){let X=CY1.get($);if(!X)X={pending:null,running:!1},CY1.set($,X);if(!X.pending)X.pending={set:new Map,del:new Set,deps:Z,resolvers:[],rejecters:[]};let Y=X.pending;Y.deps=Z;for(let[J,W]of Object.entries(Q.set??{}))Y.set.set(J,W),Y.del.delete(J);for(let J of Q.delete??[])Y.del.add(J),Y.set.delete(J);let G=new Promise((J,W)=>{Y.resolvers.push(J),Y.rejecters.push(W)});if(!X.running)zj6($,X);return G}async function zj6($,Z){Z.running=!0;try{while(Z.pending){let Q=Z.pending;Z.pending=null;try{let X=await Pj6(Q);for(let Y of Q.resolvers)Y(X)}catch(X){for(let Y of Q.rejecters)Y(X)}}}finally{if(Z.running=!1,!Z.pending)CY1.delete($)}}async function Pj6($){let{client:Z,branch:Q,packagePath:X}=$.deps,Y=new Map;for(let G=0;;G++){let J=await Kc(Z,Q),W=await Z.listDecofileEntries(J,X),K=qY1(W,X),H=[],F=new Map(K.map((N)=>[N.path,{stem:N.stem,sha:N.sha}]));for(let[N,B]of $.set){let O=IY1(K,N),w=`${JSON.stringify(B,null,2)}
2929
- `;await Bn$(Z.repo,w);let L=O[0]??`${OR0(X)}/${EY1(N)}.json`;H.push({path:L,content:w});let E=L.slice(L.lastIndexOf("/")+1,-5);F.set(L,{stem:E,content:w});for(let j of O.slice(1))H.push({path:j,deleted:!0}),F.delete(j)}for(let N of $.del)for(let B of IY1(K,N))H.push({path:B,deleted:!0}),F.delete(B);if(H.length===0)return J;let U=X?`${X}/.deco/blocks.gen.json`:".deco/blocks.gen.json";if(W.some((N)=>N.type==="blob"&&N.path===U)){let N=await On$(Z,F.values(),Y),{decofile:B,skipped:O}=te(N);if(O.length>0)console.warn("decofile gen: dropped blocks that were not valid JSON",{repo:XW(Z.repo),branch:Q,packagePath:X,blocks:O.map((w)=>w.key)});H.push({path:U,content:B})}try{let{sha:N}=await Z.commitFiles({branch:Q,message:Aj6($),expectedHead:J,changes:H});return N}catch(N){if(!(N instanceof x5)||G>=jj6-1)throw N;await z$(K7(2000,200,G,2,0.5))}}}function Aj6($){let Z=(Y)=>{let G=Y.slice(0,3).join(", ");return Y.length>3?`${G} (+${Y.length-3} more)`:G},Q=[];if($.set.size>0)Q.push(`update ${Z([...$.set.keys()])}`);if($.del.size>0)Q.push(`delete ${Z([...$.del])}`);let X=`chore(decofile): ${Q.join("; ")}`;return ut0(X,$.deps.coAuthor)}var jj6=3,CY1;var _n$=D(()=>{Jw0();KR0();y5();f8();tZ();DR0();CY1=new Map});import{createHmac as vn$,randomBytes as Tj6,timingSafeEqual as Rj6}from"crypto";function fn$(){if(AR0)return AR0;let $;try{let Z=M0();$=Z.studioJwtSecret??Z.betterAuthSecret}catch{$=void 0}return AR0=$?Buffer.from($):Tj6(32),AR0}function _Y1($){let Z=$.nowMs??Date.now(),Q={o:$.organizationId,m:$.virtualMcpId,b:$.branch,e:Math.floor((Z+qj6)/1000)},X=Buffer.from(JSON.stringify(Q)).toString("base64url"),Y=vn$("sha256",fn$()).update(X).digest("base64url");return`${X}.${Y}`}function bn$($,Z){let Q=$.indexOf(".");if(Q<0)return!1;let X=$.slice(0,Q),Y=Buffer.from($.slice(Q+1)),G=Buffer.from(vn$("sha256",fn$()).update(X).digest("base64url"));if(Y.length!==G.length||!Rj6(Y,G))return!1;let J;try{J=JSON.parse(Buffer.from(X,"base64url").toString())}catch{return!1}let W=Math.floor((Z.nowMs??Date.now())/1000);return J.o===Z.organizationId&&J.m===Z.virtualMcpId&&J.b===Z.branch&&typeof J.e==="number"&&J.e>=W}var qj6=21600000,AR0=null;var xn$=D(()=>{E$()});import{z as Fc}from"zod";function Mj6($){return $.length>0&&$.length<=255&&!$.includes("..")&&!$.endsWith("/")&&!$.endsWith(".lock")&&Ij6.test($)}function ln$($){return $.req.header("x-forwarded-host")??new URL($.req.url).host}async function Q00($){let Z=$.get("decofileScope");return xg($.var.studioContext,Z.organizationId,Z.githubRepo)}function X00($,Z){let Q=Z instanceof Error?Z.message:String(Z);if(Z instanceof x5)return $.json({error:Q},409);let X=zJ(Z);if(X!==null){let Y=X===404?404:X===409||X===422?409:502;return $.json({error:Q},Y)}return $.json({error:Q},500)}function cn$(){let $=new Q1;return $.use("/:virtualMcpId/:branch",un$),$.use("/:virtualMcpId/:branch/*",un$),$.get("/:virtualMcpId/:branch",async(Z)=>{let Q=Z.get("decofileScope");try{let X=await Q00(Z),Y=await Dn$(X,Q.branch,Q.packagePath,{createBranchIfMissing:!!Q.userId}),G={ETag:`"${Y.sha}"`,"Cache-Control":"no-store","Access-Control-Allow-Origin":"*"};if(Z.req.header("if-none-match")===`"${Y.sha}"`)return Z.body(null,304,G);if(!Q.userId)return Z.body(Y.decofile,200,{...G,"content-type":"application/json"});let J=_Y1({organizationId:Q.organizationId,virtualMcpId:Q.virtualMcpId,branch:Q.branch});return Z.body(`{"version":${JSON.stringify(Y.sha)},"token":${JSON.stringify(J)},"apiHost":${JSON.stringify(ln$(Z))},"decofile":${Y.decofile}}`,200,{...G,"content-type":"application/json"})}catch(X){return X00(Z,X)}}),$.get("/:virtualMcpId/:branch/meta",async(Z)=>{let Q=Z.get("decofileScope"),X=Q.packagePath?`${Q.packagePath}/.deco/meta.gen.json`:".deco/meta.gen.json";try{let Y=await Q00(Z),G=await Y.readFileAtRef(Q.branch,X);if(G===null){let J=await Y.getDefaultBranch();if(J!==Q.branch)G=await Y.readFileAtRef(J,X)}if(G===null)return Z.json({error:"meta.gen.json not committed"},404);return Z.body(G,200,{"content-type":"application/json","Cache-Control":"no-store","Access-Control-Allow-Origin":"*"})}catch(Y){return X00(Z,Y)}}),$.patch("/:virtualMcpId/:branch",Vj6,async(Z)=>{let Q=Z.get("decofileScope"),X=Z.var.studioContext,Y=Sj6.safeParse(await Z.req.json().catch(()=>null));if(!Y.success)return Z.json({error:"Invalid body",details:Y.error.issues},400);let G=Y.data;for(let J of[...Object.keys(G.set??{}),...G.delete??[]])try{WR0(J)}catch(W){let K=W instanceof Error?W.message:String(W);return Z.json({error:K},400)}for(let[J,W]of Object.entries(G.set??{})){if(typeof W!=="object"||W===null||Array.isArray(W))return Z.json({error:`Block "${J}" must be a JSON object`},400);if(LY1(J))return Z.json({error:`Block key "${J}" collides with a framework resolver module and cannot be written`},400)}try{let J=await Q00(Z),W=await Cn$(`${Q.organizationId}/${Q.virtualMcpId}/${Q.branch}`,{client:J,branch:Q.branch,packagePath:Q.packagePath,coAuthor:Yc(X)},G),K=_Y1({organizationId:Q.organizationId,virtualMcpId:Q.virtualMcpId,branch:Q.branch});return Z.json({version:W,token:K,apiHost:ln$(Z)})}catch(J){return X00(Z,J)}}),$.post("/:virtualMcpId/:branch/publish",async(Z)=>{let Q=Z.get("decofileScope");try{let X=await Q00(Z),Y=await X.getDefaultBranch();if(Y===Q.branch)return Z.json({error:"Branch is already the default branch"},400);let G=`chore(decofile): publish ${Q.branch}`;try{let J;try{J=await X.mergeBranches(Y,Q.branch,G)}catch(W){if(zJ(W)!==409)throw W;await jR0(X,Q.branch,Y),J=await X.mergeBranches(Y,Q.branch,G)}return J?Z.json({result:"merged",sha:J}):Z.json({result:"up-to-date"})}catch(J){if(zJ(J)===409)return Z.json({error:"merge-conflict"},409);if(zJ(J)===405){let K=await X.findOpenChangeRequest(Y,Q.branch)??await X.createChangeRequest({base:Y,head:Q.branch,title:`Publish ${Q.branch}`});return Z.json({result:"pull-request",number:K.number,url:K.url})}throw J}}catch(X){return X00(Z,X)}}),$.get("/:virtualMcpId/:branch/status",async(Z)=>{let Q=Z.get("decofileScope");try{let X=await Q00(Z),Y=await X.getDefaultBranch();if(Y===Q.branch)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0,lastCommitAt:null});try{let[{aheadBy:G,behindBy:J},W]=await Promise.all([X.compare(Y,Q.branch),X.getBranch(Q.branch)]);return Z.json({baseBranch:Y,aheadBy:G,behindBy:J,lastCommitAt:W?.committedAt??null})}catch(G){if(zJ(G)===404)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0,lastCommitAt:null});throw G}}catch(X){return X00(Z,X)}}),$}var Ij6,yn$=500,gn$=1048576,hn$=1024,kj6=8388608,Vj6,Sj6,un$;var dn$=D(()=>{er0();KR0();u$();rH();WY1();JR0();VY1();tZ();_n$();xn$();kY1();DR0();Ij6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;Vj6=Z9({maxSize:kj6,onError:($)=>$.json({error:"Payload too large"},413)}),Sj6=Fc.object({set:Fc.record(Fc.string(),Fc.unknown()).optional(),delete:Fc.array(Fc.string()).optional()}).refine(($)=>Object.keys($.set??{}).length>0||($.delete?.length??0)>0,{message:"Patch must set or delete at least one block"}).refine(($)=>Object.keys($.set??{}).length+($.delete?.length??0)<=yn$,{message:`Patch cannot touch more than ${yn$} blocks`}).refine(($)=>Object.values($.set??{}).every((Z)=>JSON.stringify(Z).length<=gn$),{message:`Each block must be at most ${gn$} bytes`}).refine(($)=>[...Object.keys($.set??{}),...$.delete??[]].every((Z)=>Z.length<=hn$),{message:`Each block key must be at most ${hn$} characters`}),un$=GR0(async($,Z)=>{let Q=$.var.studioContext,X=Q.organization;if(!X)return $.json({error:"Organization scope required"},500);let Y=$.req.param("virtualMcpId"),G=$.req.param("branch");if(!Y||!G)return $.json({error:"virtualMcpId and branch are required"},400);if(!Mj6(G))return $.json({error:`Invalid branch name: ${G}`},400);let J=Q.auth?.user?.id??null;if(!J){let B=$.req.query("token");if(!($.req.method==="GET"&&!$.req.path.match(/\/(publish|status)$/)))return $.json({error:"Unauthorized"},401);if(!B||!bn$(B,{organizationId:X.id,virtualMcpId:Y,branch:G}))return $.json({error:"Unauthorized"},401)}let W=await Q.storage.virtualMcps.findById(Y);if(!W||W.organization_id!==X.id)return $.json({error:"Virtual MCP not found"},404);let K=W.metadata??null;if(!PL0(K))return $.json({error:"Project has no preview server configured"},404);let F=W.connections?.map((B)=>B.connection_id)??[],U=$00(K,F);if(!U)return $.json({error:"Project has no GitHub repository"},404);let N=K?.runtime;return $.set("decofileScope",{organizationId:X.id,virtualMcpId:Y,branch:G,packagePath:N?.path?.replace(/^\/+|\/+$/g,"")||null,githubRepo:U,userId:J}),Z()})});var mn$=($)=>{let Z=new Q1;if(Z.use("*",Uf),Z.use("*",Ic$),Z.route("/",E20()),Z.route("/",Jd$()),Z.route("/",rc$()),Z.route("/",Up$()),Z.route("/",Kp$()),Z.route("/",QR0()),Z.route("/tools",Ep$()),Z.route("/",Dp$()),Z.route("/",hi$({kvStorage:$.kvStorage})),Z.route("/",yi$()),Z.route("/fs",ei$({getConnection:$.getNatsConnection})),Z.route("/sandbox",Vn$()),Z.route("/decofile",cn$()),Z.route("/",Gp$()),Z.route("/",Zp$()),Z.route("/deco-sites",z20()),Z.route("/hosting",hc$()),Z.route("/monitor",pc$()),Z.route("/sso",N20()),Z.route("/",XR0({tokenStorage:$.tokenStorage,automationEventDispatcher:$.automationEventDispatcher})),Z.route("/webhooks",fc$()),$.mountDevAssets)Z.route("/dev-assets",R20({orgFromPath:!0}));return Z.use("/mcp/:connectionId?",$.mcpAuth),Z.use("/mcp/:connectionId/ui-resource",$.mcpAuth),Z.use("/mcp/gateway/:virtualMcpId?",$.mcpAuth),Z.use("/mcp/virtual-mcp/:virtualMcpId?",$.mcpAuth),Z.use("/mcp/self",$.mcpAuth),Z.use("/mcp/task-run/:threadId",$.mcpAuth),Z.route("/",ah$()),Z.get("/mcp/:gateway?/:connectionId/.well-known/oauth-protected-resource/*",$.betterAuthProtectedResourceHandler),Z.get("/mcp/.well-known/oauth-protected-resource",$.betterAuthProtectedResourceHandler),Z.route("/mcp/task-run",Xp$()),Z.route("/mcp",Rj0()),Z.route("/mcp/self",ZR0()),Z.route("/mcp",Mj0()),Z.all("/oauth-proxy/:connectionId/*",$.oauthProxyHandler),Z.get("/watch",$.watchHandler),Z};var in$=D(()=>{u$();Mc$();K20();bc$();MQ1();uc$();nc$();q20();Ee();AQ1();bQ1();gi$();ui$();$p$();Qp$();Tr();wQ1();kj0();$Y1();Yp$();Jp$();Hp$();Np$();wp$();QY1();jp$();XY1();qj0();Sn$();dn$()});function Cj6($){return $.filter((Z)=>Z.vendors?.alias).map((Z)=>({name:Z.name,title:Z.title,description:Z.description,logo:Z.logo,category:Z.category,vendor:{alias:Z.vendors.alias,url:Z.vendors.url}}))}var _j6=async($,Z)=>{if(!$.get("studioContext").auth.user?.id)return $.json({error:"Unauthorized"},401);return Z()},pn$=()=>{let $=new Q1;return $.use("*",_j6),$.get("/",async(Z)=>{let Q=M0(),X=Q.decoSupabaseUrl,Y=Q.decoSupabaseServiceKey;if(!X||!Y)return Z.json({apps:[]});try{let G=await _Y(X,Y,"apps?select=name,title,description,logo,category,vendors(alias,url)");return Z.json({apps:Cj6(G)})}catch(G){return console.error("[deco-apps] GET error:",G),Z.json({error:"Failed to fetch apps"},502)}}),$};var nn$=D(()=>{u$();E$();ET0()});import{z as M1}from"zod";function QF($,Z="invalid_request_error",Q=null,X=null){return{error:{message:$,type:Z,param:Q,code:X}}}function cj6($){if(!$)return null;let Z=$.indexOf(":");if(Z===-1)return{credentialId:null,modelId:$};let Q=$.substring(0,Z),X=$.substring(Z+1);if(!Q||!X)return null;return{credentialId:Q,modelId:X}}function dj6($,Z,Q){try{return JSON.parse($)}catch{throw new rn$(`Invalid JSON in tool call arguments for function '${Q}' (tool_call_id: ${Z}): ${$}`)}}function mj6($){let Z={};for(let Q of $)if(Q.role==="assistant"&&Q.tool_calls)for(let X of Q.tool_calls)Z[X.id]=X.function.name;return $.map((Q)=>{switch(Q.role){case"system":return{role:"system",content:Q.content};case"user":if(typeof Q.content==="string")return{role:"user",content:Q.content};return{role:"user",content:Q.content.map((Y)=>{if(Y.type==="text")return{type:"text",text:Y.text};return{type:"image",image:Y.image_url.url}})};case"assistant":if(Q.tool_calls&&Q.tool_calls.length>0)return{role:"assistant",content:Q.tool_calls.map((Y)=>({type:"tool-call",toolCallId:Y.id,toolName:Y.function.name,input:dj6(Y.function.arguments,Y.id,Y.function.name)}))};return{role:"assistant",content:Q.content??""};case"tool":let X=Z[Q.tool_call_id]??"unknown";return{role:"tool",content:[{type:"tool-result",toolCallId:Q.tool_call_id,toolName:X,output:{type:"text",value:Q.content}}]}}})}function ij6($){let Z=$.map((Q)=>{let X=Q.function.parameters?LG(Q.function.parameters):LG({type:"object",properties:{}});return[Q.function.name,W$({description:Q.function.description,inputSchema:X})]});return Object.fromEntries(Z)}function pj6($){if(!$)return;return{openai:{response_format:$}}}function nj6(){return`chatcmpl-${crypto.randomUUID().replace(/-/g,"").substring(0,29)}`}function tn$($,Z,Q,X,Y,G){let J={model:$,messages:Z,tools:Q,temperature:X.temperature,maxTokens:X.max_tokens,topP:X.top_p,frequencyPenalty:X.frequency_penalty,presencePenalty:X.presence_penalty,stopSequences:X.stop?Array.isArray(X.stop)?X.stop:[X.stop]:void 0,abortSignal:G};return Y?{...J,providerOptions:Y}:J}function on$($){if($==="tool-calls")return"tool_calls";if($==="length")return"length";return"stop"}var vj6=256,fj6,bj6,xj6,yj6,gj6,hj6,uj6,lj6,rn$,sn$,an$;var en$=D(()=>{S4();u$();Xc();GN();fj6=M1.object({type:M1.literal("function"),function:M1.object({name:M1.string(),description:M1.string().optional(),parameters:M1.record(M1.string(),M1.unknown()).optional()})}),bj6=M1.object({id:M1.string(),type:M1.literal("function"),function:M1.object({name:M1.string(),arguments:M1.string()})}),xj6=M1.discriminatedUnion("role",[M1.object({role:M1.literal("system"),content:M1.string(),name:M1.string().optional()}),M1.object({role:M1.literal("user"),content:M1.union([M1.string(),M1.array(M1.union([M1.object({type:M1.literal("text"),text:M1.string()}),M1.object({type:M1.literal("image_url"),image_url:M1.object({url:M1.string(),detail:M1.string().optional()})})]))]),name:M1.string().optional()}),M1.object({role:M1.literal("assistant"),content:M1.string().nullable().optional(),name:M1.string().optional(),tool_calls:M1.array(bj6).optional()}),M1.object({role:M1.literal("tool"),content:M1.string(),tool_call_id:M1.string()})]),yj6=M1.object({type:M1.literal("text")}),gj6=M1.object({type:M1.literal("json_object")}),hj6=M1.object({type:M1.literal("json_schema"),json_schema:M1.object({name:M1.string(),description:M1.string().optional(),schema:M1.record(M1.string(),M1.unknown()),strict:M1.boolean().optional()})}),uj6=M1.union([yj6,gj6,hj6]),lj6=M1.object({model:M1.string().describe("Format: 'model_id' or 'credential_id:model_id'"),messages:M1.array(xj6),stream:M1.boolean().optional().default(!1),temperature:M1.number().min(0).max(2).optional(),max_tokens:M1.number().positive().optional(),top_p:M1.number().min(0).max(1).optional(),frequency_penalty:M1.number().min(-2).max(2).optional(),presence_penalty:M1.number().min(-2).max(2).optional(),stop:M1.union([M1.string(),M1.array(M1.string())]).optional(),tools:M1.array(fj6).optional(),tool_choice:M1.union([M1.literal("auto"),M1.literal("none"),M1.literal("required"),M1.object({type:M1.literal("function"),function:M1.object({name:M1.string()})})]).optional(),response_format:uj6.optional(),user:M1.string().optional()});rn$=class rn$ extends Error{constructor($){super($);this.name="MessageConversionError"}};sn$=new Q1;sn$.post("/:org/v1/chat/completions",async($)=>{let Z=$.get("studioContext"),Q=$.req.param("org");try{if(!Z.auth.apiKey?.id)return $.json(QF("API key authentication required. Provide a valid API key via Authorization header.","authentication_error"),401);if(!Z.organization)return $.json(QF("Organization context is required. Ensure your API key has organization metadata.","invalid_request_error","organization"),400);if((Z.organization.slug??Z.organization.id)!==Q)return $.json(QF("Organization mismatch. The API key's organization does not match the requested organization.","invalid_request_error","organization"),403);let X=await $.req.json(),Y=lj6.safeParse(X);if(!Y.success){let L=Y.error.issues[0]??{message:"Invalid request",path:[]};return $.json(QF(`Invalid request: ${L.message}`,"invalid_request_error",L.path.length>0?L.path.join("."):null),400)}let G=Y.data,J=cj6(G.model);if(!J)return $.json(QF("Invalid model format. Expected 'model_id' or 'credential_id:model_id' (e.g., 'claude-sonnet-4-6' or 'key_abc123:claude-sonnet-4-6')","invalid_request_error","model"),400);let{credentialId:W}=J,{modelId:K}=J;if(!W){let E=(await Z.storage.aiProviderKeys.list({organizationId:Z.organization.id})).find((j)=>tL(j.providerId));if(!E)return $.json(QF("No AI provider credentials configured for this organization. Add a credential in settings or specify one explicitly via 'credential_id:model_id'.","invalid_request_error","model"),400);W=E.id}let H;try{H=await Z.aiProviders.activate(W,Z.organization.id)}catch{return $.json(QF(`AI provider credential not found or inaccessible: ${W}`,"invalid_request_error","model"),404)}let F=H.aiSdk.languageModel(K),U=mj6(G.messages),N=G.tools?ij6(G.tools):void 0,B=pj6(G.response_format),O=nj6(),w=Math.floor(Date.now()/1000);if(G.stream)return MN($,async(L)=>{let E=tn$(F,U,N,G,B,$.req.raw.signal);try{let j=SD(E),z=!1,P=0,A="",q=async()=>{if(A.length===0)return;let k=A;A="",await L.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:w,model:G.model,choices:[{index:0,delta:{content:k},finish_reason:null}]})})};for await(let k of j.fullStream){if(!z&&(k.type==="text-delta"||k.type==="tool-call"))await L.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:w,model:G.model,choices:[{index:0,delta:{role:"assistant",content:""},finish_reason:null}]})}),z=!0;if(k.type==="text-delta"){if(A+=k.text,A.length>=vj6)await q()}else if(k.type==="tool-call"){await q();let M=P++;await L.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:w,model:G.model,choices:[{index:0,delta:{tool_calls:[{index:M,id:k.toolCallId,type:"function",function:{name:k.toolName,arguments:JSON.stringify(k.input)}}]},finish_reason:null}]})})}else if(k.type==="finish")await q(),await L.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:w,model:G.model,choices:[{index:0,delta:{},finish_reason:on$(k.finishReason)}],usage:k.totalUsage?{prompt_tokens:k.totalUsage.inputTokens??0,completion_tokens:k.totalUsage.outputTokens??0,total_tokens:k.totalUsage.totalTokens??0}:void 0})})}await q(),await L.writeSSE({data:"[DONE]"})}catch(j){let z=j;console.error("[openai-compat:stream] Error:",z.message),await L.writeSSE({data:JSON.stringify({error:{message:z.message,type:"server_error"}})})}});else{let L=tn$(F,U,N,G,B,$.req.raw.signal),E=await kD(L),j={role:"assistant",content:E.text||null};if(E.toolCalls&&E.toolCalls.length>0)j.tool_calls=E.toolCalls.map((z)=>({id:z.toolCallId,type:"function",function:{name:z.toolName,arguments:JSON.stringify("input"in z?z.input:{})}})),j.content=null;return $.json({id:O,object:"chat.completion",created:w,model:G.model,choices:[{index:0,message:j,finish_reason:on$(E.finishReason)}],usage:{prompt_tokens:E.usage?.inputTokens??0,completion_tokens:E.usage?.outputTokens??0,total_tokens:E.usage?.totalTokens??0}})}}catch(X){let Y=X;if(Y.name==="AbortError")return $.json(QF("Request aborted","invalid_request_error"),400);if(Y.name==="MessageConversionError")return $.json(QF(Y.message,"invalid_request_error","messages"),400);return console.error("[openai-compat] Error:",Y.message,Y.stack),$.json(QF(Y.message,"server_error"),500)}});an$=sn$});function tj6($){if(typeof $!=="object"||$===null)return!1;let Q=$.githubRepo?.url;return typeof Q==="string"&&Q.length>0}function $t$(){let $=new Q1;return $.use("*",async(Z,Q)=>{await Q(),Z.header("Cache-Control","private, no-store"),Z.header("Vary","Cookie")}),$.get("/",async(Z)=>{let Q=Z.get("studioContext"),X=n0(Q);if(!X)return Z.json({error:"Authentication required"},401);let G=(Z.req.query("site")??"").trim().toLowerCase();if(!WX(G))return Z.json({error:"Invalid site slug"},400);let J=await Q.db.selectFrom("member").innerJoin("organization","organization.id","member.organizationId").select(["organization.id as id","organization.slug as slug","organization.name as name","organization.metadata as metadata"]).where("member.userId","=",X).execute(),W=[];for(let H of J){if(!H.slug||n9(H))continue;let F=await Q.storage.virtualMcps.list(H.id);for(let U of F){if(A$$(U)!==G)continue;if(!tj6(U.metadata))continue;W.push({orgSlug:H.slug,orgName:H.name??H.slug,project:{id:U.id,title:U.title,icon:U.icon??null}})}}let K={matches:W};return Z.json(K)}),$}var Zt$=D(()=>{u$();HU()});var Xt$;var Qt$=D(()=>{Xt$={name:"decocms",version:"4.344.1",description:"Deco CMS \u2014 Self-hostable MCP Gateway for managing AI connections and tools",author:"Deco team",repository:{type:"git",url:"git+https://github.com/decocms/studio.git",directory:"apps/api"},bugs:{url:"https://github.com/decocms/studio/issues"},type:"module",bin:{deco:"./dist/server/cli.js"},files:["dist/**/*"],scripts:{dev:"bun run migrate && bun run dev:server","dev:server":"bun run --cwd=../../packages/sandbox build && NODE_ENV=development bun --env-file=.env --hot run src/index.ts",build:"bun run build:server","build:server":"bun run scripts/bundle-server-script.ts --dist ./dist/server","generate:tool-contracts":"bun run scripts/generate-tool-contracts.ts","db:migrate":"bun run ./dist/server/migrate.js","db:migrate:dbos":"bun run ./dist/server/migrate-dbos.js",check:"tsc --noEmit",start:"bun run ./dist/server/server.js",migrate:"bun run src/database/migrate.ts","migrate:dbos":"bun run src/database/migrate-dbos.ts",test:"bun test src","better-auth:migrate":"bunx --bun @better-auth/cli migrate -y --config src/auth/index.ts",prepublishOnly:"bun run --cwd=../.. build:studio"},optionalDependencies:{"@duckdb/node-api":"^1.5.0-r.1"},dependencies:{"@ai-sdk/anthropic":"^3.0.85","@ai-sdk/google":"^3.0.83","@ai-sdk/openai":"^3.0.73","@anthropic-ai/sdk":"^0.105.0","@aws-sdk/client-s3":"^3.1013.0","@aws-sdk/client-sts":"^3.1013.0","@aws-sdk/lib-storage":"^3.1013.0","@aws-sdk/s3-request-presigner":"^3.1013.0","@clickhouse/client":"^1.8.1","@dbos-inc/dbos-sdk":"^4.21.6","@inkjs/ui":"^2.0.0","@nats-io/jetstream":"3.4.0","@nats-io/kv":"3.4.0","@nats-io/nats-core":"3.4.0","@nats-io/transport-node":"3.4.0","@openrouter/ai-sdk-provider":"^2.9.1","@opentelemetry/core":"^2.6.0","embedded-postgres":"^18.3.0-beta.16",ink:"^6.8.0",kysely:"^0.28.12","posthog-node":"^5.0.0",react:"^19.2.6","react-dom":"^19.2.6"},devDependencies:{"@ai-sdk/provider":"^3.0.10","@better-auth/sso":"1.4.1","@decocms/better-auth":"1.5.17","@decocms/bindings":"workspace:*","@decocms/mcp-utils":"workspace:*","@decocms/runtime":"workspace:*","@decocms/sandbox":"workspace:*","@decocms/shared":"workspace:*","@jitl/quickjs-wasmfile-release-sync":"0.31.0","@modelcontextprotocol/sdk":"1.29.0","@opentelemetry/api":"^1.9.0","@opentelemetry/api-logs":"^0.211.0","@opentelemetry/exporter-logs-otlp-proto":"^0.211.0","@opentelemetry/exporter-prometheus":"^0.208.0","@opentelemetry/exporter-trace-otlp-proto":"^0.207.0","@opentelemetry/instrumentation-runtime-node":"^0.24.0","@opentelemetry/resources":"^2.6.0","@opentelemetry/sdk-logs":"^0.211.0","@opentelemetry/sdk-metrics":"^2.2.0","@opentelemetry/sdk-node":"^0.207.0","@opentelemetry/sdk-trace-base":"^2.5.0","@types/bun":"^1.3.1","@types/google.maps":"^3.65.2","@types/pg":"^8.15.6","@types/react-syntax-highlighter":"^15.5.13","@vercel/nft":"^1.1.1",ai:"^6.0.208","better-auth":"1.4.22",croner:"^9.1.0",degit:"^2.8.4",hono:"^4.10.7",jose:"^6.0.11",nanoid:"^5.1.6",pg:"^8.16.3",typescript:"^7.0.2",typescript5:"npm:typescript@^5.9.3",zod:"4.3.6"},homepage:"https://github.com/decocms/studio",keywords:["mcp","model-context-protocol","ai","gateway","self-hosted","tools"],license:"MIT",publishConfig:{access:"public"}}});function sj6(){let $=process.env.POSTHOG_KEY;if(!$)return null;return{key:$,host:process.env.POSTHOG_HOST??rj6}}var Yt$,rj6="https://ph.studio.decocms.com",Gt$;var Jt$=D(()=>{u$();kZ0();r_();C5();E$();WQ1();Qt$();Yt$=new Q1;Yt$.get("/",($)=>{let Z={version:Xt$.version,theme:it1(),...XU().logo&&{logo:XU().logo},...pU()&&{internalUrl:Bb1()},...M0().enableDecoImport&&{enableDecoImport:!0},brandExtractEnabled:!!M0().firecrawlApiKey,hostingEnabled:!!M0().controlplaneRestUrl&&!!M0().controlplaneServiceToken,hostingControlPlaneGa:M0().hostingControlPlaneGa,monitorEnabled:!!M0().clickhouseAnalyticsUrl&&!!M0().clickhouseAnalyticsPassword,monitorGa:M0().monitorGa,auth:bl$(),posthog:sj6(),googleMapsApiKey:process.env.GOOGLE_MAPS_API_KEY?.trim()||null,runtime:{agentSandbox:U00()}};return $.header("Cache-Control","no-store"),$.json({success:!0,config:Z})});Gt$=Yt$});function Uc($){let Z=($??"").trim().toLowerCase();return Z=Z.replace(/^https?:\/\//,""),Z=Z.replace(/^www\./,""),Z=Z.split(/[/?#]/)[0]??"",Z.replace(/\/+$/,"")}function vY1($){return(Uc($).split(".")[0]||$).replace(/[-_]/g," ").split(" ").filter(Boolean).map((Q)=>Q.charAt(0).toUpperCase()+Q.slice(1)).join(" ")}function Kt$($,Z=64){return`https://www.google.com/s2/favicons?domain=${encodeURIComponent(Uc($))}&sz=${Z}`}function Wt$($,Z){let Q=$.trim();if(Q.length<=Z)return Q;let X=Q.slice(0,Z-1),Y=X.lastIndexOf(" ");return`${(Y>Z*0.6?X.slice(0,Y):X).trimEnd()}\u2026`}function Ht$($){let{brand:Z,domain:Q,score:X,verdict:Y}=$,G=typeof X==="number"?`${Z} commerce report \u2014 ${Math.round(X)}/100 \xB7 decocms`:`${Z} commerce report \xB7 decocms`,J=`See the full ${Z} scorecard \u2014 SEO, performance, conversion & AEO signals scored by decocms.`,W=Y?.trim()?Wt$(`${Y.trim().replace(/\s+/g," ")} \u2014 ${J}`,200):Wt$(`How does ${Q} really perform? ${J}`,200);return{title:G,description:W}}import{z as c0}from"zod";var kf,aj6,ej6,$z6,Zz6,Ft$;var Ut$=D(()=>{kf=c0.enum(["good","bad","neutral"]),aj6=c0.preprocess(($)=>{if(Array.isArray($))return{kind:"text",value:$.find((Q)=>Q!==null&&typeof Q!=="object")??""};return $!==null&&typeof $==="object"?$:{kind:"text",value:$}},c0.object({kind:c0.enum(["text","number","sparkline","badge","score"]).catch("text"),value:c0.coerce.string().optional(),tone:kf.optional(),muted:c0.boolean().optional(),delta:c0.coerce.string().optional(),deltaDir:c0.enum(["up","down","neutral"]).optional(),points:c0.array(c0.coerce.number()).optional(),label:c0.coerce.string().optional()}).transform(($)=>{if($.kind==="badge"&&$.label==null)$.label=$.value??"";if($.kind==="score"){let Z=Number($.value);if(Number.isNaN(Z))return{...$,kind:"text"}}return $})),ej6=c0.preprocess(($)=>{let Z=$;if(Z&&typeof Z==="object"&&!Array.isArray(Z)&&Array.isArray(Z.cells))Z=Z.cells;if(Array.isArray(Z)&&Z.length===1&&Array.isArray(Z[0]))Z=Z[0];if(Array.isArray(Z))return Z;if(Z&&typeof Z==="object")return Object.values(Z);return Z},c0.array(aj6)),$z6={key:c0.coerce.string(),title:c0.coerce.string(),eyebrow:c0.coerce.string().optional(),headline:c0.coerce.string(),annotation:c0.coerce.string().optional(),methodology:c0.coerce.string().optional(),sources:c0.array(c0.object({name:c0.coerce.string(),logoUrl:c0.coerce.string()})).optional()},Zz6=c0.discriminatedUnion("template",[c0.object({template:c0.literal("cover"),score:c0.object({value:c0.coerce.number(),max:c0.coerce.number().optional(),grade:c0.coerce.string().optional(),label:c0.coerce.string().optional()}).optional(),brandImage:c0.coerce.string().optional(),screenshot:c0.coerce.string().optional(),mobileScreenshot:c0.coerce.string().optional()}),c0.object({template:c0.literal("cta"),ctaUrl:c0.coerce.string().optional(),ctaLabel:c0.coerce.string().optional(),bullets:c0.array(c0.coerce.string()).optional()}),c0.object({template:c0.literal("series"),points:c0.array(c0.coerce.number()).min(2),xLabels:c0.array(c0.coerce.string()).min(1),unit:c0.coerce.string().optional(),callout:c0.object({index:c0.coerce.number(),value:c0.coerce.string(),tone:kf.optional()})}),c0.object({template:c0.literal("threshold"),value:c0.coerce.string().default(""),metricLabel:c0.coerce.string().optional(),ratio:c0.coerce.number(),thresholdRatio:c0.coerce.number().optional(),thresholdLabel:c0.coerce.string().default(""),tone:kf.optional()}),c0.object({template:c0.literal("stats"),stats:c0.array(c0.object({value:c0.coerce.string(),label:c0.coerce.string(),tone:kf.optional()})).min(1)}),c0.object({template:c0.literal("bars"),items:c0.array(c0.object({value:c0.coerce.string(),label:c0.coerce.string(),ratio:c0.coerce.number(),tone:kf.optional()})).min(1)}),c0.object({template:c0.literal("gauges"),gauges:c0.array(c0.object({label:c0.coerce.string(),value:c0.coerce.string(),status:c0.enum(["good","warn","bad"]).catch("warn"),caption:c0.coerce.string().optional(),ratio:c0.coerce.number().optional()})).min(1)}),c0.object({template:c0.literal("checklist"),checks:c0.array(c0.object({label:c0.coerce.string(),status:c0.enum(["pass","fail","warn"]).catch("fail"),value:c0.coerce.string().optional()})).min(1)}),c0.object({template:c0.literal("table"),columns:c0.array(c0.object({label:c0.coerce.string(),align:c0.enum(["left","right"]).optional()})).min(1),rows:c0.array(ej6).min(1),highlightRow:c0.coerce.number().optional()}),c0.object({template:c0.literal("products"),products:c0.array(c0.object({name:c0.coerce.string(),price:c0.coerce.string().optional(),image:c0.coerce.string().optional(),url:c0.coerce.string().optional()})).min(1)}),c0.object({template:c0.literal("list"),entries:c0.array(c0.object({label:c0.coerce.string(),severity:c0.enum(["error","warning","notice"]).catch("notice")})).min(1),moreCount:c0.coerce.number().optional()}),c0.object({template:c0.literal("keywords"),volumeLabel:c0.coerce.string().optional(),keywords:c0.array(c0.object({term:c0.coerce.string(),volume:c0.coerce.string(),position:c0.coerce.number().catch(0)})).min(1)}),c0.object({template:c0.literal("competitor"),metricLabel:c0.coerce.string().optional(),competitors:c0.array(c0.object({name:c0.coerce.string(),value:c0.coerce.string(),tone:kf.optional(),isYou:c0.boolean().optional()})).min(1)}),c0.object({template:c0.literal("scorecard"),rivalLabel:c0.coerce.string().optional(),dimensions:c0.array(c0.object({label:c0.coerce.string(),you:c0.coerce.string(),rival:c0.coerce.string().optional(),rivalName:c0.coerce.string().optional(),tone:kf.optional()})).min(1)})]),Ft$=c0.object({...$z6,template:Zz6})});function TR0($){let Z=[],Q=[...$.sections].sort((Y,G)=>Y.position-G.position).map((Y)=>{let G=Ft$.safeParse(Y.props);if(G.success)return G.data;let J=G.error.issues[0];return Z.push({section_type:Y.section_type,position:Y.position,reason:J?`${J.path.join(".")||"(root)"}: ${J.message}`:"contract violation"}),null}).filter((Y)=>Y!==null),X=Q.filter((Y)=>Y.template.template!=="cover"&&Y.template.template!=="cta").map((Y)=>({key:Y.key,title:Y.title}));return{deck:{meta:{...$.meta,scores:$.summary?.scores,scannedAt:$.scanned_at,toc:X},slides:Q},drops:Z}}var fY1=D(()=>{Ut$()});import{join as Nt$}from"path";async function Xz6($){try{let Z=await fetch(`${xK({})}/api/v2/public/diagnostics/${encodeURIComponent($)}`,{headers:{Accept:"application/json"},signal:AbortSignal.timeout(Qz6)});if(!Z.ok)return null;let Q=await Z.json(),{deck:X}=TR0(Q);if(!X.slides.length)return null;let Y=X.slides.find((W)=>W.template.template==="cover"),G=Y?.template,J=G&&G.template==="cover"?G:void 0;return{brand:X.meta.brand?.trim()||vY1($),score:X.meta.scores?.cover??J?.score?.value,verdict:Y?.annotation?.trim()||Y?.headline?.trim()||void 0}}catch{return null}}function xG($){return $.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function Yz6($,Z){let Q=Uc($),X=Z?.brand?.trim()||vY1(Q),Y=Kt$(Q,128),J=`${(M0().baseUrl??"https://studio.decocms.com").replace(/\/+$/,"")}/report/${encodeURIComponent(Q)}`,{title:W,description:K}=Ht$({brand:X,domain:Q,score:Z?.score,verdict:Z?.verdict}),H=`${J}/og.png`,F=`${X} commerce report by decocms`;return[`<title>${xG(W)}</title>`,`<meta name="description" content="${xG(K)}" />`,'<meta name="robots" content="noindex, follow" />','<meta property="og:type" content="website" />','<meta property="og:site_name" content="decocms" />',`<meta property="og:title" content="${xG(W)}" />`,`<meta property="og:description" content="${xG(K)}" />`,`<meta property="og:url" content="${xG(J)}" />`,`<meta property="og:image" content="${xG(H)}" />`,'<meta property="og:image:width" content="1200" />','<meta property="og:image:height" content="630" />',`<meta property="og:image:alt" content="${xG(F)}" />`,'<meta name="twitter:card" content="summary_large_image" />',`<meta name="twitter:title" content="${xG(W)}" />`,`<meta name="twitter:description" content="${xG(K)}" />`,`<meta name="twitter:image" content="${xG(H)}" />`,`<meta name="twitter:image:alt" content="${xG(F)}" />`,`<link rel="canonical" href="${xG(J)}" />`,`<link rel="icon" href="${xG(Y)}" sizes="any" />`].join(`
2929
+ `;await Bn$(Z.repo,w);let L=O[0]??`${OR0(X)}/${EY1(N)}.json`;H.push({path:L,content:w});let E=L.slice(L.lastIndexOf("/")+1,-5);F.set(L,{stem:E,content:w});for(let j of O.slice(1))H.push({path:j,deleted:!0}),F.delete(j)}for(let N of $.del)for(let B of IY1(K,N))H.push({path:B,deleted:!0}),F.delete(B);if(H.length===0)return J;let U=X?`${X}/.deco/blocks.gen.json`:".deco/blocks.gen.json";if(W.some((N)=>N.type==="blob"&&N.path===U)){let N=await On$(Z,F.values(),Y),{decofile:B,skipped:O}=te(N);if(O.length>0)console.warn("decofile gen: dropped blocks that were not valid JSON",{repo:XW(Z.repo),branch:Q,packagePath:X,blocks:O.map((w)=>w.key)});H.push({path:U,content:B})}try{let{sha:N}=await Z.commitFiles({branch:Q,message:Aj6($),expectedHead:J,changes:H});return N}catch(N){if(!(N instanceof x5)||G>=jj6-1)throw N;await z$(K7(2000,200,G,2,0.5))}}}function Aj6($){let Z=(Y)=>{let G=Y.slice(0,3).join(", ");return Y.length>3?`${G} (+${Y.length-3} more)`:G},Q=[];if($.set.size>0)Q.push(`update ${Z([...$.set.keys()])}`);if($.del.size>0)Q.push(`delete ${Z([...$.del])}`);let X=`chore(decofile): ${Q.join("; ")}`;return ut0(X,$.deps.coAuthor)}var jj6=3,CY1;var _n$=D(()=>{Jw0();KR0();y5();f8();tZ();DR0();CY1=new Map});import{createHmac as vn$,randomBytes as Tj6,timingSafeEqual as Rj6}from"crypto";function fn$(){if(AR0)return AR0;let $;try{let Z=M0();$=Z.studioJwtSecret??Z.betterAuthSecret}catch{$=void 0}return AR0=$?Buffer.from($):Tj6(32),AR0}function _Y1($){let Z=$.nowMs??Date.now(),Q={o:$.organizationId,m:$.virtualMcpId,b:$.branch,e:Math.floor((Z+qj6)/1000)},X=Buffer.from(JSON.stringify(Q)).toString("base64url"),Y=vn$("sha256",fn$()).update(X).digest("base64url");return`${X}.${Y}`}function bn$($,Z){let Q=$.indexOf(".");if(Q<0)return!1;let X=$.slice(0,Q),Y=Buffer.from($.slice(Q+1)),G=Buffer.from(vn$("sha256",fn$()).update(X).digest("base64url"));if(Y.length!==G.length||!Rj6(Y,G))return!1;let J;try{J=JSON.parse(Buffer.from(X,"base64url").toString())}catch{return!1}let W=Math.floor((Z.nowMs??Date.now())/1000);return J.o===Z.organizationId&&J.m===Z.virtualMcpId&&J.b===Z.branch&&typeof J.e==="number"&&J.e>=W}var qj6=21600000,AR0=null;var xn$=D(()=>{E$()});import{z as Fc}from"zod";function Mj6($){return $.length>0&&$.length<=255&&!$.includes("..")&&!$.endsWith("/")&&!$.endsWith(".lock")&&Ij6.test($)}function ln$($){return $.req.header("x-forwarded-host")??new URL($.req.url).host}async function Q00($){let Z=$.get("decofileScope");return xg($.var.studioContext,Z.organizationId,Z.githubRepo)}function X00($,Z){let Q=Z instanceof Error?Z.message:String(Z);if(Z instanceof x5)return $.json({error:Q},409);let X=zJ(Z);if(X!==null){let Y=X===404?404:X===409||X===422?409:502;return $.json({error:Q},Y)}return $.json({error:Q},500)}function cn$(){let $=new Q1;return $.use("/:virtualMcpId/:branch",un$),$.use("/:virtualMcpId/:branch/*",un$),$.get("/:virtualMcpId/:branch",async(Z)=>{let Q=Z.get("decofileScope");try{let X=await Q00(Z),Y=await Dn$(X,Q.branch,Q.packagePath,{createBranchIfMissing:!!Q.userId}),G={ETag:`"${Y.sha}"`,"Cache-Control":"no-store","Access-Control-Allow-Origin":"*"};if(Z.req.header("if-none-match")===`"${Y.sha}"`)return Z.body(null,304,G);if(!Q.userId)return Z.body(Y.decofile,200,{...G,"content-type":"application/json"});let J=_Y1({organizationId:Q.organizationId,virtualMcpId:Q.virtualMcpId,branch:Q.branch});return Z.body(`{"version":${JSON.stringify(Y.sha)},"token":${JSON.stringify(J)},"apiHost":${JSON.stringify(ln$(Z))},"decofile":${Y.decofile}}`,200,{...G,"content-type":"application/json"})}catch(X){return X00(Z,X)}}),$.get("/:virtualMcpId/:branch/meta",async(Z)=>{let Q=Z.get("decofileScope"),X=Q.packagePath?`${Q.packagePath}/.deco/meta.gen.json`:".deco/meta.gen.json";try{let Y=await Q00(Z),G=await Y.readFileAtRef(Q.branch,X);if(G===null){let J=await Y.getDefaultBranch();if(J!==Q.branch)G=await Y.readFileAtRef(J,X)}if(G===null)return Z.json({error:"meta.gen.json not committed"},404);return Z.body(G,200,{"content-type":"application/json","Cache-Control":"no-store","Access-Control-Allow-Origin":"*"})}catch(Y){return X00(Z,Y)}}),$.patch("/:virtualMcpId/:branch",Vj6,async(Z)=>{let Q=Z.get("decofileScope"),X=Z.var.studioContext,Y=Sj6.safeParse(await Z.req.json().catch(()=>null));if(!Y.success)return Z.json({error:"Invalid body",details:Y.error.issues},400);let G=Y.data;for(let J of[...Object.keys(G.set??{}),...G.delete??[]])try{WR0(J)}catch(W){let K=W instanceof Error?W.message:String(W);return Z.json({error:K},400)}for(let[J,W]of Object.entries(G.set??{})){if(typeof W!=="object"||W===null||Array.isArray(W))return Z.json({error:`Block "${J}" must be a JSON object`},400);if(LY1(J))return Z.json({error:`Block key "${J}" collides with a framework resolver module and cannot be written`},400)}try{let J=await Q00(Z),W=await Cn$(`${Q.organizationId}/${Q.virtualMcpId}/${Q.branch}`,{client:J,branch:Q.branch,packagePath:Q.packagePath,coAuthor:Yc(X)},G),K=_Y1({organizationId:Q.organizationId,virtualMcpId:Q.virtualMcpId,branch:Q.branch});return Z.json({version:W,token:K,apiHost:ln$(Z)})}catch(J){return X00(Z,J)}}),$.post("/:virtualMcpId/:branch/publish",async(Z)=>{let Q=Z.get("decofileScope");try{let X=await Q00(Z),Y=await X.getDefaultBranch();if(Y===Q.branch)return Z.json({error:"Branch is already the default branch"},400);let G=`chore(decofile): publish ${Q.branch}`;try{let J;try{J=await X.mergeBranches(Y,Q.branch,G)}catch(W){if(zJ(W)!==409)throw W;await jR0(X,Q.branch,Y),J=await X.mergeBranches(Y,Q.branch,G)}return J?Z.json({result:"merged",sha:J}):Z.json({result:"up-to-date"})}catch(J){if(zJ(J)===409)return Z.json({error:"merge-conflict"},409);if(zJ(J)===405){let K=await X.findOpenChangeRequest(Y,Q.branch)??await X.createChangeRequest({base:Y,head:Q.branch,title:`Publish ${Q.branch}`});return Z.json({result:"pull-request",number:K.number,url:K.url})}throw J}}catch(X){return X00(Z,X)}}),$.get("/:virtualMcpId/:branch/status",async(Z)=>{let Q=Z.get("decofileScope");try{let X=await Q00(Z),Y=await X.getDefaultBranch();if(Y===Q.branch)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0,lastCommitAt:null});try{let[{aheadBy:G,behindBy:J},W]=await Promise.all([X.compare(Y,Q.branch),X.getBranch(Q.branch)]);return Z.json({baseBranch:Y,aheadBy:G,behindBy:J,lastCommitAt:W?.committedAt??null})}catch(G){if(zJ(G)===404)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0,lastCommitAt:null});throw G}}catch(X){return X00(Z,X)}}),$}var Ij6,yn$=500,gn$=1048576,hn$=1024,kj6=8388608,Vj6,Sj6,un$;var dn$=D(()=>{er0();KR0();u$();rH();WY1();JR0();VY1();tZ();_n$();xn$();kY1();DR0();Ij6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;Vj6=Z9({maxSize:kj6,onError:($)=>$.json({error:"Payload too large"},413)}),Sj6=Fc.object({set:Fc.record(Fc.string(),Fc.unknown()).optional(),delete:Fc.array(Fc.string()).optional()}).refine(($)=>Object.keys($.set??{}).length>0||($.delete?.length??0)>0,{message:"Patch must set or delete at least one block"}).refine(($)=>Object.keys($.set??{}).length+($.delete?.length??0)<=yn$,{message:`Patch cannot touch more than ${yn$} blocks`}).refine(($)=>Object.values($.set??{}).every((Z)=>JSON.stringify(Z).length<=gn$),{message:`Each block must be at most ${gn$} bytes`}).refine(($)=>[...Object.keys($.set??{}),...$.delete??[]].every((Z)=>Z.length<=hn$),{message:`Each block key must be at most ${hn$} characters`}),un$=GR0(async($,Z)=>{let Q=$.var.studioContext,X=Q.organization;if(!X)return $.json({error:"Organization scope required"},500);let Y=$.req.param("virtualMcpId"),G=$.req.param("branch");if(!Y||!G)return $.json({error:"virtualMcpId and branch are required"},400);if(!Mj6(G))return $.json({error:`Invalid branch name: ${G}`},400);let J=Q.auth?.user?.id??null;if(!J){let B=$.req.query("token");if(!($.req.method==="GET"&&!$.req.path.match(/\/(publish|status)$/)))return $.json({error:"Unauthorized"},401);if(!B||!bn$(B,{organizationId:X.id,virtualMcpId:Y,branch:G}))return $.json({error:"Unauthorized"},401)}let W=await Q.storage.virtualMcps.findById(Y);if(!W||W.organization_id!==X.id)return $.json({error:"Virtual MCP not found"},404);let K=W.metadata??null;if(!PL0(K))return $.json({error:"Project has no preview server configured"},404);let F=W.connections?.map((B)=>B.connection_id)??[],U=$00(K,F);if(!U)return $.json({error:"Project has no GitHub repository"},404);let N=K?.runtime;return $.set("decofileScope",{organizationId:X.id,virtualMcpId:Y,branch:G,packagePath:N?.path?.replace(/^\/+|\/+$/g,"")||null,githubRepo:U,userId:J}),Z()})});var mn$=($)=>{let Z=new Q1;if(Z.use("*",Uf),Z.use("*",Ic$),Z.route("/",E20()),Z.route("/",Jd$()),Z.route("/",rc$()),Z.route("/",Up$()),Z.route("/",Kp$()),Z.route("/",QR0()),Z.route("/tools",Ep$()),Z.route("/",Dp$()),Z.route("/",hi$({kvStorage:$.kvStorage})),Z.route("/",yi$()),Z.route("/fs",ei$({getConnection:$.getNatsConnection})),Z.route("/sandbox",Vn$()),Z.route("/decofile",cn$()),Z.route("/",Gp$()),Z.route("/",Zp$()),Z.route("/deco-sites",z20()),Z.route("/hosting",hc$()),Z.route("/monitor",pc$()),Z.route("/sso",N20()),Z.route("/",XR0({tokenStorage:$.tokenStorage,automationEventDispatcher:$.automationEventDispatcher})),Z.route("/webhooks",fc$()),$.mountDevAssets)Z.route("/dev-assets",R20({orgFromPath:!0}));return Z.use("/mcp/:connectionId?",$.mcpAuth),Z.use("/mcp/:connectionId/ui-resource",$.mcpAuth),Z.use("/mcp/gateway/:virtualMcpId?",$.mcpAuth),Z.use("/mcp/virtual-mcp/:virtualMcpId?",$.mcpAuth),Z.use("/mcp/self",$.mcpAuth),Z.use("/mcp/task-run/:threadId",$.mcpAuth),Z.route("/",ah$()),Z.get("/mcp/:gateway?/:connectionId/.well-known/oauth-protected-resource/*",$.betterAuthProtectedResourceHandler),Z.get("/mcp/.well-known/oauth-protected-resource",$.betterAuthProtectedResourceHandler),Z.route("/mcp/task-run",Xp$()),Z.route("/mcp",Rj0()),Z.route("/mcp/self",ZR0()),Z.route("/mcp",Mj0()),Z.all("/oauth-proxy/:connectionId/*",$.oauthProxyHandler),Z.get("/watch",$.watchHandler),Z};var in$=D(()=>{u$();Mc$();K20();bc$();MQ1();uc$();nc$();q20();Ee();AQ1();bQ1();gi$();ui$();$p$();Qp$();Tr();wQ1();kj0();$Y1();Yp$();Jp$();Hp$();Np$();wp$();QY1();jp$();XY1();qj0();Sn$();dn$()});function Cj6($){return $.filter((Z)=>Z.vendors?.alias).map((Z)=>({name:Z.name,title:Z.title,description:Z.description,logo:Z.logo,category:Z.category,vendor:{alias:Z.vendors.alias,url:Z.vendors.url}}))}var _j6=async($,Z)=>{if(!$.get("studioContext").auth.user?.id)return $.json({error:"Unauthorized"},401);return Z()},pn$=()=>{let $=new Q1;return $.use("*",_j6),$.get("/",async(Z)=>{let Q=M0(),X=Q.decoSupabaseUrl,Y=Q.decoSupabaseServiceKey;if(!X||!Y)return Z.json({apps:[]});try{let G=await _Y(X,Y,"apps?select=name,title,description,logo,category,vendors(alias,url)");return Z.json({apps:Cj6(G)})}catch(G){return console.error("[deco-apps] GET error:",G),Z.json({error:"Failed to fetch apps"},502)}}),$};var nn$=D(()=>{u$();E$();ET0()});import{z as M1}from"zod";function QF($,Z="invalid_request_error",Q=null,X=null){return{error:{message:$,type:Z,param:Q,code:X}}}function cj6($){if(!$)return null;let Z=$.indexOf(":");if(Z===-1)return{credentialId:null,modelId:$};let Q=$.substring(0,Z),X=$.substring(Z+1);if(!Q||!X)return null;return{credentialId:Q,modelId:X}}function dj6($,Z,Q){try{return JSON.parse($)}catch{throw new rn$(`Invalid JSON in tool call arguments for function '${Q}' (tool_call_id: ${Z}): ${$}`)}}function mj6($){let Z={};for(let Q of $)if(Q.role==="assistant"&&Q.tool_calls)for(let X of Q.tool_calls)Z[X.id]=X.function.name;return $.map((Q)=>{switch(Q.role){case"system":return{role:"system",content:Q.content};case"user":if(typeof Q.content==="string")return{role:"user",content:Q.content};return{role:"user",content:Q.content.map((Y)=>{if(Y.type==="text")return{type:"text",text:Y.text};return{type:"image",image:Y.image_url.url}})};case"assistant":if(Q.tool_calls&&Q.tool_calls.length>0)return{role:"assistant",content:Q.tool_calls.map((Y)=>({type:"tool-call",toolCallId:Y.id,toolName:Y.function.name,input:dj6(Y.function.arguments,Y.id,Y.function.name)}))};return{role:"assistant",content:Q.content??""};case"tool":let X=Z[Q.tool_call_id]??"unknown";return{role:"tool",content:[{type:"tool-result",toolCallId:Q.tool_call_id,toolName:X,output:{type:"text",value:Q.content}}]}}})}function ij6($){let Z=$.map((Q)=>{let X=Q.function.parameters?LG(Q.function.parameters):LG({type:"object",properties:{}});return[Q.function.name,W$({description:Q.function.description,inputSchema:X})]});return Object.fromEntries(Z)}function pj6($){if(!$)return;return{openai:{response_format:$}}}function nj6(){return`chatcmpl-${crypto.randomUUID().replace(/-/g,"").substring(0,29)}`}function tn$($,Z,Q,X,Y,G){let J={model:$,messages:Z,tools:Q,temperature:X.temperature,maxTokens:X.max_tokens,topP:X.top_p,frequencyPenalty:X.frequency_penalty,presencePenalty:X.presence_penalty,stopSequences:X.stop?Array.isArray(X.stop)?X.stop:[X.stop]:void 0,abortSignal:G};return Y?{...J,providerOptions:Y}:J}function on$($){if($==="tool-calls")return"tool_calls";if($==="length")return"length";return"stop"}var vj6=256,fj6,bj6,xj6,yj6,gj6,hj6,uj6,lj6,rn$,sn$,an$;var en$=D(()=>{S4();u$();Xc();GN();fj6=M1.object({type:M1.literal("function"),function:M1.object({name:M1.string(),description:M1.string().optional(),parameters:M1.record(M1.string(),M1.unknown()).optional()})}),bj6=M1.object({id:M1.string(),type:M1.literal("function"),function:M1.object({name:M1.string(),arguments:M1.string()})}),xj6=M1.discriminatedUnion("role",[M1.object({role:M1.literal("system"),content:M1.string(),name:M1.string().optional()}),M1.object({role:M1.literal("user"),content:M1.union([M1.string(),M1.array(M1.union([M1.object({type:M1.literal("text"),text:M1.string()}),M1.object({type:M1.literal("image_url"),image_url:M1.object({url:M1.string(),detail:M1.string().optional()})})]))]),name:M1.string().optional()}),M1.object({role:M1.literal("assistant"),content:M1.string().nullable().optional(),name:M1.string().optional(),tool_calls:M1.array(bj6).optional()}),M1.object({role:M1.literal("tool"),content:M1.string(),tool_call_id:M1.string()})]),yj6=M1.object({type:M1.literal("text")}),gj6=M1.object({type:M1.literal("json_object")}),hj6=M1.object({type:M1.literal("json_schema"),json_schema:M1.object({name:M1.string(),description:M1.string().optional(),schema:M1.record(M1.string(),M1.unknown()),strict:M1.boolean().optional()})}),uj6=M1.union([yj6,gj6,hj6]),lj6=M1.object({model:M1.string().describe("Format: 'model_id' or 'credential_id:model_id'"),messages:M1.array(xj6),stream:M1.boolean().optional().default(!1),temperature:M1.number().min(0).max(2).optional(),max_tokens:M1.number().positive().optional(),top_p:M1.number().min(0).max(1).optional(),frequency_penalty:M1.number().min(-2).max(2).optional(),presence_penalty:M1.number().min(-2).max(2).optional(),stop:M1.union([M1.string(),M1.array(M1.string())]).optional(),tools:M1.array(fj6).optional(),tool_choice:M1.union([M1.literal("auto"),M1.literal("none"),M1.literal("required"),M1.object({type:M1.literal("function"),function:M1.object({name:M1.string()})})]).optional(),response_format:uj6.optional(),user:M1.string().optional()});rn$=class rn$ extends Error{constructor($){super($);this.name="MessageConversionError"}};sn$=new Q1;sn$.post("/:org/v1/chat/completions",async($)=>{let Z=$.get("studioContext"),Q=$.req.param("org");try{if(!Z.auth.apiKey?.id)return $.json(QF("API key authentication required. Provide a valid API key via Authorization header.","authentication_error"),401);if(!Z.organization)return $.json(QF("Organization context is required. Ensure your API key has organization metadata.","invalid_request_error","organization"),400);if((Z.organization.slug??Z.organization.id)!==Q)return $.json(QF("Organization mismatch. The API key's organization does not match the requested organization.","invalid_request_error","organization"),403);let X=await $.req.json(),Y=lj6.safeParse(X);if(!Y.success){let L=Y.error.issues[0]??{message:"Invalid request",path:[]};return $.json(QF(`Invalid request: ${L.message}`,"invalid_request_error",L.path.length>0?L.path.join("."):null),400)}let G=Y.data,J=cj6(G.model);if(!J)return $.json(QF("Invalid model format. Expected 'model_id' or 'credential_id:model_id' (e.g., 'claude-sonnet-4-6' or 'key_abc123:claude-sonnet-4-6')","invalid_request_error","model"),400);let{credentialId:W}=J,{modelId:K}=J;if(!W){let E=(await Z.storage.aiProviderKeys.list({organizationId:Z.organization.id})).find((j)=>tL(j.providerId));if(!E)return $.json(QF("No AI provider credentials configured for this organization. Add a credential in settings or specify one explicitly via 'credential_id:model_id'.","invalid_request_error","model"),400);W=E.id}let H;try{H=await Z.aiProviders.activate(W,Z.organization.id)}catch{return $.json(QF(`AI provider credential not found or inaccessible: ${W}`,"invalid_request_error","model"),404)}let F=H.aiSdk.languageModel(K),U=mj6(G.messages),N=G.tools?ij6(G.tools):void 0,B=pj6(G.response_format),O=nj6(),w=Math.floor(Date.now()/1000);if(G.stream)return MN($,async(L)=>{let E=tn$(F,U,N,G,B,$.req.raw.signal);try{let j=SD(E),z=!1,P=0,A="",q=async()=>{if(A.length===0)return;let k=A;A="",await L.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:w,model:G.model,choices:[{index:0,delta:{content:k},finish_reason:null}]})})};for await(let k of j.fullStream){if(!z&&(k.type==="text-delta"||k.type==="tool-call"))await L.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:w,model:G.model,choices:[{index:0,delta:{role:"assistant",content:""},finish_reason:null}]})}),z=!0;if(k.type==="text-delta"){if(A+=k.text,A.length>=vj6)await q()}else if(k.type==="tool-call"){await q();let M=P++;await L.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:w,model:G.model,choices:[{index:0,delta:{tool_calls:[{index:M,id:k.toolCallId,type:"function",function:{name:k.toolName,arguments:JSON.stringify(k.input)}}]},finish_reason:null}]})})}else if(k.type==="finish")await q(),await L.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:w,model:G.model,choices:[{index:0,delta:{},finish_reason:on$(k.finishReason)}],usage:k.totalUsage?{prompt_tokens:k.totalUsage.inputTokens??0,completion_tokens:k.totalUsage.outputTokens??0,total_tokens:k.totalUsage.totalTokens??0}:void 0})})}await q(),await L.writeSSE({data:"[DONE]"})}catch(j){let z=j;console.error("[openai-compat:stream] Error:",z.message),await L.writeSSE({data:JSON.stringify({error:{message:z.message,type:"server_error"}})})}});else{let L=tn$(F,U,N,G,B,$.req.raw.signal),E=await kD(L),j={role:"assistant",content:E.text||null};if(E.toolCalls&&E.toolCalls.length>0)j.tool_calls=E.toolCalls.map((z)=>({id:z.toolCallId,type:"function",function:{name:z.toolName,arguments:JSON.stringify("input"in z?z.input:{})}})),j.content=null;return $.json({id:O,object:"chat.completion",created:w,model:G.model,choices:[{index:0,message:j,finish_reason:on$(E.finishReason)}],usage:{prompt_tokens:E.usage?.inputTokens??0,completion_tokens:E.usage?.outputTokens??0,total_tokens:E.usage?.totalTokens??0}})}}catch(X){let Y=X;if(Y.name==="AbortError")return $.json(QF("Request aborted","invalid_request_error"),400);if(Y.name==="MessageConversionError")return $.json(QF(Y.message,"invalid_request_error","messages"),400);return console.error("[openai-compat] Error:",Y.message,Y.stack),$.json(QF(Y.message,"server_error"),500)}});an$=sn$});function tj6($){if(typeof $!=="object"||$===null)return!1;let Q=$.githubRepo?.url;return typeof Q==="string"&&Q.length>0}function $t$(){let $=new Q1;return $.use("*",async(Z,Q)=>{await Q(),Z.header("Cache-Control","private, no-store"),Z.header("Vary","Cookie")}),$.get("/",async(Z)=>{let Q=Z.get("studioContext"),X=n0(Q);if(!X)return Z.json({error:"Authentication required"},401);let G=(Z.req.query("site")??"").trim().toLowerCase();if(!WX(G))return Z.json({error:"Invalid site slug"},400);let J=await Q.db.selectFrom("member").innerJoin("organization","organization.id","member.organizationId").select(["organization.id as id","organization.slug as slug","organization.name as name","organization.metadata as metadata"]).where("member.userId","=",X).execute(),W=[];for(let H of J){if(!H.slug||n9(H))continue;let F=await Q.storage.virtualMcps.list(H.id);for(let U of F){if(A$$(U)!==G)continue;if(!tj6(U.metadata))continue;W.push({orgSlug:H.slug,orgName:H.name??H.slug,project:{id:U.id,title:U.title,icon:U.icon??null}})}}let K={matches:W};return Z.json(K)}),$}var Zt$=D(()=>{u$();HU()});var Xt$;var Qt$=D(()=>{Xt$={name:"decocms",version:"4.344.2",description:"Deco CMS \u2014 Self-hostable MCP Gateway for managing AI connections and tools",author:"Deco team",repository:{type:"git",url:"git+https://github.com/decocms/studio.git",directory:"apps/api"},bugs:{url:"https://github.com/decocms/studio/issues"},type:"module",bin:{deco:"./dist/server/cli.js"},files:["dist/**/*"],scripts:{dev:"bun run migrate && bun run dev:server","dev:server":"bun run --cwd=../../packages/sandbox build && NODE_ENV=development bun --env-file=.env --hot run src/index.ts",build:"bun run build:server","build:server":"bun run scripts/bundle-server-script.ts --dist ./dist/server","generate:tool-contracts":"bun run scripts/generate-tool-contracts.ts","db:migrate":"bun run ./dist/server/migrate.js","db:migrate:dbos":"bun run ./dist/server/migrate-dbos.js",check:"tsc --noEmit",start:"bun run ./dist/server/server.js",migrate:"bun run src/database/migrate.ts","migrate:dbos":"bun run src/database/migrate-dbos.ts",test:"bun test src","better-auth:migrate":"bunx --bun @better-auth/cli migrate -y --config src/auth/index.ts",prepublishOnly:"bun run --cwd=../.. build:studio"},optionalDependencies:{"@duckdb/node-api":"^1.5.0-r.1"},dependencies:{"@ai-sdk/anthropic":"^3.0.85","@ai-sdk/google":"^3.0.83","@ai-sdk/openai":"^3.0.73","@anthropic-ai/sdk":"^0.105.0","@aws-sdk/client-s3":"^3.1013.0","@aws-sdk/client-sts":"^3.1013.0","@aws-sdk/lib-storage":"^3.1013.0","@aws-sdk/s3-request-presigner":"^3.1013.0","@clickhouse/client":"^1.8.1","@dbos-inc/dbos-sdk":"^4.21.6","@inkjs/ui":"^2.0.0","@nats-io/jetstream":"3.4.0","@nats-io/kv":"3.4.0","@nats-io/nats-core":"3.4.0","@nats-io/transport-node":"3.4.0","@openrouter/ai-sdk-provider":"^2.9.1","@opentelemetry/core":"^2.6.0","embedded-postgres":"^18.3.0-beta.16",ink:"^6.8.0",kysely:"^0.28.12","posthog-node":"^5.0.0",react:"^19.2.6","react-dom":"^19.2.6"},devDependencies:{"@ai-sdk/provider":"^3.0.10","@better-auth/sso":"1.4.1","@decocms/better-auth":"1.5.17","@decocms/bindings":"workspace:*","@decocms/mcp-utils":"workspace:*","@decocms/runtime":"workspace:*","@decocms/sandbox":"workspace:*","@decocms/shared":"workspace:*","@jitl/quickjs-wasmfile-release-sync":"0.31.0","@modelcontextprotocol/sdk":"1.29.0","@opentelemetry/api":"^1.9.0","@opentelemetry/api-logs":"^0.211.0","@opentelemetry/exporter-logs-otlp-proto":"^0.211.0","@opentelemetry/exporter-prometheus":"^0.208.0","@opentelemetry/exporter-trace-otlp-proto":"^0.207.0","@opentelemetry/instrumentation-runtime-node":"^0.24.0","@opentelemetry/resources":"^2.6.0","@opentelemetry/sdk-logs":"^0.211.0","@opentelemetry/sdk-metrics":"^2.2.0","@opentelemetry/sdk-node":"^0.207.0","@opentelemetry/sdk-trace-base":"^2.5.0","@types/bun":"^1.3.1","@types/google.maps":"^3.65.2","@types/pg":"^8.15.6","@types/react-syntax-highlighter":"^15.5.13","@vercel/nft":"^1.1.1",ai:"^6.0.208","better-auth":"1.4.22",croner:"^9.1.0",degit:"^2.8.4",hono:"^4.10.7",jose:"^6.0.11",nanoid:"^5.1.6",pg:"^8.16.3",typescript:"^7.0.2",typescript5:"npm:typescript@^5.9.3",zod:"4.3.6"},homepage:"https://github.com/decocms/studio",keywords:["mcp","model-context-protocol","ai","gateway","self-hosted","tools"],license:"MIT",publishConfig:{access:"public"}}});function sj6(){let $=process.env.POSTHOG_KEY;if(!$)return null;return{key:$,host:process.env.POSTHOG_HOST??rj6}}var Yt$,rj6="https://ph.studio.decocms.com",Gt$;var Jt$=D(()=>{u$();kZ0();r_();C5();E$();WQ1();Qt$();Yt$=new Q1;Yt$.get("/",($)=>{let Z={version:Xt$.version,theme:it1(),...XU().logo&&{logo:XU().logo},...pU()&&{internalUrl:Bb1()},...M0().enableDecoImport&&{enableDecoImport:!0},brandExtractEnabled:!!M0().firecrawlApiKey,hostingEnabled:!!M0().controlplaneRestUrl&&!!M0().controlplaneServiceToken,hostingControlPlaneGa:M0().hostingControlPlaneGa,monitorEnabled:!!M0().clickhouseAnalyticsUrl&&!!M0().clickhouseAnalyticsPassword,monitorGa:M0().monitorGa,auth:bl$(),posthog:sj6(),googleMapsApiKey:process.env.GOOGLE_MAPS_API_KEY?.trim()||null,runtime:{agentSandbox:U00()}};return $.header("Cache-Control","no-store"),$.json({success:!0,config:Z})});Gt$=Yt$});function Uc($){let Z=($??"").trim().toLowerCase();return Z=Z.replace(/^https?:\/\//,""),Z=Z.replace(/^www\./,""),Z=Z.split(/[/?#]/)[0]??"",Z.replace(/\/+$/,"")}function vY1($){return(Uc($).split(".")[0]||$).replace(/[-_]/g," ").split(" ").filter(Boolean).map((Q)=>Q.charAt(0).toUpperCase()+Q.slice(1)).join(" ")}function Kt$($,Z=64){return`https://www.google.com/s2/favicons?domain=${encodeURIComponent(Uc($))}&sz=${Z}`}function Wt$($,Z){let Q=$.trim();if(Q.length<=Z)return Q;let X=Q.slice(0,Z-1),Y=X.lastIndexOf(" ");return`${(Y>Z*0.6?X.slice(0,Y):X).trimEnd()}\u2026`}function Ht$($){let{brand:Z,domain:Q,score:X,verdict:Y}=$,G=typeof X==="number"?`${Z} commerce report \u2014 ${Math.round(X)}/100 \xB7 decocms`:`${Z} commerce report \xB7 decocms`,J=`See the full ${Z} scorecard \u2014 SEO, performance, conversion & AEO signals scored by decocms.`,W=Y?.trim()?Wt$(`${Y.trim().replace(/\s+/g," ")} \u2014 ${J}`,200):Wt$(`How does ${Q} really perform? ${J}`,200);return{title:G,description:W}}import{z as c0}from"zod";var kf,aj6,ej6,$z6,Zz6,Ft$;var Ut$=D(()=>{kf=c0.enum(["good","bad","neutral"]),aj6=c0.preprocess(($)=>{if(Array.isArray($))return{kind:"text",value:$.find((Q)=>Q!==null&&typeof Q!=="object")??""};return $!==null&&typeof $==="object"?$:{kind:"text",value:$}},c0.object({kind:c0.enum(["text","number","sparkline","badge","score"]).catch("text"),value:c0.coerce.string().optional(),tone:kf.optional(),muted:c0.boolean().optional(),delta:c0.coerce.string().optional(),deltaDir:c0.enum(["up","down","neutral"]).optional(),points:c0.array(c0.coerce.number()).optional(),label:c0.coerce.string().optional()}).transform(($)=>{if($.kind==="badge"&&$.label==null)$.label=$.value??"";if($.kind==="score"){let Z=Number($.value);if(Number.isNaN(Z))return{...$,kind:"text"}}return $})),ej6=c0.preprocess(($)=>{let Z=$;if(Z&&typeof Z==="object"&&!Array.isArray(Z)&&Array.isArray(Z.cells))Z=Z.cells;if(Array.isArray(Z)&&Z.length===1&&Array.isArray(Z[0]))Z=Z[0];if(Array.isArray(Z))return Z;if(Z&&typeof Z==="object")return Object.values(Z);return Z},c0.array(aj6)),$z6={key:c0.coerce.string(),title:c0.coerce.string(),eyebrow:c0.coerce.string().optional(),headline:c0.coerce.string(),annotation:c0.coerce.string().optional(),methodology:c0.coerce.string().optional(),sources:c0.array(c0.object({name:c0.coerce.string(),logoUrl:c0.coerce.string()})).optional()},Zz6=c0.discriminatedUnion("template",[c0.object({template:c0.literal("cover"),score:c0.object({value:c0.coerce.number(),max:c0.coerce.number().optional(),grade:c0.coerce.string().optional(),label:c0.coerce.string().optional()}).optional(),brandImage:c0.coerce.string().optional(),screenshot:c0.coerce.string().optional(),mobileScreenshot:c0.coerce.string().optional()}),c0.object({template:c0.literal("cta"),ctaUrl:c0.coerce.string().optional(),ctaLabel:c0.coerce.string().optional(),bullets:c0.array(c0.coerce.string()).optional()}),c0.object({template:c0.literal("series"),points:c0.array(c0.coerce.number()).min(2),xLabels:c0.array(c0.coerce.string()).min(1),unit:c0.coerce.string().optional(),callout:c0.object({index:c0.coerce.number(),value:c0.coerce.string(),tone:kf.optional()})}),c0.object({template:c0.literal("threshold"),value:c0.coerce.string().default(""),metricLabel:c0.coerce.string().optional(),ratio:c0.coerce.number(),thresholdRatio:c0.coerce.number().optional(),thresholdLabel:c0.coerce.string().default(""),tone:kf.optional()}),c0.object({template:c0.literal("stats"),stats:c0.array(c0.object({value:c0.coerce.string(),label:c0.coerce.string(),tone:kf.optional()})).min(1)}),c0.object({template:c0.literal("bars"),items:c0.array(c0.object({value:c0.coerce.string(),label:c0.coerce.string(),ratio:c0.coerce.number(),tone:kf.optional()})).min(1)}),c0.object({template:c0.literal("gauges"),gauges:c0.array(c0.object({label:c0.coerce.string(),value:c0.coerce.string(),status:c0.enum(["good","warn","bad"]).catch("warn"),caption:c0.coerce.string().optional(),ratio:c0.coerce.number().optional()})).min(1)}),c0.object({template:c0.literal("checklist"),checks:c0.array(c0.object({label:c0.coerce.string(),status:c0.enum(["pass","fail","warn"]).catch("fail"),value:c0.coerce.string().optional()})).min(1)}),c0.object({template:c0.literal("table"),columns:c0.array(c0.object({label:c0.coerce.string(),align:c0.enum(["left","right"]).optional()})).min(1),rows:c0.array(ej6).min(1),highlightRow:c0.coerce.number().optional()}),c0.object({template:c0.literal("products"),products:c0.array(c0.object({name:c0.coerce.string(),price:c0.coerce.string().optional(),image:c0.coerce.string().optional(),url:c0.coerce.string().optional()})).min(1)}),c0.object({template:c0.literal("list"),entries:c0.array(c0.object({label:c0.coerce.string(),severity:c0.enum(["error","warning","notice"]).catch("notice")})).min(1),moreCount:c0.coerce.number().optional()}),c0.object({template:c0.literal("keywords"),volumeLabel:c0.coerce.string().optional(),keywords:c0.array(c0.object({term:c0.coerce.string(),volume:c0.coerce.string(),position:c0.coerce.number().catch(0)})).min(1)}),c0.object({template:c0.literal("competitor"),metricLabel:c0.coerce.string().optional(),competitors:c0.array(c0.object({name:c0.coerce.string(),value:c0.coerce.string(),tone:kf.optional(),isYou:c0.boolean().optional()})).min(1)}),c0.object({template:c0.literal("scorecard"),rivalLabel:c0.coerce.string().optional(),dimensions:c0.array(c0.object({label:c0.coerce.string(),you:c0.coerce.string(),rival:c0.coerce.string().optional(),rivalName:c0.coerce.string().optional(),tone:kf.optional()})).min(1)})]),Ft$=c0.object({...$z6,template:Zz6})});function TR0($){let Z=[],Q=[...$.sections].sort((Y,G)=>Y.position-G.position).map((Y)=>{let G=Ft$.safeParse(Y.props);if(G.success)return G.data;let J=G.error.issues[0];return Z.push({section_type:Y.section_type,position:Y.position,reason:J?`${J.path.join(".")||"(root)"}: ${J.message}`:"contract violation"}),null}).filter((Y)=>Y!==null),X=Q.filter((Y)=>Y.template.template!=="cover"&&Y.template.template!=="cta").map((Y)=>({key:Y.key,title:Y.title}));return{deck:{meta:{...$.meta,scores:$.summary?.scores,scannedAt:$.scanned_at,toc:X},slides:Q},drops:Z}}var fY1=D(()=>{Ut$()});import{join as Nt$}from"path";async function Xz6($){try{let Z=await fetch(`${xK({})}/api/v2/public/diagnostics/${encodeURIComponent($)}`,{headers:{Accept:"application/json"},signal:AbortSignal.timeout(Qz6)});if(!Z.ok)return null;let Q=await Z.json(),{deck:X}=TR0(Q);if(!X.slides.length)return null;let Y=X.slides.find((W)=>W.template.template==="cover"),G=Y?.template,J=G&&G.template==="cover"?G:void 0;return{brand:X.meta.brand?.trim()||vY1($),score:X.meta.scores?.cover??J?.score?.value,verdict:Y?.annotation?.trim()||Y?.headline?.trim()||void 0}}catch{return null}}function xG($){return $.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function Yz6($,Z){let Q=Uc($),X=Z?.brand?.trim()||vY1(Q),Y=Kt$(Q,128),J=`${(M0().baseUrl??"https://studio.decocms.com").replace(/\/+$/,"")}/report/${encodeURIComponent(Q)}`,{title:W,description:K}=Ht$({brand:X,domain:Q,score:Z?.score,verdict:Z?.verdict}),H=`${J}/og.png`,F=`${X} commerce report by decocms`;return[`<title>${xG(W)}</title>`,`<meta name="description" content="${xG(K)}" />`,'<meta name="robots" content="noindex, follow" />','<meta property="og:type" content="website" />','<meta property="og:site_name" content="decocms" />',`<meta property="og:title" content="${xG(W)}" />`,`<meta property="og:description" content="${xG(K)}" />`,`<meta property="og:url" content="${xG(J)}" />`,`<meta property="og:image" content="${xG(H)}" />`,'<meta property="og:image:width" content="1200" />','<meta property="og:image:height" content="630" />',`<meta property="og:image:alt" content="${xG(F)}" />`,'<meta name="twitter:card" content="summary_large_image" />',`<meta name="twitter:title" content="${xG(W)}" />`,`<meta name="twitter:description" content="${xG(K)}" />`,`<meta name="twitter:image" content="${xG(H)}" />`,`<meta name="twitter:image:alt" content="${xG(F)}" />`,`<link rel="canonical" href="${xG(J)}" />`,`<link rel="icon" href="${xG(Y)}" sizes="any" />`].join(`
2930
2930
  `)}function Gz6($,Z){return $.replace(/<title>[\s\S]*?<\/title>\s*/i,"").replace(/<meta\s+name="(?:description|twitter:[^"]*)"[^>]*>\s*/gi,"").replace(/<meta\s+property="og:[^"]*"[^>]*>\s*/gi,"").replace(/<link\s+rel="icon"[^>]*>\s*/gi,"").replace("</head>",` ${Z}
2931
2931
  </head>`)}function Bt$($){let Z=new Q1;return Z.get("/:domain/og.png",async(Q)=>{let X=Uc(Q.req.param("domain")),Y=async()=>{let G=$?Bun.file(Nt$($,"report-og-fallback.png")):null;if(!G||!await G.exists())return Q.notFound();return Q.body(new Uint8Array(await G.arrayBuffer()),200,{"Content-Type":"image/png","Cache-Control":"public, max-age=0, s-maxage=3600"})};try{let G=await fetch(`${xK({})}/api/v2/public/diagnostics/${encodeURIComponent(X)}/og.png`,{signal:AbortSignal.timeout(Jz6)}),J=G.headers.get("content-type")??"";if(!G.ok||!J.startsWith("image/")||!G.body)return Y();return Q.body(G.body,200,{"Content-Type":J,"Cache-Control":"public, max-age=0, s-maxage=604800"})}catch{return Y()}}),Z.get("/:domain",async(Q)=>{let X=Q.req.param("domain"),Y=$?Nt$($,"index.html"):null,G=Y?Bun.file(Y):null;if(!G||!await G.exists())return Q.notFound();let J=await G.text();try{let W=await Xz6(Uc(X)),K=Yz6(X,W);return Q.html(Gz6(J,K),200,{"Cache-Control":"public, max-age=0, s-maxage=300"})}catch{return Q.html(J)}}),Z}var Qz6=2500,Jz6=1e4;var Ot$=D(()=>{u$();fY1();eE();E$()});function Y00($,Z){return fetch(`${xK({})}${$}`,Z)}async function Wz6($,Z,Q){let X=new URLSearchParams;if(Z)X.set("pw",Z);if(Q)X.set("lang",Q);let Y=X.toString()?`?${X.toString()}`:"",G=await Y00(`/api/v2/public/diagnostics/${encodeURIComponent($)}${Y}`,{headers:{Accept:"application/json"}});if(G.status===404)return{status:"not_found",deck:null,scanned_at:null,drops:[]};if(!G.ok)throw Error(`report read HTTP ${G.status}`);let J=await G.json(),{deck:W,drops:K}=TR0(J);return{status:W.slides.length?"ready":"empty",deck:W,scanned_at:J.scanned_at,drops:K}}var Kz6,VN,Dt$=async($,Z)=>{if(!$.get("reportUser"))return $.json({error:"Authentication required"},401);await Z();return},wt$;var Lt$=D(()=>{u$();JG();eE();fY1();Kz6=new Set(["complete","errored","terminated","unknown"]),VN=new Q1;VN.use("*",async($,Z)=>{let Q=await Q8.api.getSession({headers:$.req.raw.headers});$.set("reportUser",Q?.user?.id?{email:Q.user.email}:void 0),await Z(),$.header("Cache-Control","private, no-store"),$.header("Vary","Cookie");return});VN.use("/link-token/*",Dt$);VN.use("/suggest",Dt$);VN.get("/site/:domain",async($)=>{let Z=$.req.param("domain").trim();if(!Z)return $.json({error:"domain is required"},400);let Q=$.get("reportUser"),X=$.req.query("key")?.trim()||void 0,Y=$.req.query("lang")?.trim()||void 0;try{let G=await Wz6(Z,X,Y);if($.header("Cache-Control","private, no-store"),Q||!G.deck)return $.json(G);return $.json({...G,deck:{...G.deck,slides:G.deck.slides.slice(0,1)},truncated:G.status==="ready"})}catch{return $.json({error:"report read failed"},502)}});VN.post("/run",async($)=>{let Z=$.get("reportUser"),Q;try{Q=await $.req.json()}catch{return $.json({error:"invalid JSON"},400)}let X=typeof Q.domain==="string"?Q.domain.trim():"";if(!X)return $.json({error:"domain is required"},400);let Y=Z?.email,G=typeof Q.distinctId==="string"&&Q.distinctId.trim()&&Q.distinctId.length<=200?Q.distinctId.trim():void 0;try{let J=await Y00("/api/v2/diagnostics/run",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${aE({})}`},body:JSON.stringify({url:X,...Y?{email:Y}:{},distinct_id:G})});if(!J.ok)return $.json({error:`run HTTP ${J.status}`},502);let W=await J.json(),K=W.blocked?{state:"blocked"}:W.status==="fresh"?{state:"fresh"}:W.mode==="sync"?{state:"sync"}:{state:"running",id:W.id??null};return $.json(K)}catch{return $.json({error:"run failed"},502)}});VN.get("/status",async($)=>{let Z=$.req.query("id");if(!Z)return $.json({error:"id is required"},400);try{let Q=await Y00(`/api/v2/diagnostics/status?id=${encodeURIComponent(Z)}`,{headers:{Authorization:`Bearer ${aE({})}`}});if(!Q.ok)return $.json({error:`status HTTP ${Q.status}`},502);let Y=(await Q.json()).status??"unknown",G={done:Kz6.has(Y),status:Y};return $.json(G)}catch{return $.json({error:"status failed"},502)}});VN.get("/link-token/:id",async($)=>{let Z=$.req.param("id");try{let Q=await Y00(`/api/v2/public/link-tokens/${encodeURIComponent(Z)}`,{headers:{Accept:"application/json"}});if(Q.status===404)return $.json(null);if(!Q.ok)return $.json({error:`link token HTTP ${Q.status}`},502);return $.json(await Q.json())}catch{return $.json({error:"link token resolve failed"},502)}});VN.get("/suggest",async($)=>{let Z=($.req.query("q")??"").trim().slice(0,64);if(Z.length<2)return $.json({suggestions:[]});try{let Q=await Y00(`/api/v2/public/suggest?q=${encodeURIComponent(Z)}`,{headers:{Accept:"application/json"}});if(!Q.ok)return $.json({suggestions:[]});let X=await Q.json();return $.json({suggestions:Array.isArray(X.suggestions)?X.suggestions:[]})}catch{return $.json({suggestions:[]})}});wt$=VN});import{createHmac as Hz6,timingSafeEqual as Fz6}from"crypto";function jt$($,Z,Q,X=Date.now()){if(!Z||!Q)return!1;let Y,G=[];for(let H of Z.split(",")){let F=H.indexOf("=");if(F<=0)continue;let U=H.slice(0,F).trim(),N=H.slice(F+1).trim();if(U==="t")Y=N;else if(U==="v1")G.push(N)}if(!Y||G.length===0)return!1;let J=Number(Y);if(!Number.isFinite(J)||Math.abs(X/1000-J)>Uz6)return!1;let W=Hz6("sha256",Q).update(`${Y}.${$}`).digest("hex"),K=Buffer.from(W,"hex");return G.some((H)=>{let F=Buffer.from(H,"hex");return K.length===F.length&&Fz6(K,F)})}function zt$($){let Z;try{Z=JSON.parse($)}catch{return null}let Q=Y3(Z),X=Y3(Y3(Q?.data)?.object);if(!Q||typeof Q.type!=="string"||!X)return null;return{id:XF(Q.id),type:Q.type,created:typeof Q.created==="number"?Q.created:void 0,livemode:typeof Q.livemode==="boolean"?Q.livemode:void 0,data:{object:X}}}function Pt$($){switch($){case"active":case"trialing":return"active";case"past_due":return"past_due";default:return"canceled"}}function XF($){return typeof $==="string"?$:void 0}function Y3($){return typeof $==="object"&&$!==null?$:void 0}function RR0($){return typeof $==="number"?new Date($*1000):null}function yY1($){return XF($)??XF(Y3($)?.id)}function Nz6($){return yY1($.subscription)??XF(Y3(Y3($.parent)?.subscription_details)?.subscription)}function Bz6($){let Z=RR0($.current_period_end);if(Z)return Z;let Q=Y3($.items)?.data;if(!Array.isArray(Q))return null;let X=0;for(let Y of Q){let G=Y3(Y)?.current_period_end;if(typeof G==="number"&&G>X)X=G}return X>0?new Date(X*1000):null}function bY1($,Z){let Q=RR0($.created);return!!Q&&!!Z.lastStripeEventAt&&Q<Z.lastStripeEventAt}function xY1($,Z){let Q=RR0($.created);if(!Q)return;return Z.lastStripeEventAt&&Z.lastStripeEventAt>Q?void 0:Q}async function Oz6($,Z){let Q=Z.data.object;switch(Z.type){case"checkout.session.completed":case"checkout.session.async_payment_succeeded":{let X=XF(Y3(Q.metadata)?.orgId);if(!X)return{handled:!1,reason:"no orgId"};if(XF(Y3(Q.metadata)?.kind)==="topup"){if(Q.mode!=="payment")return{handled:!1,reason:"topup with wrong mode"};if(XF(Q.payment_status)!=="paid")return{handled:!1,reason:"payment not confirmed"};let J=XF(Q.id);if(!J)return console.error("stripe webhook: topup session without id",{eventId:Z.id,organizationId:X}),{handled:!1,reason:"topup session without id"};let W=Number(Y3(Q.metadata)?.creditCents);if(!Number.isInteger(W)||W<=0)return console.error("stripe webhook: paid topup with bad metadata \u2014 credit NOT applied",{eventId:Z.id,organizationId:X,creditCents:Y3(Q.metadata)?.creditCents}),{handled:!1,reason:"bad topup metadata"};return{handled:!0,organizationId:X,topUp:{creditCents:W,referenceId:`stripe-topup:${J}`}}}if(Q.mode!=="subscription")return{handled:!1,reason:"not a subscription checkout"};if(XF(Q.payment_status)!=="paid")return{handled:!1,reason:"payment not confirmed"};let Y=await $.getBilling(X);if(!Y)return{handled:!1,reason:"unknown org"};let G=yY1(Q.subscription);if(Y.stripeSubscriptionId&&G&&Y.stripeSubscriptionId!==G)return console.error("stripe webhook: refused checkout rebind",{organizationId:X,eventId:Z.id}),{handled:!1,reason:"org already bound to another subscription",orphanSubscriptionId:G};if(bY1(Z,Y))return{handled:!1,reason:"stale event"};return await $.updateStripeState(X,{stripeCustomerId:yY1(Q.customer),stripeSubscriptionId:G,status:"active",lastStripeEventAt:xY1(Z,Y)}),{handled:!0,organizationId:X}}case"customer.subscription.updated":case"customer.subscription.deleted":{let X=XF(Q.id);if(!X)return{handled:!1,reason:"no sub id"};let Y=await $.getBillingByStripeSubscriptionId(X);if(!Y)return{handled:!1,reason:"unknown subscription"};let G=Z.type==="customer.subscription.deleted";if(!G&&bY1(Z,Y))return{handled:!1,reason:"stale event"};let J=G?"canceled":Pt$(Q.status);return await $.updateStripeState(Y.organizationId,{status:J,currentPeriodEnd:Bz6(Q),...G&&{stripeSubscriptionId:null},lastStripeEventAt:xY1(Z,Y)}),{handled:!0,organizationId:Y.organizationId}}case"invoice.paid":{let X=Nz6(Q);if(!X)return{handled:!1,reason:"no sub id"};let Y=await $.getBillingByStripeSubscriptionId(X);if(!Y)return{handled:!1,reason:"unknown subscription"};if(bY1(Z,Y))return{handled:!1,reason:"stale event"};return await $.updateStripeState(Y.organizationId,{status:"active",currentPeriodEnd:RR0(Q.period_end),lastStripeEventAt:xY1(Z,Y)}),{handled:!0,organizationId:Y.organizationId}}default:return{handled:!1,reason:`unhandled event ${Z.type}`}}}function Dz6($,Z){if(!Z.handled||$.livemode===!1)return null;let Q=$.data.object;if(Z.topUp)return{name:"credits_topup_succeeded",organizationId:Z.organizationId,properties:{credit_cents:Z.topUp.creditCents}};switch($.type){case"checkout.session.completed":case"checkout.session.async_payment_succeeded":return{name:"subscription_started",organizationId:Z.organizationId,properties:{}};case"customer.subscription.deleted":return{name:"subscription_canceled",organizationId:Z.organizationId,properties:{}};case"customer.subscription.updated":return{name:"subscription_updated",organizationId:Z.organizationId,properties:{status:Pt$(Q.status),...typeof Q.cancel_at_period_end==="boolean"?{cancel_at_period_end:Q.cancel_at_period_end}:{}}};case"invoice.paid":if(Q.billing_reason==="subscription_create")return null;return{name:"subscription_renewed",organizationId:Z.organizationId,properties:{}};default:return null}}function Et$($,Z){let Q=Dz6($,Z);if(!Q)return;ZG({event:Q.name,organizationId:Q.organizationId,...$.id?{uuid:er1(`stripe:${$.id}:${Q.name}`)}:{},...$.created?{timestamp:new Date($.created*1000)}:{},properties:Q.properties})}async function At$($){let Z=new _K(Z8().db),Q=await Oz6(Z,$);if(!(Q.handled&&Q.topUp))Et$($,Q);if(Q.handled&&Q.topUp)await FT$({organizationId:Q.organizationId,amountCents:Q.topUp.creditCents,referenceId:Q.topUp.referenceId}),Et$($,Q);if(!Q.handled&&Q.orphanSubscriptionId)try{await w8$(Q.orphanSubscriptionId),console.error("stripe webhook: canceled orphan subscription",{subscriptionId:Q.orphanSubscriptionId,eventId:$.id})}catch(X){if(!(X instanceof WG&&(X.status===400||X.status===404)))throw X}return Q}var Uz6=300;var Tt$=D(()=>{NJ();g4();FZ0();Pj();u81()});var wz6=1048576,gY1;var Rt$=D(()=>{u$();rH();E$();Tt$();gY1=new Q1;gY1.post("/webhook",Z9({maxSize:wz6,onError:($)=>$.json({error:"payload too large"},413)}),async($)=>{let Z=M0().stripeWebhookSecret;if(!Z)return $.json({error:"stripe billing not configured"},503);let Q=await $.req.text();if(!jt$(Q,$.req.header("stripe-signature"),Z))return $.json({error:"invalid signature"},400);let Y=zt$(Q);if(!Y)return $.json({error:"invalid payload"},400);let G=await At$(Y);return console.log("stripe webhook",{eventId:Y.id,type:Y.type,livemode:Y.livemode,...G}),$.json({received:!0})})});import{timingSafeEqual as Lz6}from"crypto";function zz6($,Z,Q){if(!Z?.startsWith("sha256="))return!1;let X=new Bun.CryptoHasher("sha256",Q).update($).digest("hex"),Y=Z.slice(7);if(Y.length!==X.length)return!1;return Lz6(Buffer.from(Y),Buffer.from(X))}function Pz6($,Z){let Q=Z,X=Q?.repository?.name,Y=Q?.repository?.owner?.login;if(typeof X!=="string"||typeof Y!=="string")return[];let G=[];if($==="check_suite"){if(Q.action!=="completed")return[];let J=Q.check_suite?.pull_requests;for(let W of Array.isArray(J)?J:[]){let K=W?.number;if(typeof K==="number")G.push(K)}}else if($==="issue_comment"&&Q.issue?.pull_request){let J=Q.issue.number;if(typeof J==="number")G.push(J)}return[...new Set(G)].map((J)=>({repoOwner:Y,repoName:X,number:J}))}function qt$($){let Z=new Q1;return Z.post("/webhook",Z9({maxSize:Ez6,onError:(Q)=>Q.json({error:"payload too large"},413)}),async(Q)=>{let X=process.env.GITHUB_WEBHOOK_SECRET;if(!X)return Q.json({error:"github webhook not configured"},503);let Y=await Q.req.text();if(!zz6(Y,Q.req.header("x-hub-signature-256"),X))return Q.json({error:"invalid signature"},400);let G=Q.req.header("x-github-event");if(G!=="push"&&!jz6.has(G??""))return Q.json({ok:!0,ignored:"event"});let J;try{J=JSON.parse(Y)}catch{return Q.json({error:"invalid payload"},400)}if(G==="push"){let H=J.ref,F=J.repository?.full_name;if(!H||!F)return Q.json({ok:!0,ignored:"shape"});let N=(await Fo0())?.markTenantPoolsDirty(F,H)??[];return Q.json({ok:!0,pools:N})}let W=Pz6(G??"",J);if(W.length===0)return Q.json({ok:!0,ignored:"no-pr"});let K=await Az6($,W);return Q.json({ok:!0,refreshed:K})}),Z}async function Az6($,Z){let Q=0;for(let X of Z){let Y=$.taskBoard(),G;try{G=await Y.findPrLinks(X)}catch(J){console.error("[github-webhook] pr link lookup failed:",J);continue}for(let J of G)try{let W=await Y.getById(J.taskBoardItemId,J.organizationId),K=W?await $.contextFactory()(J.organizationId,W.assignedBy??W.createdBy):null;if(!K)continue;if(await lB$(K,J.organizationId,J.taskBoardItemId)!==null)Q++}catch(W){console.error(`[github-webhook] pr card refresh failed for ${J.taskBoardItemId}:`,W)}}return Q}var Ez6=5242880,jz6;var It$=D(()=>{u$();rH();FW();AZ();jz6=new Set(["check_suite","issue_comment"])});function Mt$($){let Z=new EN($.db,new oQ($.encryptionKey)),Q=new Q1;return Q.get("/attachments/:token",async(X)=>{let Y=NN$(X.req.param("token"));if(!Y)return X.json({error:"Invalid or expired link"},404);let G=await Z.getByOrg(Y.organizationId);if(!G)return X.json({error:"Jira is not connected"},404);let W=await new zG(G.siteUrl,G.email,G.apiToken).downloadAttachment(Y.attachmentId);if(!W.ok||!W.body)return X.json({error:"Jira refused the download"},502);let K=new Headers;for(let H of["content-type","content-length","content-disposition"]){let F=W.headers.get(H);if(F)K.set(H,F)}return K.set("cache-control","no-store"),new Response(W.body,{status:200,headers:K})}),Q}var kt$=D(()=>{u$();zB();Is0();v_()});function Vt$($){if(typeof $!=="object"||$===null)return null;let Z=$;if(Z.webhookEvent!=="jira:issue_updated")return null;let Q=Z.issue?.id,X=Z.issue?.key,Y=Z.changelog?.id;if(typeof Q!=="string"&&typeof Q!=="number"||typeof X!=="string"||typeof Y!=="string"&&typeof Y!=="number")return null;let G=Z.changelog?.items?.find((J)=>J.field==="status");if(!G||typeof G.toString!=="string")return null;return{issueId:String(Q),issueKey:X,toStatus:G.toString,changelogId:String(Y)}}function St$($,Z,Q){let X=[];for(let Y of Z){if(new Date(Y.created).getTime()<Q.getTime())continue;let G=Y.items.find((J)=>J.field==="status");if(!G||typeof G.toString!=="string")continue;X.push({issueId:$.id,issueKey:$.key,toStatus:G.toString,changelogId:Y.id})}return X.sort((Y,G)=>Number(Y.changelogId)-Number(G.changelogId))}function qz6($){return`Jira ${$.key}: ${$.summary}`}async function qR0($,Z,Q){if(!Z.enabled)return"disabled";let X=Z.organizationId,Y=await $.storage.jiraIntegrations.getAutomation(X,Q.toStatus);if(!Y)return"no_rule";let G=new zG(Z.siteUrl,Z.email,Z.apiToken),J=await dL0(G,Z.siteUrl,Q.issueId),W=await Iz6($,Z,Q,J);if(!await $.storage.jiraIntegrations.claimTrigger(X,Q.issueId,Q.changelogId))return"duplicate";let H=await $.storage.taskBoard.update(W.id,X,{assigneeId:n$,assignedBy:Z.createdBy},Z.createdBy);try{await TW($,H,{instruction:Y.prompt??Tz6,source:{kind:"jira",issueKey:J.key,title:qz6(J),body:`${mL0(J)}
2932
2932