decocms 4.233.0 → 4.235.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 (234) hide show
  1. package/dist/client/assets/{AlertCircle-DxhIVO8g.js → AlertCircle-DhpRwzB9.js} +1 -1
  2. package/dist/client/assets/{AreaChart-BcI5eQFQ.js → AreaChart-B5ojN-ie.js} +1 -1
  3. package/dist/client/assets/{ArrowLeft-Ctr3YgRa.js → ArrowLeft-jgVBnqT7.js} +1 -1
  4. package/dist/client/assets/{ArrowUp-DuZfapp-.js → ArrowUp-k_8hNJuH.js} +1 -1
  5. package/dist/client/assets/{ArrowUpRight-DkDf0SlM.js → ArrowUpRight-BWbL1ENY.js} +1 -1
  6. package/dist/client/assets/{Check-CB1wWN-R.js → Check-PDGbmWh6.js} +1 -1
  7. package/dist/client/assets/{CheckCircle-Brg9nQLu.js → CheckCircle-CkJ93h3j.js} +1 -1
  8. package/dist/client/assets/{ChevronDown-Bp5Bhuf2.js → ChevronDown-g4EzcrUF.js} +1 -1
  9. package/dist/client/assets/{ChevronRight-DtQMDvdA.js → ChevronRight-LNBJ1bVx.js} +1 -1
  10. package/dist/client/assets/{ChevronUp-BVjoCk50.js → ChevronUp-Bqj2Nevd.js} +1 -1
  11. package/dist/client/assets/{Copy01-BE6lBLyL.js → Copy01-BrBG1mb-.js} +1 -1
  12. package/dist/client/assets/{CpuChip01-BzZVCktF.js → CpuChip01-BdR1TzCJ.js} +1 -1
  13. package/dist/client/assets/{CreditCard01-UKXGOiwR.js → CreditCard01-DfLCyNya.js} +1 -1
  14. package/dist/client/assets/{DotsVertical-DgYMlIqK.js → DotsVertical-DVwJIFyk.js} +1 -1
  15. package/dist/client/assets/{Eye-A563EIve.js → Eye-2Za14PvL.js} +1 -1
  16. package/dist/client/assets/{FilterLines-CujWJi10.js → FilterLines-Bao3t7wx.js} +1 -1
  17. package/dist/client/assets/{Globe01-DV0sA1fo.js → Globe01-oLxgSWg9.js} +1 -1
  18. package/dist/client/assets/{Globe04-JphLmdwi.js → Globe04-Cfn05vj_.js} +1 -1
  19. package/dist/client/assets/{HardDrive-CwKpXkTd.js → HardDrive-B7mKfgkk.js} +1 -1
  20. package/dist/client/assets/{Key01-Bz0ywC7v.js → Key01-CpvMyyf1.js} +1 -1
  21. package/dist/client/assets/{LayoutLeft-p8Yokts4.js → LayoutLeft-CPbsS0H9.js} +1 -1
  22. package/dist/client/assets/{LinkExternal01-BVTQ7Txc.js → LinkExternal01-WEAeStl5.js} +1 -1
  23. package/dist/client/assets/{LogOut01-C9MR6h34.js → LogOut01-B9nk2zV1.js} +1 -1
  24. package/dist/client/assets/{Monitor01-FmytUe2y.js → Monitor01-dHf4o4Lm.js} +1 -1
  25. package/dist/client/assets/{Palette-CdJ2ITyM.js → Palette-5luFUbkn.js} +1 -1
  26. package/dist/client/assets/{Play-DmyxnVaR.js → Play-u8RKUOgE.js} +1 -1
  27. package/dist/client/assets/{Plus-g_F7sl0h.js → Plus-BXyI5W5V.js} +1 -1
  28. package/dist/client/assets/{SearchLg-t8oKB9F9.js → SearchLg-C-HSASaD.js} +1 -1
  29. package/dist/client/assets/{SearchMd-CkTq-ZRU.js → SearchMd-D0w4Qck0.js} +1 -1
  30. package/dist/client/assets/{Settings02-rME5QkSv.js → Settings02-BfvgzwsC.js} +1 -1
  31. package/dist/client/assets/{Share07-BB7t0OyK.js → Share07-AmafGmXq.js} +1 -1
  32. package/dist/client/assets/{Shield01-gWgEwZw2.js → Shield01-Q9cD5PhS.js} +1 -1
  33. package/dist/client/assets/{Star01-C2rjgGvG.js → Star01-HQ5zaxBt.js} +1 -1
  34. package/dist/client/assets/{Stars01-DRCR0Q3e.js → Stars01-DPTd-IIJ.js} +1 -1
  35. package/dist/client/assets/{Stars02-NsTZY1yi.js → Stars02-BsV8lJrt.js} +1 -1
  36. package/dist/client/assets/{Sun-qDRgeJdQ.js → Sun-B9KCp7DY.js} +1 -1
  37. package/dist/client/assets/{SwitchHorizontal01-Crz_Sn_d.js → SwitchHorizontal01-CQ1ESORY.js} +1 -1
  38. package/dist/client/assets/{Tool01-iPvLGmnY.js → Tool01-UIX8wv2D.js} +1 -1
  39. package/dist/client/assets/{Tool02-CE1JrXOr.js → Tool02-D1_-NCDI.js} +1 -1
  40. package/dist/client/assets/{Trash01-HCUcswMa.js → Trash01-CM1y68V4.js} +1 -1
  41. package/dist/client/assets/{TrendUp01-D58MKe4H.js → TrendUp01-DCHfnHwK.js} +1 -1
  42. package/dist/client/assets/{Upload01-Xse5pAaQ.js → Upload01-DMRrFtU2.js} +1 -1
  43. package/dist/client/assets/{User01-Bdh9SztA.js → User01-B9SplPDx.js} +1 -1
  44. package/dist/client/assets/{Users01-D6CpSEBQ.js → Users01-BzBrg0ZX.js} +1 -1
  45. package/dist/client/assets/{Users03-DMeS8kai.js → Users03-ClXJnKMN.js} +1 -1
  46. package/dist/client/assets/{X-Bf4dZPNS.js → X-QRTj5BrM.js} +1 -1
  47. package/dist/client/assets/{XCircle-Bv0g8j3q.js → XCircle-DHrUxowR.js} +1 -1
  48. package/dist/client/assets/{XClose-CdAk_TcD.js → XClose-B627c_Vw.js} +1 -1
  49. package/dist/client/assets/{YAxis-2uK8Ye_N.js → YAxis-D2jKoD7e.js} +1 -1
  50. package/dist/client/assets/{Zap-BxaU0A48.js → Zap-DSqrbWsY.js} +1 -1
  51. package/dist/client/assets/{ZapSquare-CcpE9ru4.js → ZapSquare-CiZoSPa1.js} +1 -1
  52. package/dist/client/assets/{access-gate-BPZTU1dY.js → access-gate-CnpvAtvi.js} +1 -1
  53. package/dist/client/assets/{agent-icon-CiNtbFvJ.js → agent-icon-DkyeFSsr.js} +1 -1
  54. package/dist/client/assets/{agents-list-CI8ARCvp.js → agents-list-CIvdSNE1.js} +1 -1
  55. package/dist/client/assets/{ai-providers-DHvnyzI7.js → ai-providers-oU33l0fi.js} +1 -1
  56. package/dist/client/assets/{alert-DKqVuc65.js → alert-CnQZKblO.js} +1 -1
  57. package/dist/client/assets/{alert-dialog-BnAEWNTS.js → alert-dialog-CbWOuX8R.js} +1 -1
  58. package/dist/client/assets/{api-keys-CQZvg8tK.js → api-keys-CwEdeP-F.js} +1 -1
  59. package/dist/client/assets/{app-editor-ime6FcVX.js → app-editor-IISvFL2K.js} +1 -1
  60. package/dist/client/assets/{auth-DYv4QQwB.js → auth-BSnkvOr9.js} +1 -1
  61. package/dist/client/assets/{auth-catchall-CerVY0BU.js → auth-catchall-D2b6HTzL.js} +1 -1
  62. package/dist/client/assets/{auth-entry-HJf6zk4u.js → auth-entry-AukggBM6.js} +1 -1
  63. package/dist/client/assets/{auth-split-layout-CBC1D8Gs.js → auth-split-layout-4cU-YsVY.js} +1 -1
  64. package/dist/client/assets/{authenticate-and-persist-oauth-CFZPtaIU.js → authenticate-and-persist-oauth-BEZ_C5HG.js} +1 -1
  65. package/dist/client/assets/{automation-list-row-D4ePqY_K.js → automation-list-row-7HrVeNZG.js} +1 -1
  66. package/dist/client/assets/{automation-runs-_EfKEIfo.js → automation-runs-DxoBVAKN.js} +1 -1
  67. package/dist/client/assets/{automations-DYq1KSP3.js → automations-B47QolDt.js} +1 -1
  68. package/dist/client/assets/{avatar-Dxkbez_g.js → avatar-P3_v_NAz.js} +1 -1
  69. package/dist/client/assets/{badge-B4yWfrsj.js → badge-C1JzjZR_.js} +1 -1
  70. package/dist/client/assets/{billing-DTMjWQDJ.js → billing-CWhhqZ_Y.js} +1 -1
  71. package/dist/client/assets/{block-document-CayYE8lz.js → block-document-DrwN_9l7.js} +1 -1
  72. package/dist/client/assets/{brand-context-BnkQqmhZ.js → brand-context-CvOIRyXz.js} +1 -1
  73. package/dist/client/assets/{buckets-Boi6JMSS.js → buckets-DOMiVucp.js} +1 -1
  74. package/dist/client/assets/{bulk-category-panel-B303PSRk.js → bulk-category-panel-Dir5ualU.js} +1 -1
  75. package/dist/client/assets/{capability-load-error-BIrLLyLV.js → capability-load-error-DN762eMk.js} +1 -1
  76. package/dist/client/assets/{card-DCdbjSt8.js → card-p1m4joJM.js} +1 -1
  77. package/dist/client/assets/{cards-03SBwODD.js → cards-DBg4V9b2.js} +1 -1
  78. package/dist/client/assets/{category-editor-B6Lqoiik.js → category-editor-BikDoU2k.js} +1 -1
  79. package/dist/client/assets/{chart-DoWHmsjN.js → chart-B0IqnL8c.js} +1 -1
  80. package/dist/client/assets/chat-context-CRUy13w1.js +35 -0
  81. package/dist/client/assets/{checkbox-Cj6-6z11.js → checkbox-CchUxqgJ.js} +1 -1
  82. package/dist/client/assets/{cli-auth-success-C8d9QEXn.js → cli-auth-success-DQjLe6R2.js} +1 -1
  83. package/dist/client/assets/{collection-detail-BlZwY2z4.js → collection-detail-CivLP1mz.js} +1 -1
  84. package/dist/client/assets/{collection-display-button-fhpc0d_E.js → collection-display-button-IHdp-B_0.js} +1 -1
  85. package/dist/client/assets/{collection-search-DWHmJRTZ.js → collection-search-Cl71gN_N.js} +1 -1
  86. package/dist/client/assets/{collection-table-wrapper-0-aMN7kk.js → collection-table-wrapper-a2DvIzca.js} +1 -1
  87. package/dist/client/assets/{collection-tabs--RWCnegb.js → collection-tabs-Cop7MY_6.js} +1 -1
  88. package/dist/client/assets/{command-DpQjUH7C.js → command-C4F2Utv8.js} +1 -1
  89. package/dist/client/assets/{commerce-onboarding-75Xyj44m.js → commerce-onboarding-DG_2ajnF.js} +1 -1
  90. package/dist/client/assets/{connect-Pd0hGqfp.js → connect-C28GSrix.js} +1 -1
  91. package/dist/client/assets/{connection-B8QUt5qf.js → connection-Bx6eex29.js} +1 -1
  92. package/dist/client/assets/{connection-card-CYYHOn8G.js → connection-card-XId4-jpr.js} +1 -1
  93. package/dist/client/assets/{connection-detail-D8iAXD6d.js → connection-detail-Ccia4nx9.js} +1 -1
  94. package/dist/client/assets/{connection-form-helpers-DD1440zT.js → connection-form-helpers-D-hjRB-2.js} +1 -1
  95. package/dist/client/assets/{connections-DD2pKuZv.js → connections-k4E6tqXD.js} +1 -1
  96. package/dist/client/assets/{decopilot-sse-pool-PDts66Cw.js → decopilot-sse-pool-D7pbe6RU.js} +1 -1
  97. package/dist/client/assets/{dialog-D5JeNWji.js → dialog-CIGzdMua.js} +1 -1
  98. package/dist/client/assets/{domain-settings-C-VZXkWu.js → domain-settings-B_WKuX5d.js} +1 -1
  99. package/dist/client/assets/{drawer-DZB9Ayaq.js → drawer-BdIRcxnD.js} +1 -1
  100. package/dist/client/assets/{dropdown-menu-DGab5gGv.js → dropdown-menu-C6ogoVKR.js} +1 -1
  101. package/dist/client/assets/{empty-state-CUpJlnEP.js → empty-state-BGGeFl0Z.js} +1 -1
  102. package/dist/client/assets/{extract-connection-data-HB0f7VhS.js → extract-connection-data-D4fmQsKZ.js} +1 -1
  103. package/dist/client/assets/{file-explorer-CQM_wXjX.js → file-explorer-D4nowlAn.js} +1 -1
  104. package/dist/client/assets/{file-type-icon-2Oy3oZAr.js → file-type-icon-gwL2K8IC.js} +1 -1
  105. package/dist/client/assets/{form-BnBmIKdR.js → form-DyoMgY6-.js} +1 -1
  106. package/dist/client/assets/general-Bd02t0wx.js +1 -0
  107. package/dist/client/assets/{github-repo-picker-gMQ7jslJ.js → github-repo-picker-C68FkYjA.js} +1 -1
  108. package/dist/client/assets/{hooks-BwXOucYx.js → hooks-BwSvLXx7.js} +1 -1
  109. package/dist/client/assets/{index-DLKO9DR4.js → index-BlstV6rA.js} +1 -1
  110. package/dist/client/assets/{index-Bmx5aP9S.js → index-C8BiJ7E3.js} +1 -1
  111. package/dist/client/assets/{index-DlOIhlpa.js → index-CT865qHQ.js} +1 -1
  112. package/dist/client/assets/{index--dViOAZG.js → index-CURzwHjl.js} +1 -1
  113. package/dist/client/assets/{index-COwnzJ4s.js → index-ChSTgWsl.js} +1 -1
  114. package/dist/client/assets/{index-CIZWixbA.js → index-CybpydvN.js} +1 -1
  115. package/dist/client/assets/{index-BVIvC2zN.js → index-DqSSr3Qv.js} +1 -1
  116. package/dist/client/assets/{index-RxUskJ2D.js → index-MX-v2N7n.js} +58 -58
  117. package/dist/client/assets/{index-redirect-CApb8yxa.js → index-redirect-D_ViGQrD.js} +1 -1
  118. package/dist/client/assets/{index-D3DyocAK.js → index-tgHkjyXk.js} +1 -1
  119. package/dist/client/assets/{index-CMxZ_WIu.js → index-yLSGmj4T.js} +30 -30
  120. package/dist/client/assets/{infra-billing-D1KoMmbQ.js → infra-billing-BvRWRRxZ.js} +1 -1
  121. package/dist/client/assets/{input-QUFhSscC.js → input-CIyJ4HN7.js} +1 -1
  122. package/dist/client/assets/{integration-icon-LCPobrom.js → integration-icon-DvJFOfr8.js} +1 -1
  123. package/dist/client/assets/{invite-member-dialog-wRttuYic.js → invite-member-dialog-D5zopJqm.js} +1 -1
  124. package/dist/client/assets/{label-D9i9PU0s.js → label-4Nq2Fh-z.js} +1 -1
  125. package/dist/client/assets/{layout-DbjEtQZu.js → layout-C__WxHXB.js} +1 -1
  126. package/dist/client/assets/{login-ChSdmill.js → login-FhUyb9NB.js} +1 -1
  127. package/dist/client/assets/{mcp-oauth-CB0oVlt7.js → mcp-oauth-CqM5PhIn.js} +1 -1
  128. package/dist/client/assets/{members-GVgpYvJM.js → members-DANjwLjo.js} +1 -1
  129. package/dist/client/assets/{monaco-editor-J99MCaCo.js → monaco-editor-tAwhDQSl.js} +1 -1
  130. package/dist/client/assets/{monitoring-stats-row-CONHvv1x.js → monitoring-stats-row-CjsEvjlw.js} +1 -1
  131. package/dist/client/assets/{multi-select--biO2XOR.js → multi-select-7dpY6EuU.js} +1 -1
  132. package/dist/client/assets/{oauth-callback-DNmXa-sP.js → oauth-callback-DVUZwoBU.js} +1 -1
  133. package/dist/client/assets/{oauth-callback-ai-provider-CimN18rl.js → oauth-callback-ai-provider-CWQf7_X9.js} +1 -1
  134. package/dist/client/assets/{onboarding-DX2vCW5K.js → onboarding-D76UKn1V.js} +1 -1
  135. package/dist/client/assets/{org-layout-eaYK8wif.js → org-layout-CfqzQQGz.js} +1 -1
  136. package/dist/client/assets/{organization-choice-B0EJOKA7.js → organization-choice-CE3dJ-wv.js} +1 -1
  137. package/dist/client/assets/{orgs-B62ePsZB.js → orgs-DETtrlb_.js} +1 -1
  138. package/dist/client/assets/{page-seo-form-B3lpujiJ.js → page-seo-form-Z-LtRcTB.js} +1 -1
  139. package/dist/client/assets/{popover-Ci4_tWvA.js → popover-By1YHGf3.js} +1 -1
  140. package/dist/client/assets/{post-editor-bZcgXLsB.js → post-editor-ksEzaq1h.js} +1 -1
  141. package/dist/client/assets/{primitives-D5_Ictax.js → primitives-X1lr8Oh6.js} +1 -1
  142. package/dist/client/assets/{profile-B9ZHih05.js → profile-hxqCEY9Q.js} +1 -1
  143. package/dist/client/assets/{project-app-view-CHfgPVtl.js → project-app-view-T8E4Y_ci.js} +1 -1
  144. package/dist/client/assets/record-editor-VbBiDztU.js +1 -0
  145. package/dist/client/assets/{redirect-editor-CMCOfxAl.js → redirect-editor-BqcdBvsi.js} +1 -1
  146. package/dist/client/assets/registry-B7GTrmpz.js +2 -0
  147. package/dist/client/assets/{registry-layout-DYbhPHER.js → registry-layout-DNw3pFDb.js} +1 -1
  148. package/dist/client/assets/{reports-fk3a_hk-.js → reports-2XvYUKs9.js} +1 -1
  149. package/dist/client/assets/{require-capability-CFznm9Vo.js → require-capability-DdJ1k03e.js} +1 -1
  150. package/dist/client/assets/{required-auth-layout-DDKLgrCs.js → required-auth-layout-CdBIJ3iu.js} +1 -1
  151. package/dist/client/assets/{reset-password-ucOxT5tW.js → reset-password-3AmEO8vU.js} +1 -1
  152. package/dist/client/assets/{roles-DOKChGgF.js → roles-xjHrNvFM.js} +1 -1
  153. package/dist/client/assets/{search-input-B3HainHg.js → search-input-BH_nXaUM.js} +1 -1
  154. package/dist/client/assets/{secrets-DiB6fpQO.js → secrets-DfSsS1f1.js} +1 -1
  155. package/dist/client/assets/{sections-editor-Ddhru0HH.js → sections-editor-CoJxpDrg.js} +1 -1
  156. package/dist/client/assets/{select-CAAExvF2.js → select-DHFcz3Sq.js} +1 -1
  157. package/dist/client/assets/{select-model-COi00Qc2.js → select-model-DF9gN0Rp.js} +1 -1
  158. package/dist/client/assets/{self-tool-result-BCMn3-y-.js → self-tool-result-DMfy5_-d.js} +1 -1
  159. package/dist/client/assets/{seo-editor-DXYFwL39.js → seo-editor-WfZNNdI4.js} +1 -1
  160. package/dist/client/assets/{settings-layout-u8-eewgs.js → settings-layout-Mkdt-j5C.js} +1 -1
  161. package/dist/client/assets/{settings-section-B50_pbBL.js → settings-section-CACVOiOT.js} +1 -1
  162. package/dist/client/assets/{shell-controls-5FN2bOK2.js → shell-controls-DI6mduOL.js} +1 -1
  163. package/dist/client/assets/{shell-layout-BzDcxKu_.js → shell-layout-LpGLVty1.js} +1 -1
  164. package/dist/client/assets/{sidebar-BBjg9obt.js → sidebar-B6N4L01u.js} +1 -1
  165. package/dist/client/assets/{skeleton-DaOsZD3E.js → skeleton-Ckv-naLE.js} +1 -1
  166. package/dist/client/assets/{spinner-BiEgTK64.js → spinner-BUjc9l5O.js} +1 -1
  167. package/dist/client/assets/{sso-CntWYR8q.js → sso-BpXPikXs.js} +1 -1
  168. package/dist/client/assets/{store-bcglShK-.js → store-a3HnIYA8.js} +1 -1
  169. package/dist/client/assets/store-registry-Ce3OY7Mq.js +2 -0
  170. package/dist/client/assets/{studio-tools-BKQiiGm_.js → studio-tools-CddBHJsY.js} +1 -1
  171. package/dist/client/assets/{switch-Cq8T9YU6.js → switch-D90h4UrV.js} +1 -1
  172. package/dist/client/assets/{synced-repos-CnW8V0RH.js → synced-repos-DdB2pmjC.js} +1 -1
  173. package/dist/client/assets/{tab-id-Dz9GTS6m.js → tab-id-BQb38pkN.js} +1 -1
  174. package/dist/client/assets/{table-DuJxV7wG.js → table-C4tfl8m7.js} +1 -1
  175. package/dist/client/assets/{tabs-DDz-V64-.js → tabs-CJVJjlim.js} +1 -1
  176. package/dist/client/assets/{textarea-DSK0cmwf.js → textarea-C9GZg-bi.js} +1 -1
  177. package/dist/client/assets/{toggle-group-B-0po5Sm.js → toggle-group-u0hcQltI.js} +1 -1
  178. package/dist/client/assets/{toolbar-BkeZkPG6.js → toolbar-DwtY6dmy.js} +1 -1
  179. package/dist/client/assets/{tooltip-CCw2rc-N.js → tooltip-BF5M3Sw2.js} +1 -1
  180. package/dist/client/assets/{track-C_gZtHW2.js → track-HO2G2wp9.js} +1 -1
  181. package/dist/client/assets/{types-Bbiq9OF8.js → types-CbCLAyu9.js} +1 -1
  182. package/dist/client/assets/{use-ai-providers-CMHb8eeO.js → use-ai-providers-CuHLenRK.js} +1 -1
  183. package/dist/client/assets/{use-api-keys-B5XPjfBR.js → use-api-keys-C2n2ey0Q.js} +1 -1
  184. package/dist/client/assets/{use-automations-D281hCxS.js → use-automations-CU74oY-F.js} +1 -1
  185. package/dist/client/assets/{use-autosave-Db4jyDfO.js → use-autosave-hszmfI4Q.js} +1 -1
  186. package/dist/client/assets/{use-capability-DVlvH4nJ.js → use-capability-Bb6HCxyG.js} +1 -1
  187. package/dist/client/assets/{use-clock-tick-C2aXJbpO.js → use-clock-tick-BNEO1MWa.js} +1 -1
  188. package/dist/client/assets/{use-commerce-diagnostic-BkAPEKGQ.js → use-commerce-diagnostic-BzP-Z_tk.js} +1 -1
  189. package/dist/client/assets/{use-connection-BOd54lqQ.js → use-connection-Dn--uyQL.js} +1 -1
  190. package/dist/client/assets/{use-copy-DvraSgSy.js → use-copy-DMIWbs_j.js} +1 -1
  191. package/dist/client/assets/{use-create-virtual-mcp-61GrIEL-.js → use-create-virtual-mcp-qDCG_d03.js} +1 -1
  192. package/dist/client/assets/{use-debounced-autosave-CSirrWhJ.js → use-debounced-autosave-B1e8NX0d.js} +1 -1
  193. package/dist/client/assets/{use-debounced-value-DT4rx-xW.js → use-debounced-value-Bp6jpgAg.js} +1 -1
  194. package/dist/client/assets/{use-decopilot-events-DICjmIrV.js → use-decopilot-events-BA2h4RqG.js} +1 -1
  195. package/dist/client/assets/{use-delete-connection-HVhVPo-x.js → use-delete-connection-BTOnBH9h.js} +1 -1
  196. package/dist/client/assets/{use-deployment-admin-Bxvx9x64.js → use-deployment-admin-B0EXtv3H.js} +1 -1
  197. package/dist/client/assets/{use-file-configs-kjM_f61B.js → use-file-configs-98b8RF9Q.js} +1 -1
  198. package/dist/client/assets/{use-infinite-scroll-n_k4dNsE.js → use-infinite-scroll-98l94dUz.js} +1 -1
  199. package/dist/client/assets/{use-infra-billing-BQ6LJ8Q9.js → use-infra-billing-ilZ0woTn.js} +1 -1
  200. package/dist/client/assets/{use-join-requests-2zijd4LS.js → use-join-requests-uqrl8ORv.js} +1 -1
  201. package/dist/client/assets/{use-mcp-client-CVI7A81s.js → use-mcp-client-h32VLkS1.js} +1 -1
  202. package/dist/client/assets/{use-mcp-tools-CzrK_N4T.js → use-mcp-tools-CCVvEjIG.js} +1 -1
  203. package/dist/client/assets/{use-members-Cn0TjDfQ.js → use-members-COoeaIvM.js} +1 -1
  204. package/dist/client/assets/{use-mobile-Doxs1lZc.js → use-mobile-VqZ3x1Sb.js} +1 -1
  205. package/dist/client/assets/{use-navigate-to-agent-5MjWsTRH.js → use-navigate-to-agent-BlvVaM8C.js} +1 -1
  206. package/dist/client/assets/{use-open-billing-url-B-ct7bqk.js → use-open-billing-url-20iJ00Ex.js} +1 -1
  207. package/dist/client/assets/{use-org-auth-client-CnC_ZcfG.js → use-org-auth-client-B8PvaTui.js} +1 -1
  208. package/dist/client/assets/{use-org-sso-Cibpu5jE.js → use-org-sso-nCIucebw.js} +1 -1
  209. package/dist/client/assets/{use-organization-roles-BXaTnuLk.js → use-organization-roles-OPv0k4P9.js} +1 -1
  210. package/dist/client/assets/{use-organization-settings-CpK185Z_.js → use-organization-settings-CzXI6T7w.js} +1 -1
  211. package/dist/client/assets/{use-registry-connections-C-CW_lkr.js → use-registry-connections-B6lkSEPQ.js} +1 -1
  212. package/dist/client/assets/{use-secrets-M_k0-nDT.js → use-secrets-DWy415cX.js} +1 -1
  213. package/dist/client/assets/{use-section-preview-base-D2ls-zqo.js → use-section-preview-base-rp31gOdp.js} +1 -1
  214. package/dist/client/assets/{use-status-sounds-CPMNTf96.js → use-status-sounds-BOdvrcda.js} +1 -1
  215. package/dist/client/assets/{use-tags-D0LzO9P6.js → use-tags-OGm2htvT.js} +1 -1
  216. package/dist/client/assets/{use-view-mode-DjVTG-K-.js → use-view-mode-CUmhZVK4.js} +1 -1
  217. package/dist/client/assets/{use-virtual-mcp-BTWH3swd.js → use-virtual-mcp-DvoAIhmm.js} +1 -1
  218. package/dist/client/assets/useInfiniteQuery-STmushV7.js +1 -0
  219. package/dist/client/assets/{useRouterState-CJU9SxDD.js → useRouterState-CZy-Bj98.js} +1 -1
  220. package/dist/client/assets/useSuspenseInfiniteQuery-CsXaFXTJ.js +1 -0
  221. package/dist/client/assets/{users-jqcODjPg.js → users-Bm9-U9sy.js} +1 -1
  222. package/dist/client/assets/{variant-calendar-DqKnSUCs.js → variant-calendar-C7XBwEkj.js} +1 -1
  223. package/dist/client/assets/{view-mode-toggle-ooqosrP6.js → view-mode-toggle-BGXsxqVL.js} +1 -1
  224. package/dist/client/index.html +1 -1
  225. package/dist/server/cli.js +1 -1
  226. package/dist/server/server.js +1 -1
  227. package/package.json +1 -1
  228. package/dist/client/assets/chat-context-BuWQJAhV.js +0 -35
  229. package/dist/client/assets/general-DPYF0KaF.js +0 -1
  230. package/dist/client/assets/record-editor-Dy4MmmwP.js +0 -1
  231. package/dist/client/assets/registry-BPoyeDb2.js +0 -2
  232. package/dist/client/assets/store-registry-3sr84HjS.js +0 -2
  233. package/dist/client/assets/useInfiniteQuery-Bn8GtXSi.js +0 -1
  234. package/dist/client/assets/useSuspenseInfiniteQuery-Bf9gAUxG.js +0 -1
@@ -2761,7 +2761,7 @@ Do NOT require review (requiresReview = false) when the changes are low-risk, su
2761
2761
  When unsure between the two, lean toward NOT requiring review for small frontend-only diffs, and toward requiring it for anything backend or large.
2762
2762
 
2763
2763
  Respond with the structured verdict and a short reason.`,jx$;var Px$=w(()=>{C4();XB();C51();HX6=_51.object({requiresReview:_51.boolean().describe("true if the changes should go through pull-request review"),reason:_51.string().describe("One short sentence explaining the decision (max ~120 chars)")});jx$={requiresReview:!1,reason:""}});function Ax$(){return process.env.GITHUB_API_BASE_URL??"https://api.github.com"}function Tx$($,Z){return $==="GET"&&!Z.includes("/git/blobs/")&&!Z.includes("/git/trees/")&&!Z.includes("/tarball/")}function Rx$($){let Z=Sh.get($);if(!Z)return;Sh.delete($),v51-=Z.bytes}function wX6($,Z,X){let Q;try{Q=JSON.stringify(X)?.length??0}catch{return}if(Rx$($),Q>BX6)return;Sh.set($,{etag:Z,body:X,bytes:Q}),v51+=Q;while(v51>OX6||Sh.size>UX6){let Y=Sh.keys().next().value;if(Y===void 0)break;Rx$(Y)}}function Ix$($){let{owner:Z,repo:X,accessToken:Q}=$,Y=`/repos/${Z}/${X}`,G=null;async function J(W,K,H,F){let N=`${Ax$()}${K}`,U=Tx$(W,K)?Sh.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 J6(O.status,W,K,L)}let B=O.status===204?void 0:await O.json();if(O.status===200&&Tx$(W,K)){let D=O.headers.get("etag");if(D)wX6(N,D,B)}return{status:O.status,json:B}}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/${H_(W)}`);return K.object.sha},async getTarballStream(W){let K=`${Y}/tarball/${H_(W)}`,H=await fetch(`${Ax$()}${K}`,{headers:{"User-Agent":"studio-decofile",Authorization:`token ${Q}`},signal:AbortSignal.timeout(60000)});if(!H.ok){let F=await H.text().catch(()=>"");throw new J6(H.status,"GET",K,F.slice(0,300))}if(!H.body)throw new J6(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 J6(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 J6(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/${H_(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/${H_(W)}...${H_(K)}`);return{aheadBy:H.ahead_by,behindBy:H.behind_by}},async compareDetailed(W,K){let{json:H}=await J("GET",`${Y}/compare/${H_(W)}...${H_(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 H_($){return $.split("/").map(encodeURIComponent).join("/")}var UX6=512,OX6=8388608,BX6=262144,Sh,v51=0,J6;var F_=w(()=>{Sh=new Map;J6=class J6 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 KP0($,Z,X){if(!X.connectionId)throw new J6(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 J6(401,"AUTH","connection","Project's GitHub connection is missing \u2014 reconnect GitHub");let Y=await DX6($,Q);if(!Y)throw new J6(401,"AUTH","connection",_Z);return Ix$({owner:X.owner,repo:X.name,accessToken:Y})}async function DX6($,Z){if(T5(Z)?.sourceConnectionId)return Rx($,Z);return(await bY({connectionId:Z.id,connectionUrl:Z.connection_url,tokenStorage:new M6($.db,$.vault)})).accessToken}var f51=w(()=>{zQ();b90();P3();kY();F_()});function LX6($){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 HP0($){if(LX6($))throw Error(`Invalid block key: ${$||"(empty)"}`)}function xr($){try{return decodeURIComponent($)}catch{return $}}function b51($){return HP0($),encodeURIComponent($)}function yr($){let Z=$.map((J)=>({file:J,name:`${J.stem}.json`})).sort((J,W)=>J.name<W.name?-1:J.name>W.name?1:0),X=[],Q=new Set,Y="{",G=!0;for(let{file:J}of Z){let W=J.content.trim();if(W.length===0)continue;let K=xr(J.stem);if(Q.has(K)){X.push({key:K,stem:J.stem,error:`duplicate block key "${K}" (another file already maps to it)`});continue}try{JSON.parse(W)}catch(H){X.push({key:K,stem:J.stem,error:H instanceof Error?H.message:String(H)});continue}if(Q.add(K),!G)Y+=",";G=!1,Y+=`${JSON.stringify(K)}:${W}`}return{decofile:`${Y}}`,skipped:X}}var qx$=()=>{};var FP0=w(()=>{qx$()});function EX6($){return $.startsWith("merged/")?"merged":"blobs"}function x51($,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=EX6(G);Y.entries.set(G,{bytes:J,area:W}),Y.totalBytes+=J,Y.areaBytes[W]+=J}return Y}function Mx$($,Z){let X=$.entries.get(Z);if(!X)return;$.entries.delete(Z),$.entries.set(Z,X)}function Vh($,Z){let X=$.entries.get(Z);if(!X)return;$.entries.delete(Z),$.totalBytes-=X.bytes,$.areaBytes[X.area]-=X.bytes}function kx$($,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)Vh($,U);return Vh($,X),$.entries.set(X,{bytes:Q,area:Y}),$.totalBytes+=Q,$.areaBytes[Y]+=Q,{admitted:!0,evict:F}}function gr($){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 y51($){return/^[0-9a-f]{40}$/.test($)}import{randomUUID as fx$}from"crypto";import{mkdir as hr,readdir as jX6,readFile as zX6,rename as PX6,rm as bx$,stat as xx$,statfs as AX6,unlink as TX6,writeFile as RX6}from"fs/promises";import{tmpdir as IX6}from"os";import{dirname as qX6,join as R7}from"path";function Ch($,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 SX6(){if(NP0)return NP0;let $=Bun.env.FAST_PREVIEW_CACHE_DIR,Z=$===void 0?R7(IX6(),"studio-fast-preview-cache"):$;return NP0={enabled:Z!=="",root:Z,index:{maxTotalBytes:Ch("FAST_PREVIEW_CACHE_MAX_BYTES",2*Sx$),maxMergedBytes:Ch("FAST_PREVIEW_CACHE_MERGED_MAX_BYTES",512*UP0),maxEntryBytes:{blobs:Ch("FAST_PREVIEW_CACHE_MAX_BLOB_BYTES",UP0),merged:Ch("FAST_PREVIEW_CACHE_MAX_MERGED_BYTES",32*UP0)}},freeFloorBytes:Ch("FAST_PREVIEW_CACHE_FREE_FLOOR_BYTES",Sx$),sweepIntervalMs:Ch("FAST_PREVIEW_CACHE_SWEEP_INTERVAL_MS",600000)},NP0}function VX6(){return{hits:{blobs:0,merged:0},misses:{blobs:0,merged:0},evictions:0,errors:0,floorSkips:0,invalidKeySkips:0,admissionRefusals:0}}function CX6(){if(Ww)return;Ww={hits:q$.createCounter("fast_preview_cache_hits",{description:"Decofile disk cache hits by area",unit:"{reads}"}),misses:q$.createCounter("fast_preview_cache_misses",{description:"Decofile disk cache misses by area",unit:"{reads}"}),evictions:q$.createCounter("fast_preview_cache_evictions",{description:"Decofile disk cache entries evicted",unit:"{entries}"}),errors:q$.createCounter("fast_preview_cache_errors",{description:"Decofile disk cache swallowed errors by operation",unit:"{errors}"}),floorSkips:q$.createCounter("fast_preview_cache_floor_skips",{description:"Decofile disk cache writes skipped by the free-space floor",unit:"{writes}"})},q$.createObservableGauge("fast_preview_cache_bytes",{description:"Decofile disk cache bytes by area",unit:"By"}).addCallback(($)=>{if(!_h)return;$.observe(_h.index.areaBytes.blobs,{area:"blobs"}),$.observe(_h.index.areaBytes.merged,{area:"merged"})}),q$.createObservableGauge("fast_preview_cache_entries",{description:"Decofile disk cache entry count by area",unit:"{entries}"}).addCallback(($)=>{if(!_h)return;let Z={blobs:0,merged:0};for(let X of _h.index.entries.values())Z[X.area]+=1;$.observe(Z.blobs,{area:"blobs"}),$.observe(Z.merged,{area:"merged"})})}function _X6($){N_.hits[$]+=1,Ww?.hits.add(1,{area:$})}function Vx$($){N_.misses[$]+=1,Ww?.misses.add(1,{area:$})}function g51(){N_.evictions+=1,Ww?.evictions.add(1)}function BN($){N_.errors+=1,Ww?.errors.add(1,{op:$})}function vX6($){N_.invalidKeySkips+=1,Ww?.errors.add(1,{op:`${$}_invalid_key`})}function h51(){return Cx$??=bX6(),Cx$}async function bX6(){let $=SX6();if(!$.enabled)return null;CX6();try{await hr(R7($.root,"blobs"),{recursive:!0}),await hr(R7($.root,"merged"),{recursive:!0}),await hr(R7($.root,"tmp"),{recursive:!0})}catch{return BN("init"),null}let Z=[];try{Z=await yx$($.root)}catch{BN("scan"),Z=[]}let X={root:$.root,index:x51(Z,$.index),cfg:$};return _h=X,gX6(X),X}async function OP0($){try{return await jX6($)}catch{return[]}}async function yx$($){let Z=[];for(let X of["blobs","merged"]){let Q=R7($,X);for(let Y of await OP0(Q)){let G=R7(Q,Y);for(let J of await OP0(G)){let W=R7(G,J);for(let K of await OP0(W))try{let H=await xx$(R7(W,K));if(!H.isFile())continue;Z.push({path:`${X}/${Y}/${J}/${K}`,bytes:H.size,mtimeMs:H.mtimeMs})}catch{}}}}return Z}function gx$($,Z,X){if(!y51(X))return null;try{return`blobs/${gr($)}/${gr(Z)}/${X}`}catch{return null}}function hx$($,Z,X){if(!y51(X))return null;try{return`merged/${gr($)}/${gr(Z)}/${X}.json`}catch{return null}}async function ux$($,Z){try{let X=await h51();if(!X)return null;if(Z===null)return Vx$($),null;try{let Q=await zX6(R7(X.root,Z),"utf8");return Mx$(X.index,Z),_X6($),Q}catch{return Vx$($),null}}catch{return BN(`get_${$}`),null}}function cx$($,Z,X){return ux$("blobs",gx$($,Z,X))}function lx$($,Z,X){return ux$("merged",hx$($,Z,X))}async function xX6($){if($.cfg.freeFloorBytes<=0)return!0;try{let Z=await AX6($.root);return Z.bavail*Z.bsize>=$.cfg.freeFloorBytes}catch{return!0}}async function BP0($){try{await TX6($)}catch{}}async function yX6($){try{let Z=$.cfg.index.maxTotalBytes/2;while($.index.totalBytes>Z){let X=$.index.entries.keys().next();if(X.done)break;Vh($.index,X.value),await BP0(R7($.root,X.value)),g51()}}catch{BN("emergency_evict")}}async function dx$($,Z,X,Q){try{let Y=await h51();if(!Y)return;if(X===null){vX6(Z);return}if(!await xX6(Y)){N_.floorSkips+=1,Ww?.floorSkips.add(1);return}let G=Buffer.byteLength(Q,"utf8"),J=kx$(Y.index,{path:X,bytes:G,area:$});if(!J.admitted){N_.admissionRefusals+=1;return}for(let K of J.evict)await BP0(R7(Y.root,K)),g51();let W=R7(Y.root,"tmp",`stage-${fx$()}`);try{await RX6(W,Q,"utf8");let K=R7(Y.root,X);await hr(qX6(K),{recursive:!0}),await PX6(W,K)}catch(K){if(Vh(Y.index,X),await BP0(W),BN(Z),K?.code==="ENOSPC")await yX6(Y)}}catch{BN(Z)}}function wP0($,Z,X,Q){return dx$("blobs","put_blob",gx$($,Z,X),Q)}function mx$($,Z,X,Q){return dx$("merged","put_merged",hx$($,Z,X),Q)}async function ix$(){try{let $=await h51();if(!$)return null;let Z=R7($.root,"tmp",fx$());return await hr(Z,{recursive:!0}),Z}catch{return BN("make_scratch"),null}}async function px$($){try{await bx$($,{recursive:!0,force:!0})}catch{BN("remove_scratch")}}function gX6($){let Z=$.cfg.sweepIntervalMs;if(Z<=0)return;_x$=new AbortController,I$(Math.random()*Z,{signal:_x$.signal}).then(()=>{vx$($);let X=setInterval(()=>void vx$($),Z);X.unref?.(),fX6=X}).catch(()=>{})}async function vx$($){try{let Z=x51(await yx$($.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;Vh(Z,G),await BP0(R7($.root,G)),g51()}$.index=Z;let Q=R7($.root,"tmp"),Y=Date.now();for(let G of await OP0(Q)){let J=R7(Q,G);try{let W=await xx$(J);if(Y-W.mtimeMs>kX6)await bx$(J,{recursive:!0,force:!0})}catch{}}}catch{BN("sweep")}}var MX6=1024,UP0,Sx$,kX6=3600000,NP0=null,Ww=null,N_,Cx$=null,_h=null,fX6=null,_x$=null;var nx$=w(()=>{t4();f6();UP0=1024*MX6,Sx$=1024*UP0;N_=VX6()});function tx$(){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 hX6,stat as uX6}from"fs/promises";import{join as ox$}from"path";function cX6($,Z,X){let Q=["-xz","--strip-components=1","-C",Z];return $==="gnu"?[...Q,"--wildcards",X]:[...Q,X]}function lX6(){return rx$??=(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"}})(),rx$}async function ax$($,Z,X){let Q=X.replace(/^\.\//,"").replace(/^\/+/,"").replace(/\/+$/,"");if(Q===""||Q.split("/").includes(".."))throw new ur(`invalid blocks path prefix: ${X}`);let Y=await lX6(),G=`*/${Q}/*.json`,J=()=>Bun.spawn(["tar",...cX6(Y,Z,G)],{stdin:$,stdout:"ignore",stderr:"pipe"}),W;try{W=J()}catch(N){throw new ur("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 ur(`tar exited with code ${H}${N?`: ${N}`:""}`)}let F=await dX6(Z,Q);if(F.length===0)throw new ur(`tar extracted no ${G} members into ${Z}`);return F}async function dX6($,Z){let X=ox$($,...Z.split("/")),Q;try{Q=await hX6(X)}catch{return[]}let Y=[];for(let G of Q){if(!G.endsWith(".json"))continue;let J=ox$(X,G);try{if(!(await uX6(J)).isFile())continue}catch{continue}Y.push({path:`${Z}/${G}`,diskPath:J})}return Y.sort((G,J)=>G.path.localeCompare(J.path))}var ur,rx$=null;var sx$=w(()=>{ur=class ur extends Error{constructor($,Z){super($,Z);this.name="TarExtractError"}}});import{createHash as mX6}from"crypto";import{readFile as iX6}from"fs/promises";async function cr($,Z){try{return await $.getHeadSha(Z)}catch(Q){if(!(Q instanceof J6)||Q.status!==404)throw Q}let X=await $.getHeadSha(await $.getDefaultBranch());try{return await $.createRef(Z,X),X}catch(Q){if(Q instanceof J6&&Q.status===422)return $.getHeadSha(Z);throw Q}}function nX6(){let $=Bun.env.FAST_PREVIEW_COLD_TARBALL_MAX_BYTES;if($===void 0||$==="")return $y$;let Z=Number($);return Number.isFinite(Z)&&Z>=0?Math.floor(Z):$y$}function tX6($){Zy$??=q$.createCounter("decofile_cold_reads",{description:"Decofile cold snapshot reads by resolution path",unit:"{reads}"}),Zy$.add(1,{path:$})}function oX6($){Xy$??=q$.createCounter("decofile_skipped_blocks",{description:"Decofile blocks dropped from a merge for not being valid JSON",unit:"{blocks}"}),Xy$.add($)}async function DP0($,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 LP0($){return $?`${$}/.deco/blocks`:".deco/blocks"}function u51($,Z){let X=`${LP0(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 c51($,Z){return $.filter((X)=>xr(X.stem)===Z).map((X)=>X.path).sort()}function Qy$($,Z,X,Q){return wP0($,Z,X,Q)}function aX6($,Z){return mX6("sha1").update(`${rX6}:${$}:${Z??""}`).digest("hex")}async function Yy$($,Z,X,Q){let Y=Q?.createBranchIfMissing?await cr($,Z):await $.getHeadSha(Z);return sX6.run(`${$.owner}/${$.repo}@${Y}:${X??""}`,()=>eX6($,Y,X))}async function eX6($,Z,X){let{owner:Q,repo:Y}=$,G=aX6(Z,X),J=await lx$(Q,Y,G);if(J!==null)return{sha:Z,decofile:J};let W=await $.getCommitTreeSha(Z),K=await $.getTreeRecursive(W),H=u51(K,X),F=new Map;if(await DP0(H,ex$,async(D)=>{let L=await cx$(Q,Y,D.sha);if(L!==null)F.set(D.path,L)}),H.length-F.size>pX6){let D=await $Q6($,Z,X,H);if(tX6(D!==null?"tarball":"blobs"),D!==null)for(let[L,E]of D)F.set(L,E)}let U=await DP0(H,ex$,async(D)=>{let L=F.get(D.path);if(L!==void 0)return{stem:D.stem,content:L};let E=await $.getBlobText(D.sha);return await wP0(Q,Y,D.sha,E),{stem:D.stem,content:E}}),{decofile:O,skipped:B}=yr(U);if(B.length>0)oX6(B.length),console.warn("decofile read: dropped blocks that were not valid JSON",{repo:`${Q}/${Y}`,sha:Z,packagePath:X,blocks:B.map((D)=>D.key)});return await mx$(Q,Y,G,O),{sha:Z,decofile:O}}async function $Q6($,Z,X,Q){let Y=`${$.owner}/${$.repo}`,G=nX6(),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 ix$();if(W===null)return null;try{let K=await $.getTarballStream(Z),H=await ax$(K,W,LP0(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 B=await iX6(U.diskPath,"utf8");await wP0($.owner,$.repo,O,B),N.set(U.path,B)}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 px$(W)}}var ex$=12,pX6=50,$y$=134217728,Zy$=null,Xy$=null,rX6="3",sX6;var EP0=w(()=>{FP0();f6();nx$();F_();sx$();sX6=tx$()});async function jP0($,Z){let X=await $.getDefaultBranch(),Q=await cr($,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 zP0($,Z,X){let Q=X??await $.getDefaultBranch(),Y=await $.compareDetailed(Q,Z),G=Y.files.slice(0,ZQ6),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 DP0(G,XQ6,async(F)=>{let N=F.previousFilename??F.filename,U=F.status==="added"?void 0:K.get(N),O=U?await $.getBlobText(U):null,B=F.status==="removed"?null:await $.getBlobText(F.sha);return[F.filename,{from:O,to:B}]});return{diffs:Object.fromEntries(H),mergeBaseSha:Y.mergeBaseSha}}async function Gy$($,Z,X,Q="fail"){try{await $.mergeBranch(Z,X,`chore(decofile): merge ${X} into ${Z}`);return}catch(Y){if(!(Y instanceof J6&&Y.status===409))throw Y;if(Q!=="branch-wins")throw new J6(409,"POST","merges",`Merge conflict updating ${Z} from ${X} \u2014 resolve on GitHub`)}await GQ6($,Z,X)}function YQ6($,Z){let X=new Map;for(let Q of $){let Y=Z.get(Q.filename);X.set(Q.filename,{path:Q.filename,mode:"100644",type:"blob",sha:Q.status==="removed"||!Y?null:Y.sha})}for(let Q of $)if(Q.previousFilename&&Q.previousFilename!==Q.filename&&!X.has(Q.previousFilename))X.set(Q.previousFilename,{path:Q.previousFilename,mode:"100644",type:"blob",sha:null});return[...X.values()]}async function Wy$($,Z,X){if(X.length===0)return;let Q=await $.getDefaultBranch();for(let Y=1;;Y++){let G=await $.getHeadSha(Z),{mergeBaseSha:J}=await $.compareDetailed(Q,Z),[W,K]=await Promise.all([$.getTreeRecursive(await $.getCommitTreeSha(J)),$.getTreeRecursive(await $.getCommitTreeSha(G))]),H=new Map(W.filter((B)=>B.type==="blob").map((B)=>[B.path,B])),F=new Map(K.filter((B)=>B.type==="blob").map((B)=>[B.path,B])),N=[];for(let B of X){let D=H.get(B),L=F.get(B);if(D?.sha===L?.sha)continue;if(!D&&!L)continue;N.push({path:B,mode:"100644",type:"blob",sha:D?.sha??null})}if(N.length===0)return;let U=await $.createTree(await $.getCommitTreeSha(G),N),O=await $.createCommit({message:`chore(decofile): discard changes to ${N.length} file(s)`,treeSha:U,parentShas:[G]});try{await $.updateRef(Z,O);return}catch(B){if(B instanceof J6&&B.status===422&&Y<Jy$)continue;throw B}}}async function GQ6($,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>=QQ6)throw new J6(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=YQ6(J,K),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 J6&&U.status===422&&Q<Jy$)continue;throw U}}}var ZQ6=200,XQ6=12,QQ6=300,Jy$=3;var Ky$=w(()=>{F_();EP0()});function WQ6($){if(!$||$.includes(".."))return!1;return JQ6.test($)}function Hy$($){let Z=typeof $.__resolveType==="string"?$.__resolveType:null;if(!Z||!WQ6(Z))return null;let{__resolveType:X,...Q}=$;return{resolveType:Z,payload:Q}}function Fy$($,Z){return`${$.replace(/\/+$/,"")}/deco/invoke/${Z}`}var JQ6;var Ny$=w(()=>{JQ6=/^[\w./@-]+$/});function l51($){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 lr($,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 Uy$($,Z,X,Q){if(!Q.connectionId)throw new U_("Push requires a connected GitHub account. Connect mcp-github for this project and restart the sandbox.");let Y=$.organization?.id;if(!Y)throw new U_(_Z);await xO({ctx:$,connectionId:Q.connectionId,organizationId:Y,forceRefresh:!0,onLegacyMintError:(F)=>{let N=F instanceof Error?F.message:_Z;throw new U_(N)}});let{cloneUrl:G,gitUserName:J,gitUserEmail:W}=await yO(Q.connectionId,Q.owner,Q.name,$.db,$.vault).catch((F)=>{let{code:N,message:U}=T8$(F instanceof Error?F.message:String(F));throw N?new U_(U):F}),K=kh($),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 $B(H,KQ6).catch(()=>H.statusText);throw Error(`Failed to refresh sandbox git credentials (${H.status}): ${F}`)}}var KQ6=10485760,U_;var d51=w(()=>{P3();WP0();zp();Ed0();Ix();U_=class U_ extends Error{constructor($){super($);this.name="GitPushAuthError"}}});function FQ6($){let Z=$.startsWith("thread:")?$.slice(7):$;if(!Z||Z.length>255||Z.includes("..")||Z.startsWith("/")||Z.endsWith("/")||Z.endsWith(".lock")||!HQ6.test(Z))throw Error(`Invalid branch name: ${$}`)}function O_($){return AbortSignal.any([$.req.raw.signal,AbortSignal.timeout(UQ6)])}function OQ6($,Z,X){let Q=O5($)[Z]?.[X];return!!Q&&Object.keys(jY(Q)).length>0}function B_($){let{runner:Z}=$.get("vmClaim");if(!Z)return $.json({error:"No sandbox runner configured"},503);return Z}async function vh($){let{virtualMcpMetadata:Z,connectionIds:X}=$.get("vmClaim"),Q=$.var.studioContext,Y=lr(Z,X);if(!Y)throw new J6(404,"AUTH","repo","Project has no GitHub repository");let G=t(Q);return KP0(Q,G.id,Y)}function m51($,Z){if(Z instanceof J6){let Q=Z.status===404?404:Z.status===409||Z.status===422?409:502;return $.json({error:Z.message},Q,d5)}let X=Z instanceof Error?Z.message:String(Z);return $.json({error:X},502,d5)}async function wy$($){try{let Z=await vh($),X=await jP0(Z,$.get("vmClaim").branch);return $.json(X,200,d5)}catch(Z){return m51($,Z)}}function dr($,Z){let Q=(PP0.get($)??Promise.resolve()).catch(()=>{}).then(Z),Y=Q.catch(()=>{});return PP0.set($,Y),Y.finally(()=>{if(PP0.get($)===Y)PP0.delete($)}),Q}async function cZ($,Z,X){if($.get("vmClaim").fastPreview)return $.json({error:"sandbox not found: Fast Preview projects are sandbox-less"},404,d5);let Q=B_($);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",...d5}})}}let B=await O.text(),D=X?.redactRepoDirUnlessDesktop&&Q.kind!=="user-desktop"?wQ6(B):B,L=O.headers.get("content-type")??"application/json";return new Response(D,{status:O.status,headers:{"content-type":L,...d5}})};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 B=O instanceof Error?O.message:String(O);return $.json({error:`Daemon unreachable: ${B}`},502)}}function wQ6($){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 AP0($,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 DQ6($){return Dy$.includes($)}var HQ6,Oy$=524288,NQ6=65536,UQ6=1e4,By$=2000,BQ6,PP0,d5,Dy$,Ly$=()=>{let $=new U1;$.use("/:virtualMcpId/:branch/*",BQ6),$.post("/:virtualMcpId/:branch/write",(X)=>cZ(X,"/_sandbox/write",{forwardJsonBody:!0,signal:O_(X)})),$.post("/:virtualMcpId/:branch/unlink",(X)=>cZ(X,"/_sandbox/unlink",{forwardJsonBody:!0,signal:O_(X)})),$.post("/:virtualMcpId/:branch/mkdir",(X)=>cZ(X,"/_sandbox/mkdir",{forwardJsonBody:!0,signal:O_(X)})),$.post("/:virtualMcpId/:branch/rename",(X)=>cZ(X,"/_sandbox/rename",{forwardJsonBody:!0,signal:O_(X)})),$.post("/:virtualMcpId/:branch/read",(X)=>cZ(X,"/_sandbox/read",{forwardJsonBody:!0,signal:O_(X)})),$.post("/:virtualMcpId/:branch/glob",(X)=>cZ(X,"/_sandbox/glob",{forwardJsonBody:!0,signal:O_(X)})),$.post("/:virtualMcpId/:branch/grep",(X)=>cZ(X,"/_sandbox/grep",{forwardJsonBody:!0,signal:O_(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 cZ(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 cZ(X,`/_sandbox/exec/${encodeURIComponent(Q)}/kill`)}),$.get("/:virtualMcpId/:branch/config",(X)=>cZ(X,"/_sandbox/config",{method:"GET",map404to410:!0,redactRepoDirUnlessDesktop:!0})),$.put("/:virtualMcpId/:branch/config",(X)=>cZ(X,"/_sandbox/config",{method:"PUT",forwardJsonBody:!0,map404to410:!0})),$.post("/:virtualMcpId/:branch/setup/:step",async(X)=>{let Q=X.req.param("step");if(!Q||!DQ6(Q))return X.json({error:`step must be one of: ${Dy$.join(", ")}`},400);if(Q==="start"){let Y=X.get("vmClaim");if(Y.runner){let G=t(X.var.studioContext),J=lx(Y.virtualMcpMetadata);try{await OO0({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 cZ(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 ON(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 Ox$(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 wy$(X);return Z(X)});let Z=(X)=>cZ(X,"/_sandbox/git/status",{method:"GET",map404to410:!0,signal:AbortSignal.any([X.req.raw.signal,AbortSignal.timeout(By$)])});return $.post("/:virtualMcpId/:branch/git/status",(X)=>{if(X.get("vmClaim").fastPreview)return wy$(X);return cZ(X,"/_sandbox/git/status",{map404to410:!0,signal:AbortSignal.any([X.req.raw.signal,AbortSignal.timeout(By$)])})}),$.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 vh(X),J=await zP0(G,Q.branch,Y.base);return X.json(J,200,d5)}catch(Y){return m51(X,Y)}return cZ(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,d5);let Q=B_(X);if(Q instanceof Response)return Q;let{claimName:Y,virtualMcpMetadata:G,connectionIds:J}=X.get("vmClaim"),W=X.var.studioContext;return dr(Y,async()=>{try{await I51(W,Q,Y);let K=lr(G,J);if(K)await Uy$(W,Q,Y,K)}catch(K){if(K instanceof U_)return X.json({error:K.message},403,d5);let H=K instanceof Error?K.message:String(K);return X.json({error:H},502,d5)}return cZ(X,"/_sandbox/git/publish",{forwardJsonBody:!0,map404to410:!0})})}),$.post("/:virtualMcpId/:branch/git/discard",async(X)=>{let Q=X.get("vmClaim");if(Q.fastPreview)return dr(Q.claimName,async()=>{let Y=await X.req.json().catch(()=>({})),G=Array.isArray(Y.filepaths)?Y.filepaths.filter((J)=>typeof J==="string"):[];if(G.length===0)return X.json({error:"filepaths is required"},400,d5);try{let J=await vh(X);return await Wy$(J,Q.branch,G),X.json({ok:!0},200,d5)}catch(J){let W=J instanceof J6&&J.status===409?409:502,K=J instanceof Error?J.message:String(J);return X.json({error:K},W,d5)}});return dr(Q.claimName,()=>cZ(X,"/_sandbox/git/discard",{forwardJsonBody:!0,map404to410:!0}))}),$.post("/:virtualMcpId/:branch/git/rebase",async(X)=>{let Q=X.get("vmClaim");if(Q.fastPreview)return dr(Q.claimName,async()=>{try{let W=await X.req.json().catch(()=>({})),K=await vh(X),H=W.base??await K.getDefaultBranch();return await Gy$(K,Q.branch,H,W.onConflict==="branch-wins"?"branch-wins":"fail"),X.json({ok:!0},200,d5)}catch(W){return m51(X,W)}});let Y=B_(X);if(Y instanceof Response)return Y;let{claimName:G}=X.get("vmClaim"),J=X.var.studioContext;return dr(G,async()=>{try{await I51(J,Y,G)}catch(W){let K=W instanceof Error?W.message:String(W);return X.json({error:K},502,d5)}return cZ(X,"/_sandbox/git/rebase",{forwardJsonBody:!0,map404to410:!0})})}),$.post("/:virtualMcpId/:branch/git/suggest-commit",wZ({maxSize:Oy$,onError:(X)=>X.json({error:"Payload too large"},413,d5)}),async(X)=>{let Q=X.get("vmClaim"),Y=null;if(!Q.fastPreview){let H=B_(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,B]=k51(F)&&U?[F,N]:Y?await Promise.all([AP0(Y,G,"/_sandbox/git/status","GET",{userId:J,projectRef:W}),AP0(Y,G,"/_sandbox/git/diff","GET",{userId:J,projectRef:W})]):await(async()=>{let L=await vh(X);return Promise.all([jP0(L,Q.branch),zP0(L,Q.branch)])})(),D=await Ex$(K,O,B);return X.json(D,200,d5)}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,d5);return X.json({error:F},502,d5)}}),$.post("/:virtualMcpId/:branch/git/judge-review",wZ({maxSize:Oy$,onError:(X)=>X.json({error:"Payload too large"},413,d5)}),async(X)=>{let Q=X.get("vmClaim"),Y=null;if(!Q.fastPreview){let H=B_(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,B]=k51(F)&&U?[F,N]:Y?await Promise.all([AP0(Y,G,"/_sandbox/git/status","GET",{userId:J,projectRef:W}),AP0(Y,G,"/_sandbox/git/diff","GET",{userId:J,projectRef:W})]):await(async()=>{let L=await vh(X);return Promise.all([jP0(L,Q.branch),zP0(L,Q.branch)])})(),D=await zx$(K,O,B,typeof H.language==="string"?H.language:void 0);return X.json(D,200,d5)}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,d5);return X.json({error:F},502,d5)}}),$.get("/:virtualMcpId/:branch/preview-fetch",async(X)=>{let Q=B_(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=l51(`${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",wZ({maxSize:NQ6,onError:(X)=>X.json({error:"Payload too large"},413)}),async(X)=>{let Q=B_(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=Hy$(J);if(!W)return X.json({error:"Invalid or missing __resolveType"},400);let K=Fy$(G,W.resolveType),H=l51(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 Ey$=w(()=>{C8();Xw();Mh();R51();BF();Nx$();M3();lX();F8();LB0();rO();Ux$();Bx$();gi0();Ep();C51();Px$();f51();F_();Ky$();Ny$();d51();HQ6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;BQ6=JP0(async($,Z)=>{let X=$.var.studioContext;try{s(X)}catch{return $.json({error:"Unauthorized"},401)}let Q=W1(X);if(!Q)return $.json({error:"Unauthorized"},401);let Y;try{Y=t(X)}catch{return $.json({error:"Organization scope required"},403)}let G=$.req.param("virtualMcpId"),J=$.req.param("branch");if(!G||!J)return $.json({error:"virtualMcpId and branch are required"},400);try{FQ6(J)}catch(O){let B=O instanceof Error?O.message:String(O);return $.json({error:B},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=hi({orgId:Y.id,virtualMcpId:G,branch:J}),H=await RF(X,J,Q),F=Fx$({userId:H,projectRef:K}),N=W.metadata??null;if(u3$(N).fastPreviewCapability&&!OQ6(N,H,J))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 tX(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()});PP0=new Map;d5={"Cache-Control":"no-store, no-cache, must-revalidate",Pragma:"no-cache"};Dy$=["clone","install","start"]});function jy$($,Z,X){let Q=i51.get($);if(!Q)Q={pending:null,running:!1},i51.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)EQ6($,Q);return G}async function EQ6($,Z){Z.running=!0;try{while(Z.pending){let X=Z.pending;Z.pending=null;try{let Q=await jQ6(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)i51.delete($)}}async function jQ6($){let{client:Z,branch:X,packagePath:Q}=$.deps;for(let Y=0;;Y++){let G=await cr(Z,X),J=await Z.getCommitTreeSha(G),W=await Z.getTreeRecursive(J),K=u51(W,Q),H=[],F=new Map(K.map((B)=>[B.path,{stem:B.stem,sha:B.sha}]));for(let[B,D]of $.set){let L=c51(K,B),E=`${JSON.stringify(D,null,2)}
2764
- `,j=await Z.createBlob(E);await Qy$(Z.owner,Z.repo,j,E);let z=L[0]??`${LP0(Q)}/${b51(B)}.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 B of $.del)for(let D of c51(K,B))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((B)=>B.type==="blob"&&B.path===N)){let B=await Promise.all([...F.values()].map(async(j)=>({stem:j.stem,content:j.content??await Z.getBlobText(j.sha)}))),{decofile:D,skipped:L}=yr(B);if(L.length>0)console.warn("decofile gen: dropped blocks that were not valid JSON",{repo:`${Z.owner}/${Z.repo}`,branch:X,packagePath:Q,blocks:L.map((j)=>j.key)});let E=await Z.createBlob(D);H.push({path:N,mode:"100644",type:"blob",sha:E})}let U=await Z.createTree(J,H),O=await Z.createCommit({message:zQ6($),treeSha:U,parentShas:[G]});try{return await Z.updateRef(X,O),O}catch(B){if(!(B instanceof J6&&B.status===422)||Y>=LQ6-1)throw B;await I$(mZ(2000,200,Y,2,0.5))}}}function zQ6($){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 Hd0(Q,$.deps.coAuthor)}var LQ6=3,i51;var zy$=w(()=>{GO0();FP0();t4();F_();EP0();i51=new Map});import{createHmac as Py$,randomBytes as PQ6,timingSafeEqual as AQ6}from"crypto";function Ay$(){if(TP0)return TP0;let $;try{let Z=b0();$=Z.studioJwtSecret??Z.betterAuthSecret}catch{$=void 0}return TP0=$?Buffer.from($):PQ6(32),TP0}function p51($){let Z=$.nowMs??Date.now(),X={o:$.organizationId,m:$.virtualMcpId,b:$.branch,e:Math.floor((Z+TQ6)/1000)},Q=Buffer.from(JSON.stringify(X)).toString("base64url"),Y=Py$("sha256",Ay$()).update(Q).digest("base64url");return`${Q}.${Y}`}function Ty$($,Z){let X=$.indexOf(".");if(X<0)return!1;let Q=$.slice(0,X),Y=Buffer.from($.slice(X+1)),G=Buffer.from(Py$("sha256",Ay$()).update(Q).digest("base64url"));if(Y.length!==G.length||!AQ6(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 TQ6=21600000,TP0=null;var Ry$=w(()=>{A$()});import{z as fh}from"zod";function IQ6($){return $.length>0&&$.length<=255&&!$.includes("..")&&!$.endsWith("/")&&!$.endsWith(".lock")&&RQ6.test($)}function qy$($){return $.req.header("x-forwarded-host")??new URL($.req.url).host}async function RP0($){let Z=$.get("decofileScope");return KP0($.var.studioContext,Z.organizationId,Z.githubRepo)}function IP0($,Z){if(Z instanceof J6){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 My$(){let $=new U1;return $.use("/:virtualMcpId/:branch",Iy$),$.use("/:virtualMcpId/:branch/*",Iy$),$.get("/:virtualMcpId/:branch",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await RP0(Z),Y=await Yy$(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=p51({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.body(`{"version":${JSON.stringify(Y.sha)},"token":${JSON.stringify(J)},"apiHost":${JSON.stringify(qy$(Z))},"decofile":${Y.decofile}}`,200,{...G,"content-type":"application/json"})}catch(Q){return IP0(Z,Q)}}),$.patch("/:virtualMcpId/:branch",async(Z)=>{let X=Z.get("decofileScope"),Q=Z.var.studioContext,Y=qQ6.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{HP0(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 RP0(Z),W=await jy$(`${X.organizationId}/${X.virtualMcpId}/${X.branch}`,{client:J,branch:X.branch,packagePath:X.packagePath,coAuthor:kh(Q)},G),K=p51({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.json({version:W,token:K,apiHost:qy$(Z)})}catch(J){return IP0(Z,J)}}),$.post("/:virtualMcpId/:branch/publish",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await RP0(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 J6&&G.status===409)return Z.json({error:"merge-conflict"},409);if(G instanceof J6&&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 IP0(Z,Q)}}),$.get("/:virtualMcpId/:branch/status",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await RP0(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 J6&&G.status===404)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0});throw G}}catch(Q){return IP0(Z,Q)}}),$}var RQ6,qQ6,Iy$;var ky$=w(()=>{FP0();C8();R51();WP0();d51();f51();zy$();Ry$();F_();EP0();RQ6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;qQ6=fh.object({set:fh.record(fh.string(),fh.unknown()).optional(),delete:fh.array(fh.string()).optional()}).refine(($)=>Object.keys($.set??{}).length>0||($.delete?.length??0)>0,{message:"Patch must set or delete at least one block"}),Iy$=JP0(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(!IQ6(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||!Ty$(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(!DB0(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=lr(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 Sy$=($)=>{let Z=new U1;if(Z.use("*",X_),Z.route("/",Tz0()),Z.route("/",a_$()),Z.route("/",ab$()),Z.route("/",tb$()),Z.route("/",QP0()),Z.route("/tools",Yx$()),Z.route("/",Zx$()),Z.route("/",Vb$({kvStorage:$.kvStorage})),Z.route("/",kb$()),Z.route("/fs",cb$({getConnection:$.getNatsConnection})),Z.route("/sandbox",Ly$()),Z.route("/decofile",My$()),Z.route("/",ib$()),Z.route("/deco-sites",Iz0()),Z.route("/sso",Lz0()),Z.route("/",YP0({tokenStorage:$.tokenStorage,automationEventDispatcher:$.automationEventDispatcher})),Z.route("/webhooks",d_$()),$.mountDevAssets)Z.route("/dev-assets",qz0({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("/",MV$()),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",db$()),Z.route("/mcp",Cw0()),Z.route("/mcp/self",XP0()),Z.route("/mcp",fw0()),Z.all("/oauth-proxy/:connectionId/*",$.oauthProxyHandler),Z.get("/watch",$.watchHandler),Z};var Vy$=w(()=>{C8();p41();m_$();r41();Mz0();Hr();m41();Sb$();Cb$();lb$();Ln();x41();bw0();L51();mb$();pb$();ob$();sb$();Xx$();j51();Gx$();z51();_w0();Ey$();ky$()});function MQ6($){return $.filter((Z)=>Z.vendors?.alias).map((Z)=>({name:Z.name,title:Z.title,description:Z.description,logo:Z.logo,category:Z.category,vendor:{alias:Z.vendors.alias,url:Z.vendors.url}}))}var kQ6=async($,Z)=>{if(!$.get("studioContext").auth.user?.id)return $.json({error:"Unauthorized"},401);return Z()},Cy$=()=>{let $=new U1;return $.use("*",kQ6),$.get("/",async(Z)=>{let X=b0(),Q=X.decoSupabaseUrl,Y=X.decoSupabaseServiceKey;if(!Q||!Y)return Z.json({apps:[]});try{let G=await uZ(Q,Y,"apps?select=name,title,description,logo,category,vendors(alias,url)");return Z.json({apps:MQ6(G)})}catch(G){return console.error("[deco-apps] GET error:",G),Z.json({error:"Failed to fetch apps"},502)}}),$};var _y$=w(()=>{C8();A$();Ij0()});import{z as M1}from"zod";function tK($,Z="invalid_request_error",X=null,Q=null){return{error:{message:$,type:Z,param:X,code:Q}}}function gQ6($){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 hQ6($,Z,X){try{return JSON.parse($)}catch{throw new by$(`Invalid JSON in tool call arguments for function '${X}' (tool_call_id: ${Z}): ${$}`)}}function uQ6($){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:hQ6(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 cQ6($){let Z=$.map((X)=>{let Q=X.function.parameters?vY(X.function.parameters):vY({type:"object",properties:{}});return[X.function.name,f$({description:X.function.description,inputSchema:Q})]});return Object.fromEntries(Z)}function lQ6($){if(!$)return;return{openai:{response_format:$}}}function dQ6(){return`chatcmpl-${crypto.randomUUID().replace(/-/g,"").substring(0,29)}`}function vy$($,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 fy$($){if($==="tool-calls")return"tool_calls";if($==="length")return"length";return"stop"}var SQ6=256,VQ6,CQ6,_Q6,vQ6,fQ6,bQ6,xQ6,yQ6,by$,xy$,yy$;var gy$=w(()=>{C4();C8();Mh();nF();VQ6=M1.object({type:M1.literal("function"),function:M1.object({name:M1.string(),description:M1.string().optional(),parameters:M1.record(M1.string(),M1.unknown()).optional()})}),CQ6=M1.object({id:M1.string(),type:M1.literal("function"),function:M1.object({name:M1.string(),arguments:M1.string()})}),_Q6=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(CQ6).optional()}),M1.object({role:M1.literal("tool"),content:M1.string(),tool_call_id:M1.string()})]),vQ6=M1.object({type:M1.literal("text")}),fQ6=M1.object({type:M1.literal("json_object")}),bQ6=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()})}),xQ6=M1.union([vQ6,fQ6,bQ6]),yQ6=M1.object({model:M1.string().describe("Format: 'model_id' or 'credential_id:model_id'"),messages:M1.array(_Q6),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(VQ6).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:xQ6.optional(),user:M1.string().optional()});by$=class by$ extends Error{constructor($){super($);this.name="MessageConversionError"}};xy$=new U1;xy$.post("/:org/v1/chat/completions",async($)=>{let Z=$.get("studioContext"),X=$.req.param("org");try{if(!Z.auth.apiKey?.id)return $.json(tK("API key authentication required. Provide a valid API key via Authorization header.","authentication_error"),401);if(!Z.organization)return $.json(tK("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(tK("Organization mismatch. The API key's organization does not match the requested organization.","invalid_request_error","organization"),403);let Q=await $.req.json(),Y=yQ6.safeParse(Q);if(!Y.success){let L=Y.error.issues[0]??{message:"Invalid request",path:[]};return $.json(tK(`Invalid request: ${L.message}`,"invalid_request_error",L.path.length>0?L.path.join("."):null),400)}let G=Y.data,J=gQ6(G.model);if(!J)return $.json(tK("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)=>ED(j.providerId));if(!E)return $.json(tK("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(tK(`AI provider credential not found or inaccessible: ${W}`,"invalid_request_error","model"),404)}let F=H.aiSdk.languageModel(K),N=uQ6(G.messages),U=G.tools?cQ6(G.tools):void 0,O=lQ6(G.response_format),B=dQ6(),D=Math.floor(Date.now()/1000);if(G.stream)return ON($,async(L)=>{let E=vy$(F,N,U,G,O,$.req.raw.signal);try{let j=fO(E),z=!1,A=0,P="",q=async()=>{if(P.length===0)return;let M=P;P="",await L.writeSSE({data:JSON.stringify({id:B,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:B,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>=SQ6)await q()}else if(M.type==="tool-call"){await q();let k=A++;await L.writeSSE({data:JSON.stringify({id:B,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:B,object:"chat.completion.chunk",created:D,model:G.model,choices:[{index:0,delta:{},finish_reason:fy$(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=vy$(F,N,U,G,O,$.req.raw.signal),E=await _O(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:B,object:"chat.completion",created:D,model:G.model,choices:[{index:0,message:j,finish_reason:fy$(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(tK("Request aborted","invalid_request_error"),400);if(Y.name==="MessageConversionError")return $.json(tK(Y.message,"invalid_request_error","messages"),400);return console.error("[openai-compat] Error:",Y.message,Y.stack),$.json(tK(Y.message,"server_error"),500)}});yy$=xy$});var uy$;var hy$=w(()=>{uy$={name:"decocms",version:"4.233.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","db:migrate:dbos":"bun run ./dist/server/migrate-dbos.js",check:"tsc --noEmit",start:"bun run ./dist/server/server.js",migrate:"bun run src/database/migrate.ts","migrate:dbos":"bun run src/database/migrate-dbos.ts",test:"bun test src","better-auth:migrate":"bunx --bun @better-auth/cli migrate -y --config src/auth/index.ts",prepublishOnly:"bun run --cwd=../.. build:studio"},optionalDependencies:{"@duckdb/node-api":"^1.5.0-r.1"},dependencies:{"@ai-sdk/anthropic":"^3.0.85","@ai-sdk/google":"^3.0.83","@ai-sdk/openai":"^3.0.73","@anthropic-ai/sdk":"^0.105.0","@aws-sdk/client-s3":"^3.1013.0","@aws-sdk/client-sts":"^3.1013.0","@aws-sdk/lib-storage":"^3.1013.0","@aws-sdk/s3-request-presigner":"^3.1013.0","@clickhouse/client":"^1.8.1","@dbos-inc/dbos-sdk":"^4.21.6","@inkjs/ui":"^2.0.0","@nats-io/jetstream":"3.4.0","@nats-io/kv":"3.4.0","@nats-io/nats-core":"3.4.0","@nats-io/transport-node":"3.4.0","@openrouter/ai-sdk-provider":"^2.9.1","@opentelemetry/core":"^2.6.0","embedded-postgres":"^18.3.0-beta.16",ink:"^6.8.0",kysely:"^0.28.12","posthog-node":"^5.0.0",react:"^19.2.6","react-dom":"^19.2.6"},devDependencies:{"@ai-sdk/provider":"^3.0.10","@better-auth/sso":"1.4.1","@decocms/better-auth":"1.5.17","@decocms/bindings":"workspace:*","@decocms/mcp-utils":"workspace:*","@decocms/runtime":"workspace:*","@decocms/sandbox":"workspace:*","@decocms/shared":"workspace:*","@jitl/quickjs-wasmfile-release-sync":"0.31.0","@modelcontextprotocol/sdk":"1.29.0","@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 pQ6(){let $=process.env.POSTHOG_KEY;if(!$)return null;return{key:$,host:process.env.POSTHOG_HOST??iQ6}}var cy$,iQ6="https://ph.studio.decocms.com",ly$;var dy$=w(()=>{C8();dg0();iV();r9();A$();C41();hy$();cy$=new U1;cy$.get("/",($)=>{let Z={version:uy$.version,theme:ll1(),...KL().logo&&{logo:KL().logo},...LK()&&{internalUrl:ES1()},...b0().enableDecoImport&&{enableDecoImport:!0},brandExtractEnabled:!!b0().firecrawlApiKey,auth:J_$(),posthog:pQ6(),googleMapsApiKey:process.env.GOOGLE_MAPS_API_KEY?.trim()||null,runtime:{agentSandbox:!LK()&&b0().sandboxProviderKind==="agent-sandbox"}};return $.header("Cache-Control","no-store"),$.json({success:!0,config:Z})});ly$=cy$});function bh($){let Z=($??"").trim().toLowerCase();return Z=Z.replace(/^https?:\/\//,""),Z=Z.replace(/^www\./,""),Z=Z.split(/[/?#]/)[0]??"",Z.replace(/\/+$/,"")}function n51($){return(bh($).split(".")[0]||$).replace(/[-_]/g," ").split(" ").filter(Boolean).map((X)=>X.charAt(0).toUpperCase()+X.slice(1)).join(" ")}function iy$($,Z=64){return`https://www.google.com/s2/favicons?domain=${encodeURIComponent(bh($))}&sz=${Z}`}function my$($,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 py$($){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()?my$(`${Y.trim().replace(/\s+/g," ")} \u2014 ${J}`,200):my$(`How does ${X} really perform? ${J}`,200);return{title:G,description:W}}import{z as l0}from"zod";var w_,nQ6,tQ6,oQ6,rQ6,ny$;var ty$=w(()=>{w_=l0.enum(["good","bad","neutral"]),nQ6=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:w_.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 $})),tQ6=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(nQ6)),oQ6={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()},rQ6=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:w_.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:w_.optional()}),l0.object({template:l0.literal("stats"),stats:l0.array(l0.object({value:l0.coerce.string(),label:l0.coerce.string(),tone:w_.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:w_.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(tQ6).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:w_.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:w_.optional()})).min(1)})]),ny$=l0.object({...oQ6,template:rQ6})});function qP0($){let Z=[],X=[...$.sections].sort((Y,G)=>Y.position-G.position).map((Y)=>{let G=ny$.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 t51=w(()=>{ty$()});import{join as oy$}from"path";async function sQ6($){try{let Z=await fetch(`${lW({})}/api/v2/public/diagnostics/${encodeURIComponent($)}`,{headers:{Accept:"application/json"},signal:AbortSignal.timeout(aQ6)});if(!Z.ok)return null;let X=await Z.json(),{deck:Q}=qP0(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()||n51($),score:Q.meta.scores?.cover??J?.score?.value,verdict:Y?.annotation?.trim()||Y?.headline?.trim()||void 0}}catch{return null}}function XG($){return $.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function eQ6($,Z){let X=bh($),Q=Z?.brand?.trim()||n51(X),Y=iy$(X,128),J=`${(b0().baseUrl??"https://studio.decocms.com").replace(/\/+$/,"")}/report/${encodeURIComponent(X)}`,{title:W,description:K}=py$({brand:Q,domain:X,score:Z?.score,verdict:Z?.verdict}),H=`${J}/og.png`,F=`${Q} commerce report by decocms`;return[`<title>${XG(W)}</title>`,`<meta name="description" content="${XG(K)}" />`,'<meta name="robots" content="noindex, follow" />','<meta property="og:type" content="website" />','<meta property="og:site_name" content="decocms" />',`<meta property="og:title" content="${XG(W)}" />`,`<meta property="og:description" content="${XG(K)}" />`,`<meta property="og:url" content="${XG(J)}" />`,`<meta property="og:image" content="${XG(H)}" />`,'<meta property="og:image:width" content="1200" />','<meta property="og:image:height" content="630" />',`<meta property="og:image:alt" content="${XG(F)}" />`,'<meta name="twitter:card" content="summary_large_image" />',`<meta name="twitter:title" content="${XG(W)}" />`,`<meta name="twitter:description" content="${XG(K)}" />`,`<meta name="twitter:image" content="${XG(H)}" />`,`<meta name="twitter:image:alt" content="${XG(F)}" />`,`<link rel="canonical" href="${XG(J)}" />`,`<link rel="icon" href="${XG(Y)}" sizes="any" />`].join(`
2764
+ `,j=await Z.createBlob(E);await Qy$(Z.owner,Z.repo,j,E);let z=L[0]??`${LP0(Q)}/${b51(B)}.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 B of $.del)for(let D of c51(K,B))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((B)=>B.type==="blob"&&B.path===N)){let B=await Promise.all([...F.values()].map(async(j)=>({stem:j.stem,content:j.content??await Z.getBlobText(j.sha)}))),{decofile:D,skipped:L}=yr(B);if(L.length>0)console.warn("decofile gen: dropped blocks that were not valid JSON",{repo:`${Z.owner}/${Z.repo}`,branch:X,packagePath:Q,blocks:L.map((j)=>j.key)});let E=await Z.createBlob(D);H.push({path:N,mode:"100644",type:"blob",sha:E})}let U=await Z.createTree(J,H),O=await Z.createCommit({message:zQ6($),treeSha:U,parentShas:[G]});try{return await Z.updateRef(X,O),O}catch(B){if(!(B instanceof J6&&B.status===422)||Y>=LQ6-1)throw B;await I$(mZ(2000,200,Y,2,0.5))}}}function zQ6($){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 Hd0(Q,$.deps.coAuthor)}var LQ6=3,i51;var zy$=w(()=>{GO0();FP0();t4();F_();EP0();i51=new Map});import{createHmac as Py$,randomBytes as PQ6,timingSafeEqual as AQ6}from"crypto";function Ay$(){if(TP0)return TP0;let $;try{let Z=b0();$=Z.studioJwtSecret??Z.betterAuthSecret}catch{$=void 0}return TP0=$?Buffer.from($):PQ6(32),TP0}function p51($){let Z=$.nowMs??Date.now(),X={o:$.organizationId,m:$.virtualMcpId,b:$.branch,e:Math.floor((Z+TQ6)/1000)},Q=Buffer.from(JSON.stringify(X)).toString("base64url"),Y=Py$("sha256",Ay$()).update(Q).digest("base64url");return`${Q}.${Y}`}function Ty$($,Z){let X=$.indexOf(".");if(X<0)return!1;let Q=$.slice(0,X),Y=Buffer.from($.slice(X+1)),G=Buffer.from(Py$("sha256",Ay$()).update(Q).digest("base64url"));if(Y.length!==G.length||!AQ6(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 TQ6=21600000,TP0=null;var Ry$=w(()=>{A$()});import{z as fh}from"zod";function IQ6($){return $.length>0&&$.length<=255&&!$.includes("..")&&!$.endsWith("/")&&!$.endsWith(".lock")&&RQ6.test($)}function qy$($){return $.req.header("x-forwarded-host")??new URL($.req.url).host}async function RP0($){let Z=$.get("decofileScope");return KP0($.var.studioContext,Z.organizationId,Z.githubRepo)}function IP0($,Z){if(Z instanceof J6){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 My$(){let $=new U1;return $.use("/:virtualMcpId/:branch",Iy$),$.use("/:virtualMcpId/:branch/*",Iy$),$.get("/:virtualMcpId/:branch",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await RP0(Z),Y=await Yy$(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=p51({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.body(`{"version":${JSON.stringify(Y.sha)},"token":${JSON.stringify(J)},"apiHost":${JSON.stringify(qy$(Z))},"decofile":${Y.decofile}}`,200,{...G,"content-type":"application/json"})}catch(Q){return IP0(Z,Q)}}),$.patch("/:virtualMcpId/:branch",async(Z)=>{let X=Z.get("decofileScope"),Q=Z.var.studioContext,Y=qQ6.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{HP0(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 RP0(Z),W=await jy$(`${X.organizationId}/${X.virtualMcpId}/${X.branch}`,{client:J,branch:X.branch,packagePath:X.packagePath,coAuthor:kh(Q)},G),K=p51({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.json({version:W,token:K,apiHost:qy$(Z)})}catch(J){return IP0(Z,J)}}),$.post("/:virtualMcpId/:branch/publish",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await RP0(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 J6&&G.status===409)return Z.json({error:"merge-conflict"},409);if(G instanceof J6&&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 IP0(Z,Q)}}),$.get("/:virtualMcpId/:branch/status",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await RP0(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 J6&&G.status===404)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0});throw G}}catch(Q){return IP0(Z,Q)}}),$}var RQ6,qQ6,Iy$;var ky$=w(()=>{FP0();C8();R51();WP0();d51();f51();zy$();Ry$();F_();EP0();RQ6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;qQ6=fh.object({set:fh.record(fh.string(),fh.unknown()).optional(),delete:fh.array(fh.string()).optional()}).refine(($)=>Object.keys($.set??{}).length>0||($.delete?.length??0)>0,{message:"Patch must set or delete at least one block"}),Iy$=JP0(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(!IQ6(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||!Ty$(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(!DB0(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=lr(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 Sy$=($)=>{let Z=new U1;if(Z.use("*",X_),Z.route("/",Tz0()),Z.route("/",a_$()),Z.route("/",ab$()),Z.route("/",tb$()),Z.route("/",QP0()),Z.route("/tools",Yx$()),Z.route("/",Zx$()),Z.route("/",Vb$({kvStorage:$.kvStorage})),Z.route("/",kb$()),Z.route("/fs",cb$({getConnection:$.getNatsConnection})),Z.route("/sandbox",Ly$()),Z.route("/decofile",My$()),Z.route("/",ib$()),Z.route("/deco-sites",Iz0()),Z.route("/sso",Lz0()),Z.route("/",YP0({tokenStorage:$.tokenStorage,automationEventDispatcher:$.automationEventDispatcher})),Z.route("/webhooks",d_$()),$.mountDevAssets)Z.route("/dev-assets",qz0({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("/",MV$()),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",db$()),Z.route("/mcp",Cw0()),Z.route("/mcp/self",XP0()),Z.route("/mcp",fw0()),Z.all("/oauth-proxy/:connectionId/*",$.oauthProxyHandler),Z.get("/watch",$.watchHandler),Z};var Vy$=w(()=>{C8();p41();m_$();r41();Mz0();Hr();m41();Sb$();Cb$();lb$();Ln();x41();bw0();L51();mb$();pb$();ob$();sb$();Xx$();j51();Gx$();z51();_w0();Ey$();ky$()});function MQ6($){return $.filter((Z)=>Z.vendors?.alias).map((Z)=>({name:Z.name,title:Z.title,description:Z.description,logo:Z.logo,category:Z.category,vendor:{alias:Z.vendors.alias,url:Z.vendors.url}}))}var kQ6=async($,Z)=>{if(!$.get("studioContext").auth.user?.id)return $.json({error:"Unauthorized"},401);return Z()},Cy$=()=>{let $=new U1;return $.use("*",kQ6),$.get("/",async(Z)=>{let X=b0(),Q=X.decoSupabaseUrl,Y=X.decoSupabaseServiceKey;if(!Q||!Y)return Z.json({apps:[]});try{let G=await uZ(Q,Y,"apps?select=name,title,description,logo,category,vendors(alias,url)");return Z.json({apps:MQ6(G)})}catch(G){return console.error("[deco-apps] GET error:",G),Z.json({error:"Failed to fetch apps"},502)}}),$};var _y$=w(()=>{C8();A$();Ij0()});import{z as M1}from"zod";function tK($,Z="invalid_request_error",X=null,Q=null){return{error:{message:$,type:Z,param:X,code:Q}}}function gQ6($){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 hQ6($,Z,X){try{return JSON.parse($)}catch{throw new by$(`Invalid JSON in tool call arguments for function '${X}' (tool_call_id: ${Z}): ${$}`)}}function uQ6($){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:hQ6(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 cQ6($){let Z=$.map((X)=>{let Q=X.function.parameters?vY(X.function.parameters):vY({type:"object",properties:{}});return[X.function.name,f$({description:X.function.description,inputSchema:Q})]});return Object.fromEntries(Z)}function lQ6($){if(!$)return;return{openai:{response_format:$}}}function dQ6(){return`chatcmpl-${crypto.randomUUID().replace(/-/g,"").substring(0,29)}`}function vy$($,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 fy$($){if($==="tool-calls")return"tool_calls";if($==="length")return"length";return"stop"}var SQ6=256,VQ6,CQ6,_Q6,vQ6,fQ6,bQ6,xQ6,yQ6,by$,xy$,yy$;var gy$=w(()=>{C4();C8();Mh();nF();VQ6=M1.object({type:M1.literal("function"),function:M1.object({name:M1.string(),description:M1.string().optional(),parameters:M1.record(M1.string(),M1.unknown()).optional()})}),CQ6=M1.object({id:M1.string(),type:M1.literal("function"),function:M1.object({name:M1.string(),arguments:M1.string()})}),_Q6=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(CQ6).optional()}),M1.object({role:M1.literal("tool"),content:M1.string(),tool_call_id:M1.string()})]),vQ6=M1.object({type:M1.literal("text")}),fQ6=M1.object({type:M1.literal("json_object")}),bQ6=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()})}),xQ6=M1.union([vQ6,fQ6,bQ6]),yQ6=M1.object({model:M1.string().describe("Format: 'model_id' or 'credential_id:model_id'"),messages:M1.array(_Q6),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(VQ6).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:xQ6.optional(),user:M1.string().optional()});by$=class by$ extends Error{constructor($){super($);this.name="MessageConversionError"}};xy$=new U1;xy$.post("/:org/v1/chat/completions",async($)=>{let Z=$.get("studioContext"),X=$.req.param("org");try{if(!Z.auth.apiKey?.id)return $.json(tK("API key authentication required. Provide a valid API key via Authorization header.","authentication_error"),401);if(!Z.organization)return $.json(tK("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(tK("Organization mismatch. The API key's organization does not match the requested organization.","invalid_request_error","organization"),403);let Q=await $.req.json(),Y=yQ6.safeParse(Q);if(!Y.success){let L=Y.error.issues[0]??{message:"Invalid request",path:[]};return $.json(tK(`Invalid request: ${L.message}`,"invalid_request_error",L.path.length>0?L.path.join("."):null),400)}let G=Y.data,J=gQ6(G.model);if(!J)return $.json(tK("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)=>ED(j.providerId));if(!E)return $.json(tK("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(tK(`AI provider credential not found or inaccessible: ${W}`,"invalid_request_error","model"),404)}let F=H.aiSdk.languageModel(K),N=uQ6(G.messages),U=G.tools?cQ6(G.tools):void 0,O=lQ6(G.response_format),B=dQ6(),D=Math.floor(Date.now()/1000);if(G.stream)return ON($,async(L)=>{let E=vy$(F,N,U,G,O,$.req.raw.signal);try{let j=fO(E),z=!1,A=0,P="",q=async()=>{if(P.length===0)return;let M=P;P="",await L.writeSSE({data:JSON.stringify({id:B,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:B,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>=SQ6)await q()}else if(M.type==="tool-call"){await q();let k=A++;await L.writeSSE({data:JSON.stringify({id:B,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:B,object:"chat.completion.chunk",created:D,model:G.model,choices:[{index:0,delta:{},finish_reason:fy$(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=vy$(F,N,U,G,O,$.req.raw.signal),E=await _O(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:B,object:"chat.completion",created:D,model:G.model,choices:[{index:0,message:j,finish_reason:fy$(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(tK("Request aborted","invalid_request_error"),400);if(Y.name==="MessageConversionError")return $.json(tK(Y.message,"invalid_request_error","messages"),400);return console.error("[openai-compat] Error:",Y.message,Y.stack),$.json(tK(Y.message,"server_error"),500)}});yy$=xy$});var uy$;var hy$=w(()=>{uy$={name:"decocms",version:"4.235.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","db:migrate:dbos":"bun run ./dist/server/migrate-dbos.js",check:"tsc --noEmit",start:"bun run ./dist/server/server.js",migrate:"bun run src/database/migrate.ts","migrate:dbos":"bun run src/database/migrate-dbos.ts",test:"bun test src","better-auth:migrate":"bunx --bun @better-auth/cli migrate -y --config src/auth/index.ts",prepublishOnly:"bun run --cwd=../.. build:studio"},optionalDependencies:{"@duckdb/node-api":"^1.5.0-r.1"},dependencies:{"@ai-sdk/anthropic":"^3.0.85","@ai-sdk/google":"^3.0.83","@ai-sdk/openai":"^3.0.73","@anthropic-ai/sdk":"^0.105.0","@aws-sdk/client-s3":"^3.1013.0","@aws-sdk/client-sts":"^3.1013.0","@aws-sdk/lib-storage":"^3.1013.0","@aws-sdk/s3-request-presigner":"^3.1013.0","@clickhouse/client":"^1.8.1","@dbos-inc/dbos-sdk":"^4.21.6","@inkjs/ui":"^2.0.0","@nats-io/jetstream":"3.4.0","@nats-io/kv":"3.4.0","@nats-io/nats-core":"3.4.0","@nats-io/transport-node":"3.4.0","@openrouter/ai-sdk-provider":"^2.9.1","@opentelemetry/core":"^2.6.0","embedded-postgres":"^18.3.0-beta.16",ink:"^6.8.0",kysely:"^0.28.12","posthog-node":"^5.0.0",react:"^19.2.6","react-dom":"^19.2.6"},devDependencies:{"@ai-sdk/provider":"^3.0.10","@better-auth/sso":"1.4.1","@decocms/better-auth":"1.5.17","@decocms/bindings":"workspace:*","@decocms/mcp-utils":"workspace:*","@decocms/runtime":"workspace:*","@decocms/sandbox":"workspace:*","@decocms/shared":"workspace:*","@jitl/quickjs-wasmfile-release-sync":"0.31.0","@modelcontextprotocol/sdk":"1.29.0","@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 pQ6(){let $=process.env.POSTHOG_KEY;if(!$)return null;return{key:$,host:process.env.POSTHOG_HOST??iQ6}}var cy$,iQ6="https://ph.studio.decocms.com",ly$;var dy$=w(()=>{C8();dg0();iV();r9();A$();C41();hy$();cy$=new U1;cy$.get("/",($)=>{let Z={version:uy$.version,theme:ll1(),...KL().logo&&{logo:KL().logo},...LK()&&{internalUrl:ES1()},...b0().enableDecoImport&&{enableDecoImport:!0},brandExtractEnabled:!!b0().firecrawlApiKey,auth:J_$(),posthog:pQ6(),googleMapsApiKey:process.env.GOOGLE_MAPS_API_KEY?.trim()||null,runtime:{agentSandbox:!LK()&&b0().sandboxProviderKind==="agent-sandbox"}};return $.header("Cache-Control","no-store"),$.json({success:!0,config:Z})});ly$=cy$});function bh($){let Z=($??"").trim().toLowerCase();return Z=Z.replace(/^https?:\/\//,""),Z=Z.replace(/^www\./,""),Z=Z.split(/[/?#]/)[0]??"",Z.replace(/\/+$/,"")}function n51($){return(bh($).split(".")[0]||$).replace(/[-_]/g," ").split(" ").filter(Boolean).map((X)=>X.charAt(0).toUpperCase()+X.slice(1)).join(" ")}function iy$($,Z=64){return`https://www.google.com/s2/favicons?domain=${encodeURIComponent(bh($))}&sz=${Z}`}function my$($,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 py$($){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()?my$(`${Y.trim().replace(/\s+/g," ")} \u2014 ${J}`,200):my$(`How does ${X} really perform? ${J}`,200);return{title:G,description:W}}import{z as l0}from"zod";var w_,nQ6,tQ6,oQ6,rQ6,ny$;var ty$=w(()=>{w_=l0.enum(["good","bad","neutral"]),nQ6=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:w_.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 $})),tQ6=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(nQ6)),oQ6={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()},rQ6=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:w_.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:w_.optional()}),l0.object({template:l0.literal("stats"),stats:l0.array(l0.object({value:l0.coerce.string(),label:l0.coerce.string(),tone:w_.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:w_.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(tQ6).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:w_.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:w_.optional()})).min(1)})]),ny$=l0.object({...oQ6,template:rQ6})});function qP0($){let Z=[],X=[...$.sections].sort((Y,G)=>Y.position-G.position).map((Y)=>{let G=ny$.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 t51=w(()=>{ty$()});import{join as oy$}from"path";async function sQ6($){try{let Z=await fetch(`${lW({})}/api/v2/public/diagnostics/${encodeURIComponent($)}`,{headers:{Accept:"application/json"},signal:AbortSignal.timeout(aQ6)});if(!Z.ok)return null;let X=await Z.json(),{deck:Q}=qP0(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()||n51($),score:Q.meta.scores?.cover??J?.score?.value,verdict:Y?.annotation?.trim()||Y?.headline?.trim()||void 0}}catch{return null}}function XG($){return $.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function eQ6($,Z){let X=bh($),Q=Z?.brand?.trim()||n51(X),Y=iy$(X,128),J=`${(b0().baseUrl??"https://studio.decocms.com").replace(/\/+$/,"")}/report/${encodeURIComponent(X)}`,{title:W,description:K}=py$({brand:Q,domain:X,score:Z?.score,verdict:Z?.verdict}),H=`${J}/og.png`,F=`${Q} commerce report by decocms`;return[`<title>${XG(W)}</title>`,`<meta name="description" content="${XG(K)}" />`,'<meta name="robots" content="noindex, follow" />','<meta property="og:type" content="website" />','<meta property="og:site_name" content="decocms" />',`<meta property="og:title" content="${XG(W)}" />`,`<meta property="og:description" content="${XG(K)}" />`,`<meta property="og:url" content="${XG(J)}" />`,`<meta property="og:image" content="${XG(H)}" />`,'<meta property="og:image:width" content="1200" />','<meta property="og:image:height" content="630" />',`<meta property="og:image:alt" content="${XG(F)}" />`,'<meta name="twitter:card" content="summary_large_image" />',`<meta name="twitter:title" content="${XG(W)}" />`,`<meta name="twitter:description" content="${XG(K)}" />`,`<meta name="twitter:image" content="${XG(H)}" />`,`<meta name="twitter:image:alt" content="${XG(F)}" />`,`<link rel="canonical" href="${XG(J)}" />`,`<link rel="icon" href="${XG(Y)}" sizes="any" />`].join(`
2765
2765
  `)}function $Y6($,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}
2766
2766
  </head>`)}function ry$($){let Z=new U1;return Z.get("/:domain/og.png",async(X)=>{let Q=bh(X.req.param("domain")),Y=async()=>{let G=$?Bun.file(oy$($,"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(`${lW({})}/api/v2/public/diagnostics/${encodeURIComponent(Q)}/og.png`,{signal:AbortSignal.timeout(ZY6)}),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=$?oy$($,"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 sQ6(bh(Q)),K=eQ6(Q,W);return X.html($Y6(J,K),200,{"Cache-Control":"public, max-age=0, s-maxage=300"})}catch{return X.html(J)}}),Z}var aQ6=2500,ZY6=1e4;var ay$=w(()=>{C8();t51();AL();A$()});function mr($,Z){return fetch(`${lW({})}${$}`,Z)}async function XY6($,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 mr(`/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}=qP0(J);return{status:W.slides.length?"ready":"empty",deck:W,scanned_at:J.scanned_at,drops:K}}var QY6,wN,sy$=async($,Z)=>{if(!$.get("reportUser"))return $.json({error:"Authentication required"},401);await Z();return},ey$;var $g$=w(()=>{C8();xG();AL();t51();QY6=new Set(["complete","errored","terminated","unknown"]),wN=new U1;wN.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});wN.use("/link-token/*",sy$);wN.use("/suggest",sy$);wN.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 XY6(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)}});wN.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 mr("/api/v2/diagnostics/run",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${PL({})}`},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)}});wN.get("/status",async($)=>{let Z=$.req.query("id");if(!Z)return $.json({error:"id is required"},400);try{let X=await mr(`/api/v2/diagnostics/status?id=${encodeURIComponent(Z)}`,{headers:{Authorization:`Bearer ${PL({})}`}});if(!X.ok)return $.json({error:`status HTTP ${X.status}`},502);let Y=(await X.json()).status??"unknown",G={done:QY6.has(Y),status:Y};return $.json(G)}catch{return $.json({error:"status failed"},502)}});wN.get("/link-token/:id",async($)=>{let Z=$.req.param("id");try{let X=await mr(`/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)}});wN.get("/suggest",async($)=>{let Z=($.req.query("q")??"").trim().slice(0,64);if(Z.length<2)return $.json({suggestions:[]});try{let X=await mr(`/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:[]})}});ey$=wN});import{createHmac as YY6,timingSafeEqual as GY6}from"crypto";function Xg$($,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)>JY6)return!1;let W=YY6("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&&GY6(K,F)})}function Qg$($){let Z;try{Z=JSON.parse($)}catch{return null}let X=LJ(Z),Q=LJ(LJ(X?.data)?.object);if(!X||typeof X.type!=="string"||!Q)return null;return{id:oK(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 Yg$($){switch($){case"active":case"trialing":return"active";case"past_due":return"past_due";default:return"canceled"}}function oK($){return typeof $==="string"?$:void 0}function LJ($){return typeof $==="object"&&$!==null?$:void 0}function MP0($){return typeof $==="number"?new Date($*1000):null}function a51($){return oK($)??oK(LJ($)?.id)}function WY6($){return a51($.subscription)??oK(LJ(LJ($.parent)?.subscription_details)?.subscription)}function KY6($){let Z=MP0($.current_period_end);if(Z)return Z;let X=LJ($.items)?.data;if(!Array.isArray(X))return null;let Q=0;for(let Y of X){let G=LJ(Y)?.current_period_end;if(typeof G==="number"&&G>Q)Q=G}return Q>0?new Date(Q*1000):null}function o51($,Z){let X=MP0($.created);return!!X&&!!Z.lastStripeEventAt&&X<Z.lastStripeEventAt}function r51($,Z){let X=MP0($.created);if(!X)return;return Z.lastStripeEventAt&&Z.lastStripeEventAt>X?void 0:X}async function HY6($,Z){let X=Z.data.object;switch(Z.type){case"checkout.session.completed":case"checkout.session.async_payment_succeeded":{let Q=oK(LJ(X.metadata)?.orgId);if(!Q)return{handled:!1,reason:"no orgId"};if(oK(LJ(X.metadata)?.kind)==="topup"){if(X.mode!=="payment")return{handled:!1,reason:"topup with wrong mode"};if(oK(X.payment_status)!=="paid")return{handled:!1,reason:"payment not confirmed"};let J=oK(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(LJ(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:LJ(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(oK(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=a51(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(o51(Z,Y))return{handled:!1,reason:"stale event"};return await $.updateStripeState(Q,{stripeCustomerId:a51(X.customer),stripeSubscriptionId:G,status:"active",lastStripeEventAt:r51(Z,Y)}),{handled:!0,organizationId:Q}}case"customer.subscription.updated":case"customer.subscription.deleted":{let Q=oK(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&&o51(Z,Y))return{handled:!1,reason:"stale event"};let J=G?"canceled":Yg$(X.status);return await $.updateStripeState(Y.organizationId,{status:J,currentPeriodEnd:KY6(X),...G&&{stripeSubscriptionId:null},lastStripeEventAt:r51(Z,Y)}),{handled:!0,organizationId:Y.organizationId}}case"invoice.paid":{let Q=WY6(X);if(!Q)return{handled:!1,reason:"no sub id"};let Y=await $.getBillingByStripeSubscriptionId(Q);if(!Y)return{handled:!1,reason:"unknown subscription"};if(o51(Z,Y))return{handled:!1,reason:"stale event"};return await $.updateStripeState(Y.organizationId,{status:"active",currentPeriodEnd:MP0(X.period_end),lastStripeEventAt:r51(Z,Y)}),{handled:!0,organizationId:Y.organizationId}}default:return{handled:!1,reason:`unhandled event ${Z.type}`}}}function FY6($,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:Yg$(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 Zg$($,Z){let X=FY6($,Z);if(!X)return;RY({event:X.name,organizationId:X.organizationId,...$.id?{uuid:rm1(`stripe:${$.id}:${X.name}`)}:{},...$.created?{timestamp:new Date($.created*1000)}:{},properties:X.properties})}async function Gg$($){let Z=new gW(m8().db),X=await HY6(Z,$);if(!(X.handled&&X.topUp))Zg$($,X);if(X.handled&&X.topUp)await BB$({organizationId:X.organizationId,amountCents:X.topUp.creditCents,referenceId:X.topUp.referenceId}),Zg$($,X);if(!X.handled&&X.orphanSubscriptionId)try{await Ha1(X.orphanSubscriptionId),console.error("stripe webhook: canceled orphan subscription",{subscriptionId:X.orphanSubscriptionId,eventId:$.id})}catch(Q){if(!(Q instanceof VY&&(Q.status===400||Q.status===404)))throw Q}return X}var JY6=300;var Jg$=w(()=>{CG();q4();p40();CL();Ns0()});var NY6=1048576,s51;var Wg$=w(()=>{C8();Xw();A$();Jg$();s51=new U1;s51.post("/webhook",wZ({maxSize:NY6,onError:($)=>$.json({error:"payload too large"},413)}),async($)=>{let Z=b0().stripeWebhookSecret;if(!Z)return $.json({error:"stripe billing not configured"},503);let X=await $.req.text();if(!Xg$(X,$.req.header("stripe-signature"),Z))return $.json({error:"invalid signature"},400);let Y=Qg$(X);if(!Y)return $.json({error:"invalid payload"},400);let G=await Gg$(Y);return console.log("stripe webhook",{eventId:Y.id,type:Y.type,livemode:Y.livemode,...G}),$.json({received:!0})})});import{timingSafeEqual as UY6}from"crypto";function BY6($,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 UY6(Buffer.from(Y),Buffer.from(Q))}var OY6=5242880,e51;var Kg$=w(()=>{C8();Xw();wp();e51=new U1;e51.post("/webhook",wZ({maxSize:OY6,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(!BY6(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 _i0())?.markTenantPoolsDirty(G,Y)??[];return $.json({ok:!0,pools:W})})});function Hg$($,Z){if(Z.startsWith("text/html")||Z.startsWith("image/svg"))$.set("Content-Security-Policy","sandbox allow-scripts allow-modals allow-same-origin")}var Fg$,wY6,DY6,Ng$;var Ug$=w(()=>{C8();Y3();Yy();Xx();Fg$=new U1,wY6=["range","if-none-match","if-modified-since"],DY6=["content-type","content-length","content-range","accept-ranges","etag","last-modified"];Fg$.get("/:org/files/*",async($)=>{let Z=$.get("studioContext"),X=Z.organization?.id;if(!Z.auth?.user?.id){if(Hh($))return $.redirect(`/login?next=${encodeURIComponent($.req.path)}`,302);throw new $$(401,{message:"Authentication required"})}if(!X)throw new $$(401,{message:"Organization context required"});let Q=$.req.path.replace(/^.*\/files\//,"");if(!Q)throw new $$(400,{message:"Missing file key"});let Y=await pp(Q,Z);if(!Y)throw new $$(503,{message:"Object storage not configured"});if(Y.startsWith("data:")&&H3()){let K=Y.match(/^data:([^;]+);base64,(.+)$/s);if(!K)throw new $$(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 Hg$(U,H),new Response(N,{status:200,headers:U})}let G=new Headers;for(let K of wY6){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 $$(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 $$(502,{message:"Upstream storage error"});let W=new Headers;for(let K of DY6){let H=J.headers.get(K);if(H)W.set(K,H)}return W.set("Cache-Control","private, max-age=86400"),Hg$(W,W.get("content-type")??""),new Response(J.body,{status:J.status,headers:W})});Ng$=Fg$});var ir=C((D_)=>{var LY6=D_&&D_.__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]}),EY6=D_&&D_.__exportStar||function($,Z){for(var X in $)if(X!=="default"&&!Object.prototype.hasOwnProperty.call(Z,X))LY6(Z,$,X)};Object.defineProperty(D_,"__esModule",{value:!0});EY6(KY(),D_)});var wg$=C((Og$)=>{Object.defineProperty(Og$,"__esModule",{value:!0});Og$.version=void 0;Og$.version="3.4.0"});var Eg$=C((rK)=>{var jY6=rK&&rK.__importDefault||function($){return $&&$.__esModule?$:{default:$}};Object.defineProperty(rK,"__esModule",{value:!0});rK.NodeTransport=rK.VERSION=void 0;rK.nodeResolveHost=IY6;var n6=ir(),zY6=z0("net"),$91=z0("tls"),PY6=z0("path"),Dg$=z0("fs"),AY6=jY6(z0("dns")),TY6=wg$();rK.VERSION=TY6.version;var RY6="nats.js";class Lg${socket;version;lang;yields=[];signal=(0,n6.deferred)();closedNotification=(0,n6.deferred)();options;connected=!1;tlsName="";done=!1;closeError;constructor(){this.lang=RY6,this.version=rK.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,zY6.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,PY6.resolve)($),!(0,Dg$.existsSync)($))Z.reject(Error(`${$} doesn't exist`));(0,Dg$.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,$91.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,$91.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 $91.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}}rK.NodeTransport=Lg$;function IY6($){let Z=(0,n6.deferred)();return AY6.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 Tg$=C((Ag$)=>{Object.defineProperty(Ag$,"__esModule",{value:!0});Ag$.connect=qY6;var jg$=Eg$(),zg$=ir(),Pg$=ir();function qY6($={}){if((0,Pg$.hasWsProtocol)($))return Promise.reject(Pg$.errors.InvalidArgumentError.format("servers","node client doesn't support websockets, use the 'wsconnect' function instead"));return(0,zg$.setTransportFactory)({factory:()=>{return new jg$.NodeTransport},dnsResolveFn:jg$.nodeResolveHost}),zg$.NatsConnectionImpl.connect($)}});var Rg$=C((DN)=>{var kY6=DN&&DN.__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]}),SY6=DN&&DN.__exportStar||function($,Z){for(var X in $)if(X!=="default"&&!Object.prototype.hasOwnProperty.call(Z,X))kY6(Z,$,X)};Object.defineProperty(DN,"__esModule",{value:!0});DN.connect=void 0;var VY6=Tg$();Object.defineProperty(DN,"connect",{enumerable:!0,get:function(){return VY6.connect}});SY6(ir(),DN)});function kg$($){let Z=$?.connectFn??fY6,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 B=0;while(!G)try{X=await Z({servers:U,timeout:vY6,reconnect:!0,maxReconnectAttempts:-1,...O?{authenticator:O}:{}}),console.log(`[NatsProvider] Connected to ${X.getServer()} after ${B} attempt(s)`),Q=null,J=!1,F(X),H();return}catch{B++;let D=mZ(_Y6,CY6,B-1,2,0.5);await I$(D)}}return{init(U,O){if(Y)return;Y=!0,G=!1;let B=O?.creds?Ig$.credsAuthenticator(new TextEncoder().encode(O.creds)):void 0;N(U,B).catch(()=>{})},isConnected(){return K()},getConnection(){return K()?X:null},getJetStream(){if(!K())return null;if(!Q)Q=Mg$.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 fY6($){return qg$.connect($)}var Ig$,qg$,Mg$,CY6=100,_Y6=3000,vY6=3000;var Sg$=w(()=>{t4();Ig$=S(Ju(),1),qg$=S(Rg$(),1),Mg$=S(Iw(),1)});function Z91($,Z){return`${$}.${Z}`}class X91{cache;constructor($){this.cache=rg({ttlMs:$?.ttlMs??bY6,maxSize:$?.maxSize??xY6})}async get($,Z){return this.cache.get(Z91($,Z))??null}async set($,Z,X){this.cache.set(Z91($,Z),X)}async invalidate($,Z){this.cache.delete(Z91($,Z))}teardown(){this.cache.clear()}}var bY6=600000,xY6=5000;var Vg$=()=>{};function kP0($,Z){return`${$}:${Z}`}function Q91($){let Z=rg({ttlMs:$?.ttlMs??yY6,maxSize:$?.maxSize??gY6}),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(Cg$,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(kP0(K,H))},set(K,H,F){Z.set(kP0(K,H),F)},invalidate(K,H){Z.delete(kP0(K,H)),W(K,H)},start(){if(J)return;let K=X?.();if(!K)return;J=K.subscribe(Cg$),(async()=>{for await(let H of J)try{let F=JSON.parse(G.decode(H.data));if(F.originId===Q)continue;Z.delete(kP0(F.organizationId,F.keyId))}catch{}})().catch(console.error)},teardown(){J?.unsubscribe(),J=null,Z.clear()}}}var Cg$="studio.ai-provider-keys.invalidate",yY6=30000,gY6=5000;var _g$=()=>{};class Y91{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=vg$.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 vg$)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 vg$;var fg$=w(()=>{vg$=["studio.decopilot.cancel","mesh.decopilot.cancel"]});var bg$=($)=>{let Z;return()=>Z??=$()},G91,J91;var xg$=w(()=>{f6();G91=bg$(()=>q$.createHistogram("decopilot.stream.encode_ms",{description:"Per-chunk JSON.stringify+encode time for decopilot stream",unit:"ms"})),J91=bg$(()=>q$.createCounter("decopilot.stream.published_chunks",{description:"Logical decopilot stream chunks published to JetStream",unit:"{chunks}"}))});function iY6(){return{name:bF,subjects:[`${oB0}.>`],storage:e3.StorageType.File,max_age:cY6,max_bytes:dY6,max_msgs_per_subject:mY6,discard:e3.DiscardPolicy.Old,retention:e3.RetentionPolicy.Limits,duplicate_window:lY6,num_replicas:1}}class hg${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 yg$($){let Z=gg$.headers();for(let[X,Q]of Object.entries($))Z.set(X,Q);return Z}function oY6($,Z){let X=0;return{publish(Q,Y,G,J){Q.publish(Y,G,J?{headers:J}:void 0).catch((W)=>{if(X++,uY6().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 rY6($){if(!($ instanceof Error))return!1;if($.name==="TimeoutError")return!0;return/timeout|no responders|503/i.test($.message)}class W91{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=iY6(),X=await m9(async()=>{let Q=this.options.getJetStreamManager?await this.options.getJetStreamManager():await e3.jetstreamManager($);try{await Q.streams.info(bF),await Q.streams.update(bF,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(bF),await Q.streams.add(Z);else throw Y}return Q},{maxAttempts:5,minTimeout:250,maxTimeout:4000,jitter:0.5,isRetriable:rY6});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=oY6(Z,Q),J=!1,W=()=>{if(J)return;J=!0;let H=mK$(Z);Y.publish(H.subject,H.data).catch(()=>{})};X.addEventListener("abort",W,{once:!0});let K=(H)=>{let F=performance.now(),N=Gt0(H,{runId:Z}),U=performance.now()-F;if(G91().record(U),J91().add(1,{"org.id":Q??"unknown"}),tY6?.record(U,N.reduce((O,B)=>O+B.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?yg$(O.headers):void 0)};return(async()=>{let H=$.getReader(),F=0,N=0,U;try{while(!0){let{done:O,value:B}=await H.read();if(O)break;if(K(B),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(),nY6)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=Gt0(Z,{runId:$,dedup:X});if(G91().record(performance.now()-Y),J91().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:yg$(J.headers)}:{},...J.msgId?{msgID:J.msgId}:{}});return!0}async publishDone($,Z,X){let Q=this.js;if(!Q)return!1;let Y=dK$({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"?e3.DeliverPolicy.New:e3.DeliverPolicy.All,G=X?.closeOnDone??!1,J=BB($),W;try{W=await(await Q.consumers.get(bF,{filter_subjects:J,deliver_policy:Y})).consume()}catch(D){return console.warn("[Decopilot] JetStream tail unavailable (non-critical):",D?.message??D),null}let F=$w0({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(rB0()).pipeThrough(aB0()).getReader(),N=!1,U=()=>{if(N)return;N=!0;try{F.releaseLock()}catch{}},O=!1,B=()=>{if(O)return;O=!0,W.stop(),F.cancel().catch(()=>{}),U()};return Z?.addEventListener("abort",B,{once:!0}),new ReadableStream({async pull(D){for(;;){let{done:L,value:E}=await F.read();if(L){B(),D.close();return}let j=E;if(j.kind==="done"){if(G){B(),D.close();return}continue}D.enqueue(j.chunk);return}},cancel(){B()}})}purge($){if(!this.jsm)return;this.jsm.streams.purge(bF,{filter:BB($)}).catch(()=>{})}teardown(){this.js=null,this.jsm=null}}var e3,gg$,hY6=($)=>{let Z;return()=>Z??=$()},uY6,cY6=86400000000000,lY6=120000000000,dY6=4294967296,mY6=500000,pY6,nY6,tY6;var ug$=w(()=>{t4();Jt0();Zw0();sB0();f6();xg$();e3=S(Iw(),1),gg$=S(Ju(),1),uY6=hY6(()=>q$.createCounter("decopilot.stream.publish_errors",{description:"Number of JetStream publish failures for decopilot stream chunks",unit:"{errors}"}));pY6=process.env.STREAM_ENCODE_TRACE==="1",nY6=process.env.DECOPILOT_STREAM_TRACE==="1";tY6=pY6?new hg$:null});function SP0($,Z,X,Q){if(!Q)return!1;return $.emit(Z,PW(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 cg$=w(()=>{F8()});class K91{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 QG6($){return $ instanceof p7}function YG6($,Z){return Z-$>=ZG6}class H91{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??aY6;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??eY6,X=this.options.itemIntervalMs??sY6,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()-Wn0),it0);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()-XG6));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 Mn0(this.taskBoard,Y,Q),await kn0(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!==E4)continue;let W=await this.contextFactory(Y,J.assignedBy??J.createdBy);if(!W)continue;await xF(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),QG6(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()+$G6)).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(()=>{}),n8(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(!YG6(KF(X),Date.now()))return;await EK($,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===E4,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 YF$(J,Q))return!0;if(!Y)return!1;let W=await Promise.all(G.map(async(K)=>({...K,...await Ey(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(!ct0(W))return!1;return await Ww0(J,Q,{previewMatchesHead:lt0(W)}),!0}dispose(){if(this.timer)clearInterval(this.timer),this.timer=null}}var aY6=60000,sY6=300000,eY6=50,$G6=60000,ZG6=900000,XG6=120000;var lg$=w(()=>{v9();vt0();wB();Un();A9();B3();pt0();zK();Jn()});import{readdir as GG6,rm as VP0}from"fs/promises";import{join as CP0}from"path";async function _P0($){let Z=new Date;Z.setUTCDate(Z.getUTCDate()-JG6),Z.setUTCHours(0,0,0,0);let X=0;try{let Q=await L_($);for(let Y of Q)if(/^\d{4}$/.test(Y))X+=await dg$($,Y,Z);else if(!Y.startsWith(".")){let G=CP0($,Y),J=await L_(G);for(let K of J){if(!/^\d{4}$/.test(K))continue;X+=await dg$(G,K,Z)}if((await L_(G)).length===0)await VP0(G,{recursive:!0,force:!0})}}catch(Q){console.warn("monitoring retention cleanup failed:",Q)}return X}async function dg$($,Z,X){let Q=0,Y=CP0($,Z),G=await L_(Y);for(let W of G){if(!/^\d{2}$/.test(W))continue;let K=CP0(Y,W),H=await L_(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=CP0(K,N);await VP0(O,{recursive:!0,force:!0}),Q++}}if((await L_(K)).length===0)await VP0(K,{recursive:!0,force:!0})}if((await L_(Y)).length===0)await VP0(Y,{recursive:!0,force:!0});return Q}async function L_($){try{return(await GG6($)).filter((X)=>!X.startsWith("."))}catch{return[]}}var JG6=30;var F91=()=>{};import{DBOS as N91,SchedulerMode as WG6}from"@dbos-inc/dbos-sdk";async function HG6(){let $=[AJ(),j_(),eK()],Z=0;for(let X of $)try{Z+=await _P0(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 FG6($,Z){await N91.runStep(()=>HG6(),{name:"monitoringRetention"})}function ig$(){if(mg$)return;mg$=!0;let $=N91.registerWorkflow(FG6,{name:"monitoringRetentionWorkflow"});N91.registerScheduled($,{name:"monitoringRetentionWorkflow",crontab:KG6,mode:WG6.ExactlyOncePerIntervalWhenActive})}var KG6="23 4 * * *",mg$=!1;var pg$=w(()=>{YY();F91()});function ng$($){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 rG.create();Y.auth.user={id:X,role:Q.role},Y.organization={id:Q.orgId,slug:Q.orgSlug,name:Q.orgName};let G=await O41($.db,Z,Q.role);return Y.boundAuth=U41({auth:Y.authInstance,headers:new Headers,role:Q.role,permissions:G,userId:X}),Y.access=new YL(X,void 0,Y.boundAuth,Q.role,"self"),DB(Y,{id:Q.orgId,slug:Q.orgSlug}),Y}}var tg$=w(()=>{GL();oV()});function NG6(){return{services:[{name:"Postgres",status:"pending",port:0},{name:"NATS",status:"pending",port:0}],migrationsStatus:"pending",serverUrl:null,logs:[]}}function OG6(){for(let $ of UG6)$()}function og$($){let Z=[...U91.logs,$];U91={...U91,logs:Z.length>500?Z.slice(-500):Z},OG6()}function O91(){return BG6}var U91,UG6,BG6=!1;var B91=w(()=>{U91=NG6(),UG6=new Set});import{EventEmitter as wG6}from"events";var w91;var rg$=w(()=>{B91();w91=new wG6;w91.on("request",($)=>{og$($)})});function ag$(){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=xh(U.params.name),B=U.params.arguments||{},D=Object.keys(B).map((E)=>xh(E)),L=D.length>0?D.slice(0,3).join(",")+(D.length>3?"\u2026":""):"";G=`${Q5.tool}${O}${Q5.dim}(${L})${Q5.reset}`}else if(U.method)G=`${Q5.dim}${xh(U.method)}${Q5.reset}`}}catch{}}let W=xh(Y);if(Y.startsWith("/mcp/conn_")){let F=Y.split("/")[2]??"";W=`/mcp/${Q5.mcp}${xh(F.slice(0,12))}\u2026${Q5.reset}`}else if(Y==="/mcp")W=`${Q5.mcp}/mcp${Q5.reset}`;else if(Y==="/mcp/registry")W=`${Q5.mcp}/mcp/registry${Q5.reset}`;let K=LG6(Q),H=J?"\u25C0":"\u2190";if(!O91())console.log(`${Q5.dim}${H}${Q5.reset} ${K}${Q}${Q5.reset} ${W}${G?` ${G}`:""}`);try{await Z()}finally{let F=Date.now()-X,N=$.res.status,U=DG6(N),O=F<1000?`${F}ms`:`${(F/1000).toFixed(1)}s`,B=J?"\u25B6":"\u2192";if(!O91())console.log(`${Q5.dim}${B}${Q5.reset} ${K}${Q}${Q5.reset} ${W}${G?` ${G}`:""} ${U}${N}${Q5.reset} ${Q5.duration}${O}${Q5.reset}`);w91.emit("request",{method:Q,path:xh(Y),status:N,duration:F,timestamp:new Date})}}}var Q5,DG6=($)=>{if($>=500)return Q5.serverError;if($>=400)return Q5.clientError;if($>=300)return Q5.redirect;return Q5.ok},LG6=($)=>{return Q5[$]||Q5.reset},xh=($)=>{return $.replace(/\r/g,"").replace(/\n/g,"").replace(/\x1b\[[0-9;]*m/g,"").replace(/[\x00-\x1f\x7f-\x9f]/g,"")};var sg$=w(()=>{B91();rg$();Q5={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 Xh$}from"crypto";import{mkdir as EG6,readdir as jG6,rm as eg$,stat as Qh$}from"fs/promises";import{join as L91,relative as zG6}from"path";import{z as j$}from"zod";function Gh$($){let Z=$.replace(/[^a-zA-Z0-9_-]/g,"_");return L91(PG6,Z)}function Jh$($){return $.replace(/^\/+/,"").replace(/\.\./g,"")}function D91($,Z){let X=Gh$($),Q=Jh$(Z);return L91(X,Q)}function AG6($,Z,X,Q){let Y=b0().encryptionKey||"dev-secret",G=`${$}:${Z}:${X}:${Q}`;return Xh$("sha256",Y).update(G).digest("hex")}function Zh$($,Z,X,Q,Y){let G=Math.floor(Date.now()/1000)+Q,J=AG6(Z,X,G,Y),W=new URL(`/api/dev-assets/${Z}/${Jh$(X)}`,$);return W.searchParams.set("expires",G.toString()),W.searchParams.set("signature",J),W.searchParams.set("method",Y),W.toString()}function Wh$($,Z,X){let Q=`${$}:${Z.getTime()}:${X}`;return`"${Xh$("md5","etag").update(Q).digest("hex")}"`}async function Kh$($,Z,X,Q,Y){try{let G=await jG6($,{withFileTypes:!0});for(let J of G){let W=L91($,J.name),H=zG6(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 Kh$(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 Qh$(W);Y.objects.push({key:H,size:F.size,lastModified:F.mtime.toISOString(),etag:Wh$(W,F.mtime,F.size)})}catch{}}}}catch{}}function Hh$($,Z){let Q=t($).id;return[{name:"LIST_OBJECTS",description:"List objects in the local assets directory with pagination support",inputSchema:j$.object({prefix:j$.string().optional(),maxKeys:j$.number().optional().default(1000),continuationToken:j$.string().optional(),delimiter:j$.string().optional()}),outputSchema:j$.object({objects:j$.array(j$.object({key:j$.string(),size:j$.number(),lastModified:j$.string(),etag:j$.string()})),nextContinuationToken:j$.string().optional(),isTruncated:j$.boolean(),commonPrefixes:j$.array(j$.string()).optional()}),handler:async(Y)=>{let G=Y,J=G.prefix||"",W=G.maxKeys??1000,K=G.delimiter,H=G.continuationToken,F=Gh$(Q);await EG6(F,{recursive:!0});let N={objects:[],commonPrefixes:new Set};await Kh$(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),B=U+W<N.objects.length,D=B?O[O.length-1]?.key:void 0;return{objects:O,isTruncated:B,nextContinuationToken:D,commonPrefixes:Array.from(N.commonPrefixes).sort()}}},{name:"GET_OBJECT_METADATA",description:"Get metadata for a file in the local assets directory",inputSchema:j$.object({key:j$.string()}),outputSchema:j$.object({contentType:j$.string().optional(),contentLength:j$.number(),lastModified:j$.string(),etag:j$.string(),metadata:j$.record(j$.string(),j$.string()).optional()}),handler:async(Y)=>{let G=Y,J=D91(Q,G.key),W=await Qh$(J);return{contentType:s41(G.key),contentLength:W.size,lastModified:W.mtime.toISOString(),etag:Wh$(J,W.mtime,W.size)}}},{name:"GET_PRESIGNED_URL",description:"Generate a presigned URL for downloading a file from local storage",inputSchema:j$.object({key:j$.string(),expiresIn:j$.number().optional()}),outputSchema:j$.object({url:j$.string(),expiresIn:j$.number()}),handler:async(Y)=>{let G=Y,J=G.expiresIn??$h$;return{url:Zh$(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:j$.object({key:j$.string(),expiresIn:j$.number().optional(),contentType:j$.string().optional()}),outputSchema:j$.object({url:j$.string(),expiresIn:j$.number()}),handler:async(Y)=>{let G=Y,J=G.expiresIn??$h$;return{url:Zh$(Z,Q,G.key,J,"PUT"),expiresIn:J}}},{name:"DELETE_OBJECT",description:"Delete a single file from local storage",inputSchema:j$.object({key:j$.string()}),outputSchema:j$.object({success:j$.boolean(),key:j$.string()}),handler:async(Y)=>{let G=Y,J=D91(Q,G.key);try{return await eg$(J),{success:!0,key:G.key}}catch{return{success:!1,key:G.key}}}},{name:"DELETE_OBJECTS",description:"Delete multiple files from local storage",inputSchema:j$.object({keys:j$.array(j$.string()).max(1000)}),outputSchema:j$.object({deleted:j$.array(j$.string()),errors:j$.array(j$.object({key:j$.string(),message:j$.string()}))}),handler:async(Y)=>{let G=Y,J=[],W=[];return await Promise.all(G.keys.map(async(K)=>{let H=D91(Q,K);try{await eg$(H),J.push(K)}catch(F){W.push({key:K,message:F instanceof Error?F.message:"Unknown error"})}})),{deleted:J,errors:W}}}]}async function E91($,Z,X){let Q=Hh$(Z,X),Y=new kW({name:"dev-assets-mcp",version:"1.0.0"},{capabilities:{tools:{}},jsonSchemaValidator:K5});for(let J of Q){let W="shape"in J.inputSchema?J.inputSchema.shape:j$.object({}).shape,K=J.outputSchema&&"shape"in J.outputSchema?J.outputSchema.shape:j$.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 rX({enableJsonResponse:$.headers.get("Accept")?.includes("application/json")??!1});return await Y.connect(G),XJ(Y,G,$,"mcp:dev-assets")}async function Fh$($,Z,X,Q){let G=Hh$(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 PG6="./data/assets",$h$=3600,Yh$,Nh$;var Uh$=w(()=>{A$();Iy();C8();Vl();$C();VX();Mz0();Yh$=new U1;Yh$.all("/",async($)=>{let Z=$.get("studioContext"),X=new URL($.req.url),Q=`${X.protocol}//${X.host}`;return E91($.req.raw,Z,Q)});Nh$=Yh$});var Oh$={};N4(Oh$,{mountDevRoutes:()=>TG6});function TG6($,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 E91(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 Fh$(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",Nh$);let X=new U1;X.use("*",a3({mountPath:"/api/dev-assets"})),X.route("/",qz0({orgFromPath:!1})),$.route("/api/dev-assets",X)}var Bh$=w(()=>{C8();i41();Mz0();Uh$()});import{sql as RG6}from"kysely";import{randomUUID as wh$}from"crypto";import{z as IG6}from"zod";async function MG6($){let Z=new Date().toISOString(),X=wh$(),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:wh$(),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 RG6`SELECT
2767
2767
  pg_notify('studio_events', ${X}),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "decocms",
3
- "version": "4.233.0",
3
+ "version": "4.235.0",
4
4
  "description": "Deco CMS — Self-hostable MCP Gateway for managing AI connections and tools",
5
5
  "author": "Deco team",
6
6
  "repository": {
@@ -1,35 +0,0 @@
1
- import{X as S,Y as C,a2 as J,Z as i,_ as pe,a1 as Ie,aO as Ce,cx as It,bl as qe,ba as dt,c as re,J as ut,u as He,o as Be,F as ee,K as ue,t as de,I as ge,G as ye,d as pt,f as Mt,r as v,n as Tt,e as Ct,j as Me,b as De,a as At,v as Pt,a6 as _t,p as Rt}from"./index-CMxZ_WIu.js";import{d as Et,s as Dt,A as ht,t as $t,u as Ut,o as Ot,w as Lt}from"./tab-id-Dz9GTS6m.js";import{S as Nt,s as Ft,c as qt,f as jt,i as Vt,a as Ht}from"./hooks-BwXOucYx.js";import{u as Bt}from"./use-is-desktop-app-BNujXJc_.js";import{a as Kt,u as Qt,S as Wt}from"./use-mcp-client-CVI7A81s.js";import{a as Gt}from"./use-virtual-mcp-BTWH3swd.js";import{u as mt,p as zt,b as xe,i as Xt,c as Zt}from"./use-ai-providers-CMHb8eeO.js";import{u as Yt}from"./use-decopilot-events-DICjmIrV.js";import{u as Jt,c as en}from"./studio-tools-BKQiiGm_.js";import{c as tn}from"./use-organization-settings-CpK185Z_.js";const we=S({connection_id:i().describe("Connection ID"),selected_tools:C(i()).nullable().describe("Selected tool names. null = all tools included, array = only these tools included"),selected_resources:C(i()).nullable().describe("Selected resource URIs or patterns. Supports * and ** wildcards for pattern matching. null = all resources included, array = only these resources included"),selected_prompts:C(i()).nullable().describe("Selected prompt names. null = all prompts included, array = only these prompts included")}),ft=we.extend({selected_tools:we.shape.selected_tools.optional(),selected_resources:we.shape.selected_resources.optional(),selected_prompts:we.shape.selected_prompts.optional()}),nn=S({connectionId:i(),toolName:i(),label:i(),icon:i().nullable().optional()}),sn=S({id:i().describe("Stable id; used as React key and ?tab= value"),title:i().describe("Tab label"),icon:i().optional().describe("Optional lucide icon name"),view:S({type:qe("ext-app"),appId:i(),args:Ie(i(),dt()).optional()})}),on=S({defaultMainView:S({type:i(),id:i().optional(),toolName:i().optional()}).nullable().optional(),chatDefaultOpen:J().nullable().optional(),cmsDefaultOpen:J().nullable().optional(),tabs:C(sn).optional()}),ot=S({tileId:i().optional(),connectionId:i().optional().describe("Connection that owns the resource — the host opens a direct MCP client to this connection so the iframe can call tools by their bare names."),resourceUri:i().describe("ui:// resource URI exposed by `connectionId`. Read on the home page and rendered via MCPAppRenderer."),toolName:i().optional().describe("Tool name — identifies which tool's inputSchema to display when editing tile props."),toolInput:Ie(i(),dt()).optional().describe("User-configured input props passed to MCPAppRenderer when rendering the tile."),minHeight:Ce().int().positive().optional(),maxHeight:Ce().int().positive().optional()}),Ke=S({banner:i().nullable().optional(),bannerColor:i().nullable().optional(),icon:i().nullable().optional(),themeColor:i().nullable().optional(),pinnedViews:C(nn).nullable().optional(),layout:on.nullable().optional(),homeTile:ot.nullable().optional(),homeTiles:C(ot).nullable().optional(),homePrompts:C(i()).nullable().optional()});function fs(t){const e=t?.homeTiles;if(Array.isArray(e)&&e.length>0)return e;const n=t?.homeTile;return n?[n]:[]}const an=/^[A-Za-z_][A-Za-z0-9_]*$/,at=i().min(1).regex(an,{message:"Env var key must start with a letter or underscore and contain only letters, digits, and underscores."}),rn=It("kind",[S({key:at,kind:qe("literal"),value:i()}),S({key:at,kind:qe("secret"),secretId:i().min(1)})]),ln=/^[a-zA-Z0-9.-]+(?::[0-9]+)?$/,cn=S({host:i().min(1).regex(ln).describe("Submodule host, e.g. 'github.com' (bare hostname, no scheme)."),secretId:i().min(1).describe("Vault secret id holding the PAT used to fetch this host.")}),Qe=S({selected:i().nullable().optional().describe("User-selected package manager (npm | pnpm | yarn | bun | deno). Null/absent means autodetect on next SANDBOX_START."),port:i().nullable().optional().describe("User-selected dev server port as a string (allows '' / null for unset). Null/absent means autodetect."),path:i().nullable().optional().describe("Optional path (relative to repo root) to the directory containing package.json. Null/absent means repo root. Forwarded as `application.packageManager.path` to the daemon config."),env:C(rn).nullable().optional().describe("Env vars injected on every SANDBOX_START. Literal entries inline their value; secret entries store a secretId that Studio resolves via the credential vault before posting /_sandbox/config."),submoduleCredentials:C(cn).nullable().optional().describe("Git submodule credentials injected on every SANDBOX_START. Each entry maps a host to a vault secret (PAT) that Studio resolves before posting /_sandbox/config; the daemon uses it to authenticate `git submodule update` for submodules on that host.")}),We=S({url:i().describe("GitHub repository URL"),owner:i().describe("Repository owner"),name:i().describe("Repository name"),installationId:Ce().optional().describe("GitHub App installation ID. Absent when the repo was linked without a GitHub connection (public-clone mode)."),connectionId:i().optional().describe("ID of the mcp-github connection used for authentication. Absent for public repos cloned without credentials.")}),dn=pe(["agent-sandbox","user-desktop"]),un=pe(["agent-sandbox","user-desktop","cluster"]);function Ge(t){return t==="cluster"?"agent-sandbox":t}const bt={sandboxHandle:i().describe("Provider-specific handle"),previewUrl:i().nullable().describe("URL where the sandbox's iframe-proxied UI is served, or null when the sandbox has no dev server (blank / tool sandboxes)."),sandboxApiUrl:i().nullable().optional().describe("Daemon's public URL — what cluster→daemon RPCs target. Equal to previewUrl for user-desktop; null/absent for the agent-sandbox provider (routes through hosted ingress)."),sandboxProviderKind:dn.optional(),createdAt:Ce().optional().describe("Epoch ms the entry was first written by SANDBOX_START. Used by the booting overlay to show a stable elapsed timer that survives browser reloads. Optional for backward compatibility with entries written before this field existed."),startedWith:S({packageManager:i().nullable().optional().describe("metadata.runtime.selected at the time of SANDBOX_START"),port:i().nullable().optional().describe("metadata.runtime.port at the time of SANDBOX_START"),path:i().nullable().optional().describe("metadata.runtime.path at the time of SANDBOX_START")}).optional().describe("Snapshot of metadata.runtime fields (selected/port/path) used at SANDBOX_START. The Preview tab compares the live metadata.runtime against this to decide if a restart is required to apply changes.")},gt=S(bt),pn=S({...bt,sandboxProviderKind:un.optional()});function hn(t){const e=pn.parse(t);return gt.parse({...e,sandboxProviderKind:e.sandboxProviderKind?Ge(e.sandboxProviderKind):void 0})}function bs(t){if(!t||typeof t!="object"||Array.isArray(t))return{};const e=t,n={};for(const[s,o]of Object.entries(e)){if(!o||typeof o!="object"||s!=="cluster"&&s!=="agent-sandbox"&&s!=="user-desktop")continue;const a=Ge(s);try{if(s==="cluster"&&n[a])continue;n[a]=hn(o)}catch{}}return n}const ze=Ie(i().describe("userId"),Ie(i().describe("branch"),Ie(i().describe("sandboxProviderKind"),gt))),mn=S({id:i().describe("Stable identifier for this knowledge file"),name:i().describe("File name shown in the UI"),kind:pe(["file","skill"]).optional().describe("'file' (a single document) or 'skill' (a Claude Code skill folder containing SKILL.md). Defaults to 'file'."),volume:i().describe("Org filesystem (Library) volume the file lives in"),path:i().describe("Path within the volume"),url:i().describe("Same-origin URL to read the file (display/download)"),contentType:i().nullable().optional().describe("MIME type, used to decide whether to inline the content"),size:Ce().nullable().optional().describe("File size in bytes"),addedAt:i().describe("ISO timestamp when the file was attached")}),Xe=C(mn).nullable().optional().describe("Files attached to the agent as reference knowledge. Surfaced in the system prompt: small text documents are inlined, others are listed as retrievable references."),fn=pe(["smart","code-review","open"]),Ze=fn.nullable().optional().describe("Controls when this code agent's changes may be published directly vs. requiring PR review. 'smart' (default) uses AI to judge per change; 'code-review' requires review for any code; 'open' allows direct publish always."),Ye=J().nullable().optional().describe("Enable Fast Preview (sandbox-less): render the draft instantly on the preview server's own page via a ?__draft pointer, with reads/writes served by the decofile API against GitHub. Requires previewServerUrl (or legacy productionUrl) to be set to take effect."),Je=i().nullable().optional().describe("Preview server URL — the deployment the CMS preview renders against (often the live site, e.g. https://acme.com). Painted in the preview iframe, and the render target for Fast Preview drafts. Supersedes the legacy productionUrl key."),gs=S({id:i().describe("Unique identifier"),title:i().describe("Human-readable name"),description:i().nullable().describe("Description"),icon:i().nullable().describe("Icon URL"),created_at:i().describe("Creation timestamp"),updated_at:i().describe("Last update timestamp"),created_by:i().describe("User ID who created this item"),updated_by:i().optional().describe("User ID who last updated this item"),organization_id:i().describe("Organization ID this item belongs to"),status:pe(["active","inactive"]).describe("Current status"),pinned:J().describe("Whether this space is pinned to the sidebar"),metadata:S({instructions:i().nullable().describe("Instructions also used as system prompt"),enabled_plugins:C(i()).nullable().optional().describe("List of enabled plugin IDs"),subAgents:C(i()).nullable().optional().describe("Allowlist of Virtual MCP (agent) or concrete MCP connection IDs this agent may delegate to via subtask. Concrete connections create ephemeral subagents. null/absent = all active org targets; empty array = itself only."),liveAgentId:i().nullable().optional().describe("ID of the live agent this (dev) agent develops. Set only on dev agents; powers the Develop/Live toggle. A dev agent is hidden from the sidebar (reached via the toggle on its live counterpart)."),ui:Ke.nullable().optional().describe("UI customization settings"),githubRepo:We.nullable().optional().describe("Linked GitHub repository"),runtime:Qe.nullable().optional().describe("User-pinned runtime config (package manager, dev port). Empty fields = autodetect."),sandboxMap:ze.optional().describe("Per-user, per-branch sandbox mapping: sandboxMap[userId][branch] -> { sandboxHandle, previewUrl }"),knowledge:Xe,siteSlug:i().nullable().optional().describe("Linked asset site slug (managed storage tenancy)"),publishPolicy:Ze,previewServerUrl:Je,productionUrl:i().nullable().optional().describe("Legacy key for previewServerUrl — still read as a fallback. New writes use previewServerUrl."),fieldDescriptionTooltips:J().nullable().optional().describe("Blocks form: opt in to showing a field's schema description as a hover tooltip on its title, instead of the default inline text below the title."),fastPreview:Ye}).loose().describe("Metadata"),connections:C(we).describe("Connections with their selected tools, resources, and prompts")}),yt=S({title:i().min(1).max(120).describe("Short label shown on the chip"),description:i().max(280).optional().describe("One-line subtitle shown under the title"),text:i().min(1).describe("The message sent to the agent when the prompt is clicked")});S({title:i().min(1).max(255).describe("Name for the virtual MCP"),description:i().nullable().optional().describe("Optional description"),icon:i().nullish().describe("Optional icon URL"),status:pe(["active","inactive"]).optional().default("active").describe("Initial status"),pinned:J().optional().default(!1).describe("Pin to sidebar"),metadata:S({instructions:i().nullable().optional().describe("MCP server instructions"),enabled_plugins:C(i()).nullable().optional().describe("List of enabled plugin IDs"),subAgents:C(i()).nullable().optional().describe("Allowlist of Virtual MCP (agent) or concrete MCP connection IDs this agent may delegate to via subtask. Concrete connections create ephemeral subagents. null/absent = all active org targets; empty array = itself only."),liveAgentId:i().nullable().optional().describe("ID of the live agent this (dev) agent develops. Set only on dev agents; powers the Develop/Live toggle. A dev agent is hidden from the sidebar (reached via the toggle on its live counterpart)."),ui:Ke.nullable().optional().describe("UI customization settings"),githubRepo:We.nullable().optional().describe("Linked GitHub repository"),runtime:Qe.nullable().optional().describe("User-pinned runtime config (package manager, dev port). Empty fields = autodetect."),sandboxMap:ze.optional().describe("Per-user, per-branch sandbox mapping: sandboxMap[userId][branch] -> { sandboxHandle, previewUrl }"),knowledge:Xe,siteSlug:i().nullable().optional().describe("Linked asset site slug (managed storage tenancy)"),publishPolicy:Ze,previewServerUrl:Je,productionUrl:i().nullable().optional().describe("Legacy key for previewServerUrl — still read as a fallback. New writes use previewServerUrl."),fieldDescriptionTooltips:J().nullable().optional().describe("Blocks form: opt in to showing a field's schema description as a hover tooltip on its title, instead of the default inline text below the title."),fastPreview:Ye}).loose().nullable().optional().describe("Additional metadata including MCP server instructions"),connections:C(ft).describe("Connections to include/exclude (can be empty for exclusion mode)"),prompts:C(yt).optional().describe("Optional kickstart prompts to seed on the agent. Each becomes a clickable conversation starter (icebreaker) on the agent. Author them from the agent's role and the tools it will have so they're coherent and immediately useful.")});S({title:i().min(1).max(255).optional().describe("New name"),description:i().nullable().optional().describe("New description (null to clear)"),icon:i().nullish().describe("New icon URL"),status:pe(["active","inactive"]).optional().describe("New status"),pinned:J().optional().describe("Pin/unpin from sidebar"),metadata:S({instructions:i().nullable().optional().describe("MCP server instructions"),enabled_plugins:C(i()).nullable().optional().describe("List of enabled plugin IDs"),subAgents:C(i()).nullable().optional().describe("Allowlist of Virtual MCP (agent) or concrete MCP connection IDs this agent may delegate to via subtask. Concrete connections create ephemeral subagents. null/absent = all active org targets; empty array = itself only."),liveAgentId:i().nullable().optional().describe("ID of the live agent this (dev) agent develops. Set only on dev agents; powers the Develop/Live toggle. A dev agent is hidden from the sidebar (reached via the toggle on its live counterpart)."),ui:Ke.nullable().optional().describe("UI customization settings"),githubRepo:We.nullable().optional().describe("Linked GitHub repository"),runtime:Qe.nullable().optional().describe("User-pinned runtime config (package manager, dev port). Empty fields = autodetect."),sandboxMap:ze.optional().describe("Per-user, per-branch sandbox mapping: sandboxMap[userId][branch] -> { sandboxHandle, previewUrl }"),knowledge:Xe,siteSlug:i().nullable().optional().describe("Linked asset site slug (managed storage tenancy)"),publishPolicy:Ze,previewServerUrl:Je,productionUrl:i().nullable().optional().describe("Legacy key for previewServerUrl — still read as a fallback. New writes use previewServerUrl."),fieldDescriptionTooltips:J().nullable().optional().describe("Blocks form: opt in to showing a field's schema description as a hover tooltip on its title, instead of the default inline text below the title."),fastPreview:Ye}).loose().nullable().optional().describe("Additional metadata including MCP server instructions"),connections:C(ft).optional().describe("New connections (replaces existing)"),prompts:C(yt).optional().describe("Replace the agent's kickstart prompts with this full set. Omit to leave them unchanged; pass an empty array to remove all. Each becomes a clickable conversation starter (icebreaker).")});function bn(t,e=[]){return t==="stop"?"completed":t==="tool-calls"?e.some(s=>s.type==="tool-user_ask"&&s.state==="input-available"||s.state==="approval-requested")?"requires_action":"completed":"failed"}const je={decopilot:{harness:"decopilot",sandbox:"agent-sandbox"},"claude-code-desktop":{harness:"claude-code",sandbox:"user-desktop"},"codex-desktop":{harness:"codex",sandbox:"user-desktop"},"opencode-desktop":{harness:"opencode",sandbox:"user-desktop"}};function gn(t,e){if(!t)return null;const n=e?Ge(e):null;if(t==="decopilot"&&(n===null||n==="user-desktop"))return"decopilot";for(const[s,o]of Object.entries(je))if(o.harness===t&&o.sandbox===n)return s;return null}function yn({pendingOption:t,lockedHarness:e}){return e==="claude-code"?"claude-code-desktop":e==="codex"?"codex-desktop":e==="opencode"?"opencode-desktop":t==="claude-code-desktop"||t==="codex-desktop"||t==="opencode-desktop"?t:null}function vn(t){return t.thread?.harness_id!=null?{}:{harnessId:"decopilot",sandboxProviderKind:"agent-sandbox",branch:t.globals.branch??null}}const Sn="home",kn=new Set(["output","upload","public","home"]),xn=/^[A-Za-z0-9][A-Za-z0-9._-]*$/;function ys(t){return kn.has(t)||!xn.test(t)?"home":t}function wn(t){const e=t?t.split("/").filter(Boolean):[],n=e[0]==="public",s=n?e[1]??null:null,o=n?s?`public-${s}`:null:e[0]??null,a=(n?e.slice(2):e.slice(1)).join("/");return{segments:e,volume:o,dirPath:a,isPublic:n,publicSet:s,readOnly:n,isHomeRoot:o===Sn&&a===""}}function vs(t){return t==="public"?"skills":t}function Ss(t,e){return t.isPublic&&t.publicSet?`public/${t.publicSet}/${e}`:t.volume?`${t.volume}/${e}`:e}const it="public-";function vt(t){return t.startsWith(it)?t.slice(it.length):null}function ks(t,e){const n=vt(t);return n?`public/${n}/${e}`:`${t}/${e}`}function In(t){const e=t.lastIndexOf("/");return e===-1?t:t.slice(e+1)}function Mn(t){const{volume:e,dirPath:n}=wn(t);if(!e)return null;let s;if(e==="home")s="org/home";else if(e==="outputs")s="org/.outputs";else if(e==="uploads")s="org/.uploads";else{const o=vt(e);s=o?`org/public/${o}`:`org/${e}`}return n?`${s}/${n}`:s}function Tn(t){const e=re.c(21);let n;e[0]===Symbol.for("react.memo_cache_sentinel")?(n={from:"/shell/$org/settings/connections/$appSlug/$collectionName/$itemId",shouldThrow:!1},e[0]=n):n=e[0];const s=ut(n);let o;e[1]===Symbol.for("react.memo_cache_sentinel")?(o={strict:!1},e[1]=o):o=e[1];const a=He(o);let l;e[2]!==a.brand||e[3]!==a.main||e[4]!==a.preview||e[5]!==a.skill?(l=(typeof a.main=="string"?Et(a.main)?.path:void 0)??a.preview??a.skill??a.brand??null,e[2]=a.brand,e[3]=a.main,e[4]=a.preview,e[5]=a.skill,e[6]=l):l=e[6];const c=l;let h;if(e[7]!==s?.params.appSlug||e[8]!==s?.params.collectionName||e[9]!==s?.params.itemId||e[10]!==c||e[11]!==t){if(h=[],t&&h.push(`### Selected Agent
2
- - ID: ${t}`),c){let f;e[13]!==c?(f=Mn(c),e[13]=c,e[14]=f):f=e[14];const k=f;let M;e[15]!==c?(M=In(c),e[15]=c,e[16]=M):M=e[16],h.push(`### Currently Open File
3
- The user has this file open in the Library and is most likely referring to it:
4
- - Name: ${M}
5
- - Library path: ${c}${k?`
6
- - Read/edit it with your file tools at: \`${k}\``:""}
7
-
8
- When a request is ambiguous about which file or resource it targets (e.g. "change the h1", "fix this", "what's in this file", "update the title"), assume it means this file unless the user clearly indicates otherwise.`)}let m;e[17]!==s?.params.appSlug||e[18]!==s?.params.collectionName||e[19]!==s?.params.itemId?(m=[],s?.params.appSlug&&m.push(`- Connection ID: ${s?.params.appSlug}`),s?.params.collectionName&&m.push(`- Collection: ${s?.params.collectionName}`),s?.params.itemId&&m.push(`- Item ID: ${s?.params.itemId}`),e[17]=s?.params.appSlug,e[18]=s?.params.collectionName,e[19]=s?.params.itemId,e[20]=m):m=e[20],m.length>0&&h.push(`### Current Resource
9
- The user is viewing the following resource:
10
- ${m.join(`
11
- `)}
12
-
13
- Help the user understand and work with this resource.`),e[7]=s?.params.appSlug,e[8]=s?.params.collectionName,e[9]=s?.params.itemId,e[10]=c,e[11]=t,e[12]=h}else h=e[12];return h.join(`
14
-
15
- `)}function Cn(){const t=re.c(5),e=Be(),{org:n}=ee();let s;t[0]===Symbol.for("react.memo_cache_sentinel")?(s={from:"/shell/$org/settings/connections/$appSlug/$collectionName/$itemId",shouldThrow:!1},t[0]=s):s=t[0];const o=ut(s);let a;return t[1]!==o?.params||t[2]!==n||t[3]!==e?(a=l=>{const h=l.toolCall.toolName.match(/^COLLECTION_([A-Z_]+)_(CREATE|UPDATE|DELETE)$/);if(!h||!h[1])return;const m=h[1],f=o?.params.appSlug;if(!f)return;e.invalidateQueries({queryKey:ue.collection(n.slug,f,m)});const k=m.toLowerCase().replace(/_/g," ");de.success(`${k} updated`)},t[1]=o?.params,t[2]=n,t[3]=e,t[4]=a):a=t[4],a}function An(){const t=re.c(4),{org:e,project:n}=ee(),s=`${e.id}/${n.id}`;let o;t[0]!==s?(o=ye.taskLastViewed(s),t[0]=s,t[1]=o):o=t[1];const[,a]=ge(o,Pn);let l;return t[2]!==a?(l={markTaskRead:h=>{a(m=>({...m,[h]:new Date().toISOString()}))}},t[2]=a,t[3]=l):l=t[3],l}function Pn(t){return t??{}}function St(){const t=pt(),{org:e}=ee(),n=He({strict:!1}),s=Mt({strict:!1}),o=n.virtualmcpid??Kt(e.id).id,a=(h,m)=>{t({to:"/$org/$taskId",params:{org:e.slug,taskId:h},search:f=>{const k={},M=m?.virtualMcpId??f.virtualmcpid;M&&(k.virtualmcpid=M);const p=f.main;return p&&typeof p=="string"&&!Dt(p)&&(k.main=p),(f.sidepanel==="chat"||f.sidepanel===0)&&(k.sidepanel=f.sidepanel),m?.autosend&&(k.autosend=ht),k}})},l=v.useRef(crypto.randomUUID()),c=s.taskId??l.current;return{virtualMcpId:o,taskId:c,navigateToTask:a}}function _n(t,e){const{mimeType:n,data:s}=t;if(n.startsWith("text/"))try{const o=new TextDecoder().decode(Uint8Array.from(atob(s),a=>a.charCodeAt(0)));return[{type:"text",text:`${e}
16
- ${o}`}]}catch(o){console.error("Failed to decode text file:",o)}return[{type:"file",url:`data:${n};base64,${s}`,filename:e,mediaType:n}]}function rt(t,e){const n=[];for(const s of t)!s||typeof s!="object"||("text"in s&&s.text?n.push({type:"text",text:`[${e}]
17
- ${s.text}`}):"blob"in s&&s.blob&&s.mimeType&&n.push({type:"file",url:`data:${s.mimeType};base64,${s.blob}`,filename:String(s.uri),mediaType:String(s.mimeType)}));return n}function Rn(t,e){const n=(t.files??[]).filter(l=>l.content?.trim()),s=t.omittedPaths??[];if(n.length===0&&s.length===0)return[];const o=n.map(l=>`<skill-file path="${l.relPath}">
18
- ${l.content.trim()}
19
- </skill-file>`).join(`
20
-
21
- `),a=s.length>0?`
22
-
23
- Other files in \`${t.sandboxPath}/\`: ${s.join(", ")}`:"";return[{type:"text",text:`[${e}]
24
- ${o}${a}`}]}function En(t,e){const n=[];for(const s of t){if(s.role!=="user"||!s.content)continue;const o=Array.isArray(s.content)?s.content:[s.content];for(const a of o)switch(a.type){case"text":{const l=a.text?.trim();if(!l)continue;n.push({type:"text",text:`[${e}]
25
- ${l}`});break}case"image":case"audio":{if(!a.data||!a.mimeType)continue;n.push({type:"file",url:`data:${a.mimeType};base64,${a.data}`,mediaType:a.mimeType});break}case"resource":{const l=a.resource;if(!l||!l.mimeType)continue;l&&("text"in l&&l.text?n.push({type:"text",text:`[${e}]
26
- ${l.text}`}):"blob"in l&&l.blob&&l.mimeType&&n.push({type:"file",url:`data:${l.mimeType};base64,${l.blob}`,filename:String(l.uri),mediaType:String(l.mimeType)}));break}}}return n}function kt(t){if(!t)return[];const e=[];let n="";const s=o=>{if(o){if(o.type==="text"&&"text"in o&&typeof o.text=="string")n+=o.text;else if(o.type==="mention"&&o.attrs){const a=o.attrs.char??"/",l=`${a}${o.attrs.name}`;if(o.attrs.kind==="task"){const c=o.attrs.metadata,h=c?.title??o.attrs.name??"",m=c?.context?.trim()||[h,c?.description?.trim()].filter(Boolean).join(`
27
-
28
- `);m&&e.push({type:"text",text:m});return}if(n+=l,a==="@"){const c=o.attrs.metadata;c&&typeof c=="object"&&!Array.isArray(c)&&"agentId"in c?e.push({type:"text",text:`[DELEGATE TO AGENT: ${c.title??o.attrs.name} (agent_id: ${c.agentId})]
29
- Use the subtask tool to delegate this task to the agent above. Include the full relevant context from this conversation in the prompt field — the subagent has no conversation history.`}):Array.isArray(c)&&e.push(...rt(c,l))}else if(o.attrs.kind==="skill"){const c=o.attrs.metadata;c&&!Array.isArray(c)&&Array.isArray(c.files)&&e.push(...Rn(c,l))}else{const c=o.attrs.metadata||o.attrs.prompts||[];Array.isArray(c)&&c.length>0&&typeof c[0]=="object"&&c[0]!==null&&"role"in c[0]?e.push(...En(c,l)):Array.isArray(c)&&e.push(...rt(c,l))}}else if(o.type==="file"&&o.attrs){const a=o.attrs,l=`[file:://${encodeURIComponent(a.name)}]`;n+=l,e.push(..._n(a,l))}if("content"in o&&Array.isArray(o.content))for(const a of o.content)s(a)}};return s(t),n.trim()&&e.unshift({type:"text",text:n.trim()}),e}function xs(t){const e=kt(t);return e.length===0?[]:[{id:crypto.randomUUID(),role:"user",parts:e,metadata:{tiptapDoc:t}}]}function ws(t){return new Set(t.filter(e=>e.status==="queued").map(e=>e.messageId))}function Dn(t){return(t??[]).map(e=>e?.type==="text"&&typeof e.text=="string"?e.text:"").join("").trim()}function Is(t){return t.filter(e=>e.status==="queued").sort((e,n)=>e.enqueuedAt-n.enqueuedAt)}function $n(t,e){return t.some(n=>n.messageId===e.messageId)?t:[...t,e]}function Un(t,e){return t.filter(n=>n.messageId!==e)}const ie=new Map,On=200;function Ln(t){if(ie.size<On||ie.has(t))return;const e=ie.keys().next().value;if(e!==void 0){ie.delete(e),$e.delete(e);for(const n of ve.keys())n.startsWith(`${e}:`)&&ve.delete(n)}}const $e=new Set;function Nn(t){$e.add(t)}function Fn(t){return $e.has(t)}function qn(t){$e.delete(t)}function Ae(t){const e=ie.get(t);if(e)return ie.delete(t),ie.set(t,e),e;Ln(t);const n=new Nt([]);return ie.set(t,n),n}function xt(t,e){Ae(t).update(n=>$n(n,e))}function Ve(t,e){Ae(t).update(n=>Un(n,e))}function jn(t,e){Ae(t).set(e)}const ve=new Map;function Vn(t,e){ve.set(`${t}:${e.id}`,e)}function Hn(t,e){const n=`${t}:${e}`,s=ve.get(n);return ve.delete(n),s}function lt(t,e){ve.delete(`${t}:${e}`)}async function ae(t,e){try{const n=await fetch(`/api/${encodeURIComponent(t)}/decopilot/queue/${encodeURIComponent(e)}`,{credentials:"include"});if(!n.ok)return;const s=await n.json();jn(e,s.items??[])}catch{}}function Ms(t){const e=re.c(2);let n;e[0]!==t?(n=Ae(t),e[0]=t,e[1]=n):n=e[1];const s=n;return v.useSyncExternalStore(s.subscribe,s.get,s.get)}function Bn(){const{org:t}=ee();return{enqueue:xt,refresh:e=>ae(t.slug,e),cancel:async(e,n)=>{const s=`thread-run:${e}:${n}`;Ve(e,n);try{const o=await fetch(`/api/${encodeURIComponent(t.slug)}/decopilot/queue/${encodeURIComponent(e)}/cancel/${encodeURIComponent(s)}`,{method:"POST",credentials:"include"});if(!o.ok&&o.status!==404)throw new Error(`Cancel failed: ${o.status}`);return!0}catch(o){return de.error(o instanceof Error?o.message:"Failed to cancel"),!1}finally{await ae(t.slug,e)}}}}function Ee(t,e){return t.find(n=>n!=null&&e.has(n.keyId))??null}function Kn(t,e,n){const s=o=>Ee([o],n);return{tiers:{fast:Ee([e.tiers.fast,t.tiers.fast],n),smart:Ee([e.tiers.smart,t.tiers.smart],n),thinking:Ee([e.tiers.thinking,t.tiers.thinking],n),image:s(t.tiers.image),web_search:s(t.tiers.web_search),deep_research:s(t.tiers.deep_research)}}}const Te={tiers:{}};function Qn(){const t=re.c(7),{org:e}=ee();let n;t[0]!==e.id?(n=ue.userModelPreferences(e.id),t[0]=e.id,t[1]=n):n=t[1];let s;t[2]!==e.slug?(s=async()=>{const a=await en(e.slug,"USER_MODEL_PREFERENCES_GET",{});return a?.tiers?a:Te},t[2]=e.slug,t[3]=s):s=t[3];let o;return t[4]!==n||t[5]!==s?(o={queryKey:n,queryFn:s,staleTime:6e4},t[4]=n,t[5]=s,t[6]=o):o=t[6],Tt(o)}function Wn(){return Qn().data??Te}function Ts(){const t=re.c(19),{org:e}=ee(),n=Jt(),s=Be();let o;t[0]!==e.id?(o=ue.userModelPreferences(e.id),t[0]=e.id,t[1]=o):o=t[1];const a=o;let l;t[2]!==a||t[3]!==s||t[4]!==n?(l=async M=>{const p=s.getQueryData(a)??Te;return await n.call("USER_MODEL_PREFERENCES_UPDATE",p)??p},t[2]=a,t[3]=s,t[4]=n,t[5]=l):l=t[5];let c,h,m,f;t[6]!==a||t[7]!==s?(c=M=>{const{tier:p,slot:A}=M,q=s.getQueryData(a),j=q??Te;return s.setQueryData(a,{tiers:{...j.tiers,[p]:A}}),{prev:q}},h=(M,p,A)=>{s.setQueryData(a,A?.prev??Te)},m=M=>{s.setQueryData(a,M)},f=()=>{s.isMutating({mutationKey:a})===1&&s.invalidateQueries({queryKey:a})},t[6]=a,t[7]=s,t[8]=c,t[9]=h,t[10]=m,t[11]=f):(c=t[8],h=t[9],m=t[10],f=t[11]);let k;return t[12]!==a||t[13]!==l||t[14]!==c||t[15]!==h||t[16]!==m||t[17]!==f?(k={mutationKey:a,mutationFn:l,onMutate:c,onError:h,onSuccess:m,onSettled:f},t[12]=a,t[13]=l,t[14]=c,t[15]=h,t[16]=m,t[17]=f,t[18]=k):k=t[18],Ct(k)}function Gn(){const t=re.c(4),e=tn(),n=Wn(),s=mt();let o;return t[0]!==s||t[1]!==e||t[2]!==n?(o=Kn(e,n,new Set(s.map(zn))),t[0]=s,t[1]=e,t[2]=n,t[3]=o):o=t[3],o}function zn(t){return t.id}function ce(t,e,n,s){if(!t)return null;const o=e.find(l=>l.id===t.keyId);if(!o)return null;const a=n.find(l=>l.modelId===t.modelId);return a?{...a,keyId:t.keyId}:{modelId:t.modelId,title:s??t.modelId,keyId:t.keyId,providerId:o.providerId,description:null,logo:null,capabilities:[],limits:null,costs:null}}function Xn(t){return t==="fast"||t==="smart"||t==="thinking"?t:"smart"}function Zn(t,e,n,s){if(!n||s.length===0)return null;const o=e.find(h=>h.id===n);if(!o)return null;const a=zt([o],{[n]:s}),l=t==="fast"?a.chat.fast:t==="thinking"?a.chat.thinking:a.chat.smart;if(!l)return null;const c=s.find(h=>h.modelId===l.modelId);return c?{...c,keyId:n}:null}const ct=new Set,oe=new Set;function be(t){return v.useSyncExternalStore(t.subscribe,t.get,t.get)}function Yn(t){return t.kind==="loading"?"ready":t.kind}const Jn=1e4,es=10,et=v.createContext(null),tt=v.createContext(null),nt=v.createContext(null),wt=v.createContext(null);function ts({children:t}){const{locator:e}=ee(),{virtualMcpId:n}=St(),[s,o]=ge(ye.chatSelectedImageModel(e),null),[a,l]=ge(ye.chatSelectedWebSearchModel(e),null),[c,h]=ge(ye.chatSelectedDeepResearchModel(e),null),[m,f]=v.useState(null),[k,M]=v.useState("default"),p=Gn(),[A,q]=ge(ye.chatSimpleModeTier(e),null),j=Xn(A),x=mt(),T=p.tiers[j],V=x.some(r=>r.id===T?.keyId)?T?.keyId:void 0,W=m&&x.some(r=>r.id===m)?m:V??x[0]?.id??null,{models:H,isLoading:P}=xe(W??void 0),{models:z}=xe(V),U=x.some(r=>r.id===p.tiers.image?.keyId)?p.tiers.image?.keyId:void 0,{models:te}=xe(U),B=x.some(r=>r.id===p.tiers.web_search?.keyId)?p.tiers.web_search?.keyId:void 0,{models:K}=xe(B),ne=x.some(r=>r.id===p.tiers.deep_research?.keyId)?p.tiers.deep_research?.keyId:void 0,{models:Q}=xe(ne),G=ce(T,x,z,T?.title)??Zn(j,x,W,H),se=P,X=H.filter(r=>r.capabilities?.includes("image")),b=ce(s,x,X),D=ce(p.tiers.image,x,te,p.tiers.image?.title)??b??X[0]??null,N=H.filter(Xt),_=ce(a,x,N),R=N.find(r=>r.modelId==="perplexity/sonar")??N[0]??null,he=ce(p.tiers.web_search,x,K,p.tiers.web_search?.title)??_??R,Z=H.filter(Zt),F=ce(c,x,Z),Se=Z.find(r=>r.modelId==="perplexity/deep-research")??Z.find(r=>r.asyncResearch===!0)??Z[0]??null,Ue=ce(p.tiers.deep_research,x,Q,p.tiers.deep_research?.title)??F??Se,Le=Gt(n)??{id:n,title:"",description:null,icon:null},[Pe,ke]=v.useState({}),_e=(r,g)=>{const L=[];for(const I of g.content??[])I.type==="text"&&I.text?.trim()&&L.push(I.text.trim());const E=L.join(`
30
- `);if(!E){le(r);return}new TextEncoder().encode(E).length>Jn||ke(I=>Object.keys(I).length>=es&&!(r in I)?I:{...I,[r]:E})},le=r=>{ke(g=>{const{[r]:L,...E}=g;return E})},[Ne,Fe]=ge(ye.chatLastAgentOption(e),r=>r&&r in je?r:null),Y=os(),st=Y?.isThreadLocked&&Y.lockedHarness!=null?gn(Y.lockedHarness,Y.lockedSandbox):null;yn({pendingOption:Ne,lockedHarness:Y?.isThreadLocked?Y.lockedHarness:null});const me=Y?.isThreadLocked?st:"decopilot",Re=me?je[me]:null,d=Re?.harness??null,u=Re?.sandbox??null,[$,O]=v.useState(void 0),y=v.useRef($);y.current=$;const w={selectedModel:G,setModel:()=>{},credentialId:W,setCredentialId:f,allModelsConnections:x,isModelsLoading:se,selectedVirtualMcp:Le,imageModel:D,setImageModel:r=>{o(r?.keyId?{keyId:r.keyId,modelId:r.modelId}:null)},webSearchModel:he,setWebSearchModel:r=>{l(r?.keyId?{keyId:r.keyId,modelId:r.modelId}:null)},deepResearchModel:Ue,setDeepResearchModel:r=>{h(r?.keyId?{keyId:r.keyId,modelId:r.modelId}:null)},chatMode:k,setChatMode:M,appContexts:Pe,setAppContext:_e,clearAppContext:le,tiptapDoc:$,setTiptapDoc:O,tiptapDocRef:y,resetInteraction:()=>{},simpleModeTier:j,setSimpleModeTier:r=>q(r),pendingAgentOption:me,setPendingAgentOption:Fe,pendingHarnessId:d,pendingSandboxProviderKind:u};return Me.jsx(nt.Provider,{value:w,children:t})}function Cs(t){const e=re.c(41),{virtualMcpId:n,task:s,children:o}=t,{locator:a}=ee(),{data:l}=At.useSession(),c=l?.user??null,{taskId:h,virtualMcpId:m,navigateToTask:f}=St(),[k]=Pt(),{markTaskRead:M}=An(),p=Ht(),A=h,q=m,j=Tn(q);let x;e[0]!==M||e[1]!==f?(x=(_,R)=>{M(_),f(_,{virtualMcpId:R?.virtualMcpId,autosend:R?.autosend})},e[0]=M,e[1]=f,e[2]=x):x=e[2];const T=x,V=A&&s?.id===A?s:null,W=V?.harness_id??null,H=V?.sandbox_provider_kind??null,P=V?.branch??null,z=W!=null,U=P;let te;e[3]!==U||e[4]!==T||e[5]!==p||e[6]!==n?(te=_=>{const R=crypto.randomUUID();return p.create({id:R,virtual_mcp_id:n,...U?{branch:U}:{},..._?.runtime?{runtime:_.runtime}:{}}).then(()=>T(R)).catch(()=>{T(R)}),R},e[3]=U,e[4]=T,e[5]=p,e[6]=n,e[7]=te):te=e[7];const B=te;let K;e[8]!==U||e[9]!==a||e[10]!==T||e[11]!==p||e[12]!==n?(K=_=>{const R=crypto.randomUUID(),he=_.virtualMcpId??n,Z=he===n?U:null;Lt(sessionStorage,a,R,_.message),p.create({id:R,virtual_mcp_id:he,...Z?{branch:Z}:{}}).then(()=>T(R,{virtualMcpId:_.virtualMcpId,autosend:!0})).catch(()=>{T(R,{virtualMcpId:_.virtualMcpId,autosend:!0})})},e[8]=U,e[9]=a,e[10]=T,e[11]=p,e[12]=n,e[13]=K):K=e[13];const ne=K;let Q;e[14]!==A||e[15]!==p?(Q=_=>{A&&p.setBranch(A,_)},e[14]=A,e[15]=p,e[16]=Q):Q=e[16];let G;e[17]!==V||e[18]!==B||e[19]!==ne||e[20]!==U||e[21]!==A||e[22]!==q||e[23]!==z||e[24]!==P||e[25]!==W||e[26]!==H||e[27]!==T||e[28]!==Q?(G={virtualMcpId:q,taskId:A,openTask:T,createTask:B,createTaskWithMessage:ne,activeTask:V,isThreadLocked:z,lockedHarness:W,lockedSandbox:H,lockedBranch:P,currentBranch:U,setCurrentTaskBranch:Q},e[17]=V,e[18]=B,e[19]=ne,e[20]=U,e[21]=A,e[22]=q,e[23]=z,e[24]=P,e[25]=W,e[26]=H,e[27]=T,e[28]=Q,e[29]=G):G=e[29];const se=G;let X;e[30]!==j||e[31]!==k||e[32]!==f||e[33]!==c?(X={user:c,contextPrompt:j,preferences:k,rawNavigateToTask:f},e[30]=j,e[31]=k,e[32]=f,e[33]=c,e[34]=X):X=e[34];const b=X;let D;e[35]!==o||e[36]!==b?(D=Me.jsx(ts,{children:Me.jsx(wt.Provider,{value:b,children:o})}),e[35]=o,e[36]=b,e[37]=D):D=e[37];let N;return e[38]!==D||e[39]!==se?(N=Me.jsx(tt.Provider,{value:se,children:D}),e[38]=D,e[39]=se,e[40]=N):N=e[40],N}function As({taskId:t,children:e}){const n=De(),s=Bt(),{virtualMcpId:o,activeTask:a,currentBranch:l}=ns(),c=Ft({isDesktopApp:s,harnessId:a?.harness_id,sandboxProviderKind:a?.sandbox_provider_kind}),h=n("chat.input.codingAgentRequiresDesktop");t&&!ct.has(t)&&(ct.add(t),Rt("chat_opened",{thread_id:t}));const{imageModel:m,webSearchModel:f,deepResearchModel:k,chatMode:M,setChatMode:p,appContexts:A,setTiptapDoc:q,simpleModeTier:j}=ss(),x=v.useContext(wt);if(!x)throw new Error(n("chat.chatContext.activeTaskProviderMissingContext"));const{user:T,contextPrompt:V,preferences:W,rawNavigateToTask:H}=x,{org:P,locator:z}=ee(),U=Bn(),[te,B]=v.useState(null),K=()=>{B(new Error(h))},ne=Cn(),Q=Be(),G=qt(),se=pt(),X=Qt({connectionId:Wt,orgId:P.id,orgSlug:P.slug}),b=jt(P.slug,t,{client:X,batch:Vt(a?.harness_id)});v.use(b.ready);const D=be(b.messages),N=be(b.status),_=be(b.finishReason),R=be(b.runStatusStage),he=be(b.hasMoreOlder),Z=be(b.isFetchingOlder),F=v.useRef({onToolCall:ne,queryClient:Q,rawNavigateToTask:H,taskId:t,manager:G,navigate:se,orgId:P.id,orgSlug:P.slug});F.current={onToolCall:ne,queryClient:Q,rawNavigateToTask:H,taskId:t,manager:G,navigate:se,orgId:P.id,orgSlug:P.slug},Yt({orgSlug:P.slug,taskId:t,onTaskStatus:d=>{const u=F.current,$=d.data.message_id;if(d.data.status==="in_progress"&&$){Ve(u.taskId,$);const O=Hn(u.taskId,$);O&&b.applyLocalMessage(O),ae(u.orgSlug,u.taskId)}Fn(u.taskId)&&(async()=>(await ae(u.orgSlug,u.taskId),await b.reconcileFromServer()&&Ae(u.taskId).get().length===0&&qn(u.taskId)))()}}),v.useEffect(()=>{const d={onData:y=>{if(y.type==="data-thread-title"){const w=y.data;if(!w?.title)return;const r=F.current;if(!r.taskId)return;r.manager.patchThread({id:r.taskId,title:w.title,updated_at:new Date().toISOString()});return}if(y.type==="data-deck-updated"){const w=y.data;if(!w?.path)return;const r=w.path,g=F.current;g.queryClient.invalidateQueries({queryKey:ue.orgFsStat(g.orgId,"home",r)}),g.queryClient.invalidateQueries({queryKey:ue.orgFsRecent(g.orgId)}),g.navigate({to:".",search:L=>({...L,main:Ot(r)}),replace:!0});return}if(y.type==="data-open-preview"){const w=y.data,r=F.current,g=r.taskId;if(g){const L=r.manager.threads.get().find(E=>E.id===g);r.manager.patchThread({id:g,...w?.branch?{branch:w.branch}:{},...w?.sandboxProviderKind?{sandbox_provider_kind:w.sandboxProviderKind}:{},metadata:{...L?.metadata??{},...w?.githubRepo?{githubRepo:w.githubRepo}:{},...w?.sandboxMap?{sandboxMap:w.sandboxMap}:{}}})}r.navigate({to:".",search:L=>({...L,main:"preview"}),replace:!0});return}},onFinish:(y,w,r)=>{const g=F.current;g.taskId&&ae(g.orgSlug,g.taskId),g.taskId&&g.manager.patchThread({id:g.taskId,status:bn(r,y.parts),updated_at:new Date().toISOString()});const L=y.parts?.some(I=>{const fe=I;return(fe.type==="tool-share_with_user"||fe.type==="tool-bash"||fe.type==="tool-write")&&fe.state==="output-available"});if(g.taskId&&L){const I=ue.threadOutputs(g.taskId);for(const fe of[0,1500,3e3,6e3,12e3,25e3])setTimeout(()=>{g.queryClient.invalidateQueries({queryKey:I})},fe)}g.queryClient.invalidateQueries({queryKey:ue.homeNextActions(g.orgSlug)});const E=y.metadata?.thread_id;E&&E!==g.taskId&&g.rawNavigateToTask(E)},onError:y=>{B(y),console.error("[chat] Error",y)},onToolCall:y=>F.current.onToolCall(y)};b.observer=d,ae(F.current.orgSlug,F.current.taskId);const u=y=>y==="submitted"||y==="streaming";let $=u(b.status.get().kind);const O=b.status.subscribe(()=>{const y=u(b.status.get().kind);if(y===$)return;$=y;const w=F.current;ae(w.orgSlug,w.taskId)});return()=>{b.observer===d&&(b.observer=null),O()}},[b]);const Se=N.kind==="submitted"||N.kind==="streaming",Ue=D.length===0,Oe=D.at(-1),Le=!Se&&Oe?.role==="assistant"&&Oe.parts.some(d=>"state"in d&&d.state==="approval-requested"),Pe=a,ke=(Pe?.status==="in_progress"||Pe?.status==="expired")&&N.kind==="ready"&&D.length>0;async function _e(d){const u=t,$=o;if(c)return K(),oe.delete(u),!1;const O=Object.entries(A),y=O.length>0?O.map(([E,I])=>`### App Context: ${E}
31
- ${I}`).join(`
32
-
33
- `):"",w=[V,y].filter(Boolean).join(`
34
-
35
- `);let r=M;r==="gen-image"&&!m&&(r="default"),r==="web-search"&&!f&&(r="default"),r==="deep-research"&&!k&&(r="default"),(r==="web-search"||r==="deep-research")&&p("default");const g=vn({thread:a?{harness_id:a.harness_id??null,sandbox_provider_kind:a.sandbox_provider_kind??null,branch:a.branch??null}:null,globals:{branch:l}});a?.harness_id||G.patchThread({id:u,harness_id:g.harnessId??"decopilot",updated_at:new Date().toISOString()});const L={tier:j,mode:r,toolApprovalLevel:W.toolApprovalLevel??_t(),system:w||void 0,agent:{id:$},thread_id:u,...g};try{if(Se||ke){let E=!0;try{Vn(u,d),await b.enqueue(d,L),xt(u,{workflowId:`thread-run:${u}:${d.id}`,messageId:d.id,text:Dn(d.parts),hasAttachments:d.parts.some(I=>I.type==="file"),status:"queued",enqueuedAt:Date.now(),optimistic:!0}),Nn(u)}catch(I){E=!1,lt(u,d.id),Ve(u,d.id),B(I instanceof Error?I:new Error(String(I))),de.error(I instanceof Error?I.message:n("chat.chatContext.failedToQueueMessage"))}return ae(P.slug,u),E}return await b.submit({kind:"message",message:d},L),!0}finally{oe.delete(u)}}async function le(d){const u=d.parts??kt(d.tiptapDoc);if(u.length===0||oe.has(t))return;oe.add(t),B(null),q(void 0);const $={tiptapDoc:d.tiptapDoc,created_at:new Date().toISOString(),user:{avatar:T?.image??void 0,name:T?.name??"you"}},O={id:crypto.randomUUID(),role:"user",parts:u,metadata:$};await _e(O)}async function Ne(d,u){if(c)return K(),!1;if(oe.has(t))return de.info(n("chat.chatContext.stillSendingPreviousMessage")),!1;if(oe.add(t),!await U.cancel(t,d))return oe.delete(t),de.error(n("chat.chatContext.couldNotRemoveOriginalMessage")),!1;lt(t,d),b.removeLocalMessage(d);const O={id:crypto.randomUUID(),role:"user",parts:[{type:"text",text:u}],metadata:{created_at:new Date().toISOString(),user:{avatar:T?.image??void 0,name:T?.name??"you"}}};try{return await _e(O)}catch(y){return de.error(y instanceof Error?y.message:n("chat.chatContext.failedToSendEditedMessage")),!1}}const Fe=async()=>{b.stop();try{const d=await fetch(`/api/${P.slug}/decopilot/cancel/${t}`,{method:"POST",credentials:"include"});if(d.status===404)return;if(!d.ok){const u=await d.json().catch(()=>({}));throw new Error(u.message??n("chat.chatContext.cancelFailedStatus",{status:d.status}))}}catch(d){const u=d instanceof Error?d.message:n("chat.chatContext.failedToCancel");de.error(u),console.error("[chat] cancelRun",d)}},Y=d=>d&&typeof d=="object"&&"type"in d?le({tiptapDoc:d}):le(d),me=He({strict:!1}).autosend===ht;v.useEffect(()=>{if(!me||D.length>0||c)return;const d=$t(sessionStorage,z,t);d&&le(d.message).then(()=>{Ut(sessionStorage,z,t)})},[me,D.length,c,z,t,le]);const Re={messages:D,status:Yn(N),sendMessage:Y,editQueuedMessage:Ne,stop:()=>{if(c){K();return}Fe()},submit:async(d,u)=>{if(c){K();return}await b.submit(d,u)},removeLocalMessage:d=>b.removeLocalMessage(d),isSendInFlight:()=>oe.has(t),error:te,clearError:()=>B(null),finishReason:_,runStatusStage:R,clearFinishReason:()=>b.finishReason.set(null),isStreaming:Se,isChatEmpty:Ue,isWaitingForApprovals:Le??!1,isRunInProgress:ke,hasMoreOlder:he,isFetchingOlder:Z,fetchOlderMessages:b.fetchOlderMessages.bind(b)};return Me.jsx(et.Provider,{value:Re,children:e})}function Ps(){const t=De(),e=v.useContext(et);if(!e)throw new Error(t("chat.chatContext.useChatStreamMissingContext"));return e}function _s(){return v.useContext(et)}function ns(){const t=De(),e=v.useContext(tt);if(!e)throw new Error(t("chat.chatContext.useChatTaskMissingContext"));return e}function ss(){const t=De(),e=v.useContext(nt);if(!e)throw new Error(t("chat.chatContext.useChatPrefsMissingContext"));return e}function Rs(){return v.useContext(nt)}function os(){return v.useContext(tt)}export{As as A,St as B,ts as C,Rs as D,an as E,Sn as H,ln as S,gs as V,Ps as a,os as b,ns as c,Ms as d,Bn as e,lt as f,Ee as g,Qn as h,Ts as i,Gn as j,_s as k,Cs as l,ws as m,fs as n,kt as o,bs as p,wn as q,In as r,Is as s,xs as t,ss as u,vs as v,ys as w,Ss as x,vt as y,ks as z};