decocms 4.315.4 → 4.315.5
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-7Jfb87lc.js → AlertCircle-0kvlkfFx.js} +1 -1
- package/dist/client/assets/{AreaChart-C1sLAZXd.js → AreaChart-BSlj4Tpd.js} +1 -1
- package/dist/client/assets/{ArrowLeft-EM4zj0u9.js → ArrowLeft-DRFr88Cg.js} +1 -1
- package/dist/client/assets/{ArrowUp-Bs4KogVd.js → ArrowUp-BS59FoiX.js} +1 -1
- package/dist/client/assets/{Check-Cz5ybwnT.js → Check-Ch7XvbEm.js} +1 -1
- package/dist/client/assets/{CheckCircle-DJ_vu6TS.js → CheckCircle-DE8PvW7I.js} +1 -1
- package/dist/client/assets/{ChevronDown-DmG6zULp.js → ChevronDown-BWMHMaza.js} +1 -1
- package/dist/client/assets/{ChevronRight-BHI6jrPA.js → ChevronRight-DFINNoqY.js} +1 -1
- package/dist/client/assets/{ChevronSelectorVertical-DJZqMqwx.js → ChevronSelectorVertical-Du-nC8hE.js} +1 -1
- package/dist/client/assets/{ChevronUp-C2BOP73m.js → ChevronUp-CFmGarfC.js} +1 -1
- package/dist/client/assets/{Copy01-Mw2tcRv4.js → Copy01-DhQIiRTO.js} +1 -1
- package/dist/client/assets/{CreditCard01-COH_YH1w.js → CreditCard01-LTpxY8_-.js} +1 -1
- package/dist/client/assets/{DotsVertical-kKH_s5Wo.js → DotsVertical-ChDzuVkn.js} +1 -1
- package/dist/client/assets/{Download01-CgFk6OHc.js → Download01-BbcCtTcl.js} +1 -1
- package/dist/client/assets/{ErrorBarContext-DiRr4PKB.js → ErrorBarContext-20kGZrx4.js} +1 -1
- package/dist/client/assets/{Eye-BVBYkmdU.js → Eye-B6H3oVbc.js} +1 -1
- package/dist/client/assets/{FilterLines-BDAQS0Ze.js → FilterLines-dpj5Undx.js} +1 -1
- package/dist/client/assets/{GitBranch01-C9Th2Q_a.js → GitBranch01-ChenOD57.js} +1 -1
- package/dist/client/assets/{Globe01-d7T3SOqP.js → Globe01-Dofx5Paq.js} +1 -1
- package/dist/client/assets/{Globe04-D3Xph4ra.js → Globe04-B6_RhTRi.js} +1 -1
- package/dist/client/assets/{HardDrive-Ca55gnrD.js → HardDrive-DAZAfKoV.js} +1 -1
- package/dist/client/assets/{Image01-BLGmzVM3.js → Image01-CFLL0K9t.js} +1 -1
- package/dist/client/assets/{Key01-CC7hjvGM.js → Key01-DBLWzGQN.js} +1 -1
- package/dist/client/assets/{LinkExternal01-Cze5qR4a.js → LinkExternal01-DDXWhhRM.js} +1 -1
- package/dist/client/assets/{LockUnlocked01-CID2l9j7.js → LockUnlocked01-BbBP1gev.js} +1 -1
- package/dist/client/assets/{LogOut01-B5VcX9N4.js → LogOut01-DxOgJkEs.js} +1 -1
- package/dist/client/assets/{Monitor01-CoHTyl4f.js → Monitor01-DaSgoaIp.js} +1 -1
- package/dist/client/assets/{Package-D9M5sSd5.js → Package-DzhkFPnl.js} +1 -1
- package/dist/client/assets/{Palette-BQC6nVrF.js → Palette-D1LwSC1w.js} +1 -1
- package/dist/client/assets/{Play-B8M4KfmE.js → Play-Bo300jEz.js} +1 -1
- package/dist/client/assets/{Plus-B24lRZxc.js → Plus-BSszbsXb.js} +1 -1
- package/dist/client/assets/{SearchLg-Mnhu45QY.js → SearchLg-W7x8dr9H.js} +1 -1
- package/dist/client/assets/{SearchMd-KpCM7Z0Z.js → SearchMd-CnsYf856.js} +1 -1
- package/dist/client/assets/{Sector-C1SBBn0h.js → Sector-BeZP8KyS.js} +1 -1
- package/dist/client/assets/{Settings02-B7g1M_6v.js → Settings02-D5CL850_.js} +1 -1
- package/dist/client/assets/{Share07-DtJK8ufx.js → Share07-Ctiu33pn.js} +1 -1
- package/dist/client/assets/{Shield01-Cu25ad2D.js → Shield01-s-_aTJlZ.js} +1 -1
- package/dist/client/assets/{Stars01-Wjy3qIwg.js → Stars01-VIQCx_vR.js} +1 -1
- package/dist/client/assets/{Stars02-caOdWGfu.js → Stars02-BJMVV21m.js} +1 -1
- package/dist/client/assets/{Sun-BlHwI0EC.js → Sun-IKywmUoZ.js} +1 -1
- package/dist/client/assets/{SwitchHorizontal01-pa81FDF-.js → SwitchHorizontal01-Cba6ppdy.js} +1 -1
- package/dist/client/assets/{Tool01-CA3QFS5I.js → Tool01-Cl4VKKgc.js} +1 -1
- package/dist/client/assets/{Tool02-Bxu0Q39Z.js → Tool02-B5iH279h.js} +1 -1
- package/dist/client/assets/{Trash01-BA1KGFrn.js → Trash01-BdA9FzsR.js} +1 -1
- package/dist/client/assets/{TrendUp01-CSktU1au.js → TrendUp01-Ca-tztd_.js} +1 -1
- package/dist/client/assets/{Upload01-CPuFr-0W.js → Upload01-Dj3w2jeB.js} +1 -1
- package/dist/client/assets/{User01-C29jlNGJ.js → User01-D9XnXgTj.js} +1 -1
- package/dist/client/assets/{UserSquare-CVIggQYG.js → UserSquare-DF5END3z.js} +1 -1
- package/dist/client/assets/{Users01-BiyOy3ja.js → Users01-CE1oNsN3.js} +1 -1
- package/dist/client/assets/{Users03-Ajuxocqu.js → Users03-DmKWxVtA.js} +1 -1
- package/dist/client/assets/{XCircle-D_dx8RWA.js → XCircle-DpxmUvSo.js} +1 -1
- package/dist/client/assets/{XClose-D5Ftz7WI.js → XClose-BMJK9f-x.js} +1 -1
- package/dist/client/assets/{YAxis-CE9_N-wO.js → YAxis-BjAlr6ta.js} +1 -1
- package/dist/client/assets/{Zap-obMYHz-w.js → Zap-C4zHukNx.js} +1 -1
- package/dist/client/assets/{ZapSquare-GKcY6TuC.js → ZapSquare-DK1cXxdW.js} +1 -1
- package/dist/client/assets/{ZoomOut-CL93SZJl.js → ZoomOut-CCO46vqk.js} +1 -1
- package/dist/client/assets/{access-gate-C1n7ySXH.js → access-gate-DSMDBRxa.js} +1 -1
- package/dist/client/assets/{agent-icon-Dcu6boRt.js → agent-icon-CkeLlYX7.js} +1 -1
- package/dist/client/assets/{agents-list-DvvdWyAU.js → agents-list-pmZPwazB.js} +1 -1
- package/dist/client/assets/{ai-providers-Bu__kYVD.js → ai-providers-NSTni3hF.js} +1 -1
- package/dist/client/assets/{alert-CJbWcmXa.js → alert-B0HjmAaP.js} +1 -1
- package/dist/client/assets/{alert-dialog-B_y9mxr6.js → alert-dialog-jXbLmp2B.js} +1 -1
- package/dist/client/assets/{analytics-tab-BJzq4raf.js → analytics-tab-pl6ZXZ8X.js} +1 -1
- package/dist/client/assets/{api-keys-BXTzQ04d.js → api-keys-B7df8xXw.js} +1 -1
- package/dist/client/assets/{app-editor-DPooFBgO.js → app-editor-DIh55X3x.js} +1 -1
- package/dist/client/assets/{auth-_eL4FNDp.js → auth-SUyXVZor.js} +1 -1
- package/dist/client/assets/{auth-catchall-DofvsW2e.js → auth-catchall-G5LPLbxi.js} +1 -1
- package/dist/client/assets/{auth-entry-CjBSzrMz.js → auth-entry-DqDFMdNn.js} +1 -1
- package/dist/client/assets/{auth-split-layout-CyrA5MSZ.js → auth-split-layout-B_NI6s0f.js} +1 -1
- package/dist/client/assets/{authenticate-and-persist-oauth-BqbqcU-f.js → authenticate-and-persist-oauth-ocLo76z1.js} +1 -1
- package/dist/client/assets/{automation-list-row-Bn1B3NZm.js → automation-list-row-Cu9d1NjX.js} +1 -1
- package/dist/client/assets/{automation-runs-iKbYnC2z.js → automation-runs-B0KgalzZ.js} +1 -1
- package/dist/client/assets/{automations-CIpBZU5u.js → automations-DQacmBs_.js} +1 -1
- package/dist/client/assets/{avatar-DJGPiSGk.js → avatar-XKNenDYs.js} +1 -1
- package/dist/client/assets/{badge-FNf4N78c.js → badge-Dz9RbCLy.js} +1 -1
- package/dist/client/assets/{block-document-RnSD0v2h.js → block-document-DQUm025G.js} +1 -1
- package/dist/client/assets/{breadcrumb-dDWXdAhp.js → breadcrumb-B4ee1MxP.js} +1 -1
- package/dist/client/assets/{buckets-BdZc6HtM.js → buckets-6ERCHYip.js} +1 -1
- package/dist/client/assets/{bulk-category-panel-BPAw_4cy.js → bulk-category-panel-C_NYtwxi.js} +1 -1
- package/dist/client/assets/{capability-load-error-B8w2D3ED.js → capability-load-error-BWcJfHPr.js} +1 -1
- package/dist/client/assets/{cards-C-Lncjt9.js → cards-D1Haz93Y.js} +1 -1
- package/dist/client/assets/{category-editor-OztyovL1.js → category-editor-DOl2TmEF.js} +1 -1
- package/dist/client/assets/{cdn-tab-BdIM4o-W.js → cdn-tab-BZiO121v.js} +1 -1
- package/dist/client/assets/{chart-Ig3GAKUQ.js → chart-BGtpxuGL.js} +1 -1
- package/dist/client/assets/{chat-context-xbYSNi_3.js → chat-context-eXX2O3YQ.js} +1 -1
- package/dist/client/assets/{checkbox-CAyO22l9.js → checkbox-B4XEZKGb.js} +1 -1
- package/dist/client/assets/{choose-editor-O-bqGSzC.js → choose-editor-BOzmT2sJ.js} +1 -1
- package/dist/client/assets/{cli-auth-success-Bo34cwhK.js → cli-auth-success-BuKVmYZf.js} +1 -1
- package/dist/client/assets/{collection-detail-DxhCae9r.js → collection-detail-BCxUMUMy.js} +1 -1
- package/dist/client/assets/{collection-display-button-DA-Zh8hj.js → collection-display-button-ei2mw0F7.js} +1 -1
- package/dist/client/assets/{collection-search-D_VwAWxj.js → collection-search-Gb8MX7j3.js} +1 -1
- package/dist/client/assets/{collection-table-wrapper-DQGP2Mv5.js → collection-table-wrapper-CDKn998y.js} +1 -1
- package/dist/client/assets/{collection-tabs-CvMUP4bT.js → collection-tabs-ByiHDh-E.js} +1 -1
- package/dist/client/assets/{command-Be_clIy4.js → command-k6-sfHjz.js} +1 -1
- package/dist/client/assets/{commerce-onboarding-1dv7bVG_.js → commerce-onboarding-UyzHr_Lz.js} +1 -1
- package/dist/client/assets/{config-DqWBELpm.js → config-juraaSPp.js} +1 -1
- package/dist/client/assets/{connect-ptIhlJlv.js → connect-BDML8E0G.js} +1 -1
- package/dist/client/assets/{connection-2_STER8f.js → connection-D40ktz0U.js} +1 -1
- package/dist/client/assets/{connection-card-J_hULuQX.js → connection-card-C9XtLvJS.js} +1 -1
- package/dist/client/assets/{connection-detail-B32fhI9D.js → connection-detail-CeNH83R_.js} +1 -1
- package/dist/client/assets/{connection-form-helpers-B6CUn5J5.js → connection-form-helpers-lLiiA-xt.js} +1 -1
- package/dist/client/assets/{connections-Bfv2C5uj.js → connections-BkjQqVKz.js} +1 -1
- package/dist/client/assets/{decopilot-sse-pool-phOh4Fuo.js → decopilot-sse-pool-5bBrcisx.js} +1 -1
- package/dist/client/assets/{dialog-B1pjsupg.js → dialog-DeLwCAN9.js} +1 -1
- package/dist/client/assets/{domain-settings-C0hGDE4n.js → domain-settings-C8Kmz1_K.js} +1 -1
- package/dist/client/assets/{drawer-DRc2rDn1.js → drawer-DW79zEFo.js} +1 -1
- package/dist/client/assets/{dropdown-menu-CJclM21S.js → dropdown-menu-CTj_WvYk.js} +1 -1
- package/dist/client/assets/{e2e-tab-D69FwysF.js → e2e-tab-DHWKNanx.js} +1 -1
- package/dist/client/assets/{editor-C2Cn2kXB.js → editor-BaeTQ9Cx.js} +1 -1
- package/dist/client/assets/{empty-state-BRUHot0l.js → empty-state-6u7hnPWa.js} +1 -1
- package/dist/client/assets/{empty-state-B6Or8qk8.js → empty-state-CG7GQM3Q.js} +1 -1
- package/dist/client/assets/{extract-connection-data-83EFFT3M.js → extract-connection-data-C9AC5u4x.js} +1 -1
- package/dist/client/assets/{file-explorer-COPmfjri.js → file-explorer-BcAdonVr.js} +1 -1
- package/dist/client/assets/{file-type-icon-BrcAuj9x.js → file-type-icon-7fUe3Hc5.js} +1 -1
- package/dist/client/assets/{folder-icon-CdZvsRaJ.js → folder-icon-CVqxLSMV.js} +1 -1
- package/dist/client/assets/{form-DBAQC4zc.js → form-b33ETHGN.js} +1 -1
- package/dist/client/assets/{general-DkTYAYjm.js → general-DdcwBPo2.js} +1 -1
- package/dist/client/assets/{github-repo-picker-B55LyloW.js → github-repo-picker-CVloahOs.js} +1 -1
- package/dist/client/assets/{hooks-B-EEIXAf.js → hooks-Be-CFm5-.js} +1 -1
- package/dist/client/assets/{hosting-tab-WShN8RhE.js → hosting-tab-C7UuuvFe.js} +1 -1
- package/dist/client/assets/{index-DPBVnFEP.js → index-B7kVxTaJ.js} +1 -1
- package/dist/client/assets/{index-DyX4u9kr.js → index-BY4DX7zi.js} +1 -1
- package/dist/client/assets/{index-D7S86jgm.js → index-D8JufLNG.js} +1 -1
- package/dist/client/assets/{index-CwjVo5ln.js → index-DhVodCLv.js} +1 -1
- package/dist/client/assets/{index-C85mRaev.js → index-Dt97KCtB.js} +3 -3
- package/dist/client/assets/{index-C-FMwKHC.js → index-JJP8_j9N.js} +1 -1
- package/dist/client/assets/{index-CXYmjOV8.js → index-fDxngA4J.js} +1 -1
- package/dist/client/assets/{index-CW0JewdN.js → index-k8OfmDQh.js} +6 -6
- package/dist/client/assets/{index-C8MEgXrM.js → index-pryGXDLQ.js} +1 -1
- package/dist/client/assets/{index-redirect-BPDweonN.js → index-redirect-DcK3aGrA.js} +1 -1
- package/dist/client/assets/{infra-billing-DGOYyKxq.js → infra-billing-X3msywRV.js} +1 -1
- package/dist/client/assets/{input-C921jB-R.js → input-CegAOKR8.js} +1 -1
- package/dist/client/assets/{integration-icon-CVN20U0t.js → integration-icon-BzlzLNrd.js} +1 -1
- package/dist/client/assets/{invite-member-dialog-BrJaKqJA.js → invite-member-dialog-DcihDeUr.js} +1 -1
- package/dist/client/assets/{label-CSpYDeu9.js → label-enBPY1ej.js} +1 -1
- package/dist/client/assets/{layout-DNAQuYwH.js → layout-CxKGbWg7.js} +1 -1
- package/dist/client/assets/{login-0xBUANYq.js → login-DG_7yycB.js} +1 -1
- package/dist/client/assets/{markdown-DxVpUYjU.js → markdown-B1en8SpU.js} +1 -1
- package/dist/client/assets/{mcp-oauth-mZo0K9o1.js → mcp-oauth-BAjD9a60.js} +1 -1
- package/dist/client/assets/{members-DrlBPA7T.js → members-E3pbVP-T.js} +1 -1
- package/dist/client/assets/{monaco-editor--3LPxlij.js → monaco-editor-DLdPcTaL.js} +1 -1
- package/dist/client/assets/{monitoring-stats-row-D18-RVfx.js → monitoring-stats-row-BZBho4cf.js} +1 -1
- package/dist/client/assets/{multi-select-V5FuVxbx.js → multi-select-fYcYHcW6.js} +1 -1
- package/dist/client/assets/{oauth-callback-DPioWlJl.js → oauth-callback-TzN6NTMM.js} +1 -1
- package/dist/client/assets/{oauth-callback-ai-provider-DOxgqN2R.js → oauth-callback-ai-provider-DmJIoG7W.js} +1 -1
- package/dist/client/assets/{onboarding-CmxIaE_d.js → onboarding-CtAOcj2-.js} +1 -1
- package/dist/client/assets/{org-layout-De-pp7RZ.js → org-layout-Bp_j0RhZ.js} +1 -1
- package/dist/client/assets/{organization-choice-DzghAjlq.js → organization-choice-V3IKTHLn.js} +1 -1
- package/dist/client/assets/{orgs-DsDyFGBw.js → orgs-BprZ89YY.js} +1 -1
- package/dist/client/assets/{page-seo-form-CnEvCtdx.js → page-seo-form-CGHCwbPx.js} +1 -1
- package/dist/client/assets/{popover-BUhZahPt.js → popover-BEuSVE6K.js} +1 -1
- package/dist/client/assets/{post-calendar-C05ySBZ-.js → post-calendar-BuoTJVcA.js} +1 -1
- package/dist/client/assets/{post-editor-BFluTi45.js → post-editor-BykO0K4S.js} +1 -1
- package/dist/client/assets/{primitives-43WR_EHn.js → primitives-CyFX3vg2.js} +1 -1
- package/dist/client/assets/{profile-DeT1EJ1n.js → profile-W4CJDEZk.js} +1 -1
- package/dist/client/assets/{project-app-view-yvQqxnyg.js → project-app-view-CaLP-fVC.js} +1 -1
- package/dist/client/assets/{prompts-Ol5f9fi3.js → prompts-BYAXW4dv.js} +1 -1
- package/dist/client/assets/record-editor-CFfQR78W.js +1 -0
- package/dist/client/assets/{redirect-editor-B1KpSKPQ.js → redirect-editor-BZPeVZfW.js} +1 -1
- package/dist/client/assets/registry-CeEvWKx-.js +2 -0
- package/dist/client/assets/{registry-layout-vr322moB.js → registry-layout-CQ2r98YY.js} +1 -1
- package/dist/client/assets/{reports-CBbTaXPQ.js → reports-BfO99pUy.js} +1 -1
- package/dist/client/assets/{require-capability-BkAaQJsB.js → require-capability-DltUqOlT.js} +1 -1
- package/dist/client/assets/{required-auth-layout-DXj6tn89.js → required-auth-layout-dj7Sr9jK.js} +1 -1
- package/dist/client/assets/{reset-password-DURHhIQj.js → reset-password-BxsDxiir.js} +1 -1
- package/dist/client/assets/{review-settings-vBMKD5M4.js → review-settings-Q1GhK1bz.js} +1 -1
- package/dist/client/assets/{roles-kjTc_NGd.js → roles-DFHNW9N1.js} +1 -1
- package/dist/client/assets/{scroll-area-D0y4hwjA.js → scroll-area-UcdHV1M6.js} +1 -1
- package/dist/client/assets/{search-input-CFrUhhrq.js → search-input-eEuhK0-_.js} +1 -1
- package/dist/client/assets/{secrets-BjNuvY7w.js → secrets-BKpiM5PG.js} +1 -1
- package/dist/client/assets/{sections-editor-CBldR4J4.js → sections-editor-BuGtXS5e.js} +1 -1
- package/dist/client/assets/{select-CG4I2e-D.js → select-cyA58mtf.js} +1 -1
- package/dist/client/assets/{select-model-Dij62Rk7.js → select-model-ZlQSi8c6.js} +1 -1
- package/dist/client/assets/{self-tool-result-Bb2kcBne.js → self-tool-result-D5x8yEMk.js} +1 -1
- package/dist/client/assets/{seo-editor-09I6yof4.js → seo-editor-BTasfWI2.js} +1 -1
- package/dist/client/assets/{settings-layout-CjarVkLa.js → settings-layout-gT5FF-1o.js} +1 -1
- package/dist/client/assets/{shell-controls-Gj2SpLsW.js → shell-controls-eY-orWrT.js} +1 -1
- package/dist/client/assets/{shell-layout-C1CGo2l8.js → shell-layout-DdsxhB21.js} +1 -1
- package/dist/client/assets/{skill-preview-BSStPPvx.js → skill-preview-B_p0GXRI.js} +1 -1
- package/dist/client/assets/{skills-Bl1CIUba.js → skills-BV7KHt99.js} +1 -1
- package/dist/client/assets/{spinner-DALVMbY4.js → spinner-Dwy_Zqc5.js} +1 -1
- package/dist/client/assets/{sso-DNeZ7Mkv.js → sso-DWUCNQzR.js} +1 -1
- package/dist/client/assets/{store-D2YykQ-o.js → store-CFmmvGoK.js} +1 -1
- package/dist/client/assets/store-registry-3YjQgmjp.js +2 -0
- package/dist/client/assets/{super-agent-icon-Dbm8DAE2.js → super-agent-icon-CPBxj4cS.js} +1 -1
- package/dist/client/assets/{switch-C2zrqqfi.js → switch-lEhetph2.js} +1 -1
- package/dist/client/assets/{synced-repos-DOQF9pMb.js → synced-repos-BY0no6Oe.js} +1 -1
- package/dist/client/assets/{table-CgCqMjxl.js → table-DgMyThWh.js} +1 -1
- package/dist/client/assets/{tabs-Dql2cBut.js → tabs-B3inpX0e.js} +1 -1
- package/dist/client/assets/{task-board-KyWxDa5P.js → task-board-BNSf6B_V.js} +1 -1
- package/dist/client/assets/{tasks-CnffigHM.js → tasks-A3Jqf6LD.js} +1 -1
- package/dist/client/assets/{textarea-CfnnJopH.js → textarea-CMiD_PCJ.js} +1 -1
- package/dist/client/assets/{thread-route-BGWJ9_UQ.js → thread-route-C5SpE5fT.js} +1 -1
- package/dist/client/assets/{toggle-group-BGpECXHA.js → toggle-group-ByTex3TH.js} +1 -1
- package/dist/client/assets/{toolbar-BqmHbaOK.js → toolbar-DmQiprwC.js} +1 -1
- package/dist/client/assets/{track-B4d6DVsU.js → track-DRaMWWRf.js} +1 -1
- package/dist/client/assets/{types-BoigVi8v.js → types-DHkWYJ8m.js} +1 -1
- package/dist/client/assets/{use-ai-providers-Qpy-Bq2R.js → use-ai-providers-BJ5qe7Pv.js} +1 -1
- package/dist/client/assets/{use-api-keys-ClxPbAOk.js → use-api-keys-hgYmpoAV.js} +1 -1
- package/dist/client/assets/{use-automations-dsacQ6MD.js → use-automations-ClKJ7btN.js} +1 -1
- package/dist/client/assets/{use-autosave-CLeNL7gP.js → use-autosave-BrNC97Uy.js} +1 -1
- package/dist/client/assets/{use-connection-BK9JheSY.js → use-connection-BeKx2T7i.js} +1 -1
- package/dist/client/assets/{use-copy-DLEZPBoe.js → use-copy-DACyHVcs.js} +1 -1
- package/dist/client/assets/{use-create-virtual-mcp-CR6zJrPM.js → use-create-virtual-mcp-UmX4_LCB.js} +1 -1
- package/dist/client/assets/{use-debounced-autosave-DEbH8gX8.js → use-debounced-autosave-1-7xGDRl.js} +1 -1
- package/dist/client/assets/{use-debounced-value-CiT_ysgR.js → use-debounced-value-BzAasRvN.js} +1 -1
- package/dist/client/assets/{use-decopilot-events-CXVverhx.js → use-decopilot-events-Bthd3dN4.js} +1 -1
- package/dist/client/assets/{use-delete-connection--w1qBsgP.js → use-delete-connection-BEGhsrHv.js} +1 -1
- package/dist/client/assets/{use-deployment-admin-BmHOmvXX.js → use-deployment-admin-COw9Bhp-.js} +1 -1
- package/dist/client/assets/{use-destination-route-BV_FeLjZ.js → use-destination-route-BC2bG0WM.js} +1 -1
- package/dist/client/assets/{use-file-configs-COQ1BOO9.js → use-file-configs-BXvZdWv2.js} +1 -1
- package/dist/client/assets/{use-infinite-scroll-DZorp9X1.js → use-infinite-scroll-C3GNOON0.js} +1 -1
- package/dist/client/assets/{use-join-requests-ByTiyPIW.js → use-join-requests-DF5XUx4n.js} +1 -1
- package/dist/client/assets/{use-mcp-auth-status-CsdIlgxV.js → use-mcp-auth-status-D9dzKzXy.js} +1 -1
- package/dist/client/assets/{use-mcp-client-DAR9aeVq.js → use-mcp-client-D7aqLPqI.js} +1 -1
- package/dist/client/assets/{use-mcp-tools-T8f93HI-.js → use-mcp-tools-B16RGFt8.js} +1 -1
- package/dist/client/assets/{use-members-BBU0jIOq.js → use-members-H7rntGx_.js} +1 -1
- package/dist/client/assets/{use-navigate-to-agent-DrF0KM7M.js → use-navigate-to-agent-D0UCsG7p.js} +1 -1
- package/dist/client/assets/{use-org-auth-client-BSfHsFnJ.js → use-org-auth-client-CXEG_7CR.js} +1 -1
- package/dist/client/assets/{use-org-repo-syncs-DCsPsp1A.js → use-org-repo-syncs-BXobd9-k.js} +1 -1
- package/dist/client/assets/{use-org-sso-ClvPNH1c.js → use-org-sso-DgljvHre.js} +1 -1
- package/dist/client/assets/{use-organization-roles-BXrHn0D1.js → use-organization-roles-Cf8ftdV8.js} +1 -1
- package/dist/client/assets/{use-organization-settings-DNwts9XE.js → use-organization-settings-DLo4IX5v.js} +1 -1
- package/dist/client/assets/{use-panel-navigate-3KZFrva-.js → use-panel-navigate-BLxyLVOQ.js} +1 -1
- package/dist/client/assets/{use-registry-connections-DpTFIu2O.js → use-registry-connections-BLaO7y5N.js} +1 -1
- package/dist/client/assets/{use-secrets-DvcCy_qi.js → use-secrets-BoqRX8zf.js} +1 -1
- package/dist/client/assets/{use-section-preview-base-Cp9dpuj4.js → use-section-preview-base-DL4C5n5v.js} +1 -1
- package/dist/client/assets/{use-status-sounds-Bav4GQTG.js → use-status-sounds-CBm7LvpG.js} +1 -1
- package/dist/client/assets/{use-tags-BcqzIQy0.js → use-tags-B6zTsEab.js} +1 -1
- package/dist/client/assets/{use-view-mode-C8vXj2KI.js → use-view-mode-DGrSD9P9.js} +1 -1
- package/dist/client/assets/{use-virtual-mcp-DCiMUiab.js → use-virtual-mcp-BKQVw1xM.js} +1 -1
- package/dist/client/assets/useInfiniteQuery-BJ2ttwqe.js +1 -0
- package/dist/client/assets/useSuspenseInfiniteQuery-YvM02gxI.js +1 -0
- package/dist/client/assets/{users-CjQOs8yu.js → users-B1Qtblcf.js} +1 -1
- package/dist/client/assets/{variant-calendar-DdtKbNFN.js → variant-calendar-DBOoTWLt.js} +1 -1
- package/dist/client/assets/{view-mode-toggle-D_VAAngm.js → view-mode-toggle-NKPL-pS9.js} +1 -1
- package/dist/client/index.html +1 -1
- package/dist/server/cli.js +3 -3
- package/dist/server/server.js +3 -3
- package/package.json +1 -1
- package/dist/client/assets/record-editor-DdwK5XR9.js +0 -1
- package/dist/client/assets/registry-gVecRAJT.js +0 -2
- package/dist/client/assets/store-registry-DegGusYU.js +0 -2
- package/dist/client/assets/useInfiniteQuery-CRtjOs4e.js +0 -1
- package/dist/client/assets/useSuspenseInfiniteQuery-BC2HW6hb.js +0 -1
package/dist/server/server.js
CHANGED
|
@@ -1317,7 +1317,7 @@ Guidelines:
|
|
|
1317
1317
|
select coalesce(max(key_seq), 0) + 1
|
|
1318
1318
|
from task_board_items
|
|
1319
1319
|
where organization_id = ${$.organizationId}
|
|
1320
|
-
)`,created_by:$.by,created_at:X,updated_by:$.by,updated_at:X}).returningAll().executeTakeFirstOrThrow(),G=await this.inTransaction(async(J)=>{return await JD`select pg_advisory_xact_lock(hashtext(${`task-board-key-seq:${$.organizationId}`})::bigint)`.execute(J),Y(J)});return this.itemFromDbRow(G)}async update($,Z,X,Q){let Y=await this.db.updateTable("task_board_items").set({...X.title!==void 0?{title:X.title}:{},...X.description!==void 0?{description:X.description}:{},...X.status!==void 0?{status:X.status}:{},...X.priority!==void 0?{priority:X.priority}:{},...X.type!==void 0?{type:X.type}:{},...X.assigneeId!==void 0?{assignee_id:X.assigneeId}:{},...X.assignedBy!==void 0?{assigned_by:X.assignedBy}:{},...X.repo!==void 0?{repo:X.repo}:{},...X.dueDate!==void 0?{due_date:X.dueDate}:{},...X.sprintId!==void 0?{sprint_id:X.sprintId}:{},...X.externalUrl!==void 0?{external_url:X.externalUrl}:{},...X.boardColumnOrg!==void 0?{board_column_org:X.boardColumnOrg}:{},...X.sortOrder!==void 0?{sort_order:X.sortOrder}:{},...X.status!==void 0&&!xB4.has(X.status)?{review_cycle_started_at:null}:{},updated_by:Q,updated_at:new Date().toISOString()}).where("id","=",$).where("organization_id","=",Z).returningAll().executeTakeFirstOrThrow(),G=this.itemFromDbRow(Y);return await this.attachRefs([G],Z),G}async delete($,Z,X){return this.inTransaction(async(Q)=>{let Y=await Q.selectFrom("task_board_items").select(["created_by"]).where("id","=",$).where("organization_id","=",Z).executeTakeFirst();if(!Y)return!1;if(uQ({createdBy:Y.created_by}))return await Q.updateTable("task_board_items").set({dismissed_at:new Date().toISOString(),updated_by:X}).where("id","=",$).where("organization_id","=",Z).where("dismissed_at","is",null).execute(),!0;return await Q.deleteFrom("task_board_item_threads").where("task_board_item_id","=",$).where("organization_id","=",Z).execute(),await Q.deleteFrom("task_board_item_prs").where("task_board_item_id","=",$).where("organization_id","=",Z).execute(),await Q.deleteFrom("task_board_items").where("id","=",$).where("organization_id","=",Z).execute(),!0})}async dismissedFindingKeys($,Z){if(Z.length===0)return new Set;let X=await this.db.selectFrom("task_board_items").select(["external_key"]).where("organization_id","=",$).where("external_key","in",Z).where("dismissed_at","is not",null).execute();return new Set(X.flatMap((Q)=>Q.external_key??[]))}async listDismissedFindings($){return(await this.db.selectFrom("task_board_items").select(["external_key","updated_by","dismissed_at"]).where("organization_id","=",$).where("dismissed_at","is not",null).orderBy("dismissed_at","desc").execute()).flatMap((X)=>X.external_key&&X.dismissed_at?[{externalKey:X.external_key,dismissedBy:X.updated_by,dismissedAt:X.dismissed_at instanceof Date?X.dismissed_at.toISOString():X.dismissed_at}]:[])}async restoreDismissedFindings($,Z){if(Z&&Z.length===0)return 0;let X=this.db.updateTable("task_board_items").set({dismissed_at:null}).where("organization_id","=",$).where("dismissed_at","is not",null);if(Z)X=X.where("external_key","in",Z);let Q=await X.executeTakeFirst();return Number(Q.numUpdatedRows??0n)}async setItemTags($,Z,X){await this.inTransaction(async(Q)=>{if(await Q.deleteFrom("task_board_item_tags").where("task_board_item_id","=",$).$if(Z.length>0,(Y)=>Y.where("id","not in",Z)).execute(),Z.length>0)await Q.insertInto("task_board_item_tags").values(Z.map((Y)=>({task_board_item_id:$,id:Y,created_by:X,created_at:new Date().toISOString()}))).onConflict((Y)=>Y.doNothing()).execute()})}async addItemTags($,Z,X){if(Z.length===0)return;await this.db.insertInto("task_board_item_tags").values(Z.map((Q)=>({task_board_item_id:$,id:Q,created_by:X,created_at:new Date().toISOString()}))).onConflict((Q)=>Q.doNothing()).execute()}async linkThread($,Z,X){await this.db.insertInto("task_board_item_threads").values({task_board_item_id:$,thread_id:Z,organization_id:X}).onConflict((Q)=>Q.columns(["task_board_item_id","thread_id"]).doNothing()).execute()}async listItemsPendingReview($,Z,X){let Q=this.db.selectFrom("task_board_items").select(["id","organization_id as organizationId","updated_at"]).where((G)=>G.or([G("review_cycle_started_at","is not",null),G("status","=","in_review"),G("status","in",G.selectFrom("task_board_columns as c").select("c.key").whereRef("c.organization_id","=","task_board_items.organization_id").where("c.role","=","in_review"))])).where("dismissed_at","is",null);if(X)Q=Q.where((G)=>G.or([G("last_swept_at","is",null),G("last_swept_at","<",X)]));if(Z){let G=new Date(Z.updatedAt);Q=Q.where((J)=>J.or([J("updated_at",">",G),J.and([J("updated_at","=",G),J("id",">",Z.id)])]))}return(await Q.orderBy("updated_at","asc").orderBy("id","asc").limit($).execute()).map((G)=>({id:G.id,organizationId:G.organizationId,updatedAt:G.updated_at instanceof Date?G.updated_at.toISOString():String(G.updated_at)}))}async listItemsAwaitingArchive($,Z){return(await this.db.selectFrom("task_board_items as i").select(["i.id","i.organization_id as organizationId"]).where("i.status","=","done").where("i.dismissed_at","is",null).where("i.updated_at","<",$).where((Q)=>Q.exists(Q.selectFrom("task_board_item_prs as p").select("p.url").whereRef("p.task_board_item_id","=","i.id"))).orderBy("i.updated_at","asc").limit(Z).execute()).map((Q)=>({id:Q.id,organizationId:Q.organizationId}))}async listItemsAwaitingMergedTag($,Z){return(await this.db.selectFrom("task_board_items as i").select(["i.id","i.organization_id as organizationId"]).where("i.status","in",uB4).where("i.dismissed_at","is",null).where((Q)=>Q.exists(Q.selectFrom("task_board_item_prs as p").select("p.url").whereRef("p.task_board_item_id","=","i.id"))).where((Q)=>Q.not(Q.exists(Q.selectFrom("task_board_item_tags as t").innerJoin("organization_tags as g","g.id","t.id").select("t.id").whereRef("t.task_board_item_id","=","i.id").where(JD`lower(g.name)`,"=",$)))).orderBy("i.updated_at","desc").limit(Z).execute()).map((Q)=>({id:Q.id,organizationId:Q.organizationId}))}async claimSweep($,Z,X){let Q=await this.db.updateTable("task_board_items").set({last_swept_at:new Date}).where("id","=",$).where("organization_id","=",Z).where((Y)=>Y.or([Y("last_swept_at","is",null),Y("last_swept_at","<",X)])).executeTakeFirst();return Number(Q.numUpdatedRows??0)>0}async failedRunInfo($,Z){let X=await this.db.selectFrom("threads as t").leftJoinLateral((Q)=>Q.selectFrom("thread_message_parts as p").select("p.payload").whereRef("p.thread_id","=","t.id").where("p.kind","=","error").orderBy("p.created_at","desc").limit(1).as("err"),(Q)=>Q.onTrue()).select(["t.status","t.failure_kind as kind","err.payload as payload"]).where("t.id","=",$).where("t.organization_id","=",Z).executeTakeFirst();if(!X||X.status!=="failed")return null;return{kind:X.kind??null,errorText:YH$(X.payload)}}async scheduleRunRetry($,Z,X,Q,Y){if(Y===null)return!1;return(await this.db.updateTable("task_board_items").set({retry_at:Q,retry_attempts:X}).where("id","=",$).where("organization_id","=",Z).where("status","=",Y).where("dismissed_at","is",null).returning("id").execute()).length>0}async returnToTodoAfterFailure($,Z,X,Q){if(Q.progress===null||Q.queue===null)return null;if((await this.db.updateTable("task_board_items").set({status:Q.queue,retry_at:null,retry_attempts:0,updated_by:X,updated_at:new Date}).where("id","=",$).where("organization_id","=",Z).where("status","=",Q.progress).where("dismissed_at","is",null).returning("id").execute()).length===0)return null;return await this.getById($,Z)}async failNeverStartedLinkedThreads($,Z,X){let Q=await this.db.selectFrom("threads as t").innerJoin("task_board_item_threads as l","l.thread_id","t.id").select(["t.id as threadId","l.task_board_item_id as itemId","l.organization_id as organizationId"]).where("t.status","=","in_progress").where("t.run_started_at","is",null).where((W)=>W.and([W("t.updated_at","<",Z),W.or([W("t.last_progress_at","is",null),W("t.last_progress_at","<",Z)])])).limit($).execute();if(Q.length===0)return[];let Y=Q.map((W)=>W.threadId),G=await this.db.updateTable("threads").set({status:"failed",failure_reason:X,failure_kind:"abandoned",run_owner_pod:null,run_config:null,run_started_at:null,updated_at:new Date().toISOString()}).where("id","in",Y).where("status","=","in_progress").returning("id").execute(),J=new Set(G.map((W)=>W.id));return Q.filter((W)=>J.has(W.threadId))}async relabelDeliveredFailure($,Z,X){return(await this.db.updateTable("threads").set({failure_reason:X,failure_kind:"ended_after_delivery",updated_at:new Date().toISOString()}).where("id","=",$).where("organization_id","=",Z).where("status","=","failed").where((Y)=>Y.or([Y("failure_kind","is",null),Y("failure_kind","not in",["cancelled",...Lt])])).returning("id").execute()).length>0}async supersedeFailedThreads($,Z){return(await this.db.updateTable("threads").set({failure_kind:"superseded",updated_at:new Date().toISOString()}).where("organization_id","=",Z).where("status","=","failed").where("failure_kind","is distinct from","cancelled").where((Q)=>Q("id","in",Q.selectFrom("task_board_item_threads").select("thread_id").where("task_board_item_id","=",$).where("organization_id","=",Z))).returning("id").execute()).length}async listItemsStuckAfterFailure($,Z){let X=await this.db.selectFrom("task_board_items as i").innerJoin("task_board_item_threads as l","l.task_board_item_id","i.id").innerJoin("threads as t","t.id","l.thread_id").select(["i.id as id","i.organization_id as organizationId","t.id as threadId"]).where("i.status","=","in_progress").where("i.assignee_id","=",Y8).where("i.dismissed_at","is",null).where("i.retry_at","is",null).where("t.status","=","failed").where((Y)=>Y.or([Y("t.failure_kind","is",null),Y("t.failure_kind","not in",[...Lt])])).where("t.updated_at","<",Z).where((Y)=>Y.not(Y.exists(Y.selectFrom("task_board_item_threads as l2").innerJoin("threads as t2","t2.id","l2.thread_id").select("t2.id").whereRef("l2.task_board_item_id","=","i.id").where("t2.status","in",["in_progress","requires_action"])))).orderBy("t.updated_at","desc").limit($).execute(),Q=new Set;return X.filter((Y)=>!Q.has(Y.id)&&Q.add(Y.id))}async listItemsDueForRetry($,Z){return await this.db.selectFrom("task_board_items").select(["id","organization_id as organizationId","retry_attempts as attempts"]).where("retry_at","is not",null).where("retry_at","<=",Z).where("status","=","in_progress").where("dismissed_at","is",null).orderBy("retry_at","asc").limit($).execute()}async claimDueRetry($,Z,X){return(await this.db.updateTable("task_board_items").set({retry_at:null}).where("id","=",$).where("organization_id","=",Z).where("retry_at","is not",null).where("retry_at","<=",X).returning("id").execute()).length>0}async clearRunRetry($,Z){await this.db.updateTable("task_board_items").set({retry_at:null,retry_attempts:0}).where("id","=",$).where("organization_id","=",Z).execute()}async clearSweepBudget($,Z){await this.db.updateTable("task_board_items").set({last_swept_at:null}).where("id","=",$).where("organization_id","=",Z).execute()}async linkedTaskIds($,Z){return(await this.db.selectFrom("task_board_item_threads").select("task_board_item_id as taskId").where("thread_id","=",$).where("organization_id","=",Z).execute()).map((Q)=>Q.taskId)}async linkPr($){await this.db.insertInto("task_board_item_prs").values({task_board_item_id:$.taskBoardItemId,organization_id:$.organizationId,url:$.url,pr_number:$.prNumber,repo_owner:$.repoOwner,repo_name:$.repoName,connection_id:$.connectionId??null}).onConflict((Z)=>Z.columns(["task_board_item_id","url"]).doNothing()).execute()}async listPrs($,Z){return(await this.db.selectFrom("task_board_item_prs").select(["url","pr_number as prNumber","repo_owner as repoOwner","repo_name as repoName","connection_id as connectionId","created_at as createdAt"]).where("task_board_item_id","=",$).where("organization_id","=",Z).orderBy("created_at","desc").execute()).map((Q)=>({url:Q.url,number:Q.prNumber,repoOwner:Q.repoOwner,repoName:Q.repoName,connectionId:Q.connectionId??null,createdAt:Q.createdAt instanceof Date?Q.createdAt.toISOString():Q.createdAt}))}async advanceLinkedTasksToReviewOnThreadFinish($,Z,X){let Q=[];for(let Y of await this.linkedTaskIds($,Z)){let G=await this.getById(Y,Z);if(!G)continue;let J=(await this.listPrs(Y,Z)).length>0;if(!Do0(G,J))continue;if(G.reviewCycleStartedAt)continue;if(J){let K=await this.openReviewCycleIfInProgress(Y,Z,X);if(!K)continue;Q.push(K);continue}let W=await this.advanceToReviewIfInProgress(Y,Z,G.updatedBy);if(!W)continue;Q.push(W),await this.recordActivity({taskBoardItemId:Y,action:"status_changed",actorId:null,data:{from:G.status,to:"in_review"}}).catch((K)=>console.error("[task-board] in_review activity write failed",K))}return Q}async openReviewCycleIfInProgress($,Z,X){if(X.progress===null)return null;let Q=X.review,Y=await this.db.updateTable("task_board_items").set({review_cycle_started_at:new Date,status:X.progress}).where("id","=",$).where("organization_id","=",Z).where((J)=>J.or([J("status","=",X.progress),...Q===null?[]:[J.and([J("status","=",Q),J("assignee_id","=",Y8)])]])).where("review_cycle_started_at","is",null).where("dismissed_at","is",null).returningAll().executeTakeFirst();if(!Y)return null;let G=this.itemFromDbRow(Y);return await this.attachRefs([G],Z),G}async closeReviewCycle($,Z){await this.db.updateTable("task_board_items").set({review_cycle_started_at:null}).where("id","=",$).where("organization_id","=",Z).execute()}async advanceToReviewIfInProgress($,Z,X){let Q=await this.db.updateTable("task_board_items").set({status:"in_review",updated_by:X,updated_at:new Date().toISOString()}).where("id","=",$).where("organization_id","=",Z).where("status","=","in_progress").where("dismissed_at","is",null).returningAll().executeTakeFirst();if(!Q)return null;let Y=this.itemFromDbRow(Q);return await this.attachRefs([Y],Z),Y}async reopenLinkedTasksOnThreadRun($,Z){let X=[];for(let Q of await this.linkedTaskIds($,Z)){let Y=await this.getById(Q,Z);if(!Y||Y.status!=="in_review")continue;await this.closeReviewCycle(Q,Z),X.push(await this.update(Q,Z,{status:"in_progress"},Y.updatedBy))}return X}claimConflictResolution($,Z,X,Q){return this.claimInReviewSuperAgentSlot($,Z,X,Q)}async claimInReviewSuperAgentSlot($,Z,X,Q){if(Q.review===null||Q.progress===null)return null;let Y=await this.db.updateTable("task_board_items").set({status:Q.progress,review_cycle_started_at:null,updated_by:X,updated_at:new Date().toISOString()}).where("id","=",$).where("organization_id","=",Z).where("status","=",Q.review).where("assignee_id","=",Y8).returningAll().executeTakeFirst();if(!Y)return null;let G=this.itemFromDbRow(Y);return await this.attachRefs([G],Z),G}async claimUnassignedForSuperAgent($,Z,X,Q,Y){if(Y===null)return null;let G=await this.db.updateTable("task_board_items").set({assignee_id:Y8,assigned_by:X,updated_by:Q,updated_at:new Date().toISOString()}).where("id","=",$).where("organization_id","=",Z).where("status","=",Y).where("assignee_id","is",null).returningAll().executeTakeFirst();if(!G)return null;let J=this.itemFromDbRow(G);return await this.attachRefs([J],Z),J}async unassignSuperAgent($,Z,X){let Q=await this.db.updateTable("task_board_items").set({assignee_id:null,updated_by:X,updated_at:new Date().toISOString()}).where("id","=",$).where("organization_id","=",Z).where("assignee_id","=",Y8).returningAll().executeTakeFirst();if(!Q)return null;let Y=this.itemFromDbRow(Q);return await this.attachRefs([Y],Z),Y}async attachRefs($,Z){if($.length===0)return;await this.inTransaction((X)=>Promise.all([this.attachThreads(X,$,Z),this.attachTags(X,$),this.attachJiraKeys(X,$),this.attachReviewVerdicts(X,$)]))}async attachThreads($,Z,X){let Q=Z.map((J)=>J.id),Y=await $.selectFrom("task_board_item_threads as link").innerJoin("threads as t","t.id","link.thread_id").leftJoinLateral((J)=>J.selectFrom("thread_message_parts as p").select("p.payload as payload").whereRef("p.thread_id","=","link.thread_id").where("p.role","=","assistant").where("p.kind","=","text").orderBy("p.created_at","desc").limit(1).as("lastmsg"),(J)=>J.onTrue()).leftJoinLateral((J)=>J.selectFrom("thread_message_parts as up").select((W)=>[W.fn.sum(JD`coalesce((up.metadata->'usage'->'providerMetadata'->'openrouter'->'usage'->>'cost')::numeric, 0)`).as("usd"),JD`
|
|
1320
|
+
)`,created_by:$.by,created_at:X,updated_by:$.by,updated_at:X}).returningAll().executeTakeFirstOrThrow(),G=await this.inTransaction(async(J)=>{return await JD`select pg_advisory_xact_lock(hashtext(${`task-board-key-seq:${$.organizationId}`})::bigint)`.execute(J),Y(J)});return this.itemFromDbRow(G)}async update($,Z,X,Q){let Y=await this.db.updateTable("task_board_items").set({...X.title!==void 0?{title:X.title}:{},...X.description!==void 0?{description:X.description}:{},...X.status!==void 0?{status:X.status}:{},...X.priority!==void 0?{priority:X.priority}:{},...X.type!==void 0?{type:X.type}:{},...X.assigneeId!==void 0?{assignee_id:X.assigneeId}:{},...X.assignedBy!==void 0?{assigned_by:X.assignedBy}:{},...X.repo!==void 0?{repo:X.repo}:{},...X.dueDate!==void 0?{due_date:X.dueDate}:{},...X.sprintId!==void 0?{sprint_id:X.sprintId}:{},...X.externalUrl!==void 0?{external_url:X.externalUrl}:{},...X.boardColumnOrg!==void 0?{board_column_org:X.boardColumnOrg}:{},...X.sortOrder!==void 0?{sort_order:X.sortOrder}:{},...X.status!==void 0&&!xB4.has(X.status)?{review_cycle_started_at:null}:{},updated_by:Q,updated_at:new Date().toISOString()}).where("id","=",$).where("organization_id","=",Z).returningAll().executeTakeFirstOrThrow(),G=this.itemFromDbRow(Y);return await this.attachRefs([G],Z),G}async delete($,Z,X){return this.inTransaction(async(Q)=>{let Y=await Q.selectFrom("task_board_items").select(["created_by"]).where("id","=",$).where("organization_id","=",Z).executeTakeFirst();if(!Y)return!1;if(uQ({createdBy:Y.created_by}))return await Q.updateTable("task_board_items").set({dismissed_at:new Date().toISOString(),updated_by:X}).where("id","=",$).where("organization_id","=",Z).where("dismissed_at","is",null).execute(),!0;return await Q.deleteFrom("task_board_item_threads").where("task_board_item_id","=",$).where("organization_id","=",Z).execute(),await Q.deleteFrom("task_board_item_prs").where("task_board_item_id","=",$).where("organization_id","=",Z).execute(),await Q.deleteFrom("task_board_items").where("id","=",$).where("organization_id","=",Z).execute(),!0})}async dismissedFindingKeys($,Z){if(Z.length===0)return new Set;let X=await this.db.selectFrom("task_board_items").select(["external_key"]).where("organization_id","=",$).where("external_key","in",Z).where("dismissed_at","is not",null).execute();return new Set(X.flatMap((Q)=>Q.external_key??[]))}async listDismissedFindings($){return(await this.db.selectFrom("task_board_items").select(["external_key","updated_by","dismissed_at"]).where("organization_id","=",$).where("dismissed_at","is not",null).orderBy("dismissed_at","desc").execute()).flatMap((X)=>X.external_key&&X.dismissed_at?[{externalKey:X.external_key,dismissedBy:X.updated_by,dismissedAt:X.dismissed_at instanceof Date?X.dismissed_at.toISOString():X.dismissed_at}]:[])}async restoreDismissedFindings($,Z){if(Z&&Z.length===0)return 0;let X=this.db.updateTable("task_board_items").set({dismissed_at:null}).where("organization_id","=",$).where("dismissed_at","is not",null);if(Z)X=X.where("external_key","in",Z);let Q=await X.executeTakeFirst();return Number(Q.numUpdatedRows??0n)}async setItemTags($,Z,X){await this.inTransaction(async(Q)=>{if(await Q.deleteFrom("task_board_item_tags").where("task_board_item_id","=",$).$if(Z.length>0,(Y)=>Y.where("id","not in",Z)).execute(),Z.length>0)await Q.insertInto("task_board_item_tags").values(Z.map((Y)=>({task_board_item_id:$,id:Y,created_by:X,created_at:new Date().toISOString()}))).onConflict((Y)=>Y.doNothing()).execute()})}async addItemTags($,Z,X){if(Z.length===0)return;await this.db.insertInto("task_board_item_tags").values(Z.map((Q)=>({task_board_item_id:$,id:Q,created_by:X,created_at:new Date().toISOString()}))).onConflict((Q)=>Q.doNothing()).execute()}async linkThread($,Z,X){await this.db.insertInto("task_board_item_threads").values({task_board_item_id:$,thread_id:Z,organization_id:X}).onConflict((Q)=>Q.columns(["task_board_item_id","thread_id"]).doNothing()).execute()}async listItemsPendingReview($,Z,X){let Q=this.db.selectFrom("task_board_items").select(["id","organization_id as organizationId","updated_at"]).where((G)=>G.or([G("review_cycle_started_at","is not",null),G("status","=","in_review"),G("status","in",G.selectFrom("task_board_columns as c").select("c.key").whereRef("c.organization_id","=","task_board_items.organization_id").where("c.role","=","in_review"))])).where("dismissed_at","is",null);if(X)Q=Q.where((G)=>G.or([G("last_swept_at","is",null),G("last_swept_at","<",X)]));if(Z){let G=new Date(Z.updatedAt);Q=Q.where((J)=>J.or([J("updated_at",">",G),J.and([J("updated_at","=",G),J("id",">",Z.id)])]))}return(await Q.orderBy("updated_at","asc").orderBy("id","asc").limit($).execute()).map((G)=>({id:G.id,organizationId:G.organizationId,updatedAt:G.updated_at instanceof Date?G.updated_at.toISOString():String(G.updated_at)}))}async listItemsAwaitingArchive($,Z){return(await this.db.selectFrom("task_board_items as i").select(["i.id","i.organization_id as organizationId"]).where("i.status","=","done").where("i.dismissed_at","is",null).where("i.updated_at","<",$).where((Q)=>Q.exists(Q.selectFrom("task_board_item_prs as p").select("p.url").whereRef("p.task_board_item_id","=","i.id"))).orderBy("i.updated_at","asc").limit(Z).execute()).map((Q)=>({id:Q.id,organizationId:Q.organizationId}))}async listItemsAwaitingMergedTag($,Z){return(await this.db.selectFrom("task_board_items as i").select(["i.id","i.organization_id as organizationId"]).where("i.status","in",uB4).where("i.dismissed_at","is",null).where((Q)=>Q.exists(Q.selectFrom("task_board_item_prs as p").select("p.url").whereRef("p.task_board_item_id","=","i.id"))).where((Q)=>Q.not(Q.exists(Q.selectFrom("task_board_item_tags as t").innerJoin("organization_tags as g","g.id","t.id").select("t.id").whereRef("t.task_board_item_id","=","i.id").where(JD`lower(g.name)`,"=",$)))).orderBy("i.updated_at","desc").limit(Z).execute()).map((Q)=>({id:Q.id,organizationId:Q.organizationId}))}async claimSweep($,Z,X){let Q=await this.db.updateTable("task_board_items").set({last_swept_at:new Date}).where("id","=",$).where("organization_id","=",Z).where((Y)=>Y.or([Y("last_swept_at","is",null),Y("last_swept_at","<",X)])).executeTakeFirst();return Number(Q.numUpdatedRows??0)>0}async failedRunInfo($,Z){let X=await this.db.selectFrom("threads as t").leftJoinLateral((Q)=>Q.selectFrom("thread_message_parts as p").select("p.payload").whereRef("p.thread_id","=","t.id").where("p.kind","=","error").orderBy("p.created_at","desc").limit(1).as("err"),(Q)=>Q.onTrue()).select(["t.status","t.failure_kind as kind","err.payload as payload"]).where("t.id","=",$).where("t.organization_id","=",Z).executeTakeFirst();if(!X||X.status!=="failed")return null;return{kind:X.kind??null,errorText:YH$(X.payload)}}async scheduleRunRetry($,Z,X,Q,Y){if(Y===null)return!1;return(await this.db.updateTable("task_board_items").set({retry_at:Q,retry_attempts:X}).where("id","=",$).where("organization_id","=",Z).where("status","=",Y).where("dismissed_at","is",null).returning("id").execute()).length>0}async returnToTodoAfterFailure($,Z,X,Q){if(Q.progress===null||Q.queue===null)return null;if((await this.db.updateTable("task_board_items").set({status:Q.queue,retry_at:null,retry_attempts:0,updated_by:X,updated_at:new Date}).where("id","=",$).where("organization_id","=",Z).where("status","=",Q.progress).where("dismissed_at","is",null).returning("id").execute()).length===0)return null;return await this.getById($,Z)}async failNeverStartedLinkedThreads($,Z,X){let Q=await this.db.selectFrom("threads as t").innerJoin("task_board_item_threads as l","l.thread_id","t.id").select(["t.id as threadId","l.task_board_item_id as itemId","l.organization_id as organizationId"]).where("t.status","=","in_progress").where("t.run_started_at","is",null).where((W)=>W.and([W("t.updated_at","<",Z),W.or([W("t.last_progress_at","is",null),W("t.last_progress_at","<",Z)])])).limit($).execute();if(Q.length===0)return[];let Y=Q.map((W)=>W.threadId),G=await this.db.updateTable("threads").set({status:"failed",failure_reason:X,failure_kind:"abandoned",run_owner_pod:null,run_config:null,run_started_at:null,updated_at:new Date().toISOString()}).where("id","in",Y).where("status","=","in_progress").returning("id").execute(),J=new Set(G.map((W)=>W.id));return Q.filter((W)=>J.has(W.threadId))}async relabelDeliveredFailure($,Z,X){return(await this.db.updateTable("threads").set({failure_reason:X,failure_kind:"ended_after_delivery",updated_at:new Date().toISOString()}).where("id","=",$).where("organization_id","=",Z).where("status","=","failed").where((Y)=>Y.or([Y("failure_kind","is",null),Y("failure_kind","not in",["cancelled",...Lt])])).returning("id").execute()).length>0}async supersedeFailedThreads($,Z){return(await this.db.updateTable("threads").set({failure_kind:"superseded",updated_at:new Date().toISOString()}).where("organization_id","=",Z).where("status","=","failed").where("failure_kind","is distinct from","cancelled").where((Q)=>Q("id","in",Q.selectFrom("task_board_item_threads").select("thread_id").where("task_board_item_id","=",$).where("organization_id","=",Z))).returning("id").execute()).length}async listItemsStuckAfterFailure($,Z){let X=await this.db.selectFrom("task_board_items as i").innerJoin("task_board_item_threads as l","l.task_board_item_id","i.id").innerJoin("threads as t","t.id","l.thread_id").select(["i.id as id","i.organization_id as organizationId","t.id as threadId"]).where("i.status","=","in_progress").where("i.assignee_id","=",Y8).where("i.dismissed_at","is",null).where("i.retry_at","is",null).where("t.status","=","failed").where((Y)=>Y.or([Y("t.failure_kind","is",null),Y("t.failure_kind","not in",[...Lt])])).where("t.updated_at","<",Z).where((Y)=>Y.not(Y.exists(Y.selectFrom("task_board_item_threads as l2").innerJoin("threads as t2","t2.id","l2.thread_id").select("t2.id").whereRef("l2.task_board_item_id","=","i.id").where("t2.status","in",["in_progress","requires_action"])))).orderBy("t.updated_at","desc").limit($).execute(),Q=new Set;return X.filter((Y)=>!Q.has(Y.id)&&Q.add(Y.id))}async listItemsDueForRetry($,Z){return await this.db.selectFrom("task_board_items").select(["id","organization_id as organizationId","retry_attempts as attempts"]).where("retry_at","is not",null).where("retry_at","<=",Z).where("status","=","in_progress").where("dismissed_at","is",null).orderBy("retry_at","asc").limit($).execute()}async claimDueRetry($,Z,X){return(await this.db.updateTable("task_board_items").set({retry_at:null}).where("id","=",$).where("organization_id","=",Z).where("retry_at","is not",null).where("retry_at","<=",X).returning("id").execute()).length>0}async clearRunRetry($,Z){await this.db.updateTable("task_board_items").set({retry_at:null,retry_attempts:0}).where("id","=",$).where("organization_id","=",Z).execute()}async clearSweepBudget($,Z){await this.db.updateTable("task_board_items").set({last_swept_at:null}).where("id","=",$).where("organization_id","=",Z).execute()}async linkedTaskIds($,Z){return(await this.db.selectFrom("task_board_item_threads").select("task_board_item_id as taskId").where("thread_id","=",$).where("organization_id","=",Z).execute()).map((Q)=>Q.taskId)}async linkPr($){await this.db.insertInto("task_board_item_prs").values({task_board_item_id:$.taskBoardItemId,organization_id:$.organizationId,url:$.url,pr_number:$.prNumber,repo_owner:$.repoOwner,repo_name:$.repoName,connection_id:$.connectionId??null}).onConflict((Z)=>Z.columns(["task_board_item_id","url"]).doNothing()).execute()}async listPrs($,Z){return(await this.db.selectFrom("task_board_item_prs").select(["url","pr_number as prNumber","repo_owner as repoOwner","repo_name as repoName","connection_id as connectionId","created_at as createdAt"]).where("task_board_item_id","=",$).where("organization_id","=",Z).orderBy("created_at","desc").execute()).map((Q)=>({url:Q.url,number:Q.prNumber,repoOwner:Q.repoOwner,repoName:Q.repoName,connectionId:Q.connectionId??null,createdAt:Q.createdAt instanceof Date?Q.createdAt.toISOString():Q.createdAt}))}async advanceLinkedTasksToReviewOnThreadFinish($,Z,X){let Q=[];for(let Y of await this.linkedTaskIds($,Z)){let G=await this.getById(Y,Z);if(!G)continue;let J=(await this.listPrs(Y,Z)).length>0;if(!Do0(G,J))continue;if(G.reviewCycleStartedAt)continue;if(J){let K=await this.openReviewCycleIfInProgress(Y,Z,X);if(!K)continue;Q.push(K);continue}let W=await this.advanceToReviewIfInProgress(Y,Z,G.updatedBy);if(!W)continue;Q.push(W),await this.recordActivity({taskBoardItemId:Y,action:"status_changed",actorId:null,data:{from:G.status,to:"in_review"}}).catch((K)=>console.error("[task-board] in_review activity write failed",K))}return Q}async openReviewCycleIfInProgress($,Z,X){if(X.progress===null)return null;let Q=X.review,Y=await this.db.updateTable("task_board_items").set({review_cycle_started_at:new Date,status:X.progress}).where("id","=",$).where("organization_id","=",Z).where((J)=>J.or([J("status","=",X.progress),...Q===null?[]:[J.and([J("status","=",Q),J("assignee_id","=",Y8)])]])).where("review_cycle_started_at","is",null).where("dismissed_at","is",null).returningAll().executeTakeFirst();if(!Y)return null;let G=this.itemFromDbRow(Y);return await this.attachRefs([G],Z),G}async closeReviewCycle($,Z){await this.db.updateTable("task_board_items").set({review_cycle_started_at:null}).where("id","=",$).where("organization_id","=",Z).execute()}async advanceToReviewIfInProgress($,Z,X){let Q=await this.db.updateTable("task_board_items").set({status:"in_review",updated_by:X,updated_at:new Date().toISOString()}).where("id","=",$).where("organization_id","=",Z).where("status","=","in_progress").where("dismissed_at","is",null).returningAll().executeTakeFirst();if(!Q)return null;let Y=this.itemFromDbRow(Q);return await this.attachRefs([Y],Z),Y}async reopenLinkedTasksOnThreadRun($,Z){let X=[];for(let Q of await this.linkedTaskIds($,Z)){let Y=await this.getById(Q,Z);if(!Y||Y.status!=="in_review")continue;await this.closeReviewCycle(Q,Z),X.push(await this.update(Q,Z,{status:"in_progress"},Y.updatedBy))}return X}claimConflictResolution($,Z,X,Q){return this.claimInReviewSuperAgentSlot($,Z,X,Q)}async claimInReviewSuperAgentSlot($,Z,X,Q){if(Q.review===null||Q.progress===null)return null;let Y=await this.db.updateTable("task_board_items").set({status:Q.progress,review_cycle_started_at:null,updated_by:X,updated_at:new Date().toISOString()}).where("id","=",$).where("organization_id","=",Z).where("status","=",Q.review).where("assignee_id","=",Y8).returningAll().executeTakeFirst();if(!Y)return null;let G=this.itemFromDbRow(Y);return await this.attachRefs([G],Z),G}async claimUnassignedForSuperAgent($,Z,X,Q,Y){if(Y===null)return null;let G=await this.db.updateTable("task_board_items").set({assignee_id:Y8,assigned_by:X,updated_by:Q,updated_at:new Date().toISOString()}).where("id","=",$).where("organization_id","=",Z).where("status","=",Y).where("assignee_id","is",null).returningAll().executeTakeFirst();if(!G)return null;let J=this.itemFromDbRow(G);return await this.attachRefs([J],Z),J}async unassignSuperAgent($,Z,X){let Q=await this.db.updateTable("task_board_items").set({assignee_id:null,assigned_by:null,updated_by:X,updated_at:new Date().toISOString()}).where("id","=",$).where("organization_id","=",Z).where("assignee_id","=",Y8).returningAll().executeTakeFirst();if(!Q)return null;let Y=this.itemFromDbRow(Q);return await this.attachRefs([Y],Z),Y}async attachRefs($,Z){if($.length===0)return;await this.inTransaction((X)=>Promise.all([this.attachThreads(X,$,Z),this.attachTags(X,$),this.attachJiraKeys(X,$),this.attachReviewVerdicts(X,$)]))}async attachThreads($,Z,X){let Q=Z.map((J)=>J.id),Y=await $.selectFrom("task_board_item_threads as link").innerJoin("threads as t","t.id","link.thread_id").leftJoinLateral((J)=>J.selectFrom("thread_message_parts as p").select("p.payload as payload").whereRef("p.thread_id","=","link.thread_id").where("p.role","=","assistant").where("p.kind","=","text").orderBy("p.created_at","desc").limit(1).as("lastmsg"),(J)=>J.onTrue()).leftJoinLateral((J)=>J.selectFrom("thread_message_parts as up").select((W)=>[W.fn.sum(JD`coalesce((up.metadata->'usage'->'providerMetadata'->'openrouter'->'usage'->>'cost')::numeric, 0)`).as("usd"),JD`
|
|
1321
1321
|
case
|
|
1322
1322
|
when count(distinct up.metadata->'models'->'thinking'->>'provider') = 1
|
|
1323
1323
|
then max(up.metadata->'models'->'thinking'->>'provider')
|
|
@@ -1358,7 +1358,7 @@ ${wL0(X,Z)}
|
|
|
1358
1358
|
|
|
1359
1359
|
${Y}`:Y}case"media":return"";case"mediaSingle":case"mediaGroup":return Rg(pK(X),Z).join(`
|
|
1360
1360
|
|
|
1361
|
-
`);default:return wL0(X,Z)}}function go0($,Z=new Map){if(typeof $==="string")return tH$($,Z);if(!$||typeof $!=="object")return"";return YF$($,Z)}class ho0{client;names=new Map;lookupsDisabled=!1;constructor($){this.client=$}async resolve($){let Z=this.lookupsDisabled?[]:[...new Set($.filter((Q)=>!this.names.has(Q)))];for(let Q=0;Q<Z.length;Q+=eH$){let Y=Z.slice(Q,Q+eH$);for(let G of Y)this.names.set(G,null);try{for(let G of await this.client.listUsersByAccountId(Y))if(G.displayName)this.names.set(G.accountId,G.displayName)}catch(G){this.lookupsDisabled=!0,console.warn("[jira] user lookup failed, mentions render as @unknown for this run:",G instanceof Error?G.message:G);break}}let X=new Map;for(let Q of $){let Y=this.names.get(Q);if(Y)X.set(Q,Y)}return X}}var vo0=15000,uO4=60000,eH$=50,lO4="summary,status,priority,issuetype,updated,description,comment",cO4=100,fo0=20,dO4=500,$F$=1000,ZF$=20,Tg,iO4;var EL0=D(()=>{W4();ko0();So0();aH$();Tg=class Tg extends Error{status;constructor($,Z){super($);this.status=Z;this.name="JiraRequestError"}};iO4=/^[a-z0-9][a-z0-9-]*\.atlassian\.net$/});function eO4($,Z){if(!$.startsWith("/api/"))return null;let X;try{X=new URL($,"https://studio.invalid")}catch{return null}let Q=X.pathname.split("/"),[,Y,G,J,W,K]=Q;if(Q.length!==6||Y!=="api"||J!=="fs"||K!=="read"||W!=="outputs"||$D4(G)!==Z)return null;let H=X.searchParams.get("path");if(!H||H.includes(".."))return null;return{volume:W,path:H}}function $D4($){if($===void 0)return null;try{return decodeURIComponent($)}catch{return null}}function GF$($){let Z=$.split(".").pop()?.toLowerCase()??"";return aO4[Z]??null}function ZD4($){let X=$.replace(/^\/+/,"").replace(/\//g,"_").replace(/[^A-Za-z0-9._-]/g,"-").replace(/^[-.]+/,"");return(X===""?"attachment":X).slice(-120)}function JF$($,Z){let X=[],Q=new Set;for(let Y of $){if(Q.has(Y))continue;Q.add(Y);let G=eO4(Y,Z);if(!G||!GF$(G.path))continue;X.push({target:Y,ref:G,name:ZD4(G.path)})}if(X.length>8)console.warn(`[jira] comment references ${X.length} images; embedding the first 8, the rest stay links`);return X.slice(0,8)}async function WF$($,Z){let X=await Z.read($.ref);if(!X)return null;if(X.byteLength>10485760)return console.warn(`[jira] ${$.ref.path} is ${X.byteLength} bytes, over the ${"10485760"} upload cap \u2014 staying a link`),null;let Y=(await Z.listAttachments().catch((W)=>{return console.warn("[jira] could not list attachments for dedup:",W),[]})).find((W)=>W.filename===$.name&&W.size===X.byteLength),G=Y?await Z.mediaIdFor(Y.id):(await Z.upload({name:$.name,bytes:X,contentType:GF$($.ref.path)??"image/png"})).mediaId,J=$.ref.path.split("/").pop()??$.name;return G?{id:G,alt:J}:null}var aO4;var KF$=D(()=>{aO4={png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp"}});async function jL0($,Z,X){if(Z.assigneeId)return Z;let Q=Z.organizationId,Y=await T3$($,Q,Z.status);if(!Y)return Z;let G=await $.storage.taskBoard.claimUnassignedForSuperAgent(Z.id,Q,X.assignedBy,X.actor,Z.status);if(!G)return Z;await $.storage.taskBoard.recordActivity({taskBoardItemId:Z.id,action:"assignee_changed",actorId:null,data:{from:null,to:Y8}});try{await ND($,G,{instruction:Y.prompt??void 0})}catch(J){return console.warn(`[task-board] column rule on ${Z.status} rejected for ${Z.id}, un-delegating:`,J instanceof Error?J.message:J),await $.storage.taskBoard.
|
|
1361
|
+
`);default:return wL0(X,Z)}}function go0($,Z=new Map){if(typeof $==="string")return tH$($,Z);if(!$||typeof $!=="object")return"";return YF$($,Z)}class ho0{client;names=new Map;lookupsDisabled=!1;constructor($){this.client=$}async resolve($){let Z=this.lookupsDisabled?[]:[...new Set($.filter((Q)=>!this.names.has(Q)))];for(let Q=0;Q<Z.length;Q+=eH$){let Y=Z.slice(Q,Q+eH$);for(let G of Y)this.names.set(G,null);try{for(let G of await this.client.listUsersByAccountId(Y))if(G.displayName)this.names.set(G.accountId,G.displayName)}catch(G){this.lookupsDisabled=!0,console.warn("[jira] user lookup failed, mentions render as @unknown for this run:",G instanceof Error?G.message:G);break}}let X=new Map;for(let Q of $){let Y=this.names.get(Q);if(Y)X.set(Q,Y)}return X}}var vo0=15000,uO4=60000,eH$=50,lO4="summary,status,priority,issuetype,updated,description,comment",cO4=100,fo0=20,dO4=500,$F$=1000,ZF$=20,Tg,iO4;var EL0=D(()=>{W4();ko0();So0();aH$();Tg=class Tg extends Error{status;constructor($,Z){super($);this.status=Z;this.name="JiraRequestError"}};iO4=/^[a-z0-9][a-z0-9-]*\.atlassian\.net$/});function eO4($,Z){if(!$.startsWith("/api/"))return null;let X;try{X=new URL($,"https://studio.invalid")}catch{return null}let Q=X.pathname.split("/"),[,Y,G,J,W,K]=Q;if(Q.length!==6||Y!=="api"||J!=="fs"||K!=="read"||W!=="outputs"||$D4(G)!==Z)return null;let H=X.searchParams.get("path");if(!H||H.includes(".."))return null;return{volume:W,path:H}}function $D4($){if($===void 0)return null;try{return decodeURIComponent($)}catch{return null}}function GF$($){let Z=$.split(".").pop()?.toLowerCase()??"";return aO4[Z]??null}function ZD4($){let X=$.replace(/^\/+/,"").replace(/\//g,"_").replace(/[^A-Za-z0-9._-]/g,"-").replace(/^[-.]+/,"");return(X===""?"attachment":X).slice(-120)}function JF$($,Z){let X=[],Q=new Set;for(let Y of $){if(Q.has(Y))continue;Q.add(Y);let G=eO4(Y,Z);if(!G||!GF$(G.path))continue;X.push({target:Y,ref:G,name:ZD4(G.path)})}if(X.length>8)console.warn(`[jira] comment references ${X.length} images; embedding the first 8, the rest stay links`);return X.slice(0,8)}async function WF$($,Z){let X=await Z.read($.ref);if(!X)return null;if(X.byteLength>10485760)return console.warn(`[jira] ${$.ref.path} is ${X.byteLength} bytes, over the ${"10485760"} upload cap \u2014 staying a link`),null;let Y=(await Z.listAttachments().catch((W)=>{return console.warn("[jira] could not list attachments for dedup:",W),[]})).find((W)=>W.filename===$.name&&W.size===X.byteLength),G=Y?await Z.mediaIdFor(Y.id):(await Z.upload({name:$.name,bytes:X,contentType:GF$($.ref.path)??"image/png"})).mediaId,J=$.ref.path.split("/").pop()??$.name;return G?{id:G,alt:J}:null}var aO4;var KF$=D(()=>{aO4={png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp"}});async function jL0($,Z,X){if(Z.assigneeId)return Z;let Q=Z.organizationId,Y=await T3$($,Q,Z.status);if(!Y)return Z;let G=await $.storage.taskBoard.claimUnassignedForSuperAgent(Z.id,Q,X.assignedBy,X.actor,Z.status);if(!G)return Z;await $.storage.taskBoard.recordActivity({taskBoardItemId:Z.id,action:"assignee_changed",actorId:null,data:{from:null,to:Y8}});try{await ND($,G,{instruction:Y.prompt??void 0})}catch(J){return console.warn(`[task-board] column rule on ${Z.status} rejected for ${Z.id}, un-delegating:`,J instanceof Error?J.message:J),await $.storage.taskBoard.unassignSuperAgent(Z.id,Q,X.actor)??await $.storage.taskBoard.getById(Z.id,Q)??G}return G}var uo0=D(()=>{j6();v5();wN()});async function Ig($,Z){try{let{counts:X,watermark:Q,rescanPending:Y}=await DD4($,Z);return await $.storage.jiraIntegrations.recordSyncResult(Z.id,{error:null,watermark:Q,rescanPending:Y}),X}catch(X){let Q=X instanceof Error?X.message:String(X);return await $.storage.jiraIntegrations.recordSyncResult(Z.id,{error:Q}).catch(()=>{}),{error:Q}}}async function YD4($,Z,X){let Y=await new XY(Z.siteUrl,Z.email,Z.apiToken).getBoardColumns(X);await $.storage.boardColumns.replaceAll(Z.organizationId,Y.map((J)=>({key:J.name,title:J.name,trackerStatuses:J.statuses})));let G=new Map;for(let J of Y)for(let W of J.statuses)if(!G.has(W))G.set(W,J.name);return G}function GD4({lastSeenJiraSprintId:$,jiraSprintId:Z}){return $!==Z}function JD4({jiraStatusChanged:$,currentStatus:Z,boardColumns:X}){if($)return!0;return Z!==null&&!X.has(Z)}function WD4($,Z,X){let Q=$.lastSyncedAt?Math.ceil((X.getTime()-new Date($.lastSyncedAt).getTime())/60000):null,Y=Q===null?null:Math.max(0,Q)+XD4;return`${[`(${Z})`,"issuetype IN standardIssueTypes()",...Y!==null?[`updated >= -${Y}m`]:[]].join(" AND ")} ORDER BY updated ASC`}function KD4($,Z,X){if(X)return!1;return new Date($)>=Z}function HD4($,Z){return $>=lo0||Z>=BF$}function HF$($){let Z=$.fields.issuetype?.hierarchyLevel;return typeof Z!=="number"||Z===0}async function FD4($,Z){let X=$.fields.description,Q=await Z.resolve(Tt(X));return go0(X,Q).trim().slice(0,OF$)}function ND4($,Z){return`${$}/browse/${Z}`}function UD4($){let Z=$.fields.priority?.name?.toLowerCase();return Z&&QD4[Z]||"medium"}function FF$($,Z,X){return jL0($,X,{assignedBy:Z.createdBy,actor:nK})}async function NF$($,Z,X,Q,Y,G,J){let W=Z.organizationId,K=Q.fields.comment;if(K&&K.total===0)return;let H=K&&K.comments.length>=K.total?K.comments:await X.listComments(Q.id),F=await $.storage.jiraIntegrations.knownJiraCommentIds(W,H.map((B)=>B.id)),N=H.filter((B)=>!F.has(B.id)&&B.author?.accountId!==G);if(N.length===0)return;let U=await J.resolve(N.flatMap((B)=>Tt(B.body)));for(let B of N){let O=go0(B.body,U).slice(0,OF$),L=await $.storage.taskBoard.createComment({taskBoardItemId:Y,organizationId:W,authorId:nK,body:`**${B.author?.displayName??"Jira"} \xB7 via Jira:**
|
|
1362
1362
|
|
|
1363
1363
|
${O}`});if(!L)continue;try{await $.storage.jiraIntegrations.createCommentLink({commentId:L.id,organizationId:W,jiraCommentId:B.id})}catch(w){if(w.code==="23505"){await $.storage.taskBoard.deleteComment(L.id,W,nK);continue}throw w}}}class DF${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(UF$));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,UF$($));return this.ids.set($.id,X),X}}function UF$($){return{jiraSprintId:$.id,name:$.name,state:$.state,startsAt:$.startsAt,endsAt:$.endsAt}}function BD4($,Z){if($.size===0)return[];return Z.filter((X)=>!$.has(X.jiraIssueId))}async function OD4($,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=BD4(G,await $.storage.jiraIntegrations.listLinkedIssuesOnBoard(Y));if(J.length===0)return 0;for(let W of J){let K=await $.storage.taskBoard.getById(W.itemId,Y);if(!K||K.status==="archived")continue;let H=await $.storage.taskBoard.update(W.itemId,Y,{status:"archived"},nK);await $.storage.taskBoard.recordActivity({taskBoardItemId:W.itemId,action:"status_changed",actorId:null,data:{from:K.status,to:"archived"}}),x$(Y,H),console.log(`[jira] ${W.jiraIssueKey} is no longer in board ${Z.boardId}'s scope \u2014 archived its card`)}return J.length}async function DD4($,Z){let{organizationId:X,boardId:Q}=Z;if(!Q)throw Error("No Jira board selected");let Y=await $.storage.organizationSettings.get(Z.organizationId),G=dZ(Y?.flags,"org_board_columns"),J=await j5($,Z.organizationId),W=G?await YD4($,Z,Q):wH$(Z.statusMapping),K=new Set((await J.columns()).map((C)=>C.key));if(W.size===0)throw Error(G?"This Jira board has no columns to mirror":"No status mapping configured");let H=Z.lastSyncedAt===null||Z.rescanPending,F=new XY(Z.siteUrl,Z.email,Z.apiToken),{accountId:N}=await F.myself(),U=new ho0(F),B=new Date,O=await F.getBoardScopeJql(Q),L=WD4(Z,O,B),w=new DF$($,X);await w.seed(await F.listBoardSprints(Q));let E={created:0,updated:0,unchanged:0,skipped:0,archived:0,unmappedStatuses:[]},j=new Set,z,A,P=0,I=0;while(P<lo0&&I<BF$){I++;let C=await F.searchIssues({jql:L,nextPageToken:A});if(A=C.nextPageToken??void 0,C.issues.length===0){if(!A)break;continue}let m=await $.storage.jiraIntegrations.getLinksByIssueIds(X,C.issues.map((v)=>v.id));await U.resolve(C.issues.flatMap((v)=>[...Tt(v.fields.description),...(v.fields.comment?.comments??[]).flatMap((b)=>Tt(b.body))]));for(let v of C.issues){if(P>=lo0)break;P++;let b=new Date(v.fields.updated);if(Number.isNaN(b.getTime()))throw Error(`Unparseable updated on ${v.key}`);let i=W.get(v.fields.status.name);if(!i||!HF$(v)){if(!i&&HF$(v))j.add(v.fields.status.name);E.skipped++,z=b;continue}let l=m.get(v.id);if(l&&KD4(l.jiraUpdatedAt,b,H)){E.unchanged++,z=b;continue}let r=v.fields.status.name,U0=OL0(v.sprints),E0={title:v.fields.summary,description:await FD4(v,U),externalUrl:ND4(Z.siteUrl,v.key),priority:UD4(v),boardColumnOrg:J.columnOwner()};if(l){let s=l.jiraStatus!==r,o=GD4({lastSeenJiraSprintId:l.jiraSprintId,jiraSprintId:U0?.id??null}),D0=await $.storage.taskBoard.getById(l.itemId,X),Z0=JD4({jiraStatusChanged:s,currentStatus:D0?.status??null,boardColumns:K}),P0=await $.storage.taskBoard.update(l.itemId,X,{...E0,...Z0?{status:i}:{},...o?{sprintId:await w.localIdFor(U0)}:{}},nK);if(await $.storage.jiraIntegrations.touchLink(l.itemId,{jiraStatus:r,jiraSprintId:U0?.id??null}),D0&&Z0&&D0.status!==i)await $.storage.taskBoard.recordActivity({taskBoardItemId:l.itemId,action:"status_changed",actorId:null,data:{from:D0.status,to:i}});if(s&&!H)P0=await FF$($,Z,P0);await NF$($,Z,F,v,l.itemId,N,U),await $.storage.jiraIntegrations.touchLink(l.itemId,{jiraUpdatedAt:b}),x$(X,P0),E.updated++}else{let s=await $.storage.taskBoard.create({organizationId:X,...E0,status:i,sprintId:await w.localIdFor(U0),by:nK});try{await $.storage.jiraIntegrations.createLink({itemId:s.id,organizationId:X,jiraIssueId:v.id,jiraIssueKey:v.key,jiraUpdatedAt:new Date(0),jiraStatus:r,jiraSprintId:U0?.id??null})}catch(o){if(o.code==="23505"){await $.storage.taskBoard.delete(s.id,X,nK),E.unchanged++,z=b;continue}throw o}if(!H)s=await FF$($,Z,s);await NF$($,Z,F,v,s.id,N,U),await $.storage.jiraIntegrations.touchLink(s.id,{jiraUpdatedAt:b}),x$(X,s),E.created++}z=b}if(!A)break}E.unmappedStatuses=[...j].sort();let k=HD4(P,I);if(!k)E.archived=await OD4($,Z,F,O);let M=H&&k;if(z===void 0&&P===0)return{counts:E,watermark:B,rescanPending:M};return{counts:E,watermark:z,rescanPending:M}}var nK="jira",lo0=500,XD4=5,BF$=25,OF$=1e4,QD4;var zL0=D(()=>{R9();v5();uo0();z5();EL0();So0();QD4={highest:"urgent",high:"high",medium:"medium",low:"low",lowest:"low"}});var wF$={};J4(wF$,{setJiraSyncRuntime:()=>po0,registerJiraSyncWorkflow:()=>to0,maybeEnqueueJiraStatusPush:()=>bD4,maybeEnqueueJiraSprintPush:()=>xD4,enqueueJiraCommentPush:()=>no0});import{DBOS as wZ,SchedulerMode as LD4}from"@dbos-inc/dbos-sdk";function po0($){It=$}function dC(){if(!It)throw Error("[jira] sync runtime not initialized \u2014 setJiraSyncRuntime() must run before the workflow fires");return It}function EJ(){let{db:$,encryptionKey:Z}=dC();return new uC($,new yY(Z))}function LF$(){return new KQ(dC().db)}function ED4(){return new Pt(dC().db)}async function jD4($){try{let{db:Z}=dC(),X=await EJ().getById($);if(!X)return{id:$,error:"integration no longer exists"};if(!X.enabled)return{id:$};let Q=await XW(Z,X.organizationId);if(!Q)return{id:$,error:"organization no longer exists"};let Y=await Ig(Q,X);return"error"in Y?{id:$,error:Y.error}:{id:$}}catch(Z){return{id:$,error:Z instanceof Error?Z.message:String(Z)}}}async function zD4($,Z){let X=await wZ.runStep(()=>EJ().listEnabledIds(),{name:"loadJiraIntegrations"});for(let Q of X){let Y=await wZ.runStep(()=>jD4(Q),{name:`syncJira:${Q}`});if(Y.error)console.warn(`[jira] sync ${Y.id} failed: ${Y.error}`)}}async function AD4($){let Z=EJ();if(!(await Z.getByOrg($.organizationId))?.enabled)return null;let Q=await Z.getLinkByItemId($.taskBoardItemId,$.organizationId);if(!Q)return null;if(await Z.hasCommentLink($.commentId))return null;return{jiraIssueId:Q.jiraIssueId}}async function TD4($){return(await dC().db.selectFrom("organization").select("slug").where("id","=",$).executeTakeFirst())?.slug??null}async function RD4($,Z,X){let Q=await EJ().getByOrg($);if(!Q?.enabled)return null;let G=(await XW(dC().db,$))?.orgFs;if(!G)return null;let J=new XY(Q.siteUrl,Q.email,Q.apiToken);return WF$(X,{read:(W)=>G.read(W.volume,W.path).catch((K)=>{if(K instanceof fG)return null;throw K}),listAttachments:()=>J.listAttachments(Z),upload:(W)=>J.addAttachment(Z,W),mediaIdFor:(W)=>J.resolveMediaId(W)})}async function ID4($,Z,X){let Q=EJ(),Y=await Q.getByOrg($.organizationId);if(!Y?.enabled)return null;let G=await Q.getLinkByItemId($.taskBoardItemId,$.organizationId);if(!G)return null;if(await Q.hasCommentLink($.commentId))return null;return(await new XY(Y.siteUrl,Y.email,Y.apiToken).addComment(G.jiraIssueId,Z,{header:`${$.authorLabel} \xB7 via Studio:`,media:new Map(X)})).id}async function qD4($,Z){try{await EJ().createCommentLink({commentId:$.commentId,organizationId:$.organizationId,jiraCommentId:Z})}catch(X){if(X.code!=="23505")throw X}}async function MD4($){let Z=$.body.slice(0,PD4),X=await wZ.runStep(()=>AD4($),{name:"resolveCommentTarget",retriesAllowed:!0,maxAttempts:3});if(!X)return;let Q=[],Y=SH$(Z);if(Y.length>0){let J=await wZ.runStep(()=>TD4($.organizationId),{name:"readOrgSlug",retriesAllowed:!0,maxAttempts:3});for(let W of JF$(Y,J??""))try{let K=await wZ.runStep(()=>RD4($.organizationId,X.jiraIssueId,W),{name:`attachCommentImage:${W.name}`,retriesAllowed:!0,maxAttempts:3});if(K)Q.push([W.target,K])}catch(K){if(!OH$(K))throw K;console.warn(`[jira] could not attach ${W.ref.path}:`,K)}}let G=await wZ.runStep(()=>ID4($,Z,Q),{name:"postCommentToJira",retriesAllowed:!1});if(!G)return;await wZ.runStep(()=>qD4($,G),{name:"recordCommentLink",retriesAllowed:!0,maxAttempts:4})}async function kD4($){let Z=EJ(),X=await Z.getByOrg($.organizationId);if(!X?.enabled)return null;let Q=await Z.getLinkByItemId($.itemId,$.organizationId);if(!Q)return null;let Y=await LF$().getById($.itemId,$.organizationId);if(!Y)return null;let G=await SD4($.organizationId,Y.status,X.statusMapping);if(Eo0(G,Q.jiraStatus))return null;let W=await new XY(X.siteUrl,X.email,X.apiToken).listTransitions(Q.jiraIssueId),K=jH$({targets:G,currentJiraStatus:Q.jiraStatus,availableTransitions:W.map((F)=>F.to.name)});if(K.kind!=="transition"){if(K.kind==="unreachable")console.warn(`[jira] ${Q.jiraIssueKey} is ${Y.status} on the board, but its workflow offers no transition to ${K.targets.join(" / ")} \u2014 `+"the card will not move on the Jira board");return null}let H=W.find((F)=>F.to.name===K.targetName);if(!H)return null;return{jiraIssueId:Q.jiraIssueId,transitionId:H.id,targetName:K.targetName}}async function VD4($,Z){let X=EJ(),Q=await X.getByOrg($.organizationId);if(!Q?.enabled)return;let Y=await X.getLinkByItemId($.itemId,$.organizationId);if(!Y||Y.jiraStatus===Z.targetName)return;let G=new XY(Q.siteUrl,Q.email,Q.apiToken);if(await G.getStatusName(Z.jiraIssueId)===Z.targetName){await X.touchLink($.itemId,{jiraStatus:Z.targetName});return}await G.transitionIssue(Z.jiraIssueId,Z.transitionId),await X.touchLink($.itemId,{jiraStatus:Z.targetName})}async function SD4($,Z,X){let Q=await new VC(dC().db).listByOrg($);return EH$({column:Q.find((Y)=>Y.key===Z),mapping:X,lane:Z})}async function CD4($){let Z=EJ();if(!(await Z.getByOrg($.organizationId))?.enabled)return null;let Q=await Z.getLinkByItemId($.itemId,$.organizationId);if(!Q)return null;let Y=await LF$().getById($.itemId,$.organizationId);if(!Y)return null;let G=Y.sprintId?await ED4().jiraIdFor($.organizationId,Y.sprintId):null;if(Y.sprintId&&G===null)return console.warn(`[jira] ${Q.jiraIssueKey} is in a sprint that did not come from Jira \u2014 not pushing`),null;if(Q.jiraSprintId===G)return null;return{jiraIssueId:Q.jiraIssueId,jiraIssueKey:Q.jiraIssueKey,targetSprintId:G}}async function _D4($,Z){let X=EJ(),Q=await X.getByOrg($.organizationId);if(!Q?.enabled)return;let Y=await X.getLinkByItemId($.itemId,$.organizationId);if(!Y||Y.jiraSprintId===Z.targetSprintId)return;let G=new XY(Q.siteUrl,Q.email,Q.apiToken);if(await G.getIssueSprintId(Z.jiraIssueId)!==Z.targetSprintId)if(Z.targetSprintId===null)await G.moveIssueToBacklog(Z.jiraIssueId);else await G.addIssueToSprint(Z.targetSprintId,Z.jiraIssueId);await X.touchLink($.itemId,{jiraSprintId:Z.targetSprintId})}async function vD4($){let Z=await wZ.runStep(()=>CD4($),{name:"resolveSprintMove",retriesAllowed:!0,maxAttempts:3});if(!Z)return;await wZ.runStep(()=>_D4($,Z),{name:"executeSprintMove",retriesAllowed:!0,maxAttempts:3})}async function fD4($){let Z=await wZ.runStep(()=>kD4($),{name:"resolveStatusTransition",retriesAllowed:!0,maxAttempts:3});if(!Z)return;await wZ.runStep(()=>VD4($,Z),{name:"executeStatusTransition",retriesAllowed:!0,maxAttempts:3})}function bD4($,Z){if(Z.updatedBy===nK)return;if(!mo0||!It)return;let X=mo0;(async()=>{if(!await EJ().getLinkByItemId(Z.id,$))return;await wZ.startWorkflow(X,{queueName:JU,workflowID:`jira-status:${Z.id}:${Z.status}:${Date.parse(Z.updatedAt)}`,enqueueOptions:{queuePartitionKey:$}})({organizationId:$,itemId:Z.id})})().catch((Q)=>{console.warn(`[jira] status push enqueue failed for ${Z.id}:`,Q instanceof Error?Q.message:Q)})}function xD4($,Z){if(Z.updatedBy===nK)return;if(!io0||!It)return;let X=io0;(async()=>{if(!await EJ().getLinkByItemId(Z.id,$))return;await wZ.startWorkflow(X,{queueName:JU,workflowID:`jira-sprint:${Z.id}:${Z.sprintId??"backlog"}:${Date.parse(Z.updatedAt)}`,enqueueOptions:{queuePartitionKey:$}})({organizationId:$,itemId:Z.id})})().catch((Q)=>{console.warn(`[jira] sprint push enqueue failed for ${Z.id}:`,Q instanceof Error?Q.message:Q)})}async function no0($,Z){try{if(!do0)return;if(!await $.storage.jiraIntegrations.getLinkByItemId(Z.taskBoardItemId,Z.organizationId))return;await wZ.startWorkflow(do0,{queueName:JU,workflowID:`jira-cmt-push:${Z.commentId}`,enqueueOptions:{queuePartitionKey:Z.organizationId}})(Z)}catch(X){console.warn(`[jira] comment push enqueue failed for ${Z.commentId}:`,X instanceof Error?X.message:X)}}function to0(){if(co0)return;co0=wZ.registerWorkflow(zD4,{name:"jiraSyncWorkflow"}),wZ.registerScheduled(co0,{name:"jiraSyncWorkflow",crontab:wD4,mode:LD4.ExactlyOncePerIntervalWhenActive}),do0=wZ.registerWorkflow(MD4,{name:"jiraCommentPushWorkflow"}),mo0=wZ.registerWorkflow(fD4,{name:"jiraStatusPushWorkflow"}),io0=wZ.registerWorkflow(vD4,{name:"jiraSprintPushWorkflow"})}var wD4="2-59/10 * * * *",It=null,PD4=30000,co0=null,do0=null,mo0=null,io0=null;var PL0=D(()=>{DH$();nU();Ag();KL0();mK();jo0();ww();EL0();KF$();ko0();zL0()});function AL0($,Z,X,Q){dY({event:$,organizationId:Z,properties:{task_id:X.id,reports_task:uQ(X),...Q}})}function x$($,Z){f5.emit($,{id:crypto.randomUUID(),type:r0$,source:"task-board",subject:Z.id,data:Z,time:new Date().toISOString()}),Promise.resolve().then(() => (PL0(),wF$)).then((X)=>{X.maybeEnqueueJiraStatusPush($,Z),X.maybeEnqueueJiraSprintPush($,Z)}).catch((X)=>{console.warn("[jira] push hooks unavailable:",X)})}function EF$($,Z){f5.emit($,{id:crypto.randomUUID(),type:s0$,source:"task-board",subject:Z,data:{id:Z},time:new Date().toISOString()})}function yD4($,Z){return $?[$]:Z}async function mC($,Z,X){let Q=$.metadata?.runMetadata?.taskBoardItemId,Y=!Q&&X?await $.storage.taskBoard.linkedTaskIds(X,Z):[];return yD4(Q,Y)}async function jF$($,Z,X){let Q=$.organization?.id;if(!Q)return;try{for(let Y of await mC($,Q,X)){let G=await $.storage.taskBoard.getById(Y,Q),J=hC(Z),W=hC(G?.status??"");if(!G||J!==null&&W!==null&&J<=W)continue;let K=await $.storage.taskBoard.update(Y,Q,{status:Z},$.auth?.user?.id??G.updatedBy);if(await $.storage.taskBoard.recordActivity({taskBoardItemId:Y,action:"status_changed",actorId:null,data:{from:G.status,to:Z}}).catch((H)=>console.error("[task-board] activity log write failed",H)),x$(Q,K),Z==="in_progress")AL0("task_run_started",Q,K,{from:G.status})}}catch(Y){console.error("[task-board] run transition failed",Y)}}async function TL0($,Z){let X=$.organization?.id;if(!X)return;try{for(let Q of await mC($,X,Z)){let Y=await $.storage.taskBoard.openReviewCycleIfInProgress(Q,X,await N9($,X));if(!Y)continue;x$(X,Y),AL0("task_run_completed",X,Y,{from:"in_progress",via:"pr_open"})}}catch(Q){console.error("[task-board] review-cycle open failed",Q)}}async function RL0($,Z,X,Q){let Y=$.organization?.id;if(!Y)return;try{let G=GL0(Z);if(!G)return;let J=await mC($,Y,Q);for(let W of J)await $.storage.taskBoard.linkPr({taskBoardItemId:W,organizationId:Y,url:G.url,prNumber:G.number,repoOwner:G.owner,repoName:G.repo,connectionId:X??null})}catch(G){console.error("[task-board] PR capture failed",G)}}async function qg($,Z,X,Q,Y){try{let G=await $.advanceLinkedTasksToReviewOnThreadFinish(Z,X,Y);for(let J of G)x$(X,J),AL0("task_run_completed",X,J,{from:"in_progress",via:"thread_finish"});for(let J of G)await $.clearRunRetry(J.id,X).catch(()=>{})}catch(G){console.error("[task-board] thread-finish transition failed",G)}await oo0($,Z,X,Y),await ro0($,Q,Z,X)}function zF$($){return(hC($.status)??-1)>=WL0.in_review||Boolean($.reviewCycleStartedAt)}async function oo0($,Z,X,Q){try{let Y=await $.failedRunInfo(Z,X);if(!Y)return;let G=WH$(Y);for(let J of await $.linkedTaskIds(Z,X)){let W=await $.getById(J,X);if(!W)continue;if(zF$(W))await $.relabelDeliveredFailure(Z,X,uD4).catch(()=>{});if(W.status!=="in_progress")continue;if(W.reviewCycleStartedAt)continue;if(W.threads.some((F)=>F.hasMessages&&F.status==="in_progress"))continue;let K=W.retryAttempts;if(K<G){let F=G7(hD4,gD4,K,2,0.5);if(!await $.scheduleRunRetry(J,X,K+1,new Date(Date.now()+F),Q.progress))continue;await $.recordActivity({taskBoardItemId:J,action:"status_changed",actorId:null,data:{from:"in_progress",to:"in_progress",retry:K+1,of:G,reason:Y.errorText??Y.kind}}).catch(()=>{});continue}let H=await $.returnToTodoAfterFailure(J,X,W.updatedBy,Q);if(!H)continue;await $.recordActivity({taskBoardItemId:J,action:"status_changed",actorId:null,data:{from:"in_progress",to:"todo",reason:Y.errorText??Y.kind,retriesSpent:K}}).catch(()=>{}),x$(X,H),AL0("task_run_failed",X,W,{reason:Y.kind??"error",retries_spent:K})}}catch(Y){console.error("[task-board] failed-run reaction failed",Y)}}async function ro0($,Z,X,Q){try{for(let Y of await $.linkedTaskIds(X,Q)){let G=await $.getById(Y,Q);if(!G)continue;if(zF$(G))continue;if(G.threads.some((W)=>W.hasMessages&&(W.status===null||!jt.has(W.status))))continue;if((await $.listPrs(Y,Q)).length>0)continue;await X1$(Z,Q,Y)}}catch(Y){console.error("[task-board] quota refund pass failed",Y)}}async function so0($,Z){let X=await N9($,Z.organizationId);if(Z.status!==X.progress||!ZY(Z,X.review))return;if(!SC(Z.organizationId,"in_review",X.review,"parking a reviewed card for a person"))return;try{let Q=await $.storage.taskBoard.update(Z.id,Z.organizationId,{status:X.review},Z.updatedBy);await $.storage.taskBoard.recordActivity({taskBoardItemId:Z.id,action:"status_changed",actorId:null,data:{from:Z.status,to:"in_review"}}).catch(()=>{}),x$(Z.organizationId,Q)}catch(Q){console.error(`[task-board] parking ${Z.id} for review failed`,Q)}}async function tK($,Z,X){let Q=Z.organizationId;if(Z.assigneeId!==Y8)return!1;try{await so0($,Z).catch((G)=>console.warn(`[task-board] parking ${Z.id} before hand-off failed`,G));let Y=await $.storage.taskBoard.unassignSuperAgent(Z.id,Q,Z.updatedBy);if(!Y)return!1;return await A6($,{taskBoardItemId:Z.id,action:"assignee_changed",actorId:null,data:{from:Z.assigneeId,to:null,reason:X}}),console.warn(`[task-board] ${Z.id} handed to a human: ${X}`),x$(Q,Y),!0}catch(Y){return console.error(`[task-board] handing ${Z.id} to a human failed`,Y),!1}}async function PF$($,Z,X){if(!(X instanceof $Q))return!1;if(X.reason!=="runs_exhausted")return!1;return await tK($,Z,"per-task run limit reached \u2014 the Super Agent can no longer re-dispatch "+"itself on this task. Re-run it manually to continue."),!0}async function AF$($,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 TF$($){return $.includes("create_pull_request")||$.includes("createPullRequest")}function RF$($){if(lD4.test($))return!0;return cD4.test($)&&dD4.test($)}var gD4=30000,hD4=120000,uD4="Run ended after it had already delivered \u2014 the task moved on without it",lD4,cD4,dD4;var z5=D(()=>{YJ();S4();mK();v5();Pg();KH$();W4();wt();j6();BX();iK();lD4=/\bgh\s+pr\s+create\b/,cD4=/api\.github\.com\/repos\/[^\s"']+\/pulls\b/,dD4=/(?:-X|--request)\s+POST/});function mD4($){if($.status==="completed")return"advance";if($.status==="failed"&&$.messageStorageVersion===2&&($.harnessId==="decopilot"||$.harnessId==="claude-code"))return"nudge";return"none"}function iD4($){return["This task is still In Progress on the board and your last run ended without finishing it.","","Look at what you already did (`git log`, `git status`, and the messages above), then either:","- finish the remaining work (and open the PR, if it needed code changes),","- or, if it's actually done, say so in one line \u2014 the board moves the card for you,",$==="decopilot"?"- or, if you're blocked on something only a human knows, call the `user_ask` tool.":"- or, if you're blocked on something only a human knows, say what you need and stop.","","Don't start over and don't redo work you already committed or pushed. You are on the same branch as before \u2014 push to it and update your existing pull request rather than opening a second one."].join(`
|
|
1364
1364
|
`)}async function pD4($,Z,X){await Eg($,Z,X,{messageId:`stall-nudge-${Z.id}-${X.id}`,prompt:iD4(X.harness_id),workflowID:`stall-nudge:${Z.id}:${X.id}`})}async function nD4($,Z){let X=await $.storage.threads.get(Z);if(!X)return{action:"none",thread:null};return{action:mD4({status:X.status,messageStorageVersion:X.message_storage_version,harnessId:X.harness_id}),thread:X}}function tD4($,Z=Date.now()){if($.status!=="in_progress")return!1;if($.run_started_at)return!1;return Dt($,Z)}async function oD4($,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||!tD4(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 IF$($,Z){let X=$.organization?.id;if(!X)return;for(let Q of Z){if(Q.status==="in_progress")try{if((await oD4($,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(!Do0(Q,Y))continue;let G=Q.threads.find((J)=>J.hasMessages);if(!G)continue;try{let{action:J,thread:W}=await nD4($,G.threadId);if(J==="none"||!W)continue;if(J==="advance")await qg($.storage.taskBoard,G.threadId,X,$.storage.organizationBilling,await N9($,X));else await pD4($,Q,W)}catch(J){console.error(`[task-board] stall recovery failed for ${Q.id}`,J)}}}var ao0="Run never started \u2014 no pod picked it up before the idle window elapsed";var eo0=D(()=>{v5();eD0();mK();z5()});import{z as jJ}from"zod";var rD4,iC;var $r0=D(()=>{v5();M0();xQ();e3();eo0();rD4=jJ.object({key:jJ.string(),title:jJ.string(),position:jJ.number(),role:jJ.string().nullable()}),iC=u({name:"TASK_BOARD_ITEM_LIST",description:"List all task board items for the organization, plus the `owner/name` repos this organization has imported (the valid values for a task's `repo` field).",annotations:{title:"List Task Board Items",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:jJ.object({}),outputSchema:jJ.object({items:jJ.array(Ng),repos:jJ.array(jJ.string()),sprints:jJ.array(V3$),columns:jJ.array(rD4)}),handler:async($,Z)=>{t(Z),await Z.access.check();let X=Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");let[Q,{items:Y},G,J]=await Promise.all([Z.storage.taskBoard.list(X),Z.storage.connections.list(X,{slug:"mcp-github"}),Z.storage.sprints.listByOrg(X),j5(Z,X).then((K)=>K.columns())]),W=ee1(Y);return IF$(Z,Q),{items:Q,repos:W,sprints:G,columns:J}}})});import{z as QY}from"zod";function eD4($){return aD4.some((Z)=>$[Z]!==void 0)}function $L4($,Z){let X=[];for(let{field:G,action:J}of sD4){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 ZL4($,Z){if($!==Y8)return!1;if(!Z)return!1;return Z.assigneeId!==Y8?!0:Z.status==="todo"}function QL4($,Z,X,Q){let Y=$!==void 0&&XL4.has($),G=Z!==void 0&&ZY(Z,Q);return X&&Y&&G}function Zr0($,Z){return $!==void 0&&wo0($)&&!Z}var sD4,aD4,XL4,pC;var IL0=D(()=>{v5();M0();R9();e3();iK();Lt0();wN();BX();eO();z5();uo0();Pg();YJ();sD4=[{field:"status",action:"status_changed"},{field:"assigneeId",action:"assignee_changed"},{field:"priority",action:"priority_changed"},{field:"type",action:"type_changed"},{field:"dueDate",action:"due_date_changed"},{field:"title",action:"title_changed"},{field:"sprintId",action:"sprint_changed"}],aD4=["title","description","status","priority","type","assigneeId","repo","dueDate","sortOrder","sprintId","tagIds"];XL4=new Set(["approved","merged","post_deploy_validation","done","archived"]);pC=u({name:"TASK_BOARD_ITEM_UPDATE",description:"Update a task board item's fields (title, description, status, priority, assignee), and/or link a chat thread to it.",annotations:{title:"Update Task Board Item",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:QY.object({id:QY.string(),title:QY.string().min(1).max(TD0).optional(),description:QY.string().max(AD0).nullable().optional(),status:KN.optional(),priority:CC.optional(),type:$t.optional(),assigneeId:QY.string().nullable().optional(),repo:QY.string().max(RD0).nullable().optional(),dueDate:QY.string().datetime().nullable().optional(),sortOrder:QY.number().optional(),sprintId:QY.string().nullable().optional(),tagIds:QY.array(QY.string()).max(1000).optional(),linkThreadId:QY.string().optional(),prUrl:QY.string().nullable().optional().describe("GitHub pull request URL to link to this task, e.g. https://github.com/owner/repo/pull/123. Pass it after opening a PR for an existing card; linking one is what starts its review.")}),outputSchema:QY.object({item:Ng}),handler:async($,Z)=>{t(Z),await Z.access.check();let X=Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");let Q=$.prUrl?WD($.prUrl):null;if($.prUrl&&!Q)throw Error(`Not a GitHub pull request URL: ${$.prUrl} (expected https://github.com/<owner>/<repo>/pull/<number>)`);if($.sprintId){if(!(await Z.storage.sprints.listByOrg(X)).some((U)=>U.id===$.sprintId))throw Error("sprintId is not a sprint on this board")}if($.assigneeId)await ID0(Z,X,$.assigneeId);if($.linkThreadId){if(!await Z.storage.taskBoard.getById($.id,X))throw Error(`Task board item not found: ${$.id}`);if(!await Z.storage.threads.get($.linkThreadId))throw Error(`Thread not found: ${$.linkThreadId}`);await Z.storage.taskBoard.linkThread($.id,$.linkThreadId,X)}let Y=eD4($),G=Y?await Z.storage.taskBoard.getById($.id,X):null;if(Y&&!G)throw Error(`Task board item not found: ${$.id}`);let J=await j5(Z,X);if($.status!==void 0)await zD0(J,$.status);if($.status!==void 0&&wo0($.status)){let N=await Z.storage.organizationSettings.get(X);if(Zr0($.status,dZ(N?.flags,"delivery_lanes_enabled")))throw Error("Delivery lanes are not enabled for this organization \u2014 enable "+"them in Settings before moving a task to Approved, Merged, or Post-deploy Validation.")}let W=JN.getStore()!==void 0;if(QL4($.status,G??void 0,W,(await J.lanes()).review))throw Error("This task is under review \u2014 a run can't move it to Done or Archived. "+"Leave it for the reviewer; only a person, or TASK_BOARD_REVIEW_DECISION on a reviewer's own run, closes out a task under review.");let K=$.assigneeId!==void 0&&$.assigneeId!==(G?.assigneeId??null),H=ZL4($.assigneeId,G);if(G&&uQ(G)){if($.title!==void 0||$.description!==void 0||$.priority!==void 0)throw Error("This task was generated from your report and can't be edited \u2014 create your own task instead.");if(H)await qy(Z,G,RO())}if($.tagIds!==void 0){let N=await Z.storage.tags.listOrgTags(X),U=new Set(N.map((B)=>B.id));for(let B of $.tagIds)if(!U.has(B))throw Error(`Tag not found: ${B}`);await Z.storage.taskBoard.setItemTags($.id,$.tagIds,o0(Z))}let F;if(Y)F=await Z.storage.taskBoard.update($.id,X,{title:$.title,description:$.description,status:H?"todo":$.status,...$.status!==void 0||H?{boardColumnOrg:J.columnOwner()}:{},priority:$.priority,type:$.type,assigneeId:$.assigneeId,assignedBy:K?$.assigneeId?o0(Z):null:void 0,repo:$.repo,dueDate:$.dueDate,sortOrder:$.sortOrder,sprintId:$.sprintId},o0(Z));else{let N=await Z.storage.taskBoard.getById($.id,X);if(!N)throw Error(`Task board item not found: ${$.id}`);F=N}if(Q)await Z.storage.taskBoard.linkPr({taskBoardItemId:F.id,organizationId:X,url:Q.url,prNumber:Q.number,repoOwner:Q.owner,repoName:Q.repo,connectionId:null});if(G){let N=o0(Z),U=$L4(G,F);if(U.length>0)await HH$(Z,U.map((B)=>({taskBoardItemId:F.id,actorId:N,...B,alsoSubscribe:B.action==="assignee_changed"&&F.assigneeId!==Y8?[F.assigneeId]:void 0})))}if(G&&F.description!==G.description)await Z.storage.notifications.notifyMentions({taskBoardItemId:F.id,organizationId:X,actorId:o0(Z),body:F.description??"",previousBody:G.description});if(Y||$.linkThreadId||Q)x$(X,F);if(H)return await ND(Z,F,{userInitiated:!0}),{item:F};if($.status!==void 0&&G!==null&&G.status!==F.status)F=await jL0(Z,F,{assignedBy:o0(Z),actor:o0(Z)});return{item:F}}})});import{z as qL0}from"zod";var nC;var Xr0=D(()=>{M0();z5();nC=u({name:"TASK_BOARD_ITEM_DELETE",description:"Delete a task board item. A reports-pushed task also dismisses its finding, so the next diagnostic import won't re-create the card.",annotations:{title:"Delete Task Board Item",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:qL0.object({id:qL0.string()}),outputSchema:qL0.object({success:qL0.boolean()}),handler:async($,Z)=>{t(Z),await Z.access.check();let X=Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");if(!await Z.storage.taskBoard.delete($.id,X,o0(Z)??"system"))throw Error(`Task board item not found: ${$.id}`);return EF$(X,$.id),{success:!0}}})});function tC($){if($.length===0)return!1;let Z=new Map;for(let X of $){let Q=`${X.repoOwner}/${X.repoName}`.toLowerCase(),Y=Z.get(Q);if(Y)Y.push(X);else Z.set(Q,[X])}return[...Z.values()].every(YL4)}function YL4($){return $.some((Z)=>Z.merged===!0)&&$.every((Z)=>Z.merged===!0||Z.state==="closed")}async function GL4($,Z,X,Q){let Y=await $.storage.taskBoard.getById(X,Z);if(!Y||Y.status!=="done")return!1;let G=await $.storage.taskBoard.listPrs(X,Z),J=await Promise.all(G.map(async(F)=>({...F,...await Q($,Z,F)})));if(!tC(J))return!1;let W=await j5($,Z),K=await W.archiveColumn();if(!K)return!1;let H=await $.storage.taskBoard.update(X,Z,BJ(W,K),Y.updatedBy);return await A6($,{taskBoardItemId:X,action:"status_changed",actorId:null,data:{from:"done",to:K,reason:"merged_pr_auto_archive"}}),x$(Z,H),!0}async function qF$($,Z,X,Q=kL0){let Y=0;for(let G of X)try{if(await GL4($,Z,G,Q))Y+=1}catch(J){console.error(`[task-board-archive] ${G} failed`,J)}return{archived:Y}}function ML0($){let Z=new Map;for(let{id:X,organizationId:Q}of $){let Y=Z.get(Q);if(Y)Y.push(X);else Z.set(Q,[X])}return[...Z].map(([X,Q])=>({organizationId:X,itemIds:Q}))}var Mg=D(()=>{v5();BX();JG();z5()});function VL0($){return $.replace(/\/api\/[^/\s)]+\/fs\/([^/\s)]+)\/read\?path=([^)\s]+)/g,(Z,X,Q)=>{let Y,G;try{Y=decodeURIComponent(X),G=decodeURIComponent(Q)}catch{return Z}let J=(W)=>W.startsWith("/")||W.split("/").includes("..");if(J(Y)||J(G))return Z;return xK(Y,G)})}function SL0($,Z){return Z===$?null:"The image and file links in that description are real paths in this sandbox, not URLs \u2014 `Read` them. A screenshot the task points at is usually the clearest statement of what it wants."}var Qr0=D(()=>{sE()});function JL4($){let Z=new Map($.map((G)=>[G.id,G])),X=new Map;for(let G of Hg($)){let J=MF$(G.owner,G.repo);X.set(J,[...X.get(J)??[],G])}if(X.size!==1)return null;let Q=[...X.values()][0],Y=Q.find((G)=>{let J=Z.get(G.connectionId);return J?SE(J):!1})??Q[0];return{connectionId:Y.connectionId,owner:Y.owner,name:Y.repo,installationId:Y.installationId,url:`https://github.com/${Y.owner}/${Y.repo}`}}async function CL0($,Z){if(!da())return console.warn(`[task-board] claude-code skipped for org ${Z}: `+"hosted sandbox unavailable \u2014 running Decopilot"),null;try{let{items:X}=await $.storage.connections.list(Z,{slug:"mcp-github"}),Q=JL4(X);if(Q)return{repo:Q};let Y=new Map;for(let J of Hg(X)){let W=MF$(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 kF$($,Z,X){let Q=["You've been assigned this task. Complete it and finish with a pull request if it makes sense (like a coding task) or is explicitly requested.","","You are running AUTONOMOUSLY \u2014 no human is watching, so drive this to "+"completion yourself. Make reasonable decisions and move on; do not stop to ask for confirmation.","",`Title: ${$.title}`];if($.description){let Y=VL0($.description);Q.push("","Description:",Y);let G=SL0($.description,Y);if(G)Q.push("",G)}if(Q.push("",Z?`The repository ${Z.owner}/${Z.name} is already cloned at your working directory, on its own branch. \`git\` and \`gh\` are authenticated. ${mp}`:["Your working directory is EMPTY: this organization has several repositories, so nothing has been cloned yet. FIRST call `mcp__studio__TASK_ADD_REPO` with the connectionId of the repository this task is about. It clones that repository into your working directory and waits for the checkout, so once it returns the repository is there on its own branch and `git` and `gh` are authenticated. Do not read files, run `git`, or run `gh` before it returns; there is nothing there yet.","","Repositories in this organization:",...(X?.repoChoices??[]).map((Y)=>`- ${Y.repo} (connectionId: ${Y.connectionId})`),X?.repoChoices?.length?"Start with the one the task is about. If it turns out to need a change in "+"another of them too, call `mcp__studio__TASK_ADD_REPO` again \u2014 repositories "+"accumulate, so a second call adds a checkout beside the first rather than replacing it. Each lands in its own directory and keeps its own git remote, so open one pull request per repository you changed.":"Call `mcp__studio__TASK_ADD_REPO` with no arguments to list them."].join(`
|
|
@@ -2978,7 +2978,7 @@ Respond with the structured verdict and a short reason.`,Yd$;var Jd$=D(()=>{c4()
|
|
|
2978
2978
|
${G.join(`
|
|
2979
2979
|
`)}`:Y}function LB6($){let Z=new Set;for(let X of $)for(let Q of X.split(`
|
|
2980
2980
|
`)){let Y=Q.trim();if(/^Co-authored-by:\s/i.test(Y))Z.add(Y)}return[...Z]}var ld$=200,JB6=12,KB6,FB6=300,YX1=3;var GX1=D(()=>{QL();bT0();KB6={aheadBy:0,behindBy:0,files:[]}});function EB6($){if(!$||$.includes(".."))return!1;return wB6.test($)}function dd$($){let Z=typeof $.__resolveType==="string"?$.__resolveType:null;if(!Z||!EB6(Z))return null;let{__resolveType:X,...Q}=$;return{resolveType:Z,payload:Q}}function md$($,Z){return`${$.replace(/\/+$/,"")}/deco/invoke/${Z}`}var wB6;var id$=D(()=>{wB6=/^[\w./@-]+$/});function _a($,Z){let X=$?.githubRepo;if(!X?.owner||!X?.name)return null;if(!X.connectionId)return X;if(!Z.includes(X.connectionId))return null;return X}async function pd$($,Z,X,Q){if(!Q.connectionId)throw new kv("Push requires a connected GitHub account. Connect mcp-github for this project and restart the sandbox.");let Y=$.organization?.id;if(!Y)throw new kv(K9);await lO({ctx:$,connectionId:Q.connectionId,organizationId:Y,forceRefresh:!0,onLegacyMintError:(F)=>{let N=F instanceof Error?F.message:K9;throw new kv(N)}});let{cloneUrl:G,gitUserName:J,gitUserEmail:W}=await bK(Q.connectionId,Q.owner,Q.name,$.db,$.vault).catch((F)=>{let{code:N,message:U}=D9$(F instanceof Error?F.message:String(F));throw N?new kv(U):F}),K=Yl($),H=await Z.proxyDaemonRequest(X,"/_sandbox/config",{method:"PUT",headers:new Headers({"content-type":"application/json"}),body:JSON.stringify({git:{repository:{cloneUrl:G},identity:{userName:J,userEmail:W}},...K?{operator:K}:{}})});if(!H.ok){let F=await uO(H,jB6).catch(()=>H.statusText);throw Error(`Failed to refresh sandbox git credentials (${H.status}): ${F}`)}}var jB6=10485760,kv;var JX1=D(()=>{HJ();RT0();Pn();ci0();dy();kv=class kv extends Error{constructor($){super($);this.name="GitPushAuthError"}}});function PB6($){let Z=$.startsWith("thread:")?$.slice(7):$;if(!Z||Z.length>255||Z.includes("..")||Z.startsWith("/")||Z.endsWith("/")||Z.endsWith(".lock")||!zB6.test(Z))throw Error(`Invalid branch name: ${$}`)}function Vv($){return AbortSignal.any([$.req.raw.signal,AbortSignal.timeout(TB6)])}async function IB6($,Z){let X=$.var.studioContext,Q=WJ(Z.branch),Y=$.req.query("thread")??Q,G=Y&&Y===Q?Z.branchThread:Y?await X.storage.threads.get(Y).catch(()=>null):null,J=G?.virtual_mcp_id===Z.virtualMcpId?G:null,W=kC(J?.metadata?.runtime);if(W)return W;let K=UD0(Z.virtualMcpMetadata),H=K==="cms"?await u71(X,{claimName:Z.claimName}):"alive",F=K==="cms"&&H!=="alive"?"cms":"sandbox",N=!!J&&(H==="gone"||H==="alive"&&K==="cms");if(N&&J)sn(X,J.id,F);if(K==="cms")console.log("sandbox proxy: no runtime stamp",{route:$.req.path,method:$.req.method,reason:J?"unstamped":"threadless",liveness:H,resolved:F,stamped:N});return F}async function qB6($){let Z=$.get("vmClaim");if(Z.runner)return Z.runner;try{return await WQ($.var.studioContext)}catch{return null}}function Sv($){let{runner:Z}=$.get("vmClaim");if(!Z)return $.json({error:"No sandbox runner configured"},503);return Z}async function Hl($){let{virtualMcpMetadata:Z,connectionIds:X}=$.get("vmClaim"),Q=$.var.studioContext,Y=_a(Z,X);if(!Y)throw new h4(404,"AUTH","repo","Project has no GitHub repository");let G=n(Q);return IT0(Q,G.id,Y)}function WX1($,Z){if(Z instanceof kA0)return $.json({error:Z.message},429,{...T5,...Z.retryAfterMs===null?{}:{"Retry-After":String(Math.ceil(Z.retryAfterMs/1000))}});if(Z instanceof h4){let Q=Z.status===404?404:Z.status===409||Z.status===422?409:502;return $.json({error:Z.message},Q,T5)}let X=Z instanceof Error?Z.message:String(Z);return $.json({error:X},502,T5)}async function od$($,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 rd$($){try{let Z=await Hl($),X=await xT0(Z,$.get("vmClaim").branch);return $.json(X,200,T5)}catch(Z){return WX1($,Z)}}function va($,Z){let Q=(hT0.get($)??Promise.resolve()).catch(()=>{}).then(Z),Y=Q.catch(()=>{});return hT0.set($,Y),Y.finally(()=>{if(hT0.get($)===Y)hT0.delete($)}),Q}async function X7($,Z,X){if(!X?.runner&&$.get("vmClaim").runtime==="cms")return $.json({error:"sandbox not found: this session is sandbox-less"},404,T5);let Q=X?.runner??Sv($);if(Q instanceof Response)return Q;let{claimName:Y,userId:G,projectRef:J}=$.get("vmClaim"),W=X?.method??"POST",K=null,H=new Headers;if(X?.jsonBody!==void 0)K=X.jsonBody,H.set("content-type","application/json");else if(X?.forwardJsonBody)K=await $.req.text(),H.set("content-type","application/json");let F=X?.signal,N={method:W,headers:H,body:K,...F?{signal:F}:{}},U=async()=>{let B=await Q.proxyDaemonRequest(Y,Z,N);if(X?.map404to410&&B.status===404){try{await B.body?.cancel()}catch{}if(await Q.adoptLiveClaim({userId:G,projectRef:J},Y))B=await Q.proxyDaemonRequest(Y,Z,N);if(B.status===404){try{await B.body?.cancel()}catch{}return new Response(JSON.stringify({error:"Sandbox handle is gone. The sandbox needs to be re-provisioned."}),{status:410,headers:{"content-type":"application/json",...T5}})}}let O=await B.text(),L=X?.redactRepoDir?MB6(O):O,w=B.headers.get("content-type")??"application/json";return new Response(L,{status:B.status,headers:{"content-type":w,...T5}})};try{if(F){let B=U();return B.catch(()=>{}),await Promise.race([B,new Promise((L,w)=>{if(F.aborted)return w(F.reason);F.addEventListener("abort",()=>w(F.reason),{once:!0})})])}return await U()}catch(B){let O=B instanceof Error?B.message:String(B);return $.json({error:`Daemon unreachable: ${O}`},502)}}function MB6($){try{let Z=JSON.parse($);if(Z&&typeof Z==="object"&&!Array.isArray(Z)&&"repoDir"in Z)return JSON.stringify({...Z,repoDir:null})}catch{}return $}async function uT0($,Z,X,Q="GET",Y){let G=await $.proxyDaemonRequest(Z,X,{method:Q,headers:new Headers,body:null});if(G.status===404&&Y){try{await G.body?.cancel()}catch{}if(await $.adoptLiveClaim(Y,Z))G=await $.proxyDaemonRequest(Z,X,{method:Q,headers:new Headers,body:null})}if(G.status===404){try{await G.body?.cancel()}catch{}throw Error("SANDBOX_GONE")}let J=await G.text();if(!G.ok){let W=`Daemon error (${G.status})`;try{W=JSON.parse(J).error??W}catch{}throw Error(W)}return JSON.parse(J)}function kB6($){return sd$.includes($)}var zB6,nd$=524288,AB6=65536,TB6=1e4,td$=2000,RB6,hT0,T5,sd$,ad$=()=>{let $=new K1;$.use("/:virtualMcpId/:branch/*",RB6),$.post("/:virtualMcpId/:branch/write",(X)=>X7(X,"/_sandbox/write",{forwardJsonBody:!0,signal:Vv(X)})),$.post("/:virtualMcpId/:branch/unlink",(X)=>X7(X,"/_sandbox/unlink",{forwardJsonBody:!0,signal:Vv(X)})),$.post("/:virtualMcpId/:branch/mkdir",(X)=>X7(X,"/_sandbox/mkdir",{forwardJsonBody:!0,signal:Vv(X)})),$.post("/:virtualMcpId/:branch/rename",(X)=>X7(X,"/_sandbox/rename",{forwardJsonBody:!0,signal:Vv(X)})),$.post("/:virtualMcpId/:branch/read",(X)=>X7(X,"/_sandbox/read",{forwardJsonBody:!0,signal:Vv(X)})),$.post("/:virtualMcpId/:branch/glob",(X)=>X7(X,"/_sandbox/glob",{forwardJsonBody:!0,signal:Vv(X)})),$.post("/:virtualMcpId/:branch/grep",(X)=>X7(X,"/_sandbox/grep",{forwardJsonBody:!0,signal:Vv(X)})),$.post("/:virtualMcpId/:branch/exec/:script",async(X)=>{let Q=X.req.param("script");if(!Q)return X.json({error:"missing script name"},400);return X7(X,`/_sandbox/exec/${encodeURIComponent(Q)}`)}),$.post("/:virtualMcpId/:branch/exec/:script/kill",async(X)=>{let Q=X.req.param("script");if(!Q)return X.json({error:"missing script name"},400);return X7(X,`/_sandbox/exec/${encodeURIComponent(Q)}/kill`)}),$.get("/:virtualMcpId/:branch/config",(X)=>X7(X,"/_sandbox/config",{method:"GET",map404to410:!0,redactRepoDir:!0})),$.put("/:virtualMcpId/:branch/config",(X)=>X7(X,"/_sandbox/config",{method:"PUT",forwardJsonBody:!0,map404to410:!0})),$.post("/:virtualMcpId/:branch/setup/:step",async(X)=>{let Q=X.req.param("step");if(!Q||!kB6(Q))return X.json({error:`step must be one of: ${sd$.join(", ")}`},400);let Y=X.get("vmClaim"),G=await u71(X.var.studioContext,{claimName:Y.claimName})==="gone"?null:await qB6(X);if(!G)return X.json({error:"sandbox not found: nothing is running at this ref"},404,T5);if(Q==="start"){let J=n(X.var.studioContext),W=ly(Y.virtualMcpMetadata);try{await k70({ctx:X.var.studioContext,runner:G,handle:Y.claimName,orgId:J.id,userId:Y.callerUserId,entries:W})}catch(K){let H=K instanceof Error?K.message:String(K);return X.json({error:`Failed to push env to daemon: ${H}`},502)}}return X7(X,`/_sandbox/setup/${Q}`,{signal:X.req.raw.signal,map404to410:!0,runner:G})}),$.get("/:virtualMcpId/:branch/events",(X)=>{let Q=X.get("vmClaim");if(!Q.runner)return $U(X,async(Y)=>{await Y.writeSSE({event:"phase",data:JSON.stringify({kind:"failed",reason:"unknown",message:"No sandbox runner configured on this studio instance."})})});return ac$(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 rd$(X);return Z(X)});let Z=(X)=>X7(X,"/_sandbox/git/status",{method:"GET",map404to410:!0,signal:AbortSignal.any([X.req.raw.signal,AbortSignal.timeout(td$)])});return $.post("/:virtualMcpId/:branch/git/status",(X)=>{if(X.get("vmClaim").runtime==="cms")return rd$(X);return X7(X,"/_sandbox/git/status",{map404to410:!0,signal:AbortSignal.any([X.req.raw.signal,AbortSignal.timeout(td$)])})}),$.post("/:virtualMcpId/:branch/git/diff",async(X)=>{let Q=X.get("vmClaim");if(Q.runtime==="cms")try{let Y=await X.req.json().catch(()=>({})),G=await Hl(X),J=await yT0(G,Q.branch,Y.base);return X.json(J,200,T5)}catch(Y){return WX1(X,Y)}return X7(X,"/_sandbox/git/diff",{forwardJsonBody:!0,map404to410:!0})}),$.post("/:virtualMcpId/:branch/git/publish",async(X)=>{if(X.get("vmClaim").runtime==="cms")return X.json({ok:!0},200,T5);let Q=Sv(X);if(Q instanceof Response)return Q;let{claimName:Y,virtualMcpMetadata:G,connectionIds:J}=X.get("vmClaim"),W=X.var.studioContext;return va(Y,async()=>{try{await l71(W,Q,Y);let K=_a(G,J);if(K)await pd$(W,Q,Y,K)}catch(K){if(K instanceof kv)return X.json({error:K.message},403,T5);let H=K instanceof Error?K.message:String(K);return X.json({error:H},502,T5)}return X7(X,"/_sandbox/git/publish",{forwardJsonBody:!0,map404to410:!0})})}),$.post("/:virtualMcpId/:branch/git/discard",async(X)=>{let Q=X.get("vmClaim");if(Q.runtime==="cms")return va(Q.claimName,async()=>{let Y=await X.req.json().catch(()=>({})),G=Array.isArray(Y.filepaths)?Y.filepaths.filter((J)=>typeof J==="string"):[];if(G.length===0)return X.json({error:"filepaths is required"},400,T5);try{let J=await Hl(X);return await cd$(J,Q.branch,G),X.json({ok:!0},200,T5)}catch(J){let W=J instanceof h4&&J.status===409?409:502,K=J instanceof Error?J.message:String(J);return X.json({error:K},W,T5)}});return va(Q.claimName,()=>X7(X,"/_sandbox/git/discard",{forwardJsonBody:!0,map404to410:!0}))}),$.post("/:virtualMcpId/:branch/git/rebase",async(X)=>{let Q=X.get("vmClaim");if(Q.runtime==="cms")return va(Q.claimName,async()=>{try{let W=await X.req.json().catch(()=>({})),K=await Hl(X),H=W.base??await K.getDefaultBranch();return await gT0(K,Q.branch,H),X.json({ok:!0},200,T5)}catch(W){return WX1(X,W)}});let Y=Sv(X);if(Y instanceof Response)return Y;let{claimName:G}=X.get("vmClaim"),J=X.var.studioContext;return va(G,async()=>{try{await l71(J,Y,G)}catch(W){let K=W instanceof Error?W.message:String(W);return X.json({error:K},502,T5)}return X7(X,"/_sandbox/git/rebase",{forwardJsonBody:!0,map404to410:!0})})}),$.post("/:virtualMcpId/:branch/git/suggest-commit",o5({maxSize:nd$,onError:(X)=>X.json({error:"Payload too large"},413,T5)}),async(X)=>{let Q=X.get("vmClaim"),Y=null;if(Q.runtime!=="cms"){let H=Sv(X);if(H instanceof Response)return H;Y=H}let{claimName:G,userId:J,projectRef:W}=Q,K=X.var.studioContext;try{let H=await X.req.json().catch(()=>({})),F=H.status,N=H.diff,U=N!=null&&typeof N.diffs==="object"&&N.diffs!==null,[B,O]=m71(F)&&U?[F,N]:Y?await Promise.all([uT0(Y,G,"/_sandbox/git/status","GET",{userId:J,projectRef:W}),uT0(Y,G,"/_sandbox/git/diff","GET",{userId:J,projectRef:W})]):await(async()=>{let w=await Hl(X);return Promise.all([xT0(w,Q.branch),yT0(w,Q.branch)])})(),L=await Qd$(K,B,O);return X.json(L,200,T5)}catch(H){let F=H instanceof Error?H.message:String(H);if(F==="SANDBOX_GONE")return X.json({error:"Sandbox handle is gone. The sandbox needs to be re-provisioned."},410,T5);return X.json({error:F},502,T5)}}),$.post("/:virtualMcpId/:branch/git/judge-review",o5({maxSize:nd$,onError:(X)=>X.json({error:"Payload too large"},413,T5)}),async(X)=>{let Q=X.get("vmClaim"),Y=null;if(Q.runtime!=="cms"){let H=Sv(X);if(H instanceof Response)return H;Y=H}let{claimName:G,userId:J,projectRef:W}=Q,K=X.var.studioContext;try{let H=await X.req.json().catch(()=>({})),F=H.status,N=H.diff,U=N!=null&&typeof N.diffs==="object"&&N.diffs!==null,[B,O]=m71(F)&&U?[F,N]:Y?await Promise.all([uT0(Y,G,"/_sandbox/git/status","GET",{userId:J,projectRef:W}),uT0(Y,G,"/_sandbox/git/diff","GET",{userId:J,projectRef:W})]):await(async()=>{let w=await Hl(X);return Promise.all([xT0(w,Q.branch),yT0(w,Q.branch)])})(),L=await Gd$(K,B,O,typeof H.language==="string"?H.language:void 0);return X.json(L,200,T5)}catch(H){let F=H instanceof Error?H.message:String(H);if(F==="SANDBOX_GONE")return X.json({error:"Sandbox handle is gone. The sandbox needs to be re-provisioned."},410,T5);return X.json({error:F},502,T5)}}),$.get("/:virtualMcpId/:branch/preview-fetch",async(X)=>{let Q=Sv(X);if(Q instanceof Response)return Q;let{claimName:Y}=X.get("vmClaim"),G=X.req.query("path");if(!G||!G.startsWith("/")||G.startsWith("//")||G.includes("..")||G.includes("\\"))return X.json({error:"Path not allowed"},403);let J;try{J=await Q.getPreviewUrl(Y)}catch{return X.json({error:"Preview not available"},502)}if(!J)return X.json({error:"Preview not available"},502);let W=J.replace(/\/+$/,"");return od$(X,`${W}${G}`)}),$.post("/:virtualMcpId/:branch/preview-invoke",o5({maxSize:AB6,onError:(X)=>X.json({error:"Payload too large"},413)}),async(X)=>{let Q=Sv(X);if(Q instanceof Response)return Q;let{claimName:Y}=X.get("vmClaim"),G;try{G=await Q.getPreviewUrl(Y)}catch{return X.json({error:"Preview not available"},502)}if(!G)return X.json({error:"Preview not available"},502);let J;try{J=await X.req.json()}catch{return X.json({error:"Invalid JSON body"},400)}if(!J||typeof J!=="object"||Array.isArray(J))return X.json({error:"Invalid JSON body"},400);let W=dd$(J);if(!W)return X.json({error:"Invalid or missing __resolveType"},400);let K=md$(G,W.resolveType);return od$(X,K,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(W.payload),signal:AbortSignal.timeout(30000)})}),$};var ed$=D(()=>{Q8();MH();Ql();h71();Ln();oc$();n3();Jg();rc$();a3();sc$();ec$();hi0();jn();n71();Jd$();o71();QL();GX1();id$();JX1();zB6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;RB6=TT0(async($,Z)=>{let X=$.var.studioContext;try{t(X)}catch{return $.json({error:"Unauthorized"},401)}let Q=o0(X);if(!Q)return $.json({error:"Unauthorized"},401);let Y;try{Y=n(X)}catch{return $.json({error:"Organization scope required"},403)}let G=$.req.param("virtualMcpId"),J=$.req.param("branch");if(!G||!J)return $.json({error:"virtualMcpId and branch are required"},400);try{PB6(J)}catch(L){let w=L instanceof Error?L.message:String(L);return $.json({error:w},400)}let W=await X.storage.virtualMcps.findById(G);if(!W||W.organization_id!==Y.id)return $.json({error:"Virtual MCP not found"},404);let K=On({orgId:Y.id,virtualMcpId:G,branch:J}),H=await vi0(X,J),F=fi0(H,Q),N=tc$({userId:F,projectRef:K}),U=W.metadata??null,B=await IB6($,{claimName:N,branch:J,virtualMcpId:G,sandboxUserId:F,virtualMcpMetadata:U,branchThread:H});if(B==="cms")return $.set("vmClaim",{claimName:N,callerUserId:Q,runner:null,virtualMcpId:G,branch:J,userId:F,projectRef:K,virtualMcpMetadata:U,connectionIds:W.connections?.map((L)=>L.connection_id)??[],runtime:B}),Z();let O;try{O=await WQ(X)}catch{O=null}if(!O)return $.json({error:"No sandbox runner found"},404);return $.set("vmClaim",{claimName:N,callerUserId:Q,runner:O,virtualMcpId:G,branch:J,userId:F,projectRef:K,virtualMcpMetadata:U,connectionIds:W.connections?.map((L)=>L.connection_id)??[],runtime:B}),Z()});hT0=new Map;T5={"Cache-Control":"no-store, no-cache, must-revalidate",Pragma:"no-cache"};sd$=["clone","install","start"]});function $m$($,Z,X){let Q=KX1.get($);if(!Q)Q={pending:null,running:!1},KX1.set($,Q);if(!Q.pending)Q.pending={set:new Map,del:new Set,deps:Z,resolvers:[],rejecters:[]};let Y=Q.pending;Y.deps=Z;for(let[J,W]of Object.entries(X.set??{}))Y.set.set(J,W),Y.del.delete(J);for(let J of X.delete??[])Y.del.add(J),Y.set.delete(J);let G=new Promise((J,W)=>{Y.resolvers.push(J),Y.rejecters.push(W)});if(!Q.running)SB6($,Q);return G}async function SB6($,Z){Z.running=!0;try{while(Z.pending){let X=Z.pending;Z.pending=null;try{let Q=await CB6(X);for(let Y of X.resolvers)Y(Q)}catch(Q){for(let Y of X.rejecters)Y(Q)}}}finally{if(Z.running=!1,!Z.pending)KX1.delete($)}}async function CB6($){let{client:Z,branch:X,packagePath:Q}=$.deps;for(let Y=0;;Y++){let G=await Kl(Z,X),J=await Z.getCommitTreeSha(G),W=await Z.getDecofileTree(J,Q),K=XX1(W,Q),H=[],F=new Map(K.map((O)=>[O.path,{stem:O.stem,sha:O.sha}]));for(let[O,L]of $.set){let w=QX1(K,O),E=`${JSON.stringify(L,null,2)}
|
|
2981
|
-
`,j=await Z.createBlob(E);await gd$(Z.owner,Z.repo,j,E);let z=w[0]??`${fT0(Q)}/${s71(O)}.json`;H.push({path:z,mode:"100644",type:"blob",sha:j});let A=z.slice(z.lastIndexOf("/")+1,-5);F.set(z,{stem:A,sha:j,content:E});for(let P of w.slice(1))H.push({path:P,mode:"100644",type:"blob",sha:null}),F.delete(P)}for(let O of $.del)for(let L of QX1(K,O))H.push({path:L,mode:"100644",type:"blob",sha:null}),F.delete(L);if(H.length===0)return G;let N=Q?`${Q}/.deco/blocks.gen.json`:".deco/blocks.gen.json";if(W.some((O)=>O.type==="blob"&&O.path===N)){let O=await Promise.all([...F.values()].map(async(j)=>({stem:j.stem,content:j.content??await Z.getBlobText(j.sha)}))),{decofile:L,skipped:w}=ka(O);if(w.length>0)console.warn("decofile gen: dropped blocks that were not valid JSON",{repo:`${Z.owner}/${Z.repo}`,branch:X,packagePath:Q,blocks:w.map((j)=>j.key)});let E=await Z.createBlob(L);H.push({path:N,mode:"100644",type:"blob",sha:E})}let U=await Z.createTree(J,H),B=await Z.createCommit({message:_B6($),treeSha:U,parentShas:[G]});try{return await Z.updateRef(X,B),B}catch(O){if(!(O instanceof h4&&O.status===422)||Y>=VB6-1)throw O;await w$(G7(2000,200,Y,2,0.5))}}}function _B6($){let Z=(Y)=>{let G=Y.slice(0,3).join(", ");return Y.length>3?`${G} (+${Y.length-3} more)`:G},X=[];if($.set.size>0)X.push(`update ${Z([...$.set.keys()])}`);if($.del.size>0)X.push(`delete ${Z([...$.del])}`);let Q=`chore(decofile): ${X.join("; ")}`;return Mi0(Q,$.deps.coAuthor)}var VB6=3,KX1;var Zm$=D(()=>{JD0();MT0();W4();QL();bT0();KX1=new Map});import{createHmac as Xm$,randomBytes as vB6,timingSafeEqual as fB6}from"crypto";function Qm$(){if(lT0)return lT0;let $;try{let Z=C0();$=Z.studioJwtSecret??Z.betterAuthSecret}catch{$=void 0}return lT0=$?Buffer.from($):vB6(32),lT0}function HX1($){let Z=$.nowMs??Date.now(),X={o:$.organizationId,m:$.virtualMcpId,b:$.branch,e:Math.floor((Z+bB6)/1000)},Q=Buffer.from(JSON.stringify(X)).toString("base64url"),Y=Xm$("sha256",Qm$()).update(Q).digest("base64url");return`${Q}.${Y}`}function Ym$($,Z){let X=$.indexOf(".");if(X<0)return!1;let Q=$.slice(0,X),Y=Buffer.from($.slice(X+1)),G=Buffer.from(Xm$("sha256",Qm$()).update(Q).digest("base64url"));if(Y.length!==G.length||!fB6(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 bB6=21600000,lT0=null;var Gm$=D(()=>{E$()});import{z as Fl}from"zod";function yB6($){return $.length>0&&$.length<=255&&!$.includes("..")&&!$.endsWith("/")&&!$.endsWith(".lock")&&xB6.test($)}function Fm$($){return $.req.header("x-forwarded-host")??new URL($.req.url).host}async function fa($){let Z=$.get("decofileScope");return IT0($.var.studioContext,Z.organizationId,Z.githubRepo)}function ba($,Z){if(Z instanceof h4){let Q=Z.status===404?404:Z.status===409?409:Z.status===422?409:502;return $.json({error:Z.message},Q)}let X=Z instanceof Error?Z.message:String(Z);return $.json({error:X},500)}function Nm$(){let $=new K1;return $.use("/:virtualMcpId/:branch",Hm$),$.use("/:virtualMcpId/:branch/*",Hm$),$.get("/:virtualMcpId/:branch",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await fa(Z),Y=await hd$(Q,X.branch,X.packagePath,{createBranchIfMissing:!!X.userId}),G={ETag:`"${Y.sha}"`,"Cache-Control":"no-store","Access-Control-Allow-Origin":"*"};if(Z.req.header("if-none-match")===`"${Y.sha}"`)return Z.body(null,304,G);if(!X.userId)return Z.body(Y.decofile,200,{...G,"content-type":"application/json"});let J=HX1({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.body(`{"version":${JSON.stringify(Y.sha)},"token":${JSON.stringify(J)},"apiHost":${JSON.stringify(Fm$(Z))},"decofile":${Y.decofile}}`,200,{...G,"content-type":"application/json"})}catch(Q){return ba(Z,Q)}}),$.get("/:virtualMcpId/:branch/meta",async(Z)=>{let X=Z.get("decofileScope"),Q=X.packagePath?`${X.packagePath}/.deco/meta.gen.json`:".deco/meta.gen.json";try{let Y=await fa(Z),G=await Y.getFileTextAtRef(X.branch,Q);if(G===null){let J=await Y.getDefaultBranch();if(J!==X.branch)G=await Y.getFileTextAtRef(J,Q)}if(G===null)return Z.json({error:"meta.gen.json not committed"},404);return Z.body(G,200,{"content-type":"application/json","Cache-Control":"no-store","Access-Control-Allow-Origin":"*"})}catch(Y){return ba(Z,Y)}}),$.patch("/:virtualMcpId/:branch",hB6,async(Z)=>{let X=Z.get("decofileScope"),Q=Z.var.studioContext,Y=uB6.safeParse(await Z.req.json().catch(()=>null));if(!Y.success)return Z.json({error:"Invalid body",details:Y.error.issues},400);let G=Y.data;for(let J of[...Object.keys(G.set??{}),...G.delete??[]])try{qT0(J)}catch(W){let K=W instanceof Error?W.message:String(W);return Z.json({error:K},400)}for(let[J,W]of Object.entries(G.set??{})){if(typeof W!=="object"||W===null||Array.isArray(W))return Z.json({error:`Block "${J}" must be a JSON object`},400);if(r71(J))return Z.json({error:`Block key "${J}" collides with a framework resolver module and cannot be written`},400)}try{let J=await fa(Z),W=await $m$(`${X.organizationId}/${X.virtualMcpId}/${X.branch}`,{client:J,branch:X.branch,packagePath:X.packagePath,coAuthor:Yl(Q)},G),K=HX1({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.json({version:W,token:K,apiHost:Fm$(Z)})}catch(J){return ba(Z,J)}}),$.post("/:virtualMcpId/:branch/publish",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await fa(Z),Y=await Q.getDefaultBranch();if(Y===X.branch)return Z.json({error:"Branch is already the default branch"},400);let G=`chore(decofile): publish ${X.branch}`;try{let J;try{J=await Q.mergeBranch(Y,X.branch,G)}catch(W){if(!(W instanceof h4&&W.status===409))throw W;await gT0(Q,X.branch,Y),J=await Q.mergeBranch(Y,X.branch,G)}return J?Z.json({result:"merged",sha:J}):Z.json({result:"up-to-date"})}catch(J){if(J instanceof h4&&J.status===409)return Z.json({error:"merge-conflict"},409);if(J instanceof h4&&J.status===405){let K=await Q.findOpenPullRequest(Y,X.branch)??await Q.createPullRequest({base:Y,head:X.branch,title:`Publish ${X.branch}`});return Z.json({result:"pull-request",number:K.number,url:K.html_url})}throw J}}catch(Q){return ba(Z,Q)}}),$.get("/:virtualMcpId/:branch/status",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await fa(Z),Y=await Q.getDefaultBranch();if(Y===X.branch)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0,lastCommitAt:null});try{let[{aheadBy:G,behindBy:J},W]=await Promise.all([Q.compare(Y,X.branch),Q.getBranchHead(X.branch)]);return Z.json({baseBranch:Y,aheadBy:G,behindBy:J,lastCommitAt:W.committedAt})}catch(G){if(G instanceof h4&&G.status===404)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0,lastCommitAt:null});throw G}}catch(Q){return ba(Z,Q)}}),$}var xB6,Jm$=500,Wm$=1048576,Km$=1024,gB6=8388608,hB6,uB6,Hm$;var Um$=D(()=>{Ht0();MT0();Q8();MH();h71();RT0();JX1();o71();Zm$();Gm$();GX1();QL();bT0();xB6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;hB6=o5({maxSize:gB6,onError:($)=>$.json({error:"Payload too large"},413)}),uB6=Fl.object({set:Fl.record(Fl.string(),Fl.unknown()).optional(),delete:Fl.array(Fl.string()).optional()}).refine(($)=>Object.keys($.set??{}).length>0||($.delete?.length??0)>0,{message:"Patch must set or delete at least one block"}).refine(($)=>Object.keys($.set??{}).length+($.delete?.length??0)<=Jm$,{message:`Patch cannot touch more than ${Jm$} blocks`}).refine(($)=>Object.values($.set??{}).every((Z)=>JSON.stringify(Z).length<=Wm$),{message:`Each block must be at most ${Wm$} bytes`}).refine(($)=>[...Object.keys($.set??{}),...$.delete??[]].every((Z)=>Z.length<=Km$),{message:`Each block key must be at most ${Km$} characters`}),Hm$=TT0(async($,Z)=>{let X=$.var.studioContext,Q=X.organization;if(!Q)return $.json({error:"Organization scope required"},500);let Y=$.req.param("virtualMcpId"),G=$.req.param("branch");if(!Y||!G)return $.json({error:"virtualMcpId and branch are required"},400);if(!yB6(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||!Ym$(B,{organizationId:Q.id,virtualMcpId:Y,branch:G}))return $.json({error:"Unauthorized"},401)}let W=await X.storage.virtualMcps.findById(Y);if(!W||W.organization_id!==Q.id)return $.json({error:"Virtual MCP not found"},404);let K=W.metadata??null;if(!ND0(K))return $.json({error:"Project has no preview server configured"},404);let F=W.connections?.map((B)=>B.connection_id)??[],N=_a(K,F);if(!N)return $.json({error:"Project has no GitHub repository"},404);let U=K?.runtime;return $.set("decofileScope",{organizationId:Q.id,virtualMcpId:Y,branch:G,packagePath:U?.path?.replace(/^\/+|\/+$/g,"")||null,githubRepo:N,userId:J}),Z()})});var Bm$=($)=>{let Z=new K1;if(Z.use("*",Ev),Z.route("/",gA0()),Z.route("/",Vh$()),Z.route("/",bc$()),Z.route("/",_c$()),Z.route("/",zT0()),Z.route("/tools",cc$()),Z.route("/",hc$()),Z.route("/",Nc$({kvStorage:$.kvStorage})),Z.route("/",Hc$()),Z.route("/fs",Ic$({getConnection:$.getNatsConnection})),Z.route("/sandbox",ad$()),Z.route("/decofile",Nm$()),Z.route("/",Vc$()),Z.route("/deco-sites",uA0()),Z.route("/hosting",Eh$()),Z.route("/monitor",Ih$()),Z.route("/sso",_A0()),Z.route("/",PT0({tokenStorage:$.tokenStorage,automationEventDispatcher:$.automationEventDispatcher})),Z.route("/webhooks",Nh$()),$.mountDevAssets)Z.route("/dev-assets",dA0({orgFromPath:!0}));return Z.use("/mcp/:connectionId?",$.mcpAuth),Z.use("/mcp/:connectionId/ui-resource",$.mcpAuth),Z.use("/mcp/gateway/:virtualMcpId?",$.mcpAuth),Z.use("/mcp/virtual-mcp/:virtualMcpId?",$.mcpAuth),Z.use("/mcp/self",$.mcpAuth),Z.use("/mcp/task-run/:threadId",$.mcpAuth),Z.route("/",_x$()),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",Mc$()),Z.route("/mcp",cw0()),Z.route("/mcp/self",jT0()),Z.route("/mcp",iw0()),Z.all("/oauth-proxy/:connectionId/*",$.oauthProxyHandler),Z.get("/watch",$.watchHandler),Z};var Om$=D(()=>{Q8();GZ1();Uh$();HZ1();jh$();qh$();mA0();$a();QZ1();Fc$();Uc$();qc$();Wo();s91();pw0();_71();kc$();Sc$();vc$();xc$();uc$();f71();dc$();b71();dw0();ed$();Um$()});function lB6($){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 cB6=async($,Z)=>{if(!$.get("studioContext").auth.user?.id)return $.json({error:"Unauthorized"},401);return Z()},Dm$=()=>{let $=new K1;return $.use("*",cB6),$.get("/",async(Z)=>{let X=C0(),Q=X.decoSupabaseUrl,Y=X.decoSupabaseServiceKey;if(!Q||!Y)return Z.json({apps:[]});try{let G=await Z7(Q,Y,"apps?select=name,title,description,logo,category,vendors(alias,url)");return Z.json({apps:lB6(G)})}catch(G){return console.error("[deco-apps] GET error:",G),Z.json({error:"Failed to fetch apps"},502)}}),$};var Lm$=D(()=>{Q8();E$();xP0()});import{z as k1}from"zod";function vH($,Z="invalid_request_error",X=null,Q=null){return{error:{message:$,type:Z,param:X,code:Q}}}function aB6($){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 eB6($,Z,X){try{return JSON.parse($)}catch{throw new jm$(`Invalid JSON in tool call arguments for function '${X}' (tool_call_id: ${Z}): ${$}`)}}function $O6($){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:eB6(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 ZO6($){let Z=$.map((X)=>{let Q=X.function.parameters?sY(X.function.parameters):sY({type:"object",properties:{}});return[X.function.name,u$({description:X.function.description,inputSchema:Q})]});return Object.fromEntries(Z)}function XO6($){if(!$)return;return{openai:{response_format:$}}}function QO6(){return`chatcmpl-${crypto.randomUUID().replace(/-/g,"").substring(0,29)}`}function wm$($,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 Em$($){if($==="tool-calls")return"tool_calls";if($==="length")return"length";return"stop"}var dB6=256,mB6,iB6,pB6,nB6,tB6,oB6,rB6,sB6,jm$,zm$,Pm$;var Am$=D(()=>{c4();Q8();Ql();vN();mB6=k1.object({type:k1.literal("function"),function:k1.object({name:k1.string(),description:k1.string().optional(),parameters:k1.record(k1.string(),k1.unknown()).optional()})}),iB6=k1.object({id:k1.string(),type:k1.literal("function"),function:k1.object({name:k1.string(),arguments:k1.string()})}),pB6=k1.discriminatedUnion("role",[k1.object({role:k1.literal("system"),content:k1.string(),name:k1.string().optional()}),k1.object({role:k1.literal("user"),content:k1.union([k1.string(),k1.array(k1.union([k1.object({type:k1.literal("text"),text:k1.string()}),k1.object({type:k1.literal("image_url"),image_url:k1.object({url:k1.string(),detail:k1.string().optional()})})]))]),name:k1.string().optional()}),k1.object({role:k1.literal("assistant"),content:k1.string().nullable().optional(),name:k1.string().optional(),tool_calls:k1.array(iB6).optional()}),k1.object({role:k1.literal("tool"),content:k1.string(),tool_call_id:k1.string()})]),nB6=k1.object({type:k1.literal("text")}),tB6=k1.object({type:k1.literal("json_object")}),oB6=k1.object({type:k1.literal("json_schema"),json_schema:k1.object({name:k1.string(),description:k1.string().optional(),schema:k1.record(k1.string(),k1.unknown()),strict:k1.boolean().optional()})}),rB6=k1.union([nB6,tB6,oB6]),sB6=k1.object({model:k1.string().describe("Format: 'model_id' or 'credential_id:model_id'"),messages:k1.array(pB6),stream:k1.boolean().optional().default(!1),temperature:k1.number().min(0).max(2).optional(),max_tokens:k1.number().positive().optional(),top_p:k1.number().min(0).max(1).optional(),frequency_penalty:k1.number().min(-2).max(2).optional(),presence_penalty:k1.number().min(-2).max(2).optional(),stop:k1.union([k1.string(),k1.array(k1.string())]).optional(),tools:k1.array(mB6).optional(),tool_choice:k1.union([k1.literal("auto"),k1.literal("none"),k1.literal("required"),k1.object({type:k1.literal("function"),function:k1.object({name:k1.string()})})]).optional(),response_format:rB6.optional(),user:k1.string().optional()});jm$=class jm$ extends Error{constructor($){super($);this.name="MessageConversionError"}};zm$=new K1;zm$.post("/:org/v1/chat/completions",async($)=>{let Z=$.get("studioContext"),X=$.req.param("org");try{if(!Z.auth.apiKey?.id)return $.json(vH("API key authentication required. Provide a valid API key via Authorization header.","authentication_error"),401);if(!Z.organization)return $.json(vH("Organization context is required. Ensure your API key has organization metadata.","invalid_request_error","organization"),400);if((Z.organization.slug??Z.organization.id)!==X)return $.json(vH("Organization mismatch. The API key's organization does not match the requested organization.","invalid_request_error","organization"),403);let Q=await $.req.json(),Y=sB6.safeParse(Q);if(!Y.success){let w=Y.error.issues[0]??{message:"Invalid request",path:[]};return $.json(vH(`Invalid request: ${w.message}`,"invalid_request_error",w.path.length>0?w.path.join("."):null),400)}let G=Y.data,J=aB6(G.model);if(!J)return $.json(vH("Invalid model format. Expected 'model_id' or 'credential_id:model_id' (e.g., 'claude-sonnet-4-6' or 'key_abc123:claude-sonnet-4-6')","invalid_request_error","model"),400);let{credentialId:W}=J,{modelId:K}=J;if(!W){let E=(await Z.storage.aiProviderKeys.list({organizationId:Z.organization.id})).find((j)=>jw(j.providerId));if(!E)return $.json(vH("No AI provider credentials configured for this organization. Add a credential in settings or specify one explicitly via 'credential_id:model_id'.","invalid_request_error","model"),400);W=E.id}let H;try{H=await Z.aiProviders.activate(W,Z.organization.id)}catch{return $.json(vH(`AI provider credential not found or inaccessible: ${W}`,"invalid_request_error","model"),404)}let F=H.aiSdk.languageModel(K),N=$O6(G.messages),U=G.tools?ZO6(G.tools):void 0,B=XO6(G.response_format),O=QO6(),L=Math.floor(Date.now()/1000);if(G.stream)return $U($,async(w)=>{let E=wm$(F,N,U,G,B,$.req.raw.signal);try{let j=bO(E),z=!1,A=0,P="",I=async()=>{if(P.length===0)return;let k=P;P="",await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{content:k},finish_reason:null}]})})};for await(let k of j.fullStream){if(!z&&(k.type==="text-delta"||k.type==="tool-call"))await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{role:"assistant",content:""},finish_reason:null}]})}),z=!0;if(k.type==="text-delta"){if(P+=k.text,P.length>=dB6)await I()}else if(k.type==="tool-call"){await I();let M=A++;await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{tool_calls:[{index:M,id:k.toolCallId,type:"function",function:{name:k.toolName,arguments:JSON.stringify(k.input)}}]},finish_reason:null}]})})}else if(k.type==="finish")await I(),await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{},finish_reason:Em$(k.finishReason)}],usage:k.totalUsage?{prompt_tokens:k.totalUsage.inputTokens??0,completion_tokens:k.totalUsage.outputTokens??0,total_tokens:k.totalUsage.totalTokens??0}:void 0})})}await I(),await w.writeSSE({data:"[DONE]"})}catch(j){let z=j;console.error("[openai-compat:stream] Error:",z.message),await w.writeSSE({data:JSON.stringify({error:{message:z.message,type:"server_error"}})})}});else{let w=wm$(F,N,U,G,B,$.req.raw.signal),E=await vO(w),j={role:"assistant",content:E.text||null};if(E.toolCalls&&E.toolCalls.length>0)j.tool_calls=E.toolCalls.map((z)=>({id:z.toolCallId,type:"function",function:{name:z.toolName,arguments:JSON.stringify("input"in z?z.input:{})}})),j.content=null;return $.json({id:O,object:"chat.completion",created:L,model:G.model,choices:[{index:0,message:j,finish_reason:Em$(E.finishReason)}],usage:{prompt_tokens:E.usage?.inputTokens??0,completion_tokens:E.usage?.outputTokens??0,total_tokens:E.usage?.totalTokens??0}})}}catch(Q){let Y=Q;if(Y.name==="AbortError")return $.json(vH("Request aborted","invalid_request_error"),400);if(Y.name==="MessageConversionError")return $.json(vH(Y.message,"invalid_request_error","messages"),400);return console.error("[openai-compat] Error:",Y.message,Y.stack),$.json(vH(Y.message,"server_error"),500)}});Pm$=zm$});function YO6($){if(typeof $!=="object"||$===null)return!1;let X=$.githubRepo?.url;return typeof X==="string"&&X.length>0}function Tm$(){let $=new K1;return $.use("*",async(Z,X)=>{await X(),Z.header("Cache-Control","private, no-store"),Z.header("Vary","Cookie")}),$.get("/",async(Z)=>{let X=Z.get("studioContext"),Q=o0(X);if(!Q)return Z.json({error:"Authentication required"},401);let G=(Z.req.query("site")??"").trim().toLowerCase();if(!XJ(G))return Z.json({error:"Invalid site slug"},400);let J=await X.db.selectFrom("member").innerJoin("organization","organization.id","member.organizationId").select(["organization.id as id","organization.slug as slug","organization.name as name","organization.metadata as metadata"]).where("member.userId","=",Q).execute(),W=[];for(let H of J){if(!H.slug||hZ(H))continue;let F=await X.storage.virtualMcps.list(H.id);for(let N of F){if(pe1(N)!==G)continue;if(!YO6(N.metadata))continue;W.push({orgSlug:H.slug,orgName:H.name??H.slug,project:{id:N.id,title:N.title,icon:N.icon??null}})}}let K={matches:W};return Z.json(K)}),$}var Rm$=D(()=>{Q8();DO()});var qm$;var Im$=D(()=>{qm$={name:"decocms",version:"4.315.4",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 WO6(){let $=process.env.POSTHOG_KEY;if(!$)return null;return{key:$,host:process.env.POSTHOG_HOST??JO6}}var Mm$,JO6="https://ph.studio.decocms.com",km$;var Vm$=D(()=>{Q8();J90();aC();Q9();E$();c91();Im$();Mm$=new K1;Mm$.get("/",($)=>{let Z={version:qm$.version,theme:Kp1(),..._F().logo&&{logo:_F().logo},...zN()&&{internalUrl:g_1()},...C0().enableDecoImport&&{enableDecoImport:!0},brandExtractEnabled:!!C0().firecrawlApiKey,hostingEnabled:!!C0().controlplaneRestUrl&&!!C0().controlplaneServiceToken,hostingControlPlaneGa:C0().hostingControlPlaneGa,monitorEnabled:!!C0().clickhouseAnalyticsUrl&&!!C0().clickhouseAnalyticsPassword,monitorGa:C0().monitorGa,auth:Pg$(),posthog:WO6(),googleMapsApiKey:process.env.GOOGLE_MAPS_API_KEY?.trim()||null,runtime:{agentSandbox:da()}};return $.header("Cache-Control","no-store"),$.json({success:!0,config:Z})});km$=Mm$});function Nl($){let Z=($??"").trim().toLowerCase();return Z=Z.replace(/^https?:\/\//,""),Z=Z.replace(/^www\./,""),Z=Z.split(/[/?#]/)[0]??"",Z.replace(/\/+$/,"")}function FX1($){return(Nl($).split(".")[0]||$).replace(/[-_]/g," ").split(" ").filter(Boolean).map((X)=>X.charAt(0).toUpperCase()+X.slice(1)).join(" ")}function Cm$($,Z=64){return`https://www.google.com/s2/favicons?domain=${encodeURIComponent(Nl($))}&sz=${Z}`}function Sm$($,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 _m$($){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()?Sm$(`${Y.trim().replace(/\s+/g," ")} \u2014 ${J}`,200):Sm$(`How does ${X} really perform? ${J}`,200);return{title:G,description:W}}import{z as c0}from"zod";var Cv,KO6,HO6,FO6,NO6,vm$;var fm$=D(()=>{Cv=c0.enum(["good","bad","neutral"]),KO6=c0.preprocess(($)=>{if(Array.isArray($))return{kind:"text",value:$.find((X)=>X!==null&&typeof X!=="object")??""};return $!==null&&typeof $==="object"?$:{kind:"text",value:$}},c0.object({kind:c0.enum(["text","number","sparkline","badge","score"]).catch("text"),value:c0.coerce.string().optional(),tone:Cv.optional(),muted:c0.boolean().optional(),delta:c0.coerce.string().optional(),deltaDir:c0.enum(["up","down","neutral"]).optional(),points:c0.array(c0.coerce.number()).optional(),label:c0.coerce.string().optional()}).transform(($)=>{if($.kind==="badge"&&$.label==null)$.label=$.value??"";if($.kind==="score"){let Z=Number($.value);if(Number.isNaN(Z))return{...$,kind:"text"}}return $})),HO6=c0.preprocess(($)=>{let Z=$;if(Z&&typeof Z==="object"&&!Array.isArray(Z)&&Array.isArray(Z.cells))Z=Z.cells;if(Array.isArray(Z)&&Z.length===1&&Array.isArray(Z[0]))Z=Z[0];if(Array.isArray(Z))return Z;if(Z&&typeof Z==="object")return Object.values(Z);return Z},c0.array(KO6)),FO6={key:c0.coerce.string(),title:c0.coerce.string(),eyebrow:c0.coerce.string().optional(),headline:c0.coerce.string(),annotation:c0.coerce.string().optional(),methodology:c0.coerce.string().optional(),sources:c0.array(c0.object({name:c0.coerce.string(),logoUrl:c0.coerce.string()})).optional()},NO6=c0.discriminatedUnion("template",[c0.object({template:c0.literal("cover"),score:c0.object({value:c0.coerce.number(),max:c0.coerce.number().optional(),grade:c0.coerce.string().optional(),label:c0.coerce.string().optional()}).optional(),brandImage:c0.coerce.string().optional(),screenshot:c0.coerce.string().optional(),mobileScreenshot:c0.coerce.string().optional()}),c0.object({template:c0.literal("cta"),ctaUrl:c0.coerce.string().optional(),ctaLabel:c0.coerce.string().optional(),bullets:c0.array(c0.coerce.string()).optional()}),c0.object({template:c0.literal("series"),points:c0.array(c0.coerce.number()).min(2),xLabels:c0.array(c0.coerce.string()).min(1),unit:c0.coerce.string().optional(),callout:c0.object({index:c0.coerce.number(),value:c0.coerce.string(),tone:Cv.optional()})}),c0.object({template:c0.literal("threshold"),value:c0.coerce.string().default(""),metricLabel:c0.coerce.string().optional(),ratio:c0.coerce.number(),thresholdRatio:c0.coerce.number().optional(),thresholdLabel:c0.coerce.string().default(""),tone:Cv.optional()}),c0.object({template:c0.literal("stats"),stats:c0.array(c0.object({value:c0.coerce.string(),label:c0.coerce.string(),tone:Cv.optional()})).min(1)}),c0.object({template:c0.literal("bars"),items:c0.array(c0.object({value:c0.coerce.string(),label:c0.coerce.string(),ratio:c0.coerce.number(),tone:Cv.optional()})).min(1)}),c0.object({template:c0.literal("gauges"),gauges:c0.array(c0.object({label:c0.coerce.string(),value:c0.coerce.string(),status:c0.enum(["good","warn","bad"]).catch("warn"),caption:c0.coerce.string().optional(),ratio:c0.coerce.number().optional()})).min(1)}),c0.object({template:c0.literal("checklist"),checks:c0.array(c0.object({label:c0.coerce.string(),status:c0.enum(["pass","fail","warn"]).catch("fail"),value:c0.coerce.string().optional()})).min(1)}),c0.object({template:c0.literal("table"),columns:c0.array(c0.object({label:c0.coerce.string(),align:c0.enum(["left","right"]).optional()})).min(1),rows:c0.array(HO6).min(1),highlightRow:c0.coerce.number().optional()}),c0.object({template:c0.literal("products"),products:c0.array(c0.object({name:c0.coerce.string(),price:c0.coerce.string().optional(),image:c0.coerce.string().optional(),url:c0.coerce.string().optional()})).min(1)}),c0.object({template:c0.literal("list"),entries:c0.array(c0.object({label:c0.coerce.string(),severity:c0.enum(["error","warning","notice"]).catch("notice")})).min(1),moreCount:c0.coerce.number().optional()}),c0.object({template:c0.literal("keywords"),volumeLabel:c0.coerce.string().optional(),keywords:c0.array(c0.object({term:c0.coerce.string(),volume:c0.coerce.string(),position:c0.coerce.number().catch(0)})).min(1)}),c0.object({template:c0.literal("competitor"),metricLabel:c0.coerce.string().optional(),competitors:c0.array(c0.object({name:c0.coerce.string(),value:c0.coerce.string(),tone:Cv.optional(),isYou:c0.boolean().optional()})).min(1)}),c0.object({template:c0.literal("scorecard"),rivalLabel:c0.coerce.string().optional(),dimensions:c0.array(c0.object({label:c0.coerce.string(),you:c0.coerce.string(),rival:c0.coerce.string().optional(),rivalName:c0.coerce.string().optional(),tone:Cv.optional()})).min(1)})]),vm$=c0.object({...FO6,template:NO6})});function cT0($){let Z=[],X=[...$.sections].sort((Y,G)=>Y.position-G.position).map((Y)=>{let G=vm$.safeParse(Y.props);if(G.success)return G.data;let J=G.error.issues[0];return Z.push({section_type:Y.section_type,position:Y.position,reason:J?`${J.path.join(".")||"(root)"}: ${J.message}`:"contract violation"}),null}).filter((Y)=>Y!==null),Q=X.filter((Y)=>Y.template.template!=="cover"&&Y.template.template!=="cta").map((Y)=>({key:Y.key,title:Y.title}));return{deck:{meta:{...$.meta,scores:$.summary?.scores,scannedAt:$.scanned_at,toc:Q},slides:X},drops:Z}}var NX1=D(()=>{fm$()});import{join as bm$}from"path";async function BO6($){try{let Z=await fetch(`${LK({})}/api/v2/public/diagnostics/${encodeURIComponent($)}`,{headers:{Accept:"application/json"},signal:AbortSignal.timeout(UO6)});if(!Z.ok)return null;let X=await Z.json(),{deck:Q}=cT0(X);if(!Q.slides.length)return null;let Y=Q.slides.find((W)=>W.template.template==="cover"),G=Y?.template,J=G&&G.template==="cover"?G:void 0;return{brand:Q.meta.brand?.trim()||FX1($),score:Q.meta.scores?.cover??J?.score?.value,verdict:Y?.annotation?.trim()||Y?.headline?.trim()||void 0}}catch{return null}}function PG($){return $.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function OO6($,Z){let X=Nl($),Q=Z?.brand?.trim()||FX1(X),Y=Cm$(X,128),J=`${(C0().baseUrl??"https://studio.decocms.com").replace(/\/+$/,"")}/report/${encodeURIComponent(X)}`,{title:W,description:K}=_m$({brand:Q,domain:X,score:Z?.score,verdict:Z?.verdict}),H=`${J}/og.png`,F=`${Q} commerce report by decocms`;return[`<title>${PG(W)}</title>`,`<meta name="description" content="${PG(K)}" />`,'<meta name="robots" content="noindex, follow" />','<meta property="og:type" content="website" />','<meta property="og:site_name" content="decocms" />',`<meta property="og:title" content="${PG(W)}" />`,`<meta property="og:description" content="${PG(K)}" />`,`<meta property="og:url" content="${PG(J)}" />`,`<meta property="og:image" content="${PG(H)}" />`,'<meta property="og:image:width" content="1200" />','<meta property="og:image:height" content="630" />',`<meta property="og:image:alt" content="${PG(F)}" />`,'<meta name="twitter:card" content="summary_large_image" />',`<meta name="twitter:title" content="${PG(W)}" />`,`<meta name="twitter:description" content="${PG(K)}" />`,`<meta name="twitter:image" content="${PG(H)}" />`,`<meta name="twitter:image:alt" content="${PG(F)}" />`,`<link rel="canonical" href="${PG(J)}" />`,`<link rel="icon" href="${PG(Y)}" sizes="any" />`].join(`
|
|
2981
|
+
`,j=await Z.createBlob(E);await gd$(Z.owner,Z.repo,j,E);let z=w[0]??`${fT0(Q)}/${s71(O)}.json`;H.push({path:z,mode:"100644",type:"blob",sha:j});let A=z.slice(z.lastIndexOf("/")+1,-5);F.set(z,{stem:A,sha:j,content:E});for(let P of w.slice(1))H.push({path:P,mode:"100644",type:"blob",sha:null}),F.delete(P)}for(let O of $.del)for(let L of QX1(K,O))H.push({path:L,mode:"100644",type:"blob",sha:null}),F.delete(L);if(H.length===0)return G;let N=Q?`${Q}/.deco/blocks.gen.json`:".deco/blocks.gen.json";if(W.some((O)=>O.type==="blob"&&O.path===N)){let O=await Promise.all([...F.values()].map(async(j)=>({stem:j.stem,content:j.content??await Z.getBlobText(j.sha)}))),{decofile:L,skipped:w}=ka(O);if(w.length>0)console.warn("decofile gen: dropped blocks that were not valid JSON",{repo:`${Z.owner}/${Z.repo}`,branch:X,packagePath:Q,blocks:w.map((j)=>j.key)});let E=await Z.createBlob(L);H.push({path:N,mode:"100644",type:"blob",sha:E})}let U=await Z.createTree(J,H),B=await Z.createCommit({message:_B6($),treeSha:U,parentShas:[G]});try{return await Z.updateRef(X,B),B}catch(O){if(!(O instanceof h4&&O.status===422)||Y>=VB6-1)throw O;await w$(G7(2000,200,Y,2,0.5))}}}function _B6($){let Z=(Y)=>{let G=Y.slice(0,3).join(", ");return Y.length>3?`${G} (+${Y.length-3} more)`:G},X=[];if($.set.size>0)X.push(`update ${Z([...$.set.keys()])}`);if($.del.size>0)X.push(`delete ${Z([...$.del])}`);let Q=`chore(decofile): ${X.join("; ")}`;return Mi0(Q,$.deps.coAuthor)}var VB6=3,KX1;var Zm$=D(()=>{JD0();MT0();W4();QL();bT0();KX1=new Map});import{createHmac as Xm$,randomBytes as vB6,timingSafeEqual as fB6}from"crypto";function Qm$(){if(lT0)return lT0;let $;try{let Z=C0();$=Z.studioJwtSecret??Z.betterAuthSecret}catch{$=void 0}return lT0=$?Buffer.from($):vB6(32),lT0}function HX1($){let Z=$.nowMs??Date.now(),X={o:$.organizationId,m:$.virtualMcpId,b:$.branch,e:Math.floor((Z+bB6)/1000)},Q=Buffer.from(JSON.stringify(X)).toString("base64url"),Y=Xm$("sha256",Qm$()).update(Q).digest("base64url");return`${Q}.${Y}`}function Ym$($,Z){let X=$.indexOf(".");if(X<0)return!1;let Q=$.slice(0,X),Y=Buffer.from($.slice(X+1)),G=Buffer.from(Xm$("sha256",Qm$()).update(Q).digest("base64url"));if(Y.length!==G.length||!fB6(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 bB6=21600000,lT0=null;var Gm$=D(()=>{E$()});import{z as Fl}from"zod";function yB6($){return $.length>0&&$.length<=255&&!$.includes("..")&&!$.endsWith("/")&&!$.endsWith(".lock")&&xB6.test($)}function Fm$($){return $.req.header("x-forwarded-host")??new URL($.req.url).host}async function fa($){let Z=$.get("decofileScope");return IT0($.var.studioContext,Z.organizationId,Z.githubRepo)}function ba($,Z){if(Z instanceof h4){let Q=Z.status===404?404:Z.status===409?409:Z.status===422?409:502;return $.json({error:Z.message},Q)}let X=Z instanceof Error?Z.message:String(Z);return $.json({error:X},500)}function Nm$(){let $=new K1;return $.use("/:virtualMcpId/:branch",Hm$),$.use("/:virtualMcpId/:branch/*",Hm$),$.get("/:virtualMcpId/:branch",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await fa(Z),Y=await hd$(Q,X.branch,X.packagePath,{createBranchIfMissing:!!X.userId}),G={ETag:`"${Y.sha}"`,"Cache-Control":"no-store","Access-Control-Allow-Origin":"*"};if(Z.req.header("if-none-match")===`"${Y.sha}"`)return Z.body(null,304,G);if(!X.userId)return Z.body(Y.decofile,200,{...G,"content-type":"application/json"});let J=HX1({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.body(`{"version":${JSON.stringify(Y.sha)},"token":${JSON.stringify(J)},"apiHost":${JSON.stringify(Fm$(Z))},"decofile":${Y.decofile}}`,200,{...G,"content-type":"application/json"})}catch(Q){return ba(Z,Q)}}),$.get("/:virtualMcpId/:branch/meta",async(Z)=>{let X=Z.get("decofileScope"),Q=X.packagePath?`${X.packagePath}/.deco/meta.gen.json`:".deco/meta.gen.json";try{let Y=await fa(Z),G=await Y.getFileTextAtRef(X.branch,Q);if(G===null){let J=await Y.getDefaultBranch();if(J!==X.branch)G=await Y.getFileTextAtRef(J,Q)}if(G===null)return Z.json({error:"meta.gen.json not committed"},404);return Z.body(G,200,{"content-type":"application/json","Cache-Control":"no-store","Access-Control-Allow-Origin":"*"})}catch(Y){return ba(Z,Y)}}),$.patch("/:virtualMcpId/:branch",hB6,async(Z)=>{let X=Z.get("decofileScope"),Q=Z.var.studioContext,Y=uB6.safeParse(await Z.req.json().catch(()=>null));if(!Y.success)return Z.json({error:"Invalid body",details:Y.error.issues},400);let G=Y.data;for(let J of[...Object.keys(G.set??{}),...G.delete??[]])try{qT0(J)}catch(W){let K=W instanceof Error?W.message:String(W);return Z.json({error:K},400)}for(let[J,W]of Object.entries(G.set??{})){if(typeof W!=="object"||W===null||Array.isArray(W))return Z.json({error:`Block "${J}" must be a JSON object`},400);if(r71(J))return Z.json({error:`Block key "${J}" collides with a framework resolver module and cannot be written`},400)}try{let J=await fa(Z),W=await $m$(`${X.organizationId}/${X.virtualMcpId}/${X.branch}`,{client:J,branch:X.branch,packagePath:X.packagePath,coAuthor:Yl(Q)},G),K=HX1({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.json({version:W,token:K,apiHost:Fm$(Z)})}catch(J){return ba(Z,J)}}),$.post("/:virtualMcpId/:branch/publish",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await fa(Z),Y=await Q.getDefaultBranch();if(Y===X.branch)return Z.json({error:"Branch is already the default branch"},400);let G=`chore(decofile): publish ${X.branch}`;try{let J;try{J=await Q.mergeBranch(Y,X.branch,G)}catch(W){if(!(W instanceof h4&&W.status===409))throw W;await gT0(Q,X.branch,Y),J=await Q.mergeBranch(Y,X.branch,G)}return J?Z.json({result:"merged",sha:J}):Z.json({result:"up-to-date"})}catch(J){if(J instanceof h4&&J.status===409)return Z.json({error:"merge-conflict"},409);if(J instanceof h4&&J.status===405){let K=await Q.findOpenPullRequest(Y,X.branch)??await Q.createPullRequest({base:Y,head:X.branch,title:`Publish ${X.branch}`});return Z.json({result:"pull-request",number:K.number,url:K.html_url})}throw J}}catch(Q){return ba(Z,Q)}}),$.get("/:virtualMcpId/:branch/status",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await fa(Z),Y=await Q.getDefaultBranch();if(Y===X.branch)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0,lastCommitAt:null});try{let[{aheadBy:G,behindBy:J},W]=await Promise.all([Q.compare(Y,X.branch),Q.getBranchHead(X.branch)]);return Z.json({baseBranch:Y,aheadBy:G,behindBy:J,lastCommitAt:W.committedAt})}catch(G){if(G instanceof h4&&G.status===404)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0,lastCommitAt:null});throw G}}catch(Q){return ba(Z,Q)}}),$}var xB6,Jm$=500,Wm$=1048576,Km$=1024,gB6=8388608,hB6,uB6,Hm$;var Um$=D(()=>{Ht0();MT0();Q8();MH();h71();RT0();JX1();o71();Zm$();Gm$();GX1();QL();bT0();xB6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;hB6=o5({maxSize:gB6,onError:($)=>$.json({error:"Payload too large"},413)}),uB6=Fl.object({set:Fl.record(Fl.string(),Fl.unknown()).optional(),delete:Fl.array(Fl.string()).optional()}).refine(($)=>Object.keys($.set??{}).length>0||($.delete?.length??0)>0,{message:"Patch must set or delete at least one block"}).refine(($)=>Object.keys($.set??{}).length+($.delete?.length??0)<=Jm$,{message:`Patch cannot touch more than ${Jm$} blocks`}).refine(($)=>Object.values($.set??{}).every((Z)=>JSON.stringify(Z).length<=Wm$),{message:`Each block must be at most ${Wm$} bytes`}).refine(($)=>[...Object.keys($.set??{}),...$.delete??[]].every((Z)=>Z.length<=Km$),{message:`Each block key must be at most ${Km$} characters`}),Hm$=TT0(async($,Z)=>{let X=$.var.studioContext,Q=X.organization;if(!Q)return $.json({error:"Organization scope required"},500);let Y=$.req.param("virtualMcpId"),G=$.req.param("branch");if(!Y||!G)return $.json({error:"virtualMcpId and branch are required"},400);if(!yB6(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||!Ym$(B,{organizationId:Q.id,virtualMcpId:Y,branch:G}))return $.json({error:"Unauthorized"},401)}let W=await X.storage.virtualMcps.findById(Y);if(!W||W.organization_id!==Q.id)return $.json({error:"Virtual MCP not found"},404);let K=W.metadata??null;if(!ND0(K))return $.json({error:"Project has no preview server configured"},404);let F=W.connections?.map((B)=>B.connection_id)??[],N=_a(K,F);if(!N)return $.json({error:"Project has no GitHub repository"},404);let U=K?.runtime;return $.set("decofileScope",{organizationId:Q.id,virtualMcpId:Y,branch:G,packagePath:U?.path?.replace(/^\/+|\/+$/g,"")||null,githubRepo:N,userId:J}),Z()})});var Bm$=($)=>{let Z=new K1;if(Z.use("*",Ev),Z.route("/",gA0()),Z.route("/",Vh$()),Z.route("/",bc$()),Z.route("/",_c$()),Z.route("/",zT0()),Z.route("/tools",cc$()),Z.route("/",hc$()),Z.route("/",Nc$({kvStorage:$.kvStorage})),Z.route("/",Hc$()),Z.route("/fs",Ic$({getConnection:$.getNatsConnection})),Z.route("/sandbox",ad$()),Z.route("/decofile",Nm$()),Z.route("/",Vc$()),Z.route("/deco-sites",uA0()),Z.route("/hosting",Eh$()),Z.route("/monitor",Ih$()),Z.route("/sso",_A0()),Z.route("/",PT0({tokenStorage:$.tokenStorage,automationEventDispatcher:$.automationEventDispatcher})),Z.route("/webhooks",Nh$()),$.mountDevAssets)Z.route("/dev-assets",dA0({orgFromPath:!0}));return Z.use("/mcp/:connectionId?",$.mcpAuth),Z.use("/mcp/:connectionId/ui-resource",$.mcpAuth),Z.use("/mcp/gateway/:virtualMcpId?",$.mcpAuth),Z.use("/mcp/virtual-mcp/:virtualMcpId?",$.mcpAuth),Z.use("/mcp/self",$.mcpAuth),Z.use("/mcp/task-run/:threadId",$.mcpAuth),Z.route("/",_x$()),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",Mc$()),Z.route("/mcp",cw0()),Z.route("/mcp/self",jT0()),Z.route("/mcp",iw0()),Z.all("/oauth-proxy/:connectionId/*",$.oauthProxyHandler),Z.get("/watch",$.watchHandler),Z};var Om$=D(()=>{Q8();GZ1();Uh$();HZ1();jh$();qh$();mA0();$a();QZ1();Fc$();Uc$();qc$();Wo();s91();pw0();_71();kc$();Sc$();vc$();xc$();uc$();f71();dc$();b71();dw0();ed$();Um$()});function lB6($){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 cB6=async($,Z)=>{if(!$.get("studioContext").auth.user?.id)return $.json({error:"Unauthorized"},401);return Z()},Dm$=()=>{let $=new K1;return $.use("*",cB6),$.get("/",async(Z)=>{let X=C0(),Q=X.decoSupabaseUrl,Y=X.decoSupabaseServiceKey;if(!Q||!Y)return Z.json({apps:[]});try{let G=await Z7(Q,Y,"apps?select=name,title,description,logo,category,vendors(alias,url)");return Z.json({apps:lB6(G)})}catch(G){return console.error("[deco-apps] GET error:",G),Z.json({error:"Failed to fetch apps"},502)}}),$};var Lm$=D(()=>{Q8();E$();xP0()});import{z as k1}from"zod";function vH($,Z="invalid_request_error",X=null,Q=null){return{error:{message:$,type:Z,param:X,code:Q}}}function aB6($){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 eB6($,Z,X){try{return JSON.parse($)}catch{throw new jm$(`Invalid JSON in tool call arguments for function '${X}' (tool_call_id: ${Z}): ${$}`)}}function $O6($){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:eB6(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 ZO6($){let Z=$.map((X)=>{let Q=X.function.parameters?sY(X.function.parameters):sY({type:"object",properties:{}});return[X.function.name,u$({description:X.function.description,inputSchema:Q})]});return Object.fromEntries(Z)}function XO6($){if(!$)return;return{openai:{response_format:$}}}function QO6(){return`chatcmpl-${crypto.randomUUID().replace(/-/g,"").substring(0,29)}`}function wm$($,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 Em$($){if($==="tool-calls")return"tool_calls";if($==="length")return"length";return"stop"}var dB6=256,mB6,iB6,pB6,nB6,tB6,oB6,rB6,sB6,jm$,zm$,Pm$;var Am$=D(()=>{c4();Q8();Ql();vN();mB6=k1.object({type:k1.literal("function"),function:k1.object({name:k1.string(),description:k1.string().optional(),parameters:k1.record(k1.string(),k1.unknown()).optional()})}),iB6=k1.object({id:k1.string(),type:k1.literal("function"),function:k1.object({name:k1.string(),arguments:k1.string()})}),pB6=k1.discriminatedUnion("role",[k1.object({role:k1.literal("system"),content:k1.string(),name:k1.string().optional()}),k1.object({role:k1.literal("user"),content:k1.union([k1.string(),k1.array(k1.union([k1.object({type:k1.literal("text"),text:k1.string()}),k1.object({type:k1.literal("image_url"),image_url:k1.object({url:k1.string(),detail:k1.string().optional()})})]))]),name:k1.string().optional()}),k1.object({role:k1.literal("assistant"),content:k1.string().nullable().optional(),name:k1.string().optional(),tool_calls:k1.array(iB6).optional()}),k1.object({role:k1.literal("tool"),content:k1.string(),tool_call_id:k1.string()})]),nB6=k1.object({type:k1.literal("text")}),tB6=k1.object({type:k1.literal("json_object")}),oB6=k1.object({type:k1.literal("json_schema"),json_schema:k1.object({name:k1.string(),description:k1.string().optional(),schema:k1.record(k1.string(),k1.unknown()),strict:k1.boolean().optional()})}),rB6=k1.union([nB6,tB6,oB6]),sB6=k1.object({model:k1.string().describe("Format: 'model_id' or 'credential_id:model_id'"),messages:k1.array(pB6),stream:k1.boolean().optional().default(!1),temperature:k1.number().min(0).max(2).optional(),max_tokens:k1.number().positive().optional(),top_p:k1.number().min(0).max(1).optional(),frequency_penalty:k1.number().min(-2).max(2).optional(),presence_penalty:k1.number().min(-2).max(2).optional(),stop:k1.union([k1.string(),k1.array(k1.string())]).optional(),tools:k1.array(mB6).optional(),tool_choice:k1.union([k1.literal("auto"),k1.literal("none"),k1.literal("required"),k1.object({type:k1.literal("function"),function:k1.object({name:k1.string()})})]).optional(),response_format:rB6.optional(),user:k1.string().optional()});jm$=class jm$ extends Error{constructor($){super($);this.name="MessageConversionError"}};zm$=new K1;zm$.post("/:org/v1/chat/completions",async($)=>{let Z=$.get("studioContext"),X=$.req.param("org");try{if(!Z.auth.apiKey?.id)return $.json(vH("API key authentication required. Provide a valid API key via Authorization header.","authentication_error"),401);if(!Z.organization)return $.json(vH("Organization context is required. Ensure your API key has organization metadata.","invalid_request_error","organization"),400);if((Z.organization.slug??Z.organization.id)!==X)return $.json(vH("Organization mismatch. The API key's organization does not match the requested organization.","invalid_request_error","organization"),403);let Q=await $.req.json(),Y=sB6.safeParse(Q);if(!Y.success){let w=Y.error.issues[0]??{message:"Invalid request",path:[]};return $.json(vH(`Invalid request: ${w.message}`,"invalid_request_error",w.path.length>0?w.path.join("."):null),400)}let G=Y.data,J=aB6(G.model);if(!J)return $.json(vH("Invalid model format. Expected 'model_id' or 'credential_id:model_id' (e.g., 'claude-sonnet-4-6' or 'key_abc123:claude-sonnet-4-6')","invalid_request_error","model"),400);let{credentialId:W}=J,{modelId:K}=J;if(!W){let E=(await Z.storage.aiProviderKeys.list({organizationId:Z.organization.id})).find((j)=>jw(j.providerId));if(!E)return $.json(vH("No AI provider credentials configured for this organization. Add a credential in settings or specify one explicitly via 'credential_id:model_id'.","invalid_request_error","model"),400);W=E.id}let H;try{H=await Z.aiProviders.activate(W,Z.organization.id)}catch{return $.json(vH(`AI provider credential not found or inaccessible: ${W}`,"invalid_request_error","model"),404)}let F=H.aiSdk.languageModel(K),N=$O6(G.messages),U=G.tools?ZO6(G.tools):void 0,B=XO6(G.response_format),O=QO6(),L=Math.floor(Date.now()/1000);if(G.stream)return $U($,async(w)=>{let E=wm$(F,N,U,G,B,$.req.raw.signal);try{let j=bO(E),z=!1,A=0,P="",I=async()=>{if(P.length===0)return;let k=P;P="",await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{content:k},finish_reason:null}]})})};for await(let k of j.fullStream){if(!z&&(k.type==="text-delta"||k.type==="tool-call"))await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{role:"assistant",content:""},finish_reason:null}]})}),z=!0;if(k.type==="text-delta"){if(P+=k.text,P.length>=dB6)await I()}else if(k.type==="tool-call"){await I();let M=A++;await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{tool_calls:[{index:M,id:k.toolCallId,type:"function",function:{name:k.toolName,arguments:JSON.stringify(k.input)}}]},finish_reason:null}]})})}else if(k.type==="finish")await I(),await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{},finish_reason:Em$(k.finishReason)}],usage:k.totalUsage?{prompt_tokens:k.totalUsage.inputTokens??0,completion_tokens:k.totalUsage.outputTokens??0,total_tokens:k.totalUsage.totalTokens??0}:void 0})})}await I(),await w.writeSSE({data:"[DONE]"})}catch(j){let z=j;console.error("[openai-compat:stream] Error:",z.message),await w.writeSSE({data:JSON.stringify({error:{message:z.message,type:"server_error"}})})}});else{let w=wm$(F,N,U,G,B,$.req.raw.signal),E=await vO(w),j={role:"assistant",content:E.text||null};if(E.toolCalls&&E.toolCalls.length>0)j.tool_calls=E.toolCalls.map((z)=>({id:z.toolCallId,type:"function",function:{name:z.toolName,arguments:JSON.stringify("input"in z?z.input:{})}})),j.content=null;return $.json({id:O,object:"chat.completion",created:L,model:G.model,choices:[{index:0,message:j,finish_reason:Em$(E.finishReason)}],usage:{prompt_tokens:E.usage?.inputTokens??0,completion_tokens:E.usage?.outputTokens??0,total_tokens:E.usage?.totalTokens??0}})}}catch(Q){let Y=Q;if(Y.name==="AbortError")return $.json(vH("Request aborted","invalid_request_error"),400);if(Y.name==="MessageConversionError")return $.json(vH(Y.message,"invalid_request_error","messages"),400);return console.error("[openai-compat] Error:",Y.message,Y.stack),$.json(vH(Y.message,"server_error"),500)}});Pm$=zm$});function YO6($){if(typeof $!=="object"||$===null)return!1;let X=$.githubRepo?.url;return typeof X==="string"&&X.length>0}function Tm$(){let $=new K1;return $.use("*",async(Z,X)=>{await X(),Z.header("Cache-Control","private, no-store"),Z.header("Vary","Cookie")}),$.get("/",async(Z)=>{let X=Z.get("studioContext"),Q=o0(X);if(!Q)return Z.json({error:"Authentication required"},401);let G=(Z.req.query("site")??"").trim().toLowerCase();if(!XJ(G))return Z.json({error:"Invalid site slug"},400);let J=await X.db.selectFrom("member").innerJoin("organization","organization.id","member.organizationId").select(["organization.id as id","organization.slug as slug","organization.name as name","organization.metadata as metadata"]).where("member.userId","=",Q).execute(),W=[];for(let H of J){if(!H.slug||hZ(H))continue;let F=await X.storage.virtualMcps.list(H.id);for(let N of F){if(pe1(N)!==G)continue;if(!YO6(N.metadata))continue;W.push({orgSlug:H.slug,orgName:H.name??H.slug,project:{id:N.id,title:N.title,icon:N.icon??null}})}}let K={matches:W};return Z.json(K)}),$}var Rm$=D(()=>{Q8();DO()});var qm$;var Im$=D(()=>{qm$={name:"decocms",version:"4.315.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 WO6(){let $=process.env.POSTHOG_KEY;if(!$)return null;return{key:$,host:process.env.POSTHOG_HOST??JO6}}var Mm$,JO6="https://ph.studio.decocms.com",km$;var Vm$=D(()=>{Q8();J90();aC();Q9();E$();c91();Im$();Mm$=new K1;Mm$.get("/",($)=>{let Z={version:qm$.version,theme:Kp1(),..._F().logo&&{logo:_F().logo},...zN()&&{internalUrl:g_1()},...C0().enableDecoImport&&{enableDecoImport:!0},brandExtractEnabled:!!C0().firecrawlApiKey,hostingEnabled:!!C0().controlplaneRestUrl&&!!C0().controlplaneServiceToken,hostingControlPlaneGa:C0().hostingControlPlaneGa,monitorEnabled:!!C0().clickhouseAnalyticsUrl&&!!C0().clickhouseAnalyticsPassword,monitorGa:C0().monitorGa,auth:Pg$(),posthog:WO6(),googleMapsApiKey:process.env.GOOGLE_MAPS_API_KEY?.trim()||null,runtime:{agentSandbox:da()}};return $.header("Cache-Control","no-store"),$.json({success:!0,config:Z})});km$=Mm$});function Nl($){let Z=($??"").trim().toLowerCase();return Z=Z.replace(/^https?:\/\//,""),Z=Z.replace(/^www\./,""),Z=Z.split(/[/?#]/)[0]??"",Z.replace(/\/+$/,"")}function FX1($){return(Nl($).split(".")[0]||$).replace(/[-_]/g," ").split(" ").filter(Boolean).map((X)=>X.charAt(0).toUpperCase()+X.slice(1)).join(" ")}function Cm$($,Z=64){return`https://www.google.com/s2/favicons?domain=${encodeURIComponent(Nl($))}&sz=${Z}`}function Sm$($,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 _m$($){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()?Sm$(`${Y.trim().replace(/\s+/g," ")} \u2014 ${J}`,200):Sm$(`How does ${X} really perform? ${J}`,200);return{title:G,description:W}}import{z as c0}from"zod";var Cv,KO6,HO6,FO6,NO6,vm$;var fm$=D(()=>{Cv=c0.enum(["good","bad","neutral"]),KO6=c0.preprocess(($)=>{if(Array.isArray($))return{kind:"text",value:$.find((X)=>X!==null&&typeof X!=="object")??""};return $!==null&&typeof $==="object"?$:{kind:"text",value:$}},c0.object({kind:c0.enum(["text","number","sparkline","badge","score"]).catch("text"),value:c0.coerce.string().optional(),tone:Cv.optional(),muted:c0.boolean().optional(),delta:c0.coerce.string().optional(),deltaDir:c0.enum(["up","down","neutral"]).optional(),points:c0.array(c0.coerce.number()).optional(),label:c0.coerce.string().optional()}).transform(($)=>{if($.kind==="badge"&&$.label==null)$.label=$.value??"";if($.kind==="score"){let Z=Number($.value);if(Number.isNaN(Z))return{...$,kind:"text"}}return $})),HO6=c0.preprocess(($)=>{let Z=$;if(Z&&typeof Z==="object"&&!Array.isArray(Z)&&Array.isArray(Z.cells))Z=Z.cells;if(Array.isArray(Z)&&Z.length===1&&Array.isArray(Z[0]))Z=Z[0];if(Array.isArray(Z))return Z;if(Z&&typeof Z==="object")return Object.values(Z);return Z},c0.array(KO6)),FO6={key:c0.coerce.string(),title:c0.coerce.string(),eyebrow:c0.coerce.string().optional(),headline:c0.coerce.string(),annotation:c0.coerce.string().optional(),methodology:c0.coerce.string().optional(),sources:c0.array(c0.object({name:c0.coerce.string(),logoUrl:c0.coerce.string()})).optional()},NO6=c0.discriminatedUnion("template",[c0.object({template:c0.literal("cover"),score:c0.object({value:c0.coerce.number(),max:c0.coerce.number().optional(),grade:c0.coerce.string().optional(),label:c0.coerce.string().optional()}).optional(),brandImage:c0.coerce.string().optional(),screenshot:c0.coerce.string().optional(),mobileScreenshot:c0.coerce.string().optional()}),c0.object({template:c0.literal("cta"),ctaUrl:c0.coerce.string().optional(),ctaLabel:c0.coerce.string().optional(),bullets:c0.array(c0.coerce.string()).optional()}),c0.object({template:c0.literal("series"),points:c0.array(c0.coerce.number()).min(2),xLabels:c0.array(c0.coerce.string()).min(1),unit:c0.coerce.string().optional(),callout:c0.object({index:c0.coerce.number(),value:c0.coerce.string(),tone:Cv.optional()})}),c0.object({template:c0.literal("threshold"),value:c0.coerce.string().default(""),metricLabel:c0.coerce.string().optional(),ratio:c0.coerce.number(),thresholdRatio:c0.coerce.number().optional(),thresholdLabel:c0.coerce.string().default(""),tone:Cv.optional()}),c0.object({template:c0.literal("stats"),stats:c0.array(c0.object({value:c0.coerce.string(),label:c0.coerce.string(),tone:Cv.optional()})).min(1)}),c0.object({template:c0.literal("bars"),items:c0.array(c0.object({value:c0.coerce.string(),label:c0.coerce.string(),ratio:c0.coerce.number(),tone:Cv.optional()})).min(1)}),c0.object({template:c0.literal("gauges"),gauges:c0.array(c0.object({label:c0.coerce.string(),value:c0.coerce.string(),status:c0.enum(["good","warn","bad"]).catch("warn"),caption:c0.coerce.string().optional(),ratio:c0.coerce.number().optional()})).min(1)}),c0.object({template:c0.literal("checklist"),checks:c0.array(c0.object({label:c0.coerce.string(),status:c0.enum(["pass","fail","warn"]).catch("fail"),value:c0.coerce.string().optional()})).min(1)}),c0.object({template:c0.literal("table"),columns:c0.array(c0.object({label:c0.coerce.string(),align:c0.enum(["left","right"]).optional()})).min(1),rows:c0.array(HO6).min(1),highlightRow:c0.coerce.number().optional()}),c0.object({template:c0.literal("products"),products:c0.array(c0.object({name:c0.coerce.string(),price:c0.coerce.string().optional(),image:c0.coerce.string().optional(),url:c0.coerce.string().optional()})).min(1)}),c0.object({template:c0.literal("list"),entries:c0.array(c0.object({label:c0.coerce.string(),severity:c0.enum(["error","warning","notice"]).catch("notice")})).min(1),moreCount:c0.coerce.number().optional()}),c0.object({template:c0.literal("keywords"),volumeLabel:c0.coerce.string().optional(),keywords:c0.array(c0.object({term:c0.coerce.string(),volume:c0.coerce.string(),position:c0.coerce.number().catch(0)})).min(1)}),c0.object({template:c0.literal("competitor"),metricLabel:c0.coerce.string().optional(),competitors:c0.array(c0.object({name:c0.coerce.string(),value:c0.coerce.string(),tone:Cv.optional(),isYou:c0.boolean().optional()})).min(1)}),c0.object({template:c0.literal("scorecard"),rivalLabel:c0.coerce.string().optional(),dimensions:c0.array(c0.object({label:c0.coerce.string(),you:c0.coerce.string(),rival:c0.coerce.string().optional(),rivalName:c0.coerce.string().optional(),tone:Cv.optional()})).min(1)})]),vm$=c0.object({...FO6,template:NO6})});function cT0($){let Z=[],X=[...$.sections].sort((Y,G)=>Y.position-G.position).map((Y)=>{let G=vm$.safeParse(Y.props);if(G.success)return G.data;let J=G.error.issues[0];return Z.push({section_type:Y.section_type,position:Y.position,reason:J?`${J.path.join(".")||"(root)"}: ${J.message}`:"contract violation"}),null}).filter((Y)=>Y!==null),Q=X.filter((Y)=>Y.template.template!=="cover"&&Y.template.template!=="cta").map((Y)=>({key:Y.key,title:Y.title}));return{deck:{meta:{...$.meta,scores:$.summary?.scores,scannedAt:$.scanned_at,toc:Q},slides:X},drops:Z}}var NX1=D(()=>{fm$()});import{join as bm$}from"path";async function BO6($){try{let Z=await fetch(`${LK({})}/api/v2/public/diagnostics/${encodeURIComponent($)}`,{headers:{Accept:"application/json"},signal:AbortSignal.timeout(UO6)});if(!Z.ok)return null;let X=await Z.json(),{deck:Q}=cT0(X);if(!Q.slides.length)return null;let Y=Q.slides.find((W)=>W.template.template==="cover"),G=Y?.template,J=G&&G.template==="cover"?G:void 0;return{brand:Q.meta.brand?.trim()||FX1($),score:Q.meta.scores?.cover??J?.score?.value,verdict:Y?.annotation?.trim()||Y?.headline?.trim()||void 0}}catch{return null}}function PG($){return $.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function OO6($,Z){let X=Nl($),Q=Z?.brand?.trim()||FX1(X),Y=Cm$(X,128),J=`${(C0().baseUrl??"https://studio.decocms.com").replace(/\/+$/,"")}/report/${encodeURIComponent(X)}`,{title:W,description:K}=_m$({brand:Q,domain:X,score:Z?.score,verdict:Z?.verdict}),H=`${J}/og.png`,F=`${Q} commerce report by decocms`;return[`<title>${PG(W)}</title>`,`<meta name="description" content="${PG(K)}" />`,'<meta name="robots" content="noindex, follow" />','<meta property="og:type" content="website" />','<meta property="og:site_name" content="decocms" />',`<meta property="og:title" content="${PG(W)}" />`,`<meta property="og:description" content="${PG(K)}" />`,`<meta property="og:url" content="${PG(J)}" />`,`<meta property="og:image" content="${PG(H)}" />`,'<meta property="og:image:width" content="1200" />','<meta property="og:image:height" content="630" />',`<meta property="og:image:alt" content="${PG(F)}" />`,'<meta name="twitter:card" content="summary_large_image" />',`<meta name="twitter:title" content="${PG(W)}" />`,`<meta name="twitter:description" content="${PG(K)}" />`,`<meta name="twitter:image" content="${PG(H)}" />`,`<meta name="twitter:image:alt" content="${PG(F)}" />`,`<link rel="canonical" href="${PG(J)}" />`,`<link rel="icon" href="${PG(Y)}" sizes="any" />`].join(`
|
|
2982
2982
|
`)}function DO6($,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}
|
|
2983
2983
|
</head>`)}function xm$($){let Z=new K1;return Z.get("/:domain/og.png",async(X)=>{let Q=Nl(X.req.param("domain")),Y=async()=>{let G=$?Bun.file(bm$($,"report-og-fallback.png")):null;if(!G||!await G.exists())return X.notFound();return X.body(new Uint8Array(await G.arrayBuffer()),200,{"Content-Type":"image/png","Cache-Control":"public, max-age=0, s-maxage=3600"})};try{let G=await fetch(`${LK({})}/api/v2/public/diagnostics/${encodeURIComponent(Q)}/og.png`,{signal:AbortSignal.timeout(LO6)}),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=$?bm$($,"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 BO6(Nl(Q)),K=OO6(Q,W);return X.html(DO6(J,K),200,{"Cache-Control":"public, max-age=0, s-maxage=300"})}catch{return X.html(J)}}),Z}var UO6=2500,LO6=1e4;var ym$=D(()=>{Q8();NX1();AE();E$()});function xa($,Z){return fetch(`${LK({})}${$}`,Z)}async function wO6($,Z,X){let Q=new URLSearchParams;if(Z)Q.set("pw",Z);if(X)Q.set("lang",X);let Y=Q.toString()?`?${Q.toString()}`:"",G=await xa(`/api/v2/public/diagnostics/${encodeURIComponent($)}${Y}`,{headers:{Accept:"application/json"}});if(G.status===404)return{status:"not_found",deck:null,scanned_at:null,drops:[]};if(!G.ok)throw Error(`report read HTTP ${G.status}`);let J=await G.json(),{deck:W,drops:K}=cT0(J);return{status:W.slides.length?"ready":"empty",deck:W,scanned_at:J.scanned_at,drops:K}}var EO6,XU,gm$=async($,Z)=>{if(!$.get("reportUser"))return $.json({error:"Authentication required"},401);await Z();return},hm$;var um$=D(()=>{Q8();nY();AE();NX1();EO6=new Set(["complete","errored","terminated","unknown"]),XU=new K1;XU.use("*",async($,Z)=>{let X=await e$.api.getSession({headers:$.req.raw.headers});$.set("reportUser",X?.user?.id?{email:X.user.email}:void 0),await Z(),$.header("Cache-Control","private, no-store"),$.header("Vary","Cookie");return});XU.use("/link-token/*",gm$);XU.use("/suggest",gm$);XU.get("/site/:domain",async($)=>{let Z=$.req.param("domain").trim();if(!Z)return $.json({error:"domain is required"},400);let X=$.get("reportUser"),Q=$.req.query("key")?.trim()||void 0,Y=$.req.query("lang")?.trim()||void 0;try{let G=await wO6(Z,Q,Y);if($.header("Cache-Control","private, no-store"),X||!G.deck)return $.json(G);return $.json({...G,deck:{...G.deck,slides:G.deck.slides.slice(0,1)},truncated:G.status==="ready"})}catch{return $.json({error:"report read failed"},502)}});XU.post("/run",async($)=>{let Z=$.get("reportUser"),X;try{X=await $.req.json()}catch{return $.json({error:"invalid JSON"},400)}let Q=typeof X.domain==="string"?X.domain.trim():"";if(!Q)return $.json({error:"domain is required"},400);let Y=Z?.email,G=typeof X.distinctId==="string"&&X.distinctId.trim()&&X.distinctId.length<=200?X.distinctId.trim():void 0;try{let J=await xa("/api/v2/diagnostics/run",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${PE({})}`},body:JSON.stringify({url:Q,...Y?{email:Y}:{},distinct_id:G})});if(!J.ok)return $.json({error:`run HTTP ${J.status}`},502);let W=await J.json(),K=W.blocked?{state:"blocked"}:W.status==="fresh"?{state:"fresh"}:W.mode==="sync"?{state:"sync"}:{state:"running",id:W.id??null};return $.json(K)}catch{return $.json({error:"run failed"},502)}});XU.get("/status",async($)=>{let Z=$.req.query("id");if(!Z)return $.json({error:"id is required"},400);try{let X=await xa(`/api/v2/diagnostics/status?id=${encodeURIComponent(Z)}`,{headers:{Authorization:`Bearer ${PE({})}`}});if(!X.ok)return $.json({error:`status HTTP ${X.status}`},502);let Y=(await X.json()).status??"unknown",G={done:EO6.has(Y),status:Y};return $.json(G)}catch{return $.json({error:"status failed"},502)}});XU.get("/link-token/:id",async($)=>{let Z=$.req.param("id");try{let X=await xa(`/api/v2/public/link-tokens/${encodeURIComponent(Z)}`,{headers:{Accept:"application/json"}});if(X.status===404)return $.json(null);if(!X.ok)return $.json({error:`link token HTTP ${X.status}`},502);return $.json(await X.json())}catch{return $.json({error:"link token resolve failed"},502)}});XU.get("/suggest",async($)=>{let Z=($.req.query("q")??"").trim().slice(0,64);if(Z.length<2)return $.json({suggestions:[]});try{let X=await xa(`/api/v2/public/suggest?q=${encodeURIComponent(Z)}`,{headers:{Accept:"application/json"}});if(!X.ok)return $.json({suggestions:[]});let Q=await X.json();return $.json({suggestions:Array.isArray(Q.suggestions)?Q.suggestions:[]})}catch{return $.json({suggestions:[]})}});hm$=XU});import{createHmac as jO6,timingSafeEqual as zO6}from"crypto";function cm$($,Z,X,Q=Date.now()){if(!Z||!X)return!1;let Y,G=[];for(let H of Z.split(",")){let F=H.indexOf("=");if(F<=0)continue;let N=H.slice(0,F).trim(),U=H.slice(F+1).trim();if(N==="t")Y=U;else if(N==="v1")G.push(U)}if(!Y||G.length===0)return!1;let J=Number(Y);if(!Number.isFinite(J)||Math.abs(Q/1000-J)>PO6)return!1;let W=jO6("sha256",X).update(`${Y}.${$}`).digest("hex"),K=Buffer.from(W,"hex");return G.some((H)=>{let F=Buffer.from(H,"hex");return K.length===F.length&&zO6(K,F)})}function dm$($){let Z;try{Z=JSON.parse($)}catch{return null}let X=mJ(Z),Q=mJ(mJ(X?.data)?.object);if(!X||typeof X.type!=="string"||!Q)return null;return{id:fH(X.id),type:X.type,created:typeof X.created==="number"?X.created:void 0,livemode:typeof X.livemode==="boolean"?X.livemode:void 0,data:{object:Q}}}function mm$($){switch($){case"active":case"trialing":return"active";case"past_due":return"past_due";default:return"canceled"}}function fH($){return typeof $==="string"?$:void 0}function mJ($){return typeof $==="object"&&$!==null?$:void 0}function dT0($){return typeof $==="number"?new Date($*1000):null}function OX1($){return fH($)??fH(mJ($)?.id)}function AO6($){return OX1($.subscription)??fH(mJ(mJ($.parent)?.subscription_details)?.subscription)}function TO6($){let Z=dT0($.current_period_end);if(Z)return Z;let X=mJ($.items)?.data;if(!Array.isArray(X))return null;let Q=0;for(let Y of X){let G=mJ(Y)?.current_period_end;if(typeof G==="number"&&G>Q)Q=G}return Q>0?new Date(Q*1000):null}function UX1($,Z){let X=dT0($.created);return!!X&&!!Z.lastStripeEventAt&&X<Z.lastStripeEventAt}function BX1($,Z){let X=dT0($.created);if(!X)return;return Z.lastStripeEventAt&&Z.lastStripeEventAt>X?void 0:X}async function RO6($,Z){let X=Z.data.object;switch(Z.type){case"checkout.session.completed":case"checkout.session.async_payment_succeeded":{let Q=fH(mJ(X.metadata)?.orgId);if(!Q)return{handled:!1,reason:"no orgId"};if(fH(mJ(X.metadata)?.kind)==="topup"){if(X.mode!=="payment")return{handled:!1,reason:"topup with wrong mode"};if(fH(X.payment_status)!=="paid")return{handled:!1,reason:"payment not confirmed"};let J=fH(X.id);if(!J)return console.error("stripe webhook: topup session without id",{eventId:Z.id,organizationId:Q}),{handled:!1,reason:"topup session without id"};let W=Number(mJ(X.metadata)?.creditCents);if(!Number.isInteger(W)||W<=0)return console.error("stripe webhook: paid topup with bad metadata \u2014 credit NOT applied",{eventId:Z.id,organizationId:Q,creditCents:mJ(X.metadata)?.creditCents}),{handled:!1,reason:"bad topup metadata"};return{handled:!0,organizationId:Q,topUp:{creditCents:W,referenceId:`stripe-topup:${J}`}}}if(X.mode!=="subscription")return{handled:!1,reason:"not a subscription checkout"};if(fH(X.payment_status)!=="paid")return{handled:!1,reason:"payment not confirmed"};let Y=await $.getBilling(Q);if(!Y)return{handled:!1,reason:"unknown org"};let G=OX1(X.subscription);if(Y.stripeSubscriptionId&&G&&Y.stripeSubscriptionId!==G)return console.error("stripe webhook: refused checkout rebind",{organizationId:Q,eventId:Z.id}),{handled:!1,reason:"org already bound to another subscription",orphanSubscriptionId:G};if(UX1(Z,Y))return{handled:!1,reason:"stale event"};return await $.updateStripeState(Q,{stripeCustomerId:OX1(X.customer),stripeSubscriptionId:G,status:"active",lastStripeEventAt:BX1(Z,Y)}),{handled:!0,organizationId:Q}}case"customer.subscription.updated":case"customer.subscription.deleted":{let Q=fH(X.id);if(!Q)return{handled:!1,reason:"no sub id"};let Y=await $.getBillingByStripeSubscriptionId(Q);if(!Y)return{handled:!1,reason:"unknown subscription"};let G=Z.type==="customer.subscription.deleted";if(!G&&UX1(Z,Y))return{handled:!1,reason:"stale event"};let J=G?"canceled":mm$(X.status);return await $.updateStripeState(Y.organizationId,{status:J,currentPeriodEnd:TO6(X),...G&&{stripeSubscriptionId:null},lastStripeEventAt:BX1(Z,Y)}),{handled:!0,organizationId:Y.organizationId}}case"invoice.paid":{let Q=AO6(X);if(!Q)return{handled:!1,reason:"no sub id"};let Y=await $.getBillingByStripeSubscriptionId(Q);if(!Y)return{handled:!1,reason:"unknown subscription"};if(UX1(Z,Y))return{handled:!1,reason:"stale event"};return await $.updateStripeState(Y.organizationId,{status:"active",currentPeriodEnd:dT0(X.period_end),lastStripeEventAt:BX1(Z,Y)}),{handled:!0,organizationId:Y.organizationId}}default:return{handled:!1,reason:`unhandled event ${Z.type}`}}}function IO6($,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:mm$(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 lm$($,Z){let X=IO6($,Z);if(!X)return;dY({event:X.name,organizationId:X.organizationId,...$.id?{uuid:Lt1(`stripe:${$.id}:${X.name}`)}:{},...$.created?{timestamp:new Date($.created*1000)}:{},properties:X.properties})}async function im$($){let Z=new UK(r8().db),X=await RO6(Z,$);if(!(X.handled&&X.topUp))lm$($,X);if(X.handled&&X.topUp)await Xz$({organizationId:X.organizationId,amountCents:X.topUp.creditCents,referenceId:X.topUp.referenceId}),lm$($,X);if(!X.handled&&X.orphanSubscriptionId)try{await m0$(X.orphanSubscriptionId),console.error("stripe webhook: canceled orphan subscription",{subscriptionId:X.orphanSubscriptionId,eventId:$.id})}catch(Q){if(!(Q instanceof tY&&(Q.status===400||Q.status===404)))throw Q}return X}var PO6=300;var pm$=D(()=>{oG();S4();h50();_E();A11()});var qO6=1048576,DX1;var nm$=D(()=>{Q8();MH();E$();pm$();DX1=new K1;DX1.post("/webhook",o5({maxSize:qO6,onError:($)=>$.json({error:"payload too large"},413)}),async($)=>{let Z=C0().stripeWebhookSecret;if(!Z)return $.json({error:"stripe billing not configured"},503);let X=await $.req.text();if(!cm$(X,$.req.header("stripe-signature"),Z))return $.json({error:"invalid signature"},400);let Y=dm$(X);if(!Y)return $.json({error:"invalid payload"},400);let G=await im$(Y);return console.log("stripe webhook",{eventId:Y.id,type:Y.type,livemode:Y.livemode,...G}),$.json({received:!0})})});import{timingSafeEqual as MO6}from"crypto";function VO6($,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 MO6(Buffer.from(Y),Buffer.from(Q))}var kO6=5242880,LX1;var tm$=D(()=>{Q8();MH();a3();LX1=new K1;LX1.post("/webhook",o5({maxSize:kO6,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(!VO6(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 Wt0())?.markTenantPoolsDirty(G,Y)??[];return $.json({ok:!0,pools:W})})});function om$($,Z){if(Z.startsWith("text/html")||Z.startsWith("image/svg"))$.set("Content-Security-Policy","sandbox allow-scripts allow-modals allow-same-origin")}var rm$,SO6,CO6,sm$;var am$=D(()=>{Q8();S3();Sg();zy();rm$=new K1,SO6=["range","if-none-match","if-modified-since"],CO6=["content-type","content-length","content-range","accept-ranges","etag","last-modified"];rm$.get("/:org/files/*",async($)=>{let Z=$.get("studioContext"),X=Z.organization?.id;if(!Z.auth?.user?.id){if(yu($))return $.redirect(`/login?next=${encodeURIComponent($.req.path)}`,302);throw new Z$(401,{message:"Authentication required"})}if(!X)throw new Z$(401,{message:"Organization context required"});let Q=$.req.path.replace(/^.*\/files\//,"");if(!Q)throw new Z$(400,{message:"Missing file key"});let Y=await _t(Q,Z);if(!Y)throw new Z$(503,{message:"Object storage not configured"});if(Y.startsWith("data:")&&eG()){let K=Y.match(/^data:([^;]+);base64,(.+)$/s);if(!K)throw new Z$(500,{message:"Invalid data URL from storage"});let[,H,F]=K,N=Buffer.from(F,"base64"),U=new Headers({"Content-Type":H,"Cache-Control":"private, max-age=86400"});return om$(U,H),new Response(N,{status:200,headers:U})}let G=new Headers;for(let K of SO6){let H=$.req.header(K);if(H)G.set(K,H)}let J=await fetch(Y,{headers:G});if(J.status===403||J.status===404)throw new Z$(404,{message:"File not found"});if(!J.ok&&J.status!==304&&J.status!==416)throw console.error(`[files] upstream storage error ${J.status} for key:`,Q),new Z$(502,{message:"Upstream storage error"});let W=new Headers;for(let K of CO6){let H=J.headers.get(K);if(H)W.set(K,H)}return W.set("Cache-Control","private, max-age=86400"),om$(W,W.get("content-type")??""),new Response(J.body,{status:J.status,headers:W})});sm$=rm$});var ya=_((_v)=>{var _O6=_v&&_v.__createBinding||(Object.create?function($,Z,X,Q){if(Q===void 0)Q=X;var Y=Object.getOwnPropertyDescriptor(Z,X);if(!Y||("get"in Y?!Z.__esModule:Y.writable||Y.configurable))Y={enumerable:!0,get:function(){return Z[X]}};Object.defineProperty($,Q,Y)}:function($,Z,X,Q){if(Q===void 0)Q=X;$[Q]=Z[X]}),vO6=_v&&_v.__exportStar||function($,Z){for(var X in $)if(X!=="default"&&!Object.prototype.hasOwnProperty.call(Z,X))_O6(Z,$,X)};Object.defineProperty(_v,"__esModule",{value:!0});vO6(kY(),_v)});var Zi$=_((em$)=>{Object.defineProperty(em$,"__esModule",{value:!0});em$.version=void 0;em$.version="3.4.0"});var Yi$=_((bH)=>{var fO6=bH&&bH.__importDefault||function($){return $&&$.__esModule?$:{default:$}};Object.defineProperty(bH,"__esModule",{value:!0});bH.NodeTransport=bH.VERSION=void 0;bH.nodeResolveHost=uO6;var e6=ya(),bO6=A0("net"),wX1=A0("tls"),xO6=A0("path"),Xi$=A0("fs"),yO6=fO6(A0("dns")),gO6=Zi$();bH.VERSION=gO6.version;var hO6="nats.js";class Qi${socket;version;lang;yields=[];signal=(0,e6.deferred)();closedNotification=(0,e6.deferred)();options;connected=!1;tlsName="";done=!1;closeError;constructor(){this.lang=hO6,this.version=bH.VERSION}async connect($,Z){this.tlsName=$.tlsName,this.options=Z;let{tls:X}=this.options,{handshakeFirst:Q}=X||{};try{if(Q===!0)this.socket=await this.tlsFirst($);else this.socket=await this.dial($);if(this.done)this.socket?.destroy();let Y=await this.peekInfo();(0,e6.checkOptions)(Y,Z);let{tls_required:G,tls_available:J}=Y,W=J===!0&&Z.tls!==null;if(!Q&&(G||W))this.socket=await this.startTLS();if(this.done)this.socket?.destroy();if(G&&this.socket.encrypted!==!0)throw e6.errors.InvalidArgumentError.format("tls","is not available on this server");return this.connected=!0,this.setupHandlers(),this.signal.resolve(),Promise.resolve()}catch(Y){let G=Y;if(!G)G=new e6.errors.ConnectionError("error connecting - node provided an undefined error");let{code:J}=G,W=J==="ECONNREFUSED"?new e6.errors.ConnectionError("connection refused",{cause:G}):G;throw this.socket?.destroy(),W}}dial($){let Z=(0,e6.deferred)(),X,Q=(0,bO6.createConnection)($.port,$.hostname,()=>{Z.resolve(Q),Q.removeAllListeners()});return Q.on("error",(Y)=>{X=Y}),Q.on("close",()=>{Q.removeAllListeners(),Z.reject(X)}),Q.setNoDelay(!0),Z}get isClosed(){return this.done}close($){return this._closed($,!1)}peekInfo(){let $=(0,e6.deferred)(),Z;return this.socket.on("data",(X)=>{this.yields.push(X);let Q=e6.DataBuffer.concat(...this.yields),Y=(0,e6.extractProtocolMessage)(Q);if(Y!=="")try{let G=e6.INFO.exec(Y);if(!G)throw Error("unexpected response from server");let J=JSON.parse(G[1]);$.resolve(J)}catch(G){$.reject(G)}finally{this.socket.removeAllListeners()}}),this.socket.on("error",(X)=>{Z=X}),this.socket.on("close",()=>{this.socket.removeAllListeners(),$.reject(Z)}),$}loadFile($){if(!$)return Promise.resolve();let Z=(0,e6.deferred)();try{if($=(0,xO6.resolve)($),!(0,Xi$.existsSync)($))Z.reject(Error(`${$} doesn't exist`));(0,Xi$.readFile)($,(X,Q)=>{if(X)return Z.reject(X);Z.resolve(Q)})}catch(X){Z.reject(X)}return Z}async loadClientCerts(){let $={},{certFile:Z,cert:X,caFile:Q,ca:Y,keyFile:G,key:J}=this.options.tls;try{if(Z){let W=await this.loadFile(Z);if(W)$.cert=W}else if(X)$.cert=X;if(G){let W=await this.loadFile(G);if(W)$.key=W}else if(J)$.key=J;if(Q){let W=await this.loadFile(Q);if(W)$.ca=[W]}else if(Y)$.ca=Y;return Promise.resolve($)}catch(W){return Promise.reject(W)}}async tlsFirst($){let Z,X={servername:this.tlsName,rejectUnauthorized:!0};if(this.socket)X.socket=this.socket;if(typeof this.options.tls==="object")try{let Y=await this.loadClientCerts()||{};X=(0,e6.extend)(X,this.options.tls,Y)}catch(Y){return Promise.reject(new e6.errors.ConnectionError(Y.message,{cause:Y}))}let Q=(0,e6.deferred)();try{let Y=(0,wX1.connect)($.port,$.hostname,X,()=>{Y.removeAllListeners(),Q.resolve(Y)});Y.on("error",(G)=>{Z=G}),Y.on("secureConnect",()=>{if(X.rejectUnauthorized===!1)return;if(!Y.authorized)throw Y.authorizationError}),Y.on("close",()=>{Q.reject(Z),Y.removeAllListeners()}),Y.setNoDelay(!0)}catch(Y){Q.reject(new e6.errors.ConnectionError(Y.message,{cause:Y}))}return Q}async startTLS(){let $,Z={socket:this.socket,servername:this.tlsName,rejectUnauthorized:!0};if(typeof this.options.tls==="object")try{let Q=await this.loadClientCerts()||{};Z=(0,e6.extend)(Z,this.options.tls,Q)}catch(Q){return Promise.reject(new e6.errors.ConnectionError(Q.message,{cause:Q}))}let X=(0,e6.deferred)();try{let Q=(0,wX1.connect)(Z,()=>{Q.removeAllListeners(),X.resolve(Q)});Q.on("error",(Y)=>{$=Y}),Q.on("secureConnect",()=>{if(Z.rejectUnauthorized===!1)return;if(!Q.authorized)throw Q.authorizationError}),Q.on("close",()=>{X.reject($),Q.removeAllListeners()})}catch(Q){X.reject(new e6.errors.ConnectionError(Q.message,{cause:Q}))}return X}setupHandlers(){let $;this.socket.on("data",(Z)=>{return this.yields.push(Z),this.signal.resolve()}),this.socket.on("error",(Z)=>{$=Z}),this.socket.on("end",()=>{if(this.socket?.destroyed)return;this.socket?.write(new Uint8Array(0),()=>{this.socket?.end()})}),this.socket.on("close",()=>{this._closed($,!1)})}[Symbol.asyncIterator](){return this.iterate()}async*iterate(){while(!0){if(this.yields.length===0)await this.signal;let $=this.yields;this.yields=[];for(let Z=0;Z<$.length;Z++){if(this.options.debug)console.info(`> ${(0,e6.render)($[Z])}`);yield $[Z]}if(this.done)break;else if(this.yields.length===0)$.length=0,this.yields=$,this.signal=(0,e6.deferred)()}}discard(){if(this.done=!0,this.socket)try{this.socket.removeAllListeners(),this.socket.destroy()}catch{}}disconnect(){this._closed(void 0,!0).then().catch()}isEncrypted(){return this.socket instanceof wX1.TLSSocket}_send($){if(this.isClosed||this.socket===void 0)return Promise.resolve();if(this.options.debug)console.info(`< ${(0,e6.render)($)}`);let Z=(0,e6.deferred)();try{this.socket.write($,(X)=>{if(X){if(this.options.debug)console.error(`!!! ${(0,e6.render)($)}: ${X}`);return Z.reject(X)}return Z.resolve()})}catch(X){if(this.options.debug)console.error(`!!! ${(0,e6.render)($)}: ${X}`);Z.reject(X)}return Z}send($){this._send($).catch((X)=>{})}async _closed($,Z=!0){if(!this.connected)return;if(this.done){this.socket?.destroy();return}if(this.closeError=$,!$&&this.socket&&Z)try{await this._send(new TextEncoder().encode(""))}catch(X){if(this.options.debug)console.log("transport close terminated with an error",X)}try{if(this.socket)this.socket.removeAllListeners(),this.socket?.destroy(),this.socket=void 0}catch(X){console.log(X)}this.done=!0,this.closedNotification.resolve(this.closeError)}closed(){return this.closedNotification}}bH.NodeTransport=Qi$;function uO6($){let Z=(0,e6.deferred)();return yO6.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 Hi$=_((Ki$)=>{Object.defineProperty(Ki$,"__esModule",{value:!0});Ki$.connect=lO6;var Gi$=Yi$(),Ji$=ya(),Wi$=ya();function lO6($={}){if((0,Wi$.hasWsProtocol)($))return Promise.reject(Wi$.errors.InvalidArgumentError.format("servers","node client doesn't support websockets, use the 'wsconnect' function instead"));return(0,Ji$.setTransportFactory)({factory:()=>{return new Gi$.NodeTransport},dnsResolveFn:Gi$.nodeResolveHost}),Ji$.NatsConnectionImpl.connect($)}});var Fi$=_((QU)=>{var dO6=QU&&QU.__createBinding||(Object.create?function($,Z,X,Q){if(Q===void 0)Q=X;var Y=Object.getOwnPropertyDescriptor(Z,X);if(!Y||("get"in Y?!Z.__esModule:Y.writable||Y.configurable))Y={enumerable:!0,get:function(){return Z[X]}};Object.defineProperty($,Q,Y)}:function($,Z,X,Q){if(Q===void 0)Q=X;$[Q]=Z[X]}),mO6=QU&&QU.__exportStar||function($,Z){for(var X in $)if(X!=="default"&&!Object.prototype.hasOwnProperty.call(Z,X))dO6(Z,$,X)};Object.defineProperty(QU,"__esModule",{value:!0});QU.connect=void 0;var iO6=Hi$();Object.defineProperty(QU,"connect",{enumerable:!0,get:function(){return iO6.connect}});mO6(ya(),QU)});function Oi$($){let Z=$?.connectFn??oO6,X=null,Q=null,Y=!1,G=!1,J=!1,W=[];function K(){return X!==null&&!X.isClosed()&&!X.isDraining()&&!J}function H(){console.log(`[NatsProvider] fireReady: ${W.length} callbacks`);for(let U of W)try{U()}catch{}}function F(U){(async()=>{for await(let B of U.status())if(B.type==="disconnect")console.log("[NatsProvider] Disconnected"),J=!0;else if(B.type==="reconnect")console.log("[NatsProvider] Reconnected, re-firing ready callbacks"),J=!1,Q=null,H()})().catch(()=>{})}async function N(U,B){let O=0;while(!G)try{X=await Z({servers:U,timeout:tO6,reconnect:!0,maxReconnectAttempts:-1,...B?{authenticator:B}:{}}),console.log(`[NatsProvider] Connected to ${X.getServer()} after ${O} attempt(s)`),Q=null,J=!1,F(X),H();return}catch{O++;let L=G7(nO6,pO6,O-1,2,0.5);await w$(L)}}return{init(U,B){if(Y)return;Y=!0,G=!1;let O=B?.creds?Ni$.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=Bi$.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 oO6($){return Ui$.connect($)}var Ni$,Ui$,Bi$,pO6=100,nO6=3000,tO6=3000;var Di$=D(()=>{W4();Ni$=V(xl(),1),Ui$=V(Fi$(),1),Bi$=V(DU(),1)});function EX1($,Z){return`${$}.${Z}`}class jX1{cache;constructor($){this.cache=Eu({ttlMs:$?.ttlMs??rO6,maxSize:$?.maxSize??sO6})}async get($,Z){return this.cache.get(EX1($,Z))??null}async set($,Z,X){this.cache.set(EX1($,Z),X)}async invalidate($,Z){this.cache.delete(EX1($,Z))}teardown(){this.cache.clear()}}var rO6=600000,sO6=5000;var Li$=()=>{};function mT0($,Z){return`${$}:${Z}`}function zX1($){let Z=Eu({ttlMs:$?.ttlMs??aO6,maxSize:$?.maxSize??eO6}),X=$?.getConnection,Q=crypto.randomUUID(),Y=new TextEncoder,G=new TextDecoder,J=null;function W(K,H){let F=X?.();if(!F)return;try{F.publish(wi$,Y.encode(JSON.stringify({organizationId:K,keyId:H,originId:Q})))}catch(N){console.warn("[ProviderKeyCache] Publish failed (non-critical):",N)}}return{get(K,H){return Z.get(mT0(K,H))},set(K,H,F){Z.set(mT0(K,H),F)},invalidate(K,H){Z.delete(mT0(K,H)),W(K,H)},start(){if(J)return;let K=X?.();if(!K)return;J=K.subscribe(wi$),(async()=>{for await(let H of J)try{let F=JSON.parse(G.decode(H.data));if(F.originId===Q)continue;Z.delete(mT0(F.organizationId,F.keyId))}catch{}})().catch(console.error)},teardown(){J?.unsubscribe(),J=null,Z.clear()}}}var wi$="studio.ai-provider-keys.invalidate",aO6=30000,eO6=5000;var Ei$=()=>{};class PX1{options;subscription=null;onCancel=null;encoder=new TextEncoder;originId=crypto.randomUUID();constructor($){this.options=$}async start($){if($)this.onCancel=$;if(this.subscription)return;if(!this.onCancel)return;let Z=this.options.getConnection();if(!Z)return;let X=new TextDecoder,Q=Z.subscribe("studio.decopilot.cancel");this.subscription=Q,(async()=>{for await(let Y of Q)try{let G=JSON.parse(X.decode(Y.data));if(G.originId===this.originId)continue;this.onCancel?.(G.taskId)}catch{}})().catch(console.error)}broadcast($){if(/[.*>\s]/.test($)){console.warn("[NatsCancelBroadcast] Invalid threadId, skipping broadcast");return}this.onCancel?.($);try{let Z=this.options.getConnection();if(!Z)return;let X=this.encoder.encode(JSON.stringify({taskId:$,originId:this.originId}));Z.publish("studio.decopilot.cancel",X)}catch(Z){console.warn("[NatsCancelBroadcast] Publish failed (non-critical):",Z)}}async stop(){this.subscription?.unsubscribe(),this.subscription=null,this.onCancel=null}}var ji$=($)=>{let Z;return()=>Z??=$()},AX1,TX1;var zi$=D(()=>{G6();AX1=ji$(()=>J$.createHistogram("decopilot.stream.encode_ms",{description:"Per-chunk JSON.stringify+encode time for decopilot stream",unit:"ms"})),TX1=ji$(()=>J$.createCounter("decopilot.stream.published_chunks",{description:"Logical decopilot stream chunks published to JetStream",unit:"{chunks}"}))});function JD6($=Ti$){return{name:$H,subjects:[`${_s0}.>`],storage:IW.StorageType.File,max_age:XD6,max_bytes:YD6,max_msgs_per_subject:GD6,discard:IW.DiscardPolicy.Old,retention:IW.RetentionPolicy.Limits,duplicate_window:QD6,num_replicas:$}}class Ri${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 Pi$($){let Z=Ai$.headers();for(let[X,Q]of Object.entries($))Z.set(X,Q);return Z}function FD6($,Z){let X=0;return{publish(Q,Y,G,J){Q.publish(Y,G,J?{headers:J}:void 0).catch((W)=>{if(X++,ZD6().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 ND6($,Z){return $.info?.cluster?Z:1}function UD6($){if(!($ instanceof Error))return!1;if(/non-clustered/i.test($.message))return!0;return/replicas?\b/i.test($.message)&&/not supported|can ?not|exceed|insufficient|greater than/i.test($.message)}class RX1{options;js=null;jsm=null;constructor($){this.options=$}async init(){let $=this.options.getConnection();if(!$){console.log("[Decopilot] StreamBuffer.init skipped: NATS not connected yet");return}let Z=async(Q,Y)=>{let G=JD6(Y);try{await Q.streams.info($H),await Q.streams.update($H,G)}catch(J){if(J instanceof Error&&J.message.includes("stream not found"))await Q.streams.add(G),await Q.streams.update($H,G);else if(J instanceof Error&&/can ?not change.*storage|storage type/i.test(J.message))await Q.streams.delete($H),await Q.streams.add(G);else throw J}},X=await h6(async()=>{let Q=this.options.getJetStreamManager?await this.options.getJetStreamManager():await IW.jetstreamManager($),Y=ND6($,Ti$);try{await Z(Q,Y)}catch(G){if(Y<=1||!UD6(G))throw G;console.warn(`[Decopilot] StreamBuffer: NATS rejected num_replicas=${Y} (${G.message}); falling back to an unreplicated stream`),await Z(Q,1)}return Q},{maxAttempts:5,minTimeout:250,maxTimeout:4000,jitter:0.5,isRetriable:lg});this.js=this.options.getJetStream(),this.jsm=X,console.log(`[Decopilot] StreamBuffer.init ${this.js?"ready":"degraded (js=null)"}`)}pump($,Z,X,Q){let Y=this.js;if(!Y)return console.warn(`[Decopilot] pump: JetStream client unavailable for thread ${Z}; chunks NOT published to NATS`),Promise.resolve();let G=FD6(Z,Q),J=!1,W=()=>{if(J)return;J=!0;let H=cO$(Z);Y.publish(H.subject,H.data).catch(()=>{})};X.addEventListener("abort",W,{once:!0});let K=(H)=>{let F=performance.now(),N=fs0(H,{runId:Z}),U=performance.now()-F;AX1().record(U),TX1().add(1,{"org.id":Q??"unknown"}),HD6?.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?Pi$(B.headers):void 0)};return(async()=>{let H=$.getReader(),F=0,N=0,U;try{while(!0){let{done:B,value:O}=await H.read();if(B)break;if(K(O),N++,++F>=64)F=0,await new Promise((L)=>setImmediate(L))}}catch(B){U=B,console.warn(`[Decopilot] stream pump error for thread ${Z}:`,B?.message??B)}finally{if(H.releaseLock(),W(),KD6)console.warn(JSON.stringify({msg:"decopilot-stream-diag",event:"pump-done",taskId:Z,publishedChunks:N,publishErrors:G.errorCount}))}if(U!==void 0)throw U})()}async publishSerialized($,Z){try{return await h6(()=>$.publish(Z.subject,Z.data,{...Z.headers?{headers:Pi$(Z.headers)}:{},...Z.msgId?{msgID:Z.msgId}:{}}),{maxAttempts:6,minTimeout:250,maxTimeout:5000,jitter:0.5,isRetriable:lg}),!0}catch(X){return console.error(`[Decopilot] publish failed after retries subject=${Z.subject}`,X),!1}}async publishRawChunk($,Z,X){let Q=this.js;if(!Q)return!1;let Y=performance.now(),G=fs0(Z,{runId:$,dedup:X});AX1().record(performance.now()-Y),TX1().add(1);for(let J of G)if(!await this.publishSerialized(Q,J))return!1;return!0}async publishDone($,Z,X){let Q=this.js;if(!Q)return!1;let Y=lO$({runId:$,fenceToken:Z,finalSeq:X});return await this.publishSerialized(Q,Y)}async createTailStream($,Z,X){let Q=this.js;if(!Q)return console.warn(`[Decopilot] createTailStream: JetStream client unavailable for thread ${$}; no live tail`),null;let Y=X?.deliverPolicy==="new"?IW.DeliverPolicy.New:IW.DeliverPolicy.All,G=X?.closeOnDone??!1,J=jD($),W;try{W=await h6(async()=>{return(await Q.consumers.get($H,{filter_subjects:J,deliver_policy:Y})).consume()},{maxAttempts:6,minTimeout:250,maxTimeout:5000,jitter:0.5,isRetriable:lg})}catch(L){return console.warn("[Decopilot] JetStream tail unavailable (non-critical):",L?.message??L),null}let F=Aw0({messages:async function*(){try{for await(let L of W)yield{subject:L.subject,data:L.data,headers:L.headers}}finally{W.stop()}}(),onCancel:()=>W.stop()}).pipeThrough(Ew0()).pipeThrough(jw0()).getReader(),N=!1,U=()=>{if(N)return;N=!0;try{F.releaseLock()}catch{}},B=!1,O=()=>{if(B)return;B=!0,W.stop(),F.cancel().catch(()=>{}),U()};return Z?.addEventListener("abort",O,{once:!0}),new ReadableStream({async pull(L){for(;;){let{done:w,value:E}=await F.read();if(w){O(),L.close();return}let j=E;if(j.kind==="done"){if(G){O(),L.close();return}continue}L.enqueue(j.chunk);return}},cancel(){O()}})}purge($){if(!this.jsm)return;this.jsm.streams.purge($H,{filter:jD($)}).catch(()=>{})}teardown(){this.js=null,this.jsm=null}}var IW,Ai$,$D6=($)=>{let Z;return()=>Z??=$()},ZD6,XD6=86400000000000,QD6=120000000000,YD6=4294967296,Ti$,GD6=500000,WD6,KD6,HD6;var Ii$=D(()=>{W4();bs0();Tw0();zw0();G6();zi$();IW=V(DU(),1),Ai$=V(xl(),1),ZD6=$D6(()=>J$.createCounter("decopilot.stream.publish_errors",{description:"Number of JetStream publish failures for decopilot stream chunks",unit:"{errors}"})),Ti$=Math.max(1,Number(process.env.DECOPILOT_STREAM_REPLICAS??3)||3);WD6=process.env.STREAM_ENCODE_TRACE==="1",KD6=process.env.DECOPILOT_STREAM_TRACE==="1";HD6=WD6?new Ri$:null});function iT0($,Z,X,Q){if(!Q)return!1;return $.emit(Z,tW(X,Q.status,{title:Q.title??void 0,virtualMcpId:Q.virtual_mcp_id??void 0,createdBy:Q.created_by??void 0,triggerId:Q.trigger_id??null,branch:Q.branch??null,harnessId:Q.harness_id??void 0,createdAt:Q.created_at,updatedAt:Q.updated_at})),!0}var qi$=D(()=>{_8()});class IX1{storage;options;timer=null;constructor($,Z={}){this.storage=$;this.options=Z}start(){if(this.timer)return;let $=this.options.intervalMs??300000;this.timer=setInterval(()=>{this.runOnce()},$)}async runOnce(){let $=this.options.staleAfterMs??3600000;try{let Z=await this.storage.sweepAbandoned($);if(Z>0)console.log(`[async-research-sweeper] marked ${Z} stale jobs as abandoned`);return Z}catch(Z){return console.error("[async-research-sweeper] sweep failed",Z),0}}dispose(){if(this.timer)clearInterval(this.timer),this.timer=null}}async function Mi$($,Z,X){let Q=Z.organizationId;if(!ZY(Z,(await N9($,Q)).review))return!1;if(!tC(X))return!1;if(await $.storage.taskBoard.hasHumanRejectedDone(Z.id,Q))return!1;let Y=await $.storage.organizationSettings.get(Q),G=qK(Y?.flags),J=await j5($,Q),W=await $.storage.taskBoard.update(Z.id,Q,BJ(J,G),Z.updatedBy);return await A6($,{taskBoardItemId:Z.id,action:"status_changed",actorId:null,data:{from:Z.status,to:G,reason:"pr_merged"}}),x$(Q,W),console.log(`[task-board-review-sweeper] ${Z.id}: linked PR already merged \u2014 moved to ${G}`),!0}var ki$=D(()=>{j6();BX();Mg();v5();iK();z5()});function jD6($){return $ instanceof $Q}function zD6($,Z){return Z-$>=wD6}class qX1{taskBoard;contextFactory;billing;db;options;timer=null;running=!1;cursor=null;constructor($,Z,X,Q,Y={}){this.taskBoard=$;this.contextFactory=Z;this.billing=X;this.db=Q;this.options=Y}start(){if(this.timer)return;let $=this.options.intervalMs??BD6;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??DD6,X=this.options.itemIntervalMs??OD6,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()-at0),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()-ED6));for(let{id:X,organizationId:Q,threadId:Y}of Z)try{console.warn(`[task-board-review-sweeper] reacting to an unhandled failure on ${X}`),await oo0(this.taskBoard,Y,Q,await WN(this.db,Q)),await ro0(this.taskBoard,this.billing,Y,Q)}catch(G){console.error(`[task-board-review-sweeper] unhandled-failure reaction for ${X} failed`,G)}}async dispatchDueRetries($){let Z=0,X=await this.taskBoard.listItemsDueForRetry($,new Date);for(let{id:Q,organizationId:Y,attempts:G}of X)try{if(!await this.taskBoard.claimDueRetry(Q,Y,new Date))continue;let J=await this.taskBoard.getById(Q,Y);if(!J||J.status!=="in_progress"||J.assigneeId!==Y8)continue;let W=await this.contextFactory(Y,J.assignedBy??J.createdBy);if(!W)continue;await EN(W,J,{runClass:"retry"}),Z++,console.warn(`[task-board-review-sweeper] re-dispatched ${Q} after a failure (attempt ${G})`)}catch(J){if(console.error(`[task-board-review-sweeper] retry dispatch for ${Q} failed`,J),jD6(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()+LD6),(await WN(this.db,Y)).progress).catch((W)=>console.error(`[task-board-review-sweeper] re-arming ${Q} failed`,W))}return Z}async returnToTodo($,Z,X){try{let Q=await WN(this.db,Z),Y=await this.taskBoard.getById($,Z);if(!Y||Y.status!=="in_progress")return;let G=await this.taskBoard.returnToTodoAfterFailure($,Z,Y.updatedBy,Q);if(!G)return;await this.taskBoard.recordActivity({taskBoardItemId:$,action:"status_changed",actorId:null,data:{from:"in_progress",to:"todo",reason:X}}).catch(()=>{}),x$(Z,G)}catch(Q){console.error(`[task-board-review-sweeper] returning ${$} to todo failed`,Q)}}async handOffReviewWithoutPr($,Z){let X=await this.taskBoard.listActivity(Z.id,Z.organizationId);if(!zD6(dF(X,Z.reviewCycleStartedAt),Date.now()))return;await tK($,Z,"no pull request is linked to this task \u2014 there is nothing for a "+"reviewer to review")}async reconcileItem($,Z,X){if(!await this.taskBoard.claimSweep($,Z,X))return!1;let Q=await this.taskBoard.getById($,Z);if(!Q)return!1;let Y=await WN(this.db,Z);if(!ZY(Q,Y.review))return!1;let G=Q.assigneeId===Y8,J=await this.taskBoard.listPrs($,Z),W=await this.contextFactory(Z,Q.assignedBy??Q.createdBy);if(!W)return!1;if(J.length===0){if(G)await this.handOffReviewWithoutPr(W,Q);return!1}let K=await Promise.all(J.map(async(H)=>({...H,...await Vg(Z,H)})));if(K.every((H)=>H.state===null))console.warn(`[task-board-review-sweeper] ${$}: no live PR state from GitHub (${K.length} PR(s)) \u2014 proceeding on unknown`);if(await Mi$(W,Q,K))return!0;if(await vD$(W,Q))return!0;if(await this.resolveConflictFromSweep(W,Q,K))return!0;if(!G)return!1;if(!wr0(K))return!1;return await vL0(W,Q,{previewMatchesHead:Er0(K)}),!0}async resolveConflictFromSweep($,Z,X){let Q=X.find((Y)=>Y.state!=="closed"&&Y.conflict===!0);if(!Q)return!1;return await UD($,Z.organizationId,Z,{pr:{number:Q.number,url:Q.url},conflict:!0}).catch((Y)=>{return console.error("[task-board-review-sweeper] conflict resolve failed",Y),!1})}dispose(){if(this.timer)clearInterval(this.timer),this.timer=null}}var BD6=60000,OD6=300000,DD6=50,LD6=60000,wD6=900000,ED6=120000;var Vi$=D(()=>{v5();j6();Hr0();wN();et();iK();ki$();z5();YJ();eo0();JG();kt();kg()});import{readdir as PD6,rm as pT0}from"fs/promises";import{join as nT0}from"path";async function tT0($){let Z=new Date;Z.setUTCDate(Z.getUTCDate()-AD6),Z.setUTCHours(0,0,0,0);let X=0;try{let Q=await vv($);for(let Y of Q)if(/^\d{4}$/.test(Y))X+=await Si$($,Y,Z);else if(!Y.startsWith(".")){let G=nT0($,Y),J=await vv(G);for(let K of J){if(!/^\d{4}$/.test(K))continue;X+=await Si$(G,K,Z)}if((await vv(G)).length===0)await pT0(G,{recursive:!0,force:!0})}}catch(Q){console.warn("monitoring retention cleanup failed:",Q)}return X}async function Si$($,Z,X){let Q=0,Y=nT0($,Z),G=await vv(Y);for(let W of G){if(!/^\d{2}$/.test(W))continue;let K=nT0(Y,W),H=await vv(K);for(let N of H){if(!/^\d{2}$/.test(N))continue;let U=new Date(`${Z}-${W}-${N}T00:00:00Z`);if(isNaN(U.getTime()))continue;if(U<X){let B=nT0(K,N);await pT0(B,{recursive:!0,force:!0}),Q++}}if((await vv(K)).length===0)await pT0(K,{recursive:!0,force:!0})}if((await vv(Y)).length===0)await pT0(Y,{recursive:!0,force:!0});return Q}async function vv($){try{return(await PD6($)).filter((X)=>!X.startsWith("."))}catch{return[]}}var AD6=30;var MX1=()=>{};import{DBOS as kX1,SchedulerMode as TD6}from"@dbos-inc/dbos-sdk";async function ID6(){let $=[nJ(),fv(),gH()],Z=0;for(let X of $)try{Z+=await tT0(X)}catch(Q){console.error("[monitoring-retention] cleanup failed:",Q)}return console.log(`[monitoring-retention] deleted ${Z} day-dir(s) across ${$.length} signal dir(s)`),{deleted:Z,dirs:$.length}}async function qD6($,Z){await kX1.runStep(()=>ID6(),{name:"monitoringRetention"})}function _i$(){if(Ci$)return;Ci$=!0;let $=kX1.registerWorkflow(qD6,{name:"monitoringRetentionWorkflow"});kX1.registerScheduled($,{name:"monitoringRetentionWorkflow",crontab:RD6,mode:TD6.ExactlyOncePerIntervalWhenActive})}var RD6="23 4 * * *",Ci$=!1;var vi$=D(()=>{RY();MX1()});function fi$($){return async(Z,X)=>{let Q=await $.db.selectFrom("member").innerJoin("organization","organization.id","member.organizationId").select(["member.role","organization.id as orgId","organization.slug as orgSlug","organization.name as orgName"]).where("member.userId","=",X).where("member.organizationId","=",Z).executeTakeFirst();if(!Q)return console.warn(`[automationContextFactory] User ${X} not found in org ${Z} \u2014 returning null`),null;let Y=await wJ.create();Y.auth.user={id:X,role:Q.role},Y.organization={id:Q.orgId,slug:Q.orgSlug,name:Q.orgName};let G=await xt($.db,Z,Q.role);return Y.boundAuth=I91({auth:Y.authInstance,headers:new Headers,role:Q.role,permissions:G,userId:X}),Y.access=new JE(X,void 0,Y.boundAuth,Q.role,"self"),KD(Y,{id:Q.orgId,slug:Q.orgSlug}),Y}}var bi$=D(()=>{pB();HD()});function MD6(){return[{name:"Postgres",status:"pending",port:0},{name:"NATS",status:"pending",port:0}]}function kD6(){return{services:MD6(),migrationsStatus:"pending",serverUrl:null,logs:[]}}function SD6(){for(let $ of VD6)$()}function xi$($){let Z=[...VX1.logs,$];VX1={...VX1,logs:Z.length>500?Z.slice(-500):Z},SD6()}function SX1(){return CD6}var VX1,VD6,CD6=!1;var CX1=D(()=>{VX1=kD6(),VD6=new Set});import{EventEmitter as _D6}from"events";var _X1;var yi$=D(()=>{CX1();_X1=new _D6;_X1.on("request",($)=>{xi$($)})});function gi$(){return async($,Z)=>{let X=Date.now(),Q=$.req.method,Y=$.req.path;if(Y==="/api/auth/get-session"||Y.includes("favicon")){await Z();return}let G="",J=!1;if(Y.startsWith("/mcp")&&Q==="POST"){J=!0;try{if($.req.header("Content-Type")?.includes("application/json")){let U=await $.req.raw.clone().json();if(U.method==="tools/call"&&U.params?.name){let B=Ul(U.params.name),O=U.params.arguments||{},L=Object.keys(O).map((E)=>Ul(E)),w=L.length>0?L.slice(0,3).join(",")+(L.length>3?"\u2026":""):"";G=`${W5.tool}${B}${W5.dim}(${w})${W5.reset}`}else if(U.method)G=`${W5.dim}${Ul(U.method)}${W5.reset}`}}catch{}}let W=Ul(Y);if(Y.startsWith("/mcp/conn_")){let F=Y.split("/")[2]??"";W=`/mcp/${W5.mcp}${Ul(F.slice(0,12))}\u2026${W5.reset}`}else if(Y==="/mcp")W=`${W5.mcp}/mcp${W5.reset}`;else if(Y==="/mcp/registry")W=`${W5.mcp}/mcp/registry${W5.reset}`;let K=fD6(Q),H=J?"\u25C0":"\u2190";if(!SX1())console.log(`${W5.dim}${H}${W5.reset} ${K}${Q}${W5.reset} ${W}${G?` ${G}`:""}`);try{await Z()}finally{let F=Date.now()-X,N=$.res.status,U=vD6(N),B=F<1000?`${F}ms`:`${(F/1000).toFixed(1)}s`,O=J?"\u25B6":"\u2192";if(!SX1())console.log(`${W5.dim}${O}${W5.reset} ${K}${Q}${W5.reset} ${W}${G?` ${G}`:""} ${U}${N}${W5.reset} ${W5.duration}${B}${W5.reset}`);_X1.emit("request",{method:Q,path:Ul(Y),status:N,duration:F,timestamp:new Date})}}}var W5,vD6=($)=>{if($>=500)return W5.serverError;if($>=400)return W5.clientError;if($>=300)return W5.redirect;return W5.ok},fD6=($)=>{return W5[$]||W5.reset},Ul=($)=>{return $.replace(/\r/g,"").replace(/\n/g,"").replace(/\x1b\[[0-9;]*m/g,"").replace(/[\x00-\x1f\x7f-\x9f]/g,"")};var hi$=D(()=>{CX1();yi$();W5={reset:"\x1B[0m",dim:"\x1B[2m",bold:"\x1B[1m",GET:"\x1B[36m",POST:"\x1B[33m",PUT:"\x1B[35m",DELETE:"\x1B[31m",ok:"\x1B[32m",redirect:"\x1B[36m",clientError:"\x1B[33m",serverError:"\x1B[31m",mcp:"\x1B[35m",tool:"\x1B[96m",duration:"\x1B[90m"}});import{createHmac as di$}from"crypto";import{mkdir as bD6,readdir as xD6,rm as ui$,stat as mi$}from"fs/promises";import{join as fX1,relative as yD6}from"path";import{z as T$}from"zod";function pi$($){let Z=$.replace(/[^a-zA-Z0-9_-]/g,"_");return fX1(gD6,Z)}function ni$($){return $.replace(/^\/+/,"").replace(/\.\./g,"")}function vX1($,Z){let X=pi$($),Q=ni$(Z);return fX1(X,Q)}function hD6($,Z,X,Q){let Y=C0().encryptionKey||"dev-secret",G=`${$}:${Z}:${X}:${Q}`;return di$("sha256",Y).update(G).digest("hex")}function ci$($,Z,X,Q,Y){let G=Math.floor(Date.now()/1000)+Q,J=hD6(Z,X,G,Y),W=new URL(`/api/dev-assets/${Z}/${ni$(X)}`,$);return W.searchParams.set("expires",G.toString()),W.searchParams.set("signature",J),W.searchParams.set("method",Y),W.toString()}function ti$($,Z,X){let Q=`${$}:${Z.getTime()}:${X}`;return`"${di$("md5","etag").update(Q).digest("hex")}"`}async function oi$($,Z,X,Q,Y){try{let G=await xD6($,{withFileTypes:!0});for(let J of G){let W=fX1($,J.name),H=yD6(Z,W).replace(/\\/g,"/");if(X&&!H.startsWith(X))continue;if(J.isDirectory())if(Q){let F=H+"/";if(!X||F.startsWith(X)){if(!(X?H.slice(X.length):H).includes("/"))Y.commonPrefixes.add(F)}}else await oi$(W,Z,X,Q,Y);else if(J.isFile()){if(Q&&X){let F=H.slice(X.length);if(F.includes(Q)){let N=F.indexOf(Q),U=X+F.slice(0,N+1);Y.commonPrefixes.add(U);continue}}try{let F=await mi$(W);Y.objects.push({key:H,size:F.size,lastModified:F.mtime.toISOString(),etag:ti$(W,F.mtime,F.size)})}catch{}}}}catch{}}function ri$($,Z){let Q=n($).id;return[{name:"LIST_OBJECTS",description:"List objects in the local assets directory with pagination support",inputSchema:T$.object({prefix:T$.string().optional(),maxKeys:T$.number().optional().default(1000),continuationToken:T$.string().optional(),delimiter:T$.string().optional()}),outputSchema:T$.object({objects:T$.array(T$.object({key:T$.string(),size:T$.number(),lastModified:T$.string(),etag:T$.string()})),nextContinuationToken:T$.string().optional(),isTruncated:T$.boolean(),commonPrefixes:T$.array(T$.string()).optional()}),handler:async(Y)=>{let G=Y,J=G.prefix||"",W=G.maxKeys??1000,K=G.delimiter,H=G.continuationToken,F=pi$(Q);await bD6(F,{recursive:!0});let N={objects:[],commonPrefixes:new Set};await oi$(F,F,J,K,N),N.objects.sort((w,E)=>w.key.localeCompare(E.key));let U=0;if(H){if(U=N.objects.findIndex((w)=>w.key>H),U===-1)U=N.objects.length}let B=N.objects.slice(U,U+W),O=U+W<N.objects.length,L=O?B[B.length-1]?.key:void 0;return{objects:B,isTruncated:O,nextContinuationToken:L,commonPrefixes:Array.from(N.commonPrefixes).sort()}}},{name:"GET_OBJECT_METADATA",description:"Get metadata for a file in the local assets directory",inputSchema:T$.object({key:T$.string()}),outputSchema:T$.object({contentType:T$.string().optional(),contentLength:T$.number(),lastModified:T$.string(),etag:T$.string(),metadata:T$.record(T$.string(),T$.string()).optional()}),handler:async(Y)=>{let G=Y,J=vX1(Q,G.key),W=await mi$(J);return{contentType:BZ1(G.key),contentLength:W.size,lastModified:W.mtime.toISOString(),etag:ti$(J,W.mtime,W.size)}}},{name:"GET_PRESIGNED_URL",description:"Generate a presigned URL for downloading a file from local storage",inputSchema:T$.object({key:T$.string(),expiresIn:T$.number().optional()}),outputSchema:T$.object({url:T$.string(),expiresIn:T$.number()}),handler:async(Y)=>{let G=Y,J=G.expiresIn??li$;return{url:ci$(Z,Q,G.key,J,"GET"),expiresIn:J}}},{name:"PUT_PRESIGNED_URL",description:"Generate a presigned URL for uploading a file to local storage",inputSchema:T$.object({key:T$.string(),expiresIn:T$.number().optional(),contentType:T$.string().optional()}),outputSchema:T$.object({url:T$.string(),expiresIn:T$.number()}),handler:async(Y)=>{let G=Y,J=G.expiresIn??li$;return{url:ci$(Z,Q,G.key,J,"PUT"),expiresIn:J}}},{name:"DELETE_OBJECT",description:"Delete a single file from local storage",inputSchema:T$.object({key:T$.string()}),outputSchema:T$.object({success:T$.boolean(),key:T$.string()}),handler:async(Y)=>{let G=Y,J=vX1(Q,G.key);try{return await ui$(J),{success:!0,key:G.key}}catch{return{success:!1,key:G.key}}}},{name:"DELETE_OBJECTS",description:"Delete multiple files from local storage",inputSchema:T$.object({keys:T$.array(T$.string()).max(1000)}),outputSchema:T$.object({deleted:T$.array(T$.string()),errors:T$.array(T$.object({key:T$.string(),message:T$.string()}))}),handler:async(Y)=>{let G=Y,J=[],W=[];return await Promise.all(G.keys.map(async(K)=>{let H=vX1(Q,K);try{await ui$(H),J.push(K)}catch(F){W.push({key:K,message:F instanceof Error?F.message:"Unknown error"})}})),{deleted:J,errors:W}}}]}async function bX1($,Z,X){let Q=ri$(Z,X),Y=new XK({name:"dev-assets-mcp",version:"1.0.0"},{capabilities:{tools:{}},jsonSchemaValidator:U5});for(let J of Q){let W="shape"in J.inputSchema?J.inputSchema.shape:T$.object({}).shape,K=J.outputSchema&&"shape"in J.outputSchema?J.outputSchema.shape:T$.object({}).shape;Y.registerTool(J.name,{description:J.description??"",inputSchema:W,outputSchema:K,annotations:J.annotations,_meta:J._meta},async(H)=>{try{let F=await J.handler(H);return{content:[{type:"text",text:JSON.stringify(F)}],structuredContent:F}}catch(F){return{content:[{type:"text",text:`Error: ${F.message}`}],isError:!0}}})}let G=new HQ({enableJsonResponse:$.headers.get("Accept")?.includes("application/json")??!1});return await Y.connect(G),MJ(Y,G,$,"mcp:dev-assets")}async function si$($,Z,X,Q){let G=ri$(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 gD6="./data/assets",li$=3600,ii$,ai$;var ei$=D(()=>{E$();tg();Q8();Gm();L_();mX();mA0();ii$=new K1;ii$.all("/",async($)=>{let Z=$.get("studioContext"),X=new URL($.req.url),Q=`${X.protocol}//${X.host}`;return bX1($.req.raw,Z,Q)});ai$=ii$});var $p$={};J4($p$,{mountDevRoutes:()=>uD6});function uD6($,Z){$.all("/mcp/:connectionId{.*_dev-assets$}",Z,async(Q)=>{let Y=Q.get("studioContext"),G=new URL(Q.req.url),J=`${G.protocol}//${G.host}`;return bX1(Q.req.raw,Y,J)}),$.all("/mcp/:connectionId{.*_dev-assets$}/call-tool/:toolName",Z,async(Q)=>{let Y=Q.get("studioContext"),G=new URL(Q.req.url),J=`${G.protocol}//${G.host}`,W=Q.req.param("toolName");if(!W)return Q.json({error:"Missing tool name"},400);let K=await Q.req.json(),H=await si$(W,K,Y,J);if(H.isError)return Q.json(H.content,500);return Q.json(H.content)}),$.use("/mcp/dev-assets",Z),$.route("/mcp/dev-assets",ai$);let X=new K1;X.use("*",TW({mountPath:"/api/dev-assets"})),X.route("/",dA0({orgFromPath:!1})),$.route("/api/dev-assets",X)}var Zp$=D(()=>{Q8();YZ1();mA0();ei$()});import{sql as lD6}from"kysely";import{randomUUID as Xp$}from"crypto";import{z as cD6}from"zod";async function mD6($){let Z=new Date().toISOString(),X=Xp$(),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:Xp$(),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 lD6`SELECT
|
|
2984
2984
|
pg_notify('studio_events', ${X}),
|