decocms 4.216.1 → 4.217.0

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 (229) hide show
  1. package/dist/client/assets/{AlertCircle-DVr8BKZg.js → AlertCircle-Cku7QNJ1.js} +1 -1
  2. package/dist/client/assets/{AreaChart-Cow7JBnZ.js → AreaChart-CWTqzZnZ.js} +1 -1
  3. package/dist/client/assets/{ArrowLeft-BTLGLT2t.js → ArrowLeft-DitiTve9.js} +1 -1
  4. package/dist/client/assets/{ArrowUp-Dga0gRTn.js → ArrowUp-ChnM3_fk.js} +1 -1
  5. package/dist/client/assets/{ArrowUpRight-ByhCvqnv.js → ArrowUpRight-D8lyE0rl.js} +1 -1
  6. package/dist/client/assets/{Check-saQShfG5.js → Check-1xGRhKtb.js} +1 -1
  7. package/dist/client/assets/{CheckCircle-Du43cI0l.js → CheckCircle-BaZjt-v5.js} +1 -1
  8. package/dist/client/assets/{ChevronDown-CrSAmdH3.js → ChevronDown-B4rBBBRB.js} +1 -1
  9. package/dist/client/assets/{ChevronRight-CgxpmvGq.js → ChevronRight-BXG1BA5e.js} +1 -1
  10. package/dist/client/assets/{ChevronUp-DKRFGGia.js → ChevronUp-BznRVzn6.js} +1 -1
  11. package/dist/client/assets/{Copy01-B9X-fZer.js → Copy01-BhEBkWSK.js} +1 -1
  12. package/dist/client/assets/{CpuChip01-C9zdduR2.js → CpuChip01-C_h-iqQA.js} +1 -1
  13. package/dist/client/assets/{CreditCard01-BzunNTrI.js → CreditCard01-2AVm2G5n.js} +1 -1
  14. package/dist/client/assets/{DotsVertical-3WT4e1Oh.js → DotsVertical-BiAnr426.js} +1 -1
  15. package/dist/client/assets/{Eye-Cl3oGSn5.js → Eye-BWm97g48.js} +1 -1
  16. package/dist/client/assets/{FilterLines-DxRY2r12.js → FilterLines-BuO-UFm4.js} +1 -1
  17. package/dist/client/assets/{Globe01-Ctu-dHAd.js → Globe01-5NiY-vlq.js} +1 -1
  18. package/dist/client/assets/{Globe04-2H5qBM7p.js → Globe04-m9JlUnvQ.js} +1 -1
  19. package/dist/client/assets/{HardDrive-C6Lwu0Uw.js → HardDrive-Clx_h6z6.js} +1 -1
  20. package/dist/client/assets/{Key01-Bm9UhKjZ.js → Key01-DunhGyut.js} +1 -1
  21. package/dist/client/assets/{LayoutLeft-COLLrQQN.js → LayoutLeft-4fT2BiwR.js} +1 -1
  22. package/dist/client/assets/{LinkExternal01-FLC2rHWn.js → LinkExternal01-BYrPVcC-.js} +1 -1
  23. package/dist/client/assets/{LogOut01-Qd9FbQa7.js → LogOut01-B_3Wlc-Z.js} +1 -1
  24. package/dist/client/assets/{Monitor01-Cm6ubfWS.js → Monitor01-BSIZfzBh.js} +1 -1
  25. package/dist/client/assets/{Palette-Cj6oxWtQ.js → Palette-CFc_TE5K.js} +1 -1
  26. package/dist/client/assets/{Play-BfKO2sRx.js → Play-CXcw9e2Y.js} +1 -1
  27. package/dist/client/assets/{Plus-ks3DK4rD.js → Plus-Bgx47ddP.js} +1 -1
  28. package/dist/client/assets/{SearchLg-el_1A8CT.js → SearchLg-Ceo5VJgX.js} +1 -1
  29. package/dist/client/assets/{SearchMd-DWsn7K4A.js → SearchMd-C8ucj8hS.js} +1 -1
  30. package/dist/client/assets/{Settings02-Dg2BbcWC.js → Settings02-0o2UFiwS.js} +1 -1
  31. package/dist/client/assets/{Share07-DM_QFVit.js → Share07-DKcMKyrs.js} +1 -1
  32. package/dist/client/assets/{Shield01-BbIN488q.js → Shield01-BzmdRyE3.js} +1 -1
  33. package/dist/client/assets/{Star01-BwZg3TFM.js → Star01-DHVoif8o.js} +1 -1
  34. package/dist/client/assets/{Stars01-7NMLrQ5h.js → Stars01-gM8fxKYe.js} +1 -1
  35. package/dist/client/assets/{Stars02-CLYux6gn.js → Stars02-B3ean3Cr.js} +1 -1
  36. package/dist/client/assets/{Sun-C-45vwxA.js → Sun-BCgvgYo5.js} +1 -1
  37. package/dist/client/assets/{SwitchHorizontal01-BEdsrnm3.js → SwitchHorizontal01-DCGUd0ib.js} +1 -1
  38. package/dist/client/assets/{Tool01-DXcwLIpR.js → Tool01-CSZiP8oY.js} +1 -1
  39. package/dist/client/assets/{Tool02-Bj117YC8.js → Tool02--z0vhWpG.js} +1 -1
  40. package/dist/client/assets/{Trash01-D9ob-ltY.js → Trash01-CbxhssCE.js} +1 -1
  41. package/dist/client/assets/{TrendUp01-gqC80lmP.js → TrendUp01-CPLRk9kH.js} +1 -1
  42. package/dist/client/assets/{Upload01-B2GC3YQn.js → Upload01-BXrkmlu0.js} +1 -1
  43. package/dist/client/assets/{User01-mza_inj9.js → User01-DQq_9Kwb.js} +1 -1
  44. package/dist/client/assets/{Users01-CPl4UX5W.js → Users01-BusuaOfH.js} +1 -1
  45. package/dist/client/assets/{Users03-CRPgCDkv.js → Users03-Ddc7PpYE.js} +1 -1
  46. package/dist/client/assets/{X-DmD4-HJS.js → X-DnAZ-NvU.js} +1 -1
  47. package/dist/client/assets/{XCircle-CO5S7C1k.js → XCircle-BTLApv7X.js} +1 -1
  48. package/dist/client/assets/{XClose-z_5Yj6A5.js → XClose-xGgKxa01.js} +1 -1
  49. package/dist/client/assets/{Zap-BtsPhD04.js → Zap-XSNT97NK.js} +1 -1
  50. package/dist/client/assets/{ZapSquare-_LjTCRt2.js → ZapSquare-CLChSd6U.js} +1 -1
  51. package/dist/client/assets/{access-gate-CWaaK1Xn.js → access-gate-BRlyZgfM.js} +1 -1
  52. package/dist/client/assets/{agent-icon-DSYdmcOl.js → agent-icon-C9ykObYu.js} +1 -1
  53. package/dist/client/assets/{agents-list-DjmjHMgT.js → agents-list-ciAsTcIC.js} +1 -1
  54. package/dist/client/assets/{ai-providers-Bu9CUIWU.js → ai-providers-2LMMNQET.js} +1 -1
  55. package/dist/client/assets/{alert-QIJmEMcZ.js → alert-BgCcP2_6.js} +1 -1
  56. package/dist/client/assets/{alert-dialog-CHNCayWy.js → alert-dialog-BW291mWH.js} +1 -1
  57. package/dist/client/assets/{api-keys-ClpMxgnk.js → api-keys-bteQv_7s.js} +1 -1
  58. package/dist/client/assets/{app-editor-Bmi5nQd7.js → app-editor-BmO07u8s.js} +1 -1
  59. package/dist/client/assets/{auth-DlgbmeUd.js → auth-Cccuh2gN.js} +1 -1
  60. package/dist/client/assets/{auth-catchall-nHIpQDXV.js → auth-catchall-BwykvMC5.js} +1 -1
  61. package/dist/client/assets/{auth-entry-Cg1JVpOZ.js → auth-entry-DsEbNyw_.js} +1 -1
  62. package/dist/client/assets/{auth-split-layout-BkJPHdu8.js → auth-split-layout-BrWrwqrc.js} +1 -1
  63. package/dist/client/assets/{authenticate-and-persist-oauth-BpoaKWHc.js → authenticate-and-persist-oauth-BJQksLnK.js} +1 -1
  64. package/dist/client/assets/{automation-list-row-x9NVLAZ1.js → automation-list-row-DdLw2xdo.js} +1 -1
  65. package/dist/client/assets/{automation-runs-Cpis7Ua6.js → automation-runs-BSE1PY5J.js} +1 -1
  66. package/dist/client/assets/{automations-DsWjlHe7.js → automations-CDMeZp78.js} +1 -1
  67. package/dist/client/assets/{avatar-CNWZ6gT7.js → avatar-jHVirrBa.js} +1 -1
  68. package/dist/client/assets/{badge-BllwASY0.js → badge-CjL67oHO.js} +1 -1
  69. package/dist/client/assets/{billing-k2XxolVC.js → billing-DaRQlwUU.js} +1 -1
  70. package/dist/client/assets/{block-document-B6jOMiio.js → block-document-DL2BUSqc.js} +1 -1
  71. package/dist/client/assets/{brand-context-4bRmOfh-.js → brand-context-ClvlgCUn.js} +1 -1
  72. package/dist/client/assets/{buckets-DcyyTqp9.js → buckets-BeIBS40G.js} +1 -1
  73. package/dist/client/assets/{bulk-category-panel-FepTW-Rs.js → bulk-category-panel-C-85A0b5.js} +1 -1
  74. package/dist/client/assets/{capability-load-error-Ct5ufq0a.js → capability-load-error-DXirgNLO.js} +1 -1
  75. package/dist/client/assets/{card-CifSLQ2q.js → card-DrWjpIGd.js} +1 -1
  76. package/dist/client/assets/{cards-d3Ga7u1w.js → cards-ZN2V2ep2.js} +1 -1
  77. package/dist/client/assets/{category-editor-CG5YYbTN.js → category-editor-D1dHe6G-.js} +1 -1
  78. package/dist/client/assets/{chat-context-SmtK5LUr.js → chat-context-8iQNVu0A.js} +1 -1
  79. package/dist/client/assets/{checkbox-CobL5AnR.js → checkbox-C89rLEMS.js} +1 -1
  80. package/dist/client/assets/{cli-auth-success-ano8N3w4.js → cli-auth-success-CwAPj-r-.js} +1 -1
  81. package/dist/client/assets/{collection-detail-jL4k_iTY.js → collection-detail-BiaoW5xE.js} +1 -1
  82. package/dist/client/assets/{collection-display-button-CRnmYQ2D.js → collection-display-button-d4G3C_Tt.js} +1 -1
  83. package/dist/client/assets/{collection-search-CJp_4K-D.js → collection-search-BJhAA6sH.js} +1 -1
  84. package/dist/client/assets/{collection-table-wrapper-D3E7gRQ_.js → collection-table-wrapper-DiwXqj_l.js} +1 -1
  85. package/dist/client/assets/{collection-tabs-l01QyXIw.js → collection-tabs-CVzlVmTE.js} +1 -1
  86. package/dist/client/assets/{command-BQ2YKmva.js → command-UtXJzfLT.js} +1 -1
  87. package/dist/client/assets/{commerce-onboarding-PE3mVr2T.js → commerce-onboarding-B2HzvzFs.js} +1 -1
  88. package/dist/client/assets/{connect-kUrJ8HF6.js → connect-QFF5XjmK.js} +1 -1
  89. package/dist/client/assets/{connection-C7O4E3hQ.js → connection-QQIZOm3O.js} +1 -1
  90. package/dist/client/assets/{connection-card-WP3yfLcj.js → connection-card-BJNt13Qs.js} +1 -1
  91. package/dist/client/assets/{connection-detail-DiQg7fjo.js → connection-detail-Cr1lUiCU.js} +1 -1
  92. package/dist/client/assets/{connection-form-helpers-BmDS2wQ5.js → connection-form-helpers-Dvh6kw-o.js} +1 -1
  93. package/dist/client/assets/{connections-CgVaiMqJ.js → connections-CjpsATbT.js} +1 -1
  94. package/dist/client/assets/{decopilot-sse-pool-BbCXJExJ.js → decopilot-sse-pool-Bn3D4itH.js} +1 -1
  95. package/dist/client/assets/{dialog-BvHVWACa.js → dialog-NhbLUA-9.js} +1 -1
  96. package/dist/client/assets/{domain-settings-D8AfBxCf.js → domain-settings-FQtBm1zv.js} +1 -1
  97. package/dist/client/assets/{drawer-TqLdTASH.js → drawer-yJiVMp1b.js} +1 -1
  98. package/dist/client/assets/{dropdown-menu-Bf-_1F90.js → dropdown-menu-CB3upSUY.js} +1 -1
  99. package/dist/client/assets/{empty-state-BB9SuQ3-.js → empty-state-BMo9w6GT.js} +1 -1
  100. package/dist/client/assets/{extract-connection-data-CYfrkzlQ.js → extract-connection-data-BCHB1gEJ.js} +1 -1
  101. package/dist/client/assets/{file-explorer-CgDMevnI.js → file-explorer-a6Hn31I4.js} +1 -1
  102. package/dist/client/assets/{file-type-icon-CCM1Z5sN.js → file-type-icon-Bxp24ywn.js} +1 -1
  103. package/dist/client/assets/{form-BvCRTFVZ.js → form-BbPEmJRs.js} +1 -1
  104. package/dist/client/assets/{general-CDjzaxCy.js → general-6mZDyQGD.js} +1 -1
  105. package/dist/client/assets/{github-repo-picker-CZvo9nht.js → github-repo-picker-Batb3FXV.js} +1 -1
  106. package/dist/client/assets/{hooks-ByTEnV0T.js → hooks-ljUJvzb9.js} +1 -1
  107. package/dist/client/assets/{index-D8Kz_Nxc.js → index-2XRGzaXj.js} +1 -1
  108. package/dist/client/assets/{index-DDapwg2R.js → index-B2Rk1c7T.js} +1 -1
  109. package/dist/client/assets/{index-1WYf_KrR.js → index-BPbL-j0A.js} +33 -33
  110. package/dist/client/assets/{index-uIvpNjLL.js → index-BWHV1yFp.js} +1 -1
  111. package/dist/client/assets/{index-ClHccnbh.js → index-Cn6omoEe.js} +1 -1
  112. package/dist/client/assets/{index-qKD3d2au.js → index-D1p6mir2.js} +1 -1
  113. package/dist/client/assets/{index-B3Yl6A23.js → index-DNs1M_cC.js} +1 -1
  114. package/dist/client/assets/{index-ZE6Z_vQp.js → index-DqiTBx0h.js} +1 -1
  115. package/dist/client/assets/index-DsXa8egZ.js +736 -0
  116. package/dist/client/assets/{index-nXR7OSAG.js → index-ik0OSxQy.js} +1 -1
  117. package/dist/client/assets/{index-redirect-Bf0x45XN.js → index-redirect-CWSozAT9.js} +1 -1
  118. package/dist/client/assets/{input-CHmnXpql.js → input-C7EflHs7.js} +1 -1
  119. package/dist/client/assets/{integration-icon-CY4EGiR_.js → integration-icon-COsPpYoQ.js} +1 -1
  120. package/dist/client/assets/{invite-member-dialog-DNTTk81k.js → invite-member-dialog-DDFiIdKW.js} +1 -1
  121. package/dist/client/assets/{label-Bccab8iK.js → label-DrZY6DFb.js} +1 -1
  122. package/dist/client/assets/{layout-Be_TYbNZ.js → layout-B-i3MFpW.js} +1 -1
  123. package/dist/client/assets/{login-CWFLVKo6.js → login-Dsm8WI4G.js} +1 -1
  124. package/dist/client/assets/{mcp-oauth-BP_s928z.js → mcp-oauth-D72sKn6I.js} +1 -1
  125. package/dist/client/assets/{members-Co5f6aOL.js → members-BWCYJTUP.js} +1 -1
  126. package/dist/client/assets/{monaco-editor-Bmu0_Uc8.js → monaco-editor-BrggoD4I.js} +1 -1
  127. package/dist/client/assets/{monitoring-stats-row-Ca5mZ2hV.js → monitoring-stats-row-4T_oymHs.js} +1 -1
  128. package/dist/client/assets/{multi-select-CSqRpBNP.js → multi-select-B-5jHMNu.js} +1 -1
  129. package/dist/client/assets/{oauth-callback-Uu-F9Yvj.js → oauth-callback-UPJ6YXCV.js} +1 -1
  130. package/dist/client/assets/{oauth-callback-ai-provider-DgpB3HEQ.js → oauth-callback-ai-provider-mNW4Dk3E.js} +1 -1
  131. package/dist/client/assets/{onboarding-CErtddaA.js → onboarding-DHz89kmd.js} +1 -1
  132. package/dist/client/assets/{org-layout-CF4PT_q0.js → org-layout-ChZBD3RR.js} +1 -1
  133. package/dist/client/assets/{organization-choice-C0Pt5Bup.js → organization-choice-CKt19i0O.js} +1 -1
  134. package/dist/client/assets/{orgs-D52KOB3Y.js → orgs-jW-1Vwfu.js} +1 -1
  135. package/dist/client/assets/{page-seo-form-O157lo-p.js → page-seo-form-5pwlYNFl.js} +1 -1
  136. package/dist/client/assets/{popover--ylE6qLe.js → popover-B81Z7SRr.js} +1 -1
  137. package/dist/client/assets/{post-editor-BE-57T_e.js → post-editor-VyTQFCw2.js} +1 -1
  138. package/dist/client/assets/{primitives-D3fJiLDw.js → primitives-DPjfoDlY.js} +1 -1
  139. package/dist/client/assets/{profile-j9gjMfnB.js → profile-vC9rsu1G.js} +1 -1
  140. package/dist/client/assets/{project-app-view-B_doVeQj.js → project-app-view-D2XFIuRd.js} +1 -1
  141. package/dist/client/assets/record-editor-D7NpkfIy.js +1 -0
  142. package/dist/client/assets/redirect-editor-Bs0DxqWF.js +1 -0
  143. package/dist/client/assets/registry-CiSJ0uiw.js +2 -0
  144. package/dist/client/assets/{registry-layout-B6lLzqmh.js → registry-layout-DTKYthwW.js} +1 -1
  145. package/dist/client/assets/{reports-BZxCVWv9.js → reports-BuqoKRyB.js} +1 -1
  146. package/dist/client/assets/{require-capability-B4ibfo_W.js → require-capability-BcE7fWcx.js} +1 -1
  147. package/dist/client/assets/{required-auth-layout-paNpQJIU.js → required-auth-layout-e-mB6jyv.js} +1 -1
  148. package/dist/client/assets/{reset-password-CregEpBd.js → reset-password-BWYxoRGO.js} +1 -1
  149. package/dist/client/assets/{roles-D-qil-pC.js → roles-D22DWh-c.js} +1 -1
  150. package/dist/client/assets/{search-input-BVomWYYp.js → search-input-B6w5hH-q.js} +1 -1
  151. package/dist/client/assets/{secrets-DKsKV_dV.js → secrets-DT5kb2tu.js} +1 -1
  152. package/dist/client/assets/{sections-editor-CdVTqxcQ.js → sections-editor-CVJPTop0.js} +1 -1
  153. package/dist/client/assets/{select-COXDe7Dx.js → select-C6s6wppn.js} +1 -1
  154. package/dist/client/assets/{select-model-BzpMDXVS.js → select-model-BDYeDWKb.js} +1 -1
  155. package/dist/client/assets/{self-tool-result-DnP7pHJZ.js → self-tool-result-DcQ0Q1na.js} +1 -1
  156. package/dist/client/assets/{seo-editor-Bc5F9iKE.js → seo-editor-Cen2Mi-j.js} +1 -1
  157. package/dist/client/assets/{settings-layout-DpMpOw5x.js → settings-layout-CwEWgreO.js} +1 -1
  158. package/dist/client/assets/{settings-section-Dq0n0YCt.js → settings-section-DZ7tXKvM.js} +1 -1
  159. package/dist/client/assets/{shell-controls-CFcyU3uP.js → shell-controls-BisQRnCA.js} +1 -1
  160. package/dist/client/assets/{shell-layout-COP09GTT.js → shell-layout-wvP_m3bL.js} +1 -1
  161. package/dist/client/assets/{sidebar-BNllhwJz.js → sidebar-bI-KSx7U.js} +1 -1
  162. package/dist/client/assets/{skeleton-BUpwVrRR.js → skeleton-DO22teZy.js} +1 -1
  163. package/dist/client/assets/{spinner-OKWFKkzc.js → spinner-BE7OkrCz.js} +1 -1
  164. package/dist/client/assets/{sso-BYJQOhtB.js → sso-DDuRemHB.js} +1 -1
  165. package/dist/client/assets/{store-XdzkkwzJ.js → store-3FvNN_Xk.js} +1 -1
  166. package/dist/client/assets/store-registry-D1sK8g8n.js +2 -0
  167. package/dist/client/assets/{studio-tools-B6AZKUS9.js → studio-tools-c3V_5vnm.js} +1 -1
  168. package/dist/client/assets/{switch-BdWgsxXx.js → switch-DRXq0jBD.js} +1 -1
  169. package/dist/client/assets/{synced-repos-CNNNG4NP.js → synced-repos-D7-vGrct.js} +1 -1
  170. package/dist/client/assets/{tab-id-CC3tNcSX.js → tab-id-C4cVfBiy.js} +1 -1
  171. package/dist/client/assets/{table-DAErmAxj.js → table-BvQehhzT.js} +1 -1
  172. package/dist/client/assets/{tabs-du5-T6ZX.js → tabs-qrATwgbq.js} +1 -1
  173. package/dist/client/assets/{textarea-BaA9DyJB.js → textarea-CmCh5XKS.js} +1 -1
  174. package/dist/client/assets/{toggle-group-jSGSDTAE.js → toggle-group-DMKpY6xA.js} +1 -1
  175. package/dist/client/assets/{toolbar-VWhkIezl.js → toolbar-lRUiow3-.js} +1 -1
  176. package/dist/client/assets/{tooltip-L4uhGpkI.js → tooltip-anwiAuhN.js} +1 -1
  177. package/dist/client/assets/{track-EcKEAAmK.js → track-CEUeKxvH.js} +1 -1
  178. package/dist/client/assets/{use-ai-providers-xWNKQfJ7.js → use-ai-providers-DHz28s_O.js} +1 -1
  179. package/dist/client/assets/{use-api-keys-Vv6dfPsF.js → use-api-keys-BaqjqlmH.js} +1 -1
  180. package/dist/client/assets/{use-automations-DYHeoNNO.js → use-automations-DIYhfXi0.js} +1 -1
  181. package/dist/client/assets/{use-autosave-CWJCYM2r.js → use-autosave-DZ8hzYh1.js} +1 -1
  182. package/dist/client/assets/{use-capability-DsOpvkDl.js → use-capability-CMukOiiU.js} +1 -1
  183. package/dist/client/assets/{use-clock-tick-Np8ledrc.js → use-clock-tick-CiWB5mFy.js} +1 -1
  184. package/dist/client/assets/{use-connection-dSWxY1ra.js → use-connection-DiHG7Tpo.js} +1 -1
  185. package/dist/client/assets/{use-copy-Cd2aAwLb.js → use-copy-BTiOOT9d.js} +1 -1
  186. package/dist/client/assets/{use-create-virtual-mcp-C6Wpjxz3.js → use-create-virtual-mcp-DDRmvrOq.js} +1 -1
  187. package/dist/client/assets/{use-debounced-autosave-9YaHPjwa.js → use-debounced-autosave-CuxsdJ2I.js} +1 -1
  188. package/dist/client/assets/{use-debounced-value-Bv1w1mJe.js → use-debounced-value-DrR04Og2.js} +1 -1
  189. package/dist/client/assets/{use-deco-credits-CsAo0B4H.js → use-deco-credits-DRlOB7Gi.js} +1 -1
  190. package/dist/client/assets/{use-decopilot-events-CG5p2HSG.js → use-decopilot-events-Cki5ax8H.js} +1 -1
  191. package/dist/client/assets/{use-delete-connection-5vZwhZk7.js → use-delete-connection-CD68-Xmy.js} +1 -1
  192. package/dist/client/assets/{use-deployment-admin-DAf1CvAa.js → use-deployment-admin-khStMy3B.js} +1 -1
  193. package/dist/client/assets/{use-file-configs-B2VjzqmE.js → use-file-configs-Bzm8RE-c.js} +1 -1
  194. package/dist/client/assets/{use-infinite-scroll-CIMconS3.js → use-infinite-scroll-C9K-29yR.js} +1 -1
  195. package/dist/client/assets/{use-join-requests-CZEoMDdQ.js → use-join-requests-BRlnxn-n.js} +1 -1
  196. package/dist/client/assets/{use-mcp-client-1FdSf1sa.js → use-mcp-client-BgdRGZWV.js} +1 -1
  197. package/dist/client/assets/{use-mcp-tools--RCy4fCG.js → use-mcp-tools-D9bRyxO4.js} +1 -1
  198. package/dist/client/assets/{use-members-9Lq2nJNd.js → use-members-BWFFB9A8.js} +1 -1
  199. package/dist/client/assets/{use-mobile-DhmE47BF.js → use-mobile-9TlKV-bx.js} +1 -1
  200. package/dist/client/assets/{use-navigate-to-agent-BDQyEX5S.js → use-navigate-to-agent-bYMiBTnQ.js} +1 -1
  201. package/dist/client/assets/{use-open-billing-url-B9m7SWWG.js → use-open-billing-url-bqKZ4RnT.js} +1 -1
  202. package/dist/client/assets/{use-org-auth-client-DrzdVCw-.js → use-org-auth-client-PL-8ccJQ.js} +1 -1
  203. package/dist/client/assets/{use-org-sso-DTMyqrXf.js → use-org-sso-PtT2MKHV.js} +1 -1
  204. package/dist/client/assets/{use-organization-roles-DGTHxSYY.js → use-organization-roles-C001Y9MZ.js} +1 -1
  205. package/dist/client/assets/{use-organization-settings-BLoJx7fs.js → use-organization-settings-CITR4tS3.js} +1 -1
  206. package/dist/client/assets/{use-registry-connections-DFuJtt-R.js → use-registry-connections-CGdJ9dwd.js} +1 -1
  207. package/dist/client/assets/{use-secrets-G-yw0sDY.js → use-secrets-D5C0op23.js} +1 -1
  208. package/dist/client/assets/{use-section-preview-base-cmRxxf7y.js → use-section-preview-base--LBHyeB9.js} +1 -1
  209. package/dist/client/assets/{use-status-sounds-DTTAih7A.js → use-status-sounds-DuxyFQFY.js} +1 -1
  210. package/dist/client/assets/{use-tags-BfW7jzT6.js → use-tags-DSjFQGp_.js} +1 -1
  211. package/dist/client/assets/{use-view-mode-Rw9HPTJr.js → use-view-mode-BD2v91Li.js} +1 -1
  212. package/dist/client/assets/{use-virtual-mcp-AF_gvsLn.js → use-virtual-mcp-B4c9e6-Z.js} +1 -1
  213. package/dist/client/assets/useInfiniteQuery-DzNwINxS.js +1 -0
  214. package/dist/client/assets/{useRouterState-94b634uT.js → useRouterState-Cjd5njkb.js} +1 -1
  215. package/dist/client/assets/useSuspenseInfiniteQuery-1chyL5A6.js +1 -0
  216. package/dist/client/assets/{users-Cui2ZcKm.js → users-CiCywWhB.js} +1 -1
  217. package/dist/client/assets/{variant-calendar-C9mmcuEn.js → variant-calendar-BdorvyfO.js} +1 -1
  218. package/dist/client/assets/{view-mode-toggle-DzEhL5Sa.js → view-mode-toggle-yUjXtlIc.js} +1 -1
  219. package/dist/client/index.html +1 -1
  220. package/dist/server/cli.js +1 -1
  221. package/dist/server/server.js +1 -1
  222. package/package.json +1 -1
  223. package/dist/client/assets/index-on-JyYUe.js +0 -736
  224. package/dist/client/assets/record-editor-CatyEm4j.js +0 -1
  225. package/dist/client/assets/redirect-editor-DTz2sd8l.js +0 -1
  226. package/dist/client/assets/registry-Bns72McV.js +0 -2
  227. package/dist/client/assets/store-registry-u4ePzFTi.js +0 -2
  228. package/dist/client/assets/useInfiniteQuery-BdTW9chK.js +0 -1
  229. package/dist/client/assets/useSuspenseInfiniteQuery-BvklAQ8A.js +0 -1
@@ -2734,7 +2734,7 @@ Do NOT require review (requiresReview = false) when the changes are low-risk, su
2734
2734
  When unsure between the two, lean toward NOT requiring review for small frontend-only diffs, and toward requiring it for anything backend or large.
2735
2735
 
2736
2736
  Respond with the structured verdict and a short reason.`,Xb$;var Yb$=B(()=>{C4();rO();v61();r96=f61.object({requiresReview:f61.boolean().describe("true if the changes should go through pull-request review"),reason:f61.string().describe("One short sentence explaining the decision (max ~120 chars)")});Xb$={requiresReview:!1,reason:""}});function Gb$($){let Z=$?.trim();if(!Z)return null;try{let X=new URL(Z);if(X.protocol!=="http:"&&X.protocol!=="https:")return null;return X.href}catch{return null}}function Az0($){return Gb$($?.previewServerUrl)??Gb$($?.productionUrl)}function Jb$(){return process.env.GITHUB_API_BASE_URL??"https://api.github.com"}function Wb$($,Z){return $==="GET"&&!Z.includes("/git/blobs/")&&!Z.includes("/git/trees/")&&!Z.includes("/tarball/")}function Kb$($){let Z=Oh.get($);if(!Z)return;Oh.delete($),b61-=Z.bytes}function XZ6($,Z,X){let Q;try{Q=JSON.stringify(X)?.length??0}catch{return}if(Kb$($),Q>ZZ6)return;Oh.set($,{etag:Z,body:X,bytes:Q}),b61+=Q;while(b61>$Z6||Oh.size>e96){let Y=Oh.keys().next().value;if(Y===void 0)break;Kb$(Y)}}function Hb$($){let{owner:Z,repo:X,accessToken:Q}=$,Y=`/repos/${Z}/${X}`,G=null;async function J(W,K,H,F){let N=`${Jb$()}${K}`,U=Wb$(W,K)?Oh.get(N):void 0,O=await fetch(N,{method:W,headers:{Accept:"application/vnd.github+json","User-Agent":"studio-decofile",Authorization:`token ${Q}`,...U?{"If-None-Match":U.etag}:{},...H!==void 0?{"content-type":"application/json"}:{}},body:H!==void 0?JSON.stringify(H):void 0,signal:AbortSignal.timeout(15000)});if(U&&O.status===304)return{status:200,json:U.body};if(!O.ok&&!F?.allow?.includes(O.status)){let D=await O.text().catch(()=>""),L=D;try{L=JSON.parse(D).message??D}catch{}throw new V6(O.status,W,K,L)}let w=O.status===204?void 0:await O.json();if(O.status===200&&Wb$(W,K)){let D=O.headers.get("etag");if(D)XZ6(N,D,w)}return{status:O.status,json:w}}return{owner:Z,repo:X,async getDefaultBranch(){if(G)return G;let{json:W}=await J("GET",Y);return G=W.default_branch,G},async getHeadSha(W){let{json:K}=await J("GET",`${Y}/git/ref/heads/${$_(W)}`);return K.object.sha},async getTarballStream(W){let K=`${Y}/tarball/${$_(W)}`,H=await fetch(`${Jb$()}${K}`,{headers:{"User-Agent":"studio-decofile",Authorization:`token ${Q}`},signal:AbortSignal.timeout(60000)});if(!H.ok){let F=await H.text().catch(()=>"");throw new V6(H.status,"GET",K,F.slice(0,300))}if(!H.body)throw new V6(502,"GET",K,"tarball had no body");return H.body},async getCommitTreeSha(W){let{json:K}=await J("GET",`${Y}/git/commits/${W}`);return K.tree.sha},async getTreeRecursive(W){let{json:K}=await J("GET",`${Y}/git/trees/${W}?recursive=1`);if(K.truncated)throw new V6(502,"GET",`${Y}/git/trees/${W}`,"tree listing truncated by GitHub; repo too large for recursive read");return K.tree},async getBlobText(W){let{json:K}=await J("GET",`${Y}/git/blobs/${W}`);if(K.encoding!=="base64")throw new V6(502,"GET",`${Y}/git/blobs/${W}`,`unexpected blob encoding ${K.encoding}`);return Buffer.from(K.content,"base64").toString("utf-8")},async createBlob(W){let{json:K}=await J("POST",`${Y}/git/blobs`,{content:W,encoding:"utf-8"});return K.sha},async createTree(W,K){let{json:H}=await J("POST",`${Y}/git/trees`,{base_tree:W,tree:K});return H.sha},async createCommit({message:W,treeSha:K,parentShas:H}){let{json:F}=await J("POST",`${Y}/git/commits`,{message:W,tree:K,parents:H});return F.sha},async updateRef(W,K){await J("PATCH",`${Y}/git/refs/heads/${$_(W)}`,{sha:K,force:!1})},async createRef(W,K){await J("POST",`${Y}/git/refs`,{ref:`refs/heads/${W}`,sha:K})},async mergeBranch(W,K,H){let{status:F,json:N}=await J("POST",`${Y}/merges`,{base:W,head:K,commit_message:H},{allow:[204]});return F===204?null:N?.sha??null},async createPullRequest({base:W,head:K,title:H}){let{json:F}=await J("POST",`${Y}/pulls`,{base:W,head:K,title:H});return{number:F.number,html_url:F.html_url}},async findOpenPullRequest(W,K){let{json:H}=await J("GET",`${Y}/pulls?state=open&base=${encodeURIComponent(W)}&head=${encodeURIComponent(`${Z}:${K}`)}`),F=H[0];return F?{number:F.number,html_url:F.html_url}:null},async compare(W,K){let{json:H}=await J("GET",`${Y}/compare/${$_(W)}...${$_(K)}`);return{aheadBy:H.ahead_by,behindBy:H.behind_by}},async compareDetailed(W,K){let{json:H}=await J("GET",`${Y}/compare/${$_(W)}...${$_(K)}`);return{aheadBy:H.ahead_by,behindBy:H.behind_by,mergeBaseSha:H.merge_base_commit.sha,files:(H.files??[]).map((F)=>({filename:F.filename,status:F.status,sha:F.sha,...F.previous_filename?{previousFilename:F.previous_filename}:{}}))}}}}function $_($){return $.split("/").map(encodeURIComponent).join("/")}var e96=512,$Z6=8388608,ZZ6=262144,Oh,b61=0,V6;var Z_=B(()=>{Oh=new Map;V6=class V6 extends Error{status;method;path;constructor($,Z,X,Q){super(`GitHub ${Z} ${X} failed (${$}): ${Q}`);this.status=$;this.method=Z;this.path=X;this.name="GitHubApiError"}}});async function Tz0($,Z,X){if(!X.connectionId)throw new V6(401,"AUTH","connection","Project's GitHub connection is missing \u2014 reconnect GitHub");let Q=await $.storage.connections.findById(X.connectionId,Z);if(!Q)throw new V6(401,"AUTH","connection","Project's GitHub connection is missing \u2014 reconnect GitHub");let Y=await QZ6($,Q);if(!Y)throw new V6(401,"AUTH","connection",VZ);return Hb$({owner:X.owner,repo:X.name,accessToken:Y})}async function QZ6($,Z){if(z5(Z)?.sourceConnectionId)return Bx($,Z);return(await kY({connectionId:Z.id,connectionUrl:Z.connection_url,tokenStorage:new I6($.db,$.vault)})).accessToken}var x61=B(()=>{LQ();K90();$K();AY();Z_()});function YZ6($){if(!$||$.includes("\\")||$.includes("..")||$.includes("\x00"))return!0;try{let Z=decodeURIComponent($);if(Z.includes("\\")||Z.includes("..")||Z.includes("\x00"))return!0;if(Z!==$&&Z.includes("/")){let X=($.match(/\//g)??[]).length;if((Z.match(/\//g)??[]).length>X)return!0}return!1}catch{return!0}}function Rz0($){if(YZ6($))throw Error(`Invalid block key: ${$||"(empty)"}`)}function wr($){let Z=$;for(;;){let X;try{X=decodeURIComponent(Z)}catch{return Z}if(X===Z)return Z;Z=X}}function y61($){return Rz0($),encodeURIComponent($)}function Br($){let Z=[...$].sort((Y,G)=>{let J=`${Y.stem}.json`,W=`${G.stem}.json`;return J<W?-1:J>W?1:0}),X="{",Q=!0;for(let Y of Z){let G=Y.content.trim();if(G.length===0)continue;if(!Q)X+=",";Q=!1,X+=`${JSON.stringify(wr(Y.stem))}:${G}`}return`${X}}`}var Fb$=()=>{};var Iz0=B(()=>{Fb$()});function GZ6($){return $.startsWith("merged/")?"merged":"blobs"}function g61($,Z){let X=new Map;for(let G of $){let J=X.get(G.path);if(!J||G.mtimeMs>=J.mtimeMs)X.set(G.path,{bytes:G.bytes,mtimeMs:G.mtimeMs})}let Q=[...X.entries()].sort((G,J)=>G[1].mtimeMs-J[1].mtimeMs),Y={config:Z,entries:new Map,totalBytes:0,areaBytes:{blobs:0,merged:0}};for(let[G,{bytes:J}]of Q){let W=GZ6(G);Y.entries.set(G,{bytes:J,area:W}),Y.totalBytes+=J,Y.areaBytes[W]+=J}return Y}function Nb$($,Z){let X=$.entries.get(Z);if(!X)return;$.entries.delete(Z),$.entries.set(Z,X)}function wh($,Z){let X=$.entries.get(Z);if(!X)return;$.entries.delete(Z),$.totalBytes-=X.bytes,$.areaBytes[X.area]-=X.bytes}function Ub$($,Z){let{path:X,bytes:Q,area:Y}=Z,{config:G}=$;if(!Number.isFinite(Q)||Q<0||Q>G.maxEntryBytes[Y]||Q>G.maxTotalBytes||Y==="merged"&&Q>G.maxMergedBytes)return{admitted:!1,evict:[]};let W=$.entries.get(X),K=$.totalBytes-(W?.bytes??0),H=$.areaBytes.merged-(W?.area==="merged"?W.bytes:0),F=[],N=new Set;if(Y==="merged")for(let[U,O]of $.entries){if(H+Q<=G.maxMergedBytes)break;if(U===X||O.area!=="merged")continue;F.push(U),N.add(U),H-=O.bytes,K-=O.bytes}for(let[U,O]of $.entries){if(K+Q<=G.maxTotalBytes)break;if(U===X||N.has(U))continue;F.push(U),N.add(U),K-=O.bytes}for(let U of F)wh($,U);return wh($,X),$.entries.set(X,{bytes:Q,area:Y}),$.totalBytes+=Q,$.areaBytes[Y]+=Q,{admitted:!0,evict:F}}function Dr($){if($==="")throw TypeError("cache path segment must not be empty");let Z=$.toLowerCase(),X="";for(let Q of new TextEncoder().encode(Z)){let Y=String.fromCharCode(Q);X+=/[a-z0-9._-]/.test(Y)?Y:`%${Q.toString(16).padStart(2,"0")}`}if(X==="."||X==="..")X=X.replaceAll(".","%2e");return X}function h61($){return/^[0-9a-f]{40}$/.test($)}import{randomUUID as Eb$}from"crypto";import{mkdir as Lr,readdir as JZ6,readFile as WZ6,rename as KZ6,rm as jb$,stat as zb$,statfs as HZ6,unlink as FZ6,writeFile as NZ6}from"fs/promises";import{tmpdir as UZ6}from"os";import{dirname as OZ6,join as A7}from"path";function Bh($,Z){let X=Bun.env[$];if(X===void 0||X==="")return Z;let Q=Number(X);return Number.isFinite(Q)&&Q>=0?Math.floor(Q):Z}function DZ6(){if(qz0)return qz0;let $=Bun.env.FAST_PREVIEW_CACHE_DIR,Z=$===void 0?A7(UZ6(),"studio-fast-preview-cache"):$;return qz0={enabled:Z!=="",root:Z,index:{maxTotalBytes:Bh("FAST_PREVIEW_CACHE_MAX_BYTES",2*Ob$),maxMergedBytes:Bh("FAST_PREVIEW_CACHE_MERGED_MAX_BYTES",512*Mz0),maxEntryBytes:{blobs:Bh("FAST_PREVIEW_CACHE_MAX_BLOB_BYTES",Mz0),merged:Bh("FAST_PREVIEW_CACHE_MAX_MERGED_BYTES",32*Mz0)}},freeFloorBytes:Bh("FAST_PREVIEW_CACHE_FREE_FLOOR_BYTES",Ob$),sweepIntervalMs:Bh("FAST_PREVIEW_CACHE_SWEEP_INTERVAL_MS",600000)},qz0}function LZ6(){return{hits:{blobs:0,merged:0},misses:{blobs:0,merged:0},evictions:0,errors:0,floorSkips:0,invalidKeySkips:0,admissionRefusals:0}}function EZ6(){if(XB)return;XB={hits:S$.createCounter("fast_preview_cache_hits",{description:"Decofile disk cache hits by area",unit:"{reads}"}),misses:S$.createCounter("fast_preview_cache_misses",{description:"Decofile disk cache misses by area",unit:"{reads}"}),evictions:S$.createCounter("fast_preview_cache_evictions",{description:"Decofile disk cache entries evicted",unit:"{entries}"}),errors:S$.createCounter("fast_preview_cache_errors",{description:"Decofile disk cache swallowed errors by operation",unit:"{errors}"}),floorSkips:S$.createCounter("fast_preview_cache_floor_skips",{description:"Decofile disk cache writes skipped by the free-space floor",unit:"{writes}"})},S$.createObservableGauge("fast_preview_cache_bytes",{description:"Decofile disk cache bytes by area",unit:"By"}).addCallback(($)=>{if(!Dh)return;$.observe(Dh.index.areaBytes.blobs,{area:"blobs"}),$.observe(Dh.index.areaBytes.merged,{area:"merged"})}),S$.createObservableGauge("fast_preview_cache_entries",{description:"Decofile disk cache entry count by area",unit:"{entries}"}).addCallback(($)=>{if(!Dh)return;let Z={blobs:0,merged:0};for(let X of Dh.index.entries.values())Z[X.area]+=1;$.observe(Z.blobs,{area:"blobs"}),$.observe(Z.merged,{area:"merged"})})}function jZ6($){X_.hits[$]+=1,XB?.hits.add(1,{area:$})}function wb$($){X_.misses[$]+=1,XB?.misses.add(1,{area:$})}function u61(){X_.evictions+=1,XB?.evictions.add(1)}function KN($){X_.errors+=1,XB?.errors.add(1,{op:$})}function zZ6($){X_.invalidKeySkips+=1,XB?.errors.add(1,{op:`${$}_invalid_key`})}function c61(){return Bb$??=AZ6(),Bb$}async function AZ6(){let $=DZ6();if(!$.enabled)return null;EZ6();try{await Lr(A7($.root,"blobs"),{recursive:!0}),await Lr(A7($.root,"merged"),{recursive:!0}),await Lr(A7($.root,"tmp"),{recursive:!0})}catch{return KN("init"),null}let Z=[];try{Z=await Pb$($.root)}catch{KN("scan"),Z=[]}let X={root:$.root,index:g61(Z,$.index),cfg:$};return Dh=X,IZ6(X),X}async function kz0($){try{return await JZ6($)}catch{return[]}}async function Pb$($){let Z=[];for(let X of["blobs","merged"]){let Q=A7($,X);for(let Y of await kz0(Q)){let G=A7(Q,Y);for(let J of await kz0(G)){let W=A7(G,J);for(let K of await kz0(W))try{let H=await zb$(A7(W,K));if(!H.isFile())continue;Z.push({path:`${X}/${Y}/${J}/${K}`,bytes:H.size,mtimeMs:H.mtimeMs})}catch{}}}}return Z}function Ab$($,Z,X){if(!h61(X))return null;try{return`blobs/${Dr($)}/${Dr(Z)}/${X}`}catch{return null}}function Tb$($,Z,X){if(!h61(X))return null;try{return`merged/${Dr($)}/${Dr(Z)}/${X}.json`}catch{return null}}async function Rb$($,Z){try{let X=await c61();if(!X)return null;if(Z===null)return wb$($),null;try{let Q=await WZ6(A7(X.root,Z),"utf8");return Nb$(X.index,Z),jZ6($),Q}catch{return wb$($),null}}catch{return KN(`get_${$}`),null}}function Ib$($,Z,X){return Rb$("blobs",Ab$($,Z,X))}function qb$($,Z,X){return Rb$("merged",Tb$($,Z,X))}async function TZ6($){if($.cfg.freeFloorBytes<=0)return!0;try{let Z=await HZ6($.root);return Z.bavail*Z.bsize>=$.cfg.freeFloorBytes}catch{return!0}}async function Sz0($){try{await FZ6($)}catch{}}async function RZ6($){try{let Z=$.cfg.index.maxTotalBytes/2;while($.index.totalBytes>Z){let X=$.index.entries.keys().next();if(X.done)break;wh($.index,X.value),await Sz0(A7($.root,X.value)),u61()}}catch{KN("emergency_evict")}}async function Mb$($,Z,X,Q){try{let Y=await c61();if(!Y)return;if(X===null){zZ6(Z);return}if(!await TZ6(Y)){X_.floorSkips+=1,XB?.floorSkips.add(1);return}let G=Buffer.byteLength(Q,"utf8"),J=Ub$(Y.index,{path:X,bytes:G,area:$});if(!J.admitted){X_.admissionRefusals+=1;return}for(let K of J.evict)await Sz0(A7(Y.root,K)),u61();let W=A7(Y.root,"tmp",`stage-${Eb$()}`);try{await NZ6(W,Q,"utf8");let K=A7(Y.root,X);await Lr(OZ6(K),{recursive:!0}),await KZ6(W,K)}catch(K){if(wh(Y.index,X),await Sz0(W),KN(Z),K?.code==="ENOSPC")await RZ6(Y)}}catch{KN(Z)}}function Vz0($,Z,X,Q){return Mb$("blobs","put_blob",Ab$($,Z,X),Q)}function kb$($,Z,X,Q){return Mb$("merged","put_merged",Tb$($,Z,X),Q)}async function Sb$(){try{let $=await c61();if(!$)return null;let Z=A7($.root,"tmp",Eb$());return await Lr(Z,{recursive:!0}),Z}catch{return KN("make_scratch"),null}}async function Vb$($){try{await jb$($,{recursive:!0,force:!0})}catch{KN("remove_scratch")}}function IZ6($){let Z=$.cfg.sweepIntervalMs;if(Z<=0)return;Db$=new AbortController,R$(Math.random()*Z,{signal:Db$.signal}).then(()=>{Lb$($);let X=setInterval(()=>void Lb$($),Z);X.unref?.(),PZ6=X}).catch(()=>{})}async function Lb$($){try{let Z=g61(await Pb$($.root),$.cfg.index),X=$.cfg.index;for(let[G,J]of Z.entries){let W=Z.totalBytes>X.maxTotalBytes,K=Z.areaBytes.merged>X.maxMergedBytes;if(!W&&!K)break;if(!W&&K&&J.area!=="merged")continue;wh(Z,G),await Sz0(A7($.root,G)),u61()}$.index=Z;let Q=A7($.root,"tmp"),Y=Date.now();for(let G of await kz0(Q)){let J=A7(Q,G);try{let W=await zb$(J);if(Y-W.mtimeMs>BZ6)await jb$(J,{recursive:!0,force:!0})}catch{}}}catch{KN("sweep")}}var wZ6=1024,Mz0,Ob$,BZ6=3600000,qz0=null,XB=null,X_,Bb$=null,Dh=null,PZ6=null,Db$=null;var Cb$=B(()=>{t4();v6();Mz0=1024*wZ6,Ob$=1024*Mz0;X_=LZ6()});function _b$(){let $=new Map;return{run(Z,X){let Q=$.get(Z);if(Q)return Q;let Y=Promise.resolve().then(X).finally(()=>{$.delete(Z)});return $.set(Z,Y),Y}}}import{readdir as qZ6,stat as MZ6}from"fs/promises";import{join as vb$}from"path";function kZ6($,Z,X){let Q=["-xz","--strip-components=1","-C",Z];return $==="gnu"?[...Q,"--wildcards",X]:[...Q,X]}function SZ6(){return fb$??=(async()=>{try{let $=Bun.spawn(["tar","--version"],{stdin:"ignore",stdout:"pipe",stderr:"ignore"}),Z=await new Response($.stdout).text();return await $.exited,Z.includes("GNU")?"gnu":"bsd"}catch{return"bsd"}})(),fb$}async function bb$($,Z,X){let Q=X.replace(/^\.\//,"").replace(/^\/+/,"").replace(/\/+$/,"");if(Q===""||Q.split("/").includes(".."))throw new Er(`invalid blocks path prefix: ${X}`);let Y=await SZ6(),G=`*/${Q}/*.json`,J=()=>Bun.spawn(["tar",...kZ6(Y,Z,G)],{stdin:$,stdout:"ignore",stderr:"pipe"}),W;try{W=J()}catch(N){throw new Er("failed to spawn tar",{cause:N})}let K=new Response(W.stderr).text().catch(()=>""),H=await W.exited;if(H!==0){let N=(await K).trim().slice(0,500);throw new Er(`tar exited with code ${H}${N?`: ${N}`:""}`)}let F=await VZ6(Z,Q);if(F.length===0)throw new Er(`tar extracted no ${G} members into ${Z}`);return F}async function VZ6($,Z){let X=vb$($,...Z.split("/")),Q;try{Q=await qZ6(X)}catch{return[]}let Y=[];for(let G of Q){if(!G.endsWith(".json"))continue;let J=vb$(X,G);try{if(!(await MZ6(J)).isFile())continue}catch{continue}Y.push({path:`${Z}/${G}`,diskPath:J})}return Y.sort((G,J)=>G.path.localeCompare(J.path))}var Er,fb$=null;var xb$=B(()=>{Er=class Er extends Error{constructor($,Z){super($,Z);this.name="TarExtractError"}}});import{createHash as CZ6}from"crypto";import{readFile as _Z6}from"fs/promises";async function jr($,Z){try{return await $.getHeadSha(Z)}catch(Q){if(!(Q instanceof V6)||Q.status!==404)throw Q}let X=await $.getHeadSha(await $.getDefaultBranch());try{return await $.createRef(Z,X),X}catch(Q){if(Q instanceof V6&&Q.status===422)return $.getHeadSha(Z);throw Q}}function fZ6(){let $=Bun.env.FAST_PREVIEW_COLD_TARBALL_MAX_BYTES;if($===void 0||$==="")return gb$;let Z=Number($);return Number.isFinite(Z)&&Z>=0?Math.floor(Z):gb$}function bZ6($){hb$??=S$.createCounter("decofile_cold_reads",{description:"Decofile cold snapshot reads by resolution path",unit:"{reads}"}),hb$.add(1,{path:$})}async function Cz0($,Z,X){let Q=Array($.length),Y=0,G=Array.from({length:Math.min(Z,$.length)},async()=>{for(;;){let J=Y++;if(J>=$.length)return;Q[J]=await X($[J])}});return await Promise.all(G),Q}function _z0($){return $?`${$}/.deco/blocks`:".deco/blocks"}function l61($,Z){let X=`${_z0(Z)}/`,Q=[];for(let Y of $){if(Y.type!=="blob"||!Y.path.startsWith(X))continue;let G=Y.path.slice(X.length);if(G.includes("/"))continue;if(!G.toLowerCase().endsWith(".json"))continue;Q.push({stem:G.slice(0,-5),sha:Y.sha,path:Y.path,size:Y.size})}return Q}function d61($,Z){return $.filter((X)=>wr(X.stem)===Z).map((X)=>X.path).sort()}function ub$($,Z,X,Q){return Vz0($,Z,X,Q)}function xZ6($,Z){if(!Z)return $;return CZ6("sha1").update(`${$}:${Z}`).digest("hex")}async function cb$($,Z,X,Q){let Y=Q?.createBranchIfMissing?await jr($,Z):await $.getHeadSha(Z);return yZ6.run(`${$.owner}/${$.repo}@${Y}:${X??""}`,()=>gZ6($,Y,X))}async function gZ6($,Z,X){let{owner:Q,repo:Y}=$,G=xZ6(Z,X),J=await qb$(Q,Y,G);if(J!==null)return{sha:Z,decofile:J};let W=await $.getCommitTreeSha(Z),K=await $.getTreeRecursive(W),H=l61(K,X),F=new Map;if(await Cz0(H,yb$,async(w)=>{let D=await Ib$(Q,Y,w.sha);if(D!==null)F.set(w.path,D)}),H.length-F.size>vZ6){let w=await hZ6($,Z,X,H);if(bZ6(w!==null?"tarball":"blobs"),w!==null)for(let[D,L]of w)F.set(D,L)}let U=await Cz0(H,yb$,async(w)=>{let D=F.get(w.path);if(D!==void 0)return{stem:w.stem,content:D};let L=await $.getBlobText(w.sha);return await Vz0(Q,Y,w.sha,L),{stem:w.stem,content:L}}),O=Br(U);return await kb$(Q,Y,G,O),{sha:Z,decofile:O}}async function hZ6($,Z,X,Q){let Y=`${$.owner}/${$.repo}`,G=fZ6(),J=0;for(let K of Q){if(K.size===void 0)return console.warn("decofile cold read: tarball skipped (tree entry missing size; cannot pre-validate)",{repo:Y,sha:Z,path:K.path}),null;J+=K.size}if(J>G)return console.warn("decofile cold read: tarball skipped (blocks over FAST_PREVIEW_COLD_TARBALL_MAX_BYTES)",{repo:Y,sha:Z,aggregateBytes:J,maxBytes:G}),null;let W=await Sb$();if(W===null)return null;try{let K=await $.getTarballStream(Z),H=await bb$(K,W,_z0(X)),F=new Map(Q.map((U)=>[U.path,U.sha])),N=new Map;for(let U of H){let O=F.get(U.path);if(O===void 0)continue;let w=await _Z6(U.diskPath,"utf8");await Vz0($.owner,$.repo,O,w),N.set(U.path,w)}return N}catch(K){return console.warn("decofile cold read: tarball path failed; falling back to blob fetches",{repo:Y,sha:Z,error:K instanceof Error?K.message:String(K)}),null}finally{await Vb$(W)}}var yb$=12,vZ6=50,gb$=134217728,hb$=null,yZ6;var vz0=B(()=>{Iz0();v6();Cb$();Z_();xb$();yZ6=_b$()});async function fz0($,Z){let X=await $.getDefaultBranch(),Q=await jr($,Z),Y=X===Z?{aheadBy:0,behindBy:0}:await $.compare(X,Z);return{not_added:[],conflicted:[],created:[],deleted:[],modified:[],renamed:[],files:[],staged:[],ahead:0,behind:0,current:Z,tracking:`origin/${Z}`,detached:!1,base:X,aheadOfBase:Y.aheadBy,behindBase:Y.behindBy,headSha:Q,unpushed:0}}async function bz0($,Z,X){let Q=X??await $.getDefaultBranch(),Y=await $.compareDetailed(Q,Z),G=Y.files.slice(0,uZ6),J=await $.getCommitTreeSha(Y.mergeBaseSha),W=await $.getTreeRecursive(J),K=new Map(W.filter((F)=>F.type==="blob").map((F)=>[F.path,F.sha])),H=await Cz0(G,cZ6,async(F)=>{let N=F.previousFilename??F.filename,U=F.status==="added"?void 0:K.get(N),O=U?await $.getBlobText(U):null,w=F.status==="removed"?null:await $.getBlobText(F.sha);return[F.filename,{from:O,to:w}]});return{diffs:Object.fromEntries(H),mergeBaseSha:Y.mergeBaseSha}}async function lb$($,Z,X,Q="fail"){try{await $.mergeBranch(Z,X,`chore(decofile): merge ${X} into ${Z}`);return}catch(Y){if(!(Y instanceof V6&&Y.status===409))throw Y;if(Q!=="branch-wins")throw new V6(409,"POST","merges",`Merge conflict updating ${Z} from ${X} \u2014 resolve on GitHub`)}await mZ6($,Z,X)}async function mZ6($,Z,X){for(let Q=1;;Q++){let Y=await $.getHeadSha(Z),G=await $.getHeadSha(X),{files:J}=await $.compareDetailed(X,Z);if(J.length>=lZ6)throw new V6(409,"POST","merges",`Too many changed files on ${Z} to auto-merge (${J.length}); resolve on GitHub`);let W=await $.getTreeRecursive(await $.getCommitTreeSha(Y)),K=new Map(W.filter((U)=>U.type==="blob").map((U)=>[U.path,U])),H=[];for(let U of J){let O=K.get(U.filename);if(U.status==="removed"||!O)H.push({path:U.filename,mode:"100644",type:"blob",sha:null});else H.push({path:U.filename,mode:"100644",type:"blob",sha:O.sha});if(U.previousFilename&&U.previousFilename!==U.filename)H.push({path:U.previousFilename,mode:"100644",type:"blob",sha:null})}let F=await $.createTree(await $.getCommitTreeSha(G),H),N=await $.createCommit({message:`chore(decofile): merge ${X} into ${Z} (branch content wins)`,treeSha:F,parentShas:[Y,G]});try{await $.updateRef(Z,N);return}catch(U){if(U instanceof V6&&U.status===422&&Q<dZ6)continue;throw U}}}var uZ6=200,cZ6=12,lZ6=300,dZ6=3;var db$=B(()=>{Z_();vz0()});function nZ6($){if(!$||$.includes(".."))return!1;return iZ6.test($)}function mb$($){let Z=typeof $.__resolveType==="string"?$.__resolveType:null;if(!Z||!nZ6(Z))return null;let{__resolveType:X,...Q}=$;return{resolveType:Z,payload:Q}}function ib$($,Z){return`${$.replace(/\/+$/,"")}/deco/invoke/${Z}`}var iZ6;var nb$=B(()=>{iZ6=/^[\w./@-]+$/});function m61($){let Z;try{Z=new URL($)}catch{return null}if(!Z.hostname.endsWith(".localhost"))return null;let X=Z.host;return Z.hostname="127.0.0.1",{url:Z.toString(),hostHeader:X}}function zr($,Z){let X=$?.githubRepo;if(!X?.owner||!X?.name)return null;if(!X.connectionId)return X;if(!Z.includes(X.connectionId))return null;return X}async function pb$($,Z,X,Q){if(!Q.connectionId)throw new Q_("Push requires a connected GitHub account. Connect mcp-github for this project and restart the sandbox.");let Y=$.organization?.id;if(!Y)throw new Q_(VZ);await VO({ctx:$,connectionId:Q.connectionId,organizationId:Y,forceRefresh:!0,onLegacyMintError:(F)=>{let N=F instanceof Error?F.message:VZ;throw new Q_(N)}});let{cloneUrl:G,gitUserName:J,gitUserEmail:W}=await CO(Q.connectionId,Q.owner,Q.name,$.db,$.vault).catch((F)=>{let{code:N,message:U}=k$$(F instanceof Error?F.message:String(F));throw N?new Q_(U):F}),K=Uh($),H=await Z.proxyDaemonRequest(X,"/_sandbox/config",{method:"PUT",headers:new Headers({"content-type":"application/json"}),body:JSON.stringify({git:{repository:{cloneUrl:G},identity:{userName:J,userEmail:W}},...K?{operator:K}:{}})});if(!H.ok){let F=await tO(H,pZ6).catch(()=>H.statusText);throw Error(`Failed to refresh sandbox git credentials (${H.status}): ${F}`)}}var pZ6=10485760,Q_;var i61=B(()=>{$K();Pz0();Yn();fl0();Dx();Q_=class Q_ extends Error{constructor($){super($);this.name="GitPushAuthError"}}});function oZ6($){let Z=$.startsWith("thread:")?$.slice(7):$;if(!Z||Z.length>255||Z.includes("..")||Z.startsWith("/")||Z.endsWith("/")||Z.endsWith(".lock")||!tZ6.test(Z))throw Error(`Invalid branch name: ${$}`)}function Y_($){return AbortSignal.any([$.req.raw.signal,AbortSignal.timeout(aZ6)])}function G_($){let{runner:Z}=$.get("vmClaim");if(!Z)return $.json({error:"No sandbox runner configured"},503);return Z}async function Pr($){let{virtualMcpMetadata:Z,connectionIds:X}=$.get("vmClaim"),Q=$.var.studioContext,Y=zr(Z,X);if(!Y)throw new V6(404,"AUTH","repo","Project has no GitHub repository");let G=r(Q);return Tz0(Q,G.id,Y)}function n61($,Z){if(Z instanceof V6){let Q=Z.status===404?404:Z.status===409||Z.status===422?409:502;return $.json({error:Z.message},Q,z9)}let X=Z instanceof Error?Z.message:String(Z);return $.json({error:X},502,z9)}async function rb$($){try{let Z=await Pr($),X=await fz0(Z,$.get("vmClaim").branch);return $.json(X,200,z9)}catch(Z){return n61($,Z)}}function yz0($,Z){let Q=(xz0.get($)??Promise.resolve()).catch(()=>{}).then(Z),Y=Q.catch(()=>{});return xz0.set($,Y),Y.finally(()=>{if(xz0.get($)===Y)xz0.delete($)}),Q}async function gZ($,Z,X){if($.get("vmClaim").fastPreview)return $.json({error:"sandbox not found: Fast Preview projects are sandbox-less"},404,z9);let Q=G_($);if(Q instanceof Response)return Q;let{claimName:Y,userId:G,projectRef:J}=$.get("vmClaim"),W=X?.method??"POST",K=null,H=new Headers;if(X?.jsonBody!==void 0)K=X.jsonBody,H.set("content-type","application/json");else if(X?.forwardJsonBody)K=await $.req.text(),H.set("content-type","application/json");let F=X?.signal,N={method:W,headers:H,body:K,...F?{signal:F}:{}},U=async()=>{let O=await Q.proxyDaemonRequest(Y,Z,N);if(X?.map404to410&&O.status===404){try{await O.body?.cancel()}catch{}if(await Q.adoptLiveClaim?.({userId:G,projectRef:J},Y))O=await Q.proxyDaemonRequest(Y,Z,N);if(O.status===404){try{await O.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",...z9}})}}let w=await O.text(),D=X?.redactRepoDirUnlessDesktop&&Q.kind!=="user-desktop"?eZ6(w):w,L=O.headers.get("content-type")??"application/json";return new Response(D,{status:O.status,headers:{"content-type":L,...z9}})};try{if(F){let O=U();return O.catch(()=>{}),await Promise.race([O,new Promise((D,L)=>{if(F.aborted)return L(F.reason);F.addEventListener("abort",()=>L(F.reason),{once:!0})})])}return await U()}catch(O){let w=O instanceof Error?O.message:String(O);return $.json({error:`Daemon unreachable: ${w}`},502)}}function eZ6($){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 gz0($,Z,X,Q="GET",Y){let G=await $.proxyDaemonRequest(Z,X,{method:Q,headers:new Headers,body:null});if(G.status===404&&Y){try{await G.body?.cancel()}catch{}if(await $.adoptLiveClaim?.(Y,Z))G=await $.proxyDaemonRequest(Z,X,{method:Q,headers:new Headers,body:null})}if(G.status===404){try{await G.body?.cancel()}catch{}throw Error("SANDBOX_GONE")}let J=await G.text();if(!G.ok){let W=`Daemon error (${G.status})`;try{W=JSON.parse(J).error??W}catch{}throw Error(W)}return JSON.parse(J)}function $76($){return ab$.includes($)}var tZ6,tb$=524288,rZ6=65536,aZ6=1e4,ob$=2000,sZ6,xz0,z9,ab$,sb$=()=>{let $=new U1;$.use("/:virtualMcpId/:branch/*",sZ6),$.post("/:virtualMcpId/:branch/write",(X)=>gZ(X,"/_sandbox/write",{forwardJsonBody:!0,signal:Y_(X)})),$.post("/:virtualMcpId/:branch/unlink",(X)=>gZ(X,"/_sandbox/unlink",{forwardJsonBody:!0,signal:Y_(X)})),$.post("/:virtualMcpId/:branch/mkdir",(X)=>gZ(X,"/_sandbox/mkdir",{forwardJsonBody:!0,signal:Y_(X)})),$.post("/:virtualMcpId/:branch/rename",(X)=>gZ(X,"/_sandbox/rename",{forwardJsonBody:!0,signal:Y_(X)})),$.post("/:virtualMcpId/:branch/read",(X)=>gZ(X,"/_sandbox/read",{forwardJsonBody:!0,signal:Y_(X)})),$.post("/:virtualMcpId/:branch/glob",(X)=>gZ(X,"/_sandbox/glob",{forwardJsonBody:!0,signal:Y_(X)})),$.post("/:virtualMcpId/:branch/grep",(X)=>gZ(X,"/_sandbox/grep",{forwardJsonBody:!0,signal:Y_(X)})),$.post("/:virtualMcpId/:branch/exec/:script",async(X)=>{let Q=X.req.param("script");if(!Q)return X.json({error:"missing script name"},400);return gZ(X,`/_sandbox/exec/${encodeURIComponent(Q)}`)}),$.post("/:virtualMcpId/:branch/exec/:script/kill",async(X)=>{let Q=X.req.param("script");if(!Q)return X.json({error:"missing script name"},400);return gZ(X,`/_sandbox/exec/${encodeURIComponent(Q)}/kill`)}),$.get("/:virtualMcpId/:branch/config",(X)=>gZ(X,"/_sandbox/config",{method:"GET",map404to410:!0,redactRepoDirUnlessDesktop:!0})),$.put("/:virtualMcpId/:branch/config",(X)=>gZ(X,"/_sandbox/config",{method:"PUT",forwardJsonBody:!0,map404to410:!0})),$.post("/:virtualMcpId/:branch/setup/:step",async(X)=>{let Q=X.req.param("step");if(!Q||!$76(Q))return X.json({error:`step must be one of: ${ab$.join(", ")}`},400);if(Q==="start"){let Y=X.get("vmClaim");if(Y.runner){let G=r(X.var.studioContext),J=vx(Y.virtualMcpMetadata);try{await hU0({ctx:X.var.studioContext,runner:Y.runner,handle:Y.claimName,orgId:G.id,userId:Y.callerUserId,entries:J})}catch(W){let K=W instanceof Error?W.message:String(W);return X.json({error:`Failed to push env to daemon: ${K}`},502)}}}return gZ(X,`/_sandbox/setup/${Q}`,{signal:X.req.raw.signal,map404to410:!0})}),$.get("/:virtualMcpId/:branch/events",(X)=>{let Q=X.get("vmClaim");if(!Q.runner)return WN(X,async(Y)=>{await Y.writeSSE({event:"phase",data:JSON.stringify({kind:"failed",reason:"unknown",message:"No sandbox runner configured on this studio instance."})})});return rf$(X,{ctx:X.var.studioContext,claimName:Q.claimName,runner:Q.runner,virtualMcpId:Q.virtualMcpId,branch:Q.branch,userId:Q.userId,projectRef:Q.projectRef,virtualMcpMetadata:Q.virtualMcpMetadata})}),$.get("/:virtualMcpId/:branch/git/status",(X)=>{if(X.get("vmClaim").fastPreview)return rb$(X);return Z(X)});let Z=(X)=>gZ(X,"/_sandbox/git/status",{method:"GET",map404to410:!0,signal:AbortSignal.any([X.req.raw.signal,AbortSignal.timeout(ob$)])});return $.post("/:virtualMcpId/:branch/git/status",(X)=>{if(X.get("vmClaim").fastPreview)return rb$(X);return gZ(X,"/_sandbox/git/status",{map404to410:!0,signal:AbortSignal.any([X.req.raw.signal,AbortSignal.timeout(ob$)])})}),$.post("/:virtualMcpId/:branch/git/diff",async(X)=>{let Q=X.get("vmClaim");if(Q.fastPreview)try{let Y=await X.req.json().catch(()=>({})),G=await Pr(X),J=await bz0(G,Q.branch,Y.base);return X.json(J,200,z9)}catch(Y){return n61(X,Y)}return gZ(X,"/_sandbox/git/diff",{forwardJsonBody:!0,map404to410:!0})}),$.post("/:virtualMcpId/:branch/git/publish",async(X)=>{if(X.get("vmClaim").fastPreview)return X.json({ok:!0},200,z9);let Q=G_(X);if(Q instanceof Response)return Q;let{claimName:Y,virtualMcpMetadata:G,connectionIds:J}=X.get("vmClaim"),W=X.var.studioContext;return yz0(Y,async()=>{try{await M61(W,Q,Y);let K=zr(G,J);if(K)await pb$(W,Q,Y,K)}catch(K){if(K instanceof Q_)return X.json({error:K.message},403,z9);let H=K instanceof Error?K.message:String(K);return X.json({error:H},502,z9)}return gZ(X,"/_sandbox/git/publish",{forwardJsonBody:!0,map404to410:!0})})}),$.post("/:virtualMcpId/:branch/git/discard",async(X)=>{let{claimName:Q,fastPreview:Y}=X.get("vmClaim");if(Y)return X.json({error:"Nothing to discard: Fast Preview projects have no working tree"},400,z9);return yz0(Q,()=>gZ(X,"/_sandbox/git/discard",{forwardJsonBody:!0,map404to410:!0}))}),$.post("/:virtualMcpId/:branch/git/rebase",async(X)=>{let Q=X.get("vmClaim");if(Q.fastPreview)return yz0(Q.claimName,async()=>{try{let W=await X.req.json().catch(()=>({})),K=await Pr(X),H=W.base??await K.getDefaultBranch();return await lb$(K,Q.branch,H,W.onConflict==="branch-wins"?"branch-wins":"fail"),X.json({ok:!0},200,z9)}catch(W){return n61(X,W)}});let Y=G_(X);if(Y instanceof Response)return Y;let{claimName:G}=X.get("vmClaim"),J=X.var.studioContext;return yz0(G,async()=>{try{await M61(J,Y,G)}catch(W){let K=W instanceof Error?W.message:String(W);return X.json({error:K},502,z9)}return gZ(X,"/_sandbox/git/rebase",{forwardJsonBody:!0,map404to410:!0})})}),$.post("/:virtualMcpId/:branch/git/suggest-commit",NZ({maxSize:tb$,onError:(X)=>X.json({error:"Payload too large"},413,z9)}),async(X)=>{let Q=X.get("vmClaim"),Y=null;if(!Q.fastPreview){let H=G_(X);if(H instanceof Response)return H;Y=H}let{claimName:G,userId:J,projectRef:W}=Q,K=X.var.studioContext;try{let H=await X.req.json().catch(()=>({})),F=H.status,N=H.diff,U=N!=null&&typeof N.diffs==="object"&&N.diffs!==null,[O,w]=V61(F)&&U?[F,N]:Y?await Promise.all([gz0(Y,G,"/_sandbox/git/status","GET",{userId:J,projectRef:W}),gz0(Y,G,"/_sandbox/git/diff","GET",{userId:J,projectRef:W})]):await(async()=>{let L=await Pr(X);return Promise.all([fz0(L,Q.branch),bz0(L,Q.branch)])})(),D=await Zb$(K,O,w);return X.json(D,200,z9)}catch(H){let F=H instanceof Error?H.message:String(H);if(F==="SANDBOX_GONE")return X.json({error:"Sandbox handle is gone. The sandbox needs to be re-provisioned."},410,z9);return X.json({error:F},502,z9)}}),$.post("/:virtualMcpId/:branch/git/judge-review",NZ({maxSize:tb$,onError:(X)=>X.json({error:"Payload too large"},413,z9)}),async(X)=>{let Q=X.get("vmClaim"),Y=null;if(!Q.fastPreview){let H=G_(X);if(H instanceof Response)return H;Y=H}let{claimName:G,userId:J,projectRef:W}=Q,K=X.var.studioContext;try{let H=await X.req.json().catch(()=>({})),F=H.status,N=H.diff,U=N!=null&&typeof N.diffs==="object"&&N.diffs!==null,[O,w]=V61(F)&&U?[F,N]:Y?await Promise.all([gz0(Y,G,"/_sandbox/git/status","GET",{userId:J,projectRef:W}),gz0(Y,G,"/_sandbox/git/diff","GET",{userId:J,projectRef:W})]):await(async()=>{let L=await Pr(X);return Promise.all([fz0(L,Q.branch),bz0(L,Q.branch)])})(),D=await Qb$(K,O,w,typeof H.language==="string"?H.language:void 0);return X.json(D,200,z9)}catch(H){let F=H instanceof Error?H.message:String(H);if(F==="SANDBOX_GONE")return X.json({error:"Sandbox handle is gone. The sandbox needs to be re-provisioned."},410,z9);return X.json({error:F},502,z9)}}),$.get("/:virtualMcpId/:branch/preview-fetch",async(X)=>{let Q=G_(X);if(Q instanceof Response)return Q;let{claimName:Y}=X.get("vmClaim"),G=X.req.query("path");if(!G||!G.startsWith("/")||G.startsWith("//")||G.includes("..")||G.includes("\\"))return X.json({error:"Path not allowed"},403);let J;try{J=await Q.getPreviewUrl(Y)}catch{return X.json({error:"Preview not available"},502)}if(!J)return X.json({error:"Preview not available"},502);let W=J.replace(/\/+$/,""),K=m61(`${W}${G}`),H;try{H=await fetch(K?.url??`${W}${G}`,{...K?{headers:{host:K.hostHeader}}:{}})}catch{return X.json({error:"Preview unreachable"},502)}let F;try{F=await H.text()}catch{return X.json({error:"Preview unreachable"},502)}return new Response(F,{status:H.status,headers:{"content-type":H.headers.get("content-type")??"application/json"}})}),$.post("/:virtualMcpId/:branch/preview-invoke",NZ({maxSize:rZ6,onError:(X)=>X.json({error:"Payload too large"},413)}),async(X)=>{let Q=G_(X);if(Q instanceof Response)return Q;let{claimName:Y}=X.get("vmClaim"),G;try{G=await Q.getPreviewUrl(Y)}catch{return X.json({error:"Preview not available"},502)}if(!G)return X.json({error:"Preview not available"},502);let J;try{J=await X.req.json()}catch{return X.json({error:"Invalid JSON body"},400)}if(!J||typeof J!=="object"||Array.isArray(J))return X.json({error:"Invalid JSON body"},400);let W=mb$(J);if(!W)return X.json({error:"Invalid or missing __resolveType"},400);let K=ib$(G,W.resolveType),H=m61(K),F;try{F=await fetch(H?.url??K,{method:"POST",headers:{"content-type":"application/json",...H?{host:H.hostHeader}:{}},body:JSON.stringify(W.payload),signal:AbortSignal.timeout(30000)})}catch{return X.json({error:"Preview unreachable"},502)}let N;try{N=await F.text()}catch{return X.json({error:"Preview unreachable"},502)}return new Response(N,{status:F.status,headers:{"content-type":F.headers.get("content-type")??"application/json"}})}),$};var eb$=B(()=>{C8();aw();Nh();q61();HF();tf$();R3();mO();of$();af$();$i0();Xn();v61();Yb$();x61();Z_();db$();nb$();i61();tZ6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;sZ6=zz0(async($,Z)=>{let X=$.var.studioContext;try{Z0(X)}catch{return $.json({error:"Unauthorized"},401)}let Q=W1(X);if(!Q)return $.json({error:"Unauthorized"},401);let Y;try{Y=r(X)}catch{return $.json({error:"Organization scope required"},403)}let G=$.req.param("virtualMcpId"),J=$.req.param("branch");if(!G||!J)return $.json({error:"virtualMcpId and branch are required"},400);try{oZ6(J)}catch(O){let w=O instanceof Error?O.message:String(O);return $.json({error:w},400)}let W=await X.storage.virtualMcps.findById(G);if(!W||W.organization_id!==Y.id)return $.json({error:"Virtual MCP not found"},404);let K=Ti({orgId:Y.id,virtualMcpId:G,branch:J}),H=await EF(X,J,Q),F=pf$({userId:H,projectRef:K}),N=W.metadata??null;if(N?.fastPreview===!0&&Az0(N))return $.set("vmClaim",{claimName:F,callerUserId:Q,runner:null,virtualMcpId:G,branch:J,userId:H,projectRef:K,virtualMcpMetadata:N,connectionIds:W.connections?.map((O)=>O.connection_id)??[],fastPreview:!0}),Z();let U;try{U=(await mX(X,{userId:H,branch:J,virtualMcpMetadata:N})).provider}catch{U=null}if(!U)return $.json({error:"No sandbox runner found"},404);return $.set("vmClaim",{claimName:F,callerUserId:Q,runner:U,virtualMcpId:G,branch:J,userId:H,projectRef:K,virtualMcpMetadata:N,connectionIds:W.connections?.map((O)=>O.connection_id)??[]}),Z()});xz0=new Map;z9={"Cache-Control":"no-store, no-cache, must-revalidate",Pragma:"no-cache"};ab$=["clone","install","start"]});function $x$($,Z,X){let Q=p61.get($);if(!Q)Q={pending:null,running:!1},p61.set($,Q);if(!Q.pending)Q.pending={set:new Map,del:new Set,deps:Z,resolvers:[],rejecters:[]};let Y=Q.pending;Y.deps=Z;for(let[J,W]of Object.entries(X.set??{}))Y.set.set(J,W),Y.del.delete(J);for(let J of X.delete??[])Y.del.add(J),Y.set.delete(J);let G=new Promise((J,W)=>{Y.resolvers.push(J),Y.rejecters.push(W)});if(!Q.running)X76($,Q);return G}async function X76($,Z){Z.running=!0;try{while(Z.pending){let X=Z.pending;Z.pending=null;try{let Q=await Q76(X);for(let Y of X.resolvers)Y(Q)}catch(Q){for(let Y of X.rejecters)Y(Q)}}}finally{if(Z.running=!1,!Z.pending)p61.delete($)}}async function Q76($){let{client:Z,branch:X,packagePath:Q}=$.deps;for(let Y=0;;Y++){let G=await jr(Z,X),J=await Z.getCommitTreeSha(G),W=await Z.getTreeRecursive(J),K=l61(W,Q),H=[],F=new Map(K.map((w)=>[w.path,{stem:w.stem,sha:w.sha}]));for(let[w,D]of $.set){let L=d61(K,w),E=`${JSON.stringify(D,null,2)}
2737
- `,j=await Z.createBlob(E);await ub$(Z.owner,Z.repo,j,E);let z=L[0]??`${_z0(Q)}/${y61(w)}.json`;H.push({path:z,mode:"100644",type:"blob",sha:j});let A=z.slice(z.lastIndexOf("/")+1,-5);F.set(z,{stem:A,sha:j,content:E});for(let P of L.slice(1))H.push({path:P,mode:"100644",type:"blob",sha:null}),F.delete(P)}for(let w of $.del)for(let D of d61(K,w))H.push({path:D,mode:"100644",type:"blob",sha:null}),F.delete(D);if(H.length===0)return G;let N=Q?`${Q}/.deco/blocks.gen.json`:".deco/blocks.gen.json";if(W.some((w)=>w.type==="blob"&&w.path===N)){let w=await Promise.all([...F.values()].map(async(L)=>({stem:L.stem,content:L.content??await Z.getBlobText(L.sha)}))),D=await Z.createBlob(Br(w));H.push({path:N,mode:"100644",type:"blob",sha:D})}let U=await Z.createTree(J,H),O=await Z.createCommit({message:Y76($),treeSha:U,parentShas:[G]});try{return await Z.updateRef(X,O),O}catch(w){if(!(w instanceof V6&&w.status===422)||Y>=Z76-1)throw w;await R$(cZ(2000,200,Y,2,0.5))}}}function Y76($){let Z=(Y)=>{let G=Y.slice(0,3).join(", ");return Y.length>3?`${G} (+${Y.length-3} more)`:G},X=[];if($.set.size>0)X.push(`update ${Z([...$.set.keys()])}`);if($.del.size>0)X.push(`delete ${Z([...$.del])}`);let Q=`chore(decofile): ${X.join("; ")}`;return Il0(Q,$.deps.coAuthor)}var Z76=3,p61;var Zx$=B(()=>{_U0();Iz0();t4();Z_();vz0();p61=new Map});import{createHmac as Xx$,randomBytes as G76,timingSafeEqual as J76}from"crypto";function Qx$(){if(hz0)return hz0;let $;try{let Z=g0();$=Z.studioJwtSecret??Z.betterAuthSecret}catch{$=void 0}return hz0=$?Buffer.from($):G76(32),hz0}function t61($){let Z=$.nowMs??Date.now(),X={o:$.organizationId,m:$.virtualMcpId,b:$.branch,e:Math.floor((Z+W76)/1000)},Q=Buffer.from(JSON.stringify(X)).toString("base64url"),Y=Xx$("sha256",Qx$()).update(Q).digest("base64url");return`${Q}.${Y}`}function Yx$($,Z){let X=$.indexOf(".");if(X<0)return!1;let Q=$.slice(0,X),Y=Buffer.from($.slice(X+1)),G=Buffer.from(Xx$("sha256",Qx$()).update(Q).digest("base64url"));if(Y.length!==G.length||!J76(Y,G))return!1;let J;try{J=JSON.parse(Buffer.from(Q,"base64url").toString())}catch{return!1}let W=Math.floor((Z.nowMs??Date.now())/1000);return J.o===Z.organizationId&&J.m===Z.virtualMcpId&&J.b===Z.branch&&typeof J.e==="number"&&J.e>=W}var W76=21600000,hz0=null;var Gx$=B(()=>{I$()});import{z as Lh}from"zod";function H76($){return $.length>0&&$.length<=255&&!$.includes("..")&&!$.endsWith("/")&&!$.endsWith(".lock")&&K76.test($)}function Wx$($){return $.req.header("x-forwarded-host")??new URL($.req.url).host}async function uz0($){let Z=$.get("decofileScope");return Tz0($.var.studioContext,Z.organizationId,Z.githubRepo)}function cz0($,Z){if(Z instanceof V6){let Q=Z.status===404?404:Z.status===409?409:Z.status===422?409:502;return $.json({error:Z.message},Q)}let X=Z instanceof Error?Z.message:String(Z);return $.json({error:X},500)}function Kx$(){let $=new U1;return $.use("/:virtualMcpId/:branch",Jx$),$.use("/:virtualMcpId/:branch/*",Jx$),$.get("/:virtualMcpId/:branch",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await uz0(Z),Y=await cb$(Q,X.branch,X.packagePath,{createBranchIfMissing:!!X.userId}),G={ETag:`"${Y.sha}"`,"Cache-Control":"no-store","Access-Control-Allow-Origin":"*"};if(Z.req.header("if-none-match")===`"${Y.sha}"`)return Z.body(null,304,G);if(!X.userId)return Z.body(Y.decofile,200,{...G,"content-type":"application/json"});let J=t61({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.body(`{"version":${JSON.stringify(Y.sha)},"token":${JSON.stringify(J)},"apiHost":${JSON.stringify(Wx$(Z))},"decofile":${Y.decofile}}`,200,{...G,"content-type":"application/json"})}catch(Q){return cz0(Z,Q)}}),$.patch("/:virtualMcpId/:branch",async(Z)=>{let X=Z.get("decofileScope"),Q=Z.var.studioContext,Y=F76.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{Rz0(J)}catch(W){let K=W instanceof Error?W.message:String(W);return Z.json({error:K},400)}for(let[J,W]of Object.entries(G.set??{}))if(typeof W!=="object"||W===null||Array.isArray(W))return Z.json({error:`Block "${J}" must be a JSON object`},400);try{let J=await uz0(Z),W=await $x$(`${X.organizationId}/${X.virtualMcpId}/${X.branch}`,{client:J,branch:X.branch,packagePath:X.packagePath,coAuthor:Uh(Q)},G),K=t61({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.json({version:W,token:K,apiHost:Wx$(Z)})}catch(J){return cz0(Z,J)}}),$.post("/:virtualMcpId/:branch/publish",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await uz0(Z),Y=await Q.getDefaultBranch();if(Y===X.branch)return Z.json({error:"Branch is already the default branch"},400);try{let G=await Q.mergeBranch(Y,X.branch,`chore(decofile): publish ${X.branch}`);return G?Z.json({result:"merged",sha:G}):Z.json({result:"up-to-date"})}catch(G){if(G instanceof V6&&G.status===409)return Z.json({error:"merge-conflict"},409);if(G instanceof V6&&G.status===405){let W=await Q.findOpenPullRequest(Y,X.branch)??await Q.createPullRequest({base:Y,head:X.branch,title:`Publish ${X.branch}`});return Z.json({result:"pull-request",number:W.number,url:W.html_url})}throw G}}catch(Q){return cz0(Z,Q)}}),$.get("/:virtualMcpId/:branch/status",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await uz0(Z),Y=await Q.getDefaultBranch();if(Y===X.branch)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0});try{let{aheadBy:G,behindBy:J}=await Q.compare(Y,X.branch);return Z.json({baseBranch:Y,aheadBy:G,behindBy:J})}catch(G){if(G instanceof V6&&G.status===404)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0});throw G}}catch(Q){return cz0(Z,Q)}}),$}var K76,F76,Jx$;var Hx$=B(()=>{Iz0();C8();q61();Pz0();i61();x61();Zx$();Gx$();Z_();vz0();K76=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;F76=Lh.object({set:Lh.record(Lh.string(),Lh.unknown()).optional(),delete:Lh.array(Lh.string()).optional()}).refine(($)=>Object.keys($.set??{}).length>0||($.delete?.length??0)>0,{message:"Patch must set or delete at least one block"}),Jx$=zz0(async($,Z)=>{let X=$.var.studioContext,Q=X.organization;if(!Q)return $.json({error:"Organization scope required"},500);let Y=$.req.param("virtualMcpId"),G=$.req.param("branch");if(!Y||!G)return $.json({error:"virtualMcpId and branch are required"},400);if(!H76(G))return $.json({error:`Invalid branch name: ${G}`},400);let J=X.auth?.user?.id??null;if(!J){let O=$.req.query("token");if(!($.req.method==="GET"&&!$.req.path.match(/\/(publish|status)$/)))return $.json({error:"Unauthorized"},401);if(!O||!Yx$(O,{organizationId:Q.id,virtualMcpId:Y,branch:G}))return $.json({error:"Unauthorized"},401)}let W=await X.storage.virtualMcps.findById(Y);if(!W||W.organization_id!==Q.id)return $.json({error:"Virtual MCP not found"},404);let K=W.metadata??null;if(!Az0(K)||K?.fastPreview!==!0)return $.json({error:"Fast Preview is not enabled for this project"},404);let F=W.connections?.map((O)=>O.connection_id)??[],N=zr(K,F);if(!N)return $.json({error:"Project has no GitHub repository"},404);let U=K?.runtime;return $.set("decofileScope",{organizationId:Q.id,virtualMcpId:Y,branch:G,packagePath:U?.path?.replace(/^\/+|\/+$/g,"")||null,githubRepo:N,userId:J}),Z()})});var Fx$=($)=>{let Z=new U1;if(Z.use("*",iC),Z.route("/",yj0()),Z.route("/",CC$()),Z.route("/",ff$()),Z.route("/",Cf$()),Z.route("/",Lz0()),Z.route("/tools",cf$()),Z.route("/",gf$()),Z.route("/",Of$({kvStorage:$.kvStorage})),Z.route("/",Nf$()),Z.route("/fs",Rf$({getConnection:$.getNatsConnection})),Z.route("/sandbox",sb$()),Z.route("/decofile",Kx$()),Z.route("/",kf$()),Z.route("/deco-sites",hj0()),Z.route("/sso",Cj0()),Z.route("/",Ez0({tokenStorage:$.tokenStorage,automationEventDispatcher:$.automationEventDispatcher})),Z.route("/webhooks",TC$()),$.mountDevAssets)Z.route("/dev-assets",uj0({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("/",OS$()),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",qf$()),Z.route("/mcp",ew0()),Z.route("/mcp/self",Dz0()),Z.route("/mcp",XB0()),Z.all("/oauth-proxy/:connectionId/*",$.oauthProxyHandler),Z.get("/watch",$.watchHandler),Z};var Nx$=B(()=>{C8();p81();RC$();s81();cj0();uo();i81();Uf$();wf$();If$();en();y81();QB0();j61();Mf$();Sf$();_f$();bf$();hf$();P61();lf$();A61();$B0();eb$();Hx$()});function U76($){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}}))}async function O76($,Z){let X=await fetch(`${$}/rest/v1/apps?select=name,title,description,logo,category,vendors(alias,url)`,{headers:{apikey:Z,Authorization:`Bearer ${Z}`,Accept:"application/json"},signal:AbortSignal.timeout(N76)});if(!X.ok){let Q=await X.text().catch(()=>X.statusText);throw console.error(`[deco-apps] Supabase error (${X.status}): ${Q.slice(0,200)}`),Error(`External service error (${X.status})`)}return await X.json()}var N76=1e4,w76=async($,Z)=>{if(!$.get("studioContext").auth.user?.id)return $.json({error:"Unauthorized"},401);return Z()},Ux$=()=>{let $=new U1;return $.use("*",w76),$.get("/",async(Z)=>{let X=g0(),Q=X.decoSupabaseUrl,Y=X.decoSupabaseServiceKey;if(!Q||!Y)return Z.json({apps:[]});try{let G=await O76(Q,Y);return Z.json({apps:U76(G)})}catch(G){return console.error("[deco-apps] GET error:",G),Z.json({error:"Failed to fetch apps"},502)}}),$};var Ox$=B(()=>{C8();I$()});import{z as M1}from"zod";function mK($,Z="invalid_request_error",X=null,Q=null){return{error:{message:$,type:Z,param:X,code:Q}}}function R76($){if(!$)return null;let Z=$.indexOf(":");if(Z===-1)return{credentialId:null,modelId:$};let X=$.substring(0,Z),Q=$.substring(Z+1);if(!X||!Q)return null;return{credentialId:X,modelId:Q}}function I76($,Z,X){try{return JSON.parse($)}catch{throw new Dx$(`Invalid JSON in tool call arguments for function '${X}' (tool_call_id: ${Z}): ${$}`)}}function q76($){let Z={};for(let X of $)if(X.role==="assistant"&&X.tool_calls)for(let Q of X.tool_calls)Z[Q.id]=Q.function.name;return $.map((X)=>{switch(X.role){case"system":return{role:"system",content:X.content};case"user":if(typeof X.content==="string")return{role:"user",content:X.content};return{role:"user",content:X.content.map((Y)=>{if(Y.type==="text")return{type:"text",text:Y.text};return{type:"image",image:Y.image_url.url}})};case"assistant":if(X.tool_calls&&X.tool_calls.length>0)return{role:"assistant",content:X.tool_calls.map((Y)=>({type:"tool-call",toolCallId:Y.id,toolName:Y.function.name,input:I76(Y.function.arguments,Y.id,Y.function.name)}))};return{role:"assistant",content:X.content??""};case"tool":let Q=Z[X.tool_call_id]??"unknown";return{role:"tool",content:[{type:"tool-result",toolCallId:X.tool_call_id,toolName:Q,output:{type:"text",value:X.content}}]}}})}function M76($){let Z=$.map((X)=>{let Q=X.function.parameters?qY(X.function.parameters):qY({type:"object",properties:{}});return[X.function.name,f$({description:X.function.description,inputSchema:Q})]});return Object.fromEntries(Z)}function k76($){if(!$)return;return{openai:{response_format:$}}}function S76(){return`chatcmpl-${crypto.randomUUID().replace(/-/g,"").substring(0,29)}`}function wx$($,Z,X,Q,Y,G){let J={model:$,messages:Z,tools:X,temperature:Q.temperature,maxTokens:Q.max_tokens,topP:Q.top_p,frequencyPenalty:Q.frequency_penalty,presencePenalty:Q.presence_penalty,stopSequences:Q.stop?Array.isArray(Q.stop)?Q.stop:[Q.stop]:void 0,abortSignal:G};return Y?{...J,providerOptions:Y}:J}function Bx$($){if($==="tool-calls")return"tool_calls";if($==="length")return"length";return"stop"}var B76=256,D76,L76,E76,j76,z76,P76,A76,T76,Dx$,Lx$,Ex$;var jx$=B(()=>{C4();C8();Nh();uF();D76=M1.object({type:M1.literal("function"),function:M1.object({name:M1.string(),description:M1.string().optional(),parameters:M1.record(M1.string(),M1.unknown()).optional()})}),L76=M1.object({id:M1.string(),type:M1.literal("function"),function:M1.object({name:M1.string(),arguments:M1.string()})}),E76=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(L76).optional()}),M1.object({role:M1.literal("tool"),content:M1.string(),tool_call_id:M1.string()})]),j76=M1.object({type:M1.literal("text")}),z76=M1.object({type:M1.literal("json_object")}),P76=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()})}),A76=M1.union([j76,z76,P76]),T76=M1.object({model:M1.string().describe("Format: 'model_id' or 'credential_id:model_id'"),messages:M1.array(E76),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(D76).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:A76.optional(),user:M1.string().optional()});Dx$=class Dx$ extends Error{constructor($){super($);this.name="MessageConversionError"}};Lx$=new U1;Lx$.post("/:org/v1/chat/completions",async($)=>{let Z=$.get("studioContext"),X=$.req.param("org");try{if(!Z.auth.apiKey?.id)return $.json(mK("API key authentication required. Provide a valid API key via Authorization header.","authentication_error"),401);if(!Z.organization)return $.json(mK("Organization context is required. Ensure your API key has organization metadata.","invalid_request_error","organization"),400);if((Z.organization.slug??Z.organization.id)!==X)return $.json(mK("Organization mismatch. The API key's organization does not match the requested organization.","invalid_request_error","organization"),403);let Q=await $.req.json(),Y=T76.safeParse(Q);if(!Y.success){let L=Y.error.issues[0]??{message:"Invalid request",path:[]};return $.json(mK(`Invalid request: ${L.message}`,"invalid_request_error",L.path.length>0?L.path.join("."):null),400)}let G=Y.data,J=R76(G.model);if(!J)return $.json(mK("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)=>UD(j.providerId));if(!E)return $.json(mK("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(mK(`AI provider credential not found or inaccessible: ${W}`,"invalid_request_error","model"),404)}let F=H.aiSdk.languageModel(K),N=q76(G.messages),U=G.tools?M76(G.tools):void 0,O=k76(G.response_format),w=S76(),D=Math.floor(Date.now()/1000);if(G.stream)return WN($,async(L)=>{let E=wx$(F,N,U,G,O,$.req.raw.signal);try{let j=kO(E),z=!1,A=0,P="",q=async()=>{if(P.length===0)return;let M=P;P="",await L.writeSSE({data:JSON.stringify({id:w,object:"chat.completion.chunk",created:D,model:G.model,choices:[{index:0,delta:{content:M},finish_reason:null}]})})};for await(let M of j.fullStream){if(!z&&(M.type==="text-delta"||M.type==="tool-call"))await L.writeSSE({data:JSON.stringify({id:w,object:"chat.completion.chunk",created:D,model:G.model,choices:[{index:0,delta:{role:"assistant",content:""},finish_reason:null}]})}),z=!0;if(M.type==="text-delta"){if(P+=M.text,P.length>=B76)await q()}else if(M.type==="tool-call"){await q();let k=A++;await L.writeSSE({data:JSON.stringify({id:w,object:"chat.completion.chunk",created:D,model:G.model,choices:[{index:0,delta:{tool_calls:[{index:k,id:M.toolCallId,type:"function",function:{name:M.toolName,arguments:JSON.stringify(M.input)}}]},finish_reason:null}]})})}else if(M.type==="finish")await q(),await L.writeSSE({data:JSON.stringify({id:w,object:"chat.completion.chunk",created:D,model:G.model,choices:[{index:0,delta:{},finish_reason:Bx$(M.finishReason)}],usage:M.totalUsage?{prompt_tokens:M.totalUsage.inputTokens??0,completion_tokens:M.totalUsage.outputTokens??0,total_tokens:M.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=wx$(F,N,U,G,O,$.req.raw.signal),E=await qO(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:w,object:"chat.completion",created:D,model:G.model,choices:[{index:0,message:j,finish_reason:Bx$(E.finishReason)}],usage:{prompt_tokens:E.usage?.inputTokens??0,completion_tokens:E.usage?.outputTokens??0,total_tokens:E.usage?.totalTokens??0}})}}catch(Q){let Y=Q;if(Y.name==="AbortError")return $.json(mK("Request aborted","invalid_request_error"),400);if(Y.name==="MessageConversionError")return $.json(mK(Y.message,"invalid_request_error","messages"),400);return console.error("[openai-compat] Error:",Y.message,Y.stack),$.json(mK(Y.message,"server_error"),500)}});Ex$=Lx$});var Px$;var zx$=B(()=>{Px$={name:"decocms",version:"4.216.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",check:"tsc --noEmit",start:"bun run ./dist/server/server.js",migrate:"bun run src/database/migrate.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","@nats-io/jwt":"0.0.10-5","@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 _76(){let $=process.env.POSTHOG_KEY;if(!$)return null;return{key:$,host:process.env.POSTHOG_HOST??C76}}var Ax$,C76="https://ph.studio.decocms.com",Tx$;var Rx$=B(()=>{C8();Gg0();gV();PZ();I$();_81();zx$();Ax$=new U1;Ax$.get("/",($)=>{let Z={version:Px$.version,theme:ic1(),...XL().logo&&{logo:XL().logo},...BK()&&{internalUrl:zk1()},...g0().enableDecoImport&&{enableDecoImport:!0},brandExtractEnabled:!!g0().firecrawlApiKey,auth:uV$(),posthog:_76(),googleMapsApiKey:process.env.GOOGLE_MAPS_API_KEY?.trim()||null,runtime:{agentSandbox:!BK()&&g0().sandboxProviderKind==="agent-sandbox"}};return $.header("Cache-Control","no-store"),$.json({success:!0,config:Z})});Tx$=Ax$});function Eh($){let Z=($??"").trim().toLowerCase();return Z=Z.replace(/^https?:\/\//,""),Z=Z.replace(/^www\./,""),Z=Z.split(/[/?#]/)[0]??"",Z.replace(/\/+$/,"")}function o61($){return(Eh($).split(".")[0]||$).replace(/[-_]/g," ").split(" ").filter(Boolean).map((X)=>X.charAt(0).toUpperCase()+X.slice(1)).join(" ")}function qx$($,Z=64){return`https://www.google.com/s2/favicons?domain=${encodeURIComponent(Eh($))}&sz=${Z}`}function Ix$($,Z){let X=$.trim();if(X.length<=Z)return X;let Q=X.slice(0,Z-1),Y=Q.lastIndexOf(" ");return`${(Y>Z*0.6?Q.slice(0,Y):Q).trimEnd()}\u2026`}function Mx$($){let{brand:Z,domain:X,score:Q,verdict:Y}=$,G=typeof Q==="number"?`${Z} commerce report \u2014 ${Math.round(Q)}/100 \xB7 decocms`:`${Z} commerce report \xB7 decocms`,J=`See the full ${Z} scorecard \u2014 SEO, performance, conversion & AEO signals scored by decocms.`,W=Y?.trim()?Ix$(`${Y.trim().replace(/\s+/g," ")} \u2014 ${J}`,200):Ix$(`How does ${X} really perform? ${J}`,200);return{title:G,description:W}}import{z as l0}from"zod";var J_,v76,f76,b76,x76,kx$;var Sx$=B(()=>{J_=l0.enum(["good","bad","neutral"]),v76=l0.preprocess(($)=>{if(Array.isArray($))return{kind:"text",value:$.find((X)=>X!==null&&typeof X!=="object")??""};return $!==null&&typeof $==="object"?$:{kind:"text",value:$}},l0.object({kind:l0.enum(["text","number","sparkline","badge","score"]).catch("text"),value:l0.coerce.string().optional(),tone:J_.optional(),muted:l0.boolean().optional(),delta:l0.coerce.string().optional(),deltaDir:l0.enum(["up","down","neutral"]).optional(),points:l0.array(l0.coerce.number()).optional(),label:l0.coerce.string().optional()}).transform(($)=>{if($.kind==="badge"&&$.label==null)$.label=$.value??"";if($.kind==="score"){let Z=Number($.value);if(Number.isNaN(Z))return{...$,kind:"text"}}return $})),f76=l0.preprocess(($)=>{let Z=$;if(Z&&typeof Z==="object"&&!Array.isArray(Z)&&Array.isArray(Z.cells))Z=Z.cells;if(Array.isArray(Z)&&Z.length===1&&Array.isArray(Z[0]))Z=Z[0];if(Array.isArray(Z))return Z;if(Z&&typeof Z==="object")return Object.values(Z);return Z},l0.array(v76)),b76={key:l0.coerce.string(),title:l0.coerce.string(),eyebrow:l0.coerce.string().optional(),headline:l0.coerce.string(),annotation:l0.coerce.string().optional(),methodology:l0.coerce.string().optional(),sources:l0.array(l0.object({name:l0.coerce.string(),logoUrl:l0.coerce.string()})).optional()},x76=l0.discriminatedUnion("template",[l0.object({template:l0.literal("cover"),score:l0.object({value:l0.coerce.number(),max:l0.coerce.number().optional(),grade:l0.coerce.string().optional(),label:l0.coerce.string().optional()}).optional(),brandImage:l0.coerce.string().optional(),screenshot:l0.coerce.string().optional(),mobileScreenshot:l0.coerce.string().optional()}),l0.object({template:l0.literal("cta"),ctaUrl:l0.coerce.string().optional(),ctaLabel:l0.coerce.string().optional(),bullets:l0.array(l0.coerce.string()).optional()}),l0.object({template:l0.literal("series"),points:l0.array(l0.coerce.number()).min(2),xLabels:l0.array(l0.coerce.string()).min(1),unit:l0.coerce.string().optional(),callout:l0.object({index:l0.coerce.number(),value:l0.coerce.string(),tone:J_.optional()})}),l0.object({template:l0.literal("threshold"),value:l0.coerce.string().default(""),metricLabel:l0.coerce.string().optional(),ratio:l0.coerce.number(),thresholdRatio:l0.coerce.number().optional(),thresholdLabel:l0.coerce.string().default(""),tone:J_.optional()}),l0.object({template:l0.literal("stats"),stats:l0.array(l0.object({value:l0.coerce.string(),label:l0.coerce.string(),tone:J_.optional()})).min(1)}),l0.object({template:l0.literal("bars"),items:l0.array(l0.object({value:l0.coerce.string(),label:l0.coerce.string(),ratio:l0.coerce.number(),tone:J_.optional()})).min(1)}),l0.object({template:l0.literal("gauges"),gauges:l0.array(l0.object({label:l0.coerce.string(),value:l0.coerce.string(),status:l0.enum(["good","warn","bad"]).catch("warn"),caption:l0.coerce.string().optional(),ratio:l0.coerce.number().optional()})).min(1)}),l0.object({template:l0.literal("checklist"),checks:l0.array(l0.object({label:l0.coerce.string(),status:l0.enum(["pass","fail","warn"]).catch("fail"),value:l0.coerce.string().optional()})).min(1)}),l0.object({template:l0.literal("table"),columns:l0.array(l0.object({label:l0.coerce.string(),align:l0.enum(["left","right"]).optional()})).min(1),rows:l0.array(f76).min(1),highlightRow:l0.coerce.number().optional()}),l0.object({template:l0.literal("products"),products:l0.array(l0.object({name:l0.coerce.string(),price:l0.coerce.string().optional(),image:l0.coerce.string().optional(),url:l0.coerce.string().optional()})).min(1)}),l0.object({template:l0.literal("list"),entries:l0.array(l0.object({label:l0.coerce.string(),severity:l0.enum(["error","warning","notice"]).catch("notice")})).min(1),moreCount:l0.coerce.number().optional()}),l0.object({template:l0.literal("keywords"),volumeLabel:l0.coerce.string().optional(),keywords:l0.array(l0.object({term:l0.coerce.string(),volume:l0.coerce.string(),position:l0.coerce.number().catch(0)})).min(1)}),l0.object({template:l0.literal("competitor"),metricLabel:l0.coerce.string().optional(),competitors:l0.array(l0.object({name:l0.coerce.string(),value:l0.coerce.string(),tone:J_.optional(),isYou:l0.boolean().optional()})).min(1)}),l0.object({template:l0.literal("scorecard"),rivalLabel:l0.coerce.string().optional(),dimensions:l0.array(l0.object({label:l0.coerce.string(),you:l0.coerce.string(),rival:l0.coerce.string().optional(),rivalName:l0.coerce.string().optional(),tone:J_.optional()})).min(1)})]),kx$=l0.object({...b76,template:x76})});function lz0($){let Z=[],X=[...$.sections].sort((Y,G)=>Y.position-G.position).map((Y)=>{let G=kx$.safeParse(Y.props);if(G.success)return G.data;let J=G.error.issues[0];return Z.push({section_type:Y.section_type,position:Y.position,reason:J?`${J.path.join(".")||"(root)"}: ${J.message}`:"contract violation"}),null}).filter((Y)=>Y!==null),Q=X.filter((Y)=>Y.template.template!=="cover"&&Y.template.template!=="cta").map((Y)=>({key:Y.key,title:Y.title}));return{deck:{meta:{...$.meta,scores:$.summary?.scores,scannedAt:$.scanned_at,toc:Q},slides:X},drops:Z}}var r61=B(()=>{Sx$()});import{join as Vx$}from"path";async function g76($){try{let Z=await fetch(`${hW({})}/api/v2/public/diagnostics/${encodeURIComponent($)}`,{headers:{Accept:"application/json"},signal:AbortSignal.timeout(y76)});if(!Z.ok)return null;let X=await Z.json(),{deck:Q}=lz0(X);if(!Q.slides.length)return null;let Y=Q.slides.find((W)=>W.template.template==="cover"),G=Y?.template,J=G&&G.template==="cover"?G:void 0;return{brand:Q.meta.brand?.trim()||o61($),score:Q.meta.scores?.cover??J?.score?.value,verdict:Y?.annotation?.trim()||Y?.headline?.trim()||void 0}}catch{return null}}function oY($){return $.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function h76($,Z){let X=Eh($),Q=Z?.brand?.trim()||o61(X),Y=qx$(X,128),J=`${(g0().baseUrl??"https://studio.decocms.com").replace(/\/+$/,"")}/report/${encodeURIComponent(X)}`,{title:W,description:K}=Mx$({brand:Q,domain:X,score:Z?.score,verdict:Z?.verdict}),H=`${J}/og.png`,F=`${Q} commerce report by decocms`;return[`<title>${oY(W)}</title>`,`<meta name="description" content="${oY(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="${oY(W)}" />`,`<meta property="og:description" content="${oY(K)}" />`,`<meta property="og:url" content="${oY(J)}" />`,`<meta property="og:image" content="${oY(H)}" />`,'<meta property="og:image:width" content="1200" />','<meta property="og:image:height" content="630" />',`<meta property="og:image:alt" content="${oY(F)}" />`,'<meta name="twitter:card" content="summary_large_image" />',`<meta name="twitter:title" content="${oY(W)}" />`,`<meta name="twitter:description" content="${oY(K)}" />`,`<meta name="twitter:image" content="${oY(H)}" />`,`<meta name="twitter:image:alt" content="${oY(F)}" />`,`<link rel="canonical" href="${oY(J)}" />`,`<link rel="icon" href="${oY(Y)}" sizes="any" />`].join(`
2737
+ `,j=await Z.createBlob(E);await ub$(Z.owner,Z.repo,j,E);let z=L[0]??`${_z0(Q)}/${y61(w)}.json`;H.push({path:z,mode:"100644",type:"blob",sha:j});let A=z.slice(z.lastIndexOf("/")+1,-5);F.set(z,{stem:A,sha:j,content:E});for(let P of L.slice(1))H.push({path:P,mode:"100644",type:"blob",sha:null}),F.delete(P)}for(let w of $.del)for(let D of d61(K,w))H.push({path:D,mode:"100644",type:"blob",sha:null}),F.delete(D);if(H.length===0)return G;let N=Q?`${Q}/.deco/blocks.gen.json`:".deco/blocks.gen.json";if(W.some((w)=>w.type==="blob"&&w.path===N)){let w=await Promise.all([...F.values()].map(async(L)=>({stem:L.stem,content:L.content??await Z.getBlobText(L.sha)}))),D=await Z.createBlob(Br(w));H.push({path:N,mode:"100644",type:"blob",sha:D})}let U=await Z.createTree(J,H),O=await Z.createCommit({message:Y76($),treeSha:U,parentShas:[G]});try{return await Z.updateRef(X,O),O}catch(w){if(!(w instanceof V6&&w.status===422)||Y>=Z76-1)throw w;await R$(cZ(2000,200,Y,2,0.5))}}}function Y76($){let Z=(Y)=>{let G=Y.slice(0,3).join(", ");return Y.length>3?`${G} (+${Y.length-3} more)`:G},X=[];if($.set.size>0)X.push(`update ${Z([...$.set.keys()])}`);if($.del.size>0)X.push(`delete ${Z([...$.del])}`);let Q=`chore(decofile): ${X.join("; ")}`;return Il0(Q,$.deps.coAuthor)}var Z76=3,p61;var Zx$=B(()=>{_U0();Iz0();t4();Z_();vz0();p61=new Map});import{createHmac as Xx$,randomBytes as G76,timingSafeEqual as J76}from"crypto";function Qx$(){if(hz0)return hz0;let $;try{let Z=g0();$=Z.studioJwtSecret??Z.betterAuthSecret}catch{$=void 0}return hz0=$?Buffer.from($):G76(32),hz0}function t61($){let Z=$.nowMs??Date.now(),X={o:$.organizationId,m:$.virtualMcpId,b:$.branch,e:Math.floor((Z+W76)/1000)},Q=Buffer.from(JSON.stringify(X)).toString("base64url"),Y=Xx$("sha256",Qx$()).update(Q).digest("base64url");return`${Q}.${Y}`}function Yx$($,Z){let X=$.indexOf(".");if(X<0)return!1;let Q=$.slice(0,X),Y=Buffer.from($.slice(X+1)),G=Buffer.from(Xx$("sha256",Qx$()).update(Q).digest("base64url"));if(Y.length!==G.length||!J76(Y,G))return!1;let J;try{J=JSON.parse(Buffer.from(Q,"base64url").toString())}catch{return!1}let W=Math.floor((Z.nowMs??Date.now())/1000);return J.o===Z.organizationId&&J.m===Z.virtualMcpId&&J.b===Z.branch&&typeof J.e==="number"&&J.e>=W}var W76=21600000,hz0=null;var Gx$=B(()=>{I$()});import{z as Lh}from"zod";function H76($){return $.length>0&&$.length<=255&&!$.includes("..")&&!$.endsWith("/")&&!$.endsWith(".lock")&&K76.test($)}function Wx$($){return $.req.header("x-forwarded-host")??new URL($.req.url).host}async function uz0($){let Z=$.get("decofileScope");return Tz0($.var.studioContext,Z.organizationId,Z.githubRepo)}function cz0($,Z){if(Z instanceof V6){let Q=Z.status===404?404:Z.status===409?409:Z.status===422?409:502;return $.json({error:Z.message},Q)}let X=Z instanceof Error?Z.message:String(Z);return $.json({error:X},500)}function Kx$(){let $=new U1;return $.use("/:virtualMcpId/:branch",Jx$),$.use("/:virtualMcpId/:branch/*",Jx$),$.get("/:virtualMcpId/:branch",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await uz0(Z),Y=await cb$(Q,X.branch,X.packagePath,{createBranchIfMissing:!!X.userId}),G={ETag:`"${Y.sha}"`,"Cache-Control":"no-store","Access-Control-Allow-Origin":"*"};if(Z.req.header("if-none-match")===`"${Y.sha}"`)return Z.body(null,304,G);if(!X.userId)return Z.body(Y.decofile,200,{...G,"content-type":"application/json"});let J=t61({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.body(`{"version":${JSON.stringify(Y.sha)},"token":${JSON.stringify(J)},"apiHost":${JSON.stringify(Wx$(Z))},"decofile":${Y.decofile}}`,200,{...G,"content-type":"application/json"})}catch(Q){return cz0(Z,Q)}}),$.patch("/:virtualMcpId/:branch",async(Z)=>{let X=Z.get("decofileScope"),Q=Z.var.studioContext,Y=F76.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{Rz0(J)}catch(W){let K=W instanceof Error?W.message:String(W);return Z.json({error:K},400)}for(let[J,W]of Object.entries(G.set??{}))if(typeof W!=="object"||W===null||Array.isArray(W))return Z.json({error:`Block "${J}" must be a JSON object`},400);try{let J=await uz0(Z),W=await $x$(`${X.organizationId}/${X.virtualMcpId}/${X.branch}`,{client:J,branch:X.branch,packagePath:X.packagePath,coAuthor:Uh(Q)},G),K=t61({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.json({version:W,token:K,apiHost:Wx$(Z)})}catch(J){return cz0(Z,J)}}),$.post("/:virtualMcpId/:branch/publish",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await uz0(Z),Y=await Q.getDefaultBranch();if(Y===X.branch)return Z.json({error:"Branch is already the default branch"},400);try{let G=await Q.mergeBranch(Y,X.branch,`chore(decofile): publish ${X.branch}`);return G?Z.json({result:"merged",sha:G}):Z.json({result:"up-to-date"})}catch(G){if(G instanceof V6&&G.status===409)return Z.json({error:"merge-conflict"},409);if(G instanceof V6&&G.status===405){let W=await Q.findOpenPullRequest(Y,X.branch)??await Q.createPullRequest({base:Y,head:X.branch,title:`Publish ${X.branch}`});return Z.json({result:"pull-request",number:W.number,url:W.html_url})}throw G}}catch(Q){return cz0(Z,Q)}}),$.get("/:virtualMcpId/:branch/status",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await uz0(Z),Y=await Q.getDefaultBranch();if(Y===X.branch)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0});try{let{aheadBy:G,behindBy:J}=await Q.compare(Y,X.branch);return Z.json({baseBranch:Y,aheadBy:G,behindBy:J})}catch(G){if(G instanceof V6&&G.status===404)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0});throw G}}catch(Q){return cz0(Z,Q)}}),$}var K76,F76,Jx$;var Hx$=B(()=>{Iz0();C8();q61();Pz0();i61();x61();Zx$();Gx$();Z_();vz0();K76=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;F76=Lh.object({set:Lh.record(Lh.string(),Lh.unknown()).optional(),delete:Lh.array(Lh.string()).optional()}).refine(($)=>Object.keys($.set??{}).length>0||($.delete?.length??0)>0,{message:"Patch must set or delete at least one block"}),Jx$=zz0(async($,Z)=>{let X=$.var.studioContext,Q=X.organization;if(!Q)return $.json({error:"Organization scope required"},500);let Y=$.req.param("virtualMcpId"),G=$.req.param("branch");if(!Y||!G)return $.json({error:"virtualMcpId and branch are required"},400);if(!H76(G))return $.json({error:`Invalid branch name: ${G}`},400);let J=X.auth?.user?.id??null;if(!J){let O=$.req.query("token");if(!($.req.method==="GET"&&!$.req.path.match(/\/(publish|status)$/)))return $.json({error:"Unauthorized"},401);if(!O||!Yx$(O,{organizationId:Q.id,virtualMcpId:Y,branch:G}))return $.json({error:"Unauthorized"},401)}let W=await X.storage.virtualMcps.findById(Y);if(!W||W.organization_id!==Q.id)return $.json({error:"Virtual MCP not found"},404);let K=W.metadata??null;if(!Az0(K)||K?.fastPreview!==!0)return $.json({error:"Fast Preview is not enabled for this project"},404);let F=W.connections?.map((O)=>O.connection_id)??[],N=zr(K,F);if(!N)return $.json({error:"Project has no GitHub repository"},404);let U=K?.runtime;return $.set("decofileScope",{organizationId:Q.id,virtualMcpId:Y,branch:G,packagePath:U?.path?.replace(/^\/+|\/+$/g,"")||null,githubRepo:N,userId:J}),Z()})});var Fx$=($)=>{let Z=new U1;if(Z.use("*",iC),Z.route("/",yj0()),Z.route("/",CC$()),Z.route("/",ff$()),Z.route("/",Cf$()),Z.route("/",Lz0()),Z.route("/tools",cf$()),Z.route("/",gf$()),Z.route("/",Of$({kvStorage:$.kvStorage})),Z.route("/",Nf$()),Z.route("/fs",Rf$({getConnection:$.getNatsConnection})),Z.route("/sandbox",sb$()),Z.route("/decofile",Kx$()),Z.route("/",kf$()),Z.route("/deco-sites",hj0()),Z.route("/sso",Cj0()),Z.route("/",Ez0({tokenStorage:$.tokenStorage,automationEventDispatcher:$.automationEventDispatcher})),Z.route("/webhooks",TC$()),$.mountDevAssets)Z.route("/dev-assets",uj0({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("/",OS$()),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",qf$()),Z.route("/mcp",ew0()),Z.route("/mcp/self",Dz0()),Z.route("/mcp",XB0()),Z.all("/oauth-proxy/:connectionId/*",$.oauthProxyHandler),Z.get("/watch",$.watchHandler),Z};var Nx$=B(()=>{C8();p81();RC$();s81();cj0();uo();i81();Uf$();wf$();If$();en();y81();QB0();j61();Mf$();Sf$();_f$();bf$();hf$();P61();lf$();A61();$B0();eb$();Hx$()});function U76($){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}}))}async function O76($,Z){let X=await fetch(`${$}/rest/v1/apps?select=name,title,description,logo,category,vendors(alias,url)`,{headers:{apikey:Z,Authorization:`Bearer ${Z}`,Accept:"application/json"},signal:AbortSignal.timeout(N76)});if(!X.ok){let Q=await X.text().catch(()=>X.statusText);throw console.error(`[deco-apps] Supabase error (${X.status}): ${Q.slice(0,200)}`),Error(`External service error (${X.status})`)}return await X.json()}var N76=1e4,w76=async($,Z)=>{if(!$.get("studioContext").auth.user?.id)return $.json({error:"Unauthorized"},401);return Z()},Ux$=()=>{let $=new U1;return $.use("*",w76),$.get("/",async(Z)=>{let X=g0(),Q=X.decoSupabaseUrl,Y=X.decoSupabaseServiceKey;if(!Q||!Y)return Z.json({apps:[]});try{let G=await O76(Q,Y);return Z.json({apps:U76(G)})}catch(G){return console.error("[deco-apps] GET error:",G),Z.json({error:"Failed to fetch apps"},502)}}),$};var Ox$=B(()=>{C8();I$()});import{z as M1}from"zod";function mK($,Z="invalid_request_error",X=null,Q=null){return{error:{message:$,type:Z,param:X,code:Q}}}function R76($){if(!$)return null;let Z=$.indexOf(":");if(Z===-1)return{credentialId:null,modelId:$};let X=$.substring(0,Z),Q=$.substring(Z+1);if(!X||!Q)return null;return{credentialId:X,modelId:Q}}function I76($,Z,X){try{return JSON.parse($)}catch{throw new Dx$(`Invalid JSON in tool call arguments for function '${X}' (tool_call_id: ${Z}): ${$}`)}}function q76($){let Z={};for(let X of $)if(X.role==="assistant"&&X.tool_calls)for(let Q of X.tool_calls)Z[Q.id]=Q.function.name;return $.map((X)=>{switch(X.role){case"system":return{role:"system",content:X.content};case"user":if(typeof X.content==="string")return{role:"user",content:X.content};return{role:"user",content:X.content.map((Y)=>{if(Y.type==="text")return{type:"text",text:Y.text};return{type:"image",image:Y.image_url.url}})};case"assistant":if(X.tool_calls&&X.tool_calls.length>0)return{role:"assistant",content:X.tool_calls.map((Y)=>({type:"tool-call",toolCallId:Y.id,toolName:Y.function.name,input:I76(Y.function.arguments,Y.id,Y.function.name)}))};return{role:"assistant",content:X.content??""};case"tool":let Q=Z[X.tool_call_id]??"unknown";return{role:"tool",content:[{type:"tool-result",toolCallId:X.tool_call_id,toolName:Q,output:{type:"text",value:X.content}}]}}})}function M76($){let Z=$.map((X)=>{let Q=X.function.parameters?qY(X.function.parameters):qY({type:"object",properties:{}});return[X.function.name,f$({description:X.function.description,inputSchema:Q})]});return Object.fromEntries(Z)}function k76($){if(!$)return;return{openai:{response_format:$}}}function S76(){return`chatcmpl-${crypto.randomUUID().replace(/-/g,"").substring(0,29)}`}function wx$($,Z,X,Q,Y,G){let J={model:$,messages:Z,tools:X,temperature:Q.temperature,maxTokens:Q.max_tokens,topP:Q.top_p,frequencyPenalty:Q.frequency_penalty,presencePenalty:Q.presence_penalty,stopSequences:Q.stop?Array.isArray(Q.stop)?Q.stop:[Q.stop]:void 0,abortSignal:G};return Y?{...J,providerOptions:Y}:J}function Bx$($){if($==="tool-calls")return"tool_calls";if($==="length")return"length";return"stop"}var B76=256,D76,L76,E76,j76,z76,P76,A76,T76,Dx$,Lx$,Ex$;var jx$=B(()=>{C4();C8();Nh();uF();D76=M1.object({type:M1.literal("function"),function:M1.object({name:M1.string(),description:M1.string().optional(),parameters:M1.record(M1.string(),M1.unknown()).optional()})}),L76=M1.object({id:M1.string(),type:M1.literal("function"),function:M1.object({name:M1.string(),arguments:M1.string()})}),E76=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(L76).optional()}),M1.object({role:M1.literal("tool"),content:M1.string(),tool_call_id:M1.string()})]),j76=M1.object({type:M1.literal("text")}),z76=M1.object({type:M1.literal("json_object")}),P76=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()})}),A76=M1.union([j76,z76,P76]),T76=M1.object({model:M1.string().describe("Format: 'model_id' or 'credential_id:model_id'"),messages:M1.array(E76),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(D76).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:A76.optional(),user:M1.string().optional()});Dx$=class Dx$ extends Error{constructor($){super($);this.name="MessageConversionError"}};Lx$=new U1;Lx$.post("/:org/v1/chat/completions",async($)=>{let Z=$.get("studioContext"),X=$.req.param("org");try{if(!Z.auth.apiKey?.id)return $.json(mK("API key authentication required. Provide a valid API key via Authorization header.","authentication_error"),401);if(!Z.organization)return $.json(mK("Organization context is required. Ensure your API key has organization metadata.","invalid_request_error","organization"),400);if((Z.organization.slug??Z.organization.id)!==X)return $.json(mK("Organization mismatch. The API key's organization does not match the requested organization.","invalid_request_error","organization"),403);let Q=await $.req.json(),Y=T76.safeParse(Q);if(!Y.success){let L=Y.error.issues[0]??{message:"Invalid request",path:[]};return $.json(mK(`Invalid request: ${L.message}`,"invalid_request_error",L.path.length>0?L.path.join("."):null),400)}let G=Y.data,J=R76(G.model);if(!J)return $.json(mK("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)=>UD(j.providerId));if(!E)return $.json(mK("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(mK(`AI provider credential not found or inaccessible: ${W}`,"invalid_request_error","model"),404)}let F=H.aiSdk.languageModel(K),N=q76(G.messages),U=G.tools?M76(G.tools):void 0,O=k76(G.response_format),w=S76(),D=Math.floor(Date.now()/1000);if(G.stream)return WN($,async(L)=>{let E=wx$(F,N,U,G,O,$.req.raw.signal);try{let j=kO(E),z=!1,A=0,P="",q=async()=>{if(P.length===0)return;let M=P;P="",await L.writeSSE({data:JSON.stringify({id:w,object:"chat.completion.chunk",created:D,model:G.model,choices:[{index:0,delta:{content:M},finish_reason:null}]})})};for await(let M of j.fullStream){if(!z&&(M.type==="text-delta"||M.type==="tool-call"))await L.writeSSE({data:JSON.stringify({id:w,object:"chat.completion.chunk",created:D,model:G.model,choices:[{index:0,delta:{role:"assistant",content:""},finish_reason:null}]})}),z=!0;if(M.type==="text-delta"){if(P+=M.text,P.length>=B76)await q()}else if(M.type==="tool-call"){await q();let k=A++;await L.writeSSE({data:JSON.stringify({id:w,object:"chat.completion.chunk",created:D,model:G.model,choices:[{index:0,delta:{tool_calls:[{index:k,id:M.toolCallId,type:"function",function:{name:M.toolName,arguments:JSON.stringify(M.input)}}]},finish_reason:null}]})})}else if(M.type==="finish")await q(),await L.writeSSE({data:JSON.stringify({id:w,object:"chat.completion.chunk",created:D,model:G.model,choices:[{index:0,delta:{},finish_reason:Bx$(M.finishReason)}],usage:M.totalUsage?{prompt_tokens:M.totalUsage.inputTokens??0,completion_tokens:M.totalUsage.outputTokens??0,total_tokens:M.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=wx$(F,N,U,G,O,$.req.raw.signal),E=await qO(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:w,object:"chat.completion",created:D,model:G.model,choices:[{index:0,message:j,finish_reason:Bx$(E.finishReason)}],usage:{prompt_tokens:E.usage?.inputTokens??0,completion_tokens:E.usage?.outputTokens??0,total_tokens:E.usage?.totalTokens??0}})}}catch(Q){let Y=Q;if(Y.name==="AbortError")return $.json(mK("Request aborted","invalid_request_error"),400);if(Y.name==="MessageConversionError")return $.json(mK(Y.message,"invalid_request_error","messages"),400);return console.error("[openai-compat] Error:",Y.message,Y.stack),$.json(mK(Y.message,"server_error"),500)}});Ex$=Lx$});var Px$;var zx$=B(()=>{Px$={name:"decocms",version:"4.217.0",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",check:"tsc --noEmit",start:"bun run ./dist/server/server.js",migrate:"bun run src/database/migrate.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","@nats-io/jwt":"0.0.10-5","@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 _76(){let $=process.env.POSTHOG_KEY;if(!$)return null;return{key:$,host:process.env.POSTHOG_HOST??C76}}var Ax$,C76="https://ph.studio.decocms.com",Tx$;var Rx$=B(()=>{C8();Gg0();gV();PZ();I$();_81();zx$();Ax$=new U1;Ax$.get("/",($)=>{let Z={version:Px$.version,theme:ic1(),...XL().logo&&{logo:XL().logo},...BK()&&{internalUrl:zk1()},...g0().enableDecoImport&&{enableDecoImport:!0},brandExtractEnabled:!!g0().firecrawlApiKey,auth:uV$(),posthog:_76(),googleMapsApiKey:process.env.GOOGLE_MAPS_API_KEY?.trim()||null,runtime:{agentSandbox:!BK()&&g0().sandboxProviderKind==="agent-sandbox"}};return $.header("Cache-Control","no-store"),$.json({success:!0,config:Z})});Tx$=Ax$});function Eh($){let Z=($??"").trim().toLowerCase();return Z=Z.replace(/^https?:\/\//,""),Z=Z.replace(/^www\./,""),Z=Z.split(/[/?#]/)[0]??"",Z.replace(/\/+$/,"")}function o61($){return(Eh($).split(".")[0]||$).replace(/[-_]/g," ").split(" ").filter(Boolean).map((X)=>X.charAt(0).toUpperCase()+X.slice(1)).join(" ")}function qx$($,Z=64){return`https://www.google.com/s2/favicons?domain=${encodeURIComponent(Eh($))}&sz=${Z}`}function Ix$($,Z){let X=$.trim();if(X.length<=Z)return X;let Q=X.slice(0,Z-1),Y=Q.lastIndexOf(" ");return`${(Y>Z*0.6?Q.slice(0,Y):Q).trimEnd()}\u2026`}function Mx$($){let{brand:Z,domain:X,score:Q,verdict:Y}=$,G=typeof Q==="number"?`${Z} commerce report \u2014 ${Math.round(Q)}/100 \xB7 decocms`:`${Z} commerce report \xB7 decocms`,J=`See the full ${Z} scorecard \u2014 SEO, performance, conversion & AEO signals scored by decocms.`,W=Y?.trim()?Ix$(`${Y.trim().replace(/\s+/g," ")} \u2014 ${J}`,200):Ix$(`How does ${X} really perform? ${J}`,200);return{title:G,description:W}}import{z as l0}from"zod";var J_,v76,f76,b76,x76,kx$;var Sx$=B(()=>{J_=l0.enum(["good","bad","neutral"]),v76=l0.preprocess(($)=>{if(Array.isArray($))return{kind:"text",value:$.find((X)=>X!==null&&typeof X!=="object")??""};return $!==null&&typeof $==="object"?$:{kind:"text",value:$}},l0.object({kind:l0.enum(["text","number","sparkline","badge","score"]).catch("text"),value:l0.coerce.string().optional(),tone:J_.optional(),muted:l0.boolean().optional(),delta:l0.coerce.string().optional(),deltaDir:l0.enum(["up","down","neutral"]).optional(),points:l0.array(l0.coerce.number()).optional(),label:l0.coerce.string().optional()}).transform(($)=>{if($.kind==="badge"&&$.label==null)$.label=$.value??"";if($.kind==="score"){let Z=Number($.value);if(Number.isNaN(Z))return{...$,kind:"text"}}return $})),f76=l0.preprocess(($)=>{let Z=$;if(Z&&typeof Z==="object"&&!Array.isArray(Z)&&Array.isArray(Z.cells))Z=Z.cells;if(Array.isArray(Z)&&Z.length===1&&Array.isArray(Z[0]))Z=Z[0];if(Array.isArray(Z))return Z;if(Z&&typeof Z==="object")return Object.values(Z);return Z},l0.array(v76)),b76={key:l0.coerce.string(),title:l0.coerce.string(),eyebrow:l0.coerce.string().optional(),headline:l0.coerce.string(),annotation:l0.coerce.string().optional(),methodology:l0.coerce.string().optional(),sources:l0.array(l0.object({name:l0.coerce.string(),logoUrl:l0.coerce.string()})).optional()},x76=l0.discriminatedUnion("template",[l0.object({template:l0.literal("cover"),score:l0.object({value:l0.coerce.number(),max:l0.coerce.number().optional(),grade:l0.coerce.string().optional(),label:l0.coerce.string().optional()}).optional(),brandImage:l0.coerce.string().optional(),screenshot:l0.coerce.string().optional(),mobileScreenshot:l0.coerce.string().optional()}),l0.object({template:l0.literal("cta"),ctaUrl:l0.coerce.string().optional(),ctaLabel:l0.coerce.string().optional(),bullets:l0.array(l0.coerce.string()).optional()}),l0.object({template:l0.literal("series"),points:l0.array(l0.coerce.number()).min(2),xLabels:l0.array(l0.coerce.string()).min(1),unit:l0.coerce.string().optional(),callout:l0.object({index:l0.coerce.number(),value:l0.coerce.string(),tone:J_.optional()})}),l0.object({template:l0.literal("threshold"),value:l0.coerce.string().default(""),metricLabel:l0.coerce.string().optional(),ratio:l0.coerce.number(),thresholdRatio:l0.coerce.number().optional(),thresholdLabel:l0.coerce.string().default(""),tone:J_.optional()}),l0.object({template:l0.literal("stats"),stats:l0.array(l0.object({value:l0.coerce.string(),label:l0.coerce.string(),tone:J_.optional()})).min(1)}),l0.object({template:l0.literal("bars"),items:l0.array(l0.object({value:l0.coerce.string(),label:l0.coerce.string(),ratio:l0.coerce.number(),tone:J_.optional()})).min(1)}),l0.object({template:l0.literal("gauges"),gauges:l0.array(l0.object({label:l0.coerce.string(),value:l0.coerce.string(),status:l0.enum(["good","warn","bad"]).catch("warn"),caption:l0.coerce.string().optional(),ratio:l0.coerce.number().optional()})).min(1)}),l0.object({template:l0.literal("checklist"),checks:l0.array(l0.object({label:l0.coerce.string(),status:l0.enum(["pass","fail","warn"]).catch("fail"),value:l0.coerce.string().optional()})).min(1)}),l0.object({template:l0.literal("table"),columns:l0.array(l0.object({label:l0.coerce.string(),align:l0.enum(["left","right"]).optional()})).min(1),rows:l0.array(f76).min(1),highlightRow:l0.coerce.number().optional()}),l0.object({template:l0.literal("products"),products:l0.array(l0.object({name:l0.coerce.string(),price:l0.coerce.string().optional(),image:l0.coerce.string().optional(),url:l0.coerce.string().optional()})).min(1)}),l0.object({template:l0.literal("list"),entries:l0.array(l0.object({label:l0.coerce.string(),severity:l0.enum(["error","warning","notice"]).catch("notice")})).min(1),moreCount:l0.coerce.number().optional()}),l0.object({template:l0.literal("keywords"),volumeLabel:l0.coerce.string().optional(),keywords:l0.array(l0.object({term:l0.coerce.string(),volume:l0.coerce.string(),position:l0.coerce.number().catch(0)})).min(1)}),l0.object({template:l0.literal("competitor"),metricLabel:l0.coerce.string().optional(),competitors:l0.array(l0.object({name:l0.coerce.string(),value:l0.coerce.string(),tone:J_.optional(),isYou:l0.boolean().optional()})).min(1)}),l0.object({template:l0.literal("scorecard"),rivalLabel:l0.coerce.string().optional(),dimensions:l0.array(l0.object({label:l0.coerce.string(),you:l0.coerce.string(),rival:l0.coerce.string().optional(),rivalName:l0.coerce.string().optional(),tone:J_.optional()})).min(1)})]),kx$=l0.object({...b76,template:x76})});function lz0($){let Z=[],X=[...$.sections].sort((Y,G)=>Y.position-G.position).map((Y)=>{let G=kx$.safeParse(Y.props);if(G.success)return G.data;let J=G.error.issues[0];return Z.push({section_type:Y.section_type,position:Y.position,reason:J?`${J.path.join(".")||"(root)"}: ${J.message}`:"contract violation"}),null}).filter((Y)=>Y!==null),Q=X.filter((Y)=>Y.template.template!=="cover"&&Y.template.template!=="cta").map((Y)=>({key:Y.key,title:Y.title}));return{deck:{meta:{...$.meta,scores:$.summary?.scores,scannedAt:$.scanned_at,toc:Q},slides:X},drops:Z}}var r61=B(()=>{Sx$()});import{join as Vx$}from"path";async function g76($){try{let Z=await fetch(`${hW({})}/api/v2/public/diagnostics/${encodeURIComponent($)}`,{headers:{Accept:"application/json"},signal:AbortSignal.timeout(y76)});if(!Z.ok)return null;let X=await Z.json(),{deck:Q}=lz0(X);if(!Q.slides.length)return null;let Y=Q.slides.find((W)=>W.template.template==="cover"),G=Y?.template,J=G&&G.template==="cover"?G:void 0;return{brand:Q.meta.brand?.trim()||o61($),score:Q.meta.scores?.cover??J?.score?.value,verdict:Y?.annotation?.trim()||Y?.headline?.trim()||void 0}}catch{return null}}function oY($){return $.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function h76($,Z){let X=Eh($),Q=Z?.brand?.trim()||o61(X),Y=qx$(X,128),J=`${(g0().baseUrl??"https://studio.decocms.com").replace(/\/+$/,"")}/report/${encodeURIComponent(X)}`,{title:W,description:K}=Mx$({brand:Q,domain:X,score:Z?.score,verdict:Z?.verdict}),H=`${J}/og.png`,F=`${Q} commerce report by decocms`;return[`<title>${oY(W)}</title>`,`<meta name="description" content="${oY(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="${oY(W)}" />`,`<meta property="og:description" content="${oY(K)}" />`,`<meta property="og:url" content="${oY(J)}" />`,`<meta property="og:image" content="${oY(H)}" />`,'<meta property="og:image:width" content="1200" />','<meta property="og:image:height" content="630" />',`<meta property="og:image:alt" content="${oY(F)}" />`,'<meta name="twitter:card" content="summary_large_image" />',`<meta name="twitter:title" content="${oY(W)}" />`,`<meta name="twitter:description" content="${oY(K)}" />`,`<meta name="twitter:image" content="${oY(H)}" />`,`<meta name="twitter:image:alt" content="${oY(F)}" />`,`<link rel="canonical" href="${oY(J)}" />`,`<link rel="icon" href="${oY(Y)}" sizes="any" />`].join(`
2738
2738
  `)}function u76($,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}
2739
2739
  </head>`)}function Cx$($){let Z=new U1;return Z.get("/:domain/og.png",async(X)=>{let Q=Eh(X.req.param("domain")),Y=async()=>{let G=$?Bun.file(Vx$($,"report-og-fallback.png")):null;if(!G||!await G.exists())return X.notFound();return X.body(new Uint8Array(await G.arrayBuffer()),200,{"Content-Type":"image/png","Cache-Control":"public, max-age=0, s-maxage=3600"})};try{let G=await fetch(`${hW({})}/api/v2/public/diagnostics/${encodeURIComponent(Q)}/og.png`,{signal:AbortSignal.timeout(c76)}),J=G.headers.get("content-type")??"";if(!G.ok||!J.startsWith("image/")||!G.body)return Y();return X.body(G.body,200,{"Content-Type":J,"Cache-Control":"public, max-age=0, s-maxage=604800"})}catch{return Y()}}),Z.get("/:domain",async(X)=>{let Q=X.req.param("domain"),Y=$?Vx$($,"index.html"):null,G=Y?Bun.file(Y):null;if(!G||!await G.exists())return X.notFound();let J=await G.text();try{let W=await g76(Eh(Q)),K=h76(Q,W);return X.html(u76(J,K),200,{"Cache-Control":"public, max-age=0, s-maxage=300"})}catch{return X.html(J)}}),Z}var y76=2500,c76=1e4;var _x$=B(()=>{C8();r61();DL();I$()});function Ar($,Z){return fetch(`${hW({})}${$}`,Z)}async function l76($,Z,X){let Q=new URLSearchParams;if(Z)Q.set("pw",Z);if(X)Q.set("lang",X);let Y=Q.toString()?`?${Q.toString()}`:"",G=await Ar(`/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}=lz0(J);return{status:W.slides.length?"ready":"empty",deck:W,scanned_at:J.scanned_at,drops:K}}var d76,HN,vx$=async($,Z)=>{if(!$.get("reportUser"))return $.json({error:"Authentication required"},401);await Z();return},fx$;var bx$=B(()=>{C8();VG();DL();r61();d76=new Set(["complete","errored","terminated","unknown"]),HN=new U1;HN.use("*",async($,Z)=>{let X=await j8.api.getSession({headers:$.req.raw.headers});$.set("reportUser",X?.user?.id?{email:X.user.email}:void 0),await Z(),$.header("Cache-Control","private, no-store"),$.header("Vary","Cookie");return});HN.use("/link-token/*",vx$);HN.use("/suggest",vx$);HN.get("/site/:domain",async($)=>{let Z=$.req.param("domain").trim();if(!Z)return $.json({error:"domain is required"},400);let X=$.get("reportUser"),Q=$.req.query("key")?.trim()||void 0,Y=$.req.query("lang")?.trim()||void 0;try{let G=await l76(Z,Q,Y);if($.header("Cache-Control","private, no-store"),X||!G.deck)return $.json(G);return $.json({...G,deck:{...G.deck,slides:G.deck.slides.slice(0,1)},truncated:G.status==="ready"})}catch{return $.json({error:"report read failed"},502)}});HN.post("/run",async($)=>{let Z=$.get("reportUser"),X;try{X=await $.req.json()}catch{return $.json({error:"invalid JSON"},400)}let Q=typeof X.domain==="string"?X.domain.trim():"";if(!Q)return $.json({error:"domain is required"},400);let Y=Z?.email,G=typeof X.distinctId==="string"&&X.distinctId.trim()&&X.distinctId.length<=200?X.distinctId.trim():void 0;try{let J=await Ar("/api/v2/diagnostics/run",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${BL({})}`},body:JSON.stringify({url:Q,...Y?{email:Y}:{},distinct_id:G})});if(!J.ok)return $.json({error:`run HTTP ${J.status}`},502);let W=await J.json(),K=W.blocked?{state:"blocked"}:W.status==="fresh"?{state:"fresh"}:W.mode==="sync"?{state:"sync"}:{state:"running",id:W.id??null};return $.json(K)}catch{return $.json({error:"run failed"},502)}});HN.get("/status",async($)=>{let Z=$.req.query("id");if(!Z)return $.json({error:"id is required"},400);try{let X=await Ar(`/api/v2/diagnostics/status?id=${encodeURIComponent(Z)}`,{headers:{Authorization:`Bearer ${BL({})}`}});if(!X.ok)return $.json({error:`status HTTP ${X.status}`},502);let Y=(await X.json()).status??"unknown",G={done:d76.has(Y),status:Y};return $.json(G)}catch{return $.json({error:"status failed"},502)}});HN.get("/link-token/:id",async($)=>{let Z=$.req.param("id");try{let X=await Ar(`/api/v2/public/link-tokens/${encodeURIComponent(Z)}`,{headers:{Accept:"application/json"}});if(X.status===404)return $.json(null);if(!X.ok)return $.json({error:`link token HTTP ${X.status}`},502);return $.json(await X.json())}catch{return $.json({error:"link token resolve failed"},502)}});HN.get("/suggest",async($)=>{let Z=($.req.query("q")??"").trim().slice(0,64);if(Z.length<2)return $.json({suggestions:[]});try{let X=await Ar(`/api/v2/public/suggest?q=${encodeURIComponent(Z)}`,{headers:{Accept:"application/json"}});if(!X.ok)return $.json({suggestions:[]});let Q=await X.json();return $.json({suggestions:Array.isArray(Q.suggestions)?Q.suggestions:[]})}catch{return $.json({suggestions:[]})}});fx$=HN});import{createHmac as m76,timingSafeEqual as i76}from"crypto";function yx$($,Z,X,Q=Date.now()){if(!Z||!X)return!1;let Y,G=[];for(let H of Z.split(",")){let F=H.indexOf("=");if(F<=0)continue;let N=H.slice(0,F).trim(),U=H.slice(F+1).trim();if(N==="t")Y=U;else if(N==="v1")G.push(U)}if(!Y||G.length===0)return!1;let J=Number(Y);if(!Number.isFinite(J)||Math.abs(Q/1000-J)>n76)return!1;let W=m76("sha256",X).update(`${Y}.${$}`).digest("hex"),K=Buffer.from(W,"hex");return G.some((H)=>{let F=Buffer.from(H,"hex");return K.length===F.length&&i76(K,F)})}function gx$($){let Z;try{Z=JSON.parse($)}catch{return null}let X=UJ(Z),Q=UJ(UJ(X?.data)?.object);if(!X||typeof X.type!=="string"||!Q)return null;return{id:iK(X.id),type:X.type,created:typeof X.created==="number"?X.created:void 0,livemode:typeof X.livemode==="boolean"?X.livemode:void 0,data:{object:Q}}}function hx$($){switch($){case"active":case"trialing":return"active";case"past_due":return"past_due";default:return"canceled"}}function iK($){return typeof $==="string"?$:void 0}function UJ($){return typeof $==="object"&&$!==null?$:void 0}function dz0($){return typeof $==="number"?new Date($*1000):null}function e61($){return iK($)??iK(UJ($)?.id)}function p76($){return e61($.subscription)??iK(UJ(UJ($.parent)?.subscription_details)?.subscription)}function t76($){let Z=dz0($.current_period_end);if(Z)return Z;let X=UJ($.items)?.data;if(!Array.isArray(X))return null;let Q=0;for(let Y of X){let G=UJ(Y)?.current_period_end;if(typeof G==="number"&&G>Q)Q=G}return Q>0?new Date(Q*1000):null}function a61($,Z){let X=dz0($.created);return!!X&&!!Z.lastStripeEventAt&&X<Z.lastStripeEventAt}function s61($,Z){let X=dz0($.created);if(!X)return;return Z.lastStripeEventAt&&Z.lastStripeEventAt>X?void 0:X}async function o76($,Z){let X=Z.data.object;switch(Z.type){case"checkout.session.completed":case"checkout.session.async_payment_succeeded":{let Q=iK(UJ(X.metadata)?.orgId);if(!Q)return{handled:!1,reason:"no orgId"};if(iK(UJ(X.metadata)?.kind)==="topup"){if(X.mode!=="payment")return{handled:!1,reason:"topup with wrong mode"};if(iK(X.payment_status)!=="paid")return{handled:!1,reason:"payment not confirmed"};let J=iK(X.id);if(!J)return console.error("stripe webhook: topup session without id",{eventId:Z.id,organizationId:Q}),{handled:!1,reason:"topup session without id"};let W=Number(UJ(X.metadata)?.creditCents);if(!Number.isInteger(W)||W<=0)return console.error("stripe webhook: paid topup with bad metadata \u2014 credit NOT applied",{eventId:Z.id,organizationId:Q,creditCents:UJ(X.metadata)?.creditCents}),{handled:!1,reason:"bad topup metadata"};return{handled:!0,organizationId:Q,topUp:{creditCents:W,referenceId:`stripe-topup:${J}`}}}if(X.mode!=="subscription")return{handled:!1,reason:"not a subscription checkout"};if(iK(X.payment_status)!=="paid")return{handled:!1,reason:"payment not confirmed"};let Y=await $.getBilling(Q);if(!Y)return{handled:!1,reason:"unknown org"};let G=e61(X.subscription);if(Y.stripeSubscriptionId&&G&&Y.stripeSubscriptionId!==G)return console.error("stripe webhook: refused checkout rebind",{organizationId:Q,eventId:Z.id}),{handled:!1,reason:"org already bound to another subscription",orphanSubscriptionId:G};if(a61(Z,Y))return{handled:!1,reason:"stale event"};return await $.updateStripeState(Q,{stripeCustomerId:e61(X.customer),stripeSubscriptionId:G,status:"active",lastStripeEventAt:s61(Z,Y)}),{handled:!0,organizationId:Q}}case"customer.subscription.updated":case"customer.subscription.deleted":{let Q=iK(X.id);if(!Q)return{handled:!1,reason:"no sub id"};let Y=await $.getBillingByStripeSubscriptionId(Q);if(!Y)return{handled:!1,reason:"unknown subscription"};let G=Z.type==="customer.subscription.deleted";if(!G&&a61(Z,Y))return{handled:!1,reason:"stale event"};let J=G?"canceled":hx$(X.status);return await $.updateStripeState(Y.organizationId,{status:J,currentPeriodEnd:t76(X),...G&&{stripeSubscriptionId:null},lastStripeEventAt:s61(Z,Y)}),{handled:!0,organizationId:Y.organizationId}}case"invoice.paid":{let Q=p76(X);if(!Q)return{handled:!1,reason:"no sub id"};let Y=await $.getBillingByStripeSubscriptionId(Q);if(!Y)return{handled:!1,reason:"unknown subscription"};if(a61(Z,Y))return{handled:!1,reason:"stale event"};return await $.updateStripeState(Y.organizationId,{status:"active",currentPeriodEnd:dz0(X.period_end),lastStripeEventAt:s61(Z,Y)}),{handled:!0,organizationId:Y.organizationId}}default:return{handled:!1,reason:`unhandled event ${Z.type}`}}}function r76($,Z){if(!Z.handled||$.livemode===!1)return null;let X=$.data.object;if(Z.topUp)return{name:"credits_topup_succeeded",organizationId:Z.organizationId,properties:{credit_cents:Z.topUp.creditCents}};switch($.type){case"checkout.session.completed":case"checkout.session.async_payment_succeeded":return{name:"subscription_started",organizationId:Z.organizationId,properties:{}};case"customer.subscription.deleted":return{name:"subscription_canceled",organizationId:Z.organizationId,properties:{}};case"customer.subscription.updated":return{name:"subscription_updated",organizationId:Z.organizationId,properties:{status:hx$(X.status),...typeof X.cancel_at_period_end==="boolean"?{cancel_at_period_end:X.cancel_at_period_end}:{}}};case"invoice.paid":if(X.billing_reason==="subscription_create")return null;return{name:"subscription_renewed",organizationId:Z.organizationId,properties:{}};default:return null}}function xx$($,Z){let X=r76($,Z);if(!X)return;EY({event:X.name,organizationId:X.organizationId,...$.id?{uuid:ed1(`stripe:${$.id}:${X.name}`)}:{},...$.created?{timestamp:new Date($.created*1000)}:{},properties:X.properties})}async function ux$($){let Z=new bW(m8().db),X=await o76(Z,$);if(!(X.handled&&X.topUp))xx$($,X);if(X.handled&&X.topUp)await EO$({organizationId:X.organizationId,amountCents:X.topUp.creditCents,referenceId:X.topUp.referenceId}),xx$($,X);if(!X.handled&&X.orphanSubscriptionId)try{await Or1(X.orphanSubscriptionId),console.error("stripe webhook: canceled orphan subscription",{subscriptionId:X.orphanSubscriptionId,eventId:$.id})}catch(Q){if(!(Q instanceof F3&&(Q.status===400||Q.status===404)))throw Q}return X}var n76=300;var cx$=B(()=>{RG();I4();R40();em();Ia0()});var a76=1048576,$51;var lx$=B(()=>{C8();aw();I$();cx$();$51=new U1;$51.post("/webhook",NZ({maxSize:a76,onError:($)=>$.json({error:"payload too large"},413)}),async($)=>{let Z=g0().stripeWebhookSecret;if(!Z)return $.json({error:"stripe billing not configured"},503);let X=await $.req.text();if(!yx$(X,$.req.header("stripe-signature"),Z))return $.json({error:"invalid signature"},400);let Y=gx$(X);if(!Y)return $.json({error:"invalid payload"},400);let G=await ux$(Y);return console.log("stripe webhook",{eventId:Y.id,type:Y.type,livemode:Y.livemode,...G}),$.json({received:!0})})});import{timingSafeEqual as s76}from"crypto";function $X6($,Z,X){if(!Z?.startsWith("sha256="))return!1;let Q=new Bun.CryptoHasher("sha256",X).update($).digest("hex"),Y=Z.slice(7);if(Y.length!==Q.length)return!1;return s76(Buffer.from(Y),Buffer.from(Q))}var e76=5242880,Z51;var dx$=B(()=>{C8();aw();ei();Z51=new U1;Z51.post("/webhook",NZ({maxSize:e76,onError:($)=>$.json({error:"payload too large"},413)}),async($)=>{let Z=process.env.GITHUB_WEBHOOK_SECRET;if(!Z)return $.json({error:"github webhook not configured"},503);let X=await $.req.text();if(!$X6(X,$.req.header("x-hub-signature-256"),Z))return $.json({error:"invalid signature"},400);if($.req.header("x-github-event")!=="push")return $.json({ok:!0,ignored:"event"});let Q;try{Q=JSON.parse(X)}catch{return $.json({error:"invalid payload"},400)}let Y=Q.ref,G=Q.repository?.full_name;if(!Y||!G)return $.json({ok:!0,ignored:"shape"});let W=(await tm0())?.markTenantPoolsDirty(G,Y)??[];return $.json({ok:!0,pools:W})})});function mx$($,Z){if(Z.startsWith("text/html")||Z.startsWith("image/svg"))$.set("Content-Security-Policy","sandbox allow-scripts allow-modals allow-same-origin")}var ix$,ZX6,XX6,nx$;var px$=B(()=>{C8();$3();tx();pb();ix$=new U1,ZX6=["range","if-none-match","if-modified-since"],XX6=["content-type","content-length","content-range","accept-ranges","etag","last-modified"];ix$.get("/:org/files/*",async($)=>{let Z=$.get("studioContext"),X=Z.organization?.id;if(!Z.auth?.user?.id){if(ng($))return $.redirect(`/login?next=${encodeURIComponent($.req.path)}`,302);throw new e1(401,{message:"Authentication required"})}if(!X)throw new e1(401,{message:"Organization context required"});let Q=$.req.path.replace(/^.*\/files\//,"");if(!Q)throw new e1(400,{message:"Missing file key"});let Y=await Vn(Q,Z);if(!Y)throw new e1(503,{message:"Object storage not configured"});if(Y.startsWith("data:")&&G3()){let K=Y.match(/^data:([^;]+);base64,(.+)$/s);if(!K)throw new e1(500,{message:"Invalid data URL from storage"});let[,H,F]=K,N=Buffer.from(F,"base64"),U=new Headers({"Content-Type":H,"Cache-Control":"private, max-age=86400"});return mx$(U,H),new Response(N,{status:200,headers:U})}let G=new Headers;for(let K of ZX6){let H=$.req.header(K);if(H)G.set(K,H)}let J=await fetch(Y,{headers:G});if(J.status===403||J.status===404)throw new e1(404,{message:"File not found"});if(!J.ok&&J.status!==304&&J.status!==416)throw console.error(`[files] upstream storage error ${J.status} for key:`,Q),new e1(502,{message:"Upstream storage error"});let W=new Headers;for(let K of XX6){let H=J.headers.get(K);if(H)W.set(K,H)}return W.set("Cache-Control","private, max-age=86400"),mx$(W,W.get("content-type")??""),new Response(J.body,{status:J.status,headers:W})});nx$=ix$});var Tr=C((W_)=>{var QX6=W_&&W_.__createBinding||(Object.create?function($,Z,X,Q){if(Q===void 0)Q=X;var Y=Object.getOwnPropertyDescriptor(Z,X);if(!Y||("get"in Y?!Z.__esModule:Y.writable||Y.configurable))Y={enumerable:!0,get:function(){return Z[X]}};Object.defineProperty($,Q,Y)}:function($,Z,X,Q){if(Q===void 0)Q=X;$[Q]=Z[X]}),YX6=W_&&W_.__exportStar||function($,Z){for(var X in $)if(X!=="default"&&!Object.prototype.hasOwnProperty.call(Z,X))QX6(Z,$,X)};Object.defineProperty(W_,"__esModule",{value:!0});YX6(QY(),W_)});var rx$=C((tx$)=>{Object.defineProperty(tx$,"__esModule",{value:!0});tx$.version=void 0;tx$.version="3.4.0"});var ex$=C((nK)=>{var GX6=nK&&nK.__importDefault||function($){return $&&$.__esModule?$:{default:$}};Object.defineProperty(nK,"__esModule",{value:!0});nK.NodeTransport=nK.VERSION=void 0;nK.nodeResolveHost=NX6;var n6=Tr(),JX6=z0("net"),X51=z0("tls"),WX6=z0("path"),ax$=z0("fs"),KX6=GX6(z0("dns")),HX6=rx$();nK.VERSION=HX6.version;var FX6="nats.js";class sx${socket;version;lang;yields=[];signal=(0,n6.deferred)();closedNotification=(0,n6.deferred)();options;connected=!1;tlsName="";done=!1;closeError;constructor(){this.lang=FX6,this.version=nK.VERSION}async connect($,Z){this.tlsName=$.tlsName,this.options=Z;let{tls:X}=this.options,{handshakeFirst:Q}=X||{};try{if(Q===!0)this.socket=await this.tlsFirst($);else this.socket=await this.dial($);if(this.done)this.socket?.destroy();let Y=await this.peekInfo();(0,n6.checkOptions)(Y,Z);let{tls_required:G,tls_available:J}=Y,W=J===!0&&Z.tls!==null;if(!Q&&(G||W))this.socket=await this.startTLS();if(this.done)this.socket?.destroy();if(G&&this.socket.encrypted!==!0)throw n6.errors.InvalidArgumentError.format("tls","is not available on this server");return this.connected=!0,this.setupHandlers(),this.signal.resolve(),Promise.resolve()}catch(Y){let G=Y;if(!G)G=new n6.errors.ConnectionError("error connecting - node provided an undefined error");let{code:J}=G,W=J==="ECONNREFUSED"?new n6.errors.ConnectionError("connection refused",{cause:G}):G;throw this.socket?.destroy(),W}}dial($){let Z=(0,n6.deferred)(),X,Q=(0,JX6.createConnection)($.port,$.hostname,()=>{Z.resolve(Q),Q.removeAllListeners()});return Q.on("error",(Y)=>{X=Y}),Q.on("close",()=>{Q.removeAllListeners(),Z.reject(X)}),Q.setNoDelay(!0),Z}get isClosed(){return this.done}close($){return this._closed($,!1)}peekInfo(){let $=(0,n6.deferred)(),Z;return this.socket.on("data",(X)=>{this.yields.push(X);let Q=n6.DataBuffer.concat(...this.yields),Y=(0,n6.extractProtocolMessage)(Q);if(Y!=="")try{let G=n6.INFO.exec(Y);if(!G)throw Error("unexpected response from server");let J=JSON.parse(G[1]);$.resolve(J)}catch(G){$.reject(G)}finally{this.socket.removeAllListeners()}}),this.socket.on("error",(X)=>{Z=X}),this.socket.on("close",()=>{this.socket.removeAllListeners(),$.reject(Z)}),$}loadFile($){if(!$)return Promise.resolve();let Z=(0,n6.deferred)();try{if($=(0,WX6.resolve)($),!(0,ax$.existsSync)($))Z.reject(Error(`${$} doesn't exist`));(0,ax$.readFile)($,(X,Q)=>{if(X)return Z.reject(X);Z.resolve(Q)})}catch(X){Z.reject(X)}return Z}async loadClientCerts(){let $={},{certFile:Z,cert:X,caFile:Q,ca:Y,keyFile:G,key:J}=this.options.tls;try{if(Z){let W=await this.loadFile(Z);if(W)$.cert=W}else if(X)$.cert=X;if(G){let W=await this.loadFile(G);if(W)$.key=W}else if(J)$.key=J;if(Q){let W=await this.loadFile(Q);if(W)$.ca=[W]}else if(Y)$.ca=Y;return Promise.resolve($)}catch(W){return Promise.reject(W)}}async tlsFirst($){let Z,X={servername:this.tlsName,rejectUnauthorized:!0};if(this.socket)X.socket=this.socket;if(typeof this.options.tls==="object")try{let Y=await this.loadClientCerts()||{};X=(0,n6.extend)(X,this.options.tls,Y)}catch(Y){return Promise.reject(new n6.errors.ConnectionError(Y.message,{cause:Y}))}let Q=(0,n6.deferred)();try{let Y=(0,X51.connect)($.port,$.hostname,X,()=>{Y.removeAllListeners(),Q.resolve(Y)});Y.on("error",(G)=>{Z=G}),Y.on("secureConnect",()=>{if(X.rejectUnauthorized===!1)return;if(!Y.authorized)throw Y.authorizationError}),Y.on("close",()=>{Q.reject(Z),Y.removeAllListeners()}),Y.setNoDelay(!0)}catch(Y){Q.reject(new n6.errors.ConnectionError(Y.message,{cause:Y}))}return Q}async startTLS(){let $,Z={socket:this.socket,servername:this.tlsName,rejectUnauthorized:!0};if(typeof this.options.tls==="object")try{let Q=await this.loadClientCerts()||{};Z=(0,n6.extend)(Z,this.options.tls,Q)}catch(Q){return Promise.reject(new n6.errors.ConnectionError(Q.message,{cause:Q}))}let X=(0,n6.deferred)();try{let Q=(0,X51.connect)(Z,()=>{Q.removeAllListeners(),X.resolve(Q)});Q.on("error",(Y)=>{$=Y}),Q.on("secureConnect",()=>{if(Z.rejectUnauthorized===!1)return;if(!Q.authorized)throw Q.authorizationError}),Q.on("close",()=>{X.reject($),Q.removeAllListeners()})}catch(Q){X.reject(new n6.errors.ConnectionError(Q.message,{cause:Q}))}return X}setupHandlers(){let $;this.socket.on("data",(Z)=>{return this.yields.push(Z),this.signal.resolve()}),this.socket.on("error",(Z)=>{$=Z}),this.socket.on("end",()=>{if(this.socket?.destroyed)return;this.socket?.write(new Uint8Array(0),()=>{this.socket?.end()})}),this.socket.on("close",()=>{this._closed($,!1)})}[Symbol.asyncIterator](){return this.iterate()}async*iterate(){while(!0){if(this.yields.length===0)await this.signal;let $=this.yields;this.yields=[];for(let Z=0;Z<$.length;Z++){if(this.options.debug)console.info(`> ${(0,n6.render)($[Z])}`);yield $[Z]}if(this.done)break;else if(this.yields.length===0)$.length=0,this.yields=$,this.signal=(0,n6.deferred)()}}discard(){if(this.done=!0,this.socket)try{this.socket.removeAllListeners(),this.socket.destroy()}catch{}}disconnect(){this._closed(void 0,!0).then().catch()}isEncrypted(){return this.socket instanceof X51.TLSSocket}_send($){if(this.isClosed||this.socket===void 0)return Promise.resolve();if(this.options.debug)console.info(`< ${(0,n6.render)($)}`);let Z=(0,n6.deferred)();try{this.socket.write($,(X)=>{if(X){if(this.options.debug)console.error(`!!! ${(0,n6.render)($)}: ${X}`);return Z.reject(X)}return Z.resolve()})}catch(X){if(this.options.debug)console.error(`!!! ${(0,n6.render)($)}: ${X}`);Z.reject(X)}return Z}send($){this._send($).catch((X)=>{})}async _closed($,Z=!0){if(!this.connected)return;if(this.done){this.socket?.destroy();return}if(this.closeError=$,!$&&this.socket&&Z)try{await this._send(new TextEncoder().encode(""))}catch(X){if(this.options.debug)console.log("transport close terminated with an error",X)}try{if(this.socket)this.socket.removeAllListeners(),this.socket?.destroy(),this.socket=void 0}catch(X){console.log(X)}this.done=!0,this.closedNotification.resolve(this.closeError)}closed(){return this.closedNotification}}nK.NodeTransport=sx$;function NX6($){let Z=(0,n6.deferred)();return KX6.default.lookup($,{all:!0},(X,Q)=>{if(X){Z.reject(X);return}let Y=[];for(let G of Q)Y.push(G.address);if(Y.length===0)Y.push($);Z.resolve(Y)}),Z}});var Yy$=C((Qy$)=>{Object.defineProperty(Qy$,"__esModule",{value:!0});Qy$.connect=UX6;var $y$=ex$(),Zy$=Tr(),Xy$=Tr();function UX6($={}){if((0,Xy$.hasWsProtocol)($))return Promise.reject(Xy$.errors.InvalidArgumentError.format("servers","node client doesn't support websockets, use the 'wsconnect' function instead"));return(0,Zy$.setTransportFactory)({factory:()=>{return new $y$.NodeTransport},dnsResolveFn:$y$.nodeResolveHost}),Zy$.NatsConnectionImpl.connect($)}});var Gy$=C((FN)=>{var wX6=FN&&FN.__createBinding||(Object.create?function($,Z,X,Q){if(Q===void 0)Q=X;var Y=Object.getOwnPropertyDescriptor(Z,X);if(!Y||("get"in Y?!Z.__esModule:Y.writable||Y.configurable))Y={enumerable:!0,get:function(){return Z[X]}};Object.defineProperty($,Q,Y)}:function($,Z,X,Q){if(Q===void 0)Q=X;$[Q]=Z[X]}),BX6=FN&&FN.__exportStar||function($,Z){for(var X in $)if(X!=="default"&&!Object.prototype.hasOwnProperty.call(Z,X))wX6(Z,$,X)};Object.defineProperty(FN,"__esModule",{value:!0});FN.connect=void 0;var DX6=Yy$();Object.defineProperty(FN,"connect",{enumerable:!0,get:function(){return DX6.connect}});BX6(Tr(),FN)});function Hy$($){let Z=$?.connectFn??zX6,X=null,Q=null,Y=!1,G=!1,J=!1,W=[];function K(){return X!==null&&!X.isClosed()&&!X.isDraining()&&!J}function H(){console.log(`[NatsProvider] fireReady: ${W.length} callbacks`);for(let U of W)try{U()}catch{}}function F(U){(async()=>{for await(let O of U.status())if(O.type==="disconnect")console.log("[NatsProvider] Disconnected"),J=!0;else if(O.type==="reconnect")console.log("[NatsProvider] Reconnected, re-firing ready callbacks"),J=!1,Q=null,H()})().catch(()=>{})}async function N(U,O){let w=0;while(!G)try{X=await Z({servers:U,timeout:jX6,reconnect:!0,maxReconnectAttempts:-1,...O?{authenticator:O}:{}}),console.log(`[NatsProvider] Connected to ${X.getServer()} after ${w} attempt(s)`),Q=null,J=!1,F(X),H();return}catch{w++;let D=cZ(EX6,LX6,w-1,2,0.5);await R$(D)}}return{init(U,O){if(Y)return;Y=!0,G=!1;let w=O?.creds?Jy$.credsAuthenticator(new TextEncoder().encode(O.creds)):void 0;N(U,w).catch(()=>{})},isConnected(){return K()},getConnection(){return K()?X:null},getJetStream(){if(!K())return null;if(!Q)Q=Ky$.jetstream(X);return Q},onReady(U){if(W.push(U),K())try{U()}catch{}},async drain(){if(G=!0,Y=!1,Q=null,J=!1,X){let U=X;X=null,await U.drain().catch(()=>{})}}}}function zX6($){return Wy$.connect($)}var Jy$,Wy$,Ky$,LX6=100,EX6=3000,jX6=3000;var Fy$=B(()=>{t4();Jy$=S(dh(),1),Wy$=S(Gy$(),1),Ky$=S(zB(),1)});function Q51($,Z){return`${$}.${Z}`}class Y51{cache;constructor($){this.cache=fg({ttlMs:$?.ttlMs??PX6,maxSize:$?.maxSize??AX6})}async get($,Z){return this.cache.get(Q51($,Z))??null}async set($,Z,X){this.cache.set(Q51($,Z),X)}async invalidate($,Z){this.cache.delete(Q51($,Z))}teardown(){this.cache.clear()}}var PX6=600000,AX6=5000;var Ny$=()=>{};function mz0($,Z){return`${$}:${Z}`}function G51($){let Z=fg({ttlMs:$?.ttlMs??TX6,maxSize:$?.maxSize??RX6}),X=$?.getConnection,Q=crypto.randomUUID(),Y=new TextEncoder,G=new TextDecoder,J=null;function W(K,H){let F=X?.();if(!F)return;try{F.publish(Uy$,Y.encode(JSON.stringify({organizationId:K,keyId:H,originId:Q})))}catch(N){console.warn("[ProviderKeyCache] Publish failed (non-critical):",N)}}return{get(K,H){return Z.get(mz0(K,H))},set(K,H,F){Z.set(mz0(K,H),F)},invalidate(K,H){Z.delete(mz0(K,H)),W(K,H)},start(){if(J)return;let K=X?.();if(!K)return;J=K.subscribe(Uy$),(async()=>{for await(let H of J)try{let F=JSON.parse(G.decode(H.data));if(F.originId===Q)continue;Z.delete(mz0(F.organizationId,F.keyId))}catch{}})().catch(console.error)},teardown(){J?.unsubscribe(),J=null,Z.clear()}}}var Uy$="studio.ai-provider-keys.invalidate",TX6=30000,RX6=5000;var Oy$=()=>{};class J51{options;subscriptions=[];onCancel=null;encoder=new TextEncoder;originId=crypto.randomUUID();seenMessageIds=new Set;constructor($){this.options=$}async start($){if($)this.onCancel=$;if(this.subscriptions.length>0)return;if(!this.onCancel)return;let Z=this.options.getConnection();if(!Z)return;let X=new TextDecoder;this.subscriptions=wy$.map((Q)=>Z.subscribe(Q));for(let Q of this.subscriptions)(async()=>{for await(let Y of Q)try{let G=JSON.parse(X.decode(Y.data));if(G.originId===this.originId)continue;if(G.messageId&&this.hasSeen(G.messageId))continue;this.onCancel?.(G.taskId)}catch{}})().catch(console.error)}broadcast($){if(/[.*>\s]/.test($)){console.warn("[NatsCancelBroadcast] Invalid threadId, skipping broadcast");return}this.onCancel?.($);try{let Z=this.options.getConnection();if(!Z)return;let X=this.encoder.encode(JSON.stringify({taskId:$,originId:this.originId,messageId:crypto.randomUUID()}));for(let Q of wy$)Z.publish(Q,X)}catch(Z){console.warn("[NatsCancelBroadcast] Publish failed (non-critical):",Z)}}publishControlFrame($,Z){}async stop(){for(let $ of this.subscriptions)$.unsubscribe();this.subscriptions=[],this.seenMessageIds.clear(),this.onCancel=null}hasSeen($){if(this.seenMessageIds.has($))return!0;if(this.seenMessageIds.add($),this.seenMessageIds.size>1000){let Z=this.seenMessageIds.values().next().value;if(Z)this.seenMessageIds.delete(Z)}return!1}}var wy$;var By$=B(()=>{wy$=["studio.decopilot.cancel","mesh.decopilot.cancel"]});var Dy$=($)=>{let Z;return()=>Z??=$()},W51,K51;var Ly$=B(()=>{v6();W51=Dy$(()=>S$.createHistogram("decopilot.stream.encode_ms",{description:"Per-chunk JSON.stringify+encode time for decopilot stream",unit:"ms"})),K51=Dy$(()=>S$.createCounter("decopilot.stream.published_chunks",{description:"Logical decopilot stream chunks published to JetStream",unit:"{chunks}"}))});function CX6(){return{name:kF,subjects:[`${Dw0}.>`],storage:r3.StorageType.File,max_age:MX6,max_bytes:SX6,max_msgs_per_subject:VX6,discard:r3.DiscardPolicy.Old,retention:r3.RetentionPolicy.Limits,duplicate_window:kX6,num_replicas:1}}class zy${chunks=0;encodeMs=0;maxMs=0;bytes=0;windowStart=performance.now();constructor(){setInterval(()=>this.flush(),1e4).unref?.()}record($,Z){if(this.chunks++,this.encodeMs+=$,$>this.maxMs)this.maxMs=$;this.bytes+=Z}flush(){let $=performance.now(),Z=$-this.windowStart;if(this.chunks>0&&Z>0)console.warn(JSON.stringify({msg:"stream-encode-trace",windowMs:Math.round(Z),chunks:this.chunks,encodeMs:Math.round(this.encodeMs),pctOfLoop:+(this.encodeMs/Z*100).toFixed(1),maxChunkMs:+this.maxMs.toFixed(2),mbEncoded:+(this.bytes/1048576).toFixed(2)}));this.chunks=0,this.encodeMs=0,this.maxMs=0,this.bytes=0,this.windowStart=$}}function Ey$($){let Z=jy$.headers();for(let[X,Q]of Object.entries($))Z.set(X,Q);return Z}function bX6($,Z){let X=0;return{publish(Q,Y,G,J){Q.publish(Y,G,J?{headers:J}:void 0).catch((W)=>{if(X++,qX6().add(1,{"org.id":Z??"unknown"}),X===1||X%100===0)console.warn(`[Decopilot] JetStream publish failed for thread ${$} (${X} total):`,W)})},get errorCount(){return X}}}function xX6($){if(!($ instanceof Error))return!1;if($.name==="TimeoutError")return!0;return/timeout|no responders|503/i.test($.message)}class H51{options;js=null;jsm=null;constructor($){this.options=$}async init(){let $=this.options.getConnection();if(!$){console.log("[Decopilot] StreamBuffer.init skipped: NATS not connected yet");return}let Z=CX6(),X=await lZ(async()=>{let Q=this.options.getJetStreamManager?await this.options.getJetStreamManager():await r3.jetstreamManager($);try{await Q.streams.info(kF),await Q.streams.update(kF,Z)}catch(Y){if(Y instanceof Error&&Y.message.includes("stream not found"))await Q.streams.add(Z);else if(Y instanceof Error&&/can ?not change.*storage|storage type/i.test(Y.message))await Q.streams.delete(kF),await Q.streams.add(Z);else throw Y}return Q},{maxAttempts:5,minTimeout:250,maxTimeout:4000,jitter:0.5,isRetriable:xX6});this.js=this.options.getJetStream(),this.jsm=X,console.log(`[Decopilot] StreamBuffer.init ${this.js?"ready":"degraded (js=null)"}`)}pump($,Z,X,Q){let Y=this.js;if(!Y)return console.warn(`[Decopilot] pump: JetStream client unavailable for thread ${Z}; chunks NOT published to NATS`),Promise.resolve();let G=bX6(Z,Q),J=!1,W=()=>{if(J)return;J=!0;let H=oW$(Z);Y.publish(H.subject,H.data).catch(()=>{})};X.addEventListener("abort",W,{once:!0});let K=(H)=>{let F=performance.now(),N=Ep0(H,{runId:Z}),U=performance.now()-F;if(W51().record(U),K51().add(1,{"org.id":Q??"unknown"}),fX6?.record(U,N.reduce((O,w)=>O+w.data.length,0)),N.length===0){console.warn(`[Decopilot] dropping oversized stream chunk for thread ${Z}`);return}for(let O of N)G.publish(Y,O.subject,O.data,O.headers?Ey$(O.headers):void 0)};return(async()=>{let H=$.getReader(),F=0,N=0,U;try{while(!0){let{done:O,value:w}=await H.read();if(O)break;if(K(w),N++,++F>=64)F=0,await new Promise((D)=>setImmediate(D))}}catch(O){U=O,console.warn(`[Decopilot] stream pump error for thread ${Z}:`,O?.message??O)}finally{if(H.releaseLock(),W(),vX6)console.warn(JSON.stringify({msg:"decopilot-stream-diag",event:"pump-done",taskId:Z,publishedChunks:N,publishErrors:G.errorCount}))}if(U!==void 0)throw U})()}async publishRawChunk($,Z,X){let Q=this.js;if(!Q)return!1;let Y=performance.now(),G=Ep0(Z,{runId:$,dedup:X});if(W51().record(performance.now()-Y),K51().add(1),G.length===0)return console.warn(`[Decopilot] dropping oversized raw chunk for thread ${$} (> MAX_CHUNKED_BYTES)`),!0;for(let J of G)await Q.publish(J.subject,J.data,{...J.headers?{headers:Ey$(J.headers)}:{},...J.msgId?{msgID:J.msgId}:{}});return!0}async publishDone($,Z,X){let Q=this.js;if(!Q)return!1;let Y=tW$({runId:$,fenceToken:Z,finalSeq:X});return await Q.publish(Y.subject,Y.data,{msgID:Y.msgId}),!0}async createTailStream($,Z,X){let Q=this.js;if(!Q)return console.warn(`[Decopilot] createTailStream: JetStream client unavailable for thread ${$}; no live tail`),null;let Y=X?.deliverPolicy==="new"?r3.DeliverPolicy.New:r3.DeliverPolicy.All,G=X?.closeOnDone??!1,J=Fw($),W;try{W=await(await Q.consumers.get(kF,{filter_subjects:J,deliver_policy:Y})).consume()}catch(D){return console.warn("[Decopilot] JetStream tail unavailable (non-critical):",D?.message??D),null}let F=Pw0({messages:async function*(){try{for await(let D of W)yield{subject:D.subject,data:D.data,headers:D.headers}}finally{W.stop()}}(),onCancel:()=>W.stop()}).pipeThrough(Lw0()).pipeThrough(Ew0()).getReader(),N=!1,U=()=>{if(N)return;N=!0;try{F.releaseLock()}catch{}},O=!1,w=()=>{if(O)return;O=!0,W.stop(),F.cancel().catch(()=>{}),U()};return Z?.addEventListener("abort",w,{once:!0}),new ReadableStream({async pull(D){for(;;){let{done:L,value:E}=await F.read();if(L){w(),D.close();return}let j=E;if(j.kind==="done"){if(G){w(),D.close();return}continue}D.enqueue(j.chunk);return}},cancel(){w()}})}purge($){if(!this.jsm)return;this.jsm.streams.purge(kF,{filter:Fw($)}).catch(()=>{})}teardown(){this.js=null,this.jsm=null}}var r3,jy$,IX6=($)=>{let Z;return()=>Z??=$()},qX6,MX6=86400000000000,kX6=120000000000,SX6=4294967296,VX6=500000,_X6,vX6,fX6;var Py$=B(()=>{t4();jp0();Aw0();jw0();v6();Ly$();r3=S(zB(),1),jy$=S(dh(),1),qX6=IX6(()=>S$.createCounter("decopilot.stream.publish_errors",{description:"Number of JetStream publish failures for decopilot stream chunks",unit:"{errors}"}));_X6=process.env.STREAM_ENCODE_TRACE==="1",vX6=process.env.DECOPILOT_STREAM_TRACE==="1";fX6=_X6?new zy$:null});function iz0($,Z,X,Q){if(!Q)return!1;return $.emit(Z,EW(X,Q.status,{title:Q.title??void 0,virtualMcpId:Q.virtual_mcp_id??void 0,createdBy:Q.created_by??void 0,triggerId:Q.trigger_id??null,branch:Q.branch??null,harnessId:Q.harness_id??void 0,createdAt:Q.created_at,updatedAt:Q.updated_at})),!0}var Ay$=B(()=>{L8()});class F51{storage;options;timer=null;constructor($,Z={}){this.storage=$;this.options=Z}start(){if(this.timer)return;let $=this.options.intervalMs??300000;this.timer=setInterval(()=>{this.runOnce()},$)}async runOnce(){let $=this.options.staleAfterMs??3600000;try{let Z=await this.storage.sweepAbandoned($);if(Z>0)console.log(`[async-research-sweeper] marked ${Z} stale jobs as abandoned`);return Z}catch(Z){return console.error("[async-research-sweeper] sweep failed",Z),0}}dispose(){if(this.timer)clearInterval(this.timer),this.timer=null}}function dX6($){return $ instanceof d7}function mX6($,Z){return Z-$>=cX6}class N51{taskBoard;contextFactory;billing;options;timer=null;running=!1;cursor=null;constructor($,Z,X,Q={}){this.taskBoard=$;this.contextFactory=Z;this.billing=X;this.options=Q}start(){if(this.timer)return;let $=this.options.intervalMs??yX6;this.timer=setInterval(()=>{this.runOnce()},$),this.timer.unref()}async runOnce(){if(this.running)return 0;this.running=!0;let $=0;try{let Z=this.options.batchSize??hX6,X=this.options.itemIntervalMs??gX6,Q=new Date(Date.now()-X),Y=await this.taskBoard.listItemsPendingReview(Z,this.cursor,Q),G=Y.at(-1);this.cursor=Y.length===Z&&G?{updatedAt:G.updatedAt,id:G.id}:null;for(let{id:J,organizationId:W}of Y)try{if(await this.reconcileItem(J,W,Q))$++}catch(K){console.error(`[task-board-review-sweeper] ${J} failed`,K)}await this.reapNeverStartedThreads(Z),$+=await this.dispatchDueRetries(Z),await this.reactToUnhandledFailures(Z)}catch(Z){console.error("[task-board-review-sweeper] sweep failed",Z)}finally{this.running=!1}return $}async reapNeverStartedThreads($){try{let Z=await this.taskBoard.failNeverStartedLinkedThreads($,new Date(Date.now()-iJ$),Yt0);for(let X of Z)console.warn(`[task-board-review-sweeper] failed never-started thread ${X.threadId} on ${X.itemId}`)}catch(Z){console.error("[task-board-review-sweeper] reaping failed",Z)}}async reactToUnhandledFailures($){let Z=await this.taskBoard.listItemsStuckAfterFailure($,new Date(Date.now()-lX6));for(let{id:X,organizationId:Q,threadId:Y}of Z)try{console.warn(`[task-board-review-sweeper] reacting to an unhandled failure on ${X}`),await cn0(this.taskBoard,Y,Q),await ln0(this.taskBoard,this.billing,Y,Q)}catch(G){console.error(`[task-board-review-sweeper] unhandled-failure reaction for ${X} failed`,G)}}async dispatchDueRetries($){let Z=0,X=await this.taskBoard.listItemsDueForRetry($,new Date);for(let{id:Q,organizationId:Y,attempts:G}of X)try{if(!await this.taskBoard.claimDueRetry(Q,Y,new Date))continue;let J=await this.taskBoard.getById(Q,Y);if(!J||J.status!=="in_progress"||J.assigneeId!==M4)continue;let W=await this.contextFactory(Y,J.assignedBy??J.createdBy);if(!W)continue;await SF(W,J,{runClass:"retry"}),Z++,console.warn(`[task-board-review-sweeper] re-dispatched ${Q} after a failure (attempt ${G})`)}catch(J){if(console.error(`[task-board-review-sweeper] retry dispatch for ${Q} failed`,J),dX6(J)){await this.returnToTodo(Q,Y,J instanceof Error?J.message:String(J));continue}await this.taskBoard.scheduleRunRetry(Q,Y,G,new Date(Date.now()+uX6)).catch((W)=>console.error(`[task-board-review-sweeper] re-arming ${Q} failed`,W))}return Z}async returnToTodo($,Z,X){try{let Q=await this.taskBoard.getById($,Z);if(!Q||Q.status!=="in_progress")return;let Y=await this.taskBoard.returnToTodoAfterFailure($,Z,Q.updatedBy);if(!Y)return;await this.taskBoard.recordActivity({taskBoardItemId:$,action:"status_changed",actorId:null,data:{from:"in_progress",to:"todo",reason:X}}).catch(()=>{}),K4(Z,Y)}catch(Q){console.error(`[task-board-review-sweeper] returning ${$} to todo failed`,Q)}}async handOffReviewWithoutPr($,Z){let X=await this.taskBoard.listActivity(Z.id,Z.organizationId);if(!mX6(IL(X),Date.now()))return;await DK($,Z,"no pull request is linked to this task \u2014 there is nothing for a "+"reviewer to review")}async reconcileItem($,Z,X){if(!await this.taskBoard.claimSweep($,Z,X))return!1;let Q=await this.taskBoard.getById($,Z);if(!Q)return!1;if(Q.status!=="in_review")return!1;let Y=Q.assigneeId===M4,G=await this.taskBoard.listPrs($,Z),J=await this.contextFactory(Z,Q.assignedBy??Q.createdBy);if(!J)return!1;if(G.length===0){if(Y)await this.handOffReviewWithoutPr(J,Q);return!1}if(await HH$(J,Q))return!0;if(!Y)return!1;let W=await Promise.all(G.map(async(K)=>({...K,...await Gy(Z,K)})));if(W.every((K)=>K.state===null))console.warn(`[task-board-review-sweeper] ${$}: no live PR state from GitHub (${W.length} PR(s)) \u2014 proceeding on unknown`);if(!$t0(W))return!1;return await kw0(J,Q,{previewMatchesHead:Zt0(W)}),!0}dispose(){if(this.timer)clearInterval(this.timer),this.timer=null}}var yX6=60000,gX6=300000,hX6=50,uX6=60000,cX6=900000,lX6=120000;var Ty$=B(()=>{kZ();np0();Nw();tn();v9();N3();Gt0();Ow();ln()});import{readdir as iX6,rm as nz0}from"fs/promises";import{join as pz0}from"path";async function tz0($){let Z=new Date;Z.setUTCDate(Z.getUTCDate()-nX6),Z.setUTCHours(0,0,0,0);let X=0;try{let Q=await K_($);for(let Y of Q)if(/^\d{4}$/.test(Y))X+=await Ry$($,Y,Z);else if(!Y.startsWith(".")){let G=pz0($,Y),J=await K_(G);for(let K of J){if(!/^\d{4}$/.test(K))continue;X+=await Ry$(G,K,Z)}if((await K_(G)).length===0)await nz0(G,{recursive:!0,force:!0})}}catch(Q){console.warn("monitoring retention cleanup failed:",Q)}return X}async function Ry$($,Z,X){let Q=0,Y=pz0($,Z),G=await K_(Y);for(let W of G){if(!/^\d{2}$/.test(W))continue;let K=pz0(Y,W),H=await K_(K);for(let N of H){if(!/^\d{2}$/.test(N))continue;let U=new Date(`${Z}-${W}-${N}T00:00:00Z`);if(isNaN(U.getTime()))continue;if(U<X){let O=pz0(K,N);await nz0(O,{recursive:!0,force:!0}),Q++}}if((await K_(K)).length===0)await nz0(K,{recursive:!0,force:!0})}if((await K_(Y)).length===0)await nz0(Y,{recursive:!0,force:!0});return Q}async function K_($){try{return(await iX6($)).filter((X)=>!X.startsWith("."))}catch{return[]}}var nX6=30;var U51=()=>{};import{DBOS as O51,SchedulerMode as pX6}from"@dbos-inc/dbos-sdk";async function oX6(){let $=[LJ(),F_(),oK()],Z=0;for(let X of $)try{Z+=await tz0(X)}catch(Q){console.error("[monitoring-retention] cleanup failed:",Q)}return console.log(`[monitoring-retention] deleted ${Z} day-dir(s) across ${$.length} signal dir(s)`),{deleted:Z,dirs:$.length}}async function rX6($,Z){await O51.runStep(()=>oX6(),{name:"monitoringRetention"})}function qy$(){if(Iy$)return;Iy$=!0;let $=O51.registerWorkflow(rX6,{name:"monitoringRetentionWorkflow"});O51.registerScheduled($,{name:"monitoringRetentionWorkflow",crontab:tX6,mode:pX6.ExactlyOncePerIntervalWhenActive})}var tX6="23 4 * * *",Iy$=!1;var My$=B(()=>{eQ();U51()});function ky$($){return async(Z,X)=>{let Q=await $.db.selectFrom("member").innerJoin("organization","organization.id","member.organizationId").select(["member.role","organization.id as orgId","organization.slug as orgSlug","organization.name as orgName"]).where("member.userId","=",X).where("member.organizationId","=",Z).executeTakeFirst();if(!Q)return console.warn(`[automationContextFactory] User ${X} not found in org ${Z} \u2014 returning null`),null;let Y=await iG.create();Y.auth.user={id:X,role:Q.role},Y.organization={id:Q.orgId,slug:Q.orgSlug,name:Q.orgName};let G=await L81($.db,Z,Q.role);return Y.boundAuth=D81({auth:Y.authInstance,headers:new Headers,role:Q.role,permissions:G,userId:X}),Y.access=new sD(X,void 0,Y.boundAuth,Q.role,"self"),Uw(Y,{id:Q.orgId,slug:Q.orgSlug}),Y}}var Sy$=B(()=>{eD();cV()});function aX6(){return{services:[{name:"Postgres",status:"pending",port:0},{name:"NATS",status:"pending",port:0}],migrationsStatus:"pending",serverUrl:null,logs:[]}}function eX6(){for(let $ of sX6)$()}function Vy$($){let Z=[...w51.logs,$];w51={...w51,logs:Z.length>500?Z.slice(-500):Z},eX6()}function B51(){return $Q6}var w51,sX6,$Q6=!1;var D51=B(()=>{w51=aX6(),sX6=new Set});import{EventEmitter as ZQ6}from"events";var L51;var Cy$=B(()=>{D51();L51=new ZQ6;L51.on("request",($)=>{Vy$($)})});function _y$(){return async($,Z)=>{let X=Date.now(),Q=$.req.method,Y=$.req.path;if(Y==="/api/auth/get-session"||Y.includes("favicon")){await Z();return}let G="",J=!1;if(Y.startsWith("/mcp")&&Q==="POST"){J=!0;try{if($.req.header("Content-Type")?.includes("application/json")){let U=await $.req.raw.clone().json();if(U.method==="tools/call"&&U.params?.name){let O=jh(U.params.name),w=U.params.arguments||{},D=Object.keys(w).map((E)=>jh(E)),L=D.length>0?D.slice(0,3).join(",")+(D.length>3?"\u2026":""):"";G=`${Z5.tool}${O}${Z5.dim}(${L})${Z5.reset}`}else if(U.method)G=`${Z5.dim}${jh(U.method)}${Z5.reset}`}}catch{}}let W=jh(Y);if(Y.startsWith("/mcp/conn_")){let F=Y.split("/")[2]??"";W=`/mcp/${Z5.mcp}${jh(F.slice(0,12))}\u2026${Z5.reset}`}else if(Y==="/mcp")W=`${Z5.mcp}/mcp${Z5.reset}`;else if(Y==="/mcp/registry")W=`${Z5.mcp}/mcp/registry${Z5.reset}`;let K=QQ6(Q),H=J?"\u25C0":"\u2190";if(!B51())console.log(`${Z5.dim}${H}${Z5.reset} ${K}${Q}${Z5.reset} ${W}${G?` ${G}`:""}`);try{await Z()}finally{let F=Date.now()-X,N=$.res.status,U=XQ6(N),O=F<1000?`${F}ms`:`${(F/1000).toFixed(1)}s`,w=J?"\u25B6":"\u2192";if(!B51())console.log(`${Z5.dim}${w}${Z5.reset} ${K}${Q}${Z5.reset} ${W}${G?` ${G}`:""} ${U}${N}${Z5.reset} ${Z5.duration}${O}${Z5.reset}`);L51.emit("request",{method:Q,path:jh(Y),status:N,duration:F,timestamp:new Date})}}}var Z5,XQ6=($)=>{if($>=500)return Z5.serverError;if($>=400)return Z5.clientError;if($>=300)return Z5.redirect;return Z5.ok},QQ6=($)=>{return Z5[$]||Z5.reset},jh=($)=>{return $.replace(/\r/g,"").replace(/\n/g,"").replace(/\x1b\[[0-9;]*m/g,"").replace(/[\x00-\x1f\x7f-\x9f]/g,"")};var vy$=B(()=>{D51();Cy$();Z5={reset:"\x1B[0m",dim:"\x1B[2m",bold:"\x1B[1m",GET:"\x1B[36m",POST:"\x1B[33m",PUT:"\x1B[35m",DELETE:"\x1B[31m",ok:"\x1B[32m",redirect:"\x1B[36m",clientError:"\x1B[33m",serverError:"\x1B[31m",mcp:"\x1B[35m",tool:"\x1B[96m",duration:"\x1B[90m"}});import{createHmac as yy$}from"crypto";import{mkdir as YQ6,readdir as GQ6,rm as fy$,stat as gy$}from"fs/promises";import{join as j51,relative as JQ6}from"path";import{z as E$}from"zod";function uy$($){let Z=$.replace(/[^a-zA-Z0-9_-]/g,"_");return j51(WQ6,Z)}function cy$($){return $.replace(/^\/+/,"").replace(/\.\./g,"")}function E51($,Z){let X=uy$($),Q=cy$(Z);return j51(X,Q)}function KQ6($,Z,X,Q){let Y=g0().encryptionKey||"dev-secret",G=`${$}:${Z}:${X}:${Q}`;return yy$("sha256",Y).update(G).digest("hex")}function xy$($,Z,X,Q,Y){let G=Math.floor(Date.now()/1000)+Q,J=KQ6(Z,X,G,Y),W=new URL(`/api/dev-assets/${Z}/${cy$(X)}`,$);return W.searchParams.set("expires",G.toString()),W.searchParams.set("signature",J),W.searchParams.set("method",Y),W.toString()}function ly$($,Z,X){let Q=`${$}:${Z.getTime()}:${X}`;return`"${yy$("md5","etag").update(Q).digest("hex")}"`}async function dy$($,Z,X,Q,Y){try{let G=await GQ6($,{withFileTypes:!0});for(let J of G){let W=j51($,J.name),H=JQ6(Z,W).replace(/\\/g,"/");if(X&&!H.startsWith(X))continue;if(J.isDirectory())if(Q){let F=H+"/";if(!X||F.startsWith(X)){if(!(X?H.slice(X.length):H).includes("/"))Y.commonPrefixes.add(F)}}else await dy$(W,Z,X,Q,Y);else if(J.isFile()){if(Q&&X){let F=H.slice(X.length);if(F.includes(Q)){let N=F.indexOf(Q),U=X+F.slice(0,N+1);Y.commonPrefixes.add(U);continue}}try{let F=await gy$(W);Y.objects.push({key:H,size:F.size,lastModified:F.mtime.toISOString(),etag:ly$(W,F.mtime,F.size)})}catch{}}}}catch{}}function my$($,Z){let Q=r($).id;return[{name:"LIST_OBJECTS",description:"List objects in the local assets directory with pagination support",inputSchema:E$.object({prefix:E$.string().optional(),maxKeys:E$.number().optional().default(1000),continuationToken:E$.string().optional(),delimiter:E$.string().optional()}),outputSchema:E$.object({objects:E$.array(E$.object({key:E$.string(),size:E$.number(),lastModified:E$.string(),etag:E$.string()})),nextContinuationToken:E$.string().optional(),isTruncated:E$.boolean(),commonPrefixes:E$.array(E$.string()).optional()}),handler:async(Y)=>{let G=Y,J=G.prefix||"",W=G.maxKeys??1000,K=G.delimiter,H=G.continuationToken,F=uy$(Q);await YQ6(F,{recursive:!0});let N={objects:[],commonPrefixes:new Set};await dy$(F,F,J,K,N),N.objects.sort((L,E)=>L.key.localeCompare(E.key));let U=0;if(H){if(U=N.objects.findIndex((L)=>L.key>H),U===-1)U=N.objects.length}let O=N.objects.slice(U,U+W),w=U+W<N.objects.length,D=w?O[O.length-1]?.key:void 0;return{objects:O,isTruncated:w,nextContinuationToken:D,commonPrefixes:Array.from(N.commonPrefixes).sort()}}},{name:"GET_OBJECT_METADATA",description:"Get metadata for a file in the local assets directory",inputSchema:E$.object({key:E$.string()}),outputSchema:E$.object({contentType:E$.string().optional(),contentLength:E$.number(),lastModified:E$.string(),etag:E$.string(),metadata:E$.record(E$.string(),E$.string()).optional()}),handler:async(Y)=>{let G=Y,J=E51(Q,G.key),W=await gy$(J);return{contentType:$41(G.key),contentLength:W.size,lastModified:W.mtime.toISOString(),etag:ly$(J,W.mtime,W.size)}}},{name:"GET_PRESIGNED_URL",description:"Generate a presigned URL for downloading a file from local storage",inputSchema:E$.object({key:E$.string(),expiresIn:E$.number().optional()}),outputSchema:E$.object({url:E$.string(),expiresIn:E$.number()}),handler:async(Y)=>{let G=Y,J=G.expiresIn??by$;return{url:xy$(Z,Q,G.key,J,"GET"),expiresIn:J}}},{name:"PUT_PRESIGNED_URL",description:"Generate a presigned URL for uploading a file to local storage",inputSchema:E$.object({key:E$.string(),expiresIn:E$.number().optional(),contentType:E$.string().optional()}),outputSchema:E$.object({url:E$.string(),expiresIn:E$.number()}),handler:async(Y)=>{let G=Y,J=G.expiresIn??by$;return{url:xy$(Z,Q,G.key,J,"PUT"),expiresIn:J}}},{name:"DELETE_OBJECT",description:"Delete a single file from local storage",inputSchema:E$.object({key:E$.string()}),outputSchema:E$.object({success:E$.boolean(),key:E$.string()}),handler:async(Y)=>{let G=Y,J=E51(Q,G.key);try{return await fy$(J),{success:!0,key:G.key}}catch{return{success:!1,key:G.key}}}},{name:"DELETE_OBJECTS",description:"Delete multiple files from local storage",inputSchema:E$.object({keys:E$.array(E$.string()).max(1000)}),outputSchema:E$.object({deleted:E$.array(E$.string()),errors:E$.array(E$.object({key:E$.string(),message:E$.string()}))}),handler:async(Y)=>{let G=Y,J=[],W=[];return await Promise.all(G.keys.map(async(K)=>{let H=E51(Q,K);try{await fy$(H),J.push(K)}catch(F){W.push({key:K,message:F instanceof Error?F.message:"Unknown error"})}})),{deleted:J,errors:W}}}]}async function z51($,Z,X){let Q=my$(Z,X),Y=new IW({name:"dev-assets-mcp",version:"1.0.0"},{capabilities:{tools:{}},jsonSchemaValidator:J5});for(let J of Q){let W="shape"in J.inputSchema?J.inputSchema.shape:E$.object({}).shape,K=J.outputSchema&&"shape"in J.outputSchema?J.outputSchema.shape:E$.object({}).shape;Y.registerTool(J.name,{description:J.description??"",inputSchema:W,outputSchema:K,annotations:J.annotations,_meta:J._meta},async(H)=>{try{let F=await J.handler(H);return{content:[{type:"text",text:JSON.stringify(F)}],structuredContent:F}}catch(F){return{content:[{type:"text",text:`Error: ${F.message}`}],isError:!0}}})}let G=new nX({enableJsonResponse:$.headers.get("Accept")?.includes("application/json")??!1});return await Y.connect(G),aG(Y,G,$,"mcp:dev-assets")}async function iy$($,Z,X,Q){let G=my$(X,Q).find((J)=>J.name===$);if(!G)return{content:[{type:"text",text:`Tool not found: ${$}`}],isError:!0};try{let J=await G.handler(Z);return{content:[{type:"text",text:JSON.stringify(J)}]}}catch(J){return{content:[{type:"text",text:J instanceof Error?J.message:String(J)}],isError:!0}}}var WQ6="./data/assets",by$=3600,hy$,ny$;var py$=B(()=>{I$();Ny();C8();wl();nV();MX();cj0();hy$=new U1;hy$.all("/",async($)=>{let Z=$.get("studioContext"),X=new URL($.req.url),Q=`${X.protocol}//${X.host}`;return z51($.req.raw,Z,Q)});ny$=hy$});var ty$={};N4(ty$,{mountDevRoutes:()=>HQ6});function HQ6($,Z){$.all("/mcp/:connectionId{.*_dev-assets$}",Z,async(Q)=>{let Y=Q.get("studioContext"),G=new URL(Q.req.url),J=`${G.protocol}//${G.host}`;return z51(Q.req.raw,Y,J)}),$.all("/mcp/:connectionId{.*_dev-assets$}/call-tool/:toolName",Z,async(Q)=>{let Y=Q.get("studioContext"),G=new URL(Q.req.url),J=`${G.protocol}//${G.host}`,W=Q.req.param("toolName");if(!W)return Q.json({error:"Missing tool name"},400);let K=await Q.req.json(),H=await iy$(W,K,Y,J);if(H.isError)return Q.json(H.content,500);return Q.json(H.content)}),$.use("/mcp/dev-assets",Z),$.route("/mcp/dev-assets",ny$);let X=new U1;X.use("*",t3({mountPath:"/api/dev-assets"})),X.route("/",uj0({orgFromPath:!1})),$.route("/api/dev-assets",X)}var oy$=B(()=>{C8();n81();cj0();py$()});import{sql as FQ6}from"kysely";import{randomUUID as ry$}from"crypto";import{z as NQ6}from"zod";async function OQ6($){let Z=new Date().toISOString(),X=ry$(),Q=u4.SELF($.organizationId),Y="registry.publish_request.created",G={requestId:$.request.id,requestedId:$.request.requested_id,title:$.request.title,status:$.request.status,createdAt:$.request.created_at,requester:{name:$.request.requester_name,email:$.request.requester_email}};await $.db.insertInto("events").values({id:X,organization_id:$.organizationId,type:"registry.publish_request.created",source:Q,specversion:"1.0",subject:$.request.id,time:Z,datacontenttype:"application/json",dataschema:null,data:JSON.stringify(G),cron:null,status:"pending",attempts:0,last_error:null,next_retry_at:null,created_at:Z,updated_at:Z}).execute();let J=await $.db.selectFrom("event_subscriptions").select(["id"]).where("organization_id","=",$.organizationId).where("enabled","=",1).where("event_type","=","registry.publish_request.created").where((W)=>W.or([W("publisher","is",null),W("publisher","=",Q)])).execute();if(J.length>0)await $.db.insertInto("event_deliveries").values(J.map((W)=>({id:ry$(),event_id:X,subscription_id:W.id,status:"pending",attempts:0,last_error:null,delivered_at:null,next_retry_at:null,created_at:Z}))).execute();try{await FQ6`SELECT
2740
2740
  pg_notify('studio_events', ${X}),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "decocms",
3
- "version": "4.216.1",
3
+ "version": "4.217.0",
4
4
  "description": "Deco CMS — Self-hostable MCP Gateway for managing AI connections and tools",
5
5
  "author": "Deco team",
6
6
  "repository": {