decocms 4.315.8 → 4.315.9

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 (245) hide show
  1. package/dist/client/assets/{AlertCircle-CkzV0rLF.js → AlertCircle-CL_4tn1p.js} +1 -1
  2. package/dist/client/assets/{AreaChart-pHg9Fx4q.js → AreaChart-j27KmB4g.js} +1 -1
  3. package/dist/client/assets/{ArrowLeft-Dm5_VLV8.js → ArrowLeft-CTlE91Se.js} +1 -1
  4. package/dist/client/assets/{ArrowUp-CkqJs-MZ.js → ArrowUp-Cg_S3Ibc.js} +1 -1
  5. package/dist/client/assets/{Check-C2opEhYm.js → Check-BxJwXI1K.js} +1 -1
  6. package/dist/client/assets/{CheckCircle-BuxJYUrk.js → CheckCircle-BOEKgm4s.js} +1 -1
  7. package/dist/client/assets/{ChevronDown-Bueer4qU.js → ChevronDown-DJdrVENB.js} +1 -1
  8. package/dist/client/assets/{ChevronRight-DofQuep9.js → ChevronRight-DVQxNeux.js} +1 -1
  9. package/dist/client/assets/{ChevronSelectorVertical-CDh4aSpQ.js → ChevronSelectorVertical-CeYKq1nS.js} +1 -1
  10. package/dist/client/assets/{ChevronUp-BKRDLJov.js → ChevronUp-D_e-_bgt.js} +1 -1
  11. package/dist/client/assets/{Copy01-ynzmMJf5.js → Copy01-r3rR8oFl.js} +1 -1
  12. package/dist/client/assets/{CreditCard01-iLPjz2EG.js → CreditCard01-B5lrI4QA.js} +1 -1
  13. package/dist/client/assets/{DotsVertical-Dl2a4pwB.js → DotsVertical-CCLHyaor.js} +1 -1
  14. package/dist/client/assets/{Download01-D5_gKwhP.js → Download01-BMBwpCqW.js} +1 -1
  15. package/dist/client/assets/{ErrorBarContext-77FeXJso.js → ErrorBarContext-CarF3tVq.js} +1 -1
  16. package/dist/client/assets/{Eye-DtRvnPj3.js → Eye-BDx5CVQ1.js} +1 -1
  17. package/dist/client/assets/{FilterLines-C90xQoMG.js → FilterLines-Be8XDwJK.js} +1 -1
  18. package/dist/client/assets/{GitBranch01-xz-_Yjyh.js → GitBranch01-BCGBIJSq.js} +1 -1
  19. package/dist/client/assets/{Globe01-CG410Az0.js → Globe01-Cn5Tf0_x.js} +1 -1
  20. package/dist/client/assets/{Globe04-BqFwV5BD.js → Globe04-DvBPwF-i.js} +1 -1
  21. package/dist/client/assets/{HardDrive-BXDcottD.js → HardDrive-C9LeptOg.js} +1 -1
  22. package/dist/client/assets/{Image01-DWQsBmMv.js → Image01-kU7eM7XD.js} +1 -1
  23. package/dist/client/assets/{Key01-N_ZWYtTX.js → Key01-Cm6_PJva.js} +1 -1
  24. package/dist/client/assets/{LinkExternal01-D5ZZVcoA.js → LinkExternal01-BWZ7F1Al.js} +1 -1
  25. package/dist/client/assets/{LockUnlocked01-DF_DQFCQ.js → LockUnlocked01-BR3rF-gO.js} +1 -1
  26. package/dist/client/assets/{LogOut01-Bp_us-Ox.js → LogOut01-B_RyGfAi.js} +1 -1
  27. package/dist/client/assets/{Monitor01-CmZ7P9ai.js → Monitor01-DqkHRD9c.js} +1 -1
  28. package/dist/client/assets/{Package-Dm3trmid.js → Package-BE8vO8A1.js} +1 -1
  29. package/dist/client/assets/{Palette-DT9uu6qO.js → Palette-B7cKDulV.js} +1 -1
  30. package/dist/client/assets/{Play-C96cznrL.js → Play-DtOxCqq9.js} +1 -1
  31. package/dist/client/assets/{Plus-DIm7CtF1.js → Plus-pF1gkrQu.js} +1 -1
  32. package/dist/client/assets/{SearchLg-GP23COxS.js → SearchLg-D4Puwtic.js} +1 -1
  33. package/dist/client/assets/{SearchMd-CO8ah3bm.js → SearchMd-NcT2_7Kt.js} +1 -1
  34. package/dist/client/assets/{Sector-DlhiHncA.js → Sector-BDJHHdvk.js} +1 -1
  35. package/dist/client/assets/{Settings02-DKIynolO.js → Settings02-BxXbVA5q.js} +1 -1
  36. package/dist/client/assets/{Share07-9sygjVhJ.js → Share07-C4XeWbrs.js} +1 -1
  37. package/dist/client/assets/{Shield01-BVjFRMqE.js → Shield01-OSTRjHtV.js} +1 -1
  38. package/dist/client/assets/{Stars01-Dy9Hsrtu.js → Stars01-DoaX-aGy.js} +1 -1
  39. package/dist/client/assets/{Stars02-BWafZXKL.js → Stars02-2Q9rKKnE.js} +1 -1
  40. package/dist/client/assets/{Sun-BU9tFsLF.js → Sun--FKpotKb.js} +1 -1
  41. package/dist/client/assets/{SwitchHorizontal01-s2Jb9X7B.js → SwitchHorizontal01-Be37_ayv.js} +1 -1
  42. package/dist/client/assets/{Tool01-ClWaWn3c.js → Tool01-BogBG-0d.js} +1 -1
  43. package/dist/client/assets/{Tool02-DOXsydL5.js → Tool02-BRNvwlps.js} +1 -1
  44. package/dist/client/assets/{Trash01-CsCWSj3Z.js → Trash01-BqFal5cZ.js} +1 -1
  45. package/dist/client/assets/{TrendUp01-sisgIENp.js → TrendUp01-HylxHo_S.js} +1 -1
  46. package/dist/client/assets/{Upload01-x2XapLpM.js → Upload01-C3vnnmtB.js} +1 -1
  47. package/dist/client/assets/{User01-BLBnLkZ-.js → User01-BExsxEwq.js} +1 -1
  48. package/dist/client/assets/{UserSquare-CZB9NBEt.js → UserSquare-DbNMZZiK.js} +1 -1
  49. package/dist/client/assets/{Users01-DOJyIilu.js → Users01-kbK47QLH.js} +1 -1
  50. package/dist/client/assets/{Users03-Dr-turCI.js → Users03-0K5fdw0U.js} +1 -1
  51. package/dist/client/assets/{XCircle-ByLTULyg.js → XCircle-Y-35SKWf.js} +1 -1
  52. package/dist/client/assets/{XClose-C7Ypg3YR.js → XClose-CEk3thCy.js} +1 -1
  53. package/dist/client/assets/{YAxis-DNCqDEtu.js → YAxis-BirTvn3v.js} +1 -1
  54. package/dist/client/assets/{Zap-BFYXXgOH.js → Zap-ByV4KGZt.js} +1 -1
  55. package/dist/client/assets/{ZapSquare-B34n3eW3.js → ZapSquare-0ixpYIod.js} +1 -1
  56. package/dist/client/assets/{ZoomOut-De6Y8zsq.js → ZoomOut-DutIC766.js} +1 -1
  57. package/dist/client/assets/{access-gate-Dhqfvmrb.js → access-gate-CsL0UrqU.js} +1 -1
  58. package/dist/client/assets/{agent-icon-Dm8ROwob.js → agent-icon-DzkKc2-F.js} +1 -1
  59. package/dist/client/assets/{agents-list-CfklaJyI.js → agents-list-CRLJcP-F.js} +1 -1
  60. package/dist/client/assets/{ai-providers-lfEDJXBd.js → ai-providers-DC2V-odi.js} +1 -1
  61. package/dist/client/assets/{alert-CiTezlQb.js → alert-CIkkcDzY.js} +1 -1
  62. package/dist/client/assets/{alert-dialog-O_BHWaSR.js → alert-dialog-CkyuBFYU.js} +1 -1
  63. package/dist/client/assets/{analytics-tab-CPAQvUZw.js → analytics-tab-CNymj_o_.js} +1 -1
  64. package/dist/client/assets/{api-keys-WsnfK4vH.js → api-keys-CCgZd7P-.js} +1 -1
  65. package/dist/client/assets/{app-editor-E9viIdOu.js → app-editor-BFto2s4b.js} +1 -1
  66. package/dist/client/assets/{auth-97Xd2KQD.js → auth-B-lUc7JB.js} +1 -1
  67. package/dist/client/assets/{auth-catchall-BqZ4MSal.js → auth-catchall-04uLPCJa.js} +1 -1
  68. package/dist/client/assets/{auth-entry-Bv9nikOw.js → auth-entry-Vh_1p-8h.js} +1 -1
  69. package/dist/client/assets/{auth-split-layout-B_-U8HnZ.js → auth-split-layout-DzXV6Cyv.js} +1 -1
  70. package/dist/client/assets/{authenticate-and-persist-oauth-CVuk8U7C.js → authenticate-and-persist-oauth-B6kuSGji.js} +1 -1
  71. package/dist/client/assets/{automation-list-row-B2WvcnD2.js → automation-list-row-CxXGHm2i.js} +1 -1
  72. package/dist/client/assets/{automation-runs-C-dUH7vL.js → automation-runs-RL4Kwf-0.js} +1 -1
  73. package/dist/client/assets/{automations-4bTczlBY.js → automations-DHigjlCG.js} +1 -1
  74. package/dist/client/assets/{avatar-T4HFdCsq.js → avatar-DlzgwwKu.js} +1 -1
  75. package/dist/client/assets/{badge-EiflaT_K.js → badge-BZBoWlI8.js} +1 -1
  76. package/dist/client/assets/{block-document-C1_9rW7y.js → block-document-C156keNk.js} +1 -1
  77. package/dist/client/assets/{breadcrumb-B0yqAhd6.js → breadcrumb-DzYTRi3x.js} +1 -1
  78. package/dist/client/assets/{buckets-CWUhQmS8.js → buckets-tkXWjufa.js} +1 -1
  79. package/dist/client/assets/{bulk-category-panel-GjhYIh9Z.js → bulk-category-panel-CUzT4c0q.js} +1 -1
  80. package/dist/client/assets/{capability-load-error-D6yRI_bf.js → capability-load-error-DH0iwI9H.js} +1 -1
  81. package/dist/client/assets/{cards-Dgq9R2-4.js → cards-Dt3LM-42.js} +1 -1
  82. package/dist/client/assets/{category-editor-B5_P9UOK.js → category-editor-Odt9RZZD.js} +1 -1
  83. package/dist/client/assets/{cdn-tab-D2l8TTDd.js → cdn-tab-BJ9WT8PJ.js} +1 -1
  84. package/dist/client/assets/{chart-DJU2IjAo.js → chart-CBLWGjtp.js} +1 -1
  85. package/dist/client/assets/{chat-context-BY7xRXxg.js → chat-context-CJuvF_Xp.js} +1 -1
  86. package/dist/client/assets/{checkbox-B1YhjCUq.js → checkbox-BQPaB63z.js} +1 -1
  87. package/dist/client/assets/{choose-editor-y-iGUJNW.js → choose-editor-qy9C3IvH.js} +1 -1
  88. package/dist/client/assets/{cli-auth-success-BM_DJoRX.js → cli-auth-success-D60ln-6M.js} +1 -1
  89. package/dist/client/assets/{collection-detail-C-h_IIbk.js → collection-detail-B1_5OcZk.js} +1 -1
  90. package/dist/client/assets/{collection-display-button-BoA_zNUN.js → collection-display-button-BLkdrF3x.js} +1 -1
  91. package/dist/client/assets/{collection-search-C3ITf4PL.js → collection-search-PEdTTjuO.js} +1 -1
  92. package/dist/client/assets/{collection-table-wrapper-B9_lOrCX.js → collection-table-wrapper-BcFu8Zw5.js} +1 -1
  93. package/dist/client/assets/{collection-tabs-IptzBr8k.js → collection-tabs-kdKuJC7q.js} +1 -1
  94. package/dist/client/assets/{command-DQkOmuVt.js → command-B3frpUPd.js} +1 -1
  95. package/dist/client/assets/{commerce-onboarding-B-9nQ9Kq.js → commerce-onboarding-De6IwIlB.js} +1 -1
  96. package/dist/client/assets/{config-DlJwhwZM.js → config-JQlEuDVB.js} +1 -1
  97. package/dist/client/assets/{connect-YDqCMEQg.js → connect-d22oVehh.js} +1 -1
  98. package/dist/client/assets/{connection-DXVX-Cvw.js → connection-DOtDb_My.js} +1 -1
  99. package/dist/client/assets/{connection-card-DZL8U2Oz.js → connection-card-DWbC2xiO.js} +1 -1
  100. package/dist/client/assets/{connection-detail-CrtV7_9C.js → connection-detail-C6hII8rU.js} +1 -1
  101. package/dist/client/assets/{connection-form-helpers-BehosOAh.js → connection-form-helpers-B88QRdFU.js} +1 -1
  102. package/dist/client/assets/{connections-a2JYR8lz.js → connections-DBK5-bEB.js} +1 -1
  103. package/dist/client/assets/{decopilot-sse-pool-DZgVeU98.js → decopilot-sse-pool-BDpW5Ile.js} +1 -1
  104. package/dist/client/assets/{dialog-Dje85m6l.js → dialog-B93cuv2j.js} +1 -1
  105. package/dist/client/assets/{domain-settings-D9L2FS30.js → domain-settings-BvpMSxSy.js} +1 -1
  106. package/dist/client/assets/{drawer-ByuY_14m.js → drawer-Dw_C-OFR.js} +1 -1
  107. package/dist/client/assets/{dropdown-menu-DOvmqsiG.js → dropdown-menu-DFKdfWqR.js} +1 -1
  108. package/dist/client/assets/{e2e-tab-DhIvz2rJ.js → e2e-tab-DOoB_3LX.js} +1 -1
  109. package/dist/client/assets/{editor-Ci6UfGD4.js → editor-BUwVGK9H.js} +1 -1
  110. package/dist/client/assets/{empty-state-CWJrqb0p.js → empty-state-D2Lwpepj.js} +1 -1
  111. package/dist/client/assets/{empty-state-CBVYWgXH.js → empty-state-D4oRtGhK.js} +1 -1
  112. package/dist/client/assets/{extract-connection-data-qRGJBXXK.js → extract-connection-data-CRaRW80o.js} +1 -1
  113. package/dist/client/assets/{file-explorer-BOB0I3Xd.js → file-explorer-CqyuA_Or.js} +1 -1
  114. package/dist/client/assets/{file-type-icon-BL0Pha35.js → file-type-icon-zbvv6X-a.js} +1 -1
  115. package/dist/client/assets/{folder-icon-C0l5GzKL.js → folder-icon-CqgUuCJQ.js} +1 -1
  116. package/dist/client/assets/{form-BS9U3FXJ.js → form-cO8Ae-uo.js} +1 -1
  117. package/dist/client/assets/{general-DDxUxj4q.js → general-Cr0QzBen.js} +1 -1
  118. package/dist/client/assets/{github-repo-picker-la7DJEBj.js → github-repo-picker-BHWlExt5.js} +1 -1
  119. package/dist/client/assets/{hooks-FKOZdGJr.js → hooks-D6IFa_T3.js} +1 -1
  120. package/dist/client/assets/{hosting-tab-CenPiZoe.js → hosting-tab-BcPYFmK7.js} +1 -1
  121. package/dist/client/assets/{index-DRc6R8Fy.js → index-B-cZa7wO.js} +6 -6
  122. package/dist/client/assets/{index-BgHa4dOV.js → index-CVGE73KR.js} +1 -1
  123. package/dist/client/assets/{index-9AjWL1kY.js → index-CWCDqN5a.js} +1 -1
  124. package/dist/client/assets/{index-CuCJpWsz.js → index-CqaHxo9D.js} +1 -1
  125. package/dist/client/assets/{index-BZVho9-x.js → index-DKGYnX1-.js} +3 -3
  126. package/dist/client/assets/{index-5E9-9Po7.js → index-DNOFwZPj.js} +1 -1
  127. package/dist/client/assets/{index-BZiJU7qP.js → index-DnhjwHLJ.js} +1 -1
  128. package/dist/client/assets/{index-Chg16cvM.js → index-Dt2JEPgQ.js} +1 -1
  129. package/dist/client/assets/{index-cloLMcwk.js → index-DyUkIZwj.js} +1 -1
  130. package/dist/client/assets/{index-redirect-d54OB8uV.js → index-redirect-D1GFo6EN.js} +1 -1
  131. package/dist/client/assets/{infra-billing-DJW8PM-D.js → infra-billing-DIx1pNqi.js} +1 -1
  132. package/dist/client/assets/{input-DIJTuAiI.js → input-BcHHFntG.js} +1 -1
  133. package/dist/client/assets/{integration-icon-BuLRi6Ml.js → integration-icon-BHFBVJRp.js} +1 -1
  134. package/dist/client/assets/{invite-member-dialog-qV1dhIC9.js → invite-member-dialog-DWH_RQe0.js} +1 -1
  135. package/dist/client/assets/{label-1eNt2dYG.js → label-DQA1pWHP.js} +1 -1
  136. package/dist/client/assets/{layout-AEVGrfbS.js → layout-CxknLOAB.js} +1 -1
  137. package/dist/client/assets/{login-CtpytVO1.js → login-D-YHxf_y.js} +1 -1
  138. package/dist/client/assets/{markdown-IvxHRyNi.js → markdown-DVCh_fSS.js} +1 -1
  139. package/dist/client/assets/{mcp-oauth-BmtUTIZx.js → mcp-oauth-DghlcFJ0.js} +1 -1
  140. package/dist/client/assets/{members-DOCAYA4Z.js → members-Knrv1J6U.js} +1 -1
  141. package/dist/client/assets/{monaco-editor-DOxRkV0B.js → monaco-editor-HEsNuj5p.js} +1 -1
  142. package/dist/client/assets/{monitoring-stats-row-bKbPxkng.js → monitoring-stats-row-C2Bu3hAG.js} +1 -1
  143. package/dist/client/assets/{multi-select-BNyOYyQR.js → multi-select-BxUB4Pu8.js} +1 -1
  144. package/dist/client/assets/{oauth-callback-CSAwKqpa.js → oauth-callback-Cx_sZ7PB.js} +1 -1
  145. package/dist/client/assets/{oauth-callback-ai-provider-DP94Efqw.js → oauth-callback-ai-provider-H8mg4wXh.js} +1 -1
  146. package/dist/client/assets/{onboarding-D8d_QiIv.js → onboarding-4VcDWfx4.js} +1 -1
  147. package/dist/client/assets/{org-layout-BBYWQwag.js → org-layout-BuaZBt1u.js} +1 -1
  148. package/dist/client/assets/{organization-choice-B3v0o9jH.js → organization-choice-BuVF1S7l.js} +1 -1
  149. package/dist/client/assets/{orgs-DkD0u01M.js → orgs-BSyNQ5nv.js} +1 -1
  150. package/dist/client/assets/{page-seo-form-DIdWp_Gn.js → page-seo-form-CTIEBFhp.js} +1 -1
  151. package/dist/client/assets/{popover-B3OuMlKR.js → popover-BtaYotxf.js} +1 -1
  152. package/dist/client/assets/{post-calendar-DbqKByy3.js → post-calendar-BaFw8-Xi.js} +1 -1
  153. package/dist/client/assets/{post-editor-B4Dof7zD.js → post-editor-Bka6zxWi.js} +1 -1
  154. package/dist/client/assets/{primitives-D1x3zqY1.js → primitives-P2itvxW4.js} +1 -1
  155. package/dist/client/assets/{profile-BWhfQNoL.js → profile-DiGYOC37.js} +1 -1
  156. package/dist/client/assets/{project-app-view-xWbOkTi8.js → project-app-view-CYKEJGI9.js} +1 -1
  157. package/dist/client/assets/{prompts-Bs55oclw.js → prompts-BlmeJuLY.js} +1 -1
  158. package/dist/client/assets/record-editor-CMrfxwqc.js +1 -0
  159. package/dist/client/assets/{redirect-editor-h8Z1AAyl.js → redirect-editor-Dc13twyN.js} +1 -1
  160. package/dist/client/assets/registry-D1RK8ldf.js +2 -0
  161. package/dist/client/assets/{registry-layout-1EeeGV1e.js → registry-layout-BMpqGNDQ.js} +1 -1
  162. package/dist/client/assets/{reports-EUnUAqRe.js → reports-BNPcUZs8.js} +1 -1
  163. package/dist/client/assets/{require-capability-BFWk0jAl.js → require-capability-BVMnPdze.js} +1 -1
  164. package/dist/client/assets/{required-auth-layout-BzolNhCo.js → required-auth-layout-DhiF2W1M.js} +1 -1
  165. package/dist/client/assets/{reset-password-BDzxBCgz.js → reset-password-_YUPdefm.js} +1 -1
  166. package/dist/client/assets/{review-settings-Dz3jJmfx.js → review-settings-BF10cbM5.js} +1 -1
  167. package/dist/client/assets/{roles-BpCgO6Te.js → roles-D1SBNCKM.js} +1 -1
  168. package/dist/client/assets/{scroll-area-CmfbQ0k6.js → scroll-area-Dv0RFNSf.js} +1 -1
  169. package/dist/client/assets/{search-input-B5IlyOHK.js → search-input-2jKUH-nd.js} +1 -1
  170. package/dist/client/assets/{secrets-B2tDxCCi.js → secrets-CLDVUmWB.js} +1 -1
  171. package/dist/client/assets/{sections-editor-BPDik0CJ.js → sections-editor-Bn4t7sOX.js} +1 -1
  172. package/dist/client/assets/{select-W5fEmgO1.js → select-Cc_Ttu05.js} +1 -1
  173. package/dist/client/assets/{select-model-BI5n0fdt.js → select-model-Yl5j2Tw9.js} +1 -1
  174. package/dist/client/assets/{self-tool-result-CUY8lXfh.js → self-tool-result-0cDglymW.js} +1 -1
  175. package/dist/client/assets/{seo-editor-DRA8CB5C.js → seo-editor-Dt5xTzhA.js} +1 -1
  176. package/dist/client/assets/{settings-layout-B-iZrQ19.js → settings-layout-xcp3z6Vj.js} +1 -1
  177. package/dist/client/assets/{shell-controls-BVuk02iv.js → shell-controls-CDF0CW1H.js} +1 -1
  178. package/dist/client/assets/{shell-layout-Bbu9US5Y.js → shell-layout-CeOtF7mb.js} +1 -1
  179. package/dist/client/assets/{skill-preview-Dx0wyioV.js → skill-preview-DNtnqRrN.js} +1 -1
  180. package/dist/client/assets/{skills-DTuZvYqf.js → skills-tzJVIYUM.js} +1 -1
  181. package/dist/client/assets/{spinner-2YrjsZ0k.js → spinner-3u4DI7qB.js} +1 -1
  182. package/dist/client/assets/{sso-BupLBJpT.js → sso-DTF7UPbu.js} +1 -1
  183. package/dist/client/assets/{store-BJW7M-v7.js → store-BKRqonLR.js} +1 -1
  184. package/dist/client/assets/store-registry-BwoIjmOK.js +2 -0
  185. package/dist/client/assets/{super-agent-icon-BzeHQLgI.js → super-agent-icon-C0KzQMI4.js} +1 -1
  186. package/dist/client/assets/{switch-C8ESSGPB.js → switch-CTvA9699.js} +1 -1
  187. package/dist/client/assets/{synced-repos-CqP_clO0.js → synced-repos-BrQQmACI.js} +1 -1
  188. package/dist/client/assets/{table-BHPFDuYO.js → table-CYbAOv1M.js} +1 -1
  189. package/dist/client/assets/{tabs-B0ILtoA9.js → tabs-CyPxPGyI.js} +1 -1
  190. package/dist/client/assets/{task-board-CDv-XJ2U.js → task-board-DfBQPg6r.js} +1 -1
  191. package/dist/client/assets/{tasks-B6g6Mxmz.js → tasks-o5W4MjSx.js} +1 -1
  192. package/dist/client/assets/{textarea-Buvn72cT.js → textarea-Dcz8E2N7.js} +1 -1
  193. package/dist/client/assets/{thread-route-DZYjgtCg.js → thread-route-SM9xfyxG.js} +1 -1
  194. package/dist/client/assets/{toggle-group-B-U60nZB.js → toggle-group-DCg-dK6K.js} +1 -1
  195. package/dist/client/assets/{toolbar-D_EEp8Mj.js → toolbar-DCWHnKyU.js} +1 -1
  196. package/dist/client/assets/{track-BCBM0lu5.js → track-D0InpUUu.js} +1 -1
  197. package/dist/client/assets/{types-CN4C807w.js → types-DuxK-8WA.js} +1 -1
  198. package/dist/client/assets/{use-ai-providers-DG6vV5Hx.js → use-ai-providers-CocBUykr.js} +1 -1
  199. package/dist/client/assets/{use-api-keys-ByUSQjvJ.js → use-api-keys-CW4BDX4s.js} +1 -1
  200. package/dist/client/assets/{use-automations-CvP7MmXu.js → use-automations-BxFoGyOn.js} +1 -1
  201. package/dist/client/assets/{use-autosave-BPDElkW3.js → use-autosave--V_4nvzh.js} +1 -1
  202. package/dist/client/assets/{use-connection-G0MWfeF4.js → use-connection-Bz4cOi6L.js} +1 -1
  203. package/dist/client/assets/{use-copy-DF3dMdXF.js → use-copy-2LvRpRib.js} +1 -1
  204. package/dist/client/assets/{use-create-virtual-mcp-B2Bs3JQL.js → use-create-virtual-mcp-DyR_TXkL.js} +1 -1
  205. package/dist/client/assets/{use-debounced-autosave-DX7KGPEc.js → use-debounced-autosave-BXFXFPOt.js} +1 -1
  206. package/dist/client/assets/{use-debounced-value-C6w6Kc_A.js → use-debounced-value-BxBz9Gt4.js} +1 -1
  207. package/dist/client/assets/{use-decopilot-events-DFEnjoJS.js → use-decopilot-events-9Stqn4Fp.js} +1 -1
  208. package/dist/client/assets/{use-delete-connection-BarTqrm2.js → use-delete-connection-BZNVBVMW.js} +1 -1
  209. package/dist/client/assets/{use-deployment-admin-Hm0yvR3w.js → use-deployment-admin-C16tQ43l.js} +1 -1
  210. package/dist/client/assets/{use-destination-route-CKl6x7eL.js → use-destination-route-BAYYRSMz.js} +1 -1
  211. package/dist/client/assets/{use-file-configs-d52rl_fd.js → use-file-configs-CnCQVEM_.js} +1 -1
  212. package/dist/client/assets/{use-infinite-scroll-CKkim1QW.js → use-infinite-scroll-xj-r2W2T.js} +1 -1
  213. package/dist/client/assets/{use-join-requests-8_-xybh7.js → use-join-requests-BnMn0g9C.js} +1 -1
  214. package/dist/client/assets/{use-mcp-auth-status-BeiIWrik.js → use-mcp-auth-status-2vgcaYP0.js} +1 -1
  215. package/dist/client/assets/{use-mcp-client-CMS2aS7J.js → use-mcp-client-RzjN97CT.js} +1 -1
  216. package/dist/client/assets/{use-mcp-tools-CtmU8Aal.js → use-mcp-tools-T7W49rqX.js} +1 -1
  217. package/dist/client/assets/{use-members-4PIyDy5T.js → use-members-N5DrJl_7.js} +1 -1
  218. package/dist/client/assets/{use-navigate-to-agent-C_6QH1UK.js → use-navigate-to-agent-KwNMNRZf.js} +1 -1
  219. package/dist/client/assets/{use-org-auth-client-umGZ2fB_.js → use-org-auth-client-CSvcfVvV.js} +1 -1
  220. package/dist/client/assets/{use-org-repo-syncs-CmtgcHJE.js → use-org-repo-syncs-CwKu1zCq.js} +1 -1
  221. package/dist/client/assets/{use-org-sso--Yt5VHFo.js → use-org-sso-D2B_iEyT.js} +1 -1
  222. package/dist/client/assets/{use-organization-roles-Cul3X2-M.js → use-organization-roles-FD3PZmxl.js} +1 -1
  223. package/dist/client/assets/{use-organization-settings-Co9OZfKz.js → use-organization-settings-BREcdDdo.js} +1 -1
  224. package/dist/client/assets/{use-panel-navigate-DcbNZKOV.js → use-panel-navigate-CSbrNiDT.js} +1 -1
  225. package/dist/client/assets/{use-registry-connections-2CgUfim7.js → use-registry-connections-D4-si3WM.js} +1 -1
  226. package/dist/client/assets/{use-secrets-DNcXH1YU.js → use-secrets-DtHucBuQ.js} +1 -1
  227. package/dist/client/assets/{use-section-preview-base-D_FqALiA.js → use-section-preview-base-CiPIemFK.js} +1 -1
  228. package/dist/client/assets/{use-status-sounds-BDhzi_jI.js → use-status-sounds-BVPc15m4.js} +1 -1
  229. package/dist/client/assets/{use-tags-DJgPmiFD.js → use-tags-D7V75gi7.js} +1 -1
  230. package/dist/client/assets/{use-view-mode-ADBenRd-.js → use-view-mode-CbNAWFtt.js} +1 -1
  231. package/dist/client/assets/{use-virtual-mcp-C5o8otqw.js → use-virtual-mcp-BV7srTR4.js} +1 -1
  232. package/dist/client/assets/useInfiniteQuery-D_SaKo-D.js +1 -0
  233. package/dist/client/assets/useSuspenseInfiniteQuery-By2e3GlB.js +1 -0
  234. package/dist/client/assets/{users-DfFNBEB8.js → users-DlxT9F32.js} +1 -1
  235. package/dist/client/assets/{variant-calendar-lF4fXJOc.js → variant-calendar-CD8bAuFU.js} +1 -1
  236. package/dist/client/assets/{view-mode-toggle-BM8sgJBI.js → view-mode-toggle-BPN4kr8A.js} +1 -1
  237. package/dist/client/index.html +1 -1
  238. package/dist/server/cli.js +3 -3
  239. package/dist/server/server.js +3 -3
  240. package/package.json +1 -1
  241. package/dist/client/assets/record-editor-IWeDRVn-.js +0 -1
  242. package/dist/client/assets/registry-DHg5sty2.js +0 -2
  243. package/dist/client/assets/store-registry-BUWLVl0z.js +0 -2
  244. package/dist/client/assets/useInfiniteQuery-B9Uzzuq-.js +0 -1
  245. package/dist/client/assets/useSuspenseInfiniteQuery-2wSoxN5g.js +0 -1
@@ -1362,13 +1362,13 @@ ${Y}`:Y}case"media":return"";case"mediaSingle":case"mediaGroup":return Rg(pK(X),
1362
1362
 
1363
1363
  ${O}`});if(!L)continue;try{await $.storage.jiraIntegrations.createCommentLink({commentId:L.id,organizationId:W,jiraCommentId:B.id})}catch(w){if(w.code==="23505"){await $.storage.taskBoard.deleteComment(L.id,W,nK);continue}throw w}}}class EF${ctx;organizationId;ids=new Map;constructor($,Z){this.ctx=$;this.organizationId=Z}async seed($){if($.length===0)return;let Z=await this.ctx.storage.sprints.upsertManyFromJira(this.organizationId,$.map(DF$));for(let[X,Q]of Z)this.ids.set(X,Q)}async localIdFor($){if(!$)return null;let Z=this.ids.get($.id);if(Z)return Z;let X=await this.ctx.storage.sprints.upsertFromJira(this.organizationId,DF$($));return this.ids.set($.id,X),X}}function DF$($){return{jiraSprintId:$.id,name:$.name,state:$.state,startsAt:$.startsAt,endsAt:$.endsAt}}function ED4($,Z){if($.size===0)return[];return Z.filter((X)=>!$.has(X.jiraIssueId))}async function jD4($,Z,X,Q){let Y=Z.organizationId,G=await X.searchIssueIds(`(${Q}) AND issuetype IN standardIssueTypes()`);if(G.size===0)return console.warn(`[jira] scope for org ${Y} came back empty \u2014 skipping reconciliation rather than archiving the whole board`),0;let J=ED4(G,await $.storage.jiraIntegrations.listLinkedIssuesOnBoard(Y));if(J.length===0)return 0;for(let W of J){let K=await $.storage.taskBoard.getById(W.itemId,Y);if(!K||K.status==="archived")continue;let H=await $.storage.taskBoard.update(W.itemId,Y,{status:"archived"},nK);await $.storage.taskBoard.recordActivity({taskBoardItemId:W.itemId,action:"status_changed",actorId:null,data:{from:K.status,to:"archived"}}),x$(Y,H),console.log(`[jira] ${W.jiraIssueKey} is no longer in board ${Z.boardId}'s scope \u2014 archived its card`)}return J.length}async function zD4($,Z){let{organizationId:X,boardId:Q}=Z;if(!Q)throw Error("No Jira board selected");let Y=await $.storage.organizationSettings.get(Z.organizationId),G=dZ(Y?.flags,"org_board_columns"),J=await j5($,Z.organizationId),W=G?await HD4($,Z,Q):jH$(Z.statusMapping),K=new Set((await J.columns()).map((C)=>C.key));if(W.size===0)throw Error(G?"This Jira board has no columns to mirror":"No status mapping configured");let H=Z.lastSyncedAt===null||Z.rescanPending,F=new XY(Z.siteUrl,Z.email,Z.apiToken),{accountId:N}=await F.myself(),U=new ho0(F),B=new Date,O=await F.getBoardScopeJql(Q),L=UD4(Z,O,B),w=new EF$($,X);await w.seed(await F.listBoardSprints(Q));let E={created:0,updated:0,unchanged:0,skipped:0,archived:0,unmappedStatuses:[]},j=new Set,z,A,P=0,I=0;while(P<lo0&&I<LF$){I++;let C=await F.searchIssues({jql:L,nextPageToken:A});if(A=C.nextPageToken??void 0,C.issues.length===0){if(!A)break;continue}let m=await $.storage.jiraIntegrations.getLinksByIssueIds(X,C.issues.map((v)=>v.id));await U.resolve(C.issues.flatMap((v)=>[...Tt(v.fields.description),...(v.fields.comment?.comments??[]).flatMap((b)=>Tt(b.body))]));for(let v of C.issues){if(P>=lo0)break;P++;let b=new Date(v.fields.updated);if(Number.isNaN(b.getTime()))throw Error(`Unparseable updated on ${v.key}`);let i=W.get(v.fields.status.name);if(!i||!UF$(v)){if(!i&&UF$(v))j.add(v.fields.status.name);E.skipped++,z=b;continue}let l=m.get(v.id);if(l&&BD4(l.jiraUpdatedAt,b,H)){E.unchanged++,z=b;continue}let r=v.fields.status.name,U0=OL0(v.sprints),E0={title:v.fields.summary,description:await DD4(v,U),externalUrl:LD4(Z.siteUrl,v.key),priority:wD4(v),boardColumnOrg:J.columnOwner()};if(l){let s=l.jiraStatus!==r,o=FD4({lastSeenJiraSprintId:l.jiraSprintId,jiraSprintId:U0?.id??null}),D0=await $.storage.taskBoard.getById(l.itemId,X),Z0=ND4({jiraStatusChanged:s,currentStatus:D0?.status??null,boardColumns:K}),P0=await $.storage.taskBoard.update(l.itemId,X,{...E0,...Z0?{status:i}:{},...o?{sprintId:await w.localIdFor(U0)}:{}},nK);if(await $.storage.jiraIntegrations.touchLink(l.itemId,{jiraStatus:r,jiraSprintId:U0?.id??null}),D0&&Z0&&D0.status!==i)await $.storage.taskBoard.recordActivity({taskBoardItemId:l.itemId,action:"status_changed",actorId:null,data:{from:D0.status,to:i}});if(s&&!H)P0=await BF$($,Z,P0);await OF$($,Z,F,v,l.itemId,N,U),await $.storage.jiraIntegrations.touchLink(l.itemId,{jiraUpdatedAt:b}),x$(X,P0),E.updated++}else{let s=await $.storage.taskBoard.create({organizationId:X,...E0,status:i,sprintId:await w.localIdFor(U0),by:nK});try{await $.storage.jiraIntegrations.createLink({itemId:s.id,organizationId:X,jiraIssueId:v.id,jiraIssueKey:v.key,jiraUpdatedAt:new Date(0),jiraStatus:r,jiraSprintId:U0?.id??null})}catch(o){if(o.code==="23505"){await $.storage.taskBoard.delete(s.id,X,nK),E.unchanged++,z=b;continue}throw o}if(!H)s=await BF$($,Z,s);await OF$($,Z,F,v,s.id,N,U),await $.storage.jiraIntegrations.touchLink(s.id,{jiraUpdatedAt:b}),x$(X,s),E.created++}z=b}if(!A)break}E.unmappedStatuses=[...j].sort();let k=OD4(P,I);if(!k)E.archived=await jD4($,Z,F,O);let M=H&&k;if(z===void 0&&P===0)return{counts:E,watermark:B,rescanPending:M};return{counts:E,watermark:z,rescanPending:M}}var nK="jira",lo0=500,WD4=5,LF$=25,wF$=1e4,KD4;var zL0=D(()=>{R9();v5();uo0();z5();EL0();So0();KD4={highest:"urgent",high:"high",medium:"medium",low:"low",lowest:"low"}});var zF$={};J4(zF$,{setJiraSyncRuntime:()=>po0,registerJiraSyncWorkflow:()=>to0,maybeEnqueueJiraStatusPush:()=>uD4,maybeEnqueueJiraSprintPush:()=>lD4,enqueueJiraCommentPush:()=>no0});import{DBOS as wZ,SchedulerMode as PD4}from"@dbos-inc/dbos-sdk";function po0($){It=$}function dC(){if(!It)throw Error("[jira] sync runtime not initialized \u2014 setJiraSyncRuntime() must run before the workflow fires");return It}function EJ(){let{db:$,encryptionKey:Z}=dC();return new uC($,new yY(Z))}function jF$(){return new KQ(dC().db)}function TD4(){return new Pt(dC().db)}async function RD4($){try{let{db:Z}=dC(),X=await EJ().getById($);if(!X)return{id:$,error:"integration no longer exists"};if(!X.enabled)return{id:$};let Q=await XW(Z,X.organizationId);if(!Q)return{id:$,error:"organization no longer exists"};let Y=await Ig(Q,X);return"error"in Y?{id:$,error:Y.error}:{id:$}}catch(Z){return{id:$,error:Z instanceof Error?Z.message:String(Z)}}}async function ID4($,Z){let X=await wZ.runStep(()=>EJ().listEnabledIds(),{name:"loadJiraIntegrations"});for(let Q of X){let Y=await wZ.runStep(()=>RD4(Q),{name:`syncJira:${Q}`});if(Y.error)console.warn(`[jira] sync ${Y.id} failed: ${Y.error}`)}}async function MD4($){let Z=EJ();if(!(await Z.getByOrg($.organizationId))?.enabled)return null;let Q=await Z.getLinkByItemId($.taskBoardItemId,$.organizationId);if(!Q)return null;if(await Z.hasCommentLink($.commentId))return null;return{jiraIssueId:Q.jiraIssueId}}async function kD4($){return(await dC().db.selectFrom("organization").select("slug").where("id","=",$).executeTakeFirst())?.slug??null}async function VD4($,Z,X){let Q=await EJ().getByOrg($);if(!Q?.enabled)return null;let G=(await XW(dC().db,$))?.orgFs;if(!G)return null;let J=new XY(Q.siteUrl,Q.email,Q.apiToken);return FF$(X,{read:(W)=>G.read(W.volume,W.path).catch((K)=>{if(K instanceof fG)return null;throw K}),listAttachments:()=>J.listAttachments(Z),upload:(W)=>J.addAttachment(Z,W),mediaIdFor:(W)=>J.resolveMediaId(W)})}async function SD4($,Z,X){let Q=EJ(),Y=await Q.getByOrg($.organizationId);if(!Y?.enabled)return null;let G=await Q.getLinkByItemId($.taskBoardItemId,$.organizationId);if(!G)return null;if(await Q.hasCommentLink($.commentId))return null;return(await new XY(Y.siteUrl,Y.email,Y.apiToken).addComment(G.jiraIssueId,Z,{header:`${$.authorLabel} \xB7 via Studio:`,media:new Map(X)})).id}async function CD4($,Z){try{await EJ().createCommentLink({commentId:$.commentId,organizationId:$.organizationId,jiraCommentId:Z})}catch(X){if(X.code!=="23505")throw X}}async function _D4($){let Z=$.body.slice(0,qD4),X=await wZ.runStep(()=>MD4($),{name:"resolveCommentTarget",retriesAllowed:!0,maxAttempts:3});if(!X)return;let Q=[],Y=vH$(Z);if(Y.length>0){let J=await wZ.runStep(()=>kD4($.organizationId),{name:"readOrgSlug",retriesAllowed:!0,maxAttempts:3});for(let W of HF$(Y,J??""))try{let K=await wZ.runStep(()=>VD4($.organizationId,X.jiraIssueId,W),{name:`attachCommentImage:${W.name}`,retriesAllowed:!0,maxAttempts:3});if(K)Q.push([W.target,K])}catch(K){if(!LH$(K))throw K;console.warn(`[jira] could not attach ${W.ref.path}:`,K)}}let G=await wZ.runStep(()=>SD4($,Z,Q),{name:"postCommentToJira",retriesAllowed:!1});if(!G)return;await wZ.runStep(()=>CD4($,G),{name:"recordCommentLink",retriesAllowed:!0,maxAttempts:4})}async function vD4($){let Z=EJ(),X=await Z.getByOrg($.organizationId);if(!X?.enabled)return null;let Q=await Z.getLinkByItemId($.itemId,$.organizationId);if(!Q)return null;let Y=await jF$().getById($.itemId,$.organizationId);if(!Y)return null;let G=await bD4($.organizationId,Y.status,X.statusMapping);if(jo0(G,Q.jiraStatus))return null;let W=await new XY(X.siteUrl,X.email,X.apiToken).listTransitions(Q.jiraIssueId),K=PH$({targets:G,currentJiraStatus:Q.jiraStatus,availableTransitions:W.map((F)=>F.to.name)});if(K.kind!=="transition"){if(K.kind==="unreachable")console.warn(`[jira] ${Q.jiraIssueKey} is ${Y.status} on the board, but its workflow offers no transition to ${K.targets.join(" / ")} \u2014 `+"the card will not move on the Jira board");return null}let H=W.find((F)=>F.to.name===K.targetName);if(!H)return null;return{jiraIssueId:Q.jiraIssueId,transitionId:H.id,targetName:K.targetName}}async function fD4($,Z){let X=EJ(),Q=await X.getByOrg($.organizationId);if(!Q?.enabled)return;let Y=await X.getLinkByItemId($.itemId,$.organizationId);if(!Y||Y.jiraStatus===Z.targetName)return;let G=new XY(Q.siteUrl,Q.email,Q.apiToken);if(await G.getStatusName(Z.jiraIssueId)===Z.targetName){await X.touchLink($.itemId,{jiraStatus:Z.targetName});return}await G.transitionIssue(Z.jiraIssueId,Z.transitionId),await X.touchLink($.itemId,{jiraStatus:Z.targetName})}async function bD4($,Z,X){let Q=await new VC(dC().db).listByOrg($);return zH$({column:Q.find((Y)=>Y.key===Z),mapping:X,lane:Z})}async function xD4($){let Z=EJ();if(!(await Z.getByOrg($.organizationId))?.enabled)return null;let Q=await Z.getLinkByItemId($.itemId,$.organizationId);if(!Q)return null;let Y=await jF$().getById($.itemId,$.organizationId);if(!Y)return null;let G=Y.sprintId?await TD4().jiraIdFor($.organizationId,Y.sprintId):null;if(Y.sprintId&&G===null)return console.warn(`[jira] ${Q.jiraIssueKey} is in a sprint that did not come from Jira \u2014 not pushing`),null;if(Q.jiraSprintId===G)return null;return{jiraIssueId:Q.jiraIssueId,jiraIssueKey:Q.jiraIssueKey,targetSprintId:G}}async function yD4($,Z){let X=EJ(),Q=await X.getByOrg($.organizationId);if(!Q?.enabled)return;let Y=await X.getLinkByItemId($.itemId,$.organizationId);if(!Y||Y.jiraSprintId===Z.targetSprintId)return;let G=new XY(Q.siteUrl,Q.email,Q.apiToken);if(await G.getIssueSprintId(Z.jiraIssueId)!==Z.targetSprintId)if(Z.targetSprintId===null)await G.moveIssueToBacklog(Z.jiraIssueId);else await G.addIssueToSprint(Z.targetSprintId,Z.jiraIssueId);await X.touchLink($.itemId,{jiraSprintId:Z.targetSprintId})}async function gD4($){let Z=await wZ.runStep(()=>xD4($),{name:"resolveSprintMove",retriesAllowed:!0,maxAttempts:3});if(!Z)return;await wZ.runStep(()=>yD4($,Z),{name:"executeSprintMove",retriesAllowed:!0,maxAttempts:3})}async function hD4($){let Z=await wZ.runStep(()=>vD4($),{name:"resolveStatusTransition",retriesAllowed:!0,maxAttempts:3});if(!Z)return;await wZ.runStep(()=>fD4($,Z),{name:"executeStatusTransition",retriesAllowed:!0,maxAttempts:3})}function uD4($,Z){if(Z.updatedBy===nK)return;if(!mo0||!It)return;let X=mo0;(async()=>{if(!await EJ().getLinkByItemId(Z.id,$))return;await wZ.startWorkflow(X,{queueName:JU,workflowID:`jira-status:${Z.id}:${Z.status}:${Date.parse(Z.updatedAt)}`,enqueueOptions:{queuePartitionKey:$}})({organizationId:$,itemId:Z.id})})().catch((Q)=>{console.warn(`[jira] status push enqueue failed for ${Z.id}:`,Q instanceof Error?Q.message:Q)})}function lD4($,Z){if(Z.updatedBy===nK)return;if(!io0||!It)return;let X=io0;(async()=>{if(!await EJ().getLinkByItemId(Z.id,$))return;await wZ.startWorkflow(X,{queueName:JU,workflowID:`jira-sprint:${Z.id}:${Z.sprintId??"backlog"}:${Date.parse(Z.updatedAt)}`,enqueueOptions:{queuePartitionKey:$}})({organizationId:$,itemId:Z.id})})().catch((Q)=>{console.warn(`[jira] sprint push enqueue failed for ${Z.id}:`,Q instanceof Error?Q.message:Q)})}async function no0($,Z){try{if(!do0)return;if(!await $.storage.jiraIntegrations.getLinkByItemId(Z.taskBoardItemId,Z.organizationId))return;await wZ.startWorkflow(do0,{queueName:JU,workflowID:`jira-cmt-push:${Z.commentId}`,enqueueOptions:{queuePartitionKey:Z.organizationId}})(Z)}catch(X){console.warn(`[jira] comment push enqueue failed for ${Z.commentId}:`,X instanceof Error?X.message:X)}}function to0(){if(co0)return;co0=wZ.registerWorkflow(ID4,{name:"jiraSyncWorkflow"}),wZ.registerScheduled(co0,{name:"jiraSyncWorkflow",crontab:AD4,mode:PD4.ExactlyOncePerIntervalWhenActive}),do0=wZ.registerWorkflow(_D4,{name:"jiraCommentPushWorkflow"}),mo0=wZ.registerWorkflow(hD4,{name:"jiraStatusPushWorkflow"}),io0=wZ.registerWorkflow(gD4,{name:"jiraSprintPushWorkflow"})}var AD4="2-59/10 * * * *",It=null,qD4=30000,co0=null,do0=null,mo0=null,io0=null;var PL0=D(()=>{wH$();nU();Ag();KL0();mK();zo0();ww();EL0();NF$();ko0();zL0()});function AL0($,Z,X,Q){dY({event:$,organizationId:Z,properties:{task_id:X.id,reports_task:uQ(X),...Q}})}function x$($,Z){f5.emit($,{id:crypto.randomUUID(),type:r0$,source:"task-board",subject:Z.id,data:Z,time:new Date().toISOString()}),Promise.resolve().then(() => (PL0(),zF$)).then((X)=>{X.maybeEnqueueJiraStatusPush($,Z),X.maybeEnqueueJiraSprintPush($,Z)}).catch((X)=>{console.warn("[jira] push hooks unavailable:",X)})}function PF$($,Z){f5.emit($,{id:crypto.randomUUID(),type:s0$,source:"task-board",subject:Z,data:{id:Z},time:new Date().toISOString()})}function cD4($,Z){return $?[$]:Z}async function mC($,Z,X){let Q=$.metadata?.runMetadata?.taskBoardItemId,Y=!Q&&X?await $.storage.taskBoard.linkedTaskIds(X,Z):[];return cD4(Q,Y)}async function AF$($,Z,X){let Q=$.organization?.id;if(!Q)return;try{for(let Y of await mC($,Q,X)){let G=await $.storage.taskBoard.getById(Y,Q),J=hC(Z),W=hC(G?.status??"");if(!G||J!==null&&W!==null&&J<=W)continue;let K=await $.storage.taskBoard.update(Y,Q,{status:Z},$.auth?.user?.id??G.updatedBy);if(await $.storage.taskBoard.recordActivity({taskBoardItemId:Y,action:"status_changed",actorId:null,data:{from:G.status,to:Z}}).catch((H)=>console.error("[task-board] activity log write failed",H)),x$(Q,K),Z==="in_progress")AL0("task_run_started",Q,K,{from:G.status})}}catch(Y){console.error("[task-board] run transition failed",Y)}}async function TL0($,Z){let X=$.organization?.id;if(!X)return;try{for(let Q of await mC($,X,Z)){let Y=await $.storage.taskBoard.openReviewCycleIfInProgress(Q,X,await N9($,X));if(!Y)continue;x$(X,Y),AL0("task_run_completed",X,Y,{from:"in_progress",via:"pr_open"})}}catch(Q){console.error("[task-board] review-cycle open failed",Q)}}async function RL0($,Z,X,Q){let Y=$.organization?.id;if(!Y)return;try{let G=GL0(Z);if(!G)return;let J=await mC($,Y,Q);for(let W of J)await $.storage.taskBoard.linkPr({taskBoardItemId:W,organizationId:Y,url:G.url,prNumber:G.number,repoOwner:G.owner,repoName:G.repo,connectionId:X??null})}catch(G){console.error("[task-board] PR capture failed",G)}}async function qg($,Z,X,Q,Y){try{let G=await $.advanceLinkedTasksToReviewOnThreadFinish(Z,X,Y);for(let J of G)x$(X,J),AL0("task_run_completed",X,J,{from:"in_progress",via:"thread_finish"});for(let J of G)await $.clearRunRetry(J.id,X).catch(()=>{})}catch(G){console.error("[task-board] thread-finish transition failed",G)}await oo0($,Z,X,Y),await ro0($,Q,Z,X)}function TF$($){return(hC($.status)??-1)>=WL0.in_review||Boolean($.reviewCycleStartedAt)}async function oo0($,Z,X,Q){try{let Y=await $.failedRunInfo(Z,X);if(!Y)return;let G=HH$(Y);for(let J of await $.linkedTaskIds(Z,X)){let W=await $.getById(J,X);if(!W)continue;if(TF$(W))await $.relabelDeliveredFailure(Z,X,iD4).catch(()=>{});if(W.status!=="in_progress")continue;if(W.reviewCycleStartedAt)continue;if(W.threads.some((F)=>F.hasMessages&&F.status==="in_progress"))continue;let K=W.retryAttempts;if(K<G){let F=G7(mD4,dD4,K,2,0.5);if(!await $.scheduleRunRetry(J,X,K+1,new Date(Date.now()+F),Q.progress))continue;await $.recordActivity({taskBoardItemId:J,action:"status_changed",actorId:null,data:{from:"in_progress",to:"in_progress",retry:K+1,of:G,reason:Y.errorText??Y.kind}}).catch(()=>{});continue}let H=await $.returnToTodoAfterFailure(J,X,W.updatedBy,Q);if(!H)continue;await $.recordActivity({taskBoardItemId:J,action:"status_changed",actorId:null,data:{from:"in_progress",to:"todo",reason:Y.errorText??Y.kind,retriesSpent:K}}).catch(()=>{}),x$(X,H),AL0("task_run_failed",X,W,{reason:Y.kind??"error",retries_spent:K})}}catch(Y){console.error("[task-board] failed-run reaction failed",Y)}}async function ro0($,Z,X,Q){try{for(let Y of await $.linkedTaskIds(X,Q)){let G=await $.getById(Y,Q);if(!G)continue;if(TF$(G))continue;if(G.threads.some((W)=>W.hasMessages&&(W.status===null||!jt.has(W.status))))continue;if((await $.listPrs(Y,Q)).length>0)continue;await X1$(Z,Q,Y)}}catch(Y){console.error("[task-board] quota refund pass failed",Y)}}async function so0($,Z){let X=await N9($,Z.organizationId);if(Z.status!==X.progress||!ZY(Z,X.review))return;if(!SC(Z.organizationId,"in_review",X.review,"parking a reviewed card for a person"))return;try{let Q=await $.storage.taskBoard.update(Z.id,Z.organizationId,{status:X.review},Z.updatedBy);await $.storage.taskBoard.recordActivity({taskBoardItemId:Z.id,action:"status_changed",actorId:null,data:{from:Z.status,to:"in_review"}}).catch(()=>{}),x$(Z.organizationId,Q)}catch(Q){console.error(`[task-board] parking ${Z.id} for review failed`,Q)}}async function tK($,Z,X){let Q=Z.organizationId;if(Z.assigneeId!==Y8)return!1;try{await so0($,Z).catch((G)=>console.warn(`[task-board] parking ${Z.id} before hand-off failed`,G));let Y=await $.storage.taskBoard.unassignSuperAgent(Z.id,Q,Z.updatedBy);if(!Y)return!1;return await A6($,{taskBoardItemId:Z.id,action:"assignee_changed",actorId:null,data:{from:Z.assigneeId,to:null,reason:X}}),console.warn(`[task-board] ${Z.id} handed to a human: ${X}`),x$(Q,Y),!0}catch(Y){return console.error(`[task-board] handing ${Z.id} to a human failed`,Y),!1}}async function RF$($,Z,X){if(!(X instanceof $Q))return!1;if(X.reason!=="runs_exhausted")return!1;return await tK($,Z,"per-task run limit reached \u2014 the Super Agent can no longer re-dispatch "+"itself on this task. Re-run it manually to continue."),!0}async function IF$($,Z){let X=$.organization?.id;if(!X)return;try{let Q=await $.storage.taskBoard.reopenLinkedTasksOnThreadRun(Z,X);for(let Y of Q)x$(X,Y)}catch(Q){console.error("[task-board] thread-run reopen failed",Q)}}function qF$($){return $.includes("create_pull_request")||$.includes("createPullRequest")}function MF$($){if(pD4.test($))return!0;return nD4.test($)&&tD4.test($)}var dD4=30000,mD4=120000,iD4="Run ended after it had already delivered \u2014 the task moved on without it",pD4,nD4,tD4;var z5=D(()=>{YJ();S4();mK();v5();Pg();FH$();W4();wt();j6();BX();iK();pD4=/\bgh\s+pr\s+create\b/,nD4=/api\.github\.com\/repos\/[^\s"']+\/pulls\b/,tD4=/(?:-X|--request)\s+POST/});function oD4($){if($.status==="completed")return"advance";if($.status==="failed"&&$.messageStorageVersion===2&&($.harnessId==="decopilot"||$.harnessId==="claude-code"))return"nudge";return"none"}function rD4($){return["This task is still In Progress on the board and your last run ended without finishing it.","","Look at what you already did (`git log`, `git status`, and the messages above), then either:","- finish the remaining work (and open the PR, if it needed code changes),","- or, if it's actually done, say so in one line \u2014 the board moves the card for you,",$==="decopilot"?"- or, if you're blocked on something only a human knows, call the `user_ask` tool.":"- or, if you're blocked on something only a human knows, say what you need and stop.","","Don't start over and don't redo work you already committed or pushed. You are on the same branch as before \u2014 push to it and update your existing pull request rather than opening a second one."].join(`
1364
1364
  `)}async function sD4($,Z,X){await Eg($,Z,X,{messageId:`stall-nudge-${Z.id}-${X.id}`,prompt:rD4(X.harness_id),workflowID:`stall-nudge:${Z.id}:${X.id}`})}async function aD4($,Z){let X=await $.storage.threads.get(Z);if(!X)return{action:"none",thread:null};return{action:oD4({status:X.status,messageStorageVersion:X.message_storage_version,harnessId:X.harness_id}),thread:X}}function eD4($,Z=Date.now()){if($.status!=="in_progress")return!1;if($.run_started_at)return!1;return Dt($,Z)}async function $L4($,Z){let X=[];for(let Q of Z.threads){if(Q.status!=="in_progress")continue;let Y=await $.storage.threads.get(Q.threadId);if(!Y||!eD4(Y))continue;if(await $.storage.threads.markRunFailed(Q.threadId,ao0,"abandoned"))X.push(Q.threadId),console.warn(`[task-board] failed never-started thread ${Q.threadId} on ${Z.id}`)}return X}async function kF$($,Z){let X=$.organization?.id;if(!X)return;for(let Q of Z){if(Q.status==="in_progress")try{if((await $L4($,Q)).length>0)continue}catch(J){console.error(`[task-board] reaping threads for ${Q.id} failed`,J)}let Y;try{Y=Q.repo!=null&&(await $.storage.taskBoard.listPrs(Q.id,X)).length>0}catch(J){console.error(`[task-board] listPrs for ${Q.id} failed`,J);continue}if(!Lo0(Q,Y))continue;let G=Q.threads.find((J)=>J.hasMessages);if(!G)continue;try{let{action:J,thread:W}=await aD4($,G.threadId);if(J==="none"||!W)continue;if(J==="advance")await qg($.storage.taskBoard,G.threadId,X,$.storage.organizationBilling,await N9($,X));else await sD4($,Q,W)}catch(J){console.error(`[task-board] stall recovery failed for ${Q.id}`,J)}}}var ao0="Run never started \u2014 no pod picked it up before the idle window elapsed";var eo0=D(()=>{v5();eD0();mK();z5()});import{z as jJ}from"zod";var ZL4,iC;var $r0=D(()=>{v5();M0();xQ();e3();eo0();ZL4=jJ.object({key:jJ.string(),title:jJ.string(),position:jJ.number(),role:jJ.string().nullable()}),iC=u({name:"TASK_BOARD_ITEM_LIST",description:"List all task board items for the organization, plus the `owner/name` repos this organization has imported (the valid values for a task's `repo` field).",annotations:{title:"List Task Board Items",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:jJ.object({}),outputSchema:jJ.object({items:jJ.array(Ng),repos:jJ.array(jJ.string()),sprints:jJ.array(V3$),columns:jJ.array(ZL4)}),handler:async($,Z)=>{t(Z),await Z.access.check();let X=Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");let[Q,{items:Y},G,J]=await Promise.all([Z.storage.taskBoard.list(X),Z.storage.connections.list(X,{slug:"mcp-github"}),Z.storage.sprints.listByOrg(X),j5(Z,X).then((K)=>K.columns())]),W=ee1(Y);return kF$(Z,Q),{items:Q,repos:W,sprints:G,columns:J}}})});import{z as QY}from"zod";function YL4($){return QL4.some((Z)=>$[Z]!==void 0)}function GL4($,Z){let X=[];for(let{field:G,action:J}of XL4){if(Z[G]===$[G])continue;X.push({action:J,data:{from:$[G],to:Z[G]}})}if(Z.description!==$.description)X.push({action:"description_changed"});let Q=new Set($.tags.map((G)=>G.id));if(Z.tags.length!==$.tags.length||Z.tags.some((G)=>!Q.has(G.id)))X.push({action:"tags_changed",data:{from:$.tags,to:Z.tags}});return X}function JL4($,Z){if($!==Y8)return!1;if(!Z)return!1;return Z.assigneeId!==Y8?!0:Z.status==="todo"}function KL4($,Z,X,Q){let Y=$!==void 0&&WL4.has($),G=Z!==void 0&&ZY(Z,Q);return X&&Y&&G}function Zr0($,Z){return $!==void 0&&Eo0($)&&!Z}var XL4,QL4,WL4,pC;var IL0=D(()=>{v5();M0();R9();e3();iK();wt0();wN();BX();eO();z5();uo0();Pg();YJ();XL4=[{field:"status",action:"status_changed"},{field:"assigneeId",action:"assignee_changed"},{field:"priority",action:"priority_changed"},{field:"type",action:"type_changed"},{field:"dueDate",action:"due_date_changed"},{field:"title",action:"title_changed"},{field:"sprintId",action:"sprint_changed"}],QL4=["title","description","status","priority","type","assigneeId","repo","dueDate","sortOrder","sprintId","tagIds"];WL4=new Set(["approved","merged","post_deploy_validation","done","archived"]);pC=u({name:"TASK_BOARD_ITEM_UPDATE",description:"Update a task board item's fields (title, description, status, priority, assignee), and/or link a chat thread to it.",annotations:{title:"Update Task Board Item",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:QY.object({id:QY.string(),title:QY.string().min(1).max(TD0).optional(),description:QY.string().max(AD0).nullable().optional(),status:KN.optional(),priority:CC.optional(),type:$t.optional(),assigneeId:QY.string().nullable().optional(),repo:QY.string().max(RD0).nullable().optional(),dueDate:QY.string().datetime().nullable().optional(),sortOrder:QY.number().optional(),sprintId:QY.string().nullable().optional(),tagIds:QY.array(QY.string()).max(1000).optional(),linkThreadId:QY.string().optional(),prUrl:QY.string().nullable().optional().describe("GitHub pull request URL to link to this task, e.g. https://github.com/owner/repo/pull/123. Pass it after opening a PR for an existing card; linking one is what starts its review.")}),outputSchema:QY.object({item:Ng}),handler:async($,Z)=>{t(Z),await Z.access.check();let X=Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");let Q=$.prUrl?WD($.prUrl):null;if($.prUrl&&!Q)throw Error(`Not a GitHub pull request URL: ${$.prUrl} (expected https://github.com/<owner>/<repo>/pull/<number>)`);if($.sprintId){if(!(await Z.storage.sprints.listByOrg(X)).some((U)=>U.id===$.sprintId))throw Error("sprintId is not a sprint on this board")}if($.assigneeId)await ID0(Z,X,$.assigneeId);if($.linkThreadId){if(!await Z.storage.taskBoard.getById($.id,X))throw Error(`Task board item not found: ${$.id}`);if(!await Z.storage.threads.get($.linkThreadId))throw Error(`Thread not found: ${$.linkThreadId}`);await Z.storage.taskBoard.linkThread($.id,$.linkThreadId,X)}let Y=YL4($),G=Y?await Z.storage.taskBoard.getById($.id,X):null;if(Y&&!G)throw Error(`Task board item not found: ${$.id}`);let J=await j5(Z,X);if($.status!==void 0)await zD0(J,$.status);if($.status!==void 0&&Eo0($.status)){let N=await Z.storage.organizationSettings.get(X);if(Zr0($.status,dZ(N?.flags,"delivery_lanes_enabled")))throw Error("Delivery lanes are not enabled for this organization \u2014 enable "+"them in Settings before moving a task to Approved, Merged, or Post-deploy Validation.")}let W=JN.getStore()!==void 0;if(KL4($.status,G??void 0,W,(await J.lanes()).review))throw Error("This task is under review \u2014 a run can't move it to Done or Archived. "+"Leave it for the reviewer; only a person, or TASK_BOARD_REVIEW_DECISION on a reviewer's own run, closes out a task under review.");let K=$.assigneeId!==void 0&&$.assigneeId!==(G?.assigneeId??null),H=JL4($.assigneeId,G);if(G&&uQ(G)){if($.title!==void 0||$.description!==void 0||$.priority!==void 0)throw Error("This task was generated from your report and can't be edited \u2014 create your own task instead.");if(H)await qy(Z,G,RO())}if($.tagIds!==void 0){let N=await Z.storage.tags.listOrgTags(X),U=new Set(N.map((B)=>B.id));for(let B of $.tagIds)if(!U.has(B))throw Error(`Tag not found: ${B}`);await Z.storage.taskBoard.setItemTags($.id,$.tagIds,o0(Z))}let F;if(Y)F=await Z.storage.taskBoard.update($.id,X,{title:$.title,description:$.description,status:H?"todo":$.status,...$.status!==void 0||H?{boardColumnOrg:J.columnOwner()}:{},priority:$.priority,type:$.type,assigneeId:$.assigneeId,assignedBy:K?$.assigneeId?o0(Z):null:void 0,repo:$.repo,dueDate:$.dueDate,sortOrder:$.sortOrder,sprintId:$.sprintId},o0(Z));else{let N=await Z.storage.taskBoard.getById($.id,X);if(!N)throw Error(`Task board item not found: ${$.id}`);F=N}if(Q)await Z.storage.taskBoard.linkPr({taskBoardItemId:F.id,organizationId:X,url:Q.url,prNumber:Q.number,repoOwner:Q.owner,repoName:Q.repo,connectionId:null});if(G){let N=o0(Z),U=GL4(G,F);if(U.length>0)await NH$(Z,U.map((B)=>({taskBoardItemId:F.id,actorId:N,...B,alsoSubscribe:B.action==="assignee_changed"&&F.assigneeId!==Y8?[F.assigneeId]:void 0})))}if(G&&F.description!==G.description)await Z.storage.notifications.notifyMentions({taskBoardItemId:F.id,organizationId:X,actorId:o0(Z),body:F.description??"",previousBody:G.description});if(Y||$.linkThreadId||Q)x$(X,F);if(H)return await ND(Z,F,{userInitiated:!0}),{item:F};if($.status!==void 0&&G!==null&&G.status!==F.status)F=await jL0(Z,F,{assignedBy:o0(Z),actor:o0(Z)});return{item:F}}})});import{z as qL0}from"zod";var nC;var Xr0=D(()=>{M0();z5();nC=u({name:"TASK_BOARD_ITEM_DELETE",description:"Delete a task board item. A reports-pushed task also dismisses its finding, so the next diagnostic import won't re-create the card.",annotations:{title:"Delete Task Board Item",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:qL0.object({id:qL0.string()}),outputSchema:qL0.object({success:qL0.boolean()}),handler:async($,Z)=>{t(Z),await Z.access.check();let X=Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");if(!await Z.storage.taskBoard.delete($.id,X,o0(Z)??"system"))throw Error(`Task board item not found: ${$.id}`);return PF$(X,$.id),{success:!0}}})});function tC($){if($.length===0)return!1;let Z=new Map;for(let X of $){let Q=`${X.repoOwner}/${X.repoName}`.toLowerCase(),Y=Z.get(Q);if(Y)Y.push(X);else Z.set(Q,[X])}return[...Z.values()].every(HL4)}function HL4($){return $.some((Z)=>Z.merged===!0)&&$.every((Z)=>Z.merged===!0||Z.state==="closed")}async function FL4($,Z,X,Q){let Y=await $.storage.taskBoard.getById(X,Z);if(!Y||Y.status!=="done")return!1;let G=await $.storage.taskBoard.listPrs(X,Z),J=await Promise.all(G.map(async(F)=>({...F,...await Q($,Z,F)})));if(!tC(J))return!1;let W=await j5($,Z),K=await W.archiveColumn();if(!K)return!1;let H=await $.storage.taskBoard.update(X,Z,BJ(W,K),Y.updatedBy);return await A6($,{taskBoardItemId:X,action:"status_changed",actorId:null,data:{from:"done",to:K,reason:"merged_pr_auto_archive"}}),x$(Z,H),!0}async function VF$($,Z,X,Q=kL0){let Y=0;for(let G of X)try{if(await FL4($,Z,G,Q))Y+=1}catch(J){console.error(`[task-board-archive] ${G} failed`,J)}return{archived:Y}}function ML0($){let Z=new Map;for(let{id:X,organizationId:Q}of $){let Y=Z.get(Q);if(Y)Y.push(X);else Z.set(Q,[X])}return[...Z].map(([X,Q])=>({organizationId:X,itemIds:Q}))}var Mg=D(()=>{v5();BX();JG();z5()});function VL0($){return $.replace(/\/api\/[^/\s)]+\/fs\/([^/\s)]+)\/read\?path=([^)\s]+)/g,(Z,X,Q)=>{let Y,G;try{Y=decodeURIComponent(X),G=decodeURIComponent(Q)}catch{return Z}let J=(W)=>W.startsWith("/")||W.split("/").includes("..");if(J(Y)||J(G))return Z;return xK(Y,G)})}function SL0($,Z){return Z===$?null:"The image and file links in that description are real paths in this sandbox, not URLs \u2014 `Read` them. A screenshot the task points at is usually the clearest statement of what it wants."}var Qr0=D(()=>{sE()});function NL4($){let Z=new Map($.map((G)=>[G.id,G])),X=new Map;for(let G of Hg($)){let J=SF$(G.owner,G.repo);X.set(J,[...X.get(J)??[],G])}if(X.size!==1)return null;let Q=[...X.values()][0],Y=Q.find((G)=>{let J=Z.get(G.connectionId);return J?SE(J):!1})??Q[0];return{connectionId:Y.connectionId,owner:Y.owner,name:Y.repo,installationId:Y.installationId,url:`https://github.com/${Y.owner}/${Y.repo}`}}async function CL0($,Z){if(!da())return console.warn(`[task-board] claude-code skipped for org ${Z}: `+"hosted sandbox unavailable \u2014 running Decopilot"),null;try{let{items:X}=await $.storage.connections.list(Z,{slug:"mcp-github"}),Q=NL4(X);if(Q)return{repo:Q};let Y=new Map;for(let J of Hg(X)){let W=SF$(J.owner,J.repo);if(!Y.has(W))Y.set(W,{connectionId:J.connectionId,repo:`${J.owner}/${J.repo}`})}let G=Y;if(G.size===0)return console.warn(`[task-board] claude-code skipped for org ${Z}: `+"no importable repos \u2014 running Decopilot"),null;return console.warn(`[task-board] claude-code for org ${Z}: ${G.size} importable repos \u2014 the run picks one with TASK_ADD_REPO`),{choices:[...G.values()]}}catch(X){return console.warn("[task-board] repo lookup for claude-code failed",X),null}}function CF$($,Z,X){let Q=["You've been assigned this task. Complete it and finish with a pull request if it makes sense (like a coding task) or is explicitly requested.","","You are running AUTONOMOUSLY \u2014 no human is watching, so drive this to "+"completion yourself. Make reasonable decisions and move on; do not stop to ask for confirmation.","",`Title: ${$.title}`];if($.description){let Y=VL0($.description);Q.push("","Description:",Y);let G=SL0($.description,Y);if(G)Q.push("",G)}if(Q.push("",Z?`The repository ${Z.owner}/${Z.name} is already cloned at your working directory, on its own branch. \`git\` and \`gh\` are authenticated. ${mp}`:["Your working directory is EMPTY: this organization has several repositories, so nothing has been cloned yet. FIRST call `mcp__studio__TASK_ADD_REPO` with the connectionId of the repository this task is about. It clones that repository into your working directory and waits for the checkout, so once it returns the repository is there on its own branch and `git` and `gh` are authenticated. Do not read files, run `git`, or run `gh` before it returns; there is nothing there yet.","","Repositories in this organization:",...(X?.repoChoices??[]).map((Y)=>`- ${Y.repo} (connectionId: ${Y.connectionId})`),X?.repoChoices?.length?"Start with the one the task is about. If it turns out to need a change in "+"another of them too, call `mcp__studio__TASK_ADD_REPO` again \u2014 repositories "+"accumulate, so a second call adds a checkout beside the first rather than replacing it. Each lands in its own directory and keeps its own git remote, so open one pull request per repository you changed.":"Call `mcp__studio__TASK_ADD_REPO` with no arguments to list them."].join(`
1365
- `),""),X?.resolveConflict&&X.pr)Q.push(`Pull request #${X.pr.number} (${X.pr.url}) is approved but has a MERGE CONFLICT with its base branch.`,`Check that branch out (\`gh pr checkout ${X.pr.number}\`), merge or rebase the base branch into it, resolve the conflicts, and push to update the SAME pull request \u2014 do NOT open a new one. Resolve by preserving BOTH sides' intent; never blindly discard either side, and change only what the conflict requires.`,"");else if(X?.feedback)Q.push(X.pr?`A reviewer requested changes on pull request #${X.pr.number} (${X.pr.url}):`:"A reviewer requested changes on your previous work:",X.feedback,X.pr?`Check that branch out (\`gh pr checkout ${X.pr.number}\`) before editing, address the feedback, then push to update the SAME pull request \u2014 do NOT open a new one.`:"Address this feedback.","");else if(X?.pr)Q.push(`This task already has an open pull request #${X.pr.number} (${X.pr.url}), and you are already on its branch.`,"Continue that work: commit and push to update the SAME pull request \u2014 do NOT open a new one. If it already does everything the task asks, say so and stop rather than changing it.","");return Q.push("How to finish:","- Make the change, commit it, push the branch, and open a pull request"+(X?.pr?" \u2014 or push to the existing one, per the instruction above.":"."),"- Change only what the task needs. Don't refactor around it.","- The change must be REACHABLE from the surface the task names: edit the component that route actually renders, not one that merely looks like the right place. A change nothing imports is dead code, and it is the most common reason a task comes back rejected.","- Before handing over, VERIFY the task's outcome LOCALLY, in the sandbox: exercise the affected code path and confirm the behaviour actually happens. A green test suite is not the bar. Do NOT wait for, or verify against, the PR's deploy preview \u2014 a reviewer checks that after you hand over.","- Nothing is installed and NO dev server is running \u2014 this sandbox is a checkout. Usually you don't need one: read the code path end to end, run the repo's tests, and `curl` the LIVE site for how it behaves today. Only start a dev server if you must see YOUR change rendered \u2014 it is a cold start, so expect several minutes: launch it ONCE in the background and poll until it answers rather than guessing a sleep.","- For a VISUAL change that means LOOKING at it: `qa-screenshot <url> <path>.png [--mobile] [--full] [--selector=<css>]` renders the page in headless Chromium \u2014 it reaches a dev server you started on localhost as well as any public URL, and unlike `curl` it runs the page's JS, so lazily-rendered sections are actually there. Then `Read` the file: a screenshot you never opened is not verification. It is already installed; do NOT look for playwright in the repo's `node_modules` or start a browser yourself.","- As soon as `gh pr create` prints the URL, call `mcp__studio__TASK_BOARD_ITEM_PR_LINK` with that url. Do this even if you also mention the PR in a comment \u2014 the reviewers are dispatched from the linked PR, not from your message.",'- If the task turns out to need no code change, do NOT open a PR: explain why in a comment on the task (`mcp__studio__TASK_BOARD_COMMENT_CREATE`) and move it to "done". There is nothing for a reviewer to review, so leaving it for one would strand it.',`- Anything a reviewer should know (a decision you made, something you found and deliberately left alone, a question) goes on the task as a comment: \`mcp__studio__TASK_BOARD_COMMENT_CREATE\` with taskBoardItemId "${$.id}". Read what's already there first with \`mcp__studio__TASK_BOARD_COMMENT_LIST\` \u2014 a comment may be addressed to you.`,"",`(task id: ${$.id})`),Q.join(`
1365
+ `),""),X?.resolveConflict&&X.pr)Q.push(`Pull request #${X.pr.number} (${X.pr.url}) is approved but has a MERGE CONFLICT with its base branch.`,`Check that branch out (\`gh pr checkout ${X.pr.number}\`), merge or rebase the base branch into it, resolve the conflicts, and push to update the SAME pull request \u2014 do NOT open a new one. Resolve by preserving BOTH sides' intent; never blindly discard either side, and change only what the conflict requires.`,"");else if(X?.feedback)Q.push(X.pr?`A reviewer requested changes on pull request #${X.pr.number} (${X.pr.url}):`:"A reviewer requested changes on your previous work:",X.feedback,X.pr?`Check that branch out (\`gh pr checkout ${X.pr.number}\`) before editing, address the feedback, then push to update the SAME pull request \u2014 do NOT open a new one.`:"Address this feedback.","");else if(X?.pr)Q.push(`This task already has an open pull request #${X.pr.number} (${X.pr.url}), and you are already on its branch.`,"Continue that work: commit and push to update the SAME pull request \u2014 do NOT open a new one. If it already does everything the task asks, say so and stop rather than changing it.","");return Q.push("How to finish:","- Make the change, commit it, push the branch, and open a pull request"+(X?.pr?" \u2014 or push to the existing one, per the instruction above.":"."),"- Change only what the task needs. Don't refactor around it.","- The change must be REACHABLE from the surface the task names: edit the component that route actually renders, not one that merely looks like the right place. A change nothing imports is dead code, and it is the most common reason a task comes back rejected.","- Before handing over, VERIFY the task's outcome LOCALLY, in the sandbox: exercise the affected code path and confirm the behaviour actually happens. A green test suite is not the bar. Do NOT wait for, or verify against, the PR's deploy preview \u2014 a reviewer checks that after you hand over.","- Nothing is installed and NO dev server is running \u2014 this sandbox is a checkout. Usually you don't need one: read the code path end to end, run the repo's tests, and `curl` the LIVE site for how it behaves today. Only start a dev server if you must see YOUR change rendered \u2014 it is a cold start, so expect several minutes: launch it ONCE in the background and poll until it answers rather than guessing a sleep.",'- For a VISUAL change that means LOOKING at it: `qa-screenshot <url> <path>.png [--mobile] [--full] [--selector=<css>]` renders the page in headless Chromium \u2014 it reaches a dev server you started on localhost as well as any public URL, and unlike `curl` it runs the page\'s JS, so lazily-rendered sections are actually there. Then `Read` the file: a screenshot you never opened is not verification. It is already installed; do NOT look for playwright in the repo\'s `node_modules`. To INTERACT with a page \u2014 click, hit-test with `document.elementFromPoint`, fill a form \u2014 write a throwaway node script that requires the global playwright-core: `const { chromium } = require("/usr/local/lib/node_modules/playwright-core"); chromium.launch({ executablePath: "/usr/bin/chromium", args: ["--no-sandbox"] })`. Screenshots alone are not the limit of what you can check.',"- As soon as `gh pr create` prints the URL, call `mcp__studio__TASK_BOARD_ITEM_PR_LINK` with that url. Do this even if you also mention the PR in a comment \u2014 the reviewers are dispatched from the linked PR, not from your message.",'- If the task turns out to need no code change, do NOT open a PR: explain why in a comment on the task (`mcp__studio__TASK_BOARD_COMMENT_CREATE`) and move it to "done". There is nothing for a reviewer to review, so leaving it for one would strand it.',`- Anything a reviewer should know (a decision you made, something you found and deliberately left alone, a question) goes on the task as a comment: \`mcp__studio__TASK_BOARD_COMMENT_CREATE\` with taskBoardItemId "${$.id}". Read what's already there first with \`mcp__studio__TASK_BOARD_COMMENT_LIST\` \u2014 a comment may be addressed to you.`,"",`(task id: ${$.id})`),Q.join(`
1366
1366
  `)}var SF$=($,Z)=>`${$}/${Z}`.toLowerCase();var Yr0=D(()=>{wD0();xQ();j6();E$();Qr0()});import{createHmac as UL4,randomBytes as BL4,timingSafeEqual as OL4}from"crypto";function DL4(){if(_L0)return _L0;let $;try{let Z=C0();$=Z.studioJwtSecret??Z.betterAuthSecret}catch{$=void 0}return _L0=$?Buffer.from($):BL4(32),_L0}function Gr0($,Z,X){return`rtok_${UL4("sha256",DL4()).update(`${$}:${Z}:${X.toISOString()}`).digest("base64url")}`}function _F$($,Z,X,Q){let Y=Buffer.from($),G=Buffer.from(Gr0(Z,X,Q));return Y.length===G.length&&OL4(Y,G)}var _L0=null;var Jr0=D(()=>{E$()});import{createHash as LL4}from"crypto";function qt($,Z){if($.status===null||vF$.has($.status))return!1;return!Dt({updated_at:$.lastActiveAt,last_progress_at:null},Z)}function wL4($,Z){return $.threads.some((X)=>!RK.some((Q)=>AO(X.title,Q))&&qt(X,Z))}function zL4($,Z){return Z-$>=jL4}async function vL0($,Z,X){let Q=await $.storage.organizationSettings.get(Z.organizationId),Y=cF(Q?.flags);if(Y.length===0)return;if(wL4(Z,Date.now()))return;let G=dZ(Q?.flags,"cheap_reviewer_model")?"reviewer":"default",J=await $.storage.taskBoard.listActivity(Z.id,Z.organizationId),W=Z.reviewCycleStartedAt,K=dF(J,W),H=new Date(K),F=TO(J,{cycleStartedAt:W});await Promise.all(Y.map(async(N)=>{let U=F.has(N);if(!U){let O=ML4(J,K),L=qL4(Z,N,K,O);if(L){await CL4($,Z,N,L).catch((w)=>console.error(`[task-board] ${N} verdict nudge failed`,w));return}if(VL4(O,Date.now()))return}if(RL4(Z,N,K,Date.now(),U)){await tK($,Z,`${IK[N]} failed ${Wr0} times on `+"this review \u2014 it will not be retried");return}if(X?.previewMatchesHead===!1){if(zL4(K,Date.now()))await tK($,Z,"the pull request's deploy preview is not showing its latest commit (its checks never went green), so the Reviewer cannot verify this change against what the PR actually does");return}if(IL4(Z,N,K,Date.now(),U))return;let B=PL4(Z,N,K,Date.now(),U);await fL4($,Z,N,H,B,G).catch((O)=>console.error(`[task-board] ${N} reviewer enqueue failed`,O))}))}function PL4($,Z,X,Q=Date.now(),Y=!0){return $.threads.filter((G)=>AO(G.title,Z)&&Kr0(G,Q,Y)&&new Date(G.createdAt).getTime()>=X).length}function AL4($,Z){if(!$||!Z||!("choices"in Z))return null;return Z.choices.find((X)=>X.repo===$)?.connectionId??null}function TL4($,Z,X){let Q=$.threads.filter((Y)=>AO(Y.title,Z)&&Y.status==="completed"&&new Date(Y.createdAt).getTime()<X).map((Y)=>new Date(Y.lastActiveAt).getTime()).filter((Y)=>Number.isFinite(Y));return Q.length===0?0:Math.max(...Q)}function Kr0($,Z,X=!0){if($.status==="failed")return!0;if($.status!==null&&vF$.has($.status))return!X;return $.status!==null&&!qt($,Z)}function fF$($,Z,X,Q=Date.now()){return $.threads.filter((Y)=>{if(!AO(Y.title,Z))return!1;return qt(Y,Q)||new Date(Y.createdAt).getTime()>=X})}function RL4($,Z,X,Q=Date.now(),Y=!0){let G=fF$($,Z,X,Q);return G.length>0&&G.every((J)=>Kr0(J,Q,Y))&&G.length>=Wr0}function IL4($,Z,X,Q=Date.now(),Y=!0){let G=fF$($,Z,X,Q);if(G.length===0)return!1;if(G.some((W)=>qt(W,Q)))return!0;let J=G.filter((W)=>Kr0(W,Q,Y));if(J.length>=Wr0)return!0;return J.length!==G.length}function qL4($,Z,X,Q,Y=Date.now()){return $.threads.find((G)=>AO(G.title,Z)&&G.status==="completed"&&!qt(G,Y)&&new Date(G.createdAt).getTime()>=X&&!Q.has(G.threadId))??null}function ML4($,Z){let X=new Map;for(let Q of $){if(Q.action!=="review_verdict_requested")continue;let Y=new Date(Q.occurredAt).getTime();if(Y<Z)continue;let G=Q.data?.threadId;if(typeof G==="string")X.set(G,Y)}return X}function VL4($,Z){for(let X of $.values())if(Z-X<kL4)return!0;return!1}function SL4($){return[`Your ${IK[$]} run ended without recording a decision, so the task is stuck: nothing ships and nobody is told why. A review that reaches no verdict is not a review.`,"","Do exactly ONE thing in this run and then stop:","- Call `TASK_BOARD_REVIEW_DECISION` now, with the verdict your review already reached and notes that say what you checked.","- Approve ONLY if you actually exercised the change and it holds. If you could not finish \u2014 a check never came back, a preview never rendered, you ran out of room \u2014 `request_changes` and say exactly what is unresolved. That hands the card to a person, which is the correct outcome for an unfinished review.","- Do NOT re-run the review, do NOT change any code, and do NOT wait on any background task: whatever you know right now is the verdict."].join(`
1367
1367
  `)}async function CL4($,Z,X,Q){let Y=await $.storage.threads.get(Q.threadId);if(!Y||Y.message_storage_version!==2)return;await $.storage.taskBoard.recordActivity({taskBoardItemId:Z.id,action:"review_verdict_requested",actorId:null,data:{reviewer:X,threadId:Q.threadId}}),console.warn(`[task-board] ${X} reviewer on ${Z.id} completed with no verdict \u2014 `+"asking for one"),await Eg($,Z,Y,{messageId:`review-verdict-${Q.threadId}`,prompt:SL4(X),workflowID:`review-verdict:${Q.threadId}`,runClass:"reviewer"})}function _L4($,Z,X,Q){return`review:${$}:${Z}:${X.toISOString()}:${Q}`}function vL4($){return`thrd_${LL4("sha256").update($).digest("hex").slice(0,32)}`}async function fL4($,Z,X,Q,Y,G){let J=Z.organizationId,W=Gr0(Z.id,X,Q),K=await CL0($,J),H=K&&"repo"in K?K.repo:null,F=K!==null,N=TL4(Z,X,Q.getTime()),U=AL4(Z.repo,K),B=F?"mcp__studio__TASK_BOARD_ITEM_PRS_GET":"TASK_BOARD_ITEM_PRS_GET",O=F?"mcp__studio__TASK_BOARD_REVIEW_DECISION":"TASK_BOARD_REVIEW_DECISION",L=F?"mcp__studio__TASK_BOARD_COMMENT_CREATE":"TASK_BOARD_COMMENT_CREATE",w=F?"mcp__studio__TASK_BOARD_COMMENT_LIST":"TASK_BOARD_COMMENT_LIST",E=[EL4[X],"","You are running AUTONOMOUSLY \u2014 no human is watching this run. Making the "+'approve / request-changes call IS your job; you are the decision-maker, not an assistant asking a human to decide. NEVER use `user_ask` to ask whether to approve, or to confirm an obvious call ("Approve the PR?"). Reserve `user_ask` for a genuine, unresolvable blocker only a human can clear (e.g. a missing credential, or a requirement so ambiguous you '+"truly cannot judge the outcome) \u2014 that should be rare. When in doubt "+"between asking and deciding, DECIDE.","","Do NOT merge the pull request \u2014 the board does that itself once your "+"approval is in. Pushing fixes to the PR's own branch is expected of you; opening a second pull request, force-pushing, or touching any other ref is not."].join(`
1368
1368
  `),j=Z.description&&F?VL0(Z.description):Z.description,z=Z.description&&j?SL0(Z.description,j):null,A=[...F?[]:[E,""],`Task title: ${Z.title}`,j?`
1369
1369
  Task description:
1370
1370
  ${j}
1371
- `:"",...z?[z,""]:[],"How to work:",`- Call \`${B}\` with the task id below to find the pull request under review.`,H?`- The repository ${H.owner}/${H.name} is already cloned at your working directory and \`git\` and \`gh\` are authenticated \u2014 check the PR's branch out there to inspect / exercise the change. ${mp}`:F?`- Your working directory is EMPTY. Call \`mcp__studio__TASK_ADD_REPO\` ${U?`with connectionId \`${U}\` (${Z.repo}) FIRST \u2014 do NOT call it with no arguments, that only lists the org's repositories and costs you a turn.`:"with the connectionId of the PR's repository FIRST;"} it clones the repository and waits for the checkout, and \`git\` and \`gh\` are authenticated once it returns. ${mp}`:"- Load the PR's repository to inspect / exercise the change.",`- ${n0$}`,...N>0?[`- This is a RE-REVIEW. You already reviewed an earlier version of this pull request and asked for changes, and there are more commits since (a human re-delegated the card, or your own fixes from that round are in the history). Read your own previous notes with \`${w}\`, then review WHAT MOVED SINCE \u2014 \`gh pr diff <number>\` still shows the whole PR, so narrow it with \`git log --since='${new Date(N).toISOString()}' --oneline\` and diff only those commits. Confirm your earlier notes were addressed and check the new commits for their own problems. Do NOT re-read the parts of the PR you already cleared.`]:[],"- Fix the issues you find on the PR's branch, run the repository's own checks, and push to that same PR. You are the last automated run on this task \u2014 nothing picks up findings you only describe.",`- THEN exercise the change on the PR's deploy \`previewUrl\` (from \`${B}\`) \u2014 re-read it after your push so you get the preview of YOUR commit, and wait for it if it is still building. Deep-link to the page/route the task affects (not root). If you cannot render or exercise it, do NOT approve \u2014 \`request_changes\` with what's blocking.`,"- For a VISUAL change, capture before/after by running `qa-screenshot <url> org/output/qa/<name>.png [--mobile] [--full] [--selector=<css>] [--console]` (headless Chromium, baked into the sandbox; also works against a dev server you started on localhost \u2014 none is running by default, this pod is a checkout). Choose the framing: default is the top viewport, `--full` is the whole page, and `--selector='<css>'` frames just the component you changed (best for a focused before/after). Add `--mobile` too for a responsive change, and `--console` to catch the runtime errors a screenshot alone reports as a pass. WRITE them under `org/output/` \u2014 that's what surfaces them on the task. Then `Read` the files to actually LOOK at them: a screenshot you never opened is not verification.",`- Record what you validated with \`${L}\` (scenarios + pass/fail, the exact URL + viewport, and anything you couldn't verify) BEFORE your decision. EMBED the before/after shots inline as markdown images referencing their org/output path, and put each before/after PAIR in a two-column table so they render side by side, e.g.:
1371
+ `:"",...z?[z,""]:[],"How to work:",`- Call \`${B}\` with the task id below to find the pull request under review.`,H?`- The repository ${H.owner}/${H.name} is already cloned at your working directory and \`git\` and \`gh\` are authenticated \u2014 check the PR's branch out there to inspect / exercise the change. ${mp}`:F?`- Your working directory is EMPTY. Call \`mcp__studio__TASK_ADD_REPO\` ${U?`with connectionId \`${U}\` (${Z.repo}) FIRST \u2014 do NOT call it with no arguments, that only lists the org's repositories and costs you a turn.`:"with the connectionId of the PR's repository FIRST;"} it clones the repository and waits for the checkout, and \`git\` and \`gh\` are authenticated once it returns. ${mp}`:"- Load the PR's repository to inspect / exercise the change.",`- ${n0$}`,...N>0?[`- This is a RE-REVIEW. You already reviewed an earlier version of this pull request and asked for changes, and there are more commits since (a human re-delegated the card, or your own fixes from that round are in the history). Read your own previous notes with \`${w}\`, then review WHAT MOVED SINCE \u2014 \`gh pr diff <number>\` still shows the whole PR, so narrow it with \`git log --since='${new Date(N).toISOString()}' --oneline\` and diff only those commits. Confirm your earlier notes were addressed and check the new commits for their own problems. Do NOT re-read the parts of the PR you already cleared.`]:[],"- Fix the issues you find on the PR's branch, run the repository's own checks, and push to that same PR. You are the last automated run on this task \u2014 nothing picks up findings you only describe.",`- THEN exercise the change on the PR's deploy \`previewUrl\` (from \`${B}\`) \u2014 re-read it after your push so you get the preview of YOUR commit, and wait for it if it is still building. Deep-link to the page/route the task affects (not root). If you cannot render or exercise it, do NOT approve \u2014 \`request_changes\` with what's blocking.`,"- For a VISUAL change, capture before/after by running `qa-screenshot <url> org/output/qa/<name>.png [--mobile] [--full] [--selector=<css>] [--console]` (headless Chromium, baked into the sandbox; also works against a dev server you started on localhost \u2014 none is running by default, this pod is a checkout). Choose the framing: default is the top viewport, `--full` is the whole page, and `--selector='<css>'` frames just the component you changed (best for a focused before/after). Add `--mobile` too for a responsive change, and `--console` to catch the runtime errors a screenshot alone reports as a pass. WRITE them under `org/output/` \u2014 that's what surfaces them on the task. Then `Read` the files to actually LOOK at them: a screenshot you never opened is not verification. To INTERACT with a page \u2014 click, hit-test with `document.elementFromPoint`, fill a form \u2014 `qa-screenshot` is not enough, but the browser it drives is yours: write a throwaway node script that requires the global playwright-core: `const { chromium } = require(\"/usr/local/lib/node_modules/playwright-core\"); chromium.launch({ executablePath: \"/usr/bin/chromium\", args: [\"--no-sandbox\"] })`. Do NOT report a check as impossible because Playwright is missing \u2014 it is installed.",`- Record what you validated with \`${L}\` (scenarios + pass/fail, the exact URL + viewport, and anything you couldn't verify) BEFORE your decision. EMBED the before/after shots inline as markdown images referencing their org/output path, and put each before/after PAIR in a two-column table so they render side by side, e.g.:
1372
1372
 
1373
1373
  | Before | After |
1374
1374
  | --- | --- |
@@ -2979,7 +2979,7 @@ Respond with ONLY a JSON object of this shape, and nothing else:
2979
2979
  ${G.join(`
2980
2980
  `)}`:Y}function PB6($){let Z=new Set;for(let X of $)for(let Q of X.split(`
2981
2981
  `)){let Y=Q.trim();if(/^Co-authored-by:\s/i.test(Y))Z.add(Y)}return[...Z]}var md$=200,NB6=12,BB6,DB6=300,YX1=3;var GX1=D(()=>{QL();bT0();BB6={aheadBy:0,behindBy:0,files:[]}});function TB6($){if(!$||$.includes(".."))return!1;return AB6.test($)}function pd$($){let Z=typeof $.__resolveType==="string"?$.__resolveType:null;if(!Z||!TB6(Z))return null;let{__resolveType:X,...Q}=$;return{resolveType:Z,payload:Q}}function nd$($,Z){return`${$.replace(/\/+$/,"")}/deco/invoke/${Z}`}var AB6;var td$=D(()=>{AB6=/^[\w./@-]+$/});function _a($,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 od$($,Z,X,Q){if(!Q.connectionId)throw new kv("Push requires a connected GitHub account. Connect mcp-github for this project and restart the sandbox.");let Y=$.organization?.id;if(!Y)throw new kv(K9);await lO({ctx:$,connectionId:Q.connectionId,organizationId:Y,forceRefresh:!0,onLegacyMintError:(F)=>{let N=F instanceof Error?F.message:K9;throw new kv(N)}});let{cloneUrl:G,gitUserName:J,gitUserEmail:W}=await bK(Q.connectionId,Q.owner,Q.name,$.db,$.vault).catch((F)=>{let{code:N,message:U}=D9$(F instanceof Error?F.message:String(F));throw N?new kv(U):F}),K=Yl($),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 uO(H,RB6).catch(()=>H.statusText);throw Error(`Failed to refresh sandbox git credentials (${H.status}): ${F}`)}}var RB6=10485760,kv;var JX1=D(()=>{HJ();RT0();Pn();ci0();dy();kv=class kv extends Error{constructor($){super($);this.name="GitPushAuthError"}}});function qB6($){let Z=$.startsWith("thread:")?$.slice(7):$;if(!Z||Z.length>255||Z.includes("..")||Z.startsWith("/")||Z.endsWith("/")||Z.endsWith(".lock")||!IB6.test(Z))throw Error(`Invalid branch name: ${$}`)}function Vv($){return AbortSignal.any([$.req.raw.signal,AbortSignal.timeout(kB6)])}async function SB6($,Z){let X=$.var.studioContext,Q=WJ(Z.branch),Y=$.req.query("thread")??Q,G=Y&&Y===Q?Z.branchThread:Y?await X.storage.threads.get(Y).catch(()=>null):null,J=G?.virtual_mcp_id===Z.virtualMcpId?G:null,W=kC(J?.metadata?.runtime);if(W)return W;let K=UD0(Z.virtualMcpMetadata),H=K==="cms"?await u71(X,{claimName:Z.claimName}):"alive",F=K==="cms"&&H!=="alive"?"cms":"sandbox",N=!!J&&(H==="gone"||H==="alive"&&K==="cms");if(N&&J)sn(X,J.id,F);if(K==="cms")console.log("sandbox proxy: no runtime stamp",{route:$.req.path,method:$.req.method,reason:J?"unstamped":"threadless",liveness:H,resolved:F,stamped:N});return F}async function CB6($){let Z=$.get("vmClaim");if(Z.runner)return Z.runner;try{return await WQ($.var.studioContext)}catch{return null}}function Sv($){let{runner:Z}=$.get("vmClaim");if(!Z)return $.json({error:"No sandbox runner configured"},503);return Z}async function Hl($){let{virtualMcpMetadata:Z,connectionIds:X}=$.get("vmClaim"),Q=$.var.studioContext,Y=_a(Z,X);if(!Y)throw new h4(404,"AUTH","repo","Project has no GitHub repository");let G=n(Q);return IT0(Q,G.id,Y)}function WX1($,Z){if(Z instanceof kA0)return $.json({error:Z.message},429,{...T5,...Z.retryAfterMs===null?{}:{"Retry-After":String(Math.ceil(Z.retryAfterMs/1000))}});if(Z instanceof h4){let Q=Z.status===404?404:Z.status===409||Z.status===422?409:502;return $.json({error:Z.message},Q,T5)}let X=Z instanceof Error?Z.message:String(Z);return $.json({error:X},502,T5)}async function ad$($,Z,X){let Q;try{Q=await fetch(Z,X)}catch{return $.json({error:"Preview unreachable"},502)}let Y;try{Y=await Q.text()}catch{return $.json({error:"Preview unreachable"},502)}return new Response(Y,{status:Q.status,headers:{"content-type":Q.headers.get("content-type")??"application/json"}})}async function ed$($){try{let Z=await Hl($),X=await xT0(Z,$.get("vmClaim").branch);return $.json(X,200,T5)}catch(Z){return WX1($,Z)}}function va($,Z){let Q=(hT0.get($)??Promise.resolve()).catch(()=>{}).then(Z),Y=Q.catch(()=>{});return hT0.set($,Y),Y.finally(()=>{if(hT0.get($)===Y)hT0.delete($)}),Q}async function X7($,Z,X){if(!X?.runner&&$.get("vmClaim").runtime==="cms")return $.json({error:"sandbox not found: this session is sandbox-less"},404,T5);let Q=X?.runner??Sv($);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 B=await Q.proxyDaemonRequest(Y,Z,N);if(X?.map404to410&&B.status===404){try{await B.body?.cancel()}catch{}if(await Q.adoptLiveClaim({userId:G,projectRef:J},Y))B=await Q.proxyDaemonRequest(Y,Z,N);if(B.status===404){try{await B.body?.cancel()}catch{}return new Response(JSON.stringify({error:"Sandbox handle is gone. The sandbox needs to be re-provisioned."}),{status:410,headers:{"content-type":"application/json",...T5}})}}let O=await B.text(),L=X?.redactRepoDir?_B6(O):O,w=B.headers.get("content-type")??"application/json";return new Response(L,{status:B.status,headers:{"content-type":w,...T5}})};try{if(F){let B=U();return B.catch(()=>{}),await Promise.race([B,new Promise((L,w)=>{if(F.aborted)return w(F.reason);F.addEventListener("abort",()=>w(F.reason),{once:!0})})])}return await U()}catch(B){let O=B instanceof Error?B.message:String(B);return $.json({error:`Daemon unreachable: ${O}`},502)}}function _B6($){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 uT0($,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 vB6($){return $m$.includes($)}var IB6,rd$=524288,MB6=65536,kB6=1e4,sd$=2000,VB6,hT0,T5,$m$,Zm$=()=>{let $=new K1;$.use("/:virtualMcpId/:branch/*",VB6),$.post("/:virtualMcpId/:branch/write",(X)=>X7(X,"/_sandbox/write",{forwardJsonBody:!0,signal:Vv(X)})),$.post("/:virtualMcpId/:branch/unlink",(X)=>X7(X,"/_sandbox/unlink",{forwardJsonBody:!0,signal:Vv(X)})),$.post("/:virtualMcpId/:branch/mkdir",(X)=>X7(X,"/_sandbox/mkdir",{forwardJsonBody:!0,signal:Vv(X)})),$.post("/:virtualMcpId/:branch/rename",(X)=>X7(X,"/_sandbox/rename",{forwardJsonBody:!0,signal:Vv(X)})),$.post("/:virtualMcpId/:branch/read",(X)=>X7(X,"/_sandbox/read",{forwardJsonBody:!0,signal:Vv(X)})),$.post("/:virtualMcpId/:branch/glob",(X)=>X7(X,"/_sandbox/glob",{forwardJsonBody:!0,signal:Vv(X)})),$.post("/:virtualMcpId/:branch/grep",(X)=>X7(X,"/_sandbox/grep",{forwardJsonBody:!0,signal:Vv(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 X7(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 X7(X,`/_sandbox/exec/${encodeURIComponent(Q)}/kill`)}),$.get("/:virtualMcpId/:branch/config",(X)=>X7(X,"/_sandbox/config",{method:"GET",map404to410:!0,redactRepoDir:!0})),$.put("/:virtualMcpId/:branch/config",(X)=>X7(X,"/_sandbox/config",{method:"PUT",forwardJsonBody:!0,map404to410:!0})),$.post("/:virtualMcpId/:branch/setup/:step",async(X)=>{let Q=X.req.param("step");if(!Q||!vB6(Q))return X.json({error:`step must be one of: ${$m$.join(", ")}`},400);let Y=X.get("vmClaim"),G=await u71(X.var.studioContext,{claimName:Y.claimName})==="gone"?null:await CB6(X);if(!G)return X.json({error:"sandbox not found: nothing is running at this ref"},404,T5);if(Q==="start"){let J=n(X.var.studioContext),W=ly(Y.virtualMcpMetadata);try{await k70({ctx:X.var.studioContext,runner:G,handle:Y.claimName,orgId:J.id,userId:Y.callerUserId,entries:W})}catch(K){let H=K instanceof Error?K.message:String(K);return X.json({error:`Failed to push env to daemon: ${H}`},502)}}return X7(X,`/_sandbox/setup/${Q}`,{signal:X.req.raw.signal,map404to410:!0,runner:G})}),$.get("/:virtualMcpId/:branch/events",(X)=>{let Q=X.get("vmClaim");if(!Q.runner)return $U(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 Zd$(X,{ctx:X.var.studioContext,claimName:Q.claimName,runner:Q.runner,virtualMcpId:Q.virtualMcpId,branch:Q.branch,userId:Q.userId,projectRef:Q.projectRef,virtualMcpMetadata:Q.virtualMcpMetadata})}),$.get("/:virtualMcpId/:branch/git/status",(X)=>{if(X.get("vmClaim").runtime==="cms")return ed$(X);return Z(X)});let Z=(X)=>X7(X,"/_sandbox/git/status",{method:"GET",map404to410:!0,signal:AbortSignal.any([X.req.raw.signal,AbortSignal.timeout(sd$)])});return $.post("/:virtualMcpId/:branch/git/status",(X)=>{if(X.get("vmClaim").runtime==="cms")return ed$(X);return X7(X,"/_sandbox/git/status",{map404to410:!0,signal:AbortSignal.any([X.req.raw.signal,AbortSignal.timeout(sd$)])})}),$.post("/:virtualMcpId/:branch/git/diff",async(X)=>{let Q=X.get("vmClaim");if(Q.runtime==="cms")try{let Y=await X.req.json().catch(()=>({})),G=await Hl(X),J=await yT0(G,Q.branch,Y.base);return X.json(J,200,T5)}catch(Y){return WX1(X,Y)}return X7(X,"/_sandbox/git/diff",{forwardJsonBody:!0,map404to410:!0})}),$.post("/:virtualMcpId/:branch/git/publish",async(X)=>{if(X.get("vmClaim").runtime==="cms")return X.json({ok:!0},200,T5);let Q=Sv(X);if(Q instanceof Response)return Q;let{claimName:Y,virtualMcpMetadata:G,connectionIds:J}=X.get("vmClaim"),W=X.var.studioContext;return va(Y,async()=>{try{await l71(W,Q,Y);let K=_a(G,J);if(K)await od$(W,Q,Y,K)}catch(K){if(K instanceof kv)return X.json({error:K.message},403,T5);let H=K instanceof Error?K.message:String(K);return X.json({error:H},502,T5)}return X7(X,"/_sandbox/git/publish",{forwardJsonBody:!0,map404to410:!0})})}),$.post("/:virtualMcpId/:branch/git/discard",async(X)=>{let Q=X.get("vmClaim");if(Q.runtime==="cms")return va(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,T5);try{let J=await Hl(X);return await id$(J,Q.branch,G),X.json({ok:!0},200,T5)}catch(J){let W=J instanceof h4&&J.status===409?409:502,K=J instanceof Error?J.message:String(J);return X.json({error:K},W,T5)}});return va(Q.claimName,()=>X7(X,"/_sandbox/git/discard",{forwardJsonBody:!0,map404to410:!0}))}),$.post("/:virtualMcpId/:branch/git/rebase",async(X)=>{let Q=X.get("vmClaim");if(Q.runtime==="cms")return va(Q.claimName,async()=>{try{let W=await X.req.json().catch(()=>({})),K=await Hl(X),H=W.base??await K.getDefaultBranch();return await gT0(K,Q.branch,H),X.json({ok:!0},200,T5)}catch(W){return WX1(X,W)}});let Y=Sv(X);if(Y instanceof Response)return Y;let{claimName:G}=X.get("vmClaim"),J=X.var.studioContext;return va(G,async()=>{try{await l71(J,Y,G)}catch(W){let K=W instanceof Error?W.message:String(W);return X.json({error:K},502,T5)}return X7(X,"/_sandbox/git/rebase",{forwardJsonBody:!0,map404to410:!0})})}),$.post("/:virtualMcpId/:branch/git/suggest-commit",o5({maxSize:rd$,onError:(X)=>X.json({error:"Payload too large"},413,T5)}),async(X)=>{let Q=X.get("vmClaim"),Y=null;if(Q.runtime!=="cms"){let H=Sv(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,[B,O]=m71(F)&&U?[F,N]:Y?await Promise.all([uT0(Y,G,"/_sandbox/git/status","GET",{userId:J,projectRef:W}),uT0(Y,G,"/_sandbox/git/diff","GET",{userId:J,projectRef:W})]):await(async()=>{let w=await Hl(X);return Promise.all([xT0(w,Q.branch),yT0(w,Q.branch)])})(),L=await Jd$(K,B,O);return X.json(L,200,T5)}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,T5);return X.json({error:F},502,T5)}}),$.post("/:virtualMcpId/:branch/git/judge-review",o5({maxSize:rd$,onError:(X)=>X.json({error:"Payload too large"},413,T5)}),async(X)=>{let Q=X.get("vmClaim"),Y=null;if(Q.runtime!=="cms"){let H=Sv(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,[B,O]=m71(F)&&U?[F,N]:Y?await Promise.all([uT0(Y,G,"/_sandbox/git/status","GET",{userId:J,projectRef:W}),uT0(Y,G,"/_sandbox/git/diff","GET",{userId:J,projectRef:W})]):await(async()=>{let w=await Hl(X);return Promise.all([xT0(w,Q.branch),yT0(w,Q.branch)])})(),L=await Kd$(K,B,O,typeof H.language==="string"?H.language:void 0);return X.json(L,200,T5)}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,T5);return X.json({error:F},502,T5)}}),$.get("/:virtualMcpId/:branch/preview-fetch",async(X)=>{let Q=Sv(X);if(Q instanceof Response)return Q;let{claimName:Y}=X.get("vmClaim"),G=X.req.query("path");if(!G||!G.startsWith("/")||G.startsWith("//")||G.includes("..")||G.includes("\\"))return X.json({error:"Path not allowed"},403);let J;try{J=await Q.getPreviewUrl(Y)}catch{return X.json({error:"Preview not available"},502)}if(!J)return X.json({error:"Preview not available"},502);let W=J.replace(/\/+$/,"");return ad$(X,`${W}${G}`)}),$.post("/:virtualMcpId/:branch/preview-invoke",o5({maxSize:MB6,onError:(X)=>X.json({error:"Payload too large"},413)}),async(X)=>{let Q=Sv(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=pd$(J);if(!W)return X.json({error:"Invalid or missing __resolveType"},400);let K=nd$(G,W.resolveType);return ad$(X,K,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(W.payload),signal:AbortSignal.timeout(30000)})}),$};var Xm$=D(()=>{Q8();MH();Ql();h71();Ln();ac$();n3();Jg();ec$();a3();$d$();Xd$();hi0();jn();n71();Hd$();o71();QL();GX1();td$();JX1();IB6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;VB6=TT0(async($,Z)=>{let X=$.var.studioContext;try{t(X)}catch{return $.json({error:"Unauthorized"},401)}let Q=o0(X);if(!Q)return $.json({error:"Unauthorized"},401);let Y;try{Y=n(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{qB6(J)}catch(L){let w=L instanceof Error?L.message:String(L);return $.json({error:w},400)}let W=await X.storage.virtualMcps.findById(G);if(!W||W.organization_id!==Y.id)return $.json({error:"Virtual MCP not found"},404);let K=On({orgId:Y.id,virtualMcpId:G,branch:J}),H=await vi0(X,J),F=fi0(H,Q),N=sc$({userId:F,projectRef:K}),U=W.metadata??null,B=await SB6($,{claimName:N,branch:J,virtualMcpId:G,sandboxUserId:F,virtualMcpMetadata:U,branchThread:H});if(B==="cms")return $.set("vmClaim",{claimName:N,callerUserId:Q,runner:null,virtualMcpId:G,branch:J,userId:F,projectRef:K,virtualMcpMetadata:U,connectionIds:W.connections?.map((L)=>L.connection_id)??[],runtime:B}),Z();let O;try{O=await WQ(X)}catch{O=null}if(!O)return $.json({error:"No sandbox runner found"},404);return $.set("vmClaim",{claimName:N,callerUserId:Q,runner:O,virtualMcpId:G,branch:J,userId:F,projectRef:K,virtualMcpMetadata:U,connectionIds:W.connections?.map((L)=>L.connection_id)??[],runtime:B}),Z()});hT0=new Map;T5={"Cache-Control":"no-store, no-cache, must-revalidate",Pragma:"no-cache"};$m$=["clone","install","start"]});function Qm$($,Z,X){let Q=KX1.get($);if(!Q)Q={pending:null,running:!1},KX1.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)bB6($,Q);return G}async function bB6($,Z){Z.running=!0;try{while(Z.pending){let X=Z.pending;Z.pending=null;try{let Q=await xB6(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)KX1.delete($)}}async function xB6($){let{client:Z,branch:X,packagePath:Q}=$.deps;for(let Y=0;;Y++){let G=await Kl(Z,X),J=await Z.getCommitTreeSha(G),W=await Z.getDecofileTree(J,Q),K=XX1(W,Q),H=[],F=new Map(K.map((O)=>[O.path,{stem:O.stem,sha:O.sha}]));for(let[O,L]of $.set){let w=QX1(K,O),E=`${JSON.stringify(L,null,2)}
2982
- `,j=await Z.createBlob(E);await ld$(Z.owner,Z.repo,j,E);let z=w[0]??`${fT0(Q)}/${s71(O)}.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 w.slice(1))H.push({path:P,mode:"100644",type:"blob",sha:null}),F.delete(P)}for(let O of $.del)for(let L of QX1(K,O))H.push({path:L,mode:"100644",type:"blob",sha:null}),F.delete(L);if(H.length===0)return G;let N=Q?`${Q}/.deco/blocks.gen.json`:".deco/blocks.gen.json";if(W.some((O)=>O.type==="blob"&&O.path===N)){let O=await Promise.all([...F.values()].map(async(j)=>({stem:j.stem,content:j.content??await Z.getBlobText(j.sha)}))),{decofile:L,skipped:w}=ka(O);if(w.length>0)console.warn("decofile gen: dropped blocks that were not valid JSON",{repo:`${Z.owner}/${Z.repo}`,branch:X,packagePath:Q,blocks:w.map((j)=>j.key)});let E=await Z.createBlob(L);H.push({path:N,mode:"100644",type:"blob",sha:E})}let U=await Z.createTree(J,H),B=await Z.createCommit({message:yB6($),treeSha:U,parentShas:[G]});try{return await Z.updateRef(X,B),B}catch(O){if(!(O instanceof h4&&O.status===422)||Y>=fB6-1)throw O;await w$(G7(2000,200,Y,2,0.5))}}}function yB6($){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 Mi0(Q,$.deps.coAuthor)}var fB6=3,KX1;var Ym$=D(()=>{JD0();MT0();W4();QL();bT0();KX1=new Map});import{createHmac as Gm$,randomBytes as gB6,timingSafeEqual as hB6}from"crypto";function Jm$(){if(lT0)return lT0;let $;try{let Z=C0();$=Z.studioJwtSecret??Z.betterAuthSecret}catch{$=void 0}return lT0=$?Buffer.from($):gB6(32),lT0}function HX1($){let Z=$.nowMs??Date.now(),X={o:$.organizationId,m:$.virtualMcpId,b:$.branch,e:Math.floor((Z+uB6)/1000)},Q=Buffer.from(JSON.stringify(X)).toString("base64url"),Y=Gm$("sha256",Jm$()).update(Q).digest("base64url");return`${Q}.${Y}`}function Wm$($,Z){let X=$.indexOf(".");if(X<0)return!1;let Q=$.slice(0,X),Y=Buffer.from($.slice(X+1)),G=Buffer.from(Gm$("sha256",Jm$()).update(Q).digest("base64url"));if(Y.length!==G.length||!hB6(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 uB6=21600000,lT0=null;var Km$=D(()=>{E$()});import{z as Fl}from"zod";function cB6($){return $.length>0&&$.length<=255&&!$.includes("..")&&!$.endsWith("/")&&!$.endsWith(".lock")&&lB6.test($)}function Bm$($){return $.req.header("x-forwarded-host")??new URL($.req.url).host}async function fa($){let Z=$.get("decofileScope");return IT0($.var.studioContext,Z.organizationId,Z.githubRepo)}function ba($,Z){if(Z instanceof h4){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 Om$(){let $=new K1;return $.use("/:virtualMcpId/:branch",Um$),$.use("/:virtualMcpId/:branch/*",Um$),$.get("/:virtualMcpId/:branch",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await fa(Z),Y=await cd$(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=HX1({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.body(`{"version":${JSON.stringify(Y.sha)},"token":${JSON.stringify(J)},"apiHost":${JSON.stringify(Bm$(Z))},"decofile":${Y.decofile}}`,200,{...G,"content-type":"application/json"})}catch(Q){return ba(Z,Q)}}),$.get("/:virtualMcpId/:branch/meta",async(Z)=>{let X=Z.get("decofileScope"),Q=X.packagePath?`${X.packagePath}/.deco/meta.gen.json`:".deco/meta.gen.json";try{let Y=await fa(Z),G=await Y.getFileTextAtRef(X.branch,Q);if(G===null){let J=await Y.getDefaultBranch();if(J!==X.branch)G=await Y.getFileTextAtRef(J,Q)}if(G===null)return Z.json({error:"meta.gen.json not committed"},404);return Z.body(G,200,{"content-type":"application/json","Cache-Control":"no-store","Access-Control-Allow-Origin":"*"})}catch(Y){return ba(Z,Y)}}),$.patch("/:virtualMcpId/:branch",mB6,async(Z)=>{let X=Z.get("decofileScope"),Q=Z.var.studioContext,Y=iB6.safeParse(await Z.req.json().catch(()=>null));if(!Y.success)return Z.json({error:"Invalid body",details:Y.error.issues},400);let G=Y.data;for(let J of[...Object.keys(G.set??{}),...G.delete??[]])try{qT0(J)}catch(W){let K=W instanceof Error?W.message:String(W);return Z.json({error:K},400)}for(let[J,W]of Object.entries(G.set??{})){if(typeof W!=="object"||W===null||Array.isArray(W))return Z.json({error:`Block "${J}" must be a JSON object`},400);if(r71(J))return Z.json({error:`Block key "${J}" collides with a framework resolver module and cannot be written`},400)}try{let J=await fa(Z),W=await Qm$(`${X.organizationId}/${X.virtualMcpId}/${X.branch}`,{client:J,branch:X.branch,packagePath:X.packagePath,coAuthor:Yl(Q)},G),K=HX1({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.json({version:W,token:K,apiHost:Bm$(Z)})}catch(J){return ba(Z,J)}}),$.post("/:virtualMcpId/:branch/publish",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await fa(Z),Y=await Q.getDefaultBranch();if(Y===X.branch)return Z.json({error:"Branch is already the default branch"},400);let G=`chore(decofile): publish ${X.branch}`;try{let J;try{J=await Q.mergeBranch(Y,X.branch,G)}catch(W){if(!(W instanceof h4&&W.status===409))throw W;await gT0(Q,X.branch,Y),J=await Q.mergeBranch(Y,X.branch,G)}return J?Z.json({result:"merged",sha:J}):Z.json({result:"up-to-date"})}catch(J){if(J instanceof h4&&J.status===409)return Z.json({error:"merge-conflict"},409);if(J instanceof h4&&J.status===405){let K=await Q.findOpenPullRequest(Y,X.branch)??await Q.createPullRequest({base:Y,head:X.branch,title:`Publish ${X.branch}`});return Z.json({result:"pull-request",number:K.number,url:K.html_url})}throw J}}catch(Q){return ba(Z,Q)}}),$.get("/:virtualMcpId/:branch/status",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await fa(Z),Y=await Q.getDefaultBranch();if(Y===X.branch)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0,lastCommitAt:null});try{let[{aheadBy:G,behindBy:J},W]=await Promise.all([Q.compare(Y,X.branch),Q.getBranchHead(X.branch)]);return Z.json({baseBranch:Y,aheadBy:G,behindBy:J,lastCommitAt:W.committedAt})}catch(G){if(G instanceof h4&&G.status===404)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0,lastCommitAt:null});throw G}}catch(Q){return ba(Z,Q)}}),$}var lB6,Hm$=500,Fm$=1048576,Nm$=1024,dB6=8388608,mB6,iB6,Um$;var Dm$=D(()=>{Ft0();MT0();Q8();MH();h71();RT0();JX1();o71();Ym$();Km$();GX1();QL();bT0();lB6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;mB6=o5({maxSize:dB6,onError:($)=>$.json({error:"Payload too large"},413)}),iB6=Fl.object({set:Fl.record(Fl.string(),Fl.unknown()).optional(),delete:Fl.array(Fl.string()).optional()}).refine(($)=>Object.keys($.set??{}).length>0||($.delete?.length??0)>0,{message:"Patch must set or delete at least one block"}).refine(($)=>Object.keys($.set??{}).length+($.delete?.length??0)<=Hm$,{message:`Patch cannot touch more than ${Hm$} blocks`}).refine(($)=>Object.values($.set??{}).every((Z)=>JSON.stringify(Z).length<=Fm$),{message:`Each block must be at most ${Fm$} bytes`}).refine(($)=>[...Object.keys($.set??{}),...$.delete??[]].every((Z)=>Z.length<=Nm$),{message:`Each block key must be at most ${Nm$} characters`}),Um$=TT0(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(!cB6(G))return $.json({error:`Invalid branch name: ${G}`},400);let J=X.auth?.user?.id??null;if(!J){let B=$.req.query("token");if(!($.req.method==="GET"&&!$.req.path.match(/\/(publish|status)$/)))return $.json({error:"Unauthorized"},401);if(!B||!Wm$(B,{organizationId:Q.id,virtualMcpId:Y,branch:G}))return $.json({error:"Unauthorized"},401)}let W=await X.storage.virtualMcps.findById(Y);if(!W||W.organization_id!==Q.id)return $.json({error:"Virtual MCP not found"},404);let K=W.metadata??null;if(!ND0(K))return $.json({error:"Project has no preview server configured"},404);let F=W.connections?.map((B)=>B.connection_id)??[],N=_a(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 Lm$=($)=>{let Z=new K1;if(Z.use("*",Ev),Z.route("/",gA0()),Z.route("/",_h$()),Z.route("/",gc$()),Z.route("/",bc$()),Z.route("/",zT0()),Z.route("/tools",ic$()),Z.route("/",cc$()),Z.route("/",Oc$({kvStorage:$.kvStorage})),Z.route("/",Uc$()),Z.route("/fs",kc$({getConnection:$.getNatsConnection})),Z.route("/sandbox",Zm$()),Z.route("/decofile",Om$()),Z.route("/",_c$()),Z.route("/deco-sites",uA0()),Z.route("/hosting",Ph$()),Z.route("/monitor",kh$()),Z.route("/sso",_A0()),Z.route("/",PT0({tokenStorage:$.tokenStorage,automationEventDispatcher:$.automationEventDispatcher})),Z.route("/webhooks",Oh$()),$.mountDevAssets)Z.route("/dev-assets",dA0({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("/",bx$()),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",Sc$()),Z.route("/mcp",cw0()),Z.route("/mcp/self",jT0()),Z.route("/mcp",iw0()),Z.all("/oauth-proxy/:connectionId/*",$.oauthProxyHandler),Z.get("/watch",$.watchHandler),Z};var wm$=D(()=>{Q8();GZ1();Dh$();HZ1();Ah$();Vh$();mA0();$a();QZ1();Bc$();Dc$();Vc$();Wo();s91();pw0();_71();Cc$();vc$();xc$();hc$();dc$();f71();pc$();b71();dw0();Xm$();Dm$()});function pB6($){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 nB6=async($,Z)=>{if(!$.get("studioContext").auth.user?.id)return $.json({error:"Unauthorized"},401);return Z()},Em$=()=>{let $=new K1;return $.use("*",nB6),$.get("/",async(Z)=>{let X=C0(),Q=X.decoSupabaseUrl,Y=X.decoSupabaseServiceKey;if(!Q||!Y)return Z.json({apps:[]});try{let G=await Z7(Q,Y,"apps?select=name,title,description,logo,category,vendors(alias,url)");return Z.json({apps:pB6(G)})}catch(G){return console.error("[deco-apps] GET error:",G),Z.json({error:"Failed to fetch apps"},502)}}),$};var jm$=D(()=>{Q8();E$();xP0()});import{z as k1}from"zod";function vH($,Z="invalid_request_error",X=null,Q=null){return{error:{message:$,type:Z,param:X,code:Q}}}function QO6($){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 YO6($,Z,X){try{return JSON.parse($)}catch{throw new Am$(`Invalid JSON in tool call arguments for function '${X}' (tool_call_id: ${Z}): ${$}`)}}function GO6($){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:YO6(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 JO6($){let Z=$.map((X)=>{let Q=X.function.parameters?sY(X.function.parameters):sY({type:"object",properties:{}});return[X.function.name,u$({description:X.function.description,inputSchema:Q})]});return Object.fromEntries(Z)}function WO6($){if(!$)return;return{openai:{response_format:$}}}function KO6(){return`chatcmpl-${crypto.randomUUID().replace(/-/g,"").substring(0,29)}`}function zm$($,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 Pm$($){if($==="tool-calls")return"tool_calls";if($==="length")return"length";return"stop"}var tB6=256,oB6,rB6,sB6,aB6,eB6,$O6,ZO6,XO6,Am$,Tm$,Rm$;var Im$=D(()=>{c4();Q8();Ql();vN();oB6=k1.object({type:k1.literal("function"),function:k1.object({name:k1.string(),description:k1.string().optional(),parameters:k1.record(k1.string(),k1.unknown()).optional()})}),rB6=k1.object({id:k1.string(),type:k1.literal("function"),function:k1.object({name:k1.string(),arguments:k1.string()})}),sB6=k1.discriminatedUnion("role",[k1.object({role:k1.literal("system"),content:k1.string(),name:k1.string().optional()}),k1.object({role:k1.literal("user"),content:k1.union([k1.string(),k1.array(k1.union([k1.object({type:k1.literal("text"),text:k1.string()}),k1.object({type:k1.literal("image_url"),image_url:k1.object({url:k1.string(),detail:k1.string().optional()})})]))]),name:k1.string().optional()}),k1.object({role:k1.literal("assistant"),content:k1.string().nullable().optional(),name:k1.string().optional(),tool_calls:k1.array(rB6).optional()}),k1.object({role:k1.literal("tool"),content:k1.string(),tool_call_id:k1.string()})]),aB6=k1.object({type:k1.literal("text")}),eB6=k1.object({type:k1.literal("json_object")}),$O6=k1.object({type:k1.literal("json_schema"),json_schema:k1.object({name:k1.string(),description:k1.string().optional(),schema:k1.record(k1.string(),k1.unknown()),strict:k1.boolean().optional()})}),ZO6=k1.union([aB6,eB6,$O6]),XO6=k1.object({model:k1.string().describe("Format: 'model_id' or 'credential_id:model_id'"),messages:k1.array(sB6),stream:k1.boolean().optional().default(!1),temperature:k1.number().min(0).max(2).optional(),max_tokens:k1.number().positive().optional(),top_p:k1.number().min(0).max(1).optional(),frequency_penalty:k1.number().min(-2).max(2).optional(),presence_penalty:k1.number().min(-2).max(2).optional(),stop:k1.union([k1.string(),k1.array(k1.string())]).optional(),tools:k1.array(oB6).optional(),tool_choice:k1.union([k1.literal("auto"),k1.literal("none"),k1.literal("required"),k1.object({type:k1.literal("function"),function:k1.object({name:k1.string()})})]).optional(),response_format:ZO6.optional(),user:k1.string().optional()});Am$=class Am$ extends Error{constructor($){super($);this.name="MessageConversionError"}};Tm$=new K1;Tm$.post("/:org/v1/chat/completions",async($)=>{let Z=$.get("studioContext"),X=$.req.param("org");try{if(!Z.auth.apiKey?.id)return $.json(vH("API key authentication required. Provide a valid API key via Authorization header.","authentication_error"),401);if(!Z.organization)return $.json(vH("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(vH("Organization mismatch. The API key's organization does not match the requested organization.","invalid_request_error","organization"),403);let Q=await $.req.json(),Y=XO6.safeParse(Q);if(!Y.success){let w=Y.error.issues[0]??{message:"Invalid request",path:[]};return $.json(vH(`Invalid request: ${w.message}`,"invalid_request_error",w.path.length>0?w.path.join("."):null),400)}let G=Y.data,J=QO6(G.model);if(!J)return $.json(vH("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)=>jw(j.providerId));if(!E)return $.json(vH("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(vH(`AI provider credential not found or inaccessible: ${W}`,"invalid_request_error","model"),404)}let F=H.aiSdk.languageModel(K),N=GO6(G.messages),U=G.tools?JO6(G.tools):void 0,B=WO6(G.response_format),O=KO6(),L=Math.floor(Date.now()/1000);if(G.stream)return $U($,async(w)=>{let E=zm$(F,N,U,G,B,$.req.raw.signal);try{let j=bO(E),z=!1,A=0,P="",I=async()=>{if(P.length===0)return;let k=P;P="",await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{content:k},finish_reason:null}]})})};for await(let k of j.fullStream){if(!z&&(k.type==="text-delta"||k.type==="tool-call"))await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{role:"assistant",content:""},finish_reason:null}]})}),z=!0;if(k.type==="text-delta"){if(P+=k.text,P.length>=tB6)await I()}else if(k.type==="tool-call"){await I();let M=A++;await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{tool_calls:[{index:M,id:k.toolCallId,type:"function",function:{name:k.toolName,arguments:JSON.stringify(k.input)}}]},finish_reason:null}]})})}else if(k.type==="finish")await I(),await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{},finish_reason:Pm$(k.finishReason)}],usage:k.totalUsage?{prompt_tokens:k.totalUsage.inputTokens??0,completion_tokens:k.totalUsage.outputTokens??0,total_tokens:k.totalUsage.totalTokens??0}:void 0})})}await I(),await w.writeSSE({data:"[DONE]"})}catch(j){let z=j;console.error("[openai-compat:stream] Error:",z.message),await w.writeSSE({data:JSON.stringify({error:{message:z.message,type:"server_error"}})})}});else{let w=zm$(F,N,U,G,B,$.req.raw.signal),E=await vO(w),j={role:"assistant",content:E.text||null};if(E.toolCalls&&E.toolCalls.length>0)j.tool_calls=E.toolCalls.map((z)=>({id:z.toolCallId,type:"function",function:{name:z.toolName,arguments:JSON.stringify("input"in z?z.input:{})}})),j.content=null;return $.json({id:O,object:"chat.completion",created:L,model:G.model,choices:[{index:0,message:j,finish_reason:Pm$(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(vH("Request aborted","invalid_request_error"),400);if(Y.name==="MessageConversionError")return $.json(vH(Y.message,"invalid_request_error","messages"),400);return console.error("[openai-compat] Error:",Y.message,Y.stack),$.json(vH(Y.message,"server_error"),500)}});Rm$=Tm$});function HO6($){if(typeof $!=="object"||$===null)return!1;let X=$.githubRepo?.url;return typeof X==="string"&&X.length>0}function qm$(){let $=new K1;return $.use("*",async(Z,X)=>{await X(),Z.header("Cache-Control","private, no-store"),Z.header("Vary","Cookie")}),$.get("/",async(Z)=>{let X=Z.get("studioContext"),Q=o0(X);if(!Q)return Z.json({error:"Authentication required"},401);let G=(Z.req.query("site")??"").trim().toLowerCase();if(!XJ(G))return Z.json({error:"Invalid site slug"},400);let J=await X.db.selectFrom("member").innerJoin("organization","organization.id","member.organizationId").select(["organization.id as id","organization.slug as slug","organization.name as name","organization.metadata as metadata"]).where("member.userId","=",Q).execute(),W=[];for(let H of J){if(!H.slug||hZ(H))continue;let F=await X.storage.virtualMcps.list(H.id);for(let N of F){if(pe1(N)!==G)continue;if(!HO6(N.metadata))continue;W.push({orgSlug:H.slug,orgName:H.name??H.slug,project:{id:N.id,title:N.title,icon:N.icon??null}})}}let K={matches:W};return Z.json(K)}),$}var Mm$=D(()=>{Q8();DO()});var Vm$;var km$=D(()=>{Vm$={name:"decocms",version:"4.315.8",description:"Deco CMS \u2014 Self-hostable MCP Gateway for managing AI connections and tools",author:"Deco team",repository:{type:"git",url:"git+https://github.com/decocms/studio.git",directory:"apps/api"},bugs:{url:"https://github.com/decocms/studio/issues"},type:"module",bin:{deco:"./dist/server/cli.js"},files:["dist/**/*"],scripts:{dev:"bun run migrate && bun run dev:server","dev:server":"bun run --cwd=../../packages/sandbox build && NODE_ENV=development bun --env-file=.env --hot run src/index.ts",build:"bun run build:server","build:server":"bun run scripts/bundle-server-script.ts --dist ./dist/server","generate:tool-contracts":"bun run scripts/generate-tool-contracts.ts","db:migrate":"bun run ./dist/server/migrate.js","db:migrate:dbos":"bun run ./dist/server/migrate-dbos.js",check:"tsc --noEmit",start:"bun run ./dist/server/server.js",migrate:"bun run src/database/migrate.ts","migrate:dbos":"bun run src/database/migrate-dbos.ts",test:"bun test src","better-auth:migrate":"bunx --bun @better-auth/cli migrate -y --config src/auth/index.ts",prepublishOnly:"bun run --cwd=../.. build:studio"},optionalDependencies:{"@duckdb/node-api":"^1.5.0-r.1"},dependencies:{"@ai-sdk/anthropic":"^3.0.85","@ai-sdk/google":"^3.0.83","@ai-sdk/openai":"^3.0.73","@anthropic-ai/sdk":"^0.105.0","@aws-sdk/client-s3":"^3.1013.0","@aws-sdk/client-sts":"^3.1013.0","@aws-sdk/lib-storage":"^3.1013.0","@aws-sdk/s3-request-presigner":"^3.1013.0","@clickhouse/client":"^1.8.1","@dbos-inc/dbos-sdk":"^4.21.6","@inkjs/ui":"^2.0.0","@nats-io/jetstream":"3.4.0","@nats-io/kv":"3.4.0","@nats-io/nats-core":"3.4.0","@nats-io/transport-node":"3.4.0","@openrouter/ai-sdk-provider":"^2.9.1","@opentelemetry/core":"^2.6.0","embedded-postgres":"^18.3.0-beta.16",ink:"^6.8.0",kysely:"^0.28.12","posthog-node":"^5.0.0",react:"^19.2.6","react-dom":"^19.2.6"},devDependencies:{"@ai-sdk/provider":"^3.0.10","@better-auth/sso":"1.4.1","@decocms/better-auth":"1.5.17","@decocms/bindings":"workspace:*","@decocms/mcp-utils":"workspace:*","@decocms/runtime":"workspace:*","@decocms/sandbox":"workspace:*","@decocms/shared":"workspace:*","@jitl/quickjs-wasmfile-release-sync":"0.31.0","@modelcontextprotocol/sdk":"1.29.0","@opentelemetry/api":"^1.9.0","@opentelemetry/api-logs":"^0.211.0","@opentelemetry/exporter-logs-otlp-proto":"^0.211.0","@opentelemetry/exporter-prometheus":"^0.208.0","@opentelemetry/exporter-trace-otlp-proto":"^0.207.0","@opentelemetry/instrumentation-runtime-node":"^0.24.0","@opentelemetry/resources":"^2.6.0","@opentelemetry/sdk-logs":"^0.211.0","@opentelemetry/sdk-metrics":"^2.2.0","@opentelemetry/sdk-node":"^0.207.0","@opentelemetry/sdk-trace-base":"^2.5.0","@types/bun":"^1.3.1","@types/google.maps":"^3.65.2","@types/pg":"^8.15.6","@types/react-syntax-highlighter":"^15.5.13","@vercel/nft":"^1.1.1",ai:"^6.0.208","better-auth":"1.4.22",croner:"^9.1.0",degit:"^2.8.4",hono:"^4.10.7",jose:"^6.0.11",nanoid:"^5.1.6",pg:"^8.16.3",typescript:"^7.0.2",typescript5:"npm:typescript@^5.9.3",zod:"4.3.6"},homepage:"https://github.com/decocms/studio",keywords:["mcp","model-context-protocol","ai","gateway","self-hosted","tools"],license:"MIT",publishConfig:{access:"public"}}});function UO6(){let $=process.env.POSTHOG_KEY;if(!$)return null;return{key:$,host:process.env.POSTHOG_HOST??NO6}}var Sm$,NO6="https://ph.studio.decocms.com",Cm$;var _m$=D(()=>{Q8();J90();aC();Q9();E$();c91();km$();Sm$=new K1;Sm$.get("/",($)=>{let Z={version:Vm$.version,theme:Kp1(),..._F().logo&&{logo:_F().logo},...zN()&&{internalUrl:g_1()},...C0().enableDecoImport&&{enableDecoImport:!0},brandExtractEnabled:!!C0().firecrawlApiKey,hostingEnabled:!!C0().controlplaneRestUrl&&!!C0().controlplaneServiceToken,hostingControlPlaneGa:C0().hostingControlPlaneGa,monitorEnabled:!!C0().clickhouseAnalyticsUrl&&!!C0().clickhouseAnalyticsPassword,monitorGa:C0().monitorGa,auth:Rg$(),posthog:UO6(),googleMapsApiKey:process.env.GOOGLE_MAPS_API_KEY?.trim()||null,runtime:{agentSandbox:da()}};return $.header("Cache-Control","no-store"),$.json({success:!0,config:Z})});Cm$=Sm$});function Nl($){let Z=($??"").trim().toLowerCase();return Z=Z.replace(/^https?:\/\//,""),Z=Z.replace(/^www\./,""),Z=Z.split(/[/?#]/)[0]??"",Z.replace(/\/+$/,"")}function FX1($){return(Nl($).split(".")[0]||$).replace(/[-_]/g," ").split(" ").filter(Boolean).map((X)=>X.charAt(0).toUpperCase()+X.slice(1)).join(" ")}function fm$($,Z=64){return`https://www.google.com/s2/favicons?domain=${encodeURIComponent(Nl($))}&sz=${Z}`}function vm$($,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 bm$($){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()?vm$(`${Y.trim().replace(/\s+/g," ")} \u2014 ${J}`,200):vm$(`How does ${X} really perform? ${J}`,200);return{title:G,description:W}}import{z as c0}from"zod";var Cv,BO6,OO6,DO6,LO6,xm$;var ym$=D(()=>{Cv=c0.enum(["good","bad","neutral"]),BO6=c0.preprocess(($)=>{if(Array.isArray($))return{kind:"text",value:$.find((X)=>X!==null&&typeof X!=="object")??""};return $!==null&&typeof $==="object"?$:{kind:"text",value:$}},c0.object({kind:c0.enum(["text","number","sparkline","badge","score"]).catch("text"),value:c0.coerce.string().optional(),tone:Cv.optional(),muted:c0.boolean().optional(),delta:c0.coerce.string().optional(),deltaDir:c0.enum(["up","down","neutral"]).optional(),points:c0.array(c0.coerce.number()).optional(),label:c0.coerce.string().optional()}).transform(($)=>{if($.kind==="badge"&&$.label==null)$.label=$.value??"";if($.kind==="score"){let Z=Number($.value);if(Number.isNaN(Z))return{...$,kind:"text"}}return $})),OO6=c0.preprocess(($)=>{let Z=$;if(Z&&typeof Z==="object"&&!Array.isArray(Z)&&Array.isArray(Z.cells))Z=Z.cells;if(Array.isArray(Z)&&Z.length===1&&Array.isArray(Z[0]))Z=Z[0];if(Array.isArray(Z))return Z;if(Z&&typeof Z==="object")return Object.values(Z);return Z},c0.array(BO6)),DO6={key:c0.coerce.string(),title:c0.coerce.string(),eyebrow:c0.coerce.string().optional(),headline:c0.coerce.string(),annotation:c0.coerce.string().optional(),methodology:c0.coerce.string().optional(),sources:c0.array(c0.object({name:c0.coerce.string(),logoUrl:c0.coerce.string()})).optional()},LO6=c0.discriminatedUnion("template",[c0.object({template:c0.literal("cover"),score:c0.object({value:c0.coerce.number(),max:c0.coerce.number().optional(),grade:c0.coerce.string().optional(),label:c0.coerce.string().optional()}).optional(),brandImage:c0.coerce.string().optional(),screenshot:c0.coerce.string().optional(),mobileScreenshot:c0.coerce.string().optional()}),c0.object({template:c0.literal("cta"),ctaUrl:c0.coerce.string().optional(),ctaLabel:c0.coerce.string().optional(),bullets:c0.array(c0.coerce.string()).optional()}),c0.object({template:c0.literal("series"),points:c0.array(c0.coerce.number()).min(2),xLabels:c0.array(c0.coerce.string()).min(1),unit:c0.coerce.string().optional(),callout:c0.object({index:c0.coerce.number(),value:c0.coerce.string(),tone:Cv.optional()})}),c0.object({template:c0.literal("threshold"),value:c0.coerce.string().default(""),metricLabel:c0.coerce.string().optional(),ratio:c0.coerce.number(),thresholdRatio:c0.coerce.number().optional(),thresholdLabel:c0.coerce.string().default(""),tone:Cv.optional()}),c0.object({template:c0.literal("stats"),stats:c0.array(c0.object({value:c0.coerce.string(),label:c0.coerce.string(),tone:Cv.optional()})).min(1)}),c0.object({template:c0.literal("bars"),items:c0.array(c0.object({value:c0.coerce.string(),label:c0.coerce.string(),ratio:c0.coerce.number(),tone:Cv.optional()})).min(1)}),c0.object({template:c0.literal("gauges"),gauges:c0.array(c0.object({label:c0.coerce.string(),value:c0.coerce.string(),status:c0.enum(["good","warn","bad"]).catch("warn"),caption:c0.coerce.string().optional(),ratio:c0.coerce.number().optional()})).min(1)}),c0.object({template:c0.literal("checklist"),checks:c0.array(c0.object({label:c0.coerce.string(),status:c0.enum(["pass","fail","warn"]).catch("fail"),value:c0.coerce.string().optional()})).min(1)}),c0.object({template:c0.literal("table"),columns:c0.array(c0.object({label:c0.coerce.string(),align:c0.enum(["left","right"]).optional()})).min(1),rows:c0.array(OO6).min(1),highlightRow:c0.coerce.number().optional()}),c0.object({template:c0.literal("products"),products:c0.array(c0.object({name:c0.coerce.string(),price:c0.coerce.string().optional(),image:c0.coerce.string().optional(),url:c0.coerce.string().optional()})).min(1)}),c0.object({template:c0.literal("list"),entries:c0.array(c0.object({label:c0.coerce.string(),severity:c0.enum(["error","warning","notice"]).catch("notice")})).min(1),moreCount:c0.coerce.number().optional()}),c0.object({template:c0.literal("keywords"),volumeLabel:c0.coerce.string().optional(),keywords:c0.array(c0.object({term:c0.coerce.string(),volume:c0.coerce.string(),position:c0.coerce.number().catch(0)})).min(1)}),c0.object({template:c0.literal("competitor"),metricLabel:c0.coerce.string().optional(),competitors:c0.array(c0.object({name:c0.coerce.string(),value:c0.coerce.string(),tone:Cv.optional(),isYou:c0.boolean().optional()})).min(1)}),c0.object({template:c0.literal("scorecard"),rivalLabel:c0.coerce.string().optional(),dimensions:c0.array(c0.object({label:c0.coerce.string(),you:c0.coerce.string(),rival:c0.coerce.string().optional(),rivalName:c0.coerce.string().optional(),tone:Cv.optional()})).min(1)})]),xm$=c0.object({...DO6,template:LO6})});function cT0($){let Z=[],X=[...$.sections].sort((Y,G)=>Y.position-G.position).map((Y)=>{let G=xm$.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 NX1=D(()=>{ym$()});import{join as gm$}from"path";async function EO6($){try{let Z=await fetch(`${LK({})}/api/v2/public/diagnostics/${encodeURIComponent($)}`,{headers:{Accept:"application/json"},signal:AbortSignal.timeout(wO6)});if(!Z.ok)return null;let X=await Z.json(),{deck:Q}=cT0(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()||FX1($),score:Q.meta.scores?.cover??J?.score?.value,verdict:Y?.annotation?.trim()||Y?.headline?.trim()||void 0}}catch{return null}}function PG($){return $.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function jO6($,Z){let X=Nl($),Q=Z?.brand?.trim()||FX1(X),Y=fm$(X,128),J=`${(C0().baseUrl??"https://studio.decocms.com").replace(/\/+$/,"")}/report/${encodeURIComponent(X)}`,{title:W,description:K}=bm$({brand:Q,domain:X,score:Z?.score,verdict:Z?.verdict}),H=`${J}/og.png`,F=`${Q} commerce report by decocms`;return[`<title>${PG(W)}</title>`,`<meta name="description" content="${PG(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="${PG(W)}" />`,`<meta property="og:description" content="${PG(K)}" />`,`<meta property="og:url" content="${PG(J)}" />`,`<meta property="og:image" content="${PG(H)}" />`,'<meta property="og:image:width" content="1200" />','<meta property="og:image:height" content="630" />',`<meta property="og:image:alt" content="${PG(F)}" />`,'<meta name="twitter:card" content="summary_large_image" />',`<meta name="twitter:title" content="${PG(W)}" />`,`<meta name="twitter:description" content="${PG(K)}" />`,`<meta name="twitter:image" content="${PG(H)}" />`,`<meta name="twitter:image:alt" content="${PG(F)}" />`,`<link rel="canonical" href="${PG(J)}" />`,`<link rel="icon" href="${PG(Y)}" sizes="any" />`].join(`
2982
+ `,j=await Z.createBlob(E);await ld$(Z.owner,Z.repo,j,E);let z=w[0]??`${fT0(Q)}/${s71(O)}.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 w.slice(1))H.push({path:P,mode:"100644",type:"blob",sha:null}),F.delete(P)}for(let O of $.del)for(let L of QX1(K,O))H.push({path:L,mode:"100644",type:"blob",sha:null}),F.delete(L);if(H.length===0)return G;let N=Q?`${Q}/.deco/blocks.gen.json`:".deco/blocks.gen.json";if(W.some((O)=>O.type==="blob"&&O.path===N)){let O=await Promise.all([...F.values()].map(async(j)=>({stem:j.stem,content:j.content??await Z.getBlobText(j.sha)}))),{decofile:L,skipped:w}=ka(O);if(w.length>0)console.warn("decofile gen: dropped blocks that were not valid JSON",{repo:`${Z.owner}/${Z.repo}`,branch:X,packagePath:Q,blocks:w.map((j)=>j.key)});let E=await Z.createBlob(L);H.push({path:N,mode:"100644",type:"blob",sha:E})}let U=await Z.createTree(J,H),B=await Z.createCommit({message:yB6($),treeSha:U,parentShas:[G]});try{return await Z.updateRef(X,B),B}catch(O){if(!(O instanceof h4&&O.status===422)||Y>=fB6-1)throw O;await w$(G7(2000,200,Y,2,0.5))}}}function yB6($){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 Mi0(Q,$.deps.coAuthor)}var fB6=3,KX1;var Ym$=D(()=>{JD0();MT0();W4();QL();bT0();KX1=new Map});import{createHmac as Gm$,randomBytes as gB6,timingSafeEqual as hB6}from"crypto";function Jm$(){if(lT0)return lT0;let $;try{let Z=C0();$=Z.studioJwtSecret??Z.betterAuthSecret}catch{$=void 0}return lT0=$?Buffer.from($):gB6(32),lT0}function HX1($){let Z=$.nowMs??Date.now(),X={o:$.organizationId,m:$.virtualMcpId,b:$.branch,e:Math.floor((Z+uB6)/1000)},Q=Buffer.from(JSON.stringify(X)).toString("base64url"),Y=Gm$("sha256",Jm$()).update(Q).digest("base64url");return`${Q}.${Y}`}function Wm$($,Z){let X=$.indexOf(".");if(X<0)return!1;let Q=$.slice(0,X),Y=Buffer.from($.slice(X+1)),G=Buffer.from(Gm$("sha256",Jm$()).update(Q).digest("base64url"));if(Y.length!==G.length||!hB6(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 uB6=21600000,lT0=null;var Km$=D(()=>{E$()});import{z as Fl}from"zod";function cB6($){return $.length>0&&$.length<=255&&!$.includes("..")&&!$.endsWith("/")&&!$.endsWith(".lock")&&lB6.test($)}function Bm$($){return $.req.header("x-forwarded-host")??new URL($.req.url).host}async function fa($){let Z=$.get("decofileScope");return IT0($.var.studioContext,Z.organizationId,Z.githubRepo)}function ba($,Z){if(Z instanceof h4){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 Om$(){let $=new K1;return $.use("/:virtualMcpId/:branch",Um$),$.use("/:virtualMcpId/:branch/*",Um$),$.get("/:virtualMcpId/:branch",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await fa(Z),Y=await cd$(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=HX1({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.body(`{"version":${JSON.stringify(Y.sha)},"token":${JSON.stringify(J)},"apiHost":${JSON.stringify(Bm$(Z))},"decofile":${Y.decofile}}`,200,{...G,"content-type":"application/json"})}catch(Q){return ba(Z,Q)}}),$.get("/:virtualMcpId/:branch/meta",async(Z)=>{let X=Z.get("decofileScope"),Q=X.packagePath?`${X.packagePath}/.deco/meta.gen.json`:".deco/meta.gen.json";try{let Y=await fa(Z),G=await Y.getFileTextAtRef(X.branch,Q);if(G===null){let J=await Y.getDefaultBranch();if(J!==X.branch)G=await Y.getFileTextAtRef(J,Q)}if(G===null)return Z.json({error:"meta.gen.json not committed"},404);return Z.body(G,200,{"content-type":"application/json","Cache-Control":"no-store","Access-Control-Allow-Origin":"*"})}catch(Y){return ba(Z,Y)}}),$.patch("/:virtualMcpId/:branch",mB6,async(Z)=>{let X=Z.get("decofileScope"),Q=Z.var.studioContext,Y=iB6.safeParse(await Z.req.json().catch(()=>null));if(!Y.success)return Z.json({error:"Invalid body",details:Y.error.issues},400);let G=Y.data;for(let J of[...Object.keys(G.set??{}),...G.delete??[]])try{qT0(J)}catch(W){let K=W instanceof Error?W.message:String(W);return Z.json({error:K},400)}for(let[J,W]of Object.entries(G.set??{})){if(typeof W!=="object"||W===null||Array.isArray(W))return Z.json({error:`Block "${J}" must be a JSON object`},400);if(r71(J))return Z.json({error:`Block key "${J}" collides with a framework resolver module and cannot be written`},400)}try{let J=await fa(Z),W=await Qm$(`${X.organizationId}/${X.virtualMcpId}/${X.branch}`,{client:J,branch:X.branch,packagePath:X.packagePath,coAuthor:Yl(Q)},G),K=HX1({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.json({version:W,token:K,apiHost:Bm$(Z)})}catch(J){return ba(Z,J)}}),$.post("/:virtualMcpId/:branch/publish",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await fa(Z),Y=await Q.getDefaultBranch();if(Y===X.branch)return Z.json({error:"Branch is already the default branch"},400);let G=`chore(decofile): publish ${X.branch}`;try{let J;try{J=await Q.mergeBranch(Y,X.branch,G)}catch(W){if(!(W instanceof h4&&W.status===409))throw W;await gT0(Q,X.branch,Y),J=await Q.mergeBranch(Y,X.branch,G)}return J?Z.json({result:"merged",sha:J}):Z.json({result:"up-to-date"})}catch(J){if(J instanceof h4&&J.status===409)return Z.json({error:"merge-conflict"},409);if(J instanceof h4&&J.status===405){let K=await Q.findOpenPullRequest(Y,X.branch)??await Q.createPullRequest({base:Y,head:X.branch,title:`Publish ${X.branch}`});return Z.json({result:"pull-request",number:K.number,url:K.html_url})}throw J}}catch(Q){return ba(Z,Q)}}),$.get("/:virtualMcpId/:branch/status",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await fa(Z),Y=await Q.getDefaultBranch();if(Y===X.branch)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0,lastCommitAt:null});try{let[{aheadBy:G,behindBy:J},W]=await Promise.all([Q.compare(Y,X.branch),Q.getBranchHead(X.branch)]);return Z.json({baseBranch:Y,aheadBy:G,behindBy:J,lastCommitAt:W.committedAt})}catch(G){if(G instanceof h4&&G.status===404)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0,lastCommitAt:null});throw G}}catch(Q){return ba(Z,Q)}}),$}var lB6,Hm$=500,Fm$=1048576,Nm$=1024,dB6=8388608,mB6,iB6,Um$;var Dm$=D(()=>{Ft0();MT0();Q8();MH();h71();RT0();JX1();o71();Ym$();Km$();GX1();QL();bT0();lB6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;mB6=o5({maxSize:dB6,onError:($)=>$.json({error:"Payload too large"},413)}),iB6=Fl.object({set:Fl.record(Fl.string(),Fl.unknown()).optional(),delete:Fl.array(Fl.string()).optional()}).refine(($)=>Object.keys($.set??{}).length>0||($.delete?.length??0)>0,{message:"Patch must set or delete at least one block"}).refine(($)=>Object.keys($.set??{}).length+($.delete?.length??0)<=Hm$,{message:`Patch cannot touch more than ${Hm$} blocks`}).refine(($)=>Object.values($.set??{}).every((Z)=>JSON.stringify(Z).length<=Fm$),{message:`Each block must be at most ${Fm$} bytes`}).refine(($)=>[...Object.keys($.set??{}),...$.delete??[]].every((Z)=>Z.length<=Nm$),{message:`Each block key must be at most ${Nm$} characters`}),Um$=TT0(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(!cB6(G))return $.json({error:`Invalid branch name: ${G}`},400);let J=X.auth?.user?.id??null;if(!J){let B=$.req.query("token");if(!($.req.method==="GET"&&!$.req.path.match(/\/(publish|status)$/)))return $.json({error:"Unauthorized"},401);if(!B||!Wm$(B,{organizationId:Q.id,virtualMcpId:Y,branch:G}))return $.json({error:"Unauthorized"},401)}let W=await X.storage.virtualMcps.findById(Y);if(!W||W.organization_id!==Q.id)return $.json({error:"Virtual MCP not found"},404);let K=W.metadata??null;if(!ND0(K))return $.json({error:"Project has no preview server configured"},404);let F=W.connections?.map((B)=>B.connection_id)??[],N=_a(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 Lm$=($)=>{let Z=new K1;if(Z.use("*",Ev),Z.route("/",gA0()),Z.route("/",_h$()),Z.route("/",gc$()),Z.route("/",bc$()),Z.route("/",zT0()),Z.route("/tools",ic$()),Z.route("/",cc$()),Z.route("/",Oc$({kvStorage:$.kvStorage})),Z.route("/",Uc$()),Z.route("/fs",kc$({getConnection:$.getNatsConnection})),Z.route("/sandbox",Zm$()),Z.route("/decofile",Om$()),Z.route("/",_c$()),Z.route("/deco-sites",uA0()),Z.route("/hosting",Ph$()),Z.route("/monitor",kh$()),Z.route("/sso",_A0()),Z.route("/",PT0({tokenStorage:$.tokenStorage,automationEventDispatcher:$.automationEventDispatcher})),Z.route("/webhooks",Oh$()),$.mountDevAssets)Z.route("/dev-assets",dA0({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("/",bx$()),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",Sc$()),Z.route("/mcp",cw0()),Z.route("/mcp/self",jT0()),Z.route("/mcp",iw0()),Z.all("/oauth-proxy/:connectionId/*",$.oauthProxyHandler),Z.get("/watch",$.watchHandler),Z};var wm$=D(()=>{Q8();GZ1();Dh$();HZ1();Ah$();Vh$();mA0();$a();QZ1();Bc$();Dc$();Vc$();Wo();s91();pw0();_71();Cc$();vc$();xc$();hc$();dc$();f71();pc$();b71();dw0();Xm$();Dm$()});function pB6($){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 nB6=async($,Z)=>{if(!$.get("studioContext").auth.user?.id)return $.json({error:"Unauthorized"},401);return Z()},Em$=()=>{let $=new K1;return $.use("*",nB6),$.get("/",async(Z)=>{let X=C0(),Q=X.decoSupabaseUrl,Y=X.decoSupabaseServiceKey;if(!Q||!Y)return Z.json({apps:[]});try{let G=await Z7(Q,Y,"apps?select=name,title,description,logo,category,vendors(alias,url)");return Z.json({apps:pB6(G)})}catch(G){return console.error("[deco-apps] GET error:",G),Z.json({error:"Failed to fetch apps"},502)}}),$};var jm$=D(()=>{Q8();E$();xP0()});import{z as k1}from"zod";function vH($,Z="invalid_request_error",X=null,Q=null){return{error:{message:$,type:Z,param:X,code:Q}}}function QO6($){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 YO6($,Z,X){try{return JSON.parse($)}catch{throw new Am$(`Invalid JSON in tool call arguments for function '${X}' (tool_call_id: ${Z}): ${$}`)}}function GO6($){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:YO6(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 JO6($){let Z=$.map((X)=>{let Q=X.function.parameters?sY(X.function.parameters):sY({type:"object",properties:{}});return[X.function.name,u$({description:X.function.description,inputSchema:Q})]});return Object.fromEntries(Z)}function WO6($){if(!$)return;return{openai:{response_format:$}}}function KO6(){return`chatcmpl-${crypto.randomUUID().replace(/-/g,"").substring(0,29)}`}function zm$($,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 Pm$($){if($==="tool-calls")return"tool_calls";if($==="length")return"length";return"stop"}var tB6=256,oB6,rB6,sB6,aB6,eB6,$O6,ZO6,XO6,Am$,Tm$,Rm$;var Im$=D(()=>{c4();Q8();Ql();vN();oB6=k1.object({type:k1.literal("function"),function:k1.object({name:k1.string(),description:k1.string().optional(),parameters:k1.record(k1.string(),k1.unknown()).optional()})}),rB6=k1.object({id:k1.string(),type:k1.literal("function"),function:k1.object({name:k1.string(),arguments:k1.string()})}),sB6=k1.discriminatedUnion("role",[k1.object({role:k1.literal("system"),content:k1.string(),name:k1.string().optional()}),k1.object({role:k1.literal("user"),content:k1.union([k1.string(),k1.array(k1.union([k1.object({type:k1.literal("text"),text:k1.string()}),k1.object({type:k1.literal("image_url"),image_url:k1.object({url:k1.string(),detail:k1.string().optional()})})]))]),name:k1.string().optional()}),k1.object({role:k1.literal("assistant"),content:k1.string().nullable().optional(),name:k1.string().optional(),tool_calls:k1.array(rB6).optional()}),k1.object({role:k1.literal("tool"),content:k1.string(),tool_call_id:k1.string()})]),aB6=k1.object({type:k1.literal("text")}),eB6=k1.object({type:k1.literal("json_object")}),$O6=k1.object({type:k1.literal("json_schema"),json_schema:k1.object({name:k1.string(),description:k1.string().optional(),schema:k1.record(k1.string(),k1.unknown()),strict:k1.boolean().optional()})}),ZO6=k1.union([aB6,eB6,$O6]),XO6=k1.object({model:k1.string().describe("Format: 'model_id' or 'credential_id:model_id'"),messages:k1.array(sB6),stream:k1.boolean().optional().default(!1),temperature:k1.number().min(0).max(2).optional(),max_tokens:k1.number().positive().optional(),top_p:k1.number().min(0).max(1).optional(),frequency_penalty:k1.number().min(-2).max(2).optional(),presence_penalty:k1.number().min(-2).max(2).optional(),stop:k1.union([k1.string(),k1.array(k1.string())]).optional(),tools:k1.array(oB6).optional(),tool_choice:k1.union([k1.literal("auto"),k1.literal("none"),k1.literal("required"),k1.object({type:k1.literal("function"),function:k1.object({name:k1.string()})})]).optional(),response_format:ZO6.optional(),user:k1.string().optional()});Am$=class Am$ extends Error{constructor($){super($);this.name="MessageConversionError"}};Tm$=new K1;Tm$.post("/:org/v1/chat/completions",async($)=>{let Z=$.get("studioContext"),X=$.req.param("org");try{if(!Z.auth.apiKey?.id)return $.json(vH("API key authentication required. Provide a valid API key via Authorization header.","authentication_error"),401);if(!Z.organization)return $.json(vH("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(vH("Organization mismatch. The API key's organization does not match the requested organization.","invalid_request_error","organization"),403);let Q=await $.req.json(),Y=XO6.safeParse(Q);if(!Y.success){let w=Y.error.issues[0]??{message:"Invalid request",path:[]};return $.json(vH(`Invalid request: ${w.message}`,"invalid_request_error",w.path.length>0?w.path.join("."):null),400)}let G=Y.data,J=QO6(G.model);if(!J)return $.json(vH("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)=>jw(j.providerId));if(!E)return $.json(vH("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(vH(`AI provider credential not found or inaccessible: ${W}`,"invalid_request_error","model"),404)}let F=H.aiSdk.languageModel(K),N=GO6(G.messages),U=G.tools?JO6(G.tools):void 0,B=WO6(G.response_format),O=KO6(),L=Math.floor(Date.now()/1000);if(G.stream)return $U($,async(w)=>{let E=zm$(F,N,U,G,B,$.req.raw.signal);try{let j=bO(E),z=!1,A=0,P="",I=async()=>{if(P.length===0)return;let k=P;P="",await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{content:k},finish_reason:null}]})})};for await(let k of j.fullStream){if(!z&&(k.type==="text-delta"||k.type==="tool-call"))await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{role:"assistant",content:""},finish_reason:null}]})}),z=!0;if(k.type==="text-delta"){if(P+=k.text,P.length>=tB6)await I()}else if(k.type==="tool-call"){await I();let M=A++;await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{tool_calls:[{index:M,id:k.toolCallId,type:"function",function:{name:k.toolName,arguments:JSON.stringify(k.input)}}]},finish_reason:null}]})})}else if(k.type==="finish")await I(),await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{},finish_reason:Pm$(k.finishReason)}],usage:k.totalUsage?{prompt_tokens:k.totalUsage.inputTokens??0,completion_tokens:k.totalUsage.outputTokens??0,total_tokens:k.totalUsage.totalTokens??0}:void 0})})}await I(),await w.writeSSE({data:"[DONE]"})}catch(j){let z=j;console.error("[openai-compat:stream] Error:",z.message),await w.writeSSE({data:JSON.stringify({error:{message:z.message,type:"server_error"}})})}});else{let w=zm$(F,N,U,G,B,$.req.raw.signal),E=await vO(w),j={role:"assistant",content:E.text||null};if(E.toolCalls&&E.toolCalls.length>0)j.tool_calls=E.toolCalls.map((z)=>({id:z.toolCallId,type:"function",function:{name:z.toolName,arguments:JSON.stringify("input"in z?z.input:{})}})),j.content=null;return $.json({id:O,object:"chat.completion",created:L,model:G.model,choices:[{index:0,message:j,finish_reason:Pm$(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(vH("Request aborted","invalid_request_error"),400);if(Y.name==="MessageConversionError")return $.json(vH(Y.message,"invalid_request_error","messages"),400);return console.error("[openai-compat] Error:",Y.message,Y.stack),$.json(vH(Y.message,"server_error"),500)}});Rm$=Tm$});function HO6($){if(typeof $!=="object"||$===null)return!1;let X=$.githubRepo?.url;return typeof X==="string"&&X.length>0}function qm$(){let $=new K1;return $.use("*",async(Z,X)=>{await X(),Z.header("Cache-Control","private, no-store"),Z.header("Vary","Cookie")}),$.get("/",async(Z)=>{let X=Z.get("studioContext"),Q=o0(X);if(!Q)return Z.json({error:"Authentication required"},401);let G=(Z.req.query("site")??"").trim().toLowerCase();if(!XJ(G))return Z.json({error:"Invalid site slug"},400);let J=await X.db.selectFrom("member").innerJoin("organization","organization.id","member.organizationId").select(["organization.id as id","organization.slug as slug","organization.name as name","organization.metadata as metadata"]).where("member.userId","=",Q).execute(),W=[];for(let H of J){if(!H.slug||hZ(H))continue;let F=await X.storage.virtualMcps.list(H.id);for(let N of F){if(pe1(N)!==G)continue;if(!HO6(N.metadata))continue;W.push({orgSlug:H.slug,orgName:H.name??H.slug,project:{id:N.id,title:N.title,icon:N.icon??null}})}}let K={matches:W};return Z.json(K)}),$}var Mm$=D(()=>{Q8();DO()});var Vm$;var km$=D(()=>{Vm$={name:"decocms",version:"4.315.9",description:"Deco CMS \u2014 Self-hostable MCP Gateway for managing AI connections and tools",author:"Deco team",repository:{type:"git",url:"git+https://github.com/decocms/studio.git",directory:"apps/api"},bugs:{url:"https://github.com/decocms/studio/issues"},type:"module",bin:{deco:"./dist/server/cli.js"},files:["dist/**/*"],scripts:{dev:"bun run migrate && bun run dev:server","dev:server":"bun run --cwd=../../packages/sandbox build && NODE_ENV=development bun --env-file=.env --hot run src/index.ts",build:"bun run build:server","build:server":"bun run scripts/bundle-server-script.ts --dist ./dist/server","generate:tool-contracts":"bun run scripts/generate-tool-contracts.ts","db:migrate":"bun run ./dist/server/migrate.js","db:migrate:dbos":"bun run ./dist/server/migrate-dbos.js",check:"tsc --noEmit",start:"bun run ./dist/server/server.js",migrate:"bun run src/database/migrate.ts","migrate:dbos":"bun run src/database/migrate-dbos.ts",test:"bun test src","better-auth:migrate":"bunx --bun @better-auth/cli migrate -y --config src/auth/index.ts",prepublishOnly:"bun run --cwd=../.. build:studio"},optionalDependencies:{"@duckdb/node-api":"^1.5.0-r.1"},dependencies:{"@ai-sdk/anthropic":"^3.0.85","@ai-sdk/google":"^3.0.83","@ai-sdk/openai":"^3.0.73","@anthropic-ai/sdk":"^0.105.0","@aws-sdk/client-s3":"^3.1013.0","@aws-sdk/client-sts":"^3.1013.0","@aws-sdk/lib-storage":"^3.1013.0","@aws-sdk/s3-request-presigner":"^3.1013.0","@clickhouse/client":"^1.8.1","@dbos-inc/dbos-sdk":"^4.21.6","@inkjs/ui":"^2.0.0","@nats-io/jetstream":"3.4.0","@nats-io/kv":"3.4.0","@nats-io/nats-core":"3.4.0","@nats-io/transport-node":"3.4.0","@openrouter/ai-sdk-provider":"^2.9.1","@opentelemetry/core":"^2.6.0","embedded-postgres":"^18.3.0-beta.16",ink:"^6.8.0",kysely:"^0.28.12","posthog-node":"^5.0.0",react:"^19.2.6","react-dom":"^19.2.6"},devDependencies:{"@ai-sdk/provider":"^3.0.10","@better-auth/sso":"1.4.1","@decocms/better-auth":"1.5.17","@decocms/bindings":"workspace:*","@decocms/mcp-utils":"workspace:*","@decocms/runtime":"workspace:*","@decocms/sandbox":"workspace:*","@decocms/shared":"workspace:*","@jitl/quickjs-wasmfile-release-sync":"0.31.0","@modelcontextprotocol/sdk":"1.29.0","@opentelemetry/api":"^1.9.0","@opentelemetry/api-logs":"^0.211.0","@opentelemetry/exporter-logs-otlp-proto":"^0.211.0","@opentelemetry/exporter-prometheus":"^0.208.0","@opentelemetry/exporter-trace-otlp-proto":"^0.207.0","@opentelemetry/instrumentation-runtime-node":"^0.24.0","@opentelemetry/resources":"^2.6.0","@opentelemetry/sdk-logs":"^0.211.0","@opentelemetry/sdk-metrics":"^2.2.0","@opentelemetry/sdk-node":"^0.207.0","@opentelemetry/sdk-trace-base":"^2.5.0","@types/bun":"^1.3.1","@types/google.maps":"^3.65.2","@types/pg":"^8.15.6","@types/react-syntax-highlighter":"^15.5.13","@vercel/nft":"^1.1.1",ai:"^6.0.208","better-auth":"1.4.22",croner:"^9.1.0",degit:"^2.8.4",hono:"^4.10.7",jose:"^6.0.11",nanoid:"^5.1.6",pg:"^8.16.3",typescript:"^7.0.2",typescript5:"npm:typescript@^5.9.3",zod:"4.3.6"},homepage:"https://github.com/decocms/studio",keywords:["mcp","model-context-protocol","ai","gateway","self-hosted","tools"],license:"MIT",publishConfig:{access:"public"}}});function UO6(){let $=process.env.POSTHOG_KEY;if(!$)return null;return{key:$,host:process.env.POSTHOG_HOST??NO6}}var Sm$,NO6="https://ph.studio.decocms.com",Cm$;var _m$=D(()=>{Q8();J90();aC();Q9();E$();c91();km$();Sm$=new K1;Sm$.get("/",($)=>{let Z={version:Vm$.version,theme:Kp1(),..._F().logo&&{logo:_F().logo},...zN()&&{internalUrl:g_1()},...C0().enableDecoImport&&{enableDecoImport:!0},brandExtractEnabled:!!C0().firecrawlApiKey,hostingEnabled:!!C0().controlplaneRestUrl&&!!C0().controlplaneServiceToken,hostingControlPlaneGa:C0().hostingControlPlaneGa,monitorEnabled:!!C0().clickhouseAnalyticsUrl&&!!C0().clickhouseAnalyticsPassword,monitorGa:C0().monitorGa,auth:Rg$(),posthog:UO6(),googleMapsApiKey:process.env.GOOGLE_MAPS_API_KEY?.trim()||null,runtime:{agentSandbox:da()}};return $.header("Cache-Control","no-store"),$.json({success:!0,config:Z})});Cm$=Sm$});function Nl($){let Z=($??"").trim().toLowerCase();return Z=Z.replace(/^https?:\/\//,""),Z=Z.replace(/^www\./,""),Z=Z.split(/[/?#]/)[0]??"",Z.replace(/\/+$/,"")}function FX1($){return(Nl($).split(".")[0]||$).replace(/[-_]/g," ").split(" ").filter(Boolean).map((X)=>X.charAt(0).toUpperCase()+X.slice(1)).join(" ")}function fm$($,Z=64){return`https://www.google.com/s2/favicons?domain=${encodeURIComponent(Nl($))}&sz=${Z}`}function vm$($,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 bm$($){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()?vm$(`${Y.trim().replace(/\s+/g," ")} \u2014 ${J}`,200):vm$(`How does ${X} really perform? ${J}`,200);return{title:G,description:W}}import{z as c0}from"zod";var Cv,BO6,OO6,DO6,LO6,xm$;var ym$=D(()=>{Cv=c0.enum(["good","bad","neutral"]),BO6=c0.preprocess(($)=>{if(Array.isArray($))return{kind:"text",value:$.find((X)=>X!==null&&typeof X!=="object")??""};return $!==null&&typeof $==="object"?$:{kind:"text",value:$}},c0.object({kind:c0.enum(["text","number","sparkline","badge","score"]).catch("text"),value:c0.coerce.string().optional(),tone:Cv.optional(),muted:c0.boolean().optional(),delta:c0.coerce.string().optional(),deltaDir:c0.enum(["up","down","neutral"]).optional(),points:c0.array(c0.coerce.number()).optional(),label:c0.coerce.string().optional()}).transform(($)=>{if($.kind==="badge"&&$.label==null)$.label=$.value??"";if($.kind==="score"){let Z=Number($.value);if(Number.isNaN(Z))return{...$,kind:"text"}}return $})),OO6=c0.preprocess(($)=>{let Z=$;if(Z&&typeof Z==="object"&&!Array.isArray(Z)&&Array.isArray(Z.cells))Z=Z.cells;if(Array.isArray(Z)&&Z.length===1&&Array.isArray(Z[0]))Z=Z[0];if(Array.isArray(Z))return Z;if(Z&&typeof Z==="object")return Object.values(Z);return Z},c0.array(BO6)),DO6={key:c0.coerce.string(),title:c0.coerce.string(),eyebrow:c0.coerce.string().optional(),headline:c0.coerce.string(),annotation:c0.coerce.string().optional(),methodology:c0.coerce.string().optional(),sources:c0.array(c0.object({name:c0.coerce.string(),logoUrl:c0.coerce.string()})).optional()},LO6=c0.discriminatedUnion("template",[c0.object({template:c0.literal("cover"),score:c0.object({value:c0.coerce.number(),max:c0.coerce.number().optional(),grade:c0.coerce.string().optional(),label:c0.coerce.string().optional()}).optional(),brandImage:c0.coerce.string().optional(),screenshot:c0.coerce.string().optional(),mobileScreenshot:c0.coerce.string().optional()}),c0.object({template:c0.literal("cta"),ctaUrl:c0.coerce.string().optional(),ctaLabel:c0.coerce.string().optional(),bullets:c0.array(c0.coerce.string()).optional()}),c0.object({template:c0.literal("series"),points:c0.array(c0.coerce.number()).min(2),xLabels:c0.array(c0.coerce.string()).min(1),unit:c0.coerce.string().optional(),callout:c0.object({index:c0.coerce.number(),value:c0.coerce.string(),tone:Cv.optional()})}),c0.object({template:c0.literal("threshold"),value:c0.coerce.string().default(""),metricLabel:c0.coerce.string().optional(),ratio:c0.coerce.number(),thresholdRatio:c0.coerce.number().optional(),thresholdLabel:c0.coerce.string().default(""),tone:Cv.optional()}),c0.object({template:c0.literal("stats"),stats:c0.array(c0.object({value:c0.coerce.string(),label:c0.coerce.string(),tone:Cv.optional()})).min(1)}),c0.object({template:c0.literal("bars"),items:c0.array(c0.object({value:c0.coerce.string(),label:c0.coerce.string(),ratio:c0.coerce.number(),tone:Cv.optional()})).min(1)}),c0.object({template:c0.literal("gauges"),gauges:c0.array(c0.object({label:c0.coerce.string(),value:c0.coerce.string(),status:c0.enum(["good","warn","bad"]).catch("warn"),caption:c0.coerce.string().optional(),ratio:c0.coerce.number().optional()})).min(1)}),c0.object({template:c0.literal("checklist"),checks:c0.array(c0.object({label:c0.coerce.string(),status:c0.enum(["pass","fail","warn"]).catch("fail"),value:c0.coerce.string().optional()})).min(1)}),c0.object({template:c0.literal("table"),columns:c0.array(c0.object({label:c0.coerce.string(),align:c0.enum(["left","right"]).optional()})).min(1),rows:c0.array(OO6).min(1),highlightRow:c0.coerce.number().optional()}),c0.object({template:c0.literal("products"),products:c0.array(c0.object({name:c0.coerce.string(),price:c0.coerce.string().optional(),image:c0.coerce.string().optional(),url:c0.coerce.string().optional()})).min(1)}),c0.object({template:c0.literal("list"),entries:c0.array(c0.object({label:c0.coerce.string(),severity:c0.enum(["error","warning","notice"]).catch("notice")})).min(1),moreCount:c0.coerce.number().optional()}),c0.object({template:c0.literal("keywords"),volumeLabel:c0.coerce.string().optional(),keywords:c0.array(c0.object({term:c0.coerce.string(),volume:c0.coerce.string(),position:c0.coerce.number().catch(0)})).min(1)}),c0.object({template:c0.literal("competitor"),metricLabel:c0.coerce.string().optional(),competitors:c0.array(c0.object({name:c0.coerce.string(),value:c0.coerce.string(),tone:Cv.optional(),isYou:c0.boolean().optional()})).min(1)}),c0.object({template:c0.literal("scorecard"),rivalLabel:c0.coerce.string().optional(),dimensions:c0.array(c0.object({label:c0.coerce.string(),you:c0.coerce.string(),rival:c0.coerce.string().optional(),rivalName:c0.coerce.string().optional(),tone:Cv.optional()})).min(1)})]),xm$=c0.object({...DO6,template:LO6})});function cT0($){let Z=[],X=[...$.sections].sort((Y,G)=>Y.position-G.position).map((Y)=>{let G=xm$.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 NX1=D(()=>{ym$()});import{join as gm$}from"path";async function EO6($){try{let Z=await fetch(`${LK({})}/api/v2/public/diagnostics/${encodeURIComponent($)}`,{headers:{Accept:"application/json"},signal:AbortSignal.timeout(wO6)});if(!Z.ok)return null;let X=await Z.json(),{deck:Q}=cT0(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()||FX1($),score:Q.meta.scores?.cover??J?.score?.value,verdict:Y?.annotation?.trim()||Y?.headline?.trim()||void 0}}catch{return null}}function PG($){return $.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function jO6($,Z){let X=Nl($),Q=Z?.brand?.trim()||FX1(X),Y=fm$(X,128),J=`${(C0().baseUrl??"https://studio.decocms.com").replace(/\/+$/,"")}/report/${encodeURIComponent(X)}`,{title:W,description:K}=bm$({brand:Q,domain:X,score:Z?.score,verdict:Z?.verdict}),H=`${J}/og.png`,F=`${Q} commerce report by decocms`;return[`<title>${PG(W)}</title>`,`<meta name="description" content="${PG(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="${PG(W)}" />`,`<meta property="og:description" content="${PG(K)}" />`,`<meta property="og:url" content="${PG(J)}" />`,`<meta property="og:image" content="${PG(H)}" />`,'<meta property="og:image:width" content="1200" />','<meta property="og:image:height" content="630" />',`<meta property="og:image:alt" content="${PG(F)}" />`,'<meta name="twitter:card" content="summary_large_image" />',`<meta name="twitter:title" content="${PG(W)}" />`,`<meta name="twitter:description" content="${PG(K)}" />`,`<meta name="twitter:image" content="${PG(H)}" />`,`<meta name="twitter:image:alt" content="${PG(F)}" />`,`<link rel="canonical" href="${PG(J)}" />`,`<link rel="icon" href="${PG(Y)}" sizes="any" />`].join(`
2983
2983
  `)}function zO6($,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}
2984
2984
  </head>`)}function hm$($){let Z=new K1;return Z.get("/:domain/og.png",async(X)=>{let Q=Nl(X.req.param("domain")),Y=async()=>{let G=$?Bun.file(gm$($,"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(`${LK({})}/api/v2/public/diagnostics/${encodeURIComponent(Q)}/og.png`,{signal:AbortSignal.timeout(PO6)}),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=$?gm$($,"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 EO6(Nl(Q)),K=jO6(Q,W);return X.html(zO6(J,K),200,{"Cache-Control":"public, max-age=0, s-maxage=300"})}catch{return X.html(J)}}),Z}var wO6=2500,PO6=1e4;var um$=D(()=>{Q8();NX1();AE();E$()});function xa($,Z){return fetch(`${LK({})}${$}`,Z)}async function AO6($,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 xa(`/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}=cT0(J);return{status:W.slides.length?"ready":"empty",deck:W,scanned_at:J.scanned_at,drops:K}}var TO6,XU,lm$=async($,Z)=>{if(!$.get("reportUser"))return $.json({error:"Authentication required"},401);await Z();return},cm$;var dm$=D(()=>{Q8();nY();AE();NX1();TO6=new Set(["complete","errored","terminated","unknown"]),XU=new K1;XU.use("*",async($,Z)=>{let X=await e$.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});XU.use("/link-token/*",lm$);XU.use("/suggest",lm$);XU.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 AO6(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)}});XU.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 xa("/api/v2/diagnostics/run",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${PE({})}`},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)}});XU.get("/status",async($)=>{let Z=$.req.query("id");if(!Z)return $.json({error:"id is required"},400);try{let X=await xa(`/api/v2/diagnostics/status?id=${encodeURIComponent(Z)}`,{headers:{Authorization:`Bearer ${PE({})}`}});if(!X.ok)return $.json({error:`status HTTP ${X.status}`},502);let Y=(await X.json()).status??"unknown",G={done:TO6.has(Y),status:Y};return $.json(G)}catch{return $.json({error:"status failed"},502)}});XU.get("/link-token/:id",async($)=>{let Z=$.req.param("id");try{let X=await xa(`/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)}});XU.get("/suggest",async($)=>{let Z=($.req.query("q")??"").trim().slice(0,64);if(Z.length<2)return $.json({suggestions:[]});try{let X=await xa(`/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:[]})}});cm$=XU});import{createHmac as RO6,timingSafeEqual as IO6}from"crypto";function im$($,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)>qO6)return!1;let W=RO6("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&&IO6(K,F)})}function pm$($){let Z;try{Z=JSON.parse($)}catch{return null}let X=mJ(Z),Q=mJ(mJ(X?.data)?.object);if(!X||typeof X.type!=="string"||!Q)return null;return{id:fH(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 nm$($){switch($){case"active":case"trialing":return"active";case"past_due":return"past_due";default:return"canceled"}}function fH($){return typeof $==="string"?$:void 0}function mJ($){return typeof $==="object"&&$!==null?$:void 0}function dT0($){return typeof $==="number"?new Date($*1000):null}function OX1($){return fH($)??fH(mJ($)?.id)}function MO6($){return OX1($.subscription)??fH(mJ(mJ($.parent)?.subscription_details)?.subscription)}function kO6($){let Z=dT0($.current_period_end);if(Z)return Z;let X=mJ($.items)?.data;if(!Array.isArray(X))return null;let Q=0;for(let Y of X){let G=mJ(Y)?.current_period_end;if(typeof G==="number"&&G>Q)Q=G}return Q>0?new Date(Q*1000):null}function UX1($,Z){let X=dT0($.created);return!!X&&!!Z.lastStripeEventAt&&X<Z.lastStripeEventAt}function BX1($,Z){let X=dT0($.created);if(!X)return;return Z.lastStripeEventAt&&Z.lastStripeEventAt>X?void 0:X}async function VO6($,Z){let X=Z.data.object;switch(Z.type){case"checkout.session.completed":case"checkout.session.async_payment_succeeded":{let Q=fH(mJ(X.metadata)?.orgId);if(!Q)return{handled:!1,reason:"no orgId"};if(fH(mJ(X.metadata)?.kind)==="topup"){if(X.mode!=="payment")return{handled:!1,reason:"topup with wrong mode"};if(fH(X.payment_status)!=="paid")return{handled:!1,reason:"payment not confirmed"};let J=fH(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(mJ(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:mJ(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(fH(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=OX1(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(UX1(Z,Y))return{handled:!1,reason:"stale event"};return await $.updateStripeState(Q,{stripeCustomerId:OX1(X.customer),stripeSubscriptionId:G,status:"active",lastStripeEventAt:BX1(Z,Y)}),{handled:!0,organizationId:Q}}case"customer.subscription.updated":case"customer.subscription.deleted":{let Q=fH(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&&UX1(Z,Y))return{handled:!1,reason:"stale event"};let J=G?"canceled":nm$(X.status);return await $.updateStripeState(Y.organizationId,{status:J,currentPeriodEnd:kO6(X),...G&&{stripeSubscriptionId:null},lastStripeEventAt:BX1(Z,Y)}),{handled:!0,organizationId:Y.organizationId}}case"invoice.paid":{let Q=MO6(X);if(!Q)return{handled:!1,reason:"no sub id"};let Y=await $.getBillingByStripeSubscriptionId(Q);if(!Y)return{handled:!1,reason:"unknown subscription"};if(UX1(Z,Y))return{handled:!1,reason:"stale event"};return await $.updateStripeState(Y.organizationId,{status:"active",currentPeriodEnd:dT0(X.period_end),lastStripeEventAt:BX1(Z,Y)}),{handled:!0,organizationId:Y.organizationId}}default:return{handled:!1,reason:`unhandled event ${Z.type}`}}}function SO6($,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:nm$(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 mm$($,Z){let X=SO6($,Z);if(!X)return;dY({event:X.name,organizationId:X.organizationId,...$.id?{uuid:Lt1(`stripe:${$.id}:${X.name}`)}:{},...$.created?{timestamp:new Date($.created*1000)}:{},properties:X.properties})}async function tm$($){let Z=new UK(r8().db),X=await VO6(Z,$);if(!(X.handled&&X.topUp))mm$($,X);if(X.handled&&X.topUp)await Gz$({organizationId:X.organizationId,amountCents:X.topUp.creditCents,referenceId:X.topUp.referenceId}),mm$($,X);if(!X.handled&&X.orphanSubscriptionId)try{await m0$(X.orphanSubscriptionId),console.error("stripe webhook: canceled orphan subscription",{subscriptionId:X.orphanSubscriptionId,eventId:$.id})}catch(Q){if(!(Q instanceof tY&&(Q.status===400||Q.status===404)))throw Q}return X}var qO6=300;var om$=D(()=>{oG();S4();h50();_E();A11()});var CO6=1048576,DX1;var rm$=D(()=>{Q8();MH();E$();om$();DX1=new K1;DX1.post("/webhook",o5({maxSize:CO6,onError:($)=>$.json({error:"payload too large"},413)}),async($)=>{let Z=C0().stripeWebhookSecret;if(!Z)return $.json({error:"stripe billing not configured"},503);let X=await $.req.text();if(!im$(X,$.req.header("stripe-signature"),Z))return $.json({error:"invalid signature"},400);let Y=pm$(X);if(!Y)return $.json({error:"invalid payload"},400);let G=await tm$(Y);return console.log("stripe webhook",{eventId:Y.id,type:Y.type,livemode:Y.livemode,...G}),$.json({received:!0})})});import{timingSafeEqual as _O6}from"crypto";function fO6($,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 _O6(Buffer.from(Y),Buffer.from(Q))}var vO6=5242880,LX1;var sm$=D(()=>{Q8();MH();a3();LX1=new K1;LX1.post("/webhook",o5({maxSize:vO6,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(!fO6(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 Kt0())?.markTenantPoolsDirty(G,Y)??[];return $.json({ok:!0,pools:W})})});function am$($,Z){if(Z.startsWith("text/html")||Z.startsWith("image/svg"))$.set("Content-Security-Policy","sandbox allow-scripts allow-modals allow-same-origin")}var em$,bO6,xO6,$i$;var Zi$=D(()=>{Q8();S3();Sg();zy();em$=new K1,bO6=["range","if-none-match","if-modified-since"],xO6=["content-type","content-length","content-range","accept-ranges","etag","last-modified"];em$.get("/:org/files/*",async($)=>{let Z=$.get("studioContext"),X=Z.organization?.id;if(!Z.auth?.user?.id){if(yu($))return $.redirect(`/login?next=${encodeURIComponent($.req.path)}`,302);throw new Z$(401,{message:"Authentication required"})}if(!X)throw new Z$(401,{message:"Organization context required"});let Q=$.req.path.replace(/^.*\/files\//,"");if(!Q)throw new Z$(400,{message:"Missing file key"});let Y=await _t(Q,Z);if(!Y)throw new Z$(503,{message:"Object storage not configured"});if(Y.startsWith("data:")&&eG()){let K=Y.match(/^data:([^;]+);base64,(.+)$/s);if(!K)throw new Z$(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 am$(U,H),new Response(N,{status:200,headers:U})}let G=new Headers;for(let K of bO6){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 Z$(404,{message:"File not found"});if(!J.ok&&J.status!==304&&J.status!==416)throw console.error(`[files] upstream storage error ${J.status} for key:`,Q),new Z$(502,{message:"Upstream storage error"});let W=new Headers;for(let K of xO6){let H=J.headers.get(K);if(H)W.set(K,H)}return W.set("Cache-Control","private, max-age=86400"),am$(W,W.get("content-type")??""),new Response(J.body,{status:J.status,headers:W})});$i$=em$});var ya=_((_v)=>{var yO6=_v&&_v.__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]}),gO6=_v&&_v.__exportStar||function($,Z){for(var X in $)if(X!=="default"&&!Object.prototype.hasOwnProperty.call(Z,X))yO6(Z,$,X)};Object.defineProperty(_v,"__esModule",{value:!0});gO6(kY(),_v)});var Yi$=_((Xi$)=>{Object.defineProperty(Xi$,"__esModule",{value:!0});Xi$.version=void 0;Xi$.version="3.4.0"});var Wi$=_((bH)=>{var hO6=bH&&bH.__importDefault||function($){return $&&$.__esModule?$:{default:$}};Object.defineProperty(bH,"__esModule",{value:!0});bH.NodeTransport=bH.VERSION=void 0;bH.nodeResolveHost=iO6;var e6=ya(),uO6=A0("net"),wX1=A0("tls"),lO6=A0("path"),Gi$=A0("fs"),cO6=hO6(A0("dns")),dO6=Yi$();bH.VERSION=dO6.version;var mO6="nats.js";class Ji${socket;version;lang;yields=[];signal=(0,e6.deferred)();closedNotification=(0,e6.deferred)();options;connected=!1;tlsName="";done=!1;closeError;constructor(){this.lang=mO6,this.version=bH.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,e6.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 e6.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 e6.errors.ConnectionError("error connecting - node provided an undefined error");let{code:J}=G,W=J==="ECONNREFUSED"?new e6.errors.ConnectionError("connection refused",{cause:G}):G;throw this.socket?.destroy(),W}}dial($){let Z=(0,e6.deferred)(),X,Q=(0,uO6.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,e6.deferred)(),Z;return this.socket.on("data",(X)=>{this.yields.push(X);let Q=e6.DataBuffer.concat(...this.yields),Y=(0,e6.extractProtocolMessage)(Q);if(Y!=="")try{let G=e6.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,e6.deferred)();try{if($=(0,lO6.resolve)($),!(0,Gi$.existsSync)($))Z.reject(Error(`${$} doesn't exist`));(0,Gi$.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,e6.extend)(X,this.options.tls,Y)}catch(Y){return Promise.reject(new e6.errors.ConnectionError(Y.message,{cause:Y}))}let Q=(0,e6.deferred)();try{let Y=(0,wX1.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 e6.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,e6.extend)(Z,this.options.tls,Q)}catch(Q){return Promise.reject(new e6.errors.ConnectionError(Q.message,{cause:Q}))}let X=(0,e6.deferred)();try{let Q=(0,wX1.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 e6.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,e6.render)($[Z])}`);yield $[Z]}if(this.done)break;else if(this.yields.length===0)$.length=0,this.yields=$,this.signal=(0,e6.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 wX1.TLSSocket}_send($){if(this.isClosed||this.socket===void 0)return Promise.resolve();if(this.options.debug)console.info(`< ${(0,e6.render)($)}`);let Z=(0,e6.deferred)();try{this.socket.write($,(X)=>{if(X){if(this.options.debug)console.error(`!!! ${(0,e6.render)($)}: ${X}`);return Z.reject(X)}return Z.resolve()})}catch(X){if(this.options.debug)console.error(`!!! ${(0,e6.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}}bH.NodeTransport=Ji$;function iO6($){let Z=(0,e6.deferred)();return cO6.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 Ui$=_((Ni$)=>{Object.defineProperty(Ni$,"__esModule",{value:!0});Ni$.connect=pO6;var Ki$=Wi$(),Hi$=ya(),Fi$=ya();function pO6($={}){if((0,Fi$.hasWsProtocol)($))return Promise.reject(Fi$.errors.InvalidArgumentError.format("servers","node client doesn't support websockets, use the 'wsconnect' function instead"));return(0,Hi$.setTransportFactory)({factory:()=>{return new Ki$.NodeTransport},dnsResolveFn:Ki$.nodeResolveHost}),Hi$.NatsConnectionImpl.connect($)}});var Bi$=_((QU)=>{var tO6=QU&&QU.__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]}),oO6=QU&&QU.__exportStar||function($,Z){for(var X in $)if(X!=="default"&&!Object.prototype.hasOwnProperty.call(Z,X))tO6(Z,$,X)};Object.defineProperty(QU,"__esModule",{value:!0});QU.connect=void 0;var rO6=Ui$();Object.defineProperty(QU,"connect",{enumerable:!0,get:function(){return rO6.connect}});oO6(ya(),QU)});function wi$($){let Z=$?.connectFn??$D6,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 B of U.status())if(B.type==="disconnect")console.log("[NatsProvider] Disconnected"),J=!0;else if(B.type==="reconnect")console.log("[NatsProvider] Reconnected, re-firing ready callbacks"),J=!1,Q=null,H()})().catch(()=>{})}async function N(U,B){let O=0;while(!G)try{X=await Z({servers:U,timeout:eO6,reconnect:!0,maxReconnectAttempts:-1,...B?{authenticator:B}:{}}),console.log(`[NatsProvider] Connected to ${X.getServer()} after ${O} attempt(s)`),Q=null,J=!1,F(X),H();return}catch{O++;let L=G7(aO6,sO6,O-1,2,0.5);await w$(L)}}return{init(U,B){if(Y)return;Y=!0,G=!1;let O=B?.creds?Oi$.credsAuthenticator(new TextEncoder().encode(B.creds)):void 0;N(U,O).catch(()=>{})},isConnected(){return K()},getConnection(){return K()?X:null},getJetStream(){if(!K())return null;if(!Q)Q=Li$.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 $D6($){return Di$.connect($)}var Oi$,Di$,Li$,sO6=100,aO6=3000,eO6=3000;var Ei$=D(()=>{W4();Oi$=V(xl(),1),Di$=V(Bi$(),1),Li$=V(DU(),1)});function EX1($,Z){return`${$}.${Z}`}class jX1{cache;constructor($){this.cache=Eu({ttlMs:$?.ttlMs??ZD6,maxSize:$?.maxSize??XD6})}async get($,Z){return this.cache.get(EX1($,Z))??null}async set($,Z,X){this.cache.set(EX1($,Z),X)}async invalidate($,Z){this.cache.delete(EX1($,Z))}teardown(){this.cache.clear()}}var ZD6=600000,XD6=5000;var ji$=()=>{};function mT0($,Z){return`${$}:${Z}`}function zX1($){let Z=Eu({ttlMs:$?.ttlMs??QD6,maxSize:$?.maxSize??YD6}),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(zi$,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(mT0(K,H))},set(K,H,F){Z.set(mT0(K,H),F)},invalidate(K,H){Z.delete(mT0(K,H)),W(K,H)},start(){if(J)return;let K=X?.();if(!K)return;J=K.subscribe(zi$),(async()=>{for await(let H of J)try{let F=JSON.parse(G.decode(H.data));if(F.originId===Q)continue;Z.delete(mT0(F.organizationId,F.keyId))}catch{}})().catch(console.error)},teardown(){J?.unsubscribe(),J=null,Z.clear()}}}var zi$="studio.ai-provider-keys.invalidate",QD6=30000,YD6=5000;var Pi$=()=>{};class PX1{options;subscription=null;onCancel=null;encoder=new TextEncoder;originId=crypto.randomUUID();constructor($){this.options=$}async start($){if($)this.onCancel=$;if(this.subscription)return;if(!this.onCancel)return;let Z=this.options.getConnection();if(!Z)return;let X=new TextDecoder,Q=Z.subscribe("studio.decopilot.cancel");this.subscription=Q,(async()=>{for await(let Y of Q)try{let G=JSON.parse(X.decode(Y.data));if(G.originId===this.originId)continue;this.onCancel?.(G.taskId)}catch{}})().catch(console.error)}broadcast($){if(/[.*>\s]/.test($)){console.warn("[NatsCancelBroadcast] Invalid threadId, skipping broadcast");return}this.onCancel?.($);try{let Z=this.options.getConnection();if(!Z)return;let X=this.encoder.encode(JSON.stringify({taskId:$,originId:this.originId}));Z.publish("studio.decopilot.cancel",X)}catch(Z){console.warn("[NatsCancelBroadcast] Publish failed (non-critical):",Z)}}async stop(){this.subscription?.unsubscribe(),this.subscription=null,this.onCancel=null}}var Ai$=($)=>{let Z;return()=>Z??=$()},AX1,TX1;var Ti$=D(()=>{G6();AX1=Ai$(()=>J$.createHistogram("decopilot.stream.encode_ms",{description:"Per-chunk JSON.stringify+encode time for decopilot stream",unit:"ms"})),TX1=Ai$(()=>J$.createCounter("decopilot.stream.published_chunks",{description:"Logical decopilot stream chunks published to JetStream",unit:"{chunks}"}))});function ND6($=qi$){return{name:$H,subjects:[`${_s0}.>`],storage:IW.StorageType.File,max_age:WD6,max_bytes:HD6,max_msgs_per_subject:FD6,discard:IW.DiscardPolicy.Old,retention:IW.RetentionPolicy.Limits,duplicate_window:KD6,num_replicas:$}}class Mi${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 Ri$($){let Z=Ii$.headers();for(let[X,Q]of Object.entries($))Z.set(X,Q);return Z}function DD6($,Z){let X=0;return{publish(Q,Y,G,J){Q.publish(Y,G,J?{headers:J}:void 0).catch((W)=>{if(X++,JD6().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 LD6($,Z){return $.info?.cluster?Z:1}function wD6($){if(!($ instanceof Error))return!1;if(/non-clustered/i.test($.message))return!0;return/replicas?\b/i.test($.message)&&/not supported|can ?not|exceed|insufficient|greater than/i.test($.message)}class RX1{options;js=null;jsm=null;constructor($){this.options=$}async init(){let $=this.options.getConnection();if(!$){console.log("[Decopilot] StreamBuffer.init skipped: NATS not connected yet");return}let Z=async(Q,Y)=>{let G=ND6(Y);try{await Q.streams.info($H),await Q.streams.update($H,G)}catch(J){if(J instanceof Error&&J.message.includes("stream not found"))await Q.streams.add(G),await Q.streams.update($H,G);else if(J instanceof Error&&/can ?not change.*storage|storage type/i.test(J.message))await Q.streams.delete($H),await Q.streams.add(G);else throw J}},X=await h6(async()=>{let Q=this.options.getJetStreamManager?await this.options.getJetStreamManager():await IW.jetstreamManager($),Y=LD6($,qi$);try{await Z(Q,Y)}catch(G){if(Y<=1||!wD6(G))throw G;console.warn(`[Decopilot] StreamBuffer: NATS rejected num_replicas=${Y} (${G.message}); falling back to an unreplicated stream`),await Z(Q,1)}return Q},{maxAttempts:5,minTimeout:250,maxTimeout:4000,jitter:0.5,isRetriable:lg});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=DD6(Z,Q),J=!1,W=()=>{if(J)return;J=!0;let H=iO$(Z);Y.publish(H.subject,H.data).catch(()=>{})};X.addEventListener("abort",W,{once:!0});let K=(H)=>{let F=performance.now(),N=fs0(H,{runId:Z}),U=performance.now()-F;AX1().record(U),TX1().add(1,{"org.id":Q??"unknown"}),OD6?.record(U,N.reduce((B,O)=>B+O.data.length,0));for(let B of N)G.publish(Y,B.subject,B.data,B.headers?Ri$(B.headers):void 0)};return(async()=>{let H=$.getReader(),F=0,N=0,U;try{while(!0){let{done:B,value:O}=await H.read();if(B)break;if(K(O),N++,++F>=64)F=0,await new Promise((L)=>setImmediate(L))}}catch(B){U=B,console.warn(`[Decopilot] stream pump error for thread ${Z}:`,B?.message??B)}finally{if(H.releaseLock(),W(),BD6)console.warn(JSON.stringify({msg:"decopilot-stream-diag",event:"pump-done",taskId:Z,publishedChunks:N,publishErrors:G.errorCount}))}if(U!==void 0)throw U})()}async publishSerialized($,Z){try{return await h6(()=>$.publish(Z.subject,Z.data,{...Z.headers?{headers:Ri$(Z.headers)}:{},...Z.msgId?{msgID:Z.msgId}:{}}),{maxAttempts:6,minTimeout:250,maxTimeout:5000,jitter:0.5,isRetriable:lg}),!0}catch(X){return console.error(`[Decopilot] publish failed after retries subject=${Z.subject}`,X),!1}}async publishRawChunk($,Z,X){let Q=this.js;if(!Q)return!1;let Y=performance.now(),G=fs0(Z,{runId:$,dedup:X});AX1().record(performance.now()-Y),TX1().add(1);for(let J of G)if(!await this.publishSerialized(Q,J))return!1;return!0}async publishDone($,Z,X){let Q=this.js;if(!Q)return!1;let Y=mO$({runId:$,fenceToken:Z,finalSeq:X});return await this.publishSerialized(Q,Y)}async createTailStream($,Z,X){let Q=this.js;if(!Q)return console.warn(`[Decopilot] createTailStream: JetStream client unavailable for thread ${$}; no live tail`),null;let Y=X?.deliverPolicy==="new"?IW.DeliverPolicy.New:IW.DeliverPolicy.All,G=X?.closeOnDone??!1,J=jD($),W;try{W=await h6(async()=>{return(await Q.consumers.get($H,{filter_subjects:J,deliver_policy:Y})).consume()},{maxAttempts:6,minTimeout:250,maxTimeout:5000,jitter:0.5,isRetriable:lg})}catch(L){return console.warn("[Decopilot] JetStream tail unavailable (non-critical):",L?.message??L),null}let F=Aw0({messages:async function*(){try{for await(let L of W)yield{subject:L.subject,data:L.data,headers:L.headers}}finally{W.stop()}}(),onCancel:()=>W.stop()}).pipeThrough(Ew0()).pipeThrough(jw0()).getReader(),N=!1,U=()=>{if(N)return;N=!0;try{F.releaseLock()}catch{}},B=!1,O=()=>{if(B)return;B=!0,W.stop(),F.cancel().catch(()=>{}),U()};return Z?.addEventListener("abort",O,{once:!0}),new ReadableStream({async pull(L){for(;;){let{done:w,value:E}=await F.read();if(w){O(),L.close();return}let j=E;if(j.kind==="done"){if(G){O(),L.close();return}continue}L.enqueue(j.chunk);return}},cancel(){O()}})}purge($){if(!this.jsm)return;this.jsm.streams.purge($H,{filter:jD($)}).catch(()=>{})}teardown(){this.js=null,this.jsm=null}}var IW,Ii$,GD6=($)=>{let Z;return()=>Z??=$()},JD6,WD6=86400000000000,KD6=120000000000,HD6=4294967296,qi$,FD6=500000,UD6,BD6,OD6;var ki$=D(()=>{W4();bs0();Tw0();zw0();G6();Ti$();IW=V(DU(),1),Ii$=V(xl(),1),JD6=GD6(()=>J$.createCounter("decopilot.stream.publish_errors",{description:"Number of JetStream publish failures for decopilot stream chunks",unit:"{errors}"})),qi$=Math.max(1,Number(process.env.DECOPILOT_STREAM_REPLICAS??3)||3);UD6=process.env.STREAM_ENCODE_TRACE==="1",BD6=process.env.DECOPILOT_STREAM_TRACE==="1";OD6=UD6?new Mi$:null});function iT0($,Z,X,Q){if(!Q)return!1;return $.emit(Z,tW(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 Vi$=D(()=>{_8()});class IX1{storage;options;timer=null;constructor($,Z={}){this.storage=$;this.options=Z}start(){if(this.timer)return;let $=this.options.intervalMs??300000;this.timer=setInterval(()=>{this.runOnce()},$)}async runOnce(){let $=this.options.staleAfterMs??3600000;try{let Z=await this.storage.sweepAbandoned($);if(Z>0)console.log(`[async-research-sweeper] marked ${Z} stale jobs as abandoned`);return Z}catch(Z){return console.error("[async-research-sweeper] sweep failed",Z),0}}dispose(){if(this.timer)clearInterval(this.timer),this.timer=null}}async function Si$($,Z,X){let Q=Z.organizationId;if(!ZY(Z,(await N9($,Q)).review))return!1;if(!tC(X))return!1;if(await $.storage.taskBoard.hasHumanRejectedDone(Z.id,Q))return!1;let Y=await $.storage.organizationSettings.get(Q),G=qK(Y?.flags),J=await j5($,Q),W=await $.storage.taskBoard.update(Z.id,Q,BJ(J,G),Z.updatedBy);return await A6($,{taskBoardItemId:Z.id,action:"status_changed",actorId:null,data:{from:Z.status,to:G,reason:"pr_merged"}}),x$(Q,W),console.log(`[task-board-review-sweeper] ${Z.id}: linked PR already merged \u2014 moved to ${G}`),!0}var Ci$=D(()=>{j6();BX();Mg();v5();iK();z5()});function RD6($){return $ instanceof $Q}function ID6($,Z){return Z-$>=AD6}class qX1{taskBoard;contextFactory;billing;db;options;timer=null;running=!1;cursor=null;constructor($,Z,X,Q,Y={}){this.taskBoard=$;this.contextFactory=Z;this.billing=X;this.db=Q;this.options=Y}start(){if(this.timer)return;let $=this.options.intervalMs??ED6;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??zD6,X=this.options.itemIntervalMs??jD6,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()-et0),ao0);for(let X of Z)console.warn(`[task-board-review-sweeper] failed never-started thread ${X.threadId} on ${X.itemId}`)}catch(Z){console.error("[task-board-review-sweeper] reaping failed",Z)}}async reactToUnhandledFailures($){let Z=await this.taskBoard.listItemsStuckAfterFailure($,new Date(Date.now()-TD6));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 oo0(this.taskBoard,Y,Q,await WN(this.db,Q)),await ro0(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!==Y8)continue;let W=await this.contextFactory(Y,J.assignedBy??J.createdBy);if(!W)continue;await EN(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),RD6(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()+PD6),(await WN(this.db,Y)).progress).catch((W)=>console.error(`[task-board-review-sweeper] re-arming ${Q} failed`,W))}return Z}async returnToTodo($,Z,X){try{let Q=await WN(this.db,Z),Y=await this.taskBoard.getById($,Z);if(!Y||Y.status!=="in_progress")return;let G=await this.taskBoard.returnToTodoAfterFailure($,Z,Y.updatedBy,Q);if(!G)return;await this.taskBoard.recordActivity({taskBoardItemId:$,action:"status_changed",actorId:null,data:{from:"in_progress",to:"todo",reason:X}}).catch(()=>{}),x$(Z,G)}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(!ID6(dF(X,Z.reviewCycleStartedAt),Date.now()))return;await tK($,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;let Y=await WN(this.db,Z);if(!ZY(Q,Y.review))return!1;let G=Q.assigneeId===Y8,J=await this.taskBoard.listPrs($,Z),W=await this.contextFactory(Z,Q.assignedBy??Q.createdBy);if(!W)return!1;if(J.length===0){if(G)await this.handOffReviewWithoutPr(W,Q);return!1}let K=await Promise.all(J.map(async(H)=>({...H,...await Vg(Z,H)})));if(K.every((H)=>H.state===null))console.warn(`[task-board-review-sweeper] ${$}: no live PR state from GitHub (${K.length} PR(s)) \u2014 proceeding on unknown`);if(await Si$(W,Q,K))return!0;if(await xD$(W,Q))return!0;if(await this.resolveConflictFromSweep(W,Q,K))return!0;if(!G)return!1;if(!wr0(K))return!1;return await vL0(W,Q,{previewMatchesHead:Er0(K)}),!0}async resolveConflictFromSweep($,Z,X){let Q=X.find((Y)=>Y.state!=="closed"&&Y.conflict===!0);if(!Q)return!1;return await UD($,Z.organizationId,Z,{pr:{number:Q.number,url:Q.url},conflict:!0}).catch((Y)=>{return console.error("[task-board-review-sweeper] conflict resolve failed",Y),!1})}dispose(){if(this.timer)clearInterval(this.timer),this.timer=null}}var ED6=60000,jD6=300000,zD6=50,PD6=60000,AD6=900000,TD6=120000;var _i$=D(()=>{v5();j6();Hr0();wN();et();iK();Ci$();z5();YJ();eo0();JG();kt();kg()});import{readdir as qD6,rm as pT0}from"fs/promises";import{join as nT0}from"path";async function tT0($){let Z=new Date;Z.setUTCDate(Z.getUTCDate()-MD6),Z.setUTCHours(0,0,0,0);let X=0;try{let Q=await vv($);for(let Y of Q)if(/^\d{4}$/.test(Y))X+=await vi$($,Y,Z);else if(!Y.startsWith(".")){let G=nT0($,Y),J=await vv(G);for(let K of J){if(!/^\d{4}$/.test(K))continue;X+=await vi$(G,K,Z)}if((await vv(G)).length===0)await pT0(G,{recursive:!0,force:!0})}}catch(Q){console.warn("monitoring retention cleanup failed:",Q)}return X}async function vi$($,Z,X){let Q=0,Y=nT0($,Z),G=await vv(Y);for(let W of G){if(!/^\d{2}$/.test(W))continue;let K=nT0(Y,W),H=await vv(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 B=nT0(K,N);await pT0(B,{recursive:!0,force:!0}),Q++}}if((await vv(K)).length===0)await pT0(K,{recursive:!0,force:!0})}if((await vv(Y)).length===0)await pT0(Y,{recursive:!0,force:!0});return Q}async function vv($){try{return(await qD6($)).filter((X)=>!X.startsWith("."))}catch{return[]}}var MD6=30;var MX1=()=>{};import{DBOS as kX1,SchedulerMode as kD6}from"@dbos-inc/dbos-sdk";async function SD6(){let $=[nJ(),fv(),gH()],Z=0;for(let X of $)try{Z+=await tT0(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 CD6($,Z){await kX1.runStep(()=>SD6(),{name:"monitoringRetention"})}function bi$(){if(fi$)return;fi$=!0;let $=kX1.registerWorkflow(CD6,{name:"monitoringRetentionWorkflow"});kX1.registerScheduled($,{name:"monitoringRetentionWorkflow",crontab:VD6,mode:kD6.ExactlyOncePerIntervalWhenActive})}var VD6="23 4 * * *",fi$=!1;var xi$=D(()=>{RY();MX1()});function yi$($){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 wJ.create();Y.auth.user={id:X,role:Q.role},Y.organization={id:Q.orgId,slug:Q.orgSlug,name:Q.orgName};let G=await xt($.db,Z,Q.role);return Y.boundAuth=I91({auth:Y.authInstance,headers:new Headers,role:Q.role,permissions:G,userId:X}),Y.access=new JE(X,void 0,Y.boundAuth,Q.role,"self"),KD(Y,{id:Q.orgId,slug:Q.orgSlug}),Y}}var gi$=D(()=>{pB();HD()});function _D6(){return[{name:"Postgres",status:"pending",port:0},{name:"NATS",status:"pending",port:0}]}function vD6(){return{services:_D6(),migrationsStatus:"pending",serverUrl:null,logs:[]}}function bD6(){for(let $ of fD6)$()}function hi$($){let Z=[...VX1.logs,$];VX1={...VX1,logs:Z.length>500?Z.slice(-500):Z},bD6()}function SX1(){return xD6}var VX1,fD6,xD6=!1;var CX1=D(()=>{VX1=vD6(),fD6=new Set});import{EventEmitter as yD6}from"events";var _X1;var ui$=D(()=>{CX1();_X1=new yD6;_X1.on("request",($)=>{hi$($)})});function li$(){return async($,Z)=>{let X=Date.now(),Q=$.req.method,Y=$.req.path;if(Y==="/api/auth/get-session"||Y.includes("favicon")){await Z();return}let G="",J=!1;if(Y.startsWith("/mcp")&&Q==="POST"){J=!0;try{if($.req.header("Content-Type")?.includes("application/json")){let U=await $.req.raw.clone().json();if(U.method==="tools/call"&&U.params?.name){let B=Ul(U.params.name),O=U.params.arguments||{},L=Object.keys(O).map((E)=>Ul(E)),w=L.length>0?L.slice(0,3).join(",")+(L.length>3?"\u2026":""):"";G=`${W5.tool}${B}${W5.dim}(${w})${W5.reset}`}else if(U.method)G=`${W5.dim}${Ul(U.method)}${W5.reset}`}}catch{}}let W=Ul(Y);if(Y.startsWith("/mcp/conn_")){let F=Y.split("/")[2]??"";W=`/mcp/${W5.mcp}${Ul(F.slice(0,12))}\u2026${W5.reset}`}else if(Y==="/mcp")W=`${W5.mcp}/mcp${W5.reset}`;else if(Y==="/mcp/registry")W=`${W5.mcp}/mcp/registry${W5.reset}`;let K=hD6(Q),H=J?"\u25C0":"\u2190";if(!SX1())console.log(`${W5.dim}${H}${W5.reset} ${K}${Q}${W5.reset} ${W}${G?` ${G}`:""}`);try{await Z()}finally{let F=Date.now()-X,N=$.res.status,U=gD6(N),B=F<1000?`${F}ms`:`${(F/1000).toFixed(1)}s`,O=J?"\u25B6":"\u2192";if(!SX1())console.log(`${W5.dim}${O}${W5.reset} ${K}${Q}${W5.reset} ${W}${G?` ${G}`:""} ${U}${N}${W5.reset} ${W5.duration}${B}${W5.reset}`);_X1.emit("request",{method:Q,path:Ul(Y),status:N,duration:F,timestamp:new Date})}}}var W5,gD6=($)=>{if($>=500)return W5.serverError;if($>=400)return W5.clientError;if($>=300)return W5.redirect;return W5.ok},hD6=($)=>{return W5[$]||W5.reset},Ul=($)=>{return $.replace(/\r/g,"").replace(/\n/g,"").replace(/\x1b\[[0-9;]*m/g,"").replace(/[\x00-\x1f\x7f-\x9f]/g,"")};var ci$=D(()=>{CX1();ui$();W5={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 pi$}from"crypto";import{mkdir as uD6,readdir as lD6,rm as di$,stat as ni$}from"fs/promises";import{join as fX1,relative as cD6}from"path";import{z as T$}from"zod";function oi$($){let Z=$.replace(/[^a-zA-Z0-9_-]/g,"_");return fX1(dD6,Z)}function ri$($){return $.replace(/^\/+/,"").replace(/\.\./g,"")}function vX1($,Z){let X=oi$($),Q=ri$(Z);return fX1(X,Q)}function mD6($,Z,X,Q){let Y=C0().encryptionKey||"dev-secret",G=`${$}:${Z}:${X}:${Q}`;return pi$("sha256",Y).update(G).digest("hex")}function ii$($,Z,X,Q,Y){let G=Math.floor(Date.now()/1000)+Q,J=mD6(Z,X,G,Y),W=new URL(`/api/dev-assets/${Z}/${ri$(X)}`,$);return W.searchParams.set("expires",G.toString()),W.searchParams.set("signature",J),W.searchParams.set("method",Y),W.toString()}function si$($,Z,X){let Q=`${$}:${Z.getTime()}:${X}`;return`"${pi$("md5","etag").update(Q).digest("hex")}"`}async function ai$($,Z,X,Q,Y){try{let G=await lD6($,{withFileTypes:!0});for(let J of G){let W=fX1($,J.name),H=cD6(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 ai$(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 ni$(W);Y.objects.push({key:H,size:F.size,lastModified:F.mtime.toISOString(),etag:si$(W,F.mtime,F.size)})}catch{}}}}catch{}}function ei$($,Z){let Q=n($).id;return[{name:"LIST_OBJECTS",description:"List objects in the local assets directory with pagination support",inputSchema:T$.object({prefix:T$.string().optional(),maxKeys:T$.number().optional().default(1000),continuationToken:T$.string().optional(),delimiter:T$.string().optional()}),outputSchema:T$.object({objects:T$.array(T$.object({key:T$.string(),size:T$.number(),lastModified:T$.string(),etag:T$.string()})),nextContinuationToken:T$.string().optional(),isTruncated:T$.boolean(),commonPrefixes:T$.array(T$.string()).optional()}),handler:async(Y)=>{let G=Y,J=G.prefix||"",W=G.maxKeys??1000,K=G.delimiter,H=G.continuationToken,F=oi$(Q);await uD6(F,{recursive:!0});let N={objects:[],commonPrefixes:new Set};await ai$(F,F,J,K,N),N.objects.sort((w,E)=>w.key.localeCompare(E.key));let U=0;if(H){if(U=N.objects.findIndex((w)=>w.key>H),U===-1)U=N.objects.length}let B=N.objects.slice(U,U+W),O=U+W<N.objects.length,L=O?B[B.length-1]?.key:void 0;return{objects:B,isTruncated:O,nextContinuationToken:L,commonPrefixes:Array.from(N.commonPrefixes).sort()}}},{name:"GET_OBJECT_METADATA",description:"Get metadata for a file in the local assets directory",inputSchema:T$.object({key:T$.string()}),outputSchema:T$.object({contentType:T$.string().optional(),contentLength:T$.number(),lastModified:T$.string(),etag:T$.string(),metadata:T$.record(T$.string(),T$.string()).optional()}),handler:async(Y)=>{let G=Y,J=vX1(Q,G.key),W=await ni$(J);return{contentType:BZ1(G.key),contentLength:W.size,lastModified:W.mtime.toISOString(),etag:si$(J,W.mtime,W.size)}}},{name:"GET_PRESIGNED_URL",description:"Generate a presigned URL for downloading a file from local storage",inputSchema:T$.object({key:T$.string(),expiresIn:T$.number().optional()}),outputSchema:T$.object({url:T$.string(),expiresIn:T$.number()}),handler:async(Y)=>{let G=Y,J=G.expiresIn??mi$;return{url:ii$(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:T$.object({key:T$.string(),expiresIn:T$.number().optional(),contentType:T$.string().optional()}),outputSchema:T$.object({url:T$.string(),expiresIn:T$.number()}),handler:async(Y)=>{let G=Y,J=G.expiresIn??mi$;return{url:ii$(Z,Q,G.key,J,"PUT"),expiresIn:J}}},{name:"DELETE_OBJECT",description:"Delete a single file from local storage",inputSchema:T$.object({key:T$.string()}),outputSchema:T$.object({success:T$.boolean(),key:T$.string()}),handler:async(Y)=>{let G=Y,J=vX1(Q,G.key);try{return await di$(J),{success:!0,key:G.key}}catch{return{success:!1,key:G.key}}}},{name:"DELETE_OBJECTS",description:"Delete multiple files from local storage",inputSchema:T$.object({keys:T$.array(T$.string()).max(1000)}),outputSchema:T$.object({deleted:T$.array(T$.string()),errors:T$.array(T$.object({key:T$.string(),message:T$.string()}))}),handler:async(Y)=>{let G=Y,J=[],W=[];return await Promise.all(G.keys.map(async(K)=>{let H=vX1(Q,K);try{await di$(H),J.push(K)}catch(F){W.push({key:K,message:F instanceof Error?F.message:"Unknown error"})}})),{deleted:J,errors:W}}}]}async function bX1($,Z,X){let Q=ei$(Z,X),Y=new XK({name:"dev-assets-mcp",version:"1.0.0"},{capabilities:{tools:{}},jsonSchemaValidator:U5});for(let J of Q){let W="shape"in J.inputSchema?J.inputSchema.shape:T$.object({}).shape,K=J.outputSchema&&"shape"in J.outputSchema?J.outputSchema.shape:T$.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 HQ({enableJsonResponse:$.headers.get("Accept")?.includes("application/json")??!1});return await Y.connect(G),MJ(Y,G,$,"mcp:dev-assets")}async function $p$($,Z,X,Q){let G=ei$(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 dD6="./data/assets",mi$=3600,ti$,Zp$;var Xp$=D(()=>{E$();tg();Q8();Gm();L_();mX();mA0();ti$=new K1;ti$.all("/",async($)=>{let Z=$.get("studioContext"),X=new URL($.req.url),Q=`${X.protocol}//${X.host}`;return bX1($.req.raw,Z,Q)});Zp$=ti$});var Qp$={};J4(Qp$,{mountDevRoutes:()=>iD6});function iD6($,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 bX1(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 $p$(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",Zp$);let X=new K1;X.use("*",TW({mountPath:"/api/dev-assets"})),X.route("/",dA0({orgFromPath:!1})),$.route("/api/dev-assets",X)}var Yp$=D(()=>{Q8();YZ1();mA0();Xp$()});import{sql as pD6}from"kysely";import{randomUUID as Gp$}from"crypto";import{z as nD6}from"zod";async function oD6($){let Z=new Date().toISOString(),X=Gp$(),Q=C8.SELF($.organizationId),Y="registry.publish_request.created",G={requestId:$.request.id,requestedId:$.request.requested_id,title:$.request.title,status:$.request.status,createdAt:$.request.created_at,requester:{name:$.request.requester_name,email:$.request.requester_email}};await $.db.insertInto("events").values({id:X,organization_id:$.organizationId,type:"registry.publish_request.created",source:Q,specversion:"1.0",subject:$.request.id,time:Z,datacontenttype:"application/json",dataschema:null,data:JSON.stringify(G),cron:null,status:"pending",attempts:0,last_error:null,next_retry_at:null,created_at:Z,updated_at:Z}).execute();let J=await $.db.selectFrom("event_subscriptions").select(["id"]).where("organization_id","=",$.organizationId).where("enabled","=",1).where("event_type","=","registry.publish_request.created").where((W)=>W.or([W("publisher","is",null),W("publisher","=",Q)])).execute();if(J.length>0)await $.db.insertInto("event_deliveries").values(J.map((W)=>({id:Gp$(),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 pD6`SELECT
2985
2985
  pg_notify('studio_events', ${X}),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "decocms",
3
- "version": "4.315.8",
3
+ "version": "4.315.9",
4
4
  "description": "Deco CMS — Self-hostable MCP Gateway for managing AI connections and tools",
5
5
  "author": "Deco team",
6
6
  "repository": {
@@ -1 +0,0 @@
1
- import{c as B,b as L,j as r}from"./index-BZVho9-x.js";import{I as z}from"./input-DIJTuAiI.js";import{L as F}from"./label-1eNt2dYG.js";import{S as A,a as R,b as O,c as V,d as D}from"./select-W5fEmgO1.js";import{T as J}from"./textarea-Buvn72cT.js";import{g as M,x as $,k as q,z as G,K as H}from"./index-DRc6R8Fy.js";import{s as P}from"./primitives-D1x3zqY1.js";import{u as Q}from"./use-autosave-BPDElkW3.js";import"./Check-C2opEhYm.js";import"./ChevronDown-Bueer4qU.js";import"./ChevronUp-BKRDLJov.js";import"./ArrowUp-CkqJs-MZ.js";import"./chat-context-BY7xRXxg.js";import"./use-panel-navigate-DcbNZKOV.js";import"./use-destination-route-CKl6x7eL.js";import"./thread-route-DZYjgtCg.js";import"./dialog-Dje85m6l.js";import"./Copy01-ynzmMJf5.js";import"./Download01-D5_gKwhP.js";import"./constants-dLUUoWH7.js";import"./session-runtime-C-KTDVeQ.js";import"./slugify-CEUa2lfQ.js";import"./hooks-FKOZdGJr.js";import"./use-mcp-client-CMS2aS7J.js";import"./auth-97Xd2KQD.js";import"./delay-CnY5UFtP.js";import"./backoff-CrEUbyZT.js";import"./decopilot-sse-pool-DZgVeU98.js";import"./task-board-CDv-XJ2U.js";import"./use-is-desktop-app-BNujXJc_.js";import"./use-virtual-mcp-C5o8otqw.js";import"./use-ai-providers-DG6vV5Hx.js";import"./location-oTTXFrSF.js";import"./use-decopilot-events-DFEnjoJS.js";import"./use-organization-settings-Co9OZfKz.js";import"./automation-runs-C-dUH7vL.js";import"./agent-icon-Dm8ROwob.js";import"./AlertCircle-CkzV0rLF.js";import"./UserSquare-CZB9NBEt.js";import"./Tool01-ClWaWn3c.js";import"./ArrowLeft-Dm5_VLV8.js";import"./Tool02-DOXsydL5.js";import"./XCircle-ByLTULyg.js";import"./TrendUp01-sisgIENp.js";import"./ZapSquare-B34n3eW3.js";import"./ZoomOut-De6Y8zsq.js";import"./Users03-Dr-turCI.js";import"./CheckCircle-BuxJYUrk.js";import"./ChevronRight-DofQuep9.js";import"./ChevronSelectorVertical-CDh4aSpQ.js";import"./DotsVertical-Dl2a4pwB.js";import"./Stars02-BWafZXKL.js";import"./CreditCard01-iLPjz2EG.js";import"./Settings02-DKIynolO.js";import"./Eye-DtRvnPj3.js";import"./FilterLines-C90xQoMG.js";import"./Share07-9sygjVhJ.js";import"./GitBranch01-xz-_Yjyh.js";import"./Globe01-CG410Az0.js";import"./Globe04-BqFwV5BD.js";import"./SwitchHorizontal01-s2Jb9X7B.js";import"./HardDrive-BXDcottD.js";import"./Image01-DWQsBmMv.js";import"./Key01-N_ZWYtTX.js";import"./LinkExternal01-D5ZZVcoA.js";import"./LockUnlocked01-DF_DQFCQ.js";import"./LogOut01-Bp_us-Ox.js";import"./Monitor01-CmZ7P9ai.js";import"./Sun-BU9tFsLF.js";import"./Package-Dm3trmid.js";import"./Palette-DT9uu6qO.js";import"./Play-C96cznrL.js";import"./Plus-DIm7CtF1.js";import"./SearchLg-GP23COxS.js";import"./SearchMd-CO8ah3bm.js";import"./Shield01-BVjFRMqE.js";import"./Stars01-Dy9Hsrtu.js";import"./Trash01-CsCWSj3Z.js";import"./Upload01-x2XapLpM.js";import"./User01-BLBnLkZ-.js";import"./Users01-DOJyIilu.js";import"./XClose-C7Ypg3YR.js";import"./Zap-BFYXXgOH.js";import"./useInfiniteQuery-B9Uzzuq-.js";import"./use-infinite-scroll-CKkim1QW.js";import"./use-connection-G0MWfeF4.js";import"./table-BHPFDuYO.js";import"./empty-state-CBVYWgXH.js";import"./use-members-4PIyDy5T.js";import"./use-org-auth-client-umGZ2fB_.js";import"./use-automations-CvP7MmXu.js";import"./useSuspenseInfiniteQuery-2wSoxN5g.js";import"./avatar-T4HFdCsq.js";import"./format-time-BnbuEtat.js";import"./differenceInSeconds-NQ4PDo0z.js";import"./use-copy-DF3dMdXF.js";import"./markdown-IvxHRyNi.js";import"./monaco-editor-DOxRkV0B.js";import"./spinner-2YrjsZ0k.js";import"./editor-Ci6UfGD4.js";import"./types-CN4C807w.js";import"./shell-layout-Bbu9US5Y.js";import"./required-auth-layout-BzolNhCo.js";import"./use-org-sso--Yt5VHFo.js";import"./integration-icon-BuLRi6Ml.js";import"./use-navigate-to-agent-C_6QH1UK.js";import"./chart-DJU2IjAo.js";import"./index-Chg16cvM.js";import"./AreaChart-pHg9Fx4q.js";import"./form-BS9U3FXJ.js";import"./file-type-icon-BL0Pha35.js";import"./drawer-ByuY_14m.js";import"./collection-search-C3ITf4PL.js";import"./tabs-B0ILtoA9.js";import"./toggle-group-B-U60nZB.js";import"./super-agent-icon-BzeHQLgI.js";import"./self-tool-result-CUY8lXfh.js";import"./alert-dialog-O_BHWaSR.js";import"./extract-connection-data-qRGJBXXK.js";import"./metadata-dUsYcpuu.js";import"./provision-repo-scoped-github-connection-CMPWtdMv.js";import"./use-debounced-value-C6w6Kc_A.js";import"./authenticate-and-persist-oauth-CVuk8U7C.js";import"./mcp-oauth-BmtUTIZx.js";import"./track-BCBM0lu5.js";import"./popover-B3OuMlKR.js";import"./toolbar-D_EEp8Mj.js";import"./github-repo-picker-la7DJEBj.js";import"./use-mcp-tools-CtmU8Aal.js";import"./agent-capabilities-B52k7xCe.js";import"./connection-card-DZL8U2Oz.js";import"./use-registry-connections-2CgUfim7.js";import"./retry-CErkP7V6.js";import"./connection-slug-CITJ0kGN.js";import"./connection-form-helpers-BehosOAh.js";import"./collection-tabs-IptzBr8k.js";import"./badge-EiflaT_K.js";import"./select-model-BI5n0fdt.js";import"./checkbox-B1YhjCUq.js";import"./ai-providers-logos-DD3qZ33J.js";import"./folder-icon-C0l5GzKL.js";import"./dropdown-menu-DOvmqsiG.js";import"./question-004-sINsf4GQ.js";import"./use-status-sounds-BDhzi_jI.js";import"./skill-preview-Dx0wyioV.js";import"./use-file-configs-d52rl_fd.js";import"./pt-BR-CLy76QW2.js";import"./use-debounced-autosave-DX7KGPEc.js";import"./scroll-area-CmfbQ0k6.js";import"./search-input-B5IlyOHK.js";import"./use-mcp-auth-status-BeiIWrik.js";import"./switch-C8ESSGPB.js";import"./use-secrets-DNcXH1YU.js";import"./config-DlJwhwZM.js";import"./command-DQkOmuVt.js";import"./index-9AjWL1kY.js";import"./get-initials-D-f_fDFw.js";import"./breadcrumb-B0yqAhd6.js";import"./use-tags-DJgPmiFD.js";import"./automation-list-row-B2WvcnD2.js";import"./site-error--i37Vnuw.js";import"./use-org-repo-syncs-CmtgcHJE.js";import"./cards-Dgq9R2-4.js";const U={authors:[{key:"name",labelKey:"sandbox.recordEditor.fieldName",widget:"text"},{key:"type",labelKey:"sandbox.recordEditor.fieldType",widget:"select",options:[{value:"Person",labelKey:"sandbox.recordEditor.optionPerson"},{value:"Organization",labelKey:"sandbox.recordEditor.optionOrganization"}]},{key:"email",labelKey:"sandbox.recordEditor.fieldEmail",widget:"text",placeholderKey:"sandbox.recordEditor.placeholderEmail"},{key:"jobTitle",labelKey:"sandbox.recordEditor.fieldJobTitle",widget:"text"},{key:"company",labelKey:"sandbox.recordEditor.fieldCompany",widget:"text"},{key:"avatar",labelKey:"sandbox.recordEditor.fieldAvatar",widget:"image"}]},W={authors:"sandbox.recordEditor.titleAuthor"};function Zr(I){const t=B.c(39),{orgSlug:E,virtualMcpId:K,branch:w,kind:a,blockKey:b,block:f}=I,i=L();let h;t[0]!==w||t[1]!==E||t[2]!==K?(h={orgSlug:E,virtualMcpId:K,branch:w},t[0]=w,t[1]=E,t[2]=K,t[3]=h):h=t[3];const p=M(h);let g;t[4]!==f||t[5]!==a?(g=$(f,a),t[4]=f,t[5]=a,t[6]=g):g=t[6];const C=g;let k;t[7]!==b||t[8]!==a||t[9]!==p?(k=l=>{p.mutate({blockKey:b,data:G(b,a,l)})},t[7]=b,t[8]=a,t[9]=p,t[10]=k):k=t[10];const[e,S]=Q(C,k);let v;t[11]!==e||t[12]!==S?(v=(l,o)=>S({...e,[l]:o}),t[11]=e,t[12]=S,t[13]=v):v=t[13];const s=v,N=W[a];let n;t[14]!==i||t[15]!==N?(n=i(N),t[14]=i,t[15]=N,t[16]=n):n=t[16];let c;t[17]!==n?(c=r.jsx("span",{className:"text-sm font-medium",children:n}),t[17]=n,t[18]=c):c=t[18];let d;t[19]!==p.isError||t[20]!==p.isPending?(d=r.jsx(q,{isPending:p.isPending,isError:p.isError}),t[19]=p.isError,t[20]=p.isPending,t[21]=d):d=t[21];let y;t[22]!==c||t[23]!==d?(y=r.jsxs("div",{className:"flex h-12 shrink-0 items-center justify-between border-b px-6",children:[c,d]}),t[22]=c,t[23]=d,t[24]=y):y=t[24];const T=U[a];let x;if(t[25]!==e||t[26]!==s||t[27]!==i||t[28]!==T){let l;t[30]!==e||t[31]!==s||t[32]!==i?(l=o=>r.jsx("div",{className:"space-y-2",children:o.widget==="image"?r.jsx(H,{schema:{type:"string",format:"image-uri",title:i(o.labelKey)},value:e[o.key],onChange:m=>s(o.key,m),path:o.key,label:i(o.labelKey)}):o.widget==="select"?r.jsxs(r.Fragment,{children:[r.jsx(F,{htmlFor:o.key,children:i(o.labelKey)}),r.jsxs(A,{value:P(e[o.key])||o.options?.[0]?.value,onValueChange:m=>s(o.key,m),children:[r.jsx(R,{id:o.key,className:"h-10 w-full",children:r.jsx(O,{placeholder:i(o.labelKey)})}),r.jsx(V,{children:(o.options??[]).map(m=>r.jsx(D,{value:m.value,children:i(m.labelKey)},m.value))})]})]}):r.jsxs(r.Fragment,{children:[r.jsx(F,{htmlFor:o.key,children:i(o.labelKey)}),o.widget==="textarea"?r.jsx(J,{id:o.key,value:P(e[o.key]),onChange:m=>s(o.key,m.target.value),rows:3}):r.jsx(z,{id:o.key,value:P(e[o.key]),placeholder:o.placeholderKey?i(o.placeholderKey):void 0,onChange:m=>s(o.key,m.target.value),className:"h-10"})]})},o.key),t[30]=e,t[31]=s,t[32]=i,t[33]=l):l=t[33],x=T.map(l),t[25]=e,t[26]=s,t[27]=i,t[28]=T,t[29]=x}else x=t[29];let u;t[34]!==x?(u=r.jsx("div",{className:"min-w-0 flex-1 overflow-y-auto px-6 py-6",children:r.jsx("div",{className:"mx-auto max-w-xl space-y-6",children:x})}),t[34]=x,t[35]=u):u=t[35];let j;return t[36]!==u||t[37]!==y?(j=r.jsxs("div",{className:"flex h-full flex-col",children:[y,u]}),t[36]=u,t[37]=y,t[38]=j):j=t[38],j}export{Zr as RecordEditor};
@@ -1,2 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/registry-layout-1EeeGV1e.js","assets/index-BZVho9-x.js","assets/index-DZ3ZDC5F.css","assets/Tool02-DOXsydL5.js","assets/CheckCircle-BuxJYUrk.js","assets/Settings02-DKIynolO.js","assets/use-mcp-client-CMS2aS7J.js","assets/constants-dLUUoWH7.js","assets/auth-97Xd2KQD.js","assets/useInfiniteQuery-B9Uzzuq-.js","assets/use-infinite-scroll-CKkim1QW.js","assets/badge-EiflaT_K.js","assets/input-DIJTuAiI.js","assets/dropdown-menu-DOvmqsiG.js","assets/Check-C2opEhYm.js","assets/ChevronRight-DofQuep9.js","assets/DotsVertical-Dl2a4pwB.js","assets/table-BHPFDuYO.js","assets/toggle-group-B-U60nZB.js","assets/use-view-mode-ADBenRd-.js","assets/FilterLines-C90xQoMG.js","assets/Globe01-CG410Az0.js","assets/SearchMd-CO8ah3bm.js","assets/dialog-Dje85m6l.js","assets/AlertCircle-CkzV0rLF.js","assets/Download01-D5_gKwhP.js","assets/Upload01-x2XapLpM.js","assets/metadata-dUsYcpuu.js","assets/alert-dialog-O_BHWaSR.js","assets/Trash01-CsCWSj3Z.js","assets/label-1eNt2dYG.js","assets/select-W5fEmgO1.js","assets/ChevronDown-Bueer4qU.js","assets/ChevronUp-BKRDLJov.js","assets/switch-C8ESSGPB.js","assets/textarea-Buvn72cT.js","assets/ArrowLeft-Dm5_VLV8.js","assets/XCircle-ByLTULyg.js","assets/checkbox-B1YhjCUq.js","assets/Eye-DtRvnPj3.js","assets/LinkExternal01-D5ZZVcoA.js","assets/use-copy-DF3dMdXF.js","assets/Copy01-ynzmMJf5.js","assets/Key01-N_ZWYtTX.js","assets/Plus-DIm7CtF1.js","assets/mcp-oauth-BmtUTIZx.js","assets/Play-C96cznrL.js"])))=>i.map(i=>d[i]);
2
- import{c as i,j as e,r as s,k as a,bq as o}from"./index-BZVho9-x.js";import{R as n}from"./require-capability-BFWk0jAl.js";import"./access-gate-Dhqfvmrb.js";import"./capability-load-error-D6yRI_bf.js";const c=s.lazy(()=>o(()=>import("./registry-layout-1EeeGV1e.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46])));function u(){const r=i.c(1);let t;return r[0]===Symbol.for("react.memo_cache_sentinel")?(t=e.jsx(n,{capability:"registry:manage",area:"the registry",children:e.jsx(s.Suspense,{fallback:e.jsx("div",{className:"flex-1 flex items-center justify-center",children:e.jsx(a,{size:20,className:"animate-spin text-muted-foreground"})}),children:e.jsx(c,{})})}),r[0]=t):t=r[0],t}export{u as default};
@@ -1,2 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/registry-layout-1EeeGV1e.js","assets/index-BZVho9-x.js","assets/index-DZ3ZDC5F.css","assets/Tool02-DOXsydL5.js","assets/CheckCircle-BuxJYUrk.js","assets/Settings02-DKIynolO.js","assets/use-mcp-client-CMS2aS7J.js","assets/constants-dLUUoWH7.js","assets/auth-97Xd2KQD.js","assets/useInfiniteQuery-B9Uzzuq-.js","assets/use-infinite-scroll-CKkim1QW.js","assets/badge-EiflaT_K.js","assets/input-DIJTuAiI.js","assets/dropdown-menu-DOvmqsiG.js","assets/Check-C2opEhYm.js","assets/ChevronRight-DofQuep9.js","assets/DotsVertical-Dl2a4pwB.js","assets/table-BHPFDuYO.js","assets/toggle-group-B-U60nZB.js","assets/use-view-mode-ADBenRd-.js","assets/FilterLines-C90xQoMG.js","assets/Globe01-CG410Az0.js","assets/SearchMd-CO8ah3bm.js","assets/dialog-Dje85m6l.js","assets/AlertCircle-CkzV0rLF.js","assets/Download01-D5_gKwhP.js","assets/Upload01-x2XapLpM.js","assets/metadata-dUsYcpuu.js","assets/alert-dialog-O_BHWaSR.js","assets/Trash01-CsCWSj3Z.js","assets/label-1eNt2dYG.js","assets/select-W5fEmgO1.js","assets/ChevronDown-Bueer4qU.js","assets/ChevronUp-BKRDLJov.js","assets/switch-C8ESSGPB.js","assets/textarea-Buvn72cT.js","assets/ArrowLeft-Dm5_VLV8.js","assets/XCircle-ByLTULyg.js","assets/checkbox-B1YhjCUq.js","assets/Eye-DtRvnPj3.js","assets/LinkExternal01-D5ZZVcoA.js","assets/use-copy-DF3dMdXF.js","assets/Copy01-ynzmMJf5.js","assets/Key01-N_ZWYtTX.js","assets/Plus-DIm7CtF1.js","assets/mcp-oauth-BmtUTIZx.js","assets/Play-C96cznrL.js"])))=>i.map(i=>d[i]);
2
- import{c as n,d as c,f as m,j as t,k as f,r as l,bq as p}from"./index-BZVho9-x.js";import{R as u}from"./require-capability-BFWk0jAl.js";import"./access-gate-Dhqfvmrb.js";import"./capability-load-error-D6yRI_bf.js";const g=l.lazy(()=>p(()=>import("./registry-layout-1EeeGV1e.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46])));function h(){const e=n.c(5),i=c();let s;e[0]===Symbol.for("react.memo_cache_sentinel")?(s={from:"/shell/$org"},e[0]=s):s=e[0];const{org:o}=m(s);let r;e[1]===Symbol.for("react.memo_cache_sentinel")?(r=t.jsx("div",{className:"h-full flex items-center justify-center",children:t.jsx(f,{size:20,className:"animate-spin text-muted-foreground"})}),e[1]=r):r=e[1];let a;return e[2]!==i||e[3]!==o?(a=t.jsx(u,{capability:"registry:manage",area:"the registry",children:t.jsx(l.Suspense,{fallback:r,children:t.jsx(g,{onBack:()=>i({to:"/$org/settings/store",params:{org:o}})})})}),e[2]=i,e[3]=o,e[4]=a):a=e[4],a}export{h as default};
@@ -1 +0,0 @@
1
- import{I as u}from"./use-infinite-scroll-CKkim1QW.js";import{fg as i}from"./index-BZVho9-x.js";function t(e,r){return i(e,u,r)}export{t as u};
@@ -1 +0,0 @@
1
- import{I as s}from"./use-infinite-scroll-CKkim1QW.js";import{fg as u,b$ as n}from"./index-BZVho9-x.js";function a(r,e){return u({...r,enabled:!0,suspense:!0,throwOnError:n},s,e)}export{a as u};