decocms 4.297.5 → 4.297.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/assets/{AlertCircle-_dKQYyLm.js → AlertCircle-Dp6ZlZYR.js} +1 -1
- package/dist/client/assets/{AreaChart-Br4AURer.js → AreaChart-CLIsSolL.js} +1 -1
- package/dist/client/assets/{ArrowLeft-CTckNarV.js → ArrowLeft-DcwBClUS.js} +1 -1
- package/dist/client/assets/{ArrowUp-DI6O-me7.js → ArrowUp-he2sU4Sr.js} +1 -1
- package/dist/client/assets/{Check-Dx6Jilyu.js → Check-07BNkESk.js} +1 -1
- package/dist/client/assets/{CheckCircle-D9s0Miro.js → CheckCircle-D0NiMcGY.js} +1 -1
- package/dist/client/assets/{ChevronDown-C4geT7hd.js → ChevronDown-DhOyrBbL.js} +1 -1
- package/dist/client/assets/{ChevronRight-BrJIIvGQ.js → ChevronRight-Cv2J3rWD.js} +1 -1
- package/dist/client/assets/{ChevronSelectorVertical-Dd-tJPH5.js → ChevronSelectorVertical-CsgsXPiX.js} +1 -1
- package/dist/client/assets/{ChevronUp-BkSDpS0a.js → ChevronUp-YHn02fNr.js} +1 -1
- package/dist/client/assets/{Copy01-DAXdkrcq.js → Copy01-CmIcrSa6.js} +1 -1
- package/dist/client/assets/{CreditCard01-DY2ollJ7.js → CreditCard01-CIhTHldk.js} +1 -1
- package/dist/client/assets/{DotsVertical-G8Mz1cUi.js → DotsVertical--3-_GzX9.js} +1 -1
- package/dist/client/assets/{Download01-BXb_GLPB.js → Download01-toNys3fD.js} +1 -1
- package/dist/client/assets/{Eye-opJVAUIw.js → Eye-DTjOHr1S.js} +1 -1
- package/dist/client/assets/{FilterLines-BdTkKIdO.js → FilterLines-MpMMN0by.js} +1 -1
- package/dist/client/assets/{Globe01-CcwZYK5w.js → Globe01-CAdoRaMK.js} +1 -1
- package/dist/client/assets/{Globe04-BEpeirqG.js → Globe04-nAO-wIKX.js} +1 -1
- package/dist/client/assets/{HardDrive-BULz-Uit.js → HardDrive-C0hN27ts.js} +1 -1
- package/dist/client/assets/{Key01-DjAus05D.js → Key01-wRDbp013.js} +1 -1
- package/dist/client/assets/{LinkExternal01-Cl9BJIic.js → LinkExternal01-DDRldwTf.js} +1 -1
- package/dist/client/assets/{LockUnlocked01-DCNThh5w.js → LockUnlocked01-CdQhQaHo.js} +1 -1
- package/dist/client/assets/{LogOut01-C8yxFbDK.js → LogOut01-CnFpkvWe.js} +1 -1
- package/dist/client/assets/{Monitor01-Cws_hyK1.js → Monitor01-DalysQsB.js} +1 -1
- package/dist/client/assets/{Palette-DJquTsKt.js → Palette-D-kLCHzw.js} +1 -1
- package/dist/client/assets/{Play-BJig3Hma.js → Play-Ba4OZRO0.js} +1 -1
- package/dist/client/assets/{Plus-DplAwTzu.js → Plus-Cr5CpNvW.js} +1 -1
- package/dist/client/assets/{SearchLg-DKfDlf2B.js → SearchLg-BD9EVt5N.js} +1 -1
- package/dist/client/assets/{SearchMd-WwqLArcb.js → SearchMd-BnpHcTtG.js} +1 -1
- package/dist/client/assets/{Settings02-DKqJklo6.js → Settings02-CIRSyyiS.js} +1 -1
- package/dist/client/assets/{Share07-BFNMphwZ.js → Share07-G9fx3Q9L.js} +1 -1
- package/dist/client/assets/{Shield01-DkQ3-Wuh.js → Shield01-DOrHTNkg.js} +1 -1
- package/dist/client/assets/{Stars01-WAIDqPTc.js → Stars01-75kZesHq.js} +1 -1
- package/dist/client/assets/{Stars02-Bz7g2T3T.js → Stars02-D5uaU5zd.js} +1 -1
- package/dist/client/assets/{Sun-Bb3k_JiI.js → Sun-Bz3jRIqc.js} +1 -1
- package/dist/client/assets/{SwitchHorizontal01-D1IHpvoh.js → SwitchHorizontal01-BtFl3JWf.js} +1 -1
- package/dist/client/assets/{Tool01-BvO-aJRz.js → Tool01-VmLtH0nt.js} +1 -1
- package/dist/client/assets/{Tool02-Um8w3S00.js → Tool02-CLP5V5w_.js} +1 -1
- package/dist/client/assets/{Trash01-D1j2us9_.js → Trash01-B_i3PMbq.js} +1 -1
- package/dist/client/assets/{TrendUp01-D-pYOI27.js → TrendUp01-DiRmR7Jx.js} +1 -1
- package/dist/client/assets/{Upload01-lKTwpNsL.js → Upload01-4W6462bd.js} +1 -1
- package/dist/client/assets/{User01-CzaJZtDP.js → User01-acLUirHu.js} +1 -1
- package/dist/client/assets/{UserSquare-I8KZDiP3.js → UserSquare-CD6rB0Mt.js} +1 -1
- package/dist/client/assets/{Users01-Bb1Odrhe.js → Users01-CPikD5PC.js} +1 -1
- package/dist/client/assets/{Users03-D_Qzpo0w.js → Users03-DM6R-U2Y.js} +1 -1
- package/dist/client/assets/{XCircle-DWwaGX-T.js → XCircle-nx54qiA1.js} +1 -1
- package/dist/client/assets/{XClose-BoczrFtB.js → XClose-DWRp5M8X.js} +1 -1
- package/dist/client/assets/{YAxis-Y9IBklIh.js → YAxis-Blx93tnj.js} +1 -1
- package/dist/client/assets/{Zap-C_cEZtR5.js → Zap-DJCvDwma.js} +1 -1
- package/dist/client/assets/{ZapSquare-CmW3PzOh.js → ZapSquare-7BZcnvlP.js} +1 -1
- package/dist/client/assets/{access-gate-Btqq7-3X.js → access-gate-BqJfgvia.js} +1 -1
- package/dist/client/assets/{agent-icon-Bm0mBNmu.js → agent-icon-DbEHgX-P.js} +1 -1
- package/dist/client/assets/{agents-list-Bz-4iej6.js → agents-list-u3uKfJUZ.js} +1 -1
- package/dist/client/assets/{ai-providers-Ch3me05c.js → ai-providers-BRMGsfAO.js} +1 -1
- package/dist/client/assets/{alert-t9hKa1GN.js → alert-87ZoISUI.js} +1 -1
- package/dist/client/assets/{alert-dialog-DY_67i8D.js → alert-dialog-BUuk5lcR.js} +1 -1
- package/dist/client/assets/{api-keys-V0eYDBvn.js → api-keys-D70DMJZx.js} +1 -1
- package/dist/client/assets/{app-editor-3h5fdupo.js → app-editor-D97p-uts.js} +1 -1
- package/dist/client/assets/{auth-D8BzOPfU.js → auth-BjjAKPdO.js} +1 -1
- package/dist/client/assets/{auth-catchall-lzuTWWYn.js → auth-catchall-DLNpdPYX.js} +1 -1
- package/dist/client/assets/{auth-entry-b8Y7eCFF.js → auth-entry-uAAYHr0C.js} +1 -1
- package/dist/client/assets/{auth-split-layout-DfWPYe89.js → auth-split-layout-BfI9c-zJ.js} +1 -1
- package/dist/client/assets/{authenticate-and-persist-oauth-14DQJW7S.js → authenticate-and-persist-oauth-BpIYdUlz.js} +1 -1
- package/dist/client/assets/{automation-list-row-BsalfBXm.js → automation-list-row-BTLGh__Y.js} +1 -1
- package/dist/client/assets/{automation-runs-DE9VSUhn.js → automation-runs-Dt5duQ0J.js} +1 -1
- package/dist/client/assets/{automations-BvPtowk4.js → automations-CROR6ZNT.js} +1 -1
- package/dist/client/assets/{avatar-CYKYYtZa.js → avatar-BS-tEYCe.js} +1 -1
- package/dist/client/assets/{badge-C1elUCLo.js → badge-CFRe-nD1.js} +1 -1
- package/dist/client/assets/{block-document-CcYvo27W.js → block-document-DLPEnvuu.js} +1 -1
- package/dist/client/assets/{breadcrumb-BXE_nF_r.js → breadcrumb-2i2x9k0L.js} +1 -1
- package/dist/client/assets/{buckets-DA_r918X.js → buckets-BSoW2eqi.js} +1 -1
- package/dist/client/assets/{bulk-category-panel-DM-IOghT.js → bulk-category-panel-Cc_OMOog.js} +1 -1
- package/dist/client/assets/{capability-load-error-BaKYKM-d.js → capability-load-error-COL43_Mx.js} +1 -1
- package/dist/client/assets/{cards-CiLBDj3F.js → cards-DYEOYym-.js} +1 -1
- package/dist/client/assets/{category-editor-BNcSqgPW.js → category-editor-CPMdxySY.js} +1 -1
- package/dist/client/assets/{chart-BimnkeiK.js → chart-BhO82AZ9.js} +1 -1
- package/dist/client/assets/{chat-context-z1n7Mvsc.js → chat-context-BEqsjQmO.js} +1 -1
- package/dist/client/assets/{checkbox-BLQwT4c5.js → checkbox-D5nOQ93h.js} +1 -1
- package/dist/client/assets/{choose-editor-NuXPws_0.js → choose-editor-Bl4ixlsS.js} +1 -1
- package/dist/client/assets/{cli-auth-success-Dofvym4S.js → cli-auth-success-DHoExdJx.js} +1 -1
- package/dist/client/assets/{collection-detail-BXt_415y.js → collection-detail-CxCCExnM.js} +1 -1
- package/dist/client/assets/{collection-display-button-DOWt7Yw-.js → collection-display-button-PH5obTEl.js} +1 -1
- package/dist/client/assets/{collection-search-Bn9IJGT5.js → collection-search-_icrgZY2.js} +1 -1
- package/dist/client/assets/{collection-table-wrapper-BvHvi5W2.js → collection-table-wrapper-DUao6haA.js} +1 -1
- package/dist/client/assets/{collection-tabs-C_Plt4eY.js → collection-tabs-C9z-M1hW.js} +1 -1
- package/dist/client/assets/{command-DocuPiQB.js → command-Cr6yO9J6.js} +1 -1
- package/dist/client/assets/{commerce-onboarding-CiTn_n8b.js → commerce-onboarding-CPAGL1fF.js} +1 -1
- package/dist/client/assets/{config-CFrJB4k3.js → config-DjJwkqAh.js} +1 -1
- package/dist/client/assets/{connect-Ca21orjk.js → connect-CtKH97QE.js} +1 -1
- package/dist/client/assets/{connection-card-DJzzmdJa.js → connection-card-oGGVJVEj.js} +1 -1
- package/dist/client/assets/{connection-detail-DtmtoNno.js → connection-detail-B0gkC1Zi.js} +1 -1
- package/dist/client/assets/{connection-form-helpers-COjxkHTU.js → connection-form-helpers-GREUhGXH.js} +1 -1
- package/dist/client/assets/{connection-DeRdPQfN.js → connection-hAIey6c9.js} +1 -1
- package/dist/client/assets/{connections-PoKXlEr5.js → connections-Cr76VzkO.js} +1 -1
- package/dist/client/assets/{decopilot-sse-pool-CIsbpW60.js → decopilot-sse-pool-XTa9osf_.js} +1 -1
- package/dist/client/assets/{dialog-D9B8YUq0.js → dialog-Bw8jIxhH.js} +1 -1
- package/dist/client/assets/{domain-settings-DLt8E7za.js → domain-settings-DdYf0Rwz.js} +1 -1
- package/dist/client/assets/{drawer-IGxCcmhW.js → drawer-BFvmL2Y1.js} +1 -1
- package/dist/client/assets/{dropdown-menu-trkRQR5u.js → dropdown-menu-DP13EbUQ.js} +1 -1
- package/dist/client/assets/{empty-state-BagbYGYk.js → empty-state-V20uqIl7.js} +1 -1
- package/dist/client/assets/{extract-connection-data-DTKuu3uW.js → extract-connection-data-C40FHFBb.js} +1 -1
- package/dist/client/assets/{file-explorer-svpcOOYu.js → file-explorer-9Mlxcrfr.js} +1 -1
- package/dist/client/assets/{file-type-icon-BImZ4yGz.js → file-type-icon-BunvGKDc.js} +1 -1
- package/dist/client/assets/{form-DdcrlWMG.js → form-Co9Mo2GI.js} +1 -1
- package/dist/client/assets/{general-B0J2mS9n.js → general-DdBZ_dD-.js} +1 -1
- package/dist/client/assets/{github-repo-picker-BsNgTNpd.js → github-repo-picker-ChEu6h_O.js} +1 -1
- package/dist/client/assets/{hooks-DZlZk47y.js → hooks-pL2E-0zH.js} +1 -1
- package/dist/client/assets/{index-1ChrX-NZ.js → index-2L98sMK_.js} +1 -1
- package/dist/client/assets/{index-CU8H1ECu.js → index-BD4hER2u.js} +1 -1
- package/dist/client/assets/{index-BTRn8yLm.js → index-BrDSS0vH.js} +3 -3
- package/dist/client/assets/{index-CKX6jbl4.js → index-CH20ZECW.js} +1 -1
- package/dist/client/assets/{index-qdSW6F8F.js → index-Cj8ZZ4fT.js} +1 -1
- package/dist/client/assets/{index-DAs7sx9F.js → index-DotZRxLq.js} +1 -1
- package/dist/client/assets/{index-CPPVCYTR.js → index-DpPE5ISD.js} +1 -1
- package/dist/client/assets/{index-DhVzPBx8.js → index-PaLatgUv.js} +6 -6
- package/dist/client/assets/{index-Cxp8u-0t.js → index-S0YqkiQf.js} +1 -1
- package/dist/client/assets/{index-redirect-DENqiKOe.js → index-redirect-CC2Sa-aj.js} +1 -1
- package/dist/client/assets/{infra-billing-BYssFvIs.js → infra-billing-ZonDjQey.js} +1 -1
- package/dist/client/assets/{input-B9Q64Q29.js → input-CG2BXvBG.js} +1 -1
- package/dist/client/assets/{integration-icon-CqMRHU_a.js → integration-icon-DNJlj9SH.js} +1 -1
- package/dist/client/assets/{invite-member-dialog-Dn4IAUK2.js → invite-member-dialog-BtV1hFV0.js} +1 -1
- package/dist/client/assets/{label-BrYhPu77.js → label-DO8rqj8R.js} +1 -1
- package/dist/client/assets/{layout-6imak1bs.js → layout-CvyGinSF.js} +1 -1
- package/dist/client/assets/{login-bZEIHxWO.js → login-BXwH6k7w.js} +1 -1
- package/dist/client/assets/{mcp-oauth-JNMVR7nj.js → mcp-oauth-CTPC1gLp.js} +1 -1
- package/dist/client/assets/{members-BDFlTHSU.js → members-D7maqetW.js} +1 -1
- package/dist/client/assets/{monaco-editor-DBOIld70.js → monaco-editor-DeCGAxQs.js} +1 -1
- package/dist/client/assets/{monitoring-stats-row-BTO2RjKc.js → monitoring-stats-row-B6LpZc_k.js} +1 -1
- package/dist/client/assets/{multi-select-DS1S2iFF.js → multi-select-DXNwV172.js} +1 -1
- package/dist/client/assets/{oauth-callback-sud7yA57.js → oauth-callback-CEKSqYcn.js} +1 -1
- package/dist/client/assets/{oauth-callback-ai-provider-DJysmHBZ.js → oauth-callback-ai-provider-DUIbaTiW.js} +1 -1
- package/dist/client/assets/{onboarding-B89NhuNo.js → onboarding-DEwiMojw.js} +1 -1
- package/dist/client/assets/{org-layout-y-wgo3lk.js → org-layout-DMMr4dJ0.js} +1 -1
- package/dist/client/assets/{organization-choice-n5LXYsp6.js → organization-choice-Dk_FX4P6.js} +1 -1
- package/dist/client/assets/{orgs-ggeMeO4b.js → orgs-Di6SKByT.js} +1 -1
- package/dist/client/assets/{page-seo-form-MwfvT2cu.js → page-seo-form-DlHjGiwH.js} +1 -1
- package/dist/client/assets/{popover-BdLEPYkg.js → popover-Bv7C0yQo.js} +1 -1
- package/dist/client/assets/{post-calendar-BQHzjF2q.js → post-calendar-Cxd75fx7.js} +1 -1
- package/dist/client/assets/{post-editor-QRl0Sagr.js → post-editor-Cg-zq355.js} +1 -1
- package/dist/client/assets/{primitives-6WK_sR50.js → primitives-CgbIYl4-.js} +1 -1
- package/dist/client/assets/{profile-CeXku40U.js → profile-CdeZVVAJ.js} +1 -1
- package/dist/client/assets/{project-app-view-Bamps5mp.js → project-app-view-DL0bWcLc.js} +1 -1
- package/dist/client/assets/{prompts-CSI9UdFJ.js → prompts-IHTaxT_o.js} +1 -1
- package/dist/client/assets/record-editor-TEY7fcTW.js +1 -0
- package/dist/client/assets/{redirect-editor-XNrrauEJ.js → redirect-editor-TBzcW6tr.js} +1 -1
- package/dist/client/assets/registry-DhYngTg1.js +2 -0
- package/dist/client/assets/{registry-layout-BEh7PoWm.js → registry-layout-CZIbrMOo.js} +1 -1
- package/dist/client/assets/{reports-BoQbVwsq.js → reports-CJrbJ-aD.js} +1 -1
- package/dist/client/assets/{require-capability-Dgl1K9kd.js → require-capability-10i6vpoS.js} +1 -1
- package/dist/client/assets/{required-auth-layout-fHFPe37p.js → required-auth-layout-C3Ofr9_V.js} +1 -1
- package/dist/client/assets/{reset-password-CND6xVOj.js → reset-password-CIrEuZXd.js} +1 -1
- package/dist/client/assets/{review-settings-bbWlNJ4z.js → review-settings-SSNM19fg.js} +1 -1
- package/dist/client/assets/{roles-Dd7V2wdR.js → roles-C6FlHdCA.js} +1 -1
- package/dist/client/assets/{scroll-area-B__HV5_s.js → scroll-area-C1ovkzqz.js} +1 -1
- package/dist/client/assets/{search-input-QsS8qM0_.js → search-input-CGMH8IA5.js} +1 -1
- package/dist/client/assets/{secrets-D27TPpeq.js → secrets-4alwTWuf.js} +1 -1
- package/dist/client/assets/{sections-editor-_166VgKv.js → sections-editor-C6zith-E.js} +1 -1
- package/dist/client/assets/{select-DzzbmWa-.js → select-DpcwZ72F.js} +1 -1
- package/dist/client/assets/{select-model-WSwYwLFN.js → select-model-BI-dA8gZ.js} +1 -1
- package/dist/client/assets/{self-tool-result-BH7zYU5J.js → self-tool-result-DCxhe8ja.js} +1 -1
- package/dist/client/assets/{seo-editor-BQugaBLO.js → seo-editor-C7gzHB1I.js} +1 -1
- package/dist/client/assets/{settings-layout-CIovajcW.js → settings-layout-DkAZTQ2a.js} +1 -1
- package/dist/client/assets/{shell-controls-BFmzMpcf.js → shell-controls-wcxv3dCy.js} +1 -1
- package/dist/client/assets/{shell-layout-DgzMjG_g.js → shell-layout-63QoGcpp.js} +1 -1
- package/dist/client/assets/{spinner-Bm_hTWFz.js → spinner-CuCGw0zq.js} +1 -1
- package/dist/client/assets/{sso-NnsFLHgi.js → sso-BvJ-0huH.js} +1 -1
- package/dist/client/assets/{store-mhkHFkpg.js → store-BP5AR9Ic.js} +1 -1
- package/dist/client/assets/store-registry-Biov3Lnl.js +2 -0
- package/dist/client/assets/{super-agent-icon-7Ukfr6bc.js → super-agent-icon-GgzP8ta8.js} +1 -1
- package/dist/client/assets/{switch-uKoBYqyg.js → switch--ZlKCa-F.js} +1 -1
- package/dist/client/assets/{synced-repos-DzxugRrm.js → synced-repos-C_5rDao7.js} +1 -1
- package/dist/client/assets/{table-D-jgMVGz.js → table-BipKiwEL.js} +1 -1
- package/dist/client/assets/{tabs-DDIxVoHb.js → tabs-CKMDW8vU.js} +1 -1
- package/dist/client/assets/{task-board-qKQWRm20.js → task-board-Dp7JXy98.js} +1 -1
- package/dist/client/assets/{tasks-DVMsPLA_.js → tasks-DRGb0eLU.js} +1 -1
- package/dist/client/assets/{textarea-BVnIs1Lw.js → textarea-BoTumDit.js} +1 -1
- package/dist/client/assets/{toggle-group-B1ycOPkn.js → toggle-group-zLUBlOPI.js} +1 -1
- package/dist/client/assets/{toolbar-DrAJ1hMc.js → toolbar-Dk5WFAot.js} +1 -1
- package/dist/client/assets/{track-Ti4l0BMG.js → track-B0Yrx2v1.js} +1 -1
- package/dist/client/assets/{types-V8BEN32x.js → types-rth0od0M.js} +1 -1
- package/dist/client/assets/{use-ai-providers-VnHj1RvS.js → use-ai-providers-CxY1HQ0n.js} +1 -1
- package/dist/client/assets/{use-api-keys-CWhEZZIl.js → use-api-keys-ej0l_Wa_.js} +1 -1
- package/dist/client/assets/{use-automations-EMCvEash.js → use-automations-tkJpD40-.js} +1 -1
- package/dist/client/assets/{use-autosave-WGhfzLOa.js → use-autosave-Bo6QQt-2.js} +1 -1
- package/dist/client/assets/{use-connection-08hpR6qS.js → use-connection-CigRkG_8.js} +1 -1
- package/dist/client/assets/{use-copy--NTZaUPq.js → use-copy-CM2jC_7i.js} +1 -1
- package/dist/client/assets/{use-create-virtual-mcp-CFZ2nSQA.js → use-create-virtual-mcp-EWwwwVz_.js} +1 -1
- package/dist/client/assets/{use-debounced-autosave-CI3PX6ch.js → use-debounced-autosave-crX_AMVn.js} +1 -1
- package/dist/client/assets/{use-debounced-value-BeOljBqX.js → use-debounced-value-DWJO8nvY.js} +1 -1
- package/dist/client/assets/{use-decopilot-events-CLCNDljy.js → use-decopilot-events-C0F2SQd9.js} +1 -1
- package/dist/client/assets/{use-delete-connection-Ba6MOgeg.js → use-delete-connection-BYaP7eW8.js} +1 -1
- package/dist/client/assets/{use-deployment-admin-CBUm01nq.js → use-deployment-admin-DD08Dk6l.js} +1 -1
- package/dist/client/assets/{use-destination-route-qnDA60ks.js → use-destination-route-D-tMiU7z.js} +1 -1
- package/dist/client/assets/{use-file-configs-D5W3ysgO.js → use-file-configs-CS0ZXqXi.js} +1 -1
- package/dist/client/assets/{use-infinite-scroll-CFHj-DEA.js → use-infinite-scroll-mm-iRnP3.js} +1 -1
- package/dist/client/assets/{use-join-requests-CLmH1kQW.js → use-join-requests-CsEZPmjA.js} +1 -1
- package/dist/client/assets/{use-mcp-auth-status-DeG0R3iT.js → use-mcp-auth-status-C4AweF_A.js} +1 -1
- package/dist/client/assets/{use-mcp-client-CLbu-qTW.js → use-mcp-client-Bvg7XHk9.js} +1 -1
- package/dist/client/assets/{use-mcp-tools-BZuie7xe.js → use-mcp-tools-QHHoZ2b5.js} +1 -1
- package/dist/client/assets/{use-members-I61j4Bg0.js → use-members-dnCEd_I-.js} +1 -1
- package/dist/client/assets/{use-navigate-to-agent-BenTIjx1.js → use-navigate-to-agent-DgDtQ7iN.js} +1 -1
- package/dist/client/assets/{use-org-auth-client-CfCWX5xw.js → use-org-auth-client-cQ44YMKg.js} +1 -1
- package/dist/client/assets/{use-org-repo-syncs-JMXTBQ5z.js → use-org-repo-syncs-CTap8mHN.js} +1 -1
- package/dist/client/assets/{use-org-sso-CvRPBMtq.js → use-org-sso-C9uxUHvy.js} +1 -1
- package/dist/client/assets/{use-organization-roles-C8et_n2k.js → use-organization-roles-D5IggfUv.js} +1 -1
- package/dist/client/assets/{use-organization-settings-vq5Gp8qn.js → use-organization-settings-B5x_2l31.js} +1 -1
- package/dist/client/assets/{use-panel-navigate-DAo-IaMv.js → use-panel-navigate-BPSosfvG.js} +1 -1
- package/dist/client/assets/{use-registry-connections-BEAIbWtg.js → use-registry-connections-DNfmYK-s.js} +1 -1
- package/dist/client/assets/{use-secrets-gYiFcE--.js → use-secrets-DuRMdB6_.js} +1 -1
- package/dist/client/assets/{use-section-preview-base-tDIjGvnW.js → use-section-preview-base-BFNeWLDp.js} +1 -1
- package/dist/client/assets/{use-status-sounds-DfVtBshF.js → use-status-sounds-B7qbfIHU.js} +1 -1
- package/dist/client/assets/{use-tags-C7utoOLS.js → use-tags-CJoE7Mdv.js} +1 -1
- package/dist/client/assets/{use-view-mode-DanQlbJE.js → use-view-mode-BDsVnHNu.js} +1 -1
- package/dist/client/assets/{use-virtual-mcp-B6XJTyzc.js → use-virtual-mcp-DmXgREYQ.js} +1 -1
- package/dist/client/assets/useInfiniteQuery-KYE-CFE3.js +1 -0
- package/dist/client/assets/useSuspenseInfiniteQuery-BO9Wr8TN.js +1 -0
- package/dist/client/assets/{users-Z1TG0oPn.js → users-CSxyAh6H.js} +1 -1
- package/dist/client/assets/{variant-calendar-BUBtIHZL.js → variant-calendar-DHBUpFID.js} +1 -1
- package/dist/client/assets/{view-mode-toggle-I_KCAKl6.js → view-mode-toggle--pHeBkRS.js} +1 -1
- package/dist/client/index.html +1 -1
- package/dist/server/cli.js +2 -2
- package/dist/server/server.js +2 -2
- package/package.json +1 -1
- package/dist/client/assets/record-editor-Bo-hHNi9.js +0 -1
- package/dist/client/assets/registry-BmqhOmKk.js +0 -2
- package/dist/client/assets/store-registry-CxC5WexV.js +0 -2
- package/dist/client/assets/useInfiniteQuery-PGfyfehP.js +0 -1
- package/dist/client/assets/useSuspenseInfiniteQuery-CVgzVaXm.js +0 -1
package/dist/server/server.js
CHANGED
|
@@ -1408,7 +1408,7 @@ ${G}`.trim().slice(0,zF$)}function ZO4($){let Z=$.fields.priority?.name?.toLower
|
|
|
1408
1408
|
|
|
1409
1409
|
${O}`});if(!L)continue;try{await $.storage.jiraIntegrations.createCommentLink({commentId:L.id,organizationId:W,jiraCommentId:B.id})}catch(w){if(w.code==="23505"){await $.storage.taskBoard.deleteComment(L.id,W,hK);continue}throw w}}}class PF${ctx;organizationId;ids=new Map;constructor($,Z){this.ctx=$;this.organizationId=Z}async seed($){if($.length===0)return;let Z=await this.ctx.storage.sprints.upsertManyFromJira(this.organizationId,$.map(EF$));for(let[X,Q]of Z)this.ids.set(X,Q)}async localIdFor($){if(!$)return null;let Z=this.ids.get($.id);if(Z)return Z;let X=await this.ctx.storage.sprints.upsertFromJira(this.organizationId,EF$($));return this.ids.set($.id,X),X}}function EF$($){return{jiraSprintId:$.id,name:$.name,state:$.state,startsAt:$.startsAt,endsAt:$.endsAt}}function XO4($,Z){if($.size===0)return[];return Z.filter((X)=>!$.has(X.jiraIssueId))}async function QO4($,Z,X,Q){let Y=Z.organizationId,G=await X.searchIssueIds(`(${Q}) AND issuetype IN standardIssueTypes()`);if(G.size===0)return console.warn(`[jira] scope for org ${Y} came back empty \u2014 skipping reconciliation rather than archiving the whole board`),0;let J=XO4(G,await $.storage.jiraIntegrations.listLinkedIssuesOnBoard(Y));if(J.length===0)return 0;for(let W of J){let K=await $.storage.taskBoard.getById(W.itemId,Y);if(!K||K.status==="archived")continue;let F=await $.storage.taskBoard.update(W.itemId,Y,{status:"archived"},hK);await $.storage.taskBoard.recordActivity({taskBoardItemId:W.itemId,action:"status_changed",actorId:null,data:{from:K.status,to:"archived"}}),x$(Y,F),console.log(`[jira] ${W.jiraIssueKey} is no longer in board ${Z.boardId}'s scope \u2014 archived its card`)}return J.length}async function YO4($,Z){let{organizationId:X,boardId:Q}=Z;if(!Q)throw Error("No Jira board selected");let Y=TK$(Z.statusMapping);if(Y.size===0)throw Error("No status mapping configured");let G=Z.lastSyncedAt===null||Z.rescanPending,J=new BJ(Z.siteUrl,Z.email,Z.apiToken),{accountId:W}=await J.myself(),K=new No0(J),F=new Date,H=await J.getBoardScopeJql(Q),N=aB4(Z,H,F),U=new PF$($,X);await U.seed(await J.listBoardSprints(Q));let B={created:0,updated:0,unchanged:0,skipped:0,archived:0,unmappedStatuses:[]},O=new Set,L,w,E=0,j=0;while(E<Uo0&&j<jF$){j++;let P=await J.searchIssues({jql:N,nextPageToken:w});if(w=P.nextPageToken??void 0,P.issues.length===0){if(!w)break;continue}let I=await $.storage.jiraIntegrations.getLinksByIssueIds(X,P.issues.map((q)=>q.id));await K.resolve(P.issues.flatMap((q)=>[...Yt(q.fields.description),...(q.fields.comment?.comments??[]).flatMap((k)=>Yt(k.body))]));for(let q of P.issues){if(E>=Uo0)break;E++;let k=new Date(q.fields.updated);if(Number.isNaN(k.getTime()))throw Error(`Unparseable updated on ${q.key}`);let S=Y.get(q.fields.status.name);if(!S||!DF$(q)){if(!S&&DF$(q))O.add(q.fields.status.name);B.skipped++,L=k;continue}let m=I.get(q.id);if(m&&sB4(m.jiraUpdatedAt,k,G)){B.unchanged++,L=k;continue}let f=q.fields.status.name,b={title:q.fields.summary,description:await $O4(Z.siteUrl,q,K),priority:ZO4(q),sprintId:await U.localIdFor(oK$(q.sprints))};if(m){let i=m.jiraStatus!==f,c=await $.storage.taskBoard.getById(m.itemId,X),r=await $.storage.taskBoard.update(m.itemId,X,{...b,...i?{status:S}:{}},hK);if(await $.storage.jiraIntegrations.touchLink(m.itemId,{jiraStatus:f}),c&&i&&c.status!==S)await $.storage.taskBoard.recordActivity({taskBoardItemId:m.itemId,action:"status_changed",actorId:null,data:{from:c.status,to:S}});if(i&&!G)r=await LF$($,Z,r);await wF$($,Z,J,q,m.itemId,W,K),await $.storage.jiraIntegrations.touchLink(m.itemId,{jiraUpdatedAt:k}),x$(X,r),B.updated++}else{let i=await $.storage.taskBoard.create({organizationId:X,...b,status:S,by:hK});try{await $.storage.jiraIntegrations.createLink({itemId:i.id,organizationId:X,jiraIssueId:q.id,jiraIssueKey:q.key,jiraUpdatedAt:new Date(0),jiraStatus:f})}catch(c){if(c.code==="23505"){await $.storage.taskBoard.delete(i.id,X,hK),B.unchanged++,L=k;continue}throw c}if(!G)i=await LF$($,Z,i);await wF$($,Z,J,q,i.id,W,K),await $.storage.jiraIntegrations.touchLink(i.id,{jiraUpdatedAt:k}),x$(X,i),B.created++}L=k}if(!w)break}B.unmappedStatuses=[...O].sort();let z=eB4(E,j);if(!z)B.archived=await QO4($,Z,J,H);let A=G&&z;if(L===void 0&&E===0)return{counts:B,watermark:F,rescanPending:A};return{counts:B,watermark:L,rescanPending:A}}var hK="jira",Uo0=500,oB4=5,jF$=25,zF$=1e4,rB4;var ZL0=D(()=>{xD0();C6();JN();E5();$L0();Xo0();rB4={highest:"urgent",high:"high",medium:"medium",low:"low",lowest:"low"}});var AF$={};J4(AF$,{setJiraSyncRuntime:()=>Lo0,registerJiraSyncWorkflow:()=>Eo0,maybeEnqueueJiraStatusPush:()=>zO4,enqueueJiraCommentPush:()=>wo0});import{DBOS as YQ,SchedulerMode as GO4}from"@dbos-inc/dbos-sdk";function Lo0($){XL0=$}function Jt(){if(!XL0)throw Error("[jira] sync runtime not initialized \u2014 setJiraSyncRuntime() must run before the workflow fires");return XL0}function WN(){let{db:$,encryptionKey:Z}=Jt();return new qC($,new CY(Z))}function WO4(){return new QQ(Jt().db)}async function KO4($){try{let{db:Z}=Jt(),X=await WN().getById($);if(!X)return{id:$,error:"integration no longer exists"};if(!X.enabled)return{id:$};let Q=await o3(Z,X.organizationId);if(!Q)return{id:$,error:"organization no longer exists"};let Y=await Ug(Q,X);return"error"in Y?{id:$,error:Y.error}:{id:$}}catch(Z){return{id:$,error:Z instanceof Error?Z.message:String(Z)}}}async function FO4($,Z){let X=await YQ.runStep(()=>WN().listEnabledIds(),{name:"loadJiraIntegrations"});for(let Q of X){let Y=await YQ.runStep(()=>KO4(Q),{name:`syncJira:${Q}`});if(Y.error)console.warn(`[jira] sync ${Y.id} failed: ${Y.error}`)}}async function NO4($){let Z=WN();if(!(await Z.getByOrg($.organizationId))?.enabled)return null;let Q=await Z.getLinkByItemId($.taskBoardItemId,$.organizationId);if(!Q)return null;if(await Z.hasCommentLink($.commentId))return null;return{jiraIssueId:Q.jiraIssueId}}async function UO4($){return(await Jt().db.selectFrom("organization").select("slug").where("id","=",$).executeTakeFirst())?.slug??null}async function BO4($,Z,X){let Q=await WN().getByOrg($);if(!Q?.enabled)return null;let G=(await o3(Jt().db,$))?.orgFs;if(!G)return null;let J=new BJ(Q.siteUrl,Q.email,Q.apiToken);return BF$(X,{read:(W)=>G.read(W.volume,W.path).catch((K)=>{if(K instanceof VG)return null;throw K}),listAttachments:()=>J.listAttachments(Z),upload:(W)=>J.addAttachment(Z,W),mediaIdFor:(W)=>J.resolveMediaId(W)})}async function OO4($,Z,X){let Q=WN(),Y=await Q.getByOrg($.organizationId);if(!Y?.enabled)return null;let G=await Q.getLinkByItemId($.taskBoardItemId,$.organizationId);if(!G)return null;if(await Q.hasCommentLink($.commentId))return null;return(await new BJ(Y.siteUrl,Y.email,Y.apiToken).addComment(G.jiraIssueId,Z,{header:`${$.authorLabel} \xB7 via Studio:`,media:new Map(X)})).id}async function DO4($,Z){try{await WN().createCommentLink({commentId:$.commentId,organizationId:$.organizationId,jiraCommentId:Z})}catch(X){if(X.code!=="23505")throw X}}async function LO4($){let Z=$.body.slice(0,HO4),X=await YQ.runStep(()=>NO4($),{name:"resolveCommentTarget",retriesAllowed:!0,maxAttempts:3});if(!X)return;let Q=[],Y=bK$(Z);if(Y.length>0){let J=await YQ.runStep(()=>UO4($.organizationId),{name:"readOrgSlug",retriesAllowed:!0,maxAttempts:3});for(let W of UF$(Y,J??""))try{let K=await YQ.runStep(()=>BO4($.organizationId,X.jiraIssueId,W),{name:`attachCommentImage:${W.name}`,retriesAllowed:!0,maxAttempts:3});if(K)Q.push([W.target,K])}catch(K){if(!zK$(K))throw K;console.warn(`[jira] could not attach ${W.ref.path}:`,K)}}let G=await YQ.runStep(()=>OO4($,Z,Q),{name:"postCommentToJira",retriesAllowed:!1});if(!G)return;await YQ.runStep(()=>DO4($,G),{name:"recordCommentLink",retriesAllowed:!0,maxAttempts:4})}async function wO4($){let Z=WN(),X=await Z.getByOrg($.organizationId);if(!X?.enabled)return null;let Q=await Z.getLinkByItemId($.itemId,$.organizationId);if(!Q)return null;let Y=await WO4().getById($.itemId,$.organizationId);if(!Y)return null;if(mt0(X.statusMapping,Y.status,Q.jiraStatus))return null;let J=await new BJ(X.siteUrl,X.email,X.apiToken).listTransitions(Q.jiraIssueId),W=IK$({mapping:X.statusMapping,lane:Y.status,currentJiraStatus:Q.jiraStatus,availableTransitions:J.map((F)=>F.to.name)});if(W.kind!=="transition"){if(W.kind==="unreachable")console.warn(`[jira] ${Q.jiraIssueKey} is ${Y.status} on the board, but its workflow offers no transition to ${W.targets.join(" / ")} \u2014 `+"the card will not move on the Jira board");return null}let K=J.find((F)=>F.to.name===W.targetName);if(!K)return null;return{jiraIssueId:Q.jiraIssueId,transitionId:K.id,targetName:W.targetName}}async function EO4($,Z){let X=WN(),Q=await X.getByOrg($.organizationId);if(!Q?.enabled)return;let Y=await X.getLinkByItemId($.itemId,$.organizationId);if(!Y||Y.jiraStatus===Z.targetName)return;let G=new BJ(Q.siteUrl,Q.email,Q.apiToken);if(await G.getStatusName(Z.jiraIssueId)===Z.targetName){await X.touchLink($.itemId,{jiraStatus:Z.targetName});return}await G.transitionIssue(Z.jiraIssueId,Z.transitionId),await X.touchLink($.itemId,{jiraStatus:Z.targetName})}async function jO4($){let Z=await YQ.runStep(()=>wO4($),{name:"resolveStatusTransition",retriesAllowed:!0,maxAttempts:3});if(!Z)return;await YQ.runStep(()=>EO4($,Z),{name:"executeStatusTransition",retriesAllowed:!0,maxAttempts:3})}function zO4($,Z){if(Z.updatedBy===hK)return;if(!Do0||!XL0)return;let X=Do0;(async()=>{if(!await WN().getLinkByItemId(Z.id,$))return;await YQ.startWorkflow(X,{queueName:sD,workflowID:`jira-status:${Z.id}:${Z.status}:${Date.parse(Z.updatedAt)}`,enqueueOptions:{queuePartitionKey:$}})({organizationId:$,itemId:Z.id})})().catch((Q)=>{console.warn(`[jira] status push enqueue failed for ${Z.id}:`,Q instanceof Error?Q.message:Q)})}async function wo0($,Z){try{if(!Oo0)return;if(!await $.storage.jiraIntegrations.getLinkByItemId(Z.taskBoardItemId,Z.organizationId))return;await YQ.startWorkflow(Oo0,{queueName:sD,workflowID:`jira-cmt-push:${Z.commentId}`,enqueueOptions:{queuePartitionKey:Z.organizationId}})(Z)}catch(X){console.warn(`[jira] comment push enqueue failed for ${Z.commentId}:`,X instanceof Error?X.message:X)}}function Eo0(){if(Bo0)return;Bo0=YQ.registerWorkflow(FO4,{name:"jiraSyncWorkflow"}),YQ.registerScheduled(Bo0,{name:"jiraSyncWorkflow",crontab:JO4,mode:GO4.ExactlyOncePerIntervalWhenActive}),Oo0=YQ.registerWorkflow(LO4,{name:"jiraCommentPushWorkflow"}),Do0=YQ.registerWorkflow(jO4,{name:"jiraStatusPushWorkflow"})}var JO4="2-59/10 * * * *",XL0=null,HO4=30000,Bo0=null,Oo0=null,Do0=null;var QL0=D(()=>{PK$();bU();Fg();pD0();xK();Gw();$L0();OF$();et0();ZL0()});function YL0($,Z,X,Q){yY({event:$,organizationId:Z,properties:{task_id:X.id,reports_task:yQ(X),...Q}})}function x$($,Z){C5.emit($,{id:crypto.randomUUID(),type:G0$,source:"task-board",subject:Z.id,data:Z,time:new Date().toISOString()}),Promise.resolve().then(() => (QL0(),AF$)).then((X)=>X.maybeEnqueueJiraStatusPush($,Z)).catch((X)=>{console.warn("[jira] status push hook unavailable:",X)})}function TF$($,Z){C5.emit($,{id:crypto.randomUUID(),type:J0$,source:"task-board",subject:Z,data:{id:Z},time:new Date().toISOString()})}function PO4($,Z){return $?[$]:Z}async function VC($,Z,X){let Q=$.metadata?.runMetadata?.taskBoardItemId,Y=!Q&&X?await $.storage.taskBoard.linkedTaskIds(X,Z):[];return PO4(Q,Y)}async function RF$($,Z,X){let Q=$.organization?.id;if(!Q)return;try{for(let Y of await VC($,Q,X)){let G=await $.storage.taskBoard.getById(Y,Q);if(!G||GN[Z]<=GN[G.status])continue;let J=await $.storage.taskBoard.update(Y,Q,{status:Z},$.auth?.user?.id??G.updatedBy);if(await $.storage.taskBoard.recordActivity({taskBoardItemId:Y,action:"status_changed",actorId:null,data:{from:G.status,to:Z}}).catch((W)=>console.error("[task-board] activity log write failed",W)),x$(Q,J),Z==="in_progress")YL0("task_run_started",Q,J,{from:G.status})}}catch(Y){console.error("[task-board] run transition failed",Y)}}async function GL0($,Z){let X=$.organization?.id;if(!X)return;try{for(let Q of await VC($,X,Z)){let Y=await $.storage.taskBoard.openReviewCycleIfInProgress(Q,X);if(!Y)continue;x$(X,Y),YL0("task_run_completed",X,Y,{from:"in_progress",via:"pr_open"})}}catch(Q){console.error("[task-board] review-cycle open failed",Q)}}async function JL0($,Z,X,Q){let Y=$.organization?.id;if(!Y)return;try{let G=mD0(Z);if(!G)return;let J=await VC($,Y,Q);for(let W of J)await $.storage.taskBoard.linkPr({taskBoardItemId:W,organizationId:Y,url:G.url,prNumber:G.number,repoOwner:G.owner,repoName:G.repo,connectionId:X??null})}catch(G){console.error("[task-board] PR capture failed",G)}}async function Bg($,Z,X,Q){try{let Y=await $.advanceLinkedTasksToReviewOnThreadFinish(Z,X);for(let G of Y)x$(X,G),YL0("task_run_completed",X,G,{from:"in_progress",via:"thread_finish"});for(let G of Y)await $.clearRunRetry(G.id,X).catch(()=>{})}catch(Y){console.error("[task-board] thread-finish transition failed",Y)}await jo0($,Z,X),await zo0($,Q,Z,X)}function IF$($){return GN[$.status]>=GN.in_review||Boolean($.reviewCycleStartedAt)}async function jo0($,Z,X){try{let Q=await $.failedRunInfo(Z,X);if(!Q)return;let Y=BK$(Q);for(let G of await $.linkedTaskIds(Z,X)){let J=await $.getById(G,X);if(!J)continue;if(IF$(J))await $.relabelDeliveredFailure(Z,X,RO4).catch(()=>{});if(J.status!=="in_progress")continue;if(J.reviewCycleStartedAt)continue;if(J.threads.some((F)=>F.hasMessages&&F.status==="in_progress"))continue;let W=J.retryAttempts;if(W<Y){let F=aZ(TO4,AO4,W,2,0.5);if(!await $.scheduleRunRetry(G,X,W+1,new Date(Date.now()+F)))continue;await $.recordActivity({taskBoardItemId:G,action:"status_changed",actorId:null,data:{from:"in_progress",to:"in_progress",retry:W+1,of:Y,reason:Q.errorText??Q.kind}}).catch(()=>{});continue}let K=await $.returnToTodoAfterFailure(G,X,J.updatedBy);if(!K)continue;await $.recordActivity({taskBoardItemId:G,action:"status_changed",actorId:null,data:{from:"in_progress",to:"todo",reason:Q.errorText??Q.kind,retriesSpent:W}}).catch(()=>{}),x$(X,K),YL0("task_run_failed",X,J,{reason:Q.kind??"error",retries_spent:W})}}catch(Q){console.error("[task-board] failed-run reaction failed",Q)}}async function zo0($,Z,X,Q){try{for(let Y of await $.linkedTaskIds(X,Q)){let G=await $.getById(Y,Q);if(!G)continue;if(IF$(G))continue;if(G.threads.some((W)=>W.hasMessages&&(W.status===null||!Zt.has(W.status))))continue;if((await $.listPrs(Y,Q)).length>0)continue;await H0$(Z,Q,Y)}}catch(Y){console.error("[task-board] quota refund pass failed",Y)}}async function Po0($,Z){if(Z.status!=="in_progress"||!sQ(Z))return;try{let X=await $.storage.taskBoard.update(Z.id,Z.organizationId,{status:"in_review"},Z.updatedBy);await $.storage.taskBoard.recordActivity({taskBoardItemId:Z.id,action:"status_changed",actorId:null,data:{from:Z.status,to:"in_review"}}).catch(()=>{}),x$(Z.organizationId,X)}catch(X){console.error(`[task-board] parking ${Z.id} for review failed`,X)}}async function uK($,Z,X){let Q=Z.organizationId;if(Z.assigneeId!==Z8)return!1;try{await Po0($,Z);let Y=await $.storage.taskBoard.unassignSuperAgent(Z.id,Q,Z.updatedBy);if(!Y)return!1;return await z6($,{taskBoardItemId:Z.id,action:"assignee_changed",actorId:null,data:{from:Z.assigneeId,to:null,reason:X}}),console.warn(`[task-board] ${Z.id} handed to a human: ${X}`),x$(Q,Y),!0}catch(Y){return console.error(`[task-board] handing ${Z.id} to a human failed`,Y),!1}}async function qF$($,Z,X){if(!(X instanceof tX))return!1;if(X.reason!=="runs_exhausted")return!1;return await uK($,Z,"per-task run limit reached \u2014 the Super Agent can no longer re-dispatch "+"itself on this task. Re-run it manually to continue."),!0}async function MF$($,Z){let X=$.organization?.id;if(!X)return;try{let Q=await $.storage.taskBoard.reopenLinkedTasksOnThreadRun(Z,X);for(let Y of Q)x$(X,Y)}catch(Q){console.error("[task-board] thread-run reopen failed",Q)}}function kF$($){return $.includes("create_pull_request")||$.includes("createPullRequest")}function VF$($){if(IO4.test($))return!0;return qO4.test($)&&MO4.test($)}var AO4=30000,TO4=120000,RO4="Run ended after it had already delivered \u2014 the task moved on without it",IO4,qO4,MO4;var E5=D(()=>{sG();C4();xK();Kg();OK$();W4();en();C6();WX();yK();IO4=/\bgh\s+pr\s+create\b/,qO4=/api\.github\.com\/repos\/[^\s"']+\/pulls\b/,MO4=/(?:-X|--request)\s+POST/});function kO4($){if($.status==="completed")return"advance";if($.status==="failed"&&$.messageStorageVersion===2&&($.harnessId==="decopilot"||$.harnessId==="claude-code"))return"nudge";return"none"}function VO4($){return["This task is still In Progress on the board and your last run ended without finishing it.","","Look at what you already did (`git log`, `git status`, and the messages above), then either:","- finish the remaining work (and open the PR, if it needed code changes),","- or, if it's actually done, say so in one line \u2014 the board moves the card for you,",$==="decopilot"?"- or, if you're blocked on something only a human knows, call the `user_ask` tool.":"- or, if you're blocked on something only a human knows, say what you need and stop.","","Don't start over and don't redo work you already committed or pushed. You are on the same branch as before \u2014 push to it and update your existing pull request rather than opening a second one."].join(`
|
|
1410
1410
|
`)}async function SO4($,Z,X){await Gg($,Z,X,{messageId:`stall-nudge-${Z.id}-${X.id}`,prompt:VO4(X.harness_id),workflowID:`stall-nudge:${Z.id}:${X.id}`})}async function CO4($,Z){let X=await $.storage.threads.get(Z);if(!X)return{action:"none",thread:null};return{action:kO4({status:X.status,messageStorageVersion:X.message_storage_version,harnessId:X.harness_id}),thread:X}}function _O4($,Z=Date.now()){if($.status!=="in_progress")return!1;if($.run_started_at)return!1;return an($,Z)}async function vO4($,Z){let X=[];for(let Q of Z.threads){if(Q.status!=="in_progress")continue;let Y=await $.storage.threads.get(Q.threadId);if(!Y||!_O4(Y))continue;if(await $.storage.threads.markRunFailed(Q.threadId,Ao0,"abandoned"))X.push(Q.threadId),console.warn(`[task-board] failed never-started thread ${Q.threadId} on ${Z.id}`)}return X}async function SF$($,Z){let X=$.organization?.id;if(!X)return;for(let Q of Z){if(Q.status==="in_progress")try{if((await vO4($,Q)).length>0)continue}catch(J){console.error(`[task-board] reaping threads for ${Q.id} failed`,J)}let Y;try{Y=Q.repo!=null&&(await $.storage.taskBoard.listPrs(Q.id,X)).length>0}catch(J){console.error(`[task-board] listPrs for ${Q.id} failed`,J);continue}if(!ct0(Q,Y))continue;let G=Q.threads.find((J)=>J.hasMessages);if(!G)continue;try{let{action:J,thread:W}=await CO4($,G.threadId);if(J==="none"||!W)continue;if(J==="advance")await Bg($.storage.taskBoard,G.threadId,X,$.storage.organizationBilling);else await SO4($,Q,W)}catch(J){console.error(`[task-board] stall recovery failed for ${Q.id}`,J)}}}var Ao0="Run never started \u2014 no pod picked it up before the idle window elapsed";var To0=D(()=>{gD0();xK();E5()});import{z as OJ}from"zod";var fO4,SC;var Ro0=D(()=>{xD0();M0();vQ();WJ();To0();fO4=OJ.object({key:OJ.string(),title:OJ.string(),position:OJ.number(),role:OJ.string().nullable()}),SC=u({name:"TASK_BOARD_ITEM_LIST",description:"List all task board items for the organization, plus the `owner/name` repos this organization has imported (the valid values for a task's `repo` field).",annotations:{title:"List Task Board Items",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:OJ.object({}),outputSchema:OJ.object({items:OJ.array(ty),repos:OJ.array(OJ.string()),sprints:OJ.array(CJ$),columns:OJ.array(fO4)}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");let[Q,{items:Y},G,J]=await Promise.all([Z.storage.taskBoard.list(X),Z.storage.connections.list(X,{slug:"mcp-github"}),Z.storage.sprints.listByOrg(X),Yg(Z,X).then((K)=>K.columns())]),W=Fe1(Y);return SF$(Z,Q),{items:Q,repos:W,sprints:G,columns:J}}})});import{z as $G}from"zod";function yO4($){return xO4.some((Z)=>$[Z]!==void 0)}function gO4($,Z){let X=[];for(let{field:G,action:J}of bO4){if(Z[G]===$[G])continue;X.push({action:J,data:{from:$[G],to:Z[G]}})}if(Z.description!==$.description)X.push({action:"description_changed"});let Q=new Set($.tags.map((G)=>G.id));if(Z.tags.length!==$.tags.length||Z.tags.some((G)=>!Q.has(G.id)))X.push({action:"tags_changed",data:{from:$.tags,to:Z.tags}});return X}function hO4($,Z){if($!==Z8)return!1;if(!Z)return!1;return Z.assigneeId!==Z8?!0:Z.status==="todo"}function cO4($,Z,X){let Q=$!==void 0&&uO4.has($),Y=Z!==void 0&&sQ(Z);return X&&Q&&Y}function Io0($,Z){return $!==void 0&&dt0($)&&!Z}var bO4,xO4,uO4,CC;var WL0=D(()=>{M0();JZ();WJ();yK();mn0();JN();WX();uO();E5();Kg();sG();bO4=[{field:"status",action:"status_changed"},{field:"assigneeId",action:"assignee_changed"},{field:"priority",action:"priority_changed"},{field:"type",action:"type_changed"},{field:"dueDate",action:"due_date_changed"},{field:"title",action:"title_changed"}],xO4=["title","description","status","priority","type","assigneeId","repo","dueDate","sortOrder","tagIds"];uO4=new Set(["approved","merged","post_deploy_validation","done","archived"]);CC=u({name:"TASK_BOARD_ITEM_UPDATE",description:"Update a task board item's fields (title, description, status, priority, assignee), and/or link a chat thread to it.",annotations:{title:"Update Task Board Item",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:$G.object({id:$G.string(),title:$G.string().min(1).max(ZD0).optional(),description:$G.string().max($D0).nullable().optional(),status:i3.optional(),priority:LC.optional(),type:gn.optional(),assigneeId:$G.string().nullable().optional(),repo:$G.string().max(XD0).nullable().optional(),dueDate:$G.string().datetime().nullable().optional(),sortOrder:$G.number().optional(),tagIds:$G.array($G.string()).max(1000).optional(),linkThreadId:$G.string().optional(),prUrl:$G.string().nullable().optional().describe("GitHub pull request URL to link to this task, e.g. https://github.com/owner/repo/pull/123. Pass it after opening a PR for an existing card; linking one is what starts its review.")}),outputSchema:$G.object({item:ty}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");let Q=$.prUrl?tO($.prUrl):null;if($.prUrl&&!Q)throw Error(`Not a GitHub pull request URL: ${$.prUrl} (expected https://github.com/<owner>/<repo>/pull/<number>)`);if($.assigneeId)await QD0(Z,X,$.assigneeId);if($.linkThreadId){if(!await Z.storage.taskBoard.getById($.id,X))throw Error(`Task board item not found: ${$.id}`);if(!await Z.storage.threads.get($.linkThreadId))throw Error(`Thread not found: ${$.linkThreadId}`);await Z.storage.taskBoard.linkThread($.id,$.linkThreadId,X)}let Y=yO4($),G=Y?await Z.storage.taskBoard.getById($.id,X):null;if(Y&&!G)throw Error(`Task board item not found: ${$.id}`);if($.status!==void 0&&dt0($.status)){let H=await Z.storage.organizationSettings.get(X);if(Io0($.status,nX(H?.flags,"delivery_lanes_enabled")))throw Error("Delivery lanes are not enabled for this organization \u2014 enable "+"them in Settings before moving a task to Approved, Merged, or Post-deploy Validation.")}let J=eH.getStore()!==void 0;if(cO4($.status,G??void 0,J))throw Error("This task is under review \u2014 a run can't move it to Done or Archived. "+"Leave it for the reviewer; only a person, or TASK_BOARD_REVIEW_DECISION on a reviewer's own run, closes out a task under review.");let W=$.assigneeId!==void 0&&$.assigneeId!==(G?.assigneeId??null),K=hO4($.assigneeId,G);if(G&&yQ(G)){if($.title!==void 0||$.description!==void 0||$.priority!==void 0)throw Error("This task was generated from your report and can't be edited \u2014 create your own task instead.");if(K)await Fy(Z,G,HO())}if($.tagIds!==void 0){let H=await Z.storage.tags.listOrgTags(X),N=new Set(H.map((U)=>U.id));for(let U of $.tagIds)if(!N.has(U))throw Error(`Tag not found: ${U}`);await Z.storage.taskBoard.setItemTags($.id,$.tagIds,o0(Z))}let F;if(Y)F=await Z.storage.taskBoard.update($.id,X,{title:$.title,description:$.description,status:K?"todo":$.status,priority:$.priority,type:$.type,assigneeId:$.assigneeId,assignedBy:W?$.assigneeId?o0(Z):null:void 0,repo:$.repo,dueDate:$.dueDate,sortOrder:$.sortOrder},o0(Z));else{let H=await Z.storage.taskBoard.getById($.id,X);if(!H)throw Error(`Task board item not found: ${$.id}`);F=H}if(Q)await Z.storage.taskBoard.linkPr({taskBoardItemId:F.id,organizationId:X,url:Q.url,prNumber:Q.number,repoOwner:Q.owner,repoName:Q.repo,connectionId:null});if(G){let H=o0(Z),N=gO4(G,F);if(N.length>0)await DK$(Z,N.map((U)=>({taskBoardItemId:F.id,actorId:H,...U,alsoSubscribe:U.action==="assignee_changed"&&F.assigneeId!==Z8?[F.assigneeId]:void 0})))}if(G&&F.description!==G.description)await Z.storage.notifications.notifyMentions({taskBoardItemId:F.id,organizationId:X,actorId:o0(Z),body:F.description??"",previousBody:G.description});if(Y||$.linkThreadId||Q)x$(X,F);if(K)await sO(Z,F,{userInitiated:!0});return{item:F}}})});import{z as KL0}from"zod";var _C;var qo0=D(()=>{M0();E5();_C=u({name:"TASK_BOARD_ITEM_DELETE",description:"Delete a task board item. A reports-pushed task also dismisses its finding, so the next diagnostic import won't re-create the card.",annotations:{title:"Delete Task Board Item",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:KL0.object({id:KL0.string()}),outputSchema:KL0.object({success:KL0.boolean()}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");if(!await Z.storage.taskBoard.delete($.id,X,o0(Z)??"system"))throw Error(`Task board item not found: ${$.id}`);return TF$(X,$.id),{success:!0}}})});function vC($){if($.length===0)return!1;let Z=new Map;for(let X of $){let Q=`${X.repoOwner}/${X.repoName}`.toLowerCase(),Y=Z.get(Q);if(Y)Y.push(X);else Z.set(Q,[X])}return[...Z.values()].every(lO4)}function lO4($){return $.some((Z)=>Z.merged===!0)&&$.every((Z)=>Z.merged===!0||Z.state==="closed")}async function dO4($,Z,X,Q){let Y=await $.storage.taskBoard.getById(X,Z);if(!Y||Y.status!=="done")return!1;let G=await $.storage.taskBoard.listPrs(X,Z),J=await Promise.all(G.map(async(K)=>({...K,...await Q($,Z,K)})));if(!vC(J))return!1;let W=await $.storage.taskBoard.update(X,Z,{status:"archived"},Y.updatedBy);return await z6($,{taskBoardItemId:X,action:"status_changed",actorId:null,data:{from:"done",to:"archived",reason:"merged_pr_auto_archive"}}),x$(Z,W),!0}async function CF$($,Z,X,Q=HL0){let Y=0;for(let G of X)try{if(await dO4($,Z,G,Q))Y+=1}catch(J){console.error(`[task-board-archive] ${G} failed`,J)}return{archived:Y}}function FL0($){let Z=new Map;for(let{id:X,organizationId:Q}of $){let Y=Z.get(Q);if(Y)Y.push(X);else Z.set(Q,[X])}return[...Z].map(([X,Q])=>({organizationId:X,itemIds:Q}))}var Og=D(()=>{WX();ZG();E5()});function mO4($){let Z=new Map($.map((G)=>[G.id,G])),X=new Map;for(let G of ny($)){let J=_F$(G.owner,G.repo);X.set(J,[...X.get(J)??[],G])}if(X.size!==1)return null;let Q=[...X.values()][0],Y=Q.find((G)=>{let J=Z.get(G.connectionId);return J?EE(J):!1})??Q[0];return{connectionId:Y.connectionId,owner:Y.owner,name:Y.repo,installationId:Y.installationId,url:`https://github.com/${Y.owner}/${Y.repo}`}}async function NL0($,Z){if(!Is())return console.warn(`[task-board] claude-code skipped for org ${Z}: `+"hosted sandbox unavailable \u2014 running Decopilot"),null;try{let{items:X}=await $.storage.connections.list(Z,{slug:"mcp-github"}),Q=mO4(X);if(Q)return{repo:Q};let Y=new Map;for(let J of ny(X)){let W=_F$(J.owner,J.repo);if(!Y.has(W))Y.set(W,{connectionId:J.connectionId,repo:`${J.owner}/${J.repo}`})}let G=Y;if(G.size===0)return console.warn(`[task-board] claude-code skipped for org ${Z}: `+"no importable repos \u2014 running Decopilot"),null;return console.warn(`[task-board] claude-code for org ${Z}: ${G.size} importable repos \u2014 the run picks one with TASK_ADD_REPO`),{choices:[...G.values()]}}catch(X){return console.warn("[task-board] repo lookup for claude-code failed",X),null}}function vF$($,Z,X){let Q=["You've been assigned this task. Complete it and finish with a pull request if it makes sense (like a coding task) or is explicitly requested.","","You are running AUTONOMOUSLY \u2014 no human is watching, so drive this to "+"completion yourself. Make reasonable decisions and move on; do not stop to ask for confirmation.","",`Title: ${$.title}`];if($.description)Q.push("","Description:",$.description);if(Q.push("",Z?`The repository ${Z.owner}/${Z.name} is already cloned at your working directory, on its own branch. \`git\` and \`gh\` are authenticated. ${Sp}`:["Your working directory is EMPTY: this organization has several repositories, so nothing has been cloned yet. FIRST call `mcp__studio__TASK_ADD_REPO` with the connectionId of the repository this task is about. It clones that repository into your working directory and waits for the checkout, so once it returns the repository is there on its own branch and `git` and `gh` are authenticated. Do not read files, run `git`, or run `gh` before it returns; there is nothing there yet.","","Repositories in this organization:",...(X?.repoChoices??[]).map((Y)=>`- ${Y.repo} (connectionId: ${Y.connectionId})`),X?.repoChoices?.length?"Start with the one the task is about. If it turns out to need a change in "+"another of them too, call `mcp__studio__TASK_ADD_REPO` again \u2014 repositories "+"accumulate, so a second call adds a checkout beside the first rather than replacing it. Each lands in its own directory and keeps its own git remote, so open one pull request per repository you changed.":"Call `mcp__studio__TASK_ADD_REPO` with no arguments to list them."].join(`
|
|
1411
|
-
`),""),X?.resolveConflict&&X.pr)Q.push(`Pull request #${X.pr.number} (${X.pr.url}) is approved but has a MERGE CONFLICT with its base branch.`,`Check that branch out (\`gh pr checkout ${X.pr.number}\`), merge or rebase the base branch into it, resolve the conflicts, and push to update the SAME pull request \u2014 do NOT open a new one. Resolve by preserving BOTH sides' intent; never blindly discard either side, and change only what the conflict requires.`,"");else if(X?.feedback)Q.push(X.pr?`A reviewer requested changes on pull request #${X.pr.number} (${X.pr.url}):`:"A reviewer requested changes on your previous work:",X.feedback,X.pr?`Check that branch out (\`gh pr checkout ${X.pr.number}\`) before editing, address the feedback, then push to update the SAME pull request \u2014 do NOT open a new one.`:"Address this feedback.","");else if(X?.pr)Q.push(`This task already has an open pull request #${X.pr.number} (${X.pr.url}), and you are already on its branch.`,"Continue that work: commit and push to update the SAME pull request \u2014 do NOT open a new one. If it already does everything the task asks, say so and stop rather than changing it.","");return Q.push("How to finish:","- Make the change, commit it, push the branch, and open a pull request"+(X?.pr?" \u2014 or push to the existing one, per the instruction above.":"."),"- Change only what the task needs. Don't refactor around it.","- The change must be REACHABLE from the surface the task names: edit the component that route actually renders, not one that merely looks like the right place. A change nothing imports is dead code, and it is the most common reason a task comes back rejected.","- Before handing over, VERIFY the task's outcome LOCALLY, in the sandbox: exercise the affected code path (the dev server hot-reloads, so hit the route it renders) and confirm the behaviour actually happens. A green test suite is not the bar. Do NOT wait for, or verify against, the PR's deploy preview \u2014 a reviewer checks that after you hand over.","- As soon as `gh pr create` prints the URL, call `mcp__studio__TASK_BOARD_ITEM_PR_LINK` with that url. Do this even if you also mention the PR in a comment \u2014 the reviewers are dispatched from the linked PR, not from your message.",'- If the task turns out to need no code change, do NOT open a PR: explain why in a comment on the task (`mcp__studio__TASK_BOARD_COMMENT_CREATE`) and move it to "done". There is nothing for a reviewer to review, so leaving it for one would strand it.',`- Anything a reviewer should know (a decision you made, something you found and deliberately left alone, a question) goes on the task as a comment: \`mcp__studio__TASK_BOARD_COMMENT_CREATE\` with taskBoardItemId "${$.id}". Read what's already there first with \`mcp__studio__TASK_BOARD_COMMENT_LIST\` \u2014 a comment may be addressed to you.`,"",`(task id: ${$.id})`),Q.join(`
|
|
1411
|
+
`),""),X?.resolveConflict&&X.pr)Q.push(`Pull request #${X.pr.number} (${X.pr.url}) is approved but has a MERGE CONFLICT with its base branch.`,`Check that branch out (\`gh pr checkout ${X.pr.number}\`), merge or rebase the base branch into it, resolve the conflicts, and push to update the SAME pull request \u2014 do NOT open a new one. Resolve by preserving BOTH sides' intent; never blindly discard either side, and change only what the conflict requires.`,"");else if(X?.feedback)Q.push(X.pr?`A reviewer requested changes on pull request #${X.pr.number} (${X.pr.url}):`:"A reviewer requested changes on your previous work:",X.feedback,X.pr?`Check that branch out (\`gh pr checkout ${X.pr.number}\`) before editing, address the feedback, then push to update the SAME pull request \u2014 do NOT open a new one.`:"Address this feedback.","");else if(X?.pr)Q.push(`This task already has an open pull request #${X.pr.number} (${X.pr.url}), and you are already on its branch.`,"Continue that work: commit and push to update the SAME pull request \u2014 do NOT open a new one. If it already does everything the task asks, say so and stop rather than changing it.","");return Q.push("How to finish:","- Make the change, commit it, push the branch, and open a pull request"+(X?.pr?" \u2014 or push to the existing one, per the instruction above.":"."),"- Change only what the task needs. Don't refactor around it.","- The change must be REACHABLE from the surface the task names: edit the component that route actually renders, not one that merely looks like the right place. A change nothing imports is dead code, and it is the most common reason a task comes back rejected.","- Before handing over, VERIFY the task's outcome LOCALLY, in the sandbox: exercise the affected code path (the dev server hot-reloads, so hit the route it renders) and confirm the behaviour actually happens. A green test suite is not the bar. Do NOT wait for, or verify against, the PR's deploy preview \u2014 a reviewer checks that after you hand over.","- For a VISUAL change that means LOOKING at it: `qa-screenshot <url> <path>.png [--mobile] [--full] [--selector=<css>]` renders the page in headless Chromium \u2014 it reaches your own dev server on localhost, and unlike `curl` it runs the page's JS, so lazily-rendered sections are actually there. Then `Read` the file: a screenshot you never opened is not verification. It is already installed; do NOT look for playwright in the repo's `node_modules` or start a browser yourself.","- As soon as `gh pr create` prints the URL, call `mcp__studio__TASK_BOARD_ITEM_PR_LINK` with that url. Do this even if you also mention the PR in a comment \u2014 the reviewers are dispatched from the linked PR, not from your message.",'- If the task turns out to need no code change, do NOT open a PR: explain why in a comment on the task (`mcp__studio__TASK_BOARD_COMMENT_CREATE`) and move it to "done". There is nothing for a reviewer to review, so leaving it for one would strand it.',`- Anything a reviewer should know (a decision you made, something you found and deliberately left alone, a question) goes on the task as a comment: \`mcp__studio__TASK_BOARD_COMMENT_CREATE\` with taskBoardItemId "${$.id}". Read what's already there first with \`mcp__studio__TASK_BOARD_COMMENT_LIST\` \u2014 a comment may be addressed to you.`,"",`(task id: ${$.id})`),Q.join(`
|
|
1412
1412
|
`)}var _F$=($,Z)=>`${$}/${Z}`.toLowerCase();var Mo0=D(()=>{aO0();vQ();C6();R$()});import{createHmac as iO4,randomBytes as pO4,timingSafeEqual as nO4}from"crypto";function tO4(){if(UL0)return UL0;let $;try{let Z=b0();$=Z.studioJwtSecret??Z.betterAuthSecret}catch{$=void 0}return UL0=$?Buffer.from($):pO4(32),UL0}function ko0($,Z,X){return`rtok_${iO4("sha256",tO4()).update(`${$}:${Z}:${X.toISOString()}`).digest("base64url")}`}function fF$($,Z,X,Q){let Y=Buffer.from($),G=Buffer.from(ko0(Z,X,Q));return Y.length===G.length&&nO4(Y,G)}var UL0=null;var Vo0=D(()=>{R$()});import{createHash as oO4}from"crypto";function Wt($,Z){if($.status===null||bF$.has($.status))return!1;return!an({updated_at:$.lastActiveAt,last_progress_at:null},Z)}function rO4($,Z){return $.threads.some((X)=>!LK.some((Q)=>KO(X.title,Q))&&Wt(X,Z))}function eO4($,Z){return Z-$>=sO4}async function BL0($,Z,X){let Q=await $.storage.organizationSettings.get(Z.organizationId),Y=bH(Q?.flags);if(Y.length===0)return;if(rO4(Z,Date.now()))return;let G=nX(Q?.flags,"cheap_reviewer_model")?"reviewer":"default",J=await $.storage.taskBoard.listActivity(Z.id,Z.organizationId),W=Z.reviewCycleStartedAt,K=xH(J,W),F=new Date(K),H=FO(J,{cycleStartedAt:W});await Promise.all(Y.map(async(N)=>{let U=H.has(N);if(!U){let O=JD4(J,K),L=GD4(Z,N,K,O);if(L){await HD4($,Z,N,L).catch((w)=>console.error(`[task-board] ${N} verdict nudge failed`,w));return}if(KD4(O,Date.now()))return}if(QD4(Z,N,K,Date.now(),U)){await uK($,Z,`${wK[N]} failed ${So0} times on `+"this review \u2014 it will not be retried");return}if(X?.previewMatchesHead===!1){if(eO4(K,Date.now()))await uK($,Z,"the pull request's deploy preview is not showing its latest commit (its checks never went green), so the Reviewer cannot verify this change against what the PR actually does");return}if(YD4(Z,N,K,Date.now(),U))return;let B=$D4(Z,N,K,Date.now(),U);await BD4($,Z,N,F,B,G).catch((O)=>console.error(`[task-board] ${N} reviewer enqueue failed`,O))}))}function $D4($,Z,X,Q=Date.now(),Y=!0){return $.threads.filter((G)=>KO(G.title,Z)&&Co0(G,Q,Y)&&new Date(G.createdAt).getTime()>=X).length}function ZD4($,Z){if(!$||!Z||!("choices"in Z))return null;return Z.choices.find((X)=>X.repo===$)?.connectionId??null}function XD4($,Z,X){let Q=$.threads.filter((Y)=>KO(Y.title,Z)&&Y.status==="completed"&&new Date(Y.createdAt).getTime()<X).map((Y)=>new Date(Y.lastActiveAt).getTime()).filter((Y)=>Number.isFinite(Y));return Q.length===0?0:Math.max(...Q)}function Co0($,Z,X=!0){if($.status==="failed")return!0;if($.status!==null&&bF$.has($.status))return!X;return $.status!==null&&!Wt($,Z)}function xF$($,Z,X,Q=Date.now()){return $.threads.filter((Y)=>{if(!KO(Y.title,Z))return!1;return Wt(Y,Q)||new Date(Y.createdAt).getTime()>=X})}function QD4($,Z,X,Q=Date.now(),Y=!0){let G=xF$($,Z,X,Q);return G.length>0&&G.every((J)=>Co0(J,Q,Y))&&G.length>=So0}function YD4($,Z,X,Q=Date.now(),Y=!0){let G=xF$($,Z,X,Q);if(G.length===0)return!1;if(G.some((W)=>Wt(W,Q)))return!0;let J=G.filter((W)=>Co0(W,Q,Y));if(J.length>=So0)return!0;return J.length!==G.length}function GD4($,Z,X,Q,Y=Date.now()){return $.threads.find((G)=>KO(G.title,Z)&&G.status==="completed"&&!Wt(G,Y)&&new Date(G.createdAt).getTime()>=X&&!Q.has(G.threadId))??null}function JD4($,Z){let X=new Map;for(let Q of $){if(Q.action!=="review_verdict_requested")continue;let Y=new Date(Q.occurredAt).getTime();if(Y<Z)continue;let G=Q.data?.threadId;if(typeof G==="string")X.set(G,Y)}return X}function KD4($,Z){for(let X of $.values())if(Z-X<WD4)return!0;return!1}function FD4($){return[`Your ${wK[$]} run ended without recording a decision, so the task is stuck: nothing ships and nobody is told why. A review that reaches no verdict is not a review.`,"","Do exactly ONE thing in this run and then stop:","- Call `TASK_BOARD_REVIEW_DECISION` now, with the verdict your review already reached and notes that say what you checked.","- Approve ONLY if you actually exercised the change and it holds. If you could not finish \u2014 a check never came back, a preview never rendered, you ran out of room \u2014 `request_changes` and say exactly what is unresolved. That hands the card to a person, which is the correct outcome for an unfinished review.","- Do NOT re-run the review, do NOT change any code, and do NOT wait on any background task: whatever you know right now is the verdict."].join(`
|
|
1413
1413
|
`)}async function HD4($,Z,X,Q){let Y=await $.storage.threads.get(Q.threadId);if(!Y||Y.message_storage_version!==2)return;await $.storage.taskBoard.recordActivity({taskBoardItemId:Z.id,action:"review_verdict_requested",actorId:null,data:{reviewer:X,threadId:Q.threadId}}),console.warn(`[task-board] ${X} reviewer on ${Z.id} completed with no verdict \u2014 `+"asking for one"),await Gg($,Z,Y,{messageId:`review-verdict-${Q.threadId}`,prompt:FD4(X),workflowID:`review-verdict:${Q.threadId}`,runClass:"reviewer"})}function ND4($,Z,X,Q){return`review:${$}:${Z}:${X.toISOString()}:${Q}`}function UD4($){return`thrd_${oO4("sha256").update($).digest("hex").slice(0,32)}`}async function BD4($,Z,X,Q,Y,G){let J=Z.organizationId,W=ko0(Z.id,X,Q),K=await NL0($,J),F=K&&"repo"in K?K.repo:null,H=K!==null,N=XD4(Z,X,Q.getTime()),U=ZD4(Z.repo,K),B=H?"mcp__studio__TASK_BOARD_ITEM_PRS_GET":"TASK_BOARD_ITEM_PRS_GET",O=H?"mcp__studio__TASK_BOARD_REVIEW_DECISION":"TASK_BOARD_REVIEW_DECISION",L=H?"mcp__studio__TASK_BOARD_COMMENT_CREATE":"TASK_BOARD_COMMENT_CREATE",w=H?"mcp__studio__TASK_BOARD_COMMENT_LIST":"TASK_BOARD_COMMENT_LIST",E=[aO4[X],"","You are running AUTONOMOUSLY \u2014 no human is watching this run. Making the "+'approve / request-changes call IS your job; you are the decision-maker, not an assistant asking a human to decide. NEVER use `user_ask` to ask whether to approve, or to confirm an obvious call ("Approve the PR?"). Reserve `user_ask` for a genuine, unresolvable blocker only a human can clear (e.g. a missing credential, or a requirement so ambiguous you '+"truly cannot judge the outcome) \u2014 that should be rare. When in doubt "+"between asking and deciding, DECIDE.","","Do NOT merge the pull request \u2014 the board does that itself once your "+"approval is in. Pushing fixes to the PR's own branch is expected of you; opening a second pull request, force-pushing, or touching any other ref is not."].join(`
|
|
1414
1414
|
`),j=[...H?[]:[E,""],`Task title: ${Z.title}`,Z.description?`
|
|
@@ -2921,7 +2921,7 @@ Respond with the structured verdict and a short reason.`,sc$;var $l$=D(()=>{D4()
|
|
|
2921
2921
|
${G.join(`
|
|
2922
2922
|
`)}`:Y}function kN6($){let Z=new Set;for(let X of $)for(let Q of X.split(`
|
|
2923
2923
|
`)){let Y=Q.trim();if(/^Co-authored-by:\s/i.test(Y))Z.add(Y)}return[...Z]}var bl$=200,jN6=12,PN6,TN6=300,P71=3;var A71=D(()=>{dD();UT0();PN6={aheadBy:0,behindBy:0,files:[]}});function SN6($){if(!$||$.includes(".."))return!1;return VN6.test($)}function yl$($){let Z=typeof $.__resolveType==="string"?$.__resolveType:null;if(!Z||!SN6(Z))return null;let{__resolveType:X,...Q}=$;return{resolveType:Z,payload:Q}}function gl$($,Z){return`${$.replace(/\/+$/,"")}/deco/invoke/${Z}`}var VN6;var hl$=D(()=>{VN6=/^[\w./@-]+$/});function Os($,Z){let X=$?.githubRepo;if(!X?.owner||!X?.name)return null;if(!X.connectionId)return X;if(!Z.includes(X.connectionId))return null;return X}async function ul$($,Z,X,Q){if(!Q.connectionId)throw new Uv("Push requires a connected GitHub account. Connect mcp-github for this project and restart the sandbox.");let Y=$.organization?.id;if(!Y)throw new Uv(G9);await MO({ctx:$,connectionId:Q.connectionId,organizationId:Y,forceRefresh:!0,onLegacyMintError:(H)=>{let N=H instanceof Error?H.message:G9;throw new Uv(N)}});let{cloneUrl:G,gitUserName:J,gitUserEmail:W}=await MK(Q.connectionId,Q.owner,Q.name,$.db,$.vault).catch((H)=>{let{code:N,message:U}=T5$(H instanceof Error?H.message:String(H));throw N?new Uv(U):H}),K=du($),F=await Z.proxyDaemonRequest(X,"/_sandbox/config",{method:"PUT",headers:new Headers({"content-type":"application/json"}),body:JSON.stringify({git:{repository:{cloneUrl:G},identity:{userName:J,userEmail:W}},...K?{operator:K}:{}})});if(!F.ok){let H=await qO(F,CN6).catch(()=>F.statusText);throw Error(`Failed to refresh sandbox git credentials (${F.status}): ${H}`)}}var CN6=10485760,Uv;var T71=D(()=>{QJ();ZT0();Wn();Li0();qy();Uv=class Uv extends Error{constructor($){super($);this.name="GitPushAuthError"}}});function vN6($){let Z=$.startsWith("thread:")?$.slice(7):$;if(!Z||Z.length>255||Z.includes("..")||Z.startsWith("/")||Z.endsWith("/")||Z.endsWith(".lock")||!_N6.test(Z))throw Error(`Invalid branch name: ${$}`)}function Bv($){return AbortSignal.any([$.req.raw.signal,AbortSignal.timeout(bN6)])}async function yN6($,Z){let X=$.var.studioContext,Q=ZJ(Z.branch),Y=$.req.query("thread")??Q,G=Y&&Y===Q?Z.branchThread:Y?await X.storage.threads.get(Y).catch(()=>null):null,J=G?.virtual_mcp_id===Z.virtualMcpId?G:null,W=DC(J?.metadata?.runtime);if(W)return W;let K=pO0(Z.virtualMcpMetadata),F=K==="cms"?await Y71(X,{claimName:Z.claimName}):"alive",H=K==="cms"&&F!=="alive"?"cms":"sandbox",N=!!J&&(F==="gone"||F==="alive"&&K==="cms");if(N&&J)xn(X,J.id,H);if(K==="cms")console.log("sandbox proxy: no runtime stamp",{route:$.req.path,method:$.req.method,reason:J?"unstamped":"threadless",liveness:F,resolved:H,stamped:N});return H}async function gN6($){let Z=$.get("vmClaim");if(Z.runner)return Z.runner;try{return await ZQ($.var.studioContext)}catch{return null}}function Ov($){let{runner:Z}=$.get("vmClaim");if(!Z)return $.json({error:"No sandbox runner configured"},503);return Z}async function tu($){let{virtualMcpMetadata:Z,connectionIds:X}=$.get("vmClaim"),Q=$.var.studioContext,Y=Os(Z,X);if(!Y)throw new u4(404,"AUTH","repo","Project has no GitHub repository");let G=t(Q);return XT0(Q,G.id,Y)}function R71($,Z){if(Z instanceof WA0)return $.json({error:Z.message},429,{...P5,...Z.retryAfterMs===null?{}:{"Retry-After":String(Math.ceil(Z.retryAfterMs/1000))}});if(Z instanceof u4){let Q=Z.status===404?404:Z.status===409||Z.status===422?409:502;return $.json({error:Z.message},Q,P5)}let X=Z instanceof Error?Z.message:String(Z);return $.json({error:X},502,P5)}async function dl$($,Z,X){let Q;try{Q=await fetch(Z,X)}catch{return $.json({error:"Preview unreachable"},502)}let Y;try{Y=await Q.text()}catch{return $.json({error:"Preview unreachable"},502)}return new Response(Y,{status:Q.status,headers:{"content-type":Q.headers.get("content-type")??"application/json"}})}async function ml$($){try{let Z=await tu($),X=await BT0(Z,$.get("vmClaim").branch);return $.json(X,200,P5)}catch(Z){return R71($,Z)}}function Ds($,Z){let Q=(LT0.get($)??Promise.resolve()).catch(()=>{}).then(Z),Y=Q.catch(()=>{});return LT0.set($,Y),Y.finally(()=>{if(LT0.get($)===Y)LT0.delete($)}),Q}async function tZ($,Z,X){if(!X?.runner&&$.get("vmClaim").runtime==="cms")return $.json({error:"sandbox not found: this session is sandbox-less"},404,P5);let Q=X?.runner??Ov($);if(Q instanceof Response)return Q;let{claimName:Y,userId:G,projectRef:J}=$.get("vmClaim"),W=X?.method??"POST",K=null,F=new Headers;if(X?.jsonBody!==void 0)K=X.jsonBody,F.set("content-type","application/json");else if(X?.forwardJsonBody)K=await $.req.text(),F.set("content-type","application/json");let H=X?.signal,N={method:W,headers:F,body:K,...H?{signal:H}:{}},U=async()=>{let B=await Q.proxyDaemonRequest(Y,Z,N);if(X?.map404to410&&B.status===404){try{await B.body?.cancel()}catch{}if(await Q.adoptLiveClaim({userId:G,projectRef:J},Y))B=await Q.proxyDaemonRequest(Y,Z,N);if(B.status===404){try{await B.body?.cancel()}catch{}return new Response(JSON.stringify({error:"Sandbox handle is gone. The sandbox needs to be re-provisioned."}),{status:410,headers:{"content-type":"application/json",...P5}})}}let O=await B.text(),L=X?.redactRepoDir?hN6(O):O,w=B.headers.get("content-type")??"application/json";return new Response(L,{status:B.status,headers:{"content-type":w,...P5}})};try{if(H){let B=U();return B.catch(()=>{}),await Promise.race([B,new Promise((L,w)=>{if(H.aborted)return w(H.reason);H.addEventListener("abort",()=>w(H.reason),{once:!0})})])}return await U()}catch(B){let O=B instanceof Error?B.message:String(B);return $.json({error:`Daemon unreachable: ${O}`},502)}}function hN6($){try{let Z=JSON.parse($);if(Z&&typeof Z==="object"&&!Array.isArray(Z)&&"repoDir"in Z)return JSON.stringify({...Z,repoDir:null})}catch{}return $}async function wT0($,Z,X,Q="GET",Y){let G=await $.proxyDaemonRequest(Z,X,{method:Q,headers:new Headers,body:null});if(G.status===404&&Y){try{await G.body?.cancel()}catch{}if(await $.adoptLiveClaim(Y,Z))G=await $.proxyDaemonRequest(Z,X,{method:Q,headers:new Headers,body:null})}if(G.status===404){try{await G.body?.cancel()}catch{}throw Error("SANDBOX_GONE")}let J=await G.text();if(!G.ok){let W=`Daemon error (${G.status})`;try{W=JSON.parse(J).error??W}catch{}throw Error(W)}return JSON.parse(J)}function uN6($){return il$.includes($)}var _N6,cl$=524288,fN6=65536,bN6=1e4,ll$=2000,xN6,LT0,P5,il$,pl$=()=>{let $=new H1;$.use("/:virtualMcpId/:branch/*",xN6),$.post("/:virtualMcpId/:branch/write",(X)=>tZ(X,"/_sandbox/write",{forwardJsonBody:!0,signal:Bv(X)})),$.post("/:virtualMcpId/:branch/unlink",(X)=>tZ(X,"/_sandbox/unlink",{forwardJsonBody:!0,signal:Bv(X)})),$.post("/:virtualMcpId/:branch/mkdir",(X)=>tZ(X,"/_sandbox/mkdir",{forwardJsonBody:!0,signal:Bv(X)})),$.post("/:virtualMcpId/:branch/rename",(X)=>tZ(X,"/_sandbox/rename",{forwardJsonBody:!0,signal:Bv(X)})),$.post("/:virtualMcpId/:branch/read",(X)=>tZ(X,"/_sandbox/read",{forwardJsonBody:!0,signal:Bv(X)})),$.post("/:virtualMcpId/:branch/glob",(X)=>tZ(X,"/_sandbox/glob",{forwardJsonBody:!0,signal:Bv(X)})),$.post("/:virtualMcpId/:branch/grep",(X)=>tZ(X,"/_sandbox/grep",{forwardJsonBody:!0,signal:Bv(X)})),$.post("/:virtualMcpId/:branch/exec/:script",async(X)=>{let Q=X.req.param("script");if(!Q)return X.json({error:"missing script name"},400);return tZ(X,`/_sandbox/exec/${encodeURIComponent(Q)}`)}),$.post("/:virtualMcpId/:branch/exec/:script/kill",async(X)=>{let Q=X.req.param("script");if(!Q)return X.json({error:"missing script name"},400);return tZ(X,`/_sandbox/exec/${encodeURIComponent(Q)}/kill`)}),$.get("/:virtualMcpId/:branch/config",(X)=>tZ(X,"/_sandbox/config",{method:"GET",map404to410:!0,redactRepoDir:!0})),$.put("/:virtualMcpId/:branch/config",(X)=>tZ(X,"/_sandbox/config",{method:"PUT",forwardJsonBody:!0,map404to410:!0})),$.post("/:virtualMcpId/:branch/setup/:step",async(X)=>{let Q=X.req.param("step");if(!Q||!uN6(Q))return X.json({error:`step must be one of: ${il$.join(", ")}`},400);let Y=X.get("vmClaim"),G=await Y71(X.var.studioContext,{claimName:Y.claimName})==="gone"?null:await gN6(X);if(!G)return X.json({error:"sandbox not found: nothing is running at this ref"},404,P5);if(Q==="start"){let J=t(X.var.studioContext),W=Ry(Y.virtualMcpMetadata);try{await K70({ctx:X.var.studioContext,runner:G,handle:Y.claimName,orgId:J.id,userId:Y.callerUserId,entries:W})}catch(K){let F=K instanceof Error?K.message:String(K);return X.json({error:`Failed to push env to daemon: ${F}`},502)}}return tZ(X,`/_sandbox/setup/${Q}`,{signal:X.req.raw.signal,map404to410:!0,runner:G})}),$.get("/:virtualMcpId/:branch/events",(X)=>{let Q=X.get("vmClaim");if(!Q.runner)return mN(X,async(Y)=>{await Y.writeSSE({event:"phase",data:JSON.stringify({kind:"failed",reason:"unknown",message:"No sandbox runner configured on this studio instance."})})});return pc$(X,{ctx:X.var.studioContext,claimName:Q.claimName,runner:Q.runner,virtualMcpId:Q.virtualMcpId,branch:Q.branch,userId:Q.userId,projectRef:Q.projectRef,virtualMcpMetadata:Q.virtualMcpMetadata})}),$.get("/:virtualMcpId/:branch/git/status",(X)=>{if(X.get("vmClaim").runtime==="cms")return ml$(X);return Z(X)});let Z=(X)=>tZ(X,"/_sandbox/git/status",{method:"GET",map404to410:!0,signal:AbortSignal.any([X.req.raw.signal,AbortSignal.timeout(ll$)])});return $.post("/:virtualMcpId/:branch/git/status",(X)=>{if(X.get("vmClaim").runtime==="cms")return ml$(X);return tZ(X,"/_sandbox/git/status",{map404to410:!0,signal:AbortSignal.any([X.req.raw.signal,AbortSignal.timeout(ll$)])})}),$.post("/:virtualMcpId/:branch/git/diff",async(X)=>{let Q=X.get("vmClaim");if(Q.runtime==="cms")try{let Y=await X.req.json().catch(()=>({})),G=await tu(X),J=await OT0(G,Q.branch,Y.base);return X.json(J,200,P5)}catch(Y){return R71(X,Y)}return tZ(X,"/_sandbox/git/diff",{forwardJsonBody:!0,map404to410:!0})}),$.post("/:virtualMcpId/:branch/git/publish",async(X)=>{if(X.get("vmClaim").runtime==="cms")return X.json({ok:!0},200,P5);let Q=Ov(X);if(Q instanceof Response)return Q;let{claimName:Y,virtualMcpMetadata:G,connectionIds:J}=X.get("vmClaim"),W=X.var.studioContext;return Ds(Y,async()=>{try{await G71(W,Q,Y);let K=Os(G,J);if(K)await ul$(W,Q,Y,K)}catch(K){if(K instanceof Uv)return X.json({error:K.message},403,P5);let F=K instanceof Error?K.message:String(K);return X.json({error:F},502,P5)}return tZ(X,"/_sandbox/git/publish",{forwardJsonBody:!0,map404to410:!0})})}),$.post("/:virtualMcpId/:branch/git/discard",async(X)=>{let Q=X.get("vmClaim");if(Q.runtime==="cms")return Ds(Q.claimName,async()=>{let Y=await X.req.json().catch(()=>({})),G=Array.isArray(Y.filepaths)?Y.filepaths.filter((J)=>typeof J==="string"):[];if(G.length===0)return X.json({error:"filepaths is required"},400,P5);try{let J=await tu(X);return await xl$(J,Q.branch,G),X.json({ok:!0},200,P5)}catch(J){let W=J instanceof u4&&J.status===409?409:502,K=J instanceof Error?J.message:String(J);return X.json({error:K},W,P5)}});return Ds(Q.claimName,()=>tZ(X,"/_sandbox/git/discard",{forwardJsonBody:!0,map404to410:!0}))}),$.post("/:virtualMcpId/:branch/git/rebase",async(X)=>{let Q=X.get("vmClaim");if(Q.runtime==="cms")return Ds(Q.claimName,async()=>{try{let W=await X.req.json().catch(()=>({})),K=await tu(X),F=W.base??await K.getDefaultBranch();return await DT0(K,Q.branch,F),X.json({ok:!0},200,P5)}catch(W){return R71(X,W)}});let Y=Ov(X);if(Y instanceof Response)return Y;let{claimName:G}=X.get("vmClaim"),J=X.var.studioContext;return Ds(G,async()=>{try{await G71(J,Y,G)}catch(W){let K=W instanceof Error?W.message:String(W);return X.json({error:K},502,P5)}return tZ(X,"/_sandbox/git/rebase",{forwardJsonBody:!0,map404to410:!0})})}),$.post("/:virtualMcpId/:branch/git/suggest-commit",p5({maxSize:cl$,onError:(X)=>X.json({error:"Payload too large"},413,P5)}),async(X)=>{let Q=X.get("vmClaim"),Y=null;if(Q.runtime!=="cms"){let F=Ov(X);if(F instanceof Response)return F;Y=F}let{claimName:G,userId:J,projectRef:W}=Q,K=X.var.studioContext;try{let F=await X.req.json().catch(()=>({})),H=F.status,N=F.diff,U=N!=null&&typeof N.diffs==="object"&&N.diffs!==null,[B,O]=K71(H)&&U?[H,N]:Y?await Promise.all([wT0(Y,G,"/_sandbox/git/status","GET",{userId:J,projectRef:W}),wT0(Y,G,"/_sandbox/git/diff","GET",{userId:J,projectRef:W})]):await(async()=>{let w=await tu(X);return Promise.all([BT0(w,Q.branch),OT0(w,Q.branch)])})(),L=await ac$(K,B,O);return X.json(L,200,P5)}catch(F){let H=F instanceof Error?F.message:String(F);if(H==="SANDBOX_GONE")return X.json({error:"Sandbox handle is gone. The sandbox needs to be re-provisioned."},410,P5);return X.json({error:H},502,P5)}}),$.post("/:virtualMcpId/:branch/git/judge-review",p5({maxSize:cl$,onError:(X)=>X.json({error:"Payload too large"},413,P5)}),async(X)=>{let Q=X.get("vmClaim"),Y=null;if(Q.runtime!=="cms"){let F=Ov(X);if(F instanceof Response)return F;Y=F}let{claimName:G,userId:J,projectRef:W}=Q,K=X.var.studioContext;try{let F=await X.req.json().catch(()=>({})),H=F.status,N=F.diff,U=N!=null&&typeof N.diffs==="object"&&N.diffs!==null,[B,O]=K71(H)&&U?[H,N]:Y?await Promise.all([wT0(Y,G,"/_sandbox/git/status","GET",{userId:J,projectRef:W}),wT0(Y,G,"/_sandbox/git/diff","GET",{userId:J,projectRef:W})]):await(async()=>{let w=await tu(X);return Promise.all([BT0(w,Q.branch),OT0(w,Q.branch)])})(),L=await ec$(K,B,O,typeof F.language==="string"?F.language:void 0);return X.json(L,200,P5)}catch(F){let H=F instanceof Error?F.message:String(F);if(H==="SANDBOX_GONE")return X.json({error:"Sandbox handle is gone. The sandbox needs to be re-provisioned."},410,P5);return X.json({error:H},502,P5)}}),$.get("/:virtualMcpId/:branch/preview-fetch",async(X)=>{let Q=Ov(X);if(Q instanceof Response)return Q;let{claimName:Y}=X.get("vmClaim"),G=X.req.query("path");if(!G||!G.startsWith("/")||G.startsWith("//")||G.includes("..")||G.includes("\\"))return X.json({error:"Path not allowed"},403);let J;try{J=await Q.getPreviewUrl(Y)}catch{return X.json({error:"Preview not available"},502)}if(!J)return X.json({error:"Preview not available"},502);let W=J.replace(/\/+$/,"");return dl$(X,`${W}${G}`)}),$.post("/:virtualMcpId/:branch/preview-invoke",p5({maxSize:fN6,onError:(X)=>X.json({error:"Payload too large"},413)}),async(X)=>{let Q=Ov(X);if(Q instanceof Response)return Q;let{claimName:Y}=X.get("vmClaim"),G;try{G=await Q.getPreviewUrl(Y)}catch{return X.json({error:"Preview not available"},502)}if(!G)return X.json({error:"Preview not available"},502);let J;try{J=await X.req.json()}catch{return X.json({error:"Invalid JSON body"},400)}if(!J||typeof J!=="object"||Array.isArray(J))return X.json({error:"Invalid JSON body"},400);let W=yl$(J);if(!W)return X.json({error:"Invalid or missing __resolveType"},400);let K=gl$(G,W.resolveType);return dl$(X,K,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(W.payload),signal:AbortSignal.timeout(30000)})}),$};var nl$=D(()=>{U8();jF();lu();Q71();Xn();dc$();h3();my();mc$();m3();ic$();nc$();Bi0();Gn();N71();$l$();B71();dD();A71();hl$();T71();_N6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;xN6=$T0(async($,Z)=>{let X=$.var.studioContext;try{o(X)}catch{return $.json({error:"Unauthorized"},401)}let Q=o0(X);if(!Q)return $.json({error:"Unauthorized"},401);let Y;try{Y=t(X)}catch{return $.json({error:"Organization scope required"},403)}let G=$.req.param("virtualMcpId"),J=$.req.param("branch");if(!G||!J)return $.json({error:"virtualMcpId and branch are required"},400);try{vN6(J)}catch(L){let w=L instanceof Error?L.message:String(L);return $.json({error:w},400)}let W=await X.storage.virtualMcps.findById(G);if(!W||W.organization_id!==Y.id)return $.json({error:"Virtual MCP not found"},404);let K=$n({orgId:Y.id,virtualMcpId:G,branch:J}),F=await Wi0(X,J),H=Ki0(F,Q),N=lc$({userId:H,projectRef:K}),U=W.metadata??null,B=await yN6($,{claimName:N,branch:J,virtualMcpId:G,sandboxUserId:H,virtualMcpMetadata:U,branchThread:F});if(B==="cms")return $.set("vmClaim",{claimName:N,callerUserId:Q,runner:null,virtualMcpId:G,branch:J,userId:H,projectRef:K,virtualMcpMetadata:U,connectionIds:W.connections?.map((L)=>L.connection_id)??[],runtime:B}),Z();let O;try{O=await ZQ(X)}catch{O=null}if(!O)return $.json({error:"No sandbox runner found"},404);return $.set("vmClaim",{claimName:N,callerUserId:Q,runner:O,virtualMcpId:G,branch:J,userId:H,projectRef:K,virtualMcpMetadata:U,connectionIds:W.connections?.map((L)=>L.connection_id)??[],runtime:B}),Z()});LT0=new Map;P5={"Cache-Control":"no-store, no-cache, must-revalidate",Pragma:"no-cache"};il$=["clone","install","start"]});function tl$($,Z,X){let Q=I71.get($);if(!Q)Q={pending:null,running:!1},I71.set($,Q);if(!Q.pending)Q.pending={set:new Map,del:new Set,deps:Z,resolvers:[],rejecters:[]};let Y=Q.pending;Y.deps=Z;for(let[J,W]of Object.entries(X.set??{}))Y.set.set(J,W),Y.del.delete(J);for(let J of X.delete??[])Y.del.add(J),Y.set.delete(J);let G=new Promise((J,W)=>{Y.resolvers.push(J),Y.rejecters.push(W)});if(!Q.running)lN6($,Q);return G}async function lN6($,Z){Z.running=!0;try{while(Z.pending){let X=Z.pending;Z.pending=null;try{let Q=await dN6(X);for(let Y of X.resolvers)Y(Q)}catch(Q){for(let Y of X.rejecters)Y(Q)}}}finally{if(Z.running=!1,!Z.pending)I71.delete($)}}async function dN6($){let{client:Z,branch:X,packagePath:Q}=$.deps;for(let Y=0;;Y++){let G=await nu(Z,X),J=await Z.getCommitTreeSha(G),W=await Z.getDecofileTree(J,Q),K=j71(W,Q),F=[],H=new Map(K.map((O)=>[O.path,{stem:O.stem,sha:O.sha}]));for(let[O,L]of $.set){let w=z71(K,O),E=`${JSON.stringify(L,null,2)}
|
|
2924
|
-
`,j=await Z.createBlob(E);await _l$(Z.owner,Z.repo,j,E);let z=w[0]??`${NT0(Q)}/${O71(O)}.json`;F.push({path:z,mode:"100644",type:"blob",sha:j});let A=z.slice(z.lastIndexOf("/")+1,-5);H.set(z,{stem:A,sha:j,content:E});for(let P of w.slice(1))F.push({path:P,mode:"100644",type:"blob",sha:null}),H.delete(P)}for(let O of $.del)for(let L of z71(K,O))F.push({path:L,mode:"100644",type:"blob",sha:null}),H.delete(L);if(F.length===0)return G;let N=Q?`${Q}/.deco/blocks.gen.json`:".deco/blocks.gen.json";if(W.some((O)=>O.type==="blob"&&O.path===N)){let O=await Promise.all([...H.values()].map(async(j)=>({stem:j.stem,content:j.content??await Z.getBlobText(j.sha)}))),{decofile:L,skipped:w}=Hs(O);if(w.length>0)console.warn("decofile gen: dropped blocks that were not valid JSON",{repo:`${Z.owner}/${Z.repo}`,branch:X,packagePath:Q,blocks:w.map((j)=>j.key)});let E=await Z.createBlob(L);F.push({path:N,mode:"100644",type:"blob",sha:E})}let U=await Z.createTree(J,F),B=await Z.createCommit({message:mN6($),treeSha:U,parentShas:[G]});try{return await Z.updateRef(X,B),B}catch(O){if(!(O instanceof u4&&O.status===422)||Y>=cN6-1)throw O;await L$(aZ(2000,200,Y,2,0.5))}}}function mN6($){let Z=(Y)=>{let G=Y.slice(0,3).join(", ");return Y.length>3?`${G} (+${Y.length-3} more)`:G},X=[];if($.set.size>0)X.push(`update ${Z([...$.set.keys()])}`);if($.del.size>0)X.push(`delete ${Z([...$.del])}`);let Q=`chore(decofile): ${X.join("; ")}`;return Zi0(Q,$.deps.coAuthor)}var cN6=3,I71;var ol$=D(()=>{uO0();YT0();W4();dD();UT0();I71=new Map});import{createHmac as rl$,randomBytes as iN6,timingSafeEqual as pN6}from"crypto";function al$(){if(ET0)return ET0;let $;try{let Z=b0();$=Z.studioJwtSecret??Z.betterAuthSecret}catch{$=void 0}return ET0=$?Buffer.from($):iN6(32),ET0}function q71($){let Z=$.nowMs??Date.now(),X={o:$.organizationId,m:$.virtualMcpId,b:$.branch,e:Math.floor((Z+nN6)/1000)},Q=Buffer.from(JSON.stringify(X)).toString("base64url"),Y=rl$("sha256",al$()).update(Q).digest("base64url");return`${Q}.${Y}`}function sl$($,Z){let X=$.indexOf(".");if(X<0)return!1;let Q=$.slice(0,X),Y=Buffer.from($.slice(X+1)),G=Buffer.from(rl$("sha256",al$()).update(Q).digest("base64url"));if(Y.length!==G.length||!pN6(Y,G))return!1;let J;try{J=JSON.parse(Buffer.from(Q,"base64url").toString())}catch{return!1}let W=Math.floor((Z.nowMs??Date.now())/1000);return J.o===Z.organizationId&&J.m===Z.virtualMcpId&&J.b===Z.branch&&typeof J.e==="number"&&J.e>=W}var nN6=21600000,ET0=null;var el$=D(()=>{R$()});import{z as ou}from"zod";function oN6($){return $.length>0&&$.length<=255&&!$.includes("..")&&!$.endsWith("/")&&!$.endsWith(".lock")&&tN6.test($)}function Yd$($){return $.req.header("x-forwarded-host")??new URL($.req.url).host}async function Ls($){let Z=$.get("decofileScope");return XT0($.var.studioContext,Z.organizationId,Z.githubRepo)}function ws($,Z){if(Z instanceof u4){let Q=Z.status===404?404:Z.status===409?409:Z.status===422?409:502;return $.json({error:Z.message},Q)}let X=Z instanceof Error?Z.message:String(Z);return $.json({error:X},500)}function Gd$(){let $=new H1;return $.use("/:virtualMcpId/:branch",Qd$),$.use("/:virtualMcpId/:branch/*",Qd$),$.get("/:virtualMcpId/:branch",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await Ls(Z),Y=await vl$(Q,X.branch,X.packagePath,{createBranchIfMissing:!!X.userId}),G={ETag:`"${Y.sha}"`,"Cache-Control":"no-store","Access-Control-Allow-Origin":"*"};if(Z.req.header("if-none-match")===`"${Y.sha}"`)return Z.body(null,304,G);if(!X.userId)return Z.body(Y.decofile,200,{...G,"content-type":"application/json"});let J=q71({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.body(`{"version":${JSON.stringify(Y.sha)},"token":${JSON.stringify(J)},"apiHost":${JSON.stringify(Yd$(Z))},"decofile":${Y.decofile}}`,200,{...G,"content-type":"application/json"})}catch(Q){return ws(Z,Q)}}),$.get("/:virtualMcpId/:branch/meta",async(Z)=>{let X=Z.get("decofileScope"),Q=X.packagePath?`${X.packagePath}/.deco/meta.gen.json`:".deco/meta.gen.json";try{let Y=await Ls(Z),G=await Y.getFileTextAtRef(X.branch,Q);if(G===null){let J=await Y.getDefaultBranch();if(J!==X.branch)G=await Y.getFileTextAtRef(J,Q)}if(G===null)return Z.json({error:"meta.gen.json not committed"},404);return Z.body(G,200,{"content-type":"application/json","Cache-Control":"no-store","Access-Control-Allow-Origin":"*"})}catch(Y){return ws(Z,Y)}}),$.patch("/:virtualMcpId/:branch",aN6,async(Z)=>{let X=Z.get("decofileScope"),Q=Z.var.studioContext,Y=sN6.safeParse(await Z.req.json().catch(()=>null));if(!Y.success)return Z.json({error:"Invalid body",details:Y.error.issues},400);let G=Y.data;for(let J of[...Object.keys(G.set??{}),...G.delete??[]])try{QT0(J)}catch(W){let K=W instanceof Error?W.message:String(W);return Z.json({error:K},400)}for(let[J,W]of Object.entries(G.set??{}))if(typeof W!=="object"||W===null||Array.isArray(W))return Z.json({error:`Block "${J}" must be a JSON object`},400);try{let J=await Ls(Z),W=await tl$(`${X.organizationId}/${X.virtualMcpId}/${X.branch}`,{client:J,branch:X.branch,packagePath:X.packagePath,coAuthor:du(Q)},G),K=q71({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.json({version:W,token:K,apiHost:Yd$(Z)})}catch(J){return ws(Z,J)}}),$.post("/:virtualMcpId/:branch/publish",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await Ls(Z),Y=await Q.getDefaultBranch();if(Y===X.branch)return Z.json({error:"Branch is already the default branch"},400);let G=`chore(decofile): publish ${X.branch}`;try{let J;try{J=await Q.mergeBranch(Y,X.branch,G)}catch(W){if(!(W instanceof u4&&W.status===409))throw W;await DT0(Q,X.branch,Y),J=await Q.mergeBranch(Y,X.branch,G)}return J?Z.json({result:"merged",sha:J}):Z.json({result:"up-to-date"})}catch(J){if(J instanceof u4&&J.status===409)return Z.json({error:"merge-conflict"},409);if(J instanceof u4&&J.status===405){let K=await Q.findOpenPullRequest(Y,X.branch)??await Q.createPullRequest({base:Y,head:X.branch,title:`Publish ${X.branch}`});return Z.json({result:"pull-request",number:K.number,url:K.html_url})}throw J}}catch(Q){return ws(Z,Q)}}),$.get("/:virtualMcpId/:branch/status",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await Ls(Z),Y=await Q.getDefaultBranch();if(Y===X.branch)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0,lastCommitAt:null});try{let[{aheadBy:G,behindBy:J},W]=await Promise.all([Q.compare(Y,X.branch),Q.getBranchHead(X.branch)]);return Z.json({baseBranch:Y,aheadBy:G,behindBy:J,lastCommitAt:W.committedAt})}catch(G){if(G instanceof u4&&G.status===404)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0,lastCommitAt:null});throw G}}catch(Q){return ws(Z,Q)}}),$}var tN6,$d$=500,Zd$=1048576,Xd$=1024,rN6=8388608,aN6,sN6,Qd$;var Jd$=D(()=>{yn0();YT0();U8();jF();Q71();ZT0();T71();B71();ol$();el$();A71();dD();UT0();tN6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;aN6=p5({maxSize:rN6,onError:($)=>$.json({error:"Payload too large"},413)}),sN6=ou.object({set:ou.record(ou.string(),ou.unknown()).optional(),delete:ou.array(ou.string()).optional()}).refine(($)=>Object.keys($.set??{}).length>0||($.delete?.length??0)>0,{message:"Patch must set or delete at least one block"}).refine(($)=>Object.keys($.set??{}).length+($.delete?.length??0)<=$d$,{message:`Patch cannot touch more than ${$d$} blocks`}).refine(($)=>Object.values($.set??{}).every((Z)=>JSON.stringify(Z).length<=Zd$),{message:`Each block must be at most ${Zd$} bytes`}).refine(($)=>[...Object.keys($.set??{}),...$.delete??[]].every((Z)=>Z.length<=Xd$),{message:`Each block key must be at most ${Xd$} characters`}),Qd$=$T0(async($,Z)=>{let X=$.var.studioContext,Q=X.organization;if(!Q)return $.json({error:"Organization scope required"},500);let Y=$.req.param("virtualMcpId"),G=$.req.param("branch");if(!Y||!G)return $.json({error:"virtualMcpId and branch are required"},400);if(!oN6(G))return $.json({error:`Invalid branch name: ${G}`},400);let J=X.auth?.user?.id??null;if(!J){let B=$.req.query("token");if(!($.req.method==="GET"&&!$.req.path.match(/\/(publish|status)$/)))return $.json({error:"Unauthorized"},401);if(!B||!sl$(B,{organizationId:Q.id,virtualMcpId:Y,branch:G}))return $.json({error:"Unauthorized"},401)}let W=await X.storage.virtualMcps.findById(Y);if(!W||W.organization_id!==Q.id)return $.json({error:"Virtual MCP not found"},404);let K=W.metadata??null;if(!iO0(K))return $.json({error:"Project has no preview server configured"},404);let H=W.connections?.map((B)=>B.connection_id)??[],N=Os(K,H);if(!N)return $.json({error:"Project has no GitHub repository"},404);let U=K?.runtime;return $.set("decofileScope",{organizationId:Q.id,virtualMcpId:Y,branch:G,packagePath:U?.path?.replace(/^\/+|\/+$/g,"")||null,githubRepo:N,userId:J}),Z()})});var Wd$=($)=>{let Z=new H1;if(Z.use("*",Xv),Z.route("/",wA0()),Z.route("/",Tg$()),Z.route("/",Vc$()),Z.route("/",qc$()),Z.route("/",aA0()),Z.route("/tools",xc$()),Z.route("/",vc$()),Z.route("/",Gc$({kvStorage:$.kvStorage})),Z.route("/",Qc$()),Z.route("/fs",jc$({getConnection:$.getNatsConnection})),Z.route("/sandbox",pl$()),Z.route("/decofile",Gd$()),Z.route("/",Tc$()),Z.route("/deco-sites",jA0()),Z.route("/sso",NA0()),Z.route("/",sA0({tokenStorage:$.tokenStorage,automationEventDispatcher:$.automationEventDispatcher})),Z.route("/webhooks",Dg$()),$.mountDevAssets)Z.route("/dev-assets",zA0({orgFromPath:!0}));return Z.use("/mcp/:connectionId?",$.mcpAuth),Z.use("/mcp/:connectionId/ui-resource",$.mcpAuth),Z.use("/mcp/gateway/:virtualMcpId?",$.mcpAuth),Z.use("/mcp/virtual-mcp/:virtualMcpId?",$.mcpAuth),Z.use("/mcp/self",$.mcpAuth),Z.use("/mcp/task-run/:threadId",$.mcpAuth),Z.route("/",bb$()),Z.get("/mcp/:gateway?/:connectionId/.well-known/oauth-protected-resource/*",$.betterAuthProtectedResourceHandler),Z.get("/mcp/.well-known/oauth-protected-resource",$.betterAuthProtectedResourceHandler),Z.route("/mcp/task-run",Pc$()),Z.route("/mcp",Pw0()),Z.route("/mcp/self",rA0()),Z.route("/mcp",Rw0()),Z.all("/oauth-proxy/:connectionId/*",$.oauthProxyHandler),Z.get("/watch",$.watchHandler),Z};var Kd$=D(()=>{U8();I91();Lg$();V91();PA0();xa();T91();Yc$();Jc$();zc$();dt();w91();Iw0();rZ1();Ac$();Rc$();Mc$();Sc$();fc$();sZ1();yc$();eZ1();Aw0();nl$();Jd$()});function eN6($){return $.filter((Z)=>Z.vendors?.alias).map((Z)=>({name:Z.name,title:Z.title,description:Z.description,logo:Z.logo,category:Z.category,vendor:{alias:Z.vendors.alias,url:Z.vendors.url}}))}var $U6=async($,Z)=>{if(!$.get("studioContext").auth.user?.id)return $.json({error:"Unauthorized"},401);return Z()},Fd$=()=>{let $=new H1;return $.use("*",$U6),$.get("/",async(Z)=>{let X=b0(),Q=X.decoSupabaseUrl,Y=X.decoSupabaseServiceKey;if(!Q||!Y)return Z.json({apps:[]});try{let G=await nZ(Q,Y,"apps?select=name,title,description,logo,category,vendors(alias,url)");return Z.json({apps:eN6(G)})}catch(G){return console.error("[deco-apps] GET error:",G),Z.json({error:"Failed to fetch apps"},502)}}),$};var Hd$=D(()=>{U8();R$();DP0()});import{z as M1}from"zod";function RF($,Z="invalid_request_error",X=null,Q=null){return{error:{message:$,type:Z,param:X,code:Q}}}function HU6($){if(!$)return null;let Z=$.indexOf(":");if(Z===-1)return{credentialId:null,modelId:$};let X=$.substring(0,Z),Q=$.substring(Z+1);if(!X||!Q)return null;return{credentialId:X,modelId:Q}}function NU6($,Z,X){try{return JSON.parse($)}catch{throw new Bd$(`Invalid JSON in tool call arguments for function '${X}' (tool_call_id: ${Z}): ${$}`)}}function UU6($){let Z={};for(let X of $)if(X.role==="assistant"&&X.tool_calls)for(let Q of X.tool_calls)Z[Q.id]=Q.function.name;return $.map((X)=>{switch(X.role){case"system":return{role:"system",content:X.content};case"user":if(typeof X.content==="string")return{role:"user",content:X.content};return{role:"user",content:X.content.map((Y)=>{if(Y.type==="text")return{type:"text",text:Y.text};return{type:"image",image:Y.image_url.url}})};case"assistant":if(X.tool_calls&&X.tool_calls.length>0)return{role:"assistant",content:X.tool_calls.map((Y)=>({type:"tool-call",toolCallId:Y.id,toolName:Y.function.name,input:NU6(Y.function.arguments,Y.id,Y.function.name)}))};return{role:"assistant",content:X.content??""};case"tool":let Q=Z[X.tool_call_id]??"unknown";return{role:"tool",content:[{type:"tool-result",toolCallId:X.tool_call_id,toolName:Q,output:{type:"text",value:X.content}}]}}})}function BU6($){let Z=$.map((X)=>{let Q=X.function.parameters?iY(X.function.parameters):iY({type:"object",properties:{}});return[X.function.name,I$({description:X.function.description,inputSchema:Q})]});return Object.fromEntries(Z)}function OU6($){if(!$)return;return{openai:{response_format:$}}}function DU6(){return`chatcmpl-${crypto.randomUUID().replace(/-/g,"").substring(0,29)}`}function Nd$($,Z,X,Q,Y,G){let J={model:$,messages:Z,tools:X,temperature:Q.temperature,maxTokens:Q.max_tokens,topP:Q.top_p,frequencyPenalty:Q.frequency_penalty,presencePenalty:Q.presence_penalty,stopSequences:Q.stop?Array.isArray(Q.stop)?Q.stop:[Q.stop]:void 0,abortSignal:G};return Y?{...J,providerOptions:Y}:J}function Ud$($){if($==="tool-calls")return"tool_calls";if($==="length")return"length";return"stop"}var ZU6=256,XU6,QU6,YU6,GU6,JU6,WU6,KU6,FU6,Bd$,Od$,Dd$;var Ld$=D(()=>{D4();U8();lu();TN();XU6=M1.object({type:M1.literal("function"),function:M1.object({name:M1.string(),description:M1.string().optional(),parameters:M1.record(M1.string(),M1.unknown()).optional()})}),QU6=M1.object({id:M1.string(),type:M1.literal("function"),function:M1.object({name:M1.string(),arguments:M1.string()})}),YU6=M1.discriminatedUnion("role",[M1.object({role:M1.literal("system"),content:M1.string(),name:M1.string().optional()}),M1.object({role:M1.literal("user"),content:M1.union([M1.string(),M1.array(M1.union([M1.object({type:M1.literal("text"),text:M1.string()}),M1.object({type:M1.literal("image_url"),image_url:M1.object({url:M1.string(),detail:M1.string().optional()})})]))]),name:M1.string().optional()}),M1.object({role:M1.literal("assistant"),content:M1.string().nullable().optional(),name:M1.string().optional(),tool_calls:M1.array(QU6).optional()}),M1.object({role:M1.literal("tool"),content:M1.string(),tool_call_id:M1.string()})]),GU6=M1.object({type:M1.literal("text")}),JU6=M1.object({type:M1.literal("json_object")}),WU6=M1.object({type:M1.literal("json_schema"),json_schema:M1.object({name:M1.string(),description:M1.string().optional(),schema:M1.record(M1.string(),M1.unknown()),strict:M1.boolean().optional()})}),KU6=M1.union([GU6,JU6,WU6]),FU6=M1.object({model:M1.string().describe("Format: 'model_id' or 'credential_id:model_id'"),messages:M1.array(YU6),stream:M1.boolean().optional().default(!1),temperature:M1.number().min(0).max(2).optional(),max_tokens:M1.number().positive().optional(),top_p:M1.number().min(0).max(1).optional(),frequency_penalty:M1.number().min(-2).max(2).optional(),presence_penalty:M1.number().min(-2).max(2).optional(),stop:M1.union([M1.string(),M1.array(M1.string())]).optional(),tools:M1.array(XU6).optional(),tool_choice:M1.union([M1.literal("auto"),M1.literal("none"),M1.literal("required"),M1.object({type:M1.literal("function"),function:M1.object({name:M1.string()})})]).optional(),response_format:KU6.optional(),user:M1.string().optional()});Bd$=class Bd$ extends Error{constructor($){super($);this.name="MessageConversionError"}};Od$=new H1;Od$.post("/:org/v1/chat/completions",async($)=>{let Z=$.get("studioContext"),X=$.req.param("org");try{if(!Z.auth.apiKey?.id)return $.json(RF("API key authentication required. Provide a valid API key via Authorization header.","authentication_error"),401);if(!Z.organization)return $.json(RF("Organization context is required. Ensure your API key has organization metadata.","invalid_request_error","organization"),400);if((Z.organization.slug??Z.organization.id)!==X)return $.json(RF("Organization mismatch. The API key's organization does not match the requested organization.","invalid_request_error","organization"),403);let Q=await $.req.json(),Y=FU6.safeParse(Q);if(!Y.success){let w=Y.error.issues[0]??{message:"Invalid request",path:[]};return $.json(RF(`Invalid request: ${w.message}`,"invalid_request_error",w.path.length>0?w.path.join("."):null),400)}let G=Y.data,J=HU6(G.model);if(!J)return $.json(RF("Invalid model format. Expected 'model_id' or 'credential_id:model_id' (e.g., 'claude-sonnet-4-6' or 'key_abc123:claude-sonnet-4-6')","invalid_request_error","model"),400);let{credentialId:W}=J,{modelId:K}=J;if(!W){let E=(await Z.storage.aiProviderKeys.list({organizationId:Z.organization.id})).find((j)=>Ww(j.providerId));if(!E)return $.json(RF("No AI provider credentials configured for this organization. Add a credential in settings or specify one explicitly via 'credential_id:model_id'.","invalid_request_error","model"),400);W=E.id}let F;try{F=await Z.aiProviders.activate(W,Z.organization.id)}catch{return $.json(RF(`AI provider credential not found or inaccessible: ${W}`,"invalid_request_error","model"),404)}let H=F.aiSdk.languageModel(K),N=UU6(G.messages),U=G.tools?BU6(G.tools):void 0,B=OU6(G.response_format),O=DU6(),L=Math.floor(Date.now()/1000);if(G.stream)return mN($,async(w)=>{let E=Nd$(H,N,U,G,B,$.req.raw.signal);try{let j=PO(E),z=!1,A=0,P="",I=async()=>{if(P.length===0)return;let q=P;P="",await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{content:q},finish_reason:null}]})})};for await(let q of j.fullStream){if(!z&&(q.type==="text-delta"||q.type==="tool-call"))await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{role:"assistant",content:""},finish_reason:null}]})}),z=!0;if(q.type==="text-delta"){if(P+=q.text,P.length>=ZU6)await I()}else if(q.type==="tool-call"){await I();let k=A++;await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{tool_calls:[{index:k,id:q.toolCallId,type:"function",function:{name:q.toolName,arguments:JSON.stringify(q.input)}}]},finish_reason:null}]})})}else if(q.type==="finish")await I(),await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{},finish_reason:Ud$(q.finishReason)}],usage:q.totalUsage?{prompt_tokens:q.totalUsage.inputTokens??0,completion_tokens:q.totalUsage.outputTokens??0,total_tokens:q.totalUsage.totalTokens??0}:void 0})})}await I(),await w.writeSSE({data:"[DONE]"})}catch(j){let z=j;console.error("[openai-compat:stream] Error:",z.message),await w.writeSSE({data:JSON.stringify({error:{message:z.message,type:"server_error"}})})}});else{let w=Nd$(H,N,U,G,B,$.req.raw.signal),E=await jO(w),j={role:"assistant",content:E.text||null};if(E.toolCalls&&E.toolCalls.length>0)j.tool_calls=E.toolCalls.map((z)=>({id:z.toolCallId,type:"function",function:{name:z.toolName,arguments:JSON.stringify("input"in z?z.input:{})}})),j.content=null;return $.json({id:O,object:"chat.completion",created:L,model:G.model,choices:[{index:0,message:j,finish_reason:Ud$(E.finishReason)}],usage:{prompt_tokens:E.usage?.inputTokens??0,completion_tokens:E.usage?.outputTokens??0,total_tokens:E.usage?.totalTokens??0}})}}catch(Q){let Y=Q;if(Y.name==="AbortError")return $.json(RF("Request aborted","invalid_request_error"),400);if(Y.name==="MessageConversionError")return $.json(RF(Y.message,"invalid_request_error","messages"),400);return console.error("[openai-compat] Error:",Y.message,Y.stack),$.json(RF(Y.message,"server_error"),500)}});Dd$=Od$});function LU6($){if(typeof $!=="object"||$===null)return!1;let X=$.githubRepo?.url;return typeof X==="string"&&X.length>0}function wd$(){let $=new H1;return $.use("*",async(Z,X)=>{await X(),Z.header("Cache-Control","private, no-store"),Z.header("Vary","Cookie")}),$.get("/",async(Z)=>{let X=Z.get("studioContext"),Q=o0(X);if(!Q)return Z.json({error:"Authentication required"},401);let G=(Z.req.query("site")??"").trim().toLowerCase();if(!rG(G))return Z.json({error:"Invalid site slug"},400);let J=await X.db.selectFrom("member").innerJoin("organization","organization.id","member.organizationId").select(["organization.id as id","organization.slug as slug","organization.name as name","organization.metadata as metadata"]).where("member.userId","=",Q).execute(),W=[];for(let F of J){if(!F.slug||vZ(F))continue;let H=await X.storage.virtualMcps.list(F.id);for(let N of H){if(Xe1(N)!==G)continue;if(!LU6(N.metadata))continue;W.push({orgSlug:F.slug,orgName:F.name??F.slug,project:{id:N.id,title:N.title,icon:N.icon??null}})}}let K={matches:W};return Z.json(K)}),$}var Ed$=D(()=>{U8();ZO()});var zd$;var jd$=D(()=>{zd$={name:"decocms",version:"4.297.5",description:"Deco CMS \u2014 Self-hostable MCP Gateway for managing AI connections and tools",author:"Deco team",repository:{type:"git",url:"git+https://github.com/decocms/studio.git",directory:"apps/api"},bugs:{url:"https://github.com/decocms/studio/issues"},type:"module",bin:{deco:"./dist/server/cli.js"},files:["dist/**/*"],scripts:{dev:"bun run migrate && bun run dev:server","dev:server":"bun run --cwd=../../packages/sandbox build && NODE_ENV=development bun --env-file=.env --hot run src/index.ts",build:"bun run build:server","build:server":"bun run scripts/bundle-server-script.ts --dist ./dist/server","generate:tool-contracts":"bun run scripts/generate-tool-contracts.ts","db:migrate":"bun run ./dist/server/migrate.js","db:migrate:dbos":"bun run ./dist/server/migrate-dbos.js",check:"tsc --noEmit",start:"bun run ./dist/server/server.js",migrate:"bun run src/database/migrate.ts","migrate:dbos":"bun run src/database/migrate-dbos.ts",test:"bun test src","better-auth:migrate":"bunx --bun @better-auth/cli migrate -y --config src/auth/index.ts",prepublishOnly:"bun run --cwd=../.. build:studio"},optionalDependencies:{"@duckdb/node-api":"^1.5.0-r.1"},dependencies:{"@ai-sdk/anthropic":"^3.0.85","@ai-sdk/google":"^3.0.83","@ai-sdk/openai":"^3.0.73","@anthropic-ai/sdk":"^0.105.0","@aws-sdk/client-s3":"^3.1013.0","@aws-sdk/client-sts":"^3.1013.0","@aws-sdk/lib-storage":"^3.1013.0","@aws-sdk/s3-request-presigner":"^3.1013.0","@clickhouse/client":"^1.8.1","@dbos-inc/dbos-sdk":"^4.21.6","@inkjs/ui":"^2.0.0","@nats-io/jetstream":"3.4.0","@nats-io/kv":"3.4.0","@nats-io/nats-core":"3.4.0","@nats-io/transport-node":"3.4.0","@openrouter/ai-sdk-provider":"^2.9.1","@opentelemetry/core":"^2.6.0","embedded-postgres":"^18.3.0-beta.16",ink:"^6.8.0",kysely:"^0.28.12","posthog-node":"^5.0.0",react:"^19.2.6","react-dom":"^19.2.6"},devDependencies:{"@ai-sdk/provider":"^3.0.10","@better-auth/sso":"1.4.1","@decocms/better-auth":"1.5.17","@decocms/bindings":"workspace:*","@decocms/mcp-utils":"workspace:*","@decocms/runtime":"workspace:*","@decocms/sandbox":"workspace:*","@decocms/shared":"workspace:*","@jitl/quickjs-wasmfile-release-sync":"0.31.0","@modelcontextprotocol/sdk":"1.29.0","@opentelemetry/api":"^1.9.0","@opentelemetry/api-logs":"^0.211.0","@opentelemetry/exporter-logs-otlp-proto":"^0.211.0","@opentelemetry/exporter-prometheus":"^0.208.0","@opentelemetry/exporter-trace-otlp-proto":"^0.207.0","@opentelemetry/instrumentation-runtime-node":"^0.24.0","@opentelemetry/resources":"^2.6.0","@opentelemetry/sdk-logs":"^0.211.0","@opentelemetry/sdk-metrics":"^2.2.0","@opentelemetry/sdk-node":"^0.207.0","@opentelemetry/sdk-trace-base":"^2.5.0","@types/bun":"^1.3.1","@types/google.maps":"^3.65.2","@types/pg":"^8.15.6","@types/react-syntax-highlighter":"^15.5.13","@vercel/nft":"^1.1.1",ai:"^6.0.208","better-auth":"1.4.22",croner:"^9.1.0",degit:"^2.8.4",hono:"^4.10.7",jose:"^6.0.11",nanoid:"^5.1.6",pg:"^8.16.3",typescript:"^7.0.2",typescript5:"npm:typescript@^5.9.3",zod:"4.3.6"},homepage:"https://github.com/decocms/studio",keywords:["mcp","model-context-protocol","ai","gateway","self-hosted","tools"],license:"MIT",publishConfig:{access:"public"}}});function jU6(){let $=process.env.POSTHOG_KEY;if(!$)return null;return{key:$,host:process.env.POSTHOG_HOST??EU6}}var Pd$,EU6="https://ph.studio.decocms.com",Ad$;var Td$=D(()=>{U8();c50();yC();$9();R$();K91();jd$();Pd$=new H1;Pd$.get("/",($)=>{let Z={version:zd$.version,theme:qi1(),...IH().logo&&{logo:IH().logo},...HN()&&{internalUrl:Z_1()},...b0().enableDecoImport&&{enableDecoImport:!0},brandExtractEnabled:!!b0().firecrawlApiKey,auth:Iy$(),posthog:jU6(),googleMapsApiKey:process.env.GOOGLE_MAPS_API_KEY?.trim()||null,runtime:{agentSandbox:Is()}};return $.header("Cache-Control","no-store"),$.json({success:!0,config:Z})});Ad$=Pd$});function ru($){let Z=($??"").trim().toLowerCase();return Z=Z.replace(/^https?:\/\//,""),Z=Z.replace(/^www\./,""),Z=Z.split(/[/?#]/)[0]??"",Z.replace(/\/+$/,"")}function M71($){return(ru($).split(".")[0]||$).replace(/[-_]/g," ").split(" ").filter(Boolean).map((X)=>X.charAt(0).toUpperCase()+X.slice(1)).join(" ")}function Id$($,Z=64){return`https://www.google.com/s2/favicons?domain=${encodeURIComponent(ru($))}&sz=${Z}`}function Rd$($,Z){let X=$.trim();if(X.length<=Z)return X;let Q=X.slice(0,Z-1),Y=Q.lastIndexOf(" ");return`${(Y>Z*0.6?Q.slice(0,Y):Q).trimEnd()}\u2026`}function qd$($){let{brand:Z,domain:X,score:Q,verdict:Y}=$,G=typeof Q==="number"?`${Z} commerce report \u2014 ${Math.round(Q)}/100 \xB7 decocms`:`${Z} commerce report \xB7 decocms`,J=`See the full ${Z} scorecard \u2014 SEO, performance, conversion & AEO signals scored by decocms.`,W=Y?.trim()?Rd$(`${Y.trim().replace(/\s+/g," ")} \u2014 ${J}`,200):Rd$(`How does ${X} really perform? ${J}`,200);return{title:G,description:W}}import{z as l0}from"zod";var Dv,zU6,PU6,AU6,TU6,Md$;var kd$=D(()=>{Dv=l0.enum(["good","bad","neutral"]),zU6=l0.preprocess(($)=>{if(Array.isArray($))return{kind:"text",value:$.find((X)=>X!==null&&typeof X!=="object")??""};return $!==null&&typeof $==="object"?$:{kind:"text",value:$}},l0.object({kind:l0.enum(["text","number","sparkline","badge","score"]).catch("text"),value:l0.coerce.string().optional(),tone:Dv.optional(),muted:l0.boolean().optional(),delta:l0.coerce.string().optional(),deltaDir:l0.enum(["up","down","neutral"]).optional(),points:l0.array(l0.coerce.number()).optional(),label:l0.coerce.string().optional()}).transform(($)=>{if($.kind==="badge"&&$.label==null)$.label=$.value??"";if($.kind==="score"){let Z=Number($.value);if(Number.isNaN(Z))return{...$,kind:"text"}}return $})),PU6=l0.preprocess(($)=>{let Z=$;if(Z&&typeof Z==="object"&&!Array.isArray(Z)&&Array.isArray(Z.cells))Z=Z.cells;if(Array.isArray(Z)&&Z.length===1&&Array.isArray(Z[0]))Z=Z[0];if(Array.isArray(Z))return Z;if(Z&&typeof Z==="object")return Object.values(Z);return Z},l0.array(zU6)),AU6={key:l0.coerce.string(),title:l0.coerce.string(),eyebrow:l0.coerce.string().optional(),headline:l0.coerce.string(),annotation:l0.coerce.string().optional(),methodology:l0.coerce.string().optional(),sources:l0.array(l0.object({name:l0.coerce.string(),logoUrl:l0.coerce.string()})).optional()},TU6=l0.discriminatedUnion("template",[l0.object({template:l0.literal("cover"),score:l0.object({value:l0.coerce.number(),max:l0.coerce.number().optional(),grade:l0.coerce.string().optional(),label:l0.coerce.string().optional()}).optional(),brandImage:l0.coerce.string().optional(),screenshot:l0.coerce.string().optional(),mobileScreenshot:l0.coerce.string().optional()}),l0.object({template:l0.literal("cta"),ctaUrl:l0.coerce.string().optional(),ctaLabel:l0.coerce.string().optional(),bullets:l0.array(l0.coerce.string()).optional()}),l0.object({template:l0.literal("series"),points:l0.array(l0.coerce.number()).min(2),xLabels:l0.array(l0.coerce.string()).min(1),unit:l0.coerce.string().optional(),callout:l0.object({index:l0.coerce.number(),value:l0.coerce.string(),tone:Dv.optional()})}),l0.object({template:l0.literal("threshold"),value:l0.coerce.string().default(""),metricLabel:l0.coerce.string().optional(),ratio:l0.coerce.number(),thresholdRatio:l0.coerce.number().optional(),thresholdLabel:l0.coerce.string().default(""),tone:Dv.optional()}),l0.object({template:l0.literal("stats"),stats:l0.array(l0.object({value:l0.coerce.string(),label:l0.coerce.string(),tone:Dv.optional()})).min(1)}),l0.object({template:l0.literal("bars"),items:l0.array(l0.object({value:l0.coerce.string(),label:l0.coerce.string(),ratio:l0.coerce.number(),tone:Dv.optional()})).min(1)}),l0.object({template:l0.literal("gauges"),gauges:l0.array(l0.object({label:l0.coerce.string(),value:l0.coerce.string(),status:l0.enum(["good","warn","bad"]).catch("warn"),caption:l0.coerce.string().optional(),ratio:l0.coerce.number().optional()})).min(1)}),l0.object({template:l0.literal("checklist"),checks:l0.array(l0.object({label:l0.coerce.string(),status:l0.enum(["pass","fail","warn"]).catch("fail"),value:l0.coerce.string().optional()})).min(1)}),l0.object({template:l0.literal("table"),columns:l0.array(l0.object({label:l0.coerce.string(),align:l0.enum(["left","right"]).optional()})).min(1),rows:l0.array(PU6).min(1),highlightRow:l0.coerce.number().optional()}),l0.object({template:l0.literal("products"),products:l0.array(l0.object({name:l0.coerce.string(),price:l0.coerce.string().optional(),image:l0.coerce.string().optional(),url:l0.coerce.string().optional()})).min(1)}),l0.object({template:l0.literal("list"),entries:l0.array(l0.object({label:l0.coerce.string(),severity:l0.enum(["error","warning","notice"]).catch("notice")})).min(1),moreCount:l0.coerce.number().optional()}),l0.object({template:l0.literal("keywords"),volumeLabel:l0.coerce.string().optional(),keywords:l0.array(l0.object({term:l0.coerce.string(),volume:l0.coerce.string(),position:l0.coerce.number().catch(0)})).min(1)}),l0.object({template:l0.literal("competitor"),metricLabel:l0.coerce.string().optional(),competitors:l0.array(l0.object({name:l0.coerce.string(),value:l0.coerce.string(),tone:Dv.optional(),isYou:l0.boolean().optional()})).min(1)}),l0.object({template:l0.literal("scorecard"),rivalLabel:l0.coerce.string().optional(),dimensions:l0.array(l0.object({label:l0.coerce.string(),you:l0.coerce.string(),rival:l0.coerce.string().optional(),rivalName:l0.coerce.string().optional(),tone:Dv.optional()})).min(1)})]),Md$=l0.object({...AU6,template:TU6})});function jT0($){let Z=[],X=[...$.sections].sort((Y,G)=>Y.position-G.position).map((Y)=>{let G=Md$.safeParse(Y.props);if(G.success)return G.data;let J=G.error.issues[0];return Z.push({section_type:Y.section_type,position:Y.position,reason:J?`${J.path.join(".")||"(root)"}: ${J.message}`:"contract violation"}),null}).filter((Y)=>Y!==null),Q=X.filter((Y)=>Y.template.template!=="cover"&&Y.template.template!=="cta").map((Y)=>({key:Y.key,title:Y.title}));return{deck:{meta:{...$.meta,scores:$.summary?.scores,scannedAt:$.scanned_at,toc:Q},slides:X},drops:Z}}var k71=D(()=>{kd$()});import{join as Vd$}from"path";async function IU6($){try{let Z=await fetch(`${KK({})}/api/v2/public/diagnostics/${encodeURIComponent($)}`,{headers:{Accept:"application/json"},signal:AbortSignal.timeout(RU6)});if(!Z.ok)return null;let X=await Z.json(),{deck:Q}=jT0(X);if(!Q.slides.length)return null;let Y=Q.slides.find((W)=>W.template.template==="cover"),G=Y?.template,J=G&&G.template==="cover"?G:void 0;return{brand:Q.meta.brand?.trim()||M71($),score:Q.meta.scores?.cover??J?.score?.value,verdict:Y?.annotation?.trim()||Y?.headline?.trim()||void 0}}catch{return null}}function LG($){return $.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function qU6($,Z){let X=ru($),Q=Z?.brand?.trim()||M71(X),Y=Id$(X,128),J=`${(b0().baseUrl??"https://studio.decocms.com").replace(/\/+$/,"")}/report/${encodeURIComponent(X)}`,{title:W,description:K}=qd$({brand:Q,domain:X,score:Z?.score,verdict:Z?.verdict}),F=`${J}/og.png`,H=`${Q} commerce report by decocms`;return[`<title>${LG(W)}</title>`,`<meta name="description" content="${LG(K)}" />`,'<meta name="robots" content="noindex, follow" />','<meta property="og:type" content="website" />','<meta property="og:site_name" content="decocms" />',`<meta property="og:title" content="${LG(W)}" />`,`<meta property="og:description" content="${LG(K)}" />`,`<meta property="og:url" content="${LG(J)}" />`,`<meta property="og:image" content="${LG(F)}" />`,'<meta property="og:image:width" content="1200" />','<meta property="og:image:height" content="630" />',`<meta property="og:image:alt" content="${LG(H)}" />`,'<meta name="twitter:card" content="summary_large_image" />',`<meta name="twitter:title" content="${LG(W)}" />`,`<meta name="twitter:description" content="${LG(K)}" />`,`<meta name="twitter:image" content="${LG(F)}" />`,`<meta name="twitter:image:alt" content="${LG(H)}" />`,`<link rel="canonical" href="${LG(J)}" />`,`<link rel="icon" href="${LG(Y)}" sizes="any" />`].join(`
|
|
2924
|
+
`,j=await Z.createBlob(E);await _l$(Z.owner,Z.repo,j,E);let z=w[0]??`${NT0(Q)}/${O71(O)}.json`;F.push({path:z,mode:"100644",type:"blob",sha:j});let A=z.slice(z.lastIndexOf("/")+1,-5);H.set(z,{stem:A,sha:j,content:E});for(let P of w.slice(1))F.push({path:P,mode:"100644",type:"blob",sha:null}),H.delete(P)}for(let O of $.del)for(let L of z71(K,O))F.push({path:L,mode:"100644",type:"blob",sha:null}),H.delete(L);if(F.length===0)return G;let N=Q?`${Q}/.deco/blocks.gen.json`:".deco/blocks.gen.json";if(W.some((O)=>O.type==="blob"&&O.path===N)){let O=await Promise.all([...H.values()].map(async(j)=>({stem:j.stem,content:j.content??await Z.getBlobText(j.sha)}))),{decofile:L,skipped:w}=Hs(O);if(w.length>0)console.warn("decofile gen: dropped blocks that were not valid JSON",{repo:`${Z.owner}/${Z.repo}`,branch:X,packagePath:Q,blocks:w.map((j)=>j.key)});let E=await Z.createBlob(L);F.push({path:N,mode:"100644",type:"blob",sha:E})}let U=await Z.createTree(J,F),B=await Z.createCommit({message:mN6($),treeSha:U,parentShas:[G]});try{return await Z.updateRef(X,B),B}catch(O){if(!(O instanceof u4&&O.status===422)||Y>=cN6-1)throw O;await L$(aZ(2000,200,Y,2,0.5))}}}function mN6($){let Z=(Y)=>{let G=Y.slice(0,3).join(", ");return Y.length>3?`${G} (+${Y.length-3} more)`:G},X=[];if($.set.size>0)X.push(`update ${Z([...$.set.keys()])}`);if($.del.size>0)X.push(`delete ${Z([...$.del])}`);let Q=`chore(decofile): ${X.join("; ")}`;return Zi0(Q,$.deps.coAuthor)}var cN6=3,I71;var ol$=D(()=>{uO0();YT0();W4();dD();UT0();I71=new Map});import{createHmac as rl$,randomBytes as iN6,timingSafeEqual as pN6}from"crypto";function al$(){if(ET0)return ET0;let $;try{let Z=b0();$=Z.studioJwtSecret??Z.betterAuthSecret}catch{$=void 0}return ET0=$?Buffer.from($):iN6(32),ET0}function q71($){let Z=$.nowMs??Date.now(),X={o:$.organizationId,m:$.virtualMcpId,b:$.branch,e:Math.floor((Z+nN6)/1000)},Q=Buffer.from(JSON.stringify(X)).toString("base64url"),Y=rl$("sha256",al$()).update(Q).digest("base64url");return`${Q}.${Y}`}function sl$($,Z){let X=$.indexOf(".");if(X<0)return!1;let Q=$.slice(0,X),Y=Buffer.from($.slice(X+1)),G=Buffer.from(rl$("sha256",al$()).update(Q).digest("base64url"));if(Y.length!==G.length||!pN6(Y,G))return!1;let J;try{J=JSON.parse(Buffer.from(Q,"base64url").toString())}catch{return!1}let W=Math.floor((Z.nowMs??Date.now())/1000);return J.o===Z.organizationId&&J.m===Z.virtualMcpId&&J.b===Z.branch&&typeof J.e==="number"&&J.e>=W}var nN6=21600000,ET0=null;var el$=D(()=>{R$()});import{z as ou}from"zod";function oN6($){return $.length>0&&$.length<=255&&!$.includes("..")&&!$.endsWith("/")&&!$.endsWith(".lock")&&tN6.test($)}function Yd$($){return $.req.header("x-forwarded-host")??new URL($.req.url).host}async function Ls($){let Z=$.get("decofileScope");return XT0($.var.studioContext,Z.organizationId,Z.githubRepo)}function ws($,Z){if(Z instanceof u4){let Q=Z.status===404?404:Z.status===409?409:Z.status===422?409:502;return $.json({error:Z.message},Q)}let X=Z instanceof Error?Z.message:String(Z);return $.json({error:X},500)}function Gd$(){let $=new H1;return $.use("/:virtualMcpId/:branch",Qd$),$.use("/:virtualMcpId/:branch/*",Qd$),$.get("/:virtualMcpId/:branch",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await Ls(Z),Y=await vl$(Q,X.branch,X.packagePath,{createBranchIfMissing:!!X.userId}),G={ETag:`"${Y.sha}"`,"Cache-Control":"no-store","Access-Control-Allow-Origin":"*"};if(Z.req.header("if-none-match")===`"${Y.sha}"`)return Z.body(null,304,G);if(!X.userId)return Z.body(Y.decofile,200,{...G,"content-type":"application/json"});let J=q71({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.body(`{"version":${JSON.stringify(Y.sha)},"token":${JSON.stringify(J)},"apiHost":${JSON.stringify(Yd$(Z))},"decofile":${Y.decofile}}`,200,{...G,"content-type":"application/json"})}catch(Q){return ws(Z,Q)}}),$.get("/:virtualMcpId/:branch/meta",async(Z)=>{let X=Z.get("decofileScope"),Q=X.packagePath?`${X.packagePath}/.deco/meta.gen.json`:".deco/meta.gen.json";try{let Y=await Ls(Z),G=await Y.getFileTextAtRef(X.branch,Q);if(G===null){let J=await Y.getDefaultBranch();if(J!==X.branch)G=await Y.getFileTextAtRef(J,Q)}if(G===null)return Z.json({error:"meta.gen.json not committed"},404);return Z.body(G,200,{"content-type":"application/json","Cache-Control":"no-store","Access-Control-Allow-Origin":"*"})}catch(Y){return ws(Z,Y)}}),$.patch("/:virtualMcpId/:branch",aN6,async(Z)=>{let X=Z.get("decofileScope"),Q=Z.var.studioContext,Y=sN6.safeParse(await Z.req.json().catch(()=>null));if(!Y.success)return Z.json({error:"Invalid body",details:Y.error.issues},400);let G=Y.data;for(let J of[...Object.keys(G.set??{}),...G.delete??[]])try{QT0(J)}catch(W){let K=W instanceof Error?W.message:String(W);return Z.json({error:K},400)}for(let[J,W]of Object.entries(G.set??{}))if(typeof W!=="object"||W===null||Array.isArray(W))return Z.json({error:`Block "${J}" must be a JSON object`},400);try{let J=await Ls(Z),W=await tl$(`${X.organizationId}/${X.virtualMcpId}/${X.branch}`,{client:J,branch:X.branch,packagePath:X.packagePath,coAuthor:du(Q)},G),K=q71({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.json({version:W,token:K,apiHost:Yd$(Z)})}catch(J){return ws(Z,J)}}),$.post("/:virtualMcpId/:branch/publish",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await Ls(Z),Y=await Q.getDefaultBranch();if(Y===X.branch)return Z.json({error:"Branch is already the default branch"},400);let G=`chore(decofile): publish ${X.branch}`;try{let J;try{J=await Q.mergeBranch(Y,X.branch,G)}catch(W){if(!(W instanceof u4&&W.status===409))throw W;await DT0(Q,X.branch,Y),J=await Q.mergeBranch(Y,X.branch,G)}return J?Z.json({result:"merged",sha:J}):Z.json({result:"up-to-date"})}catch(J){if(J instanceof u4&&J.status===409)return Z.json({error:"merge-conflict"},409);if(J instanceof u4&&J.status===405){let K=await Q.findOpenPullRequest(Y,X.branch)??await Q.createPullRequest({base:Y,head:X.branch,title:`Publish ${X.branch}`});return Z.json({result:"pull-request",number:K.number,url:K.html_url})}throw J}}catch(Q){return ws(Z,Q)}}),$.get("/:virtualMcpId/:branch/status",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await Ls(Z),Y=await Q.getDefaultBranch();if(Y===X.branch)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0,lastCommitAt:null});try{let[{aheadBy:G,behindBy:J},W]=await Promise.all([Q.compare(Y,X.branch),Q.getBranchHead(X.branch)]);return Z.json({baseBranch:Y,aheadBy:G,behindBy:J,lastCommitAt:W.committedAt})}catch(G){if(G instanceof u4&&G.status===404)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0,lastCommitAt:null});throw G}}catch(Q){return ws(Z,Q)}}),$}var tN6,$d$=500,Zd$=1048576,Xd$=1024,rN6=8388608,aN6,sN6,Qd$;var Jd$=D(()=>{yn0();YT0();U8();jF();Q71();ZT0();T71();B71();ol$();el$();A71();dD();UT0();tN6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;aN6=p5({maxSize:rN6,onError:($)=>$.json({error:"Payload too large"},413)}),sN6=ou.object({set:ou.record(ou.string(),ou.unknown()).optional(),delete:ou.array(ou.string()).optional()}).refine(($)=>Object.keys($.set??{}).length>0||($.delete?.length??0)>0,{message:"Patch must set or delete at least one block"}).refine(($)=>Object.keys($.set??{}).length+($.delete?.length??0)<=$d$,{message:`Patch cannot touch more than ${$d$} blocks`}).refine(($)=>Object.values($.set??{}).every((Z)=>JSON.stringify(Z).length<=Zd$),{message:`Each block must be at most ${Zd$} bytes`}).refine(($)=>[...Object.keys($.set??{}),...$.delete??[]].every((Z)=>Z.length<=Xd$),{message:`Each block key must be at most ${Xd$} characters`}),Qd$=$T0(async($,Z)=>{let X=$.var.studioContext,Q=X.organization;if(!Q)return $.json({error:"Organization scope required"},500);let Y=$.req.param("virtualMcpId"),G=$.req.param("branch");if(!Y||!G)return $.json({error:"virtualMcpId and branch are required"},400);if(!oN6(G))return $.json({error:`Invalid branch name: ${G}`},400);let J=X.auth?.user?.id??null;if(!J){let B=$.req.query("token");if(!($.req.method==="GET"&&!$.req.path.match(/\/(publish|status)$/)))return $.json({error:"Unauthorized"},401);if(!B||!sl$(B,{organizationId:Q.id,virtualMcpId:Y,branch:G}))return $.json({error:"Unauthorized"},401)}let W=await X.storage.virtualMcps.findById(Y);if(!W||W.organization_id!==Q.id)return $.json({error:"Virtual MCP not found"},404);let K=W.metadata??null;if(!iO0(K))return $.json({error:"Project has no preview server configured"},404);let H=W.connections?.map((B)=>B.connection_id)??[],N=Os(K,H);if(!N)return $.json({error:"Project has no GitHub repository"},404);let U=K?.runtime;return $.set("decofileScope",{organizationId:Q.id,virtualMcpId:Y,branch:G,packagePath:U?.path?.replace(/^\/+|\/+$/g,"")||null,githubRepo:N,userId:J}),Z()})});var Wd$=($)=>{let Z=new H1;if(Z.use("*",Xv),Z.route("/",wA0()),Z.route("/",Tg$()),Z.route("/",Vc$()),Z.route("/",qc$()),Z.route("/",aA0()),Z.route("/tools",xc$()),Z.route("/",vc$()),Z.route("/",Gc$({kvStorage:$.kvStorage})),Z.route("/",Qc$()),Z.route("/fs",jc$({getConnection:$.getNatsConnection})),Z.route("/sandbox",pl$()),Z.route("/decofile",Gd$()),Z.route("/",Tc$()),Z.route("/deco-sites",jA0()),Z.route("/sso",NA0()),Z.route("/",sA0({tokenStorage:$.tokenStorage,automationEventDispatcher:$.automationEventDispatcher})),Z.route("/webhooks",Dg$()),$.mountDevAssets)Z.route("/dev-assets",zA0({orgFromPath:!0}));return Z.use("/mcp/:connectionId?",$.mcpAuth),Z.use("/mcp/:connectionId/ui-resource",$.mcpAuth),Z.use("/mcp/gateway/:virtualMcpId?",$.mcpAuth),Z.use("/mcp/virtual-mcp/:virtualMcpId?",$.mcpAuth),Z.use("/mcp/self",$.mcpAuth),Z.use("/mcp/task-run/:threadId",$.mcpAuth),Z.route("/",bb$()),Z.get("/mcp/:gateway?/:connectionId/.well-known/oauth-protected-resource/*",$.betterAuthProtectedResourceHandler),Z.get("/mcp/.well-known/oauth-protected-resource",$.betterAuthProtectedResourceHandler),Z.route("/mcp/task-run",Pc$()),Z.route("/mcp",Pw0()),Z.route("/mcp/self",rA0()),Z.route("/mcp",Rw0()),Z.all("/oauth-proxy/:connectionId/*",$.oauthProxyHandler),Z.get("/watch",$.watchHandler),Z};var Kd$=D(()=>{U8();I91();Lg$();V91();PA0();xa();T91();Yc$();Jc$();zc$();dt();w91();Iw0();rZ1();Ac$();Rc$();Mc$();Sc$();fc$();sZ1();yc$();eZ1();Aw0();nl$();Jd$()});function eN6($){return $.filter((Z)=>Z.vendors?.alias).map((Z)=>({name:Z.name,title:Z.title,description:Z.description,logo:Z.logo,category:Z.category,vendor:{alias:Z.vendors.alias,url:Z.vendors.url}}))}var $U6=async($,Z)=>{if(!$.get("studioContext").auth.user?.id)return $.json({error:"Unauthorized"},401);return Z()},Fd$=()=>{let $=new H1;return $.use("*",$U6),$.get("/",async(Z)=>{let X=b0(),Q=X.decoSupabaseUrl,Y=X.decoSupabaseServiceKey;if(!Q||!Y)return Z.json({apps:[]});try{let G=await nZ(Q,Y,"apps?select=name,title,description,logo,category,vendors(alias,url)");return Z.json({apps:eN6(G)})}catch(G){return console.error("[deco-apps] GET error:",G),Z.json({error:"Failed to fetch apps"},502)}}),$};var Hd$=D(()=>{U8();R$();DP0()});import{z as M1}from"zod";function RF($,Z="invalid_request_error",X=null,Q=null){return{error:{message:$,type:Z,param:X,code:Q}}}function HU6($){if(!$)return null;let Z=$.indexOf(":");if(Z===-1)return{credentialId:null,modelId:$};let X=$.substring(0,Z),Q=$.substring(Z+1);if(!X||!Q)return null;return{credentialId:X,modelId:Q}}function NU6($,Z,X){try{return JSON.parse($)}catch{throw new Bd$(`Invalid JSON in tool call arguments for function '${X}' (tool_call_id: ${Z}): ${$}`)}}function UU6($){let Z={};for(let X of $)if(X.role==="assistant"&&X.tool_calls)for(let Q of X.tool_calls)Z[Q.id]=Q.function.name;return $.map((X)=>{switch(X.role){case"system":return{role:"system",content:X.content};case"user":if(typeof X.content==="string")return{role:"user",content:X.content};return{role:"user",content:X.content.map((Y)=>{if(Y.type==="text")return{type:"text",text:Y.text};return{type:"image",image:Y.image_url.url}})};case"assistant":if(X.tool_calls&&X.tool_calls.length>0)return{role:"assistant",content:X.tool_calls.map((Y)=>({type:"tool-call",toolCallId:Y.id,toolName:Y.function.name,input:NU6(Y.function.arguments,Y.id,Y.function.name)}))};return{role:"assistant",content:X.content??""};case"tool":let Q=Z[X.tool_call_id]??"unknown";return{role:"tool",content:[{type:"tool-result",toolCallId:X.tool_call_id,toolName:Q,output:{type:"text",value:X.content}}]}}})}function BU6($){let Z=$.map((X)=>{let Q=X.function.parameters?iY(X.function.parameters):iY({type:"object",properties:{}});return[X.function.name,I$({description:X.function.description,inputSchema:Q})]});return Object.fromEntries(Z)}function OU6($){if(!$)return;return{openai:{response_format:$}}}function DU6(){return`chatcmpl-${crypto.randomUUID().replace(/-/g,"").substring(0,29)}`}function Nd$($,Z,X,Q,Y,G){let J={model:$,messages:Z,tools:X,temperature:Q.temperature,maxTokens:Q.max_tokens,topP:Q.top_p,frequencyPenalty:Q.frequency_penalty,presencePenalty:Q.presence_penalty,stopSequences:Q.stop?Array.isArray(Q.stop)?Q.stop:[Q.stop]:void 0,abortSignal:G};return Y?{...J,providerOptions:Y}:J}function Ud$($){if($==="tool-calls")return"tool_calls";if($==="length")return"length";return"stop"}var ZU6=256,XU6,QU6,YU6,GU6,JU6,WU6,KU6,FU6,Bd$,Od$,Dd$;var Ld$=D(()=>{D4();U8();lu();TN();XU6=M1.object({type:M1.literal("function"),function:M1.object({name:M1.string(),description:M1.string().optional(),parameters:M1.record(M1.string(),M1.unknown()).optional()})}),QU6=M1.object({id:M1.string(),type:M1.literal("function"),function:M1.object({name:M1.string(),arguments:M1.string()})}),YU6=M1.discriminatedUnion("role",[M1.object({role:M1.literal("system"),content:M1.string(),name:M1.string().optional()}),M1.object({role:M1.literal("user"),content:M1.union([M1.string(),M1.array(M1.union([M1.object({type:M1.literal("text"),text:M1.string()}),M1.object({type:M1.literal("image_url"),image_url:M1.object({url:M1.string(),detail:M1.string().optional()})})]))]),name:M1.string().optional()}),M1.object({role:M1.literal("assistant"),content:M1.string().nullable().optional(),name:M1.string().optional(),tool_calls:M1.array(QU6).optional()}),M1.object({role:M1.literal("tool"),content:M1.string(),tool_call_id:M1.string()})]),GU6=M1.object({type:M1.literal("text")}),JU6=M1.object({type:M1.literal("json_object")}),WU6=M1.object({type:M1.literal("json_schema"),json_schema:M1.object({name:M1.string(),description:M1.string().optional(),schema:M1.record(M1.string(),M1.unknown()),strict:M1.boolean().optional()})}),KU6=M1.union([GU6,JU6,WU6]),FU6=M1.object({model:M1.string().describe("Format: 'model_id' or 'credential_id:model_id'"),messages:M1.array(YU6),stream:M1.boolean().optional().default(!1),temperature:M1.number().min(0).max(2).optional(),max_tokens:M1.number().positive().optional(),top_p:M1.number().min(0).max(1).optional(),frequency_penalty:M1.number().min(-2).max(2).optional(),presence_penalty:M1.number().min(-2).max(2).optional(),stop:M1.union([M1.string(),M1.array(M1.string())]).optional(),tools:M1.array(XU6).optional(),tool_choice:M1.union([M1.literal("auto"),M1.literal("none"),M1.literal("required"),M1.object({type:M1.literal("function"),function:M1.object({name:M1.string()})})]).optional(),response_format:KU6.optional(),user:M1.string().optional()});Bd$=class Bd$ extends Error{constructor($){super($);this.name="MessageConversionError"}};Od$=new H1;Od$.post("/:org/v1/chat/completions",async($)=>{let Z=$.get("studioContext"),X=$.req.param("org");try{if(!Z.auth.apiKey?.id)return $.json(RF("API key authentication required. Provide a valid API key via Authorization header.","authentication_error"),401);if(!Z.organization)return $.json(RF("Organization context is required. Ensure your API key has organization metadata.","invalid_request_error","organization"),400);if((Z.organization.slug??Z.organization.id)!==X)return $.json(RF("Organization mismatch. The API key's organization does not match the requested organization.","invalid_request_error","organization"),403);let Q=await $.req.json(),Y=FU6.safeParse(Q);if(!Y.success){let w=Y.error.issues[0]??{message:"Invalid request",path:[]};return $.json(RF(`Invalid request: ${w.message}`,"invalid_request_error",w.path.length>0?w.path.join("."):null),400)}let G=Y.data,J=HU6(G.model);if(!J)return $.json(RF("Invalid model format. Expected 'model_id' or 'credential_id:model_id' (e.g., 'claude-sonnet-4-6' or 'key_abc123:claude-sonnet-4-6')","invalid_request_error","model"),400);let{credentialId:W}=J,{modelId:K}=J;if(!W){let E=(await Z.storage.aiProviderKeys.list({organizationId:Z.organization.id})).find((j)=>Ww(j.providerId));if(!E)return $.json(RF("No AI provider credentials configured for this organization. Add a credential in settings or specify one explicitly via 'credential_id:model_id'.","invalid_request_error","model"),400);W=E.id}let F;try{F=await Z.aiProviders.activate(W,Z.organization.id)}catch{return $.json(RF(`AI provider credential not found or inaccessible: ${W}`,"invalid_request_error","model"),404)}let H=F.aiSdk.languageModel(K),N=UU6(G.messages),U=G.tools?BU6(G.tools):void 0,B=OU6(G.response_format),O=DU6(),L=Math.floor(Date.now()/1000);if(G.stream)return mN($,async(w)=>{let E=Nd$(H,N,U,G,B,$.req.raw.signal);try{let j=PO(E),z=!1,A=0,P="",I=async()=>{if(P.length===0)return;let q=P;P="",await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{content:q},finish_reason:null}]})})};for await(let q of j.fullStream){if(!z&&(q.type==="text-delta"||q.type==="tool-call"))await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{role:"assistant",content:""},finish_reason:null}]})}),z=!0;if(q.type==="text-delta"){if(P+=q.text,P.length>=ZU6)await I()}else if(q.type==="tool-call"){await I();let k=A++;await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{tool_calls:[{index:k,id:q.toolCallId,type:"function",function:{name:q.toolName,arguments:JSON.stringify(q.input)}}]},finish_reason:null}]})})}else if(q.type==="finish")await I(),await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{},finish_reason:Ud$(q.finishReason)}],usage:q.totalUsage?{prompt_tokens:q.totalUsage.inputTokens??0,completion_tokens:q.totalUsage.outputTokens??0,total_tokens:q.totalUsage.totalTokens??0}:void 0})})}await I(),await w.writeSSE({data:"[DONE]"})}catch(j){let z=j;console.error("[openai-compat:stream] Error:",z.message),await w.writeSSE({data:JSON.stringify({error:{message:z.message,type:"server_error"}})})}});else{let w=Nd$(H,N,U,G,B,$.req.raw.signal),E=await jO(w),j={role:"assistant",content:E.text||null};if(E.toolCalls&&E.toolCalls.length>0)j.tool_calls=E.toolCalls.map((z)=>({id:z.toolCallId,type:"function",function:{name:z.toolName,arguments:JSON.stringify("input"in z?z.input:{})}})),j.content=null;return $.json({id:O,object:"chat.completion",created:L,model:G.model,choices:[{index:0,message:j,finish_reason:Ud$(E.finishReason)}],usage:{prompt_tokens:E.usage?.inputTokens??0,completion_tokens:E.usage?.outputTokens??0,total_tokens:E.usage?.totalTokens??0}})}}catch(Q){let Y=Q;if(Y.name==="AbortError")return $.json(RF("Request aborted","invalid_request_error"),400);if(Y.name==="MessageConversionError")return $.json(RF(Y.message,"invalid_request_error","messages"),400);return console.error("[openai-compat] Error:",Y.message,Y.stack),$.json(RF(Y.message,"server_error"),500)}});Dd$=Od$});function LU6($){if(typeof $!=="object"||$===null)return!1;let X=$.githubRepo?.url;return typeof X==="string"&&X.length>0}function wd$(){let $=new H1;return $.use("*",async(Z,X)=>{await X(),Z.header("Cache-Control","private, no-store"),Z.header("Vary","Cookie")}),$.get("/",async(Z)=>{let X=Z.get("studioContext"),Q=o0(X);if(!Q)return Z.json({error:"Authentication required"},401);let G=(Z.req.query("site")??"").trim().toLowerCase();if(!rG(G))return Z.json({error:"Invalid site slug"},400);let J=await X.db.selectFrom("member").innerJoin("organization","organization.id","member.organizationId").select(["organization.id as id","organization.slug as slug","organization.name as name","organization.metadata as metadata"]).where("member.userId","=",Q).execute(),W=[];for(let F of J){if(!F.slug||vZ(F))continue;let H=await X.storage.virtualMcps.list(F.id);for(let N of H){if(Xe1(N)!==G)continue;if(!LU6(N.metadata))continue;W.push({orgSlug:F.slug,orgName:F.name??F.slug,project:{id:N.id,title:N.title,icon:N.icon??null}})}}let K={matches:W};return Z.json(K)}),$}var Ed$=D(()=>{U8();ZO()});var zd$;var jd$=D(()=>{zd$={name:"decocms",version:"4.297.6",description:"Deco CMS \u2014 Self-hostable MCP Gateway for managing AI connections and tools",author:"Deco team",repository:{type:"git",url:"git+https://github.com/decocms/studio.git",directory:"apps/api"},bugs:{url:"https://github.com/decocms/studio/issues"},type:"module",bin:{deco:"./dist/server/cli.js"},files:["dist/**/*"],scripts:{dev:"bun run migrate && bun run dev:server","dev:server":"bun run --cwd=../../packages/sandbox build && NODE_ENV=development bun --env-file=.env --hot run src/index.ts",build:"bun run build:server","build:server":"bun run scripts/bundle-server-script.ts --dist ./dist/server","generate:tool-contracts":"bun run scripts/generate-tool-contracts.ts","db:migrate":"bun run ./dist/server/migrate.js","db:migrate:dbos":"bun run ./dist/server/migrate-dbos.js",check:"tsc --noEmit",start:"bun run ./dist/server/server.js",migrate:"bun run src/database/migrate.ts","migrate:dbos":"bun run src/database/migrate-dbos.ts",test:"bun test src","better-auth:migrate":"bunx --bun @better-auth/cli migrate -y --config src/auth/index.ts",prepublishOnly:"bun run --cwd=../.. build:studio"},optionalDependencies:{"@duckdb/node-api":"^1.5.0-r.1"},dependencies:{"@ai-sdk/anthropic":"^3.0.85","@ai-sdk/google":"^3.0.83","@ai-sdk/openai":"^3.0.73","@anthropic-ai/sdk":"^0.105.0","@aws-sdk/client-s3":"^3.1013.0","@aws-sdk/client-sts":"^3.1013.0","@aws-sdk/lib-storage":"^3.1013.0","@aws-sdk/s3-request-presigner":"^3.1013.0","@clickhouse/client":"^1.8.1","@dbos-inc/dbos-sdk":"^4.21.6","@inkjs/ui":"^2.0.0","@nats-io/jetstream":"3.4.0","@nats-io/kv":"3.4.0","@nats-io/nats-core":"3.4.0","@nats-io/transport-node":"3.4.0","@openrouter/ai-sdk-provider":"^2.9.1","@opentelemetry/core":"^2.6.0","embedded-postgres":"^18.3.0-beta.16",ink:"^6.8.0",kysely:"^0.28.12","posthog-node":"^5.0.0",react:"^19.2.6","react-dom":"^19.2.6"},devDependencies:{"@ai-sdk/provider":"^3.0.10","@better-auth/sso":"1.4.1","@decocms/better-auth":"1.5.17","@decocms/bindings":"workspace:*","@decocms/mcp-utils":"workspace:*","@decocms/runtime":"workspace:*","@decocms/sandbox":"workspace:*","@decocms/shared":"workspace:*","@jitl/quickjs-wasmfile-release-sync":"0.31.0","@modelcontextprotocol/sdk":"1.29.0","@opentelemetry/api":"^1.9.0","@opentelemetry/api-logs":"^0.211.0","@opentelemetry/exporter-logs-otlp-proto":"^0.211.0","@opentelemetry/exporter-prometheus":"^0.208.0","@opentelemetry/exporter-trace-otlp-proto":"^0.207.0","@opentelemetry/instrumentation-runtime-node":"^0.24.0","@opentelemetry/resources":"^2.6.0","@opentelemetry/sdk-logs":"^0.211.0","@opentelemetry/sdk-metrics":"^2.2.0","@opentelemetry/sdk-node":"^0.207.0","@opentelemetry/sdk-trace-base":"^2.5.0","@types/bun":"^1.3.1","@types/google.maps":"^3.65.2","@types/pg":"^8.15.6","@types/react-syntax-highlighter":"^15.5.13","@vercel/nft":"^1.1.1",ai:"^6.0.208","better-auth":"1.4.22",croner:"^9.1.0",degit:"^2.8.4",hono:"^4.10.7",jose:"^6.0.11",nanoid:"^5.1.6",pg:"^8.16.3",typescript:"^7.0.2",typescript5:"npm:typescript@^5.9.3",zod:"4.3.6"},homepage:"https://github.com/decocms/studio",keywords:["mcp","model-context-protocol","ai","gateway","self-hosted","tools"],license:"MIT",publishConfig:{access:"public"}}});function jU6(){let $=process.env.POSTHOG_KEY;if(!$)return null;return{key:$,host:process.env.POSTHOG_HOST??EU6}}var Pd$,EU6="https://ph.studio.decocms.com",Ad$;var Td$=D(()=>{U8();c50();yC();$9();R$();K91();jd$();Pd$=new H1;Pd$.get("/",($)=>{let Z={version:zd$.version,theme:qi1(),...IH().logo&&{logo:IH().logo},...HN()&&{internalUrl:Z_1()},...b0().enableDecoImport&&{enableDecoImport:!0},brandExtractEnabled:!!b0().firecrawlApiKey,auth:Iy$(),posthog:jU6(),googleMapsApiKey:process.env.GOOGLE_MAPS_API_KEY?.trim()||null,runtime:{agentSandbox:Is()}};return $.header("Cache-Control","no-store"),$.json({success:!0,config:Z})});Ad$=Pd$});function ru($){let Z=($??"").trim().toLowerCase();return Z=Z.replace(/^https?:\/\//,""),Z=Z.replace(/^www\./,""),Z=Z.split(/[/?#]/)[0]??"",Z.replace(/\/+$/,"")}function M71($){return(ru($).split(".")[0]||$).replace(/[-_]/g," ").split(" ").filter(Boolean).map((X)=>X.charAt(0).toUpperCase()+X.slice(1)).join(" ")}function Id$($,Z=64){return`https://www.google.com/s2/favicons?domain=${encodeURIComponent(ru($))}&sz=${Z}`}function Rd$($,Z){let X=$.trim();if(X.length<=Z)return X;let Q=X.slice(0,Z-1),Y=Q.lastIndexOf(" ");return`${(Y>Z*0.6?Q.slice(0,Y):Q).trimEnd()}\u2026`}function qd$($){let{brand:Z,domain:X,score:Q,verdict:Y}=$,G=typeof Q==="number"?`${Z} commerce report \u2014 ${Math.round(Q)}/100 \xB7 decocms`:`${Z} commerce report \xB7 decocms`,J=`See the full ${Z} scorecard \u2014 SEO, performance, conversion & AEO signals scored by decocms.`,W=Y?.trim()?Rd$(`${Y.trim().replace(/\s+/g," ")} \u2014 ${J}`,200):Rd$(`How does ${X} really perform? ${J}`,200);return{title:G,description:W}}import{z as l0}from"zod";var Dv,zU6,PU6,AU6,TU6,Md$;var kd$=D(()=>{Dv=l0.enum(["good","bad","neutral"]),zU6=l0.preprocess(($)=>{if(Array.isArray($))return{kind:"text",value:$.find((X)=>X!==null&&typeof X!=="object")??""};return $!==null&&typeof $==="object"?$:{kind:"text",value:$}},l0.object({kind:l0.enum(["text","number","sparkline","badge","score"]).catch("text"),value:l0.coerce.string().optional(),tone:Dv.optional(),muted:l0.boolean().optional(),delta:l0.coerce.string().optional(),deltaDir:l0.enum(["up","down","neutral"]).optional(),points:l0.array(l0.coerce.number()).optional(),label:l0.coerce.string().optional()}).transform(($)=>{if($.kind==="badge"&&$.label==null)$.label=$.value??"";if($.kind==="score"){let Z=Number($.value);if(Number.isNaN(Z))return{...$,kind:"text"}}return $})),PU6=l0.preprocess(($)=>{let Z=$;if(Z&&typeof Z==="object"&&!Array.isArray(Z)&&Array.isArray(Z.cells))Z=Z.cells;if(Array.isArray(Z)&&Z.length===1&&Array.isArray(Z[0]))Z=Z[0];if(Array.isArray(Z))return Z;if(Z&&typeof Z==="object")return Object.values(Z);return Z},l0.array(zU6)),AU6={key:l0.coerce.string(),title:l0.coerce.string(),eyebrow:l0.coerce.string().optional(),headline:l0.coerce.string(),annotation:l0.coerce.string().optional(),methodology:l0.coerce.string().optional(),sources:l0.array(l0.object({name:l0.coerce.string(),logoUrl:l0.coerce.string()})).optional()},TU6=l0.discriminatedUnion("template",[l0.object({template:l0.literal("cover"),score:l0.object({value:l0.coerce.number(),max:l0.coerce.number().optional(),grade:l0.coerce.string().optional(),label:l0.coerce.string().optional()}).optional(),brandImage:l0.coerce.string().optional(),screenshot:l0.coerce.string().optional(),mobileScreenshot:l0.coerce.string().optional()}),l0.object({template:l0.literal("cta"),ctaUrl:l0.coerce.string().optional(),ctaLabel:l0.coerce.string().optional(),bullets:l0.array(l0.coerce.string()).optional()}),l0.object({template:l0.literal("series"),points:l0.array(l0.coerce.number()).min(2),xLabels:l0.array(l0.coerce.string()).min(1),unit:l0.coerce.string().optional(),callout:l0.object({index:l0.coerce.number(),value:l0.coerce.string(),tone:Dv.optional()})}),l0.object({template:l0.literal("threshold"),value:l0.coerce.string().default(""),metricLabel:l0.coerce.string().optional(),ratio:l0.coerce.number(),thresholdRatio:l0.coerce.number().optional(),thresholdLabel:l0.coerce.string().default(""),tone:Dv.optional()}),l0.object({template:l0.literal("stats"),stats:l0.array(l0.object({value:l0.coerce.string(),label:l0.coerce.string(),tone:Dv.optional()})).min(1)}),l0.object({template:l0.literal("bars"),items:l0.array(l0.object({value:l0.coerce.string(),label:l0.coerce.string(),ratio:l0.coerce.number(),tone:Dv.optional()})).min(1)}),l0.object({template:l0.literal("gauges"),gauges:l0.array(l0.object({label:l0.coerce.string(),value:l0.coerce.string(),status:l0.enum(["good","warn","bad"]).catch("warn"),caption:l0.coerce.string().optional(),ratio:l0.coerce.number().optional()})).min(1)}),l0.object({template:l0.literal("checklist"),checks:l0.array(l0.object({label:l0.coerce.string(),status:l0.enum(["pass","fail","warn"]).catch("fail"),value:l0.coerce.string().optional()})).min(1)}),l0.object({template:l0.literal("table"),columns:l0.array(l0.object({label:l0.coerce.string(),align:l0.enum(["left","right"]).optional()})).min(1),rows:l0.array(PU6).min(1),highlightRow:l0.coerce.number().optional()}),l0.object({template:l0.literal("products"),products:l0.array(l0.object({name:l0.coerce.string(),price:l0.coerce.string().optional(),image:l0.coerce.string().optional(),url:l0.coerce.string().optional()})).min(1)}),l0.object({template:l0.literal("list"),entries:l0.array(l0.object({label:l0.coerce.string(),severity:l0.enum(["error","warning","notice"]).catch("notice")})).min(1),moreCount:l0.coerce.number().optional()}),l0.object({template:l0.literal("keywords"),volumeLabel:l0.coerce.string().optional(),keywords:l0.array(l0.object({term:l0.coerce.string(),volume:l0.coerce.string(),position:l0.coerce.number().catch(0)})).min(1)}),l0.object({template:l0.literal("competitor"),metricLabel:l0.coerce.string().optional(),competitors:l0.array(l0.object({name:l0.coerce.string(),value:l0.coerce.string(),tone:Dv.optional(),isYou:l0.boolean().optional()})).min(1)}),l0.object({template:l0.literal("scorecard"),rivalLabel:l0.coerce.string().optional(),dimensions:l0.array(l0.object({label:l0.coerce.string(),you:l0.coerce.string(),rival:l0.coerce.string().optional(),rivalName:l0.coerce.string().optional(),tone:Dv.optional()})).min(1)})]),Md$=l0.object({...AU6,template:TU6})});function jT0($){let Z=[],X=[...$.sections].sort((Y,G)=>Y.position-G.position).map((Y)=>{let G=Md$.safeParse(Y.props);if(G.success)return G.data;let J=G.error.issues[0];return Z.push({section_type:Y.section_type,position:Y.position,reason:J?`${J.path.join(".")||"(root)"}: ${J.message}`:"contract violation"}),null}).filter((Y)=>Y!==null),Q=X.filter((Y)=>Y.template.template!=="cover"&&Y.template.template!=="cta").map((Y)=>({key:Y.key,title:Y.title}));return{deck:{meta:{...$.meta,scores:$.summary?.scores,scannedAt:$.scanned_at,toc:Q},slides:X},drops:Z}}var k71=D(()=>{kd$()});import{join as Vd$}from"path";async function IU6($){try{let Z=await fetch(`${KK({})}/api/v2/public/diagnostics/${encodeURIComponent($)}`,{headers:{Accept:"application/json"},signal:AbortSignal.timeout(RU6)});if(!Z.ok)return null;let X=await Z.json(),{deck:Q}=jT0(X);if(!Q.slides.length)return null;let Y=Q.slides.find((W)=>W.template.template==="cover"),G=Y?.template,J=G&&G.template==="cover"?G:void 0;return{brand:Q.meta.brand?.trim()||M71($),score:Q.meta.scores?.cover??J?.score?.value,verdict:Y?.annotation?.trim()||Y?.headline?.trim()||void 0}}catch{return null}}function LG($){return $.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function qU6($,Z){let X=ru($),Q=Z?.brand?.trim()||M71(X),Y=Id$(X,128),J=`${(b0().baseUrl??"https://studio.decocms.com").replace(/\/+$/,"")}/report/${encodeURIComponent(X)}`,{title:W,description:K}=qd$({brand:Q,domain:X,score:Z?.score,verdict:Z?.verdict}),F=`${J}/og.png`,H=`${Q} commerce report by decocms`;return[`<title>${LG(W)}</title>`,`<meta name="description" content="${LG(K)}" />`,'<meta name="robots" content="noindex, follow" />','<meta property="og:type" content="website" />','<meta property="og:site_name" content="decocms" />',`<meta property="og:title" content="${LG(W)}" />`,`<meta property="og:description" content="${LG(K)}" />`,`<meta property="og:url" content="${LG(J)}" />`,`<meta property="og:image" content="${LG(F)}" />`,'<meta property="og:image:width" content="1200" />','<meta property="og:image:height" content="630" />',`<meta property="og:image:alt" content="${LG(H)}" />`,'<meta name="twitter:card" content="summary_large_image" />',`<meta name="twitter:title" content="${LG(W)}" />`,`<meta name="twitter:description" content="${LG(K)}" />`,`<meta name="twitter:image" content="${LG(F)}" />`,`<meta name="twitter:image:alt" content="${LG(H)}" />`,`<link rel="canonical" href="${LG(J)}" />`,`<link rel="icon" href="${LG(Y)}" sizes="any" />`].join(`
|
|
2925
2925
|
`)}function MU6($,Z){return $.replace(/<title>[\s\S]*?<\/title>\s*/i,"").replace(/<meta\s+name="(?:description|twitter:[^"]*)"[^>]*>\s*/gi,"").replace(/<meta\s+property="og:[^"]*"[^>]*>\s*/gi,"").replace(/<link\s+rel="icon"[^>]*>\s*/gi,"").replace("</head>",` ${Z}
|
|
2926
2926
|
</head>`)}function Sd$($){let Z=new H1;return Z.get("/:domain/og.png",async(X)=>{let Q=ru(X.req.param("domain")),Y=async()=>{let G=$?Bun.file(Vd$($,"report-og-fallback.png")):null;if(!G||!await G.exists())return X.notFound();return X.body(new Uint8Array(await G.arrayBuffer()),200,{"Content-Type":"image/png","Cache-Control":"public, max-age=0, s-maxage=3600"})};try{let G=await fetch(`${KK({})}/api/v2/public/diagnostics/${encodeURIComponent(Q)}/og.png`,{signal:AbortSignal.timeout(kU6)}),J=G.headers.get("content-type")??"";if(!G.ok||!J.startsWith("image/")||!G.body)return Y();return X.body(G.body,200,{"Content-Type":J,"Cache-Control":"public, max-age=0, s-maxage=604800"})}catch{return Y()}}),Z.get("/:domain",async(X)=>{let Q=X.req.param("domain"),Y=$?Vd$($,"index.html"):null,G=Y?Bun.file(Y):null;if(!G||!await G.exists())return X.notFound();let J=await G.text();try{let W=await IU6(ru(Q)),K=qU6(Q,W);return X.html(MU6(J,K),200,{"Cache-Control":"public, max-age=0, s-maxage=300"})}catch{return X.html(J)}}),Z}var RU6=2500,kU6=1e4;var Cd$=D(()=>{U8();k71();NE();R$()});function Es($,Z){return fetch(`${KK({})}${$}`,Z)}async function VU6($,Z,X){let Q=new URLSearchParams;if(Z)Q.set("pw",Z);if(X)Q.set("lang",X);let Y=Q.toString()?`?${Q.toString()}`:"",G=await Es(`/api/v2/public/diagnostics/${encodeURIComponent($)}${Y}`,{headers:{Accept:"application/json"}});if(G.status===404)return{status:"not_found",deck:null,scanned_at:null,drops:[]};if(!G.ok)throw Error(`report read HTTP ${G.status}`);let J=await G.json(),{deck:W,drops:K}=jT0(J);return{status:W.slides.length?"ready":"empty",deck:W,scanned_at:J.scanned_at,drops:K}}var SU6,pN,_d$=async($,Z)=>{if(!$.get("reportUser"))return $.json({error:"Authentication required"},401);await Z();return},vd$;var fd$=D(()=>{U8();cY();NE();k71();SU6=new Set(["complete","errored","terminated","unknown"]),pN=new H1;pN.use("*",async($,Z)=>{let X=await Q8.api.getSession({headers:$.req.raw.headers});$.set("reportUser",X?.user?.id?{email:X.user.email}:void 0),await Z(),$.header("Cache-Control","private, no-store"),$.header("Vary","Cookie");return});pN.use("/link-token/*",_d$);pN.use("/suggest",_d$);pN.get("/site/:domain",async($)=>{let Z=$.req.param("domain").trim();if(!Z)return $.json({error:"domain is required"},400);let X=$.get("reportUser"),Q=$.req.query("key")?.trim()||void 0,Y=$.req.query("lang")?.trim()||void 0;try{let G=await VU6(Z,Q,Y);if($.header("Cache-Control","private, no-store"),X||!G.deck)return $.json(G);return $.json({...G,deck:{...G.deck,slides:G.deck.slides.slice(0,1)},truncated:G.status==="ready"})}catch{return $.json({error:"report read failed"},502)}});pN.post("/run",async($)=>{let Z=$.get("reportUser"),X;try{X=await $.req.json()}catch{return $.json({error:"invalid JSON"},400)}let Q=typeof X.domain==="string"?X.domain.trim():"";if(!Q)return $.json({error:"domain is required"},400);let Y=Z?.email,G=typeof X.distinctId==="string"&&X.distinctId.trim()&&X.distinctId.length<=200?X.distinctId.trim():void 0;try{let J=await Es("/api/v2/diagnostics/run",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${HE({})}`},body:JSON.stringify({url:Q,...Y?{email:Y}:{},distinct_id:G})});if(!J.ok)return $.json({error:`run HTTP ${J.status}`},502);let W=await J.json(),K=W.blocked?{state:"blocked"}:W.status==="fresh"?{state:"fresh"}:W.mode==="sync"?{state:"sync"}:{state:"running",id:W.id??null};return $.json(K)}catch{return $.json({error:"run failed"},502)}});pN.get("/status",async($)=>{let Z=$.req.query("id");if(!Z)return $.json({error:"id is required"},400);try{let X=await Es(`/api/v2/diagnostics/status?id=${encodeURIComponent(Z)}`,{headers:{Authorization:`Bearer ${HE({})}`}});if(!X.ok)return $.json({error:`status HTTP ${X.status}`},502);let Y=(await X.json()).status??"unknown",G={done:SU6.has(Y),status:Y};return $.json(G)}catch{return $.json({error:"status failed"},502)}});pN.get("/link-token/:id",async($)=>{let Z=$.req.param("id");try{let X=await Es(`/api/v2/public/link-tokens/${encodeURIComponent(Z)}`,{headers:{Accept:"application/json"}});if(X.status===404)return $.json(null);if(!X.ok)return $.json({error:`link token HTTP ${X.status}`},502);return $.json(await X.json())}catch{return $.json({error:"link token resolve failed"},502)}});pN.get("/suggest",async($)=>{let Z=($.req.query("q")??"").trim().slice(0,64);if(Z.length<2)return $.json({suggestions:[]});try{let X=await Es(`/api/v2/public/suggest?q=${encodeURIComponent(Z)}`,{headers:{Accept:"application/json"}});if(!X.ok)return $.json({suggestions:[]});let Q=await X.json();return $.json({suggestions:Array.isArray(Q.suggestions)?Q.suggestions:[]})}catch{return $.json({suggestions:[]})}});vd$=pN});import{createHmac as CU6,timingSafeEqual as _U6}from"crypto";function xd$($,Z,X,Q=Date.now()){if(!Z||!X)return!1;let Y,G=[];for(let F of Z.split(",")){let H=F.indexOf("=");if(H<=0)continue;let N=F.slice(0,H).trim(),U=F.slice(H+1).trim();if(N==="t")Y=U;else if(N==="v1")G.push(U)}if(!Y||G.length===0)return!1;let J=Number(Y);if(!Number.isFinite(J)||Math.abs(Q/1000-J)>vU6)return!1;let W=CU6("sha256",X).update(`${Y}.${$}`).digest("hex"),K=Buffer.from(W,"hex");return G.some((F)=>{let H=Buffer.from(F,"hex");return K.length===H.length&&_U6(K,H)})}function yd$($){let Z;try{Z=JSON.parse($)}catch{return null}let X=gJ(Z),Q=gJ(gJ(X?.data)?.object);if(!X||typeof X.type!=="string"||!Q)return null;return{id:IF(X.id),type:X.type,created:typeof X.created==="number"?X.created:void 0,livemode:typeof X.livemode==="boolean"?X.livemode:void 0,data:{object:Q}}}function gd$($){switch($){case"active":case"trialing":return"active";case"past_due":return"past_due";default:return"canceled"}}function IF($){return typeof $==="string"?$:void 0}function gJ($){return typeof $==="object"&&$!==null?$:void 0}function zT0($){return typeof $==="number"?new Date($*1000):null}function C71($){return IF($)??IF(gJ($)?.id)}function fU6($){return C71($.subscription)??IF(gJ(gJ($.parent)?.subscription_details)?.subscription)}function bU6($){let Z=zT0($.current_period_end);if(Z)return Z;let X=gJ($.items)?.data;if(!Array.isArray(X))return null;let Q=0;for(let Y of X){let G=gJ(Y)?.current_period_end;if(typeof G==="number"&&G>Q)Q=G}return Q>0?new Date(Q*1000):null}function V71($,Z){let X=zT0($.created);return!!X&&!!Z.lastStripeEventAt&&X<Z.lastStripeEventAt}function S71($,Z){let X=zT0($.created);if(!X)return;return Z.lastStripeEventAt&&Z.lastStripeEventAt>X?void 0:X}async function xU6($,Z){let X=Z.data.object;switch(Z.type){case"checkout.session.completed":case"checkout.session.async_payment_succeeded":{let Q=IF(gJ(X.metadata)?.orgId);if(!Q)return{handled:!1,reason:"no orgId"};if(IF(gJ(X.metadata)?.kind)==="topup"){if(X.mode!=="payment")return{handled:!1,reason:"topup with wrong mode"};if(IF(X.payment_status)!=="paid")return{handled:!1,reason:"payment not confirmed"};let J=IF(X.id);if(!J)return console.error("stripe webhook: topup session without id",{eventId:Z.id,organizationId:Q}),{handled:!1,reason:"topup session without id"};let W=Number(gJ(X.metadata)?.creditCents);if(!Number.isInteger(W)||W<=0)return console.error("stripe webhook: paid topup with bad metadata \u2014 credit NOT applied",{eventId:Z.id,organizationId:Q,creditCents:gJ(X.metadata)?.creditCents}),{handled:!1,reason:"bad topup metadata"};return{handled:!0,organizationId:Q,topUp:{creditCents:W,referenceId:`stripe-topup:${J}`}}}if(X.mode!=="subscription")return{handled:!1,reason:"not a subscription checkout"};if(IF(X.payment_status)!=="paid")return{handled:!1,reason:"payment not confirmed"};let Y=await $.getBilling(Q);if(!Y)return{handled:!1,reason:"unknown org"};let G=C71(X.subscription);if(Y.stripeSubscriptionId&&G&&Y.stripeSubscriptionId!==G)return console.error("stripe webhook: refused checkout rebind",{organizationId:Q,eventId:Z.id}),{handled:!1,reason:"org already bound to another subscription",orphanSubscriptionId:G};if(V71(Z,Y))return{handled:!1,reason:"stale event"};return await $.updateStripeState(Q,{stripeCustomerId:C71(X.customer),stripeSubscriptionId:G,status:"active",lastStripeEventAt:S71(Z,Y)}),{handled:!0,organizationId:Q}}case"customer.subscription.updated":case"customer.subscription.deleted":{let Q=IF(X.id);if(!Q)return{handled:!1,reason:"no sub id"};let Y=await $.getBillingByStripeSubscriptionId(Q);if(!Y)return{handled:!1,reason:"unknown subscription"};let G=Z.type==="customer.subscription.deleted";if(!G&&V71(Z,Y))return{handled:!1,reason:"stale event"};let J=G?"canceled":gd$(X.status);return await $.updateStripeState(Y.organizationId,{status:J,currentPeriodEnd:bU6(X),...G&&{stripeSubscriptionId:null},lastStripeEventAt:S71(Z,Y)}),{handled:!0,organizationId:Y.organizationId}}case"invoice.paid":{let Q=fU6(X);if(!Q)return{handled:!1,reason:"no sub id"};let Y=await $.getBillingByStripeSubscriptionId(Q);if(!Y)return{handled:!1,reason:"unknown subscription"};if(V71(Z,Y))return{handled:!1,reason:"stale event"};return await $.updateStripeState(Y.organizationId,{status:"active",currentPeriodEnd:zT0(X.period_end),lastStripeEventAt:S71(Z,Y)}),{handled:!0,organizationId:Y.organizationId}}default:return{handled:!1,reason:`unhandled event ${Z.type}`}}}function yU6($,Z){if(!Z.handled||$.livemode===!1)return null;let X=$.data.object;if(Z.topUp)return{name:"credits_topup_succeeded",organizationId:Z.organizationId,properties:{credit_cents:Z.topUp.creditCents}};switch($.type){case"checkout.session.completed":case"checkout.session.async_payment_succeeded":return{name:"subscription_started",organizationId:Z.organizationId,properties:{}};case"customer.subscription.deleted":return{name:"subscription_canceled",organizationId:Z.organizationId,properties:{}};case"customer.subscription.updated":return{name:"subscription_updated",organizationId:Z.organizationId,properties:{status:gd$(X.status),...typeof X.cancel_at_period_end==="boolean"?{cancel_at_period_end:X.cancel_at_period_end}:{}}};case"invoice.paid":if(X.billing_reason==="subscription_create")return null;return{name:"subscription_renewed",organizationId:Z.organizationId,properties:{}};default:return null}}function bd$($,Z){let X=yU6($,Z);if(!X)return;yY({event:X.name,organizationId:X.organizationId,...$.id?{uuid:fn1(`stripe:${$.id}:${X.name}`)}:{},...$.created?{timestamp:new Date($.created*1000)}:{},properties:X.properties})}async function hd$($){let Z=new YK(r8().db),X=await xU6(Z,$);if(!(X.handled&&X.topUp))bd$($,X);if(X.handled&&X.topUp)await Yj$({organizationId:X.organizationId,amountCents:X.topUp.creditCents,referenceId:X.topUp.referenceId}),bd$($,X);if(!X.handled&&X.orphanSubscriptionId)try{await ee1(X.orphanSubscriptionId),console.error("stripe webhook: canceled orphan subscription",{subscriptionId:X.orphanSubscriptionId,eventId:$.id})}catch(Q){if(!(Q instanceof lY&&(Q.status===400||Q.status===404)))throw Q}return X}var vU6=300;var ud$=D(()=>{mG();C4();z50();zE();c01()});var gU6=1048576,_71;var cd$=D(()=>{U8();jF();R$();ud$();_71=new H1;_71.post("/webhook",p5({maxSize:gU6,onError:($)=>$.json({error:"payload too large"},413)}),async($)=>{let Z=b0().stripeWebhookSecret;if(!Z)return $.json({error:"stripe billing not configured"},503);let X=await $.req.text();if(!xd$(X,$.req.header("stripe-signature"),Z))return $.json({error:"invalid signature"},400);let Y=yd$(X);if(!Y)return $.json({error:"invalid payload"},400);let G=await hd$(Y);return console.log("stripe webhook",{eventId:Y.id,type:Y.type,livemode:Y.livemode,...G}),$.json({received:!0})})});import{timingSafeEqual as hU6}from"crypto";function cU6($,Z,X){if(!Z?.startsWith("sha256="))return!1;let Q=new Bun.CryptoHasher("sha256",X).update($).digest("hex"),Y=Z.slice(7);if(Y.length!==Q.length)return!1;return hU6(Buffer.from(Y),Buffer.from(Q))}var uU6=5242880,v71;var ld$=D(()=>{U8();jF();m3();v71=new H1;v71.post("/webhook",p5({maxSize:uU6,onError:($)=>$.json({error:"payload too large"},413)}),async($)=>{let Z=process.env.GITHUB_WEBHOOK_SECRET;if(!Z)return $.json({error:"github webhook not configured"},503);let X=await $.req.text();if(!cU6(X,$.req.header("x-hub-signature-256"),Z))return $.json({error:"invalid signature"},400);if($.req.header("x-github-event")!=="push")return $.json({ok:!0,ignored:"event"});let Q;try{Q=JSON.parse(X)}catch{return $.json({error:"invalid payload"},400)}let Y=Q.ref,G=Q.repository?.full_name;if(!Y||!G)return $.json({ok:!0,ignored:"shape"});let W=(await bn0())?.markTenantPoolsDirty(G,Y)??[];return $.json({ok:!0,pools:W})})});function dd$($,Z){if(Z.startsWith("text/html")||Z.startsWith("image/svg"))$.set("Content-Security-Policy","sandbox allow-scripts allow-modals allow-same-origin")}var md$,lU6,dU6,id$;var pd$=D(()=>{U8();A3();wg();Xy();md$=new H1,lU6=["range","if-none-match","if-modified-since"],dU6=["content-type","content-length","content-range","accept-ranges","etag","last-modified"];md$.get("/:org/files/*",async($)=>{let Z=$.get("studioContext"),X=Z.organization?.id;if(!Z.auth?.user?.id){if(Tu($))return $.redirect(`/login?next=${encodeURIComponent($.req.path)}`,302);throw new Z$(401,{message:"Authentication required"})}if(!X)throw new Z$(401,{message:"Organization context required"});let Q=$.req.path.replace(/^.*\/files\//,"");if(!Q)throw new Z$(400,{message:"Missing file key"});let Y=await Ot(Q,Z);if(!Y)throw new Z$(503,{message:"Object storage not configured"});if(Y.startsWith("data:")&&tG()){let K=Y.match(/^data:([^;]+);base64,(.+)$/s);if(!K)throw new Z$(500,{message:"Invalid data URL from storage"});let[,F,H]=K,N=Buffer.from(H,"base64"),U=new Headers({"Content-Type":F,"Cache-Control":"private, max-age=86400"});return dd$(U,F),new Response(N,{status:200,headers:U})}let G=new Headers;for(let K of lU6){let F=$.req.header(K);if(F)G.set(K,F)}let J=await fetch(Y,{headers:G});if(J.status===403||J.status===404)throw new Z$(404,{message:"File not found"});if(!J.ok&&J.status!==304&&J.status!==416)throw console.error(`[files] upstream storage error ${J.status} for key:`,Q),new Z$(502,{message:"Upstream storage error"});let W=new Headers;for(let K of dU6){let F=J.headers.get(K);if(F)W.set(K,F)}return W.set("Cache-Control","private, max-age=86400"),dd$(W,W.get("content-type")??""),new Response(J.body,{status:J.status,headers:W})});id$=md$});var js=_((Lv)=>{var mU6=Lv&&Lv.__createBinding||(Object.create?function($,Z,X,Q){if(Q===void 0)Q=X;var Y=Object.getOwnPropertyDescriptor(Z,X);if(!Y||("get"in Y?!Z.__esModule:Y.writable||Y.configurable))Y={enumerable:!0,get:function(){return Z[X]}};Object.defineProperty($,Q,Y)}:function($,Z,X,Q){if(Q===void 0)Q=X;$[Q]=Z[X]}),iU6=Lv&&Lv.__exportStar||function($,Z){for(var X in $)if(X!=="default"&&!Object.prototype.hasOwnProperty.call(Z,X))mU6(Z,$,X)};Object.defineProperty(Lv,"__esModule",{value:!0});iU6(AY(),Lv)});var od$=_((nd$)=>{Object.defineProperty(nd$,"__esModule",{value:!0});nd$.version=void 0;nd$.version="3.4.0"});var sd$=_((qF)=>{var pU6=qF&&qF.__importDefault||function($){return $&&$.__esModule?$:{default:$}};Object.defineProperty(qF,"__esModule",{value:!0});qF.NodeTransport=qF.VERSION=void 0;qF.nodeResolveHost=sU6;var s6=js(),nU6=j0("net"),f71=j0("tls"),tU6=j0("path"),rd$=j0("fs"),oU6=pU6(j0("dns")),rU6=od$();qF.VERSION=rU6.version;var aU6="nats.js";class ad${socket;version;lang;yields=[];signal=(0,s6.deferred)();closedNotification=(0,s6.deferred)();options;connected=!1;tlsName="";done=!1;closeError;constructor(){this.lang=aU6,this.version=qF.VERSION}async connect($,Z){this.tlsName=$.tlsName,this.options=Z;let{tls:X}=this.options,{handshakeFirst:Q}=X||{};try{if(Q===!0)this.socket=await this.tlsFirst($);else this.socket=await this.dial($);if(this.done)this.socket?.destroy();let Y=await this.peekInfo();(0,s6.checkOptions)(Y,Z);let{tls_required:G,tls_available:J}=Y,W=J===!0&&Z.tls!==null;if(!Q&&(G||W))this.socket=await this.startTLS();if(this.done)this.socket?.destroy();if(G&&this.socket.encrypted!==!0)throw s6.errors.InvalidArgumentError.format("tls","is not available on this server");return this.connected=!0,this.setupHandlers(),this.signal.resolve(),Promise.resolve()}catch(Y){let G=Y;if(!G)G=new s6.errors.ConnectionError("error connecting - node provided an undefined error");let{code:J}=G,W=J==="ECONNREFUSED"?new s6.errors.ConnectionError("connection refused",{cause:G}):G;throw this.socket?.destroy(),W}}dial($){let Z=(0,s6.deferred)(),X,Q=(0,nU6.createConnection)($.port,$.hostname,()=>{Z.resolve(Q),Q.removeAllListeners()});return Q.on("error",(Y)=>{X=Y}),Q.on("close",()=>{Q.removeAllListeners(),Z.reject(X)}),Q.setNoDelay(!0),Z}get isClosed(){return this.done}close($){return this._closed($,!1)}peekInfo(){let $=(0,s6.deferred)(),Z;return this.socket.on("data",(X)=>{this.yields.push(X);let Q=s6.DataBuffer.concat(...this.yields),Y=(0,s6.extractProtocolMessage)(Q);if(Y!=="")try{let G=s6.INFO.exec(Y);if(!G)throw Error("unexpected response from server");let J=JSON.parse(G[1]);$.resolve(J)}catch(G){$.reject(G)}finally{this.socket.removeAllListeners()}}),this.socket.on("error",(X)=>{Z=X}),this.socket.on("close",()=>{this.socket.removeAllListeners(),$.reject(Z)}),$}loadFile($){if(!$)return Promise.resolve();let Z=(0,s6.deferred)();try{if($=(0,tU6.resolve)($),!(0,rd$.existsSync)($))Z.reject(Error(`${$} doesn't exist`));(0,rd$.readFile)($,(X,Q)=>{if(X)return Z.reject(X);Z.resolve(Q)})}catch(X){Z.reject(X)}return Z}async loadClientCerts(){let $={},{certFile:Z,cert:X,caFile:Q,ca:Y,keyFile:G,key:J}=this.options.tls;try{if(Z){let W=await this.loadFile(Z);if(W)$.cert=W}else if(X)$.cert=X;if(G){let W=await this.loadFile(G);if(W)$.key=W}else if(J)$.key=J;if(Q){let W=await this.loadFile(Q);if(W)$.ca=[W]}else if(Y)$.ca=Y;return Promise.resolve($)}catch(W){return Promise.reject(W)}}async tlsFirst($){let Z,X={servername:this.tlsName,rejectUnauthorized:!0};if(this.socket)X.socket=this.socket;if(typeof this.options.tls==="object")try{let Y=await this.loadClientCerts()||{};X=(0,s6.extend)(X,this.options.tls,Y)}catch(Y){return Promise.reject(new s6.errors.ConnectionError(Y.message,{cause:Y}))}let Q=(0,s6.deferred)();try{let Y=(0,f71.connect)($.port,$.hostname,X,()=>{Y.removeAllListeners(),Q.resolve(Y)});Y.on("error",(G)=>{Z=G}),Y.on("secureConnect",()=>{if(X.rejectUnauthorized===!1)return;if(!Y.authorized)throw Y.authorizationError}),Y.on("close",()=>{Q.reject(Z),Y.removeAllListeners()}),Y.setNoDelay(!0)}catch(Y){Q.reject(new s6.errors.ConnectionError(Y.message,{cause:Y}))}return Q}async startTLS(){let $,Z={socket:this.socket,servername:this.tlsName,rejectUnauthorized:!0};if(typeof this.options.tls==="object")try{let Q=await this.loadClientCerts()||{};Z=(0,s6.extend)(Z,this.options.tls,Q)}catch(Q){return Promise.reject(new s6.errors.ConnectionError(Q.message,{cause:Q}))}let X=(0,s6.deferred)();try{let Q=(0,f71.connect)(Z,()=>{Q.removeAllListeners(),X.resolve(Q)});Q.on("error",(Y)=>{$=Y}),Q.on("secureConnect",()=>{if(Z.rejectUnauthorized===!1)return;if(!Q.authorized)throw Q.authorizationError}),Q.on("close",()=>{X.reject($),Q.removeAllListeners()})}catch(Q){X.reject(new s6.errors.ConnectionError(Q.message,{cause:Q}))}return X}setupHandlers(){let $;this.socket.on("data",(Z)=>{return this.yields.push(Z),this.signal.resolve()}),this.socket.on("error",(Z)=>{$=Z}),this.socket.on("end",()=>{if(this.socket?.destroyed)return;this.socket?.write(new Uint8Array(0),()=>{this.socket?.end()})}),this.socket.on("close",()=>{this._closed($,!1)})}[Symbol.asyncIterator](){return this.iterate()}async*iterate(){while(!0){if(this.yields.length===0)await this.signal;let $=this.yields;this.yields=[];for(let Z=0;Z<$.length;Z++){if(this.options.debug)console.info(`> ${(0,s6.render)($[Z])}`);yield $[Z]}if(this.done)break;else if(this.yields.length===0)$.length=0,this.yields=$,this.signal=(0,s6.deferred)()}}discard(){if(this.done=!0,this.socket)try{this.socket.removeAllListeners(),this.socket.destroy()}catch{}}disconnect(){this._closed(void 0,!0).then().catch()}isEncrypted(){return this.socket instanceof f71.TLSSocket}_send($){if(this.isClosed||this.socket===void 0)return Promise.resolve();if(this.options.debug)console.info(`< ${(0,s6.render)($)}`);let Z=(0,s6.deferred)();try{this.socket.write($,(X)=>{if(X){if(this.options.debug)console.error(`!!! ${(0,s6.render)($)}: ${X}`);return Z.reject(X)}return Z.resolve()})}catch(X){if(this.options.debug)console.error(`!!! ${(0,s6.render)($)}: ${X}`);Z.reject(X)}return Z}send($){this._send($).catch((X)=>{})}async _closed($,Z=!0){if(!this.connected)return;if(this.done){this.socket?.destroy();return}if(this.closeError=$,!$&&this.socket&&Z)try{await this._send(new TextEncoder().encode(""))}catch(X){if(this.options.debug)console.log("transport close terminated with an error",X)}try{if(this.socket)this.socket.removeAllListeners(),this.socket?.destroy(),this.socket=void 0}catch(X){console.log(X)}this.done=!0,this.closedNotification.resolve(this.closeError)}closed(){return this.closedNotification}}qF.NodeTransport=ad$;function sU6($){let Z=(0,s6.deferred)();return oU6.default.lookup($,{all:!0},(X,Q)=>{if(X){Z.reject(X);return}let Y=[];for(let G of Q)Y.push(G.address);if(Y.length===0)Y.push($);Z.resolve(Y)}),Z}});var Qm$=_((Xm$)=>{Object.defineProperty(Xm$,"__esModule",{value:!0});Xm$.connect=eU6;var ed$=sd$(),$m$=js(),Zm$=js();function eU6($={}){if((0,Zm$.hasWsProtocol)($))return Promise.reject(Zm$.errors.InvalidArgumentError.format("servers","node client doesn't support websockets, use the 'wsconnect' function instead"));return(0,$m$.setTransportFactory)({factory:()=>{return new ed$.NodeTransport},dnsResolveFn:ed$.nodeResolveHost}),$m$.NatsConnectionImpl.connect($)}});var Ym$=_((nN)=>{var ZB6=nN&&nN.__createBinding||(Object.create?function($,Z,X,Q){if(Q===void 0)Q=X;var Y=Object.getOwnPropertyDescriptor(Z,X);if(!Y||("get"in Y?!Z.__esModule:Y.writable||Y.configurable))Y={enumerable:!0,get:function(){return Z[X]}};Object.defineProperty($,Q,Y)}:function($,Z,X,Q){if(Q===void 0)Q=X;$[Q]=Z[X]}),XB6=nN&&nN.__exportStar||function($,Z){for(var X in $)if(X!=="default"&&!Object.prototype.hasOwnProperty.call(Z,X))ZB6(Z,$,X)};Object.defineProperty(nN,"__esModule",{value:!0});nN.connect=void 0;var QB6=Qm$();Object.defineProperty(nN,"connect",{enumerable:!0,get:function(){return QB6.connect}});XB6(js(),nN)});function Km$($){let Z=$?.connectFn??WB6,X=null,Q=null,Y=!1,G=!1,J=!1,W=[];function K(){return X!==null&&!X.isClosed()&&!X.isDraining()&&!J}function F(){console.log(`[NatsProvider] fireReady: ${W.length} callbacks`);for(let U of W)try{U()}catch{}}function H(U){(async()=>{for await(let B of U.status())if(B.type==="disconnect")console.log("[NatsProvider] Disconnected"),J=!0;else if(B.type==="reconnect")console.log("[NatsProvider] Reconnected, re-firing ready callbacks"),J=!1,Q=null,F()})().catch(()=>{})}async function N(U,B){let O=0;while(!G)try{X=await Z({servers:U,timeout:JB6,reconnect:!0,maxReconnectAttempts:-1,...B?{authenticator:B}:{}}),console.log(`[NatsProvider] Connected to ${X.getServer()} after ${O} attempt(s)`),Q=null,J=!1,H(X),F();return}catch{O++;let L=aZ(GB6,YB6,O-1,2,0.5);await L$(L)}}return{init(U,B){if(Y)return;Y=!0,G=!1;let O=B?.creds?Gm$.credsAuthenticator(new TextEncoder().encode(B.creds)):void 0;N(U,O).catch(()=>{})},isConnected(){return K()},getConnection(){return K()?X:null},getJetStream(){if(!K())return null;if(!Q)Q=Wm$.jetstream(X);return Q},onReady(U){if(W.push(U),K())try{U()}catch{}},async drain(){if(G=!0,Y=!1,Q=null,J=!1,X){let U=X;X=null,await U.drain().catch(()=>{})}}}}function WB6($){return Jm$.connect($)}var Gm$,Jm$,Wm$,YB6=100,GB6=3000,JB6=3000;var Fm$=D(()=>{W4();Gm$=V(Pc(),1),Jm$=V(Ym$(),1),Wm$=V(OL(),1)});function b71($,Z){return`${$}.${Z}`}class x71{cache;constructor($){this.cache=Yu({ttlMs:$?.ttlMs??KB6,maxSize:$?.maxSize??FB6})}async get($,Z){return this.cache.get(b71($,Z))??null}async set($,Z,X){this.cache.set(b71($,Z),X)}async invalidate($,Z){this.cache.delete(b71($,Z))}teardown(){this.cache.clear()}}var KB6=600000,FB6=5000;var Hm$=()=>{};function PT0($,Z){return`${$}:${Z}`}function y71($){let Z=Yu({ttlMs:$?.ttlMs??HB6,maxSize:$?.maxSize??NB6}),X=$?.getConnection,Q=crypto.randomUUID(),Y=new TextEncoder,G=new TextDecoder,J=null;function W(K,F){let H=X?.();if(!H)return;try{H.publish(Nm$,Y.encode(JSON.stringify({organizationId:K,keyId:F,originId:Q})))}catch(N){console.warn("[ProviderKeyCache] Publish failed (non-critical):",N)}}return{get(K,F){return Z.get(PT0(K,F))},set(K,F,H){Z.set(PT0(K,F),H)},invalidate(K,F){Z.delete(PT0(K,F)),W(K,F)},start(){if(J)return;let K=X?.();if(!K)return;J=K.subscribe(Nm$),(async()=>{for await(let F of J)try{let H=JSON.parse(G.decode(F.data));if(H.originId===Q)continue;Z.delete(PT0(H.organizationId,H.keyId))}catch{}})().catch(console.error)},teardown(){J?.unsubscribe(),J=null,Z.clear()}}}var Nm$="studio.ai-provider-keys.invalidate",HB6=30000,NB6=5000;var Um$=()=>{};class g71{options;subscription=null;onCancel=null;encoder=new TextEncoder;originId=crypto.randomUUID();constructor($){this.options=$}async start($){if($)this.onCancel=$;if(this.subscription)return;if(!this.onCancel)return;let Z=this.options.getConnection();if(!Z)return;let X=new TextDecoder,Q=Z.subscribe("studio.decopilot.cancel");this.subscription=Q,(async()=>{for await(let Y of Q)try{let G=JSON.parse(X.decode(Y.data));if(G.originId===this.originId)continue;this.onCancel?.(G.taskId)}catch{}})().catch(console.error)}broadcast($){if(/[.*>\s]/.test($)){console.warn("[NatsCancelBroadcast] Invalid threadId, skipping broadcast");return}this.onCancel?.($);try{let Z=this.options.getConnection();if(!Z)return;let X=this.encoder.encode(JSON.stringify({taskId:$,originId:this.originId}));Z.publish("studio.decopilot.cancel",X)}catch(Z){console.warn("[NatsCancelBroadcast] Publish failed (non-critical):",Z)}}async stop(){this.subscription?.unsubscribe(),this.subscription=null,this.onCancel=null}}var Bm$=($)=>{let Z;return()=>Z??=$()},h71,u71;var Om$=D(()=>{I6();h71=Bm$(()=>w$.createHistogram("decopilot.stream.encode_ms",{description:"Per-chunk JSON.stringify+encode time for decopilot stream",unit:"ms"})),u71=Bm$(()=>w$.createCounter("decopilot.stream.published_chunks",{description:"Logical decopilot stream chunks published to JetStream",unit:"{chunks}"}))});function EB6($=wm$){return{name:pK,subjects:[`${Xa0}.>`],storage:EW.StorageType.File,max_age:OB6,max_bytes:LB6,max_msgs_per_subject:wB6,discard:EW.DiscardPolicy.Old,retention:EW.RetentionPolicy.Limits,duplicate_window:DB6,num_replicas:$}}class Em${chunks=0;encodeMs=0;maxMs=0;bytes=0;windowStart=performance.now();constructor(){setInterval(()=>this.flush(),1e4).unref?.()}record($,Z){if(this.chunks++,this.encodeMs+=$,$>this.maxMs)this.maxMs=$;this.bytes+=Z}flush(){let $=performance.now(),Z=$-this.windowStart;if(this.chunks>0&&Z>0)console.warn(JSON.stringify({msg:"stream-encode-trace",windowMs:Math.round(Z),chunks:this.chunks,encodeMs:Math.round(this.encodeMs),pctOfLoop:+(this.encodeMs/Z*100).toFixed(1),maxChunkMs:+this.maxMs.toFixed(2),mbEncoded:+(this.bytes/1048576).toFixed(2)}));this.chunks=0,this.encodeMs=0,this.maxMs=0,this.bytes=0,this.windowStart=$}}function Dm$($){let Z=Lm$.headers();for(let[X,Q]of Object.entries($))Z.set(X,Q);return Z}function AB6($,Z){let X=0;return{publish(Q,Y,G,J){Q.publish(Y,G,J?{headers:J}:void 0).catch((W)=>{if(X++,BB6().add(1,{"org.id":Z??"unknown"}),X===1||X%100===0)console.warn(`[Decopilot] JetStream publish failed for thread ${$} (${X} total):`,W)})},get errorCount(){return X}}}function TB6($,Z){return $.info?.cluster?Z:1}function RB6($){if(!($ instanceof Error))return!1;if(/non-clustered/i.test($.message))return!0;return/replicas?\b/i.test($.message)&&/not supported|can ?not|exceed|insufficient|greater than/i.test($.message)}class c71{options;js=null;jsm=null;constructor($){this.options=$}async init(){let $=this.options.getConnection();if(!$){console.log("[Decopilot] StreamBuffer.init skipped: NATS not connected yet");return}let Z=async(Q,Y)=>{let G=EB6(Y);try{await Q.streams.info(pK),await Q.streams.update(pK,G)}catch(J){if(J instanceof Error&&J.message.includes("stream not found"))await Q.streams.add(G),await Q.streams.update(pK,G);else if(J instanceof Error&&/can ?not change.*storage|storage type/i.test(J.message))await Q.streams.delete(pK),await Q.streams.add(G);else throw J}},X=await g6(async()=>{let Q=this.options.getJetStreamManager?await this.options.getJetStreamManager():await EW.jetstreamManager($),Y=TB6($,wm$);try{await Z(Q,Y)}catch(G){if(Y<=1||!RB6(G))throw G;console.warn(`[Decopilot] StreamBuffer: NATS rejected num_replicas=${Y} (${G.message}); falling back to an unreplicated stream`),await Z(Q,1)}return Q},{maxAttempts:5,minTimeout:250,maxTimeout:4000,jitter:0.5,isRetriable:kg});this.js=this.options.getJetStream(),this.jsm=X,console.log(`[Decopilot] StreamBuffer.init ${this.js?"ready":"degraded (js=null)"}`)}pump($,Z,X,Q){let Y=this.js;if(!Y)return console.warn(`[Decopilot] pump: JetStream client unavailable for thread ${Z}; chunks NOT published to NATS`),Promise.resolve();let G=AB6(Z,Q),J=!1,W=()=>{if(J)return;J=!0;let F=nB$(Z);Y.publish(F.subject,F.data).catch(()=>{})};X.addEventListener("abort",W,{once:!0});let K=(F)=>{let H=performance.now(),N=Ya0(F,{runId:Z}),U=performance.now()-H;h71().record(U),u71().add(1,{"org.id":Q??"unknown"}),PB6?.record(U,N.reduce((B,O)=>B+O.data.length,0));for(let B of N)G.publish(Y,B.subject,B.data,B.headers?Dm$(B.headers):void 0)};return(async()=>{let F=$.getReader(),H=0,N=0,U;try{while(!0){let{done:B,value:O}=await F.read();if(B)break;if(K(O),N++,++H>=64)H=0,await new Promise((L)=>setImmediate(L))}}catch(B){U=B,console.warn(`[Decopilot] stream pump error for thread ${Z}:`,B?.message??B)}finally{if(F.releaseLock(),W(),zB6)console.warn(JSON.stringify({msg:"decopilot-stream-diag",event:"pump-done",taskId:Z,publishedChunks:N,publishErrors:G.errorCount}))}if(U!==void 0)throw U})()}async publishSerialized($,Z){try{return await g6(()=>$.publish(Z.subject,Z.data,{...Z.headers?{headers:Dm$(Z.headers)}:{},...Z.msgId?{msgID:Z.msgId}:{}}),{maxAttempts:6,minTimeout:250,maxTimeout:5000,jitter:0.5,isRetriable:kg}),!0}catch(X){return console.error(`[Decopilot] publish failed after retries subject=${Z.subject}`,X),!1}}async publishRawChunk($,Z,X){let Q=this.js;if(!Q)return!1;let Y=performance.now(),G=Ya0(Z,{runId:$,dedup:X});h71().record(performance.now()-Y),u71().add(1);for(let J of G)if(!await this.publishSerialized(Q,J))return!1;return!0}async publishDone($,Z,X){let Q=this.js;if(!Q)return!1;let Y=pB$({runId:$,fenceToken:Z,finalSeq:X});return await this.publishSerialized(Q,Y)}async createTailStream($,Z,X){let Q=this.js;if(!Q)return console.warn(`[Decopilot] createTailStream: JetStream client unavailable for thread ${$}; no live tail`),null;let Y=X?.deliverPolicy==="new"?EW.DeliverPolicy.New:EW.DeliverPolicy.All,G=X?.closeOnDone??!1,J=GD($),W;try{W=await g6(async()=>{return(await Q.consumers.get(pK,{filter_subjects:J,deliver_policy:Y})).consume()},{maxAttempts:6,minTimeout:250,maxTimeout:5000,jitter:0.5,isRetriable:kg})}catch(L){return console.warn("[Decopilot] JetStream tail unavailable (non-critical):",L?.message??L),null}let H=Zw0({messages:async function*(){try{for await(let L of W)yield{subject:L.subject,data:L.data,headers:L.headers}}finally{W.stop()}}(),onCancel:()=>W.stop()}).pipeThrough(aL0()).pipeThrough(sL0()).getReader(),N=!1,U=()=>{if(N)return;N=!0;try{H.releaseLock()}catch{}},B=!1,O=()=>{if(B)return;B=!0,W.stop(),H.cancel().catch(()=>{}),U()};return Z?.addEventListener("abort",O,{once:!0}),new ReadableStream({async pull(L){for(;;){let{done:w,value:E}=await H.read();if(w){O(),L.close();return}let j=E;if(j.kind==="done"){if(G){O(),L.close();return}continue}L.enqueue(j.chunk);return}},cancel(){O()}})}purge($){if(!this.jsm)return;this.jsm.streams.purge(pK,{filter:GD($)}).catch(()=>{})}teardown(){this.js=null,this.jsm=null}}var EW,Lm$,UB6=($)=>{let Z;return()=>Z??=$()},BB6,OB6=86400000000000,DB6=120000000000,LB6=4294967296,wm$,wB6=500000,jB6,zB6,PB6;var jm$=D(()=>{W4();Ga0();Xw0();eL0();I6();Om$();EW=V(OL(),1),Lm$=V(Pc(),1),BB6=UB6(()=>w$.createCounter("decopilot.stream.publish_errors",{description:"Number of JetStream publish failures for decopilot stream chunks",unit:"{errors}"})),wm$=Math.max(1,Number(process.env.DECOPILOT_STREAM_REPLICAS??3)||3);jB6=process.env.STREAM_ENCODE_TRACE==="1",zB6=process.env.DECOPILOT_STREAM_TRACE==="1";PB6=jB6?new Em$:null});function AT0($,Z,X,Q){if(!Q)return!1;return $.emit(Z,cW(X,Q.status,{title:Q.title??void 0,virtualMcpId:Q.virtual_mcp_id??void 0,createdBy:Q.created_by??void 0,triggerId:Q.trigger_id??null,branch:Q.branch??null,harnessId:Q.harness_id??void 0,createdAt:Q.created_at,updatedAt:Q.updated_at})),!0}var zm$=D(()=>{_8()});class l71{storage;options;timer=null;constructor($,Z={}){this.storage=$;this.options=Z}start(){if(this.timer)return;let $=this.options.intervalMs??300000;this.timer=setInterval(()=>{this.runOnce()},$)}async runOnce(){let $=this.options.staleAfterMs??3600000;try{let Z=await this.storage.sweepAbandoned($);if(Z>0)console.log(`[async-research-sweeper] marked ${Z} stale jobs as abandoned`);return Z}catch(Z){return console.error("[async-research-sweeper] sweep failed",Z),0}}dispose(){if(this.timer)clearInterval(this.timer),this.timer=null}}async function Pm$($,Z,X){let Q=Z.organizationId;if(!sQ(Z))return!1;if(!vC(X))return!1;if(await $.storage.taskBoard.hasHumanRejectedDone(Z.id,Q))return!1;let Y=await $.storage.organizationSettings.get(Q),G=EK(Y?.flags),J=await $.storage.taskBoard.update(Z.id,Q,{status:G},Z.updatedBy);return await z6($,{taskBoardItemId:Z.id,action:"status_changed",actorId:null,data:{from:Z.status,to:G,reason:"pr_merged"}}),x$(Q,J),console.log(`[task-board-review-sweeper] ${Z.id}: linked PR already merged \u2014 moved to ${G}`),!0}var Am$=D(()=>{C6();WX();Og();yK();E5()});function CB6($){return $ instanceof tX}function _B6($,Z){return Z-$>=VB6}class d71{taskBoard;contextFactory;billing;options;timer=null;running=!1;cursor=null;constructor($,Z,X,Q={}){this.taskBoard=$;this.contextFactory=Z;this.billing=X;this.options=Q}start(){if(this.timer)return;let $=this.options.intervalMs??IB6;this.timer=setInterval(()=>{this.runOnce()},$),this.timer.unref()}async runOnce(){if(this.running)return 0;this.running=!0;let $=0;try{let Z=this.options.batchSize??MB6,X=this.options.itemIntervalMs??qB6,Q=new Date(Date.now()-X),Y=await this.taskBoard.listItemsPendingReview(Z,this.cursor,Q),G=Y.at(-1);this.cursor=Y.length===Z&&G?{updatedAt:G.updatedAt,id:G.id}:null;for(let{id:J,organizationId:W}of Y)try{if(await this.reconcileItem(J,W,Q))$++}catch(K){console.error(`[task-board-review-sweeper] ${J} failed`,K)}await this.reapNeverStartedThreads(Z),$+=await this.dispatchDueRetries(Z),await this.reactToUnhandledFailures(Z)}catch(Z){console.error("[task-board-review-sweeper] sweep failed",Z)}finally{this.running=!1}return $}async reapNeverStartedThreads($){try{let Z=await this.taskBoard.failNeverStartedLinkedThreads($,new Date(Date.now()-Rt0),Ao0);for(let X of Z)console.warn(`[task-board-review-sweeper] failed never-started thread ${X.threadId} on ${X.itemId}`)}catch(Z){console.error("[task-board-review-sweeper] reaping failed",Z)}}async reactToUnhandledFailures($){let Z=await this.taskBoard.listItemsStuckAfterFailure($,new Date(Date.now()-SB6));for(let{id:X,organizationId:Q,threadId:Y}of Z)try{console.warn(`[task-board-review-sweeper] reacting to an unhandled failure on ${X}`),await jo0(this.taskBoard,Y,Q),await zo0(this.taskBoard,this.billing,Y,Q)}catch(G){console.error(`[task-board-review-sweeper] unhandled-failure reaction for ${X} failed`,G)}}async dispatchDueRetries($){let Z=0,X=await this.taskBoard.listItemsDueForRetry($,new Date);for(let{id:Q,organizationId:Y,attempts:G}of X)try{if(!await this.taskBoard.claimDueRetry(Q,Y,new Date))continue;let J=await this.taskBoard.getById(Q,Y);if(!J||J.status!=="in_progress"||J.assigneeId!==Z8)continue;let W=await this.contextFactory(Y,J.assignedBy??J.createdBy);if(!W)continue;await KN(W,J,{runClass:"retry"}),Z++,console.warn(`[task-board-review-sweeper] re-dispatched ${Q} after a failure (attempt ${G})`)}catch(J){if(console.error(`[task-board-review-sweeper] retry dispatch for ${Q} failed`,J),CB6(J)){await this.returnToTodo(Q,Y,J instanceof Error?J.message:String(J));continue}await this.taskBoard.scheduleRunRetry(Q,Y,G,new Date(Date.now()+kB6)).catch((W)=>console.error(`[task-board-review-sweeper] re-arming ${Q} failed`,W))}return Z}async returnToTodo($,Z,X){try{let Q=await this.taskBoard.getById($,Z);if(!Q||Q.status!=="in_progress")return;let Y=await this.taskBoard.returnToTodoAfterFailure($,Z,Q.updatedBy);if(!Y)return;await this.taskBoard.recordActivity({taskBoardItemId:$,action:"status_changed",actorId:null,data:{from:"in_progress",to:"todo",reason:X}}).catch(()=>{}),x$(Z,Y)}catch(Q){console.error(`[task-board-review-sweeper] returning ${$} to todo failed`,Q)}}async handOffReviewWithoutPr($,Z){let X=await this.taskBoard.listActivity(Z.id,Z.organizationId);if(!_B6(xH(X,Z.reviewCycleStartedAt),Date.now()))return;await uK($,Z,"no pull request is linked to this task \u2014 there is nothing for a "+"reviewer to review")}async reconcileItem($,Z,X){if(!await this.taskBoard.claimSweep($,Z,X))return!1;let Q=await this.taskBoard.getById($,Z);if(!Q)return!1;if(!sQ(Q))return!1;let Y=Q.assigneeId===Z8,G=await this.taskBoard.listPrs($,Z),J=await this.contextFactory(Z,Q.assignedBy??Q.createdBy);if(!J)return!1;if(G.length===0){if(Y)await this.handOffReviewWithoutPr(J,Q);return!1}let W=await Promise.all(G.map(async(K)=>({...K,...await Lg(Z,K)})));if(W.every((K)=>K.state===null))console.warn(`[task-board-review-sweeper] ${$}: no live PR state from GitHub (${W.length} PR(s)) \u2014 proceeding on unknown`);if(await Pm$(J,Q,W))return!0;if(await bO$(J,Q))return!0;if(!Y)return!1;if(!co0(W))return!1;return await BL0(J,Q,{previewMatchesHead:lo0(W)}),!0}dispose(){if(this.timer)clearInterval(this.timer),this.timer=null}}var IB6=60000,qB6=300000,MB6=50,kB6=60000,VB6=900000,SB6=120000;var Tm$=D(()=>{C6();_o0();JN();bt();yK();Am$();E5();sG();To0();ZG();Ht()});import{readdir as vB6,rm as TT0}from"fs/promises";import{join as RT0}from"path";async function IT0($){let Z=new Date;Z.setUTCDate(Z.getUTCDate()-fB6),Z.setUTCHours(0,0,0,0);let X=0;try{let Q=await wv($);for(let Y of Q)if(/^\d{4}$/.test(Y))X+=await Rm$($,Y,Z);else if(!Y.startsWith(".")){let G=RT0($,Y),J=await wv(G);for(let K of J){if(!/^\d{4}$/.test(K))continue;X+=await Rm$(G,K,Z)}if((await wv(G)).length===0)await TT0(G,{recursive:!0,force:!0})}}catch(Q){console.warn("monitoring retention cleanup failed:",Q)}return X}async function Rm$($,Z,X){let Q=0,Y=RT0($,Z),G=await wv(Y);for(let W of G){if(!/^\d{2}$/.test(W))continue;let K=RT0(Y,W),F=await wv(K);for(let N of F){if(!/^\d{2}$/.test(N))continue;let U=new Date(`${Z}-${W}-${N}T00:00:00Z`);if(isNaN(U.getTime()))continue;if(U<X){let B=RT0(K,N);await TT0(B,{recursive:!0,force:!0}),Q++}}if((await wv(K)).length===0)await TT0(K,{recursive:!0,force:!0})}if((await wv(Y)).length===0)await TT0(Y,{recursive:!0,force:!0});return Q}async function wv($){try{return(await vB6($)).filter((X)=>!X.startsWith("."))}catch{return[]}}var fB6=30;var m71=()=>{};import{DBOS as i71,SchedulerMode as bB6}from"@dbos-inc/dbos-sdk";async function yB6(){let $=[uJ(),Ev(),SF()],Z=0;for(let X of $)try{Z+=await IT0(X)}catch(Q){console.error("[monitoring-retention] cleanup failed:",Q)}return console.log(`[monitoring-retention] deleted ${Z} day-dir(s) across ${$.length} signal dir(s)`),{deleted:Z,dirs:$.length}}async function gB6($,Z){await i71.runStep(()=>yB6(),{name:"monitoringRetention"})}function qm$(){if(Im$)return;Im$=!0;let $=i71.registerWorkflow(gB6,{name:"monitoringRetentionWorkflow"});i71.registerScheduled($,{name:"monitoringRetentionWorkflow",crontab:xB6,mode:bB6.ExactlyOncePerIntervalWhenActive})}var xB6="23 4 * * *",Im$=!1;var Mm$=D(()=>{EY();m71()});function km$($){return async(Z,X)=>{let Q=await $.db.selectFrom("member").innerJoin("organization","organization.id","member.organizationId").select(["member.role","organization.id as orgId","organization.slug as orgSlug","organization.name as orgName"]).where("member.userId","=",X).where("member.organizationId","=",Z).executeTakeFirst();if(!Q)return console.warn(`[automationContextFactory] User ${X} not found in org ${Z} \u2014 returning null`),null;let Y=await UJ.create();Y.auth.user={id:X,role:Q.role},Y.organization={id:Q.orgId,slug:Q.orgSlug,name:Q.orgName};let G=await Et($.db,Z,Q.role);return Y.boundAuth=i51({auth:Y.authInstance,headers:new Headers,role:Q.role,permissions:G,userId:X}),Y.access=new tw(X,void 0,Y.boundAuth,Q.role,"self"),oO(Y,{id:Q.orgId,slug:Q.orgSlug}),Y}}var Vm$=D(()=>{ow();rO()});function hB6(){return[{name:"Postgres",status:"pending",port:0},{name:"NATS",status:"pending",port:0}]}function uB6(){return{services:hB6(),migrationsStatus:"pending",serverUrl:null,logs:[]}}function lB6(){for(let $ of cB6)$()}function Sm$($){let Z=[...p71.logs,$];p71={...p71,logs:Z.length>500?Z.slice(-500):Z},lB6()}function n71(){return dB6}var p71,cB6,dB6=!1;var t71=D(()=>{p71=uB6(),cB6=new Set});import{EventEmitter as mB6}from"events";var o71;var Cm$=D(()=>{t71();o71=new mB6;o71.on("request",($)=>{Sm$($)})});function _m$(){return async($,Z)=>{let X=Date.now(),Q=$.req.method,Y=$.req.path;if(Y==="/api/auth/get-session"||Y.includes("favicon")){await Z();return}let G="",J=!1;if(Y.startsWith("/mcp")&&Q==="POST"){J=!0;try{if($.req.header("Content-Type")?.includes("application/json")){let U=await $.req.raw.clone().json();if(U.method==="tools/call"&&U.params?.name){let B=au(U.params.name),O=U.params.arguments||{},L=Object.keys(O).map((E)=>au(E)),w=L.length>0?L.slice(0,3).join(",")+(L.length>3?"\u2026":""):"";G=`${J5.tool}${B}${J5.dim}(${w})${J5.reset}`}else if(U.method)G=`${J5.dim}${au(U.method)}${J5.reset}`}}catch{}}let W=au(Y);if(Y.startsWith("/mcp/conn_")){let H=Y.split("/")[2]??"";W=`/mcp/${J5.mcp}${au(H.slice(0,12))}\u2026${J5.reset}`}else if(Y==="/mcp")W=`${J5.mcp}/mcp${J5.reset}`;else if(Y==="/mcp/registry")W=`${J5.mcp}/mcp/registry${J5.reset}`;let K=pB6(Q),F=J?"\u25C0":"\u2190";if(!n71())console.log(`${J5.dim}${F}${J5.reset} ${K}${Q}${J5.reset} ${W}${G?` ${G}`:""}`);try{await Z()}finally{let H=Date.now()-X,N=$.res.status,U=iB6(N),B=H<1000?`${H}ms`:`${(H/1000).toFixed(1)}s`,O=J?"\u25B6":"\u2192";if(!n71())console.log(`${J5.dim}${O}${J5.reset} ${K}${Q}${J5.reset} ${W}${G?` ${G}`:""} ${U}${N}${J5.reset} ${J5.duration}${B}${J5.reset}`);o71.emit("request",{method:Q,path:au(Y),status:N,duration:H,timestamp:new Date})}}}var J5,iB6=($)=>{if($>=500)return J5.serverError;if($>=400)return J5.clientError;if($>=300)return J5.redirect;return J5.ok},pB6=($)=>{return J5[$]||J5.reset},au=($)=>{return $.replace(/\r/g,"").replace(/\n/g,"").replace(/\x1b\[[0-9;]*m/g,"").replace(/[\x00-\x1f\x7f-\x9f]/g,"")};var vm$=D(()=>{t71();Cm$();J5={reset:"\x1B[0m",dim:"\x1B[2m",bold:"\x1B[1m",GET:"\x1B[36m",POST:"\x1B[33m",PUT:"\x1B[35m",DELETE:"\x1B[31m",ok:"\x1B[32m",redirect:"\x1B[36m",clientError:"\x1B[33m",serverError:"\x1B[31m",mcp:"\x1B[35m",tool:"\x1B[96m",duration:"\x1B[90m"}});import{createHmac as ym$}from"crypto";import{mkdir as nB6,readdir as tB6,rm as fm$,stat as gm$}from"fs/promises";import{join as a71,relative as oB6}from"path";import{z as P$}from"zod";function um$($){let Z=$.replace(/[^a-zA-Z0-9_-]/g,"_");return a71(rB6,Z)}function cm$($){return $.replace(/^\/+/,"").replace(/\.\./g,"")}function r71($,Z){let X=um$($),Q=cm$(Z);return a71(X,Q)}function aB6($,Z,X,Q){let Y=b0().encryptionKey||"dev-secret",G=`${$}:${Z}:${X}:${Q}`;return ym$("sha256",Y).update(G).digest("hex")}function xm$($,Z,X,Q,Y){let G=Math.floor(Date.now()/1000)+Q,J=aB6(Z,X,G,Y),W=new URL(`/api/dev-assets/${Z}/${cm$(X)}`,$);return W.searchParams.set("expires",G.toString()),W.searchParams.set("signature",J),W.searchParams.set("method",Y),W.toString()}function lm$($,Z,X){let Q=`${$}:${Z.getTime()}:${X}`;return`"${ym$("md5","etag").update(Q).digest("hex")}"`}async function dm$($,Z,X,Q,Y){try{let G=await tB6($,{withFileTypes:!0});for(let J of G){let W=a71($,J.name),F=oB6(Z,W).replace(/\\/g,"/");if(X&&!F.startsWith(X))continue;if(J.isDirectory())if(Q){let H=F+"/";if(!X||H.startsWith(X)){if(!(X?F.slice(X.length):F).includes("/"))Y.commonPrefixes.add(H)}}else await dm$(W,Z,X,Q,Y);else if(J.isFile()){if(Q&&X){let H=F.slice(X.length);if(H.includes(Q)){let N=H.indexOf(Q),U=X+H.slice(0,N+1);Y.commonPrefixes.add(U);continue}}try{let H=await gm$(W);Y.objects.push({key:F,size:H.size,lastModified:H.mtime.toISOString(),etag:lm$(W,H.mtime,H.size)})}catch{}}}}catch{}}function mm$($,Z){let Q=t($).id;return[{name:"LIST_OBJECTS",description:"List objects in the local assets directory with pagination support",inputSchema:P$.object({prefix:P$.string().optional(),maxKeys:P$.number().optional().default(1000),continuationToken:P$.string().optional(),delimiter:P$.string().optional()}),outputSchema:P$.object({objects:P$.array(P$.object({key:P$.string(),size:P$.number(),lastModified:P$.string(),etag:P$.string()})),nextContinuationToken:P$.string().optional(),isTruncated:P$.boolean(),commonPrefixes:P$.array(P$.string()).optional()}),handler:async(Y)=>{let G=Y,J=G.prefix||"",W=G.maxKeys??1000,K=G.delimiter,F=G.continuationToken,H=um$(Q);await nB6(H,{recursive:!0});let N={objects:[],commonPrefixes:new Set};await dm$(H,H,J,K,N),N.objects.sort((w,E)=>w.key.localeCompare(E.key));let U=0;if(F){if(U=N.objects.findIndex((w)=>w.key>F),U===-1)U=N.objects.length}let B=N.objects.slice(U,U+W),O=U+W<N.objects.length,L=O?B[B.length-1]?.key:void 0;return{objects:B,isTruncated:O,nextContinuationToken:L,commonPrefixes:Array.from(N.commonPrefixes).sort()}}},{name:"GET_OBJECT_METADATA",description:"Get metadata for a file in the local assets directory",inputSchema:P$.object({key:P$.string()}),outputSchema:P$.object({contentType:P$.string().optional(),contentLength:P$.number(),lastModified:P$.string(),etag:P$.string(),metadata:P$.record(P$.string(),P$.string()).optional()}),handler:async(Y)=>{let G=Y,J=r71(Q,G.key),W=await gm$(J);return{contentType:C91(G.key),contentLength:W.size,lastModified:W.mtime.toISOString(),etag:lm$(J,W.mtime,W.size)}}},{name:"GET_PRESIGNED_URL",description:"Generate a presigned URL for downloading a file from local storage",inputSchema:P$.object({key:P$.string(),expiresIn:P$.number().optional()}),outputSchema:P$.object({url:P$.string(),expiresIn:P$.number()}),handler:async(Y)=>{let G=Y,J=G.expiresIn??bm$;return{url:xm$(Z,Q,G.key,J,"GET"),expiresIn:J}}},{name:"PUT_PRESIGNED_URL",description:"Generate a presigned URL for uploading a file to local storage",inputSchema:P$.object({key:P$.string(),expiresIn:P$.number().optional(),contentType:P$.string().optional()}),outputSchema:P$.object({url:P$.string(),expiresIn:P$.number()}),handler:async(Y)=>{let G=Y,J=G.expiresIn??bm$;return{url:xm$(Z,Q,G.key,J,"PUT"),expiresIn:J}}},{name:"DELETE_OBJECT",description:"Delete a single file from local storage",inputSchema:P$.object({key:P$.string()}),outputSchema:P$.object({success:P$.boolean(),key:P$.string()}),handler:async(Y)=>{let G=Y,J=r71(Q,G.key);try{return await fm$(J),{success:!0,key:G.key}}catch{return{success:!1,key:G.key}}}},{name:"DELETE_OBJECTS",description:"Delete multiple files from local storage",inputSchema:P$.object({keys:P$.array(P$.string()).max(1000)}),outputSchema:P$.object({deleted:P$.array(P$.string()),errors:P$.array(P$.object({key:P$.string(),message:P$.string()}))}),handler:async(Y)=>{let G=Y,J=[],W=[];return await Promise.all(G.keys.map(async(K)=>{let F=r71(Q,K);try{await fm$(F),J.push(K)}catch(H){W.push({key:K,message:H instanceof Error?H.message:"Unknown error"})}})),{deleted:J,errors:W}}}]}async function s71($,Z,X){let Q=mm$(Z,X),Y=new tW({name:"dev-assets-mcp",version:"1.0.0"},{capabilities:{tools:{}},jsonSchemaValidator:N5});for(let J of Q){let W="shape"in J.inputSchema?J.inputSchema.shape:P$.object({}).shape,K=J.outputSchema&&"shape"in J.outputSchema?J.outputSchema.shape:P$.object({}).shape;Y.registerTool(J.name,{description:J.description??"",inputSchema:W,outputSchema:K,annotations:J.annotations,_meta:J._meta},async(F)=>{try{let H=await J.handler(F);return{content:[{type:"text",text:JSON.stringify(H)}],structuredContent:H}}catch(H){return{content:[{type:"text",text:`Error: ${H.message}`}],isError:!0}}})}let G=new GQ({enableJsonResponse:$.headers.get("Accept")?.includes("application/json")??!1});return await Y.connect(G),AJ(Y,G,$,"mcp:dev-assets")}async function im$($,Z,X,Q){let G=mm$(X,Q).find((J)=>J.name===$);if(!G)return{content:[{type:"text",text:`Tool not found: ${$}`}],isError:!0};try{let J=await G.handler(Z);return{content:[{type:"text",text:JSON.stringify(J)}]}}catch(J){return{content:[{type:"text",text:J instanceof Error?J.message:String(J)}],isError:!0}}}var rB6="./data/assets",bm$=3600,hm$,pm$;var nm$=D(()=>{R$();fg();U8();md();Z_();gX();PA0();hm$=new H1;hm$.all("/",async($)=>{let Z=$.get("studioContext"),X=new URL($.req.url),Q=`${X.protocol}//${X.host}`;return s71($.req.raw,Z,Q)});pm$=hm$});var tm$={};J4(tm$,{mountDevRoutes:()=>sB6});function sB6($,Z){$.all("/mcp/:connectionId{.*_dev-assets$}",Z,async(Q)=>{let Y=Q.get("studioContext"),G=new URL(Q.req.url),J=`${G.protocol}//${G.host}`;return s71(Q.req.raw,Y,J)}),$.all("/mcp/:connectionId{.*_dev-assets$}/call-tool/:toolName",Z,async(Q)=>{let Y=Q.get("studioContext"),G=new URL(Q.req.url),J=`${G.protocol}//${G.host}`,W=Q.req.param("toolName");if(!W)return Q.json({error:"Missing tool name"},400);let K=await Q.req.json(),F=await im$(W,K,Y,J);if(F.isError)return Q.json(F.content,500);return Q.json(F.content)}),$.use("/mcp/dev-assets",Z),$.route("/mcp/dev-assets",pm$);let X=new H1;X.use("*",LW({mountPath:"/api/dev-assets"})),X.route("/",zA0({orgFromPath:!1})),$.route("/api/dev-assets",X)}var om$=D(()=>{U8();R91();PA0();nm$()});import{sql as eB6}from"kysely";import{randomUUID as rm$}from"crypto";import{z as $O6}from"zod";async function XO6($){let Z=new Date().toISOString(),X=rm$(),Q=C8.SELF($.organizationId),Y="registry.publish_request.created",G={requestId:$.request.id,requestedId:$.request.requested_id,title:$.request.title,status:$.request.status,createdAt:$.request.created_at,requester:{name:$.request.requester_name,email:$.request.requester_email}};await $.db.insertInto("events").values({id:X,organization_id:$.organizationId,type:"registry.publish_request.created",source:Q,specversion:"1.0",subject:$.request.id,time:Z,datacontenttype:"application/json",dataschema:null,data:JSON.stringify(G),cron:null,status:"pending",attempts:0,last_error:null,next_retry_at:null,created_at:Z,updated_at:Z}).execute();let J=await $.db.selectFrom("event_subscriptions").select(["id"]).where("organization_id","=",$.organizationId).where("enabled","=",1).where("event_type","=","registry.publish_request.created").where((W)=>W.or([W("publisher","is",null),W("publisher","=",Q)])).execute();if(J.length>0)await $.db.insertInto("event_deliveries").values(J.map((W)=>({id:rm$(),event_id:X,subscription_id:W.id,status:"pending",attempts:0,last_error:null,delivered_at:null,next_retry_at:null,created_at:Z}))).execute();try{await eB6`SELECT
|
|
2927
2927
|
pg_notify('studio_events', ${X}),
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{c as B,b as L,j as r}from"./index-BTRn8yLm.js";import{I as A}from"./input-B9Q64Q29.js";import{L as F}from"./label-BrYhPu77.js";import{S as R,a as V,b as z,c as O,d as D}from"./select-DzzbmWa-.js";import{T as G}from"./textarea-BVnIs1Lw.js";import{G as J,V as M,K as X,X as $,a5 as q}from"./index-DhVzPBx8.js";import{s as P}from"./primitives-6WK_sR50.js";import{u as H}from"./use-autosave-WGhfzLOa.js";import"./Check-Dx6Jilyu.js";import"./ChevronDown-C4geT7hd.js";import"./ChevronUp-BkSDpS0a.js";import"./ArrowUp-DI6O-me7.js";import"./chat-context-z1n7Mvsc.js";import"./use-panel-navigate-DAo-IaMv.js";import"./dialog-D9B8YUq0.js";import"./Copy01-DAXdkrcq.js";import"./Download01-BXb_GLPB.js";import"./use-destination-route-qnDA60ks.js";import"./constants-dLUUoWH7.js";import"./session-runtime-C-KTDVeQ.js";import"./slugify-CEUa2lfQ.js";import"./hooks-DZlZk47y.js";import"./use-mcp-client-CLbu-qTW.js";import"./auth-D8BzOPfU.js";import"./delay-CnY5UFtP.js";import"./backoff-CrEUbyZT.js";import"./decopilot-sse-pool-CIsbpW60.js";import"./task-board-qKQWRm20.js";import"./use-is-desktop-app-BNujXJc_.js";import"./use-virtual-mcp-B6XJTyzc.js";import"./use-ai-providers-VnHj1RvS.js";import"./use-decopilot-events-CLCNDljy.js";import"./use-organization-settings-vq5Gp8qn.js";import"./automation-runs-DE9VSUhn.js";import"./agent-icon-Bm0mBNmu.js";import"./AlertCircle-_dKQYyLm.js";import"./UserSquare-I8KZDiP3.js";import"./Tool01-BvO-aJRz.js";import"./ArrowLeft-CTckNarV.js";import"./Tool02-Um8w3S00.js";import"./XCircle-DWwaGX-T.js";import"./TrendUp01-D-pYOI27.js";import"./ZapSquare-CmW3PzOh.js";import"./Users03-D_Qzpo0w.js";import"./CheckCircle-D9s0Miro.js";import"./ChevronRight-BrJIIvGQ.js";import"./ChevronSelectorVertical-Dd-tJPH5.js";import"./DotsVertical-G8Mz1cUi.js";import"./Stars02-Bz7g2T3T.js";import"./CreditCard01-DY2ollJ7.js";import"./Settings02-DKqJklo6.js";import"./Eye-opJVAUIw.js";import"./FilterLines-BdTkKIdO.js";import"./Share07-BFNMphwZ.js";import"./Globe01-CcwZYK5w.js";import"./Globe04-BEpeirqG.js";import"./SwitchHorizontal01-D1IHpvoh.js";import"./HardDrive-BULz-Uit.js";import"./Key01-DjAus05D.js";import"./LinkExternal01-Cl9BJIic.js";import"./LockUnlocked01-DCNThh5w.js";import"./LogOut01-C8yxFbDK.js";import"./Monitor01-Cws_hyK1.js";import"./Sun-Bb3k_JiI.js";import"./Palette-DJquTsKt.js";import"./Play-BJig3Hma.js";import"./Plus-DplAwTzu.js";import"./SearchLg-DKfDlf2B.js";import"./SearchMd-WwqLArcb.js";import"./Shield01-DkQ3-Wuh.js";import"./Stars01-WAIDqPTc.js";import"./Trash01-D1j2us9_.js";import"./Upload01-lKTwpNsL.js";import"./User01-CzaJZtDP.js";import"./Users01-Bb1Odrhe.js";import"./XClose-BoczrFtB.js";import"./Zap-C_cEZtR5.js";import"./useInfiniteQuery-PGfyfehP.js";import"./use-infinite-scroll-CFHj-DEA.js";import"./use-connection-08hpR6qS.js";import"./table-D-jgMVGz.js";import"./empty-state-BagbYGYk.js";import"./use-members-I61j4Bg0.js";import"./use-org-auth-client-CfCWX5xw.js";import"./use-automations-EMCvEash.js";import"./useSuspenseInfiniteQuery-CVgzVaXm.js";import"./avatar-CYKYYtZa.js";import"./format-time-BnbuEtat.js";import"./differenceInSeconds-NQ4PDo0z.js";import"./use-copy--NTZaUPq.js";import"./monaco-editor-DBOIld70.js";import"./spinner-Bm_hTWFz.js";import"./types-V8BEN32x.js";import"./shell-layout-DgzMjG_g.js";import"./required-auth-layout-fHFPe37p.js";import"./use-org-sso-CvRPBMtq.js";import"./integration-icon-CqMRHU_a.js";import"./use-navigate-to-agent-BenTIjx1.js";import"./chart-BimnkeiK.js";import"./index-Cxp8u-0t.js";import"./form-DdcrlWMG.js";import"./file-type-icon-BImZ4yGz.js";import"./drawer-IGxCcmhW.js";import"./collection-search-Bn9IJGT5.js";import"./tabs-DDIxVoHb.js";import"./toggle-group-B1ycOPkn.js";import"./super-agent-icon-7Ukfr6bc.js";import"./self-tool-result-BH7zYU5J.js";import"./alert-dialog-DY_67i8D.js";import"./extract-connection-data-DTKuu3uW.js";import"./metadata-dUsYcpuu.js";import"./provision-repo-scoped-github-connection-CMPWtdMv.js";import"./use-debounced-value-BeOljBqX.js";import"./authenticate-and-persist-oauth-14DQJW7S.js";import"./mcp-oauth-JNMVR7nj.js";import"./track-Ti4l0BMG.js";import"./popover-BdLEPYkg.js";import"./toolbar-DrAJ1hMc.js";import"./github-repo-picker-BsNgTNpd.js";import"./use-mcp-tools-BZuie7xe.js";import"./agent-capabilities-B52k7xCe.js";import"./connection-card-DJzzmdJa.js";import"./use-registry-connections-BEAIbWtg.js";import"./retry-CErkP7V6.js";import"./connection-slug-CITJ0kGN.js";import"./connection-form-helpers-COjxkHTU.js";import"./collection-tabs-C_Plt4eY.js";import"./badge-C1elUCLo.js";import"./select-model-WSwYwLFN.js";import"./checkbox-BLQwT4c5.js";import"./ai-providers-logos-DD3qZ33J.js";import"./cards-CiLBDj3F.js";import"./dropdown-menu-trkRQR5u.js";import"./question-004-sINsf4GQ.js";import"./use-status-sounds-DfVtBshF.js";import"./use-file-configs-D5W3ysgO.js";import"./pt-BR-CLy76QW2.js";import"./use-debounced-autosave-CI3PX6ch.js";import"./scroll-area-B__HV5_s.js";import"./search-input-QsS8qM0_.js";import"./use-mcp-auth-status-DeG0R3iT.js";import"./switch-uKoBYqyg.js";import"./use-secrets-gYiFcE--.js";import"./AreaChart-Br4AURer.js";import"./config-CFrJB4k3.js";import"./breadcrumb-BXE_nF_r.js";import"./command-DocuPiQB.js";import"./index-DAs7sx9F.js";import"./get-initials-D-f_fDFw.js";import"./use-tags-C7utoOLS.js";import"./automation-list-row-BsalfBXm.js";import"./site-error--i37Vnuw.js";import"./use-org-repo-syncs-JMXTBQ5z.js";const Q={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"}]},U={authors:"sandbox.recordEditor.titleAuthor"};function Jr(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=J(h);let g;t[4]!==f||t[5]!==a?(g=M(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:$(b,a,l)})},t[7]=b,t[8]=a,t[9]=p,t[10]=k):k=t[10];const[e,S]=H(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=U[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(X,{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=Q[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(q,{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(R,{value:P(e[o.key])||o.options?.[0]?.value,onValueChange:m=>s(o.key,m),children:[r.jsx(V,{id:o.key,className:"h-10 w-full",children:r.jsx(z,{placeholder:i(o.labelKey)})}),r.jsx(O,{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(G,{id:o.key,value:P(e[o.key]),onChange:m=>s(o.key,m.target.value),rows:3}):r.jsx(A,{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{Jr as RecordEditor};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/registry-layout-BEh7PoWm.js","assets/index-BTRn8yLm.js","assets/index-DJSuP9VA.css","assets/Tool02-Um8w3S00.js","assets/CheckCircle-D9s0Miro.js","assets/Settings02-DKqJklo6.js","assets/use-mcp-client-CLbu-qTW.js","assets/constants-dLUUoWH7.js","assets/auth-D8BzOPfU.js","assets/useInfiniteQuery-PGfyfehP.js","assets/use-infinite-scroll-CFHj-DEA.js","assets/badge-C1elUCLo.js","assets/input-B9Q64Q29.js","assets/dropdown-menu-trkRQR5u.js","assets/Check-Dx6Jilyu.js","assets/ChevronRight-BrJIIvGQ.js","assets/DotsVertical-G8Mz1cUi.js","assets/table-D-jgMVGz.js","assets/toggle-group-B1ycOPkn.js","assets/use-view-mode-DanQlbJE.js","assets/FilterLines-BdTkKIdO.js","assets/Globe01-CcwZYK5w.js","assets/SearchMd-WwqLArcb.js","assets/dialog-D9B8YUq0.js","assets/AlertCircle-_dKQYyLm.js","assets/Download01-BXb_GLPB.js","assets/Upload01-lKTwpNsL.js","assets/metadata-dUsYcpuu.js","assets/alert-dialog-DY_67i8D.js","assets/Trash01-D1j2us9_.js","assets/label-BrYhPu77.js","assets/select-DzzbmWa-.js","assets/ChevronDown-C4geT7hd.js","assets/ChevronUp-BkSDpS0a.js","assets/switch-uKoBYqyg.js","assets/textarea-BVnIs1Lw.js","assets/ArrowLeft-CTckNarV.js","assets/XCircle-DWwaGX-T.js","assets/checkbox-BLQwT4c5.js","assets/Eye-opJVAUIw.js","assets/LinkExternal01-Cl9BJIic.js","assets/use-copy--NTZaUPq.js","assets/Copy01-DAXdkrcq.js","assets/Key01-DjAus05D.js","assets/Plus-DplAwTzu.js","assets/mcp-oauth-JNMVR7nj.js","assets/Play-BJig3Hma.js"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{c as i,j as e,r as s,k as a,bp as o}from"./index-BTRn8yLm.js";import{R as n}from"./require-capability-Dgl1K9kd.js";import"./access-gate-Btqq7-3X.js";import"./capability-load-error-BaKYKM-d.js";const c=s.lazy(()=>o(()=>import("./registry-layout-BEh7PoWm.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-BEh7PoWm.js","assets/index-BTRn8yLm.js","assets/index-DJSuP9VA.css","assets/Tool02-Um8w3S00.js","assets/CheckCircle-D9s0Miro.js","assets/Settings02-DKqJklo6.js","assets/use-mcp-client-CLbu-qTW.js","assets/constants-dLUUoWH7.js","assets/auth-D8BzOPfU.js","assets/useInfiniteQuery-PGfyfehP.js","assets/use-infinite-scroll-CFHj-DEA.js","assets/badge-C1elUCLo.js","assets/input-B9Q64Q29.js","assets/dropdown-menu-trkRQR5u.js","assets/Check-Dx6Jilyu.js","assets/ChevronRight-BrJIIvGQ.js","assets/DotsVertical-G8Mz1cUi.js","assets/table-D-jgMVGz.js","assets/toggle-group-B1ycOPkn.js","assets/use-view-mode-DanQlbJE.js","assets/FilterLines-BdTkKIdO.js","assets/Globe01-CcwZYK5w.js","assets/SearchMd-WwqLArcb.js","assets/dialog-D9B8YUq0.js","assets/AlertCircle-_dKQYyLm.js","assets/Download01-BXb_GLPB.js","assets/Upload01-lKTwpNsL.js","assets/metadata-dUsYcpuu.js","assets/alert-dialog-DY_67i8D.js","assets/Trash01-D1j2us9_.js","assets/label-BrYhPu77.js","assets/select-DzzbmWa-.js","assets/ChevronDown-C4geT7hd.js","assets/ChevronUp-BkSDpS0a.js","assets/switch-uKoBYqyg.js","assets/textarea-BVnIs1Lw.js","assets/ArrowLeft-CTckNarV.js","assets/XCircle-DWwaGX-T.js","assets/checkbox-BLQwT4c5.js","assets/Eye-opJVAUIw.js","assets/LinkExternal01-Cl9BJIic.js","assets/use-copy--NTZaUPq.js","assets/Copy01-DAXdkrcq.js","assets/Key01-DjAus05D.js","assets/Plus-DplAwTzu.js","assets/mcp-oauth-JNMVR7nj.js","assets/Play-BJig3Hma.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,bp as p}from"./index-BTRn8yLm.js";import{R as u}from"./require-capability-Dgl1K9kd.js";import"./access-gate-Btqq7-3X.js";import"./capability-load-error-BaKYKM-d.js";const g=l.lazy(()=>p(()=>import("./registry-layout-BEh7PoWm.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 i}from"./use-infinite-scroll-CFHj-DEA.js";import{fi as u}from"./index-BTRn8yLm.js";function t(e,r){return u(e,i,r)}export{t as u};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as s}from"./use-infinite-scroll-CFHj-DEA.js";import{fi as u,b$ as n}from"./index-BTRn8yLm.js";function i(r,e){return u({...r,enabled:!0,suspense:!0,throwOnError:n},s,e)}export{i as u};
|