decocms 4.230.7 → 4.230.8
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-D6J91YgS.js → AlertCircle-DIHfEpn6.js} +1 -1
- package/dist/client/assets/{AreaChart-Cz5RthK4.js → AreaChart-Dafm_8rE.js} +1 -1
- package/dist/client/assets/{ArrowLeft-CeSfjZxH.js → ArrowLeft-BLN-08Vd.js} +1 -1
- package/dist/client/assets/{ArrowUp-Dx-cLJyq.js → ArrowUp-Dqnz6X_K.js} +1 -1
- package/dist/client/assets/{ArrowUpRight-BhZDI0W3.js → ArrowUpRight-vFTj3Tzi.js} +1 -1
- package/dist/client/assets/{Check-Cnj0J8tI.js → Check-DU0l8lV-.js} +1 -1
- package/dist/client/assets/{CheckCircle-5d8Cd_83.js → CheckCircle-BHyXipM7.js} +1 -1
- package/dist/client/assets/{ChevronDown-Bvhq_Hf8.js → ChevronDown-o-W-Few8.js} +1 -1
- package/dist/client/assets/{ChevronRight-CCGUXu59.js → ChevronRight-C_60uWaq.js} +1 -1
- package/dist/client/assets/{ChevronUp-CpidZKIY.js → ChevronUp-CzgnufJk.js} +1 -1
- package/dist/client/assets/{Copy01-BRLw2C-r.js → Copy01-C90PX77P.js} +1 -1
- package/dist/client/assets/{CpuChip01-BjhPQMOV.js → CpuChip01-Cj0tKAl5.js} +1 -1
- package/dist/client/assets/{CreditCard01-uM6yeazB.js → CreditCard01-6FRnT4yP.js} +1 -1
- package/dist/client/assets/{DotsVertical-B-inZZZc.js → DotsVertical-DH3S8T87.js} +1 -1
- package/dist/client/assets/{Eye-BUUNS0kF.js → Eye-BUGHS-a2.js} +1 -1
- package/dist/client/assets/{FilterLines-ByQr6BPO.js → FilterLines-DdLaLNnZ.js} +1 -1
- package/dist/client/assets/{Globe01-1kA2itbe.js → Globe01-D2tiAMGX.js} +1 -1
- package/dist/client/assets/{Globe04--0cJgowR.js → Globe04-CYBOFCxv.js} +1 -1
- package/dist/client/assets/{HardDrive-BgtA549j.js → HardDrive-DlfHIXO4.js} +1 -1
- package/dist/client/assets/{Key01-D2QyuVeF.js → Key01-CTb4Sgt7.js} +1 -1
- package/dist/client/assets/{LayoutLeft-DYjnKh13.js → LayoutLeft-DIftdyTM.js} +1 -1
- package/dist/client/assets/{LinkExternal01-CH29Gqo5.js → LinkExternal01-DOJoVJ7D.js} +1 -1
- package/dist/client/assets/{LogOut01-DmFNsOxU.js → LogOut01-CR21Pbo_.js} +1 -1
- package/dist/client/assets/{Monitor01-_Oqnr_5v.js → Monitor01-wrTf7ZW6.js} +1 -1
- package/dist/client/assets/{Palette-COGC2fdg.js → Palette-BZ-ZEEbW.js} +1 -1
- package/dist/client/assets/{Play-CukrDSSD.js → Play-gqqcOrQ7.js} +1 -1
- package/dist/client/assets/{Plus-D1iQ96Va.js → Plus-Che0Qq3V.js} +1 -1
- package/dist/client/assets/{SearchLg-D8FRFT3V.js → SearchLg-CNcO3A06.js} +1 -1
- package/dist/client/assets/{SearchMd-ukBSt4UU.js → SearchMd-DTvjlY4U.js} +1 -1
- package/dist/client/assets/{Settings02-ACWgcqaz.js → Settings02-nIwHo2_w.js} +1 -1
- package/dist/client/assets/{Share07-CdVtOixm.js → Share07-CYqMpVRv.js} +1 -1
- package/dist/client/assets/{Shield01-Br3AIXBK.js → Shield01-DV7UyUeE.js} +1 -1
- package/dist/client/assets/{Star01-Cg_NcR6i.js → Star01-m5QETz3m.js} +1 -1
- package/dist/client/assets/{Stars01-DWILrNUm.js → Stars01-D_XPN8oi.js} +1 -1
- package/dist/client/assets/{Stars02-De0SCYX3.js → Stars02-yRnU52HO.js} +1 -1
- package/dist/client/assets/{Sun-DGjpE4_l.js → Sun-DDfD65ex.js} +1 -1
- package/dist/client/assets/{SwitchHorizontal01-BUEZrOQe.js → SwitchHorizontal01-BwNxR4oW.js} +1 -1
- package/dist/client/assets/{Tool01-CNBBuX-z.js → Tool01-Au9WF63u.js} +1 -1
- package/dist/client/assets/{Tool02-DYJhBGlJ.js → Tool02-Cf24BX51.js} +1 -1
- package/dist/client/assets/{Trash01-CFaDcpBF.js → Trash01-YKnBp2aw.js} +1 -1
- package/dist/client/assets/{TrendUp01-G_2Edbqa.js → TrendUp01-PqkHviUU.js} +1 -1
- package/dist/client/assets/{Upload01-QBRVYlsV.js → Upload01-erX0ZmNX.js} +1 -1
- package/dist/client/assets/{User01-Dpx5TcAi.js → User01-DNNXk6UT.js} +1 -1
- package/dist/client/assets/{Users01-zAi-RHVo.js → Users01-tPwhcfQA.js} +1 -1
- package/dist/client/assets/{Users03-gnfX9XZC.js → Users03-Cy9EyNhl.js} +1 -1
- package/dist/client/assets/{X-BHbcDZbu.js → X-DxkJZwBX.js} +1 -1
- package/dist/client/assets/{XCircle-BHF_6f47.js → XCircle-BkX717Hb.js} +1 -1
- package/dist/client/assets/{XClose-DU4DKFhN.js → XClose-Bqyxy7ts.js} +1 -1
- package/dist/client/assets/{YAxis-Ba4cwQQk.js → YAxis-BWelz5Bs.js} +1 -1
- package/dist/client/assets/{Zap-DEkPxyRb.js → Zap-CM2gayGr.js} +1 -1
- package/dist/client/assets/{ZapSquare-D1B56P7N.js → ZapSquare-B2_vruNQ.js} +1 -1
- package/dist/client/assets/{access-gate-CXn_HuFI.js → access-gate-CYWzDFo4.js} +1 -1
- package/dist/client/assets/{agent-icon-CMLMKh7E.js → agent-icon-CRxk1TKp.js} +1 -1
- package/dist/client/assets/{agents-list-DwKLWdsf.js → agents-list-DwKAgHzg.js} +1 -1
- package/dist/client/assets/{ai-providers-CUjGPxqZ.js → ai-providers-BJPUSS0F.js} +1 -1
- package/dist/client/assets/{alert-BUc3NqYc.js → alert-_QveO5x3.js} +1 -1
- package/dist/client/assets/{alert-dialog-CeYKTQtj.js → alert-dialog-BT5rEvuk.js} +1 -1
- package/dist/client/assets/{api-keys-B_lWzVXz.js → api-keys-5OVizKx_.js} +1 -1
- package/dist/client/assets/{app-editor-DaIxPCEv.js → app-editor-D0FuYxdm.js} +1 -1
- package/dist/client/assets/{auth-catchall-BdbsDdXs.js → auth-catchall-BAhq3qEL.js} +1 -1
- package/dist/client/assets/{auth-entry-BNAr25Ij.js → auth-entry-CzBaNmpQ.js} +1 -1
- package/dist/client/assets/{auth-split-layout-Cf7oigs7.js → auth-split-layout-DTONk83A.js} +1 -1
- package/dist/client/assets/{auth-Db22gGlK.js → auth-ybSSIUlM.js} +1 -1
- package/dist/client/assets/{authenticate-and-persist-oauth-BmjfJFCk.js → authenticate-and-persist-oauth-DkZ8Y84H.js} +1 -1
- package/dist/client/assets/{automation-list-row-DhpzDINh.js → automation-list-row-DnFV9TLZ.js} +1 -1
- package/dist/client/assets/{automation-runs-C_bs-_uI.js → automation-runs-D7tgxauL.js} +1 -1
- package/dist/client/assets/{automations-DN5G5fRI.js → automations-ChpxJGpl.js} +1 -1
- package/dist/client/assets/{avatar-C1dRFklD.js → avatar-B2dmSUaL.js} +1 -1
- package/dist/client/assets/{badge-DXurUmkL.js → badge-CCoIsH0p.js} +1 -1
- package/dist/client/assets/{billing-zbN91dZW.js → billing-DMM61Iiy.js} +1 -1
- package/dist/client/assets/{block-document-WbcizTdw.js → block-document-CQYHOjRz.js} +1 -1
- package/dist/client/assets/{brand-context-CeUsNwsl.js → brand-context-BwJZPP-z.js} +1 -1
- package/dist/client/assets/{buckets-BlVzk-lp.js → buckets-CIIUfX-D.js} +1 -1
- package/dist/client/assets/{bulk-category-panel-CfsR6vVu.js → bulk-category-panel-DE_g5tQv.js} +1 -1
- package/dist/client/assets/{capability-load-error-NzbRihN6.js → capability-load-error-Bl1cK_tI.js} +1 -1
- package/dist/client/assets/{card-CQ1PrcOC.js → card-CCfTlKp1.js} +1 -1
- package/dist/client/assets/{cards-B3KH9_z0.js → cards-Ce4gXaGo.js} +1 -1
- package/dist/client/assets/{category-editor-Ci2FcS7v.js → category-editor-DkBsRRg8.js} +1 -1
- package/dist/client/assets/{chart-CQmKeyx5.js → chart-BYJ-Dwpf.js} +1 -1
- package/dist/client/assets/{chat-context-CeWyI77u.js → chat-context-BWgsW_rS.js} +1 -1
- package/dist/client/assets/{checkbox-D_zdOY_D.js → checkbox-DvobALmx.js} +1 -1
- package/dist/client/assets/{cli-auth-success-CHs-25-i.js → cli-auth-success-CfAvkUhC.js} +1 -1
- package/dist/client/assets/{collection-detail-CDHiyhik.js → collection-detail-PChWzMPT.js} +1 -1
- package/dist/client/assets/{collection-display-button-CyNDMFKc.js → collection-display-button-H31h3qjV.js} +1 -1
- package/dist/client/assets/{collection-search-DazJfX-6.js → collection-search-B5CWVjTJ.js} +1 -1
- package/dist/client/assets/{collection-table-wrapper-Oa8cqQR1.js → collection-table-wrapper-BP2-7fjL.js} +1 -1
- package/dist/client/assets/{collection-tabs-BzLkMjZG.js → collection-tabs-CVD_u2l6.js} +1 -1
- package/dist/client/assets/{command-D3RXzve5.js → command-DD18pFc4.js} +1 -1
- package/dist/client/assets/{commerce-onboarding-BcFY3dzh.js → commerce-onboarding-0w3_n94f.js} +1 -1
- package/dist/client/assets/{connect-CMfZIICg.js → connect-DuNvn3WK.js} +1 -1
- package/dist/client/assets/{connection-BS_exCFr.js → connection-U6Dqf-yP.js} +1 -1
- package/dist/client/assets/{connection-card-5EFpAwDC.js → connection-card-C9XEak5m.js} +1 -1
- package/dist/client/assets/{connection-detail-d03kx36d.js → connection-detail-DwNZyEaI.js} +1 -1
- package/dist/client/assets/{connection-form-helpers-C3LFt9cb.js → connection-form-helpers-B4Kh_iFp.js} +1 -1
- package/dist/client/assets/{connections-BAkZCmB5.js → connections-DxNhh3tB.js} +1 -1
- package/dist/client/assets/{decopilot-sse-pool-VgRnY0ah.js → decopilot-sse-pool-kyP4JOAV.js} +1 -1
- package/dist/client/assets/{dialog-DvJcHkwt.js → dialog-p1PEzpZx.js} +1 -1
- package/dist/client/assets/{domain-settings-GmK-jqTd.js → domain-settings-B3Xh-JF4.js} +1 -1
- package/dist/client/assets/{drawer-Cb58QOVE.js → drawer-DWF7gJyQ.js} +1 -1
- package/dist/client/assets/{dropdown-menu-CL2OSEuY.js → dropdown-menu-BO6Ptq7i.js} +1 -1
- package/dist/client/assets/{empty-state-D69TGhFG.js → empty-state-CwEgtwq4.js} +1 -1
- package/dist/client/assets/{extract-connection-data-BxaWZ_YJ.js → extract-connection-data-BJDdj4pq.js} +1 -1
- package/dist/client/assets/{file-explorer-8Lr54FuW.js → file-explorer-UPzN6cjs.js} +1 -1
- package/dist/client/assets/{file-type-icon-CSG6Oook.js → file-type-icon-CuTD1BBy.js} +1 -1
- package/dist/client/assets/{form-Dy5rvZNG.js → form-DGLesdO3.js} +1 -1
- package/dist/client/assets/{general-DlTI3nxO.js → general-CJYAXR1J.js} +1 -1
- package/dist/client/assets/{github-repo-picker-Dgn4YHyo.js → github-repo-picker-M_wZXWMg.js} +1 -1
- package/dist/client/assets/{hooks-BIq3lutc.js → hooks-PIbzaUUm.js} +1 -1
- package/dist/client/assets/{index-DJkNxVxm.js → index-BGOnnCQj.js} +5 -5
- package/dist/client/assets/{index-BSpJVlTU.js → index-BWM3Bi2j.js} +1 -1
- package/dist/client/assets/{index-VScIq4cd.js → index-Bjt2LTu1.js} +1 -1
- package/dist/client/assets/{index-DsHWlzry.js → index-Csv87IN-.js} +1 -1
- package/dist/client/assets/{index-CGRLkfOz.js → index-D7sHF8Rl.js} +1 -1
- package/dist/client/assets/{index-BCHyTSoV.js → index-DGOLOqRY.js} +1 -1
- package/dist/client/assets/{index-CcGLeNgy.js → index-DO-N4ipB.js} +1 -1
- package/dist/client/assets/{index-DrcfiaV8.js → index-DQ2alWk2.js} +3 -3
- package/dist/client/assets/{index-qOle37d7.js → index-Dp7ivpI2.js} +1 -1
- package/dist/client/assets/{index-redirect-CXd24tkN.js → index-redirect-nBxuGw9y.js} +1 -1
- package/dist/client/assets/{index-Dhr50YFD.js → index-uK1b0KFF.js} +1 -1
- package/dist/client/assets/{infra-billing-D03nR3GQ.js → infra-billing-DBzpGAni.js} +1 -1
- package/dist/client/assets/{input-Ck6l2xy3.js → input-BB0LVxK0.js} +1 -1
- package/dist/client/assets/{integration-icon-D5dRFJ9b.js → integration-icon-B50axVey.js} +1 -1
- package/dist/client/assets/{invite-member-dialog-C5KEY00o.js → invite-member-dialog-CkkuB4-W.js} +1 -1
- package/dist/client/assets/{label-DYAJlKD5.js → label-ByHw2rA0.js} +1 -1
- package/dist/client/assets/{layout-AzN_DEHs.js → layout-BQ3RhcpN.js} +1 -1
- package/dist/client/assets/{login-BKfRfOqa.js → login-Bk4DQlHZ.js} +1 -1
- package/dist/client/assets/{mcp-oauth-CbSLCaTE.js → mcp-oauth-BxROko_f.js} +1 -1
- package/dist/client/assets/{members-D_D7wlc2.js → members-CaNP58RF.js} +1 -1
- package/dist/client/assets/{monaco-editor-Dk9f4v9I.js → monaco-editor-CYurPlaf.js} +1 -1
- package/dist/client/assets/{monitoring-stats-row-aaBg-WOG.js → monitoring-stats-row-B1EaYS2P.js} +1 -1
- package/dist/client/assets/{multi-select-9PA9uBI_.js → multi-select-Cv-9okFR.js} +1 -1
- package/dist/client/assets/{oauth-callback-hMlUXBfX.js → oauth-callback-Bwo_bg_E.js} +1 -1
- package/dist/client/assets/{oauth-callback-ai-provider-C6U6Fuyn.js → oauth-callback-ai-provider-BHVu8qwh.js} +1 -1
- package/dist/client/assets/{onboarding-DbfDrTbZ.js → onboarding-NW1jppZW.js} +1 -1
- package/dist/client/assets/{org-layout-DJggXpzf.js → org-layout-Zjy54ULM.js} +1 -1
- package/dist/client/assets/{organization-choice-CZXYRjNI.js → organization-choice-II6hKWxW.js} +1 -1
- package/dist/client/assets/{orgs-BPqu0atp.js → orgs-CRjpmWmb.js} +1 -1
- package/dist/client/assets/{page-seo-form-PNCC8qgS.js → page-seo-form-BMDVvhV-.js} +1 -1
- package/dist/client/assets/{popover-Cml1KJzl.js → popover-fcJBzvgb.js} +1 -1
- package/dist/client/assets/{post-editor-Sc-NSz16.js → post-editor-B_uS93GY.js} +1 -1
- package/dist/client/assets/{primitives-BYu-AnR-.js → primitives-BKFFvkFR.js} +1 -1
- package/dist/client/assets/{profile-C36upBUX.js → profile-BWV3kQOe.js} +1 -1
- package/dist/client/assets/{project-app-view-DfQ7WFeF.js → project-app-view-BINLF06G.js} +1 -1
- package/dist/client/assets/record-editor-D5Z9lrDO.js +1 -0
- package/dist/client/assets/{redirect-editor-DIEWw-iN.js → redirect-editor-Cz1sEpuN.js} +1 -1
- package/dist/client/assets/registry-5Lr7Jkn2.js +2 -0
- package/dist/client/assets/{registry-layout-DTeF4fMm.js → registry-layout-CIiu4jqm.js} +1 -1
- package/dist/client/assets/{reports-C-jIZSCv.js → reports-BStRQXkg.js} +1 -1
- package/dist/client/assets/{require-capability-CaLJYcr-.js → require-capability-D7x_sr6p.js} +1 -1
- package/dist/client/assets/{required-auth-layout-BMNgvP3E.js → required-auth-layout-CEzrZQRK.js} +1 -1
- package/dist/client/assets/{reset-password-CVyZa_Wn.js → reset-password-gqhmjf61.js} +1 -1
- package/dist/client/assets/{roles-u94TH586.js → roles-BjxtySU_.js} +1 -1
- package/dist/client/assets/{search-input-mDSUuu0e.js → search-input-B8ZprT-e.js} +1 -1
- package/dist/client/assets/{secrets-BBnx0klx.js → secrets-CyB90seu.js} +1 -1
- package/dist/client/assets/{sections-editor-B2m6h0si.js → sections-editor-BIpRH8R0.js} +1 -1
- package/dist/client/assets/{select-CHyG5dNp.js → select-DyBxjJl_.js} +1 -1
- package/dist/client/assets/{select-model-BklgbNOl.js → select-model-BQHdemj4.js} +1 -1
- package/dist/client/assets/{self-tool-result-Dh9aPiKG.js → self-tool-result-BCAtHNwc.js} +1 -1
- package/dist/client/assets/{seo-editor-CrLLtVK0.js → seo-editor-B2egRpxG.js} +1 -1
- package/dist/client/assets/{settings-layout-Ba22Ai5Q.js → settings-layout-BxCxEHAC.js} +1 -1
- package/dist/client/assets/{settings-section-B6aPWKJ7.js → settings-section-C9AzeDET.js} +1 -1
- package/dist/client/assets/{shell-controls-BQzSXlRZ.js → shell-controls-BeRDauy_.js} +1 -1
- package/dist/client/assets/{shell-layout-BixvOMA4.js → shell-layout-VzXe0dsv.js} +1 -1
- package/dist/client/assets/{sidebar-Rb7HoTnR.js → sidebar-C42yvYUC.js} +1 -1
- package/dist/client/assets/{skeleton-D5evZQrv.js → skeleton-CCyUwDG-.js} +1 -1
- package/dist/client/assets/{spinner-EUpJ6FpN.js → spinner-Dcf0qymX.js} +1 -1
- package/dist/client/assets/{sso-Cvl4IIv-.js → sso-BO-h-jR2.js} +1 -1
- package/dist/client/assets/{store-CtxzmBYw.js → store-P9qbVC0R.js} +1 -1
- package/dist/client/assets/store-registry-DRT-B-wg.js +2 -0
- package/dist/client/assets/{studio-tools-CGE_aHX-.js → studio-tools-C66AV7Nn.js} +1 -1
- package/dist/client/assets/{switch-CUD9f0uL.js → switch-BrYkiyI_.js} +1 -1
- package/dist/client/assets/{synced-repos-BBbLFI5S.js → synced-repos-CStgKEWc.js} +1 -1
- package/dist/client/assets/{tab-id-BJBzixEx.js → tab-id-5BhVMiSG.js} +1 -1
- package/dist/client/assets/{table-CGfDG2iA.js → table-CbwLq6PS.js} +1 -1
- package/dist/client/assets/{tabs-Dob2HMGc.js → tabs-CKOOlu81.js} +1 -1
- package/dist/client/assets/{textarea-CwjR7SnM.js → textarea-CNj2h16x.js} +1 -1
- package/dist/client/assets/{toggle-group-DfB-jiE5.js → toggle-group-CPjzAVsJ.js} +1 -1
- package/dist/client/assets/{toolbar-F41heyEq.js → toolbar-iRuPDXbT.js} +1 -1
- package/dist/client/assets/{tooltip-CSpLQVlQ.js → tooltip-DUUOKWW2.js} +1 -1
- package/dist/client/assets/{track-BqWaXrhp.js → track-GxP9Ubi9.js} +1 -1
- package/dist/client/assets/{types-B7xN5BXV.js → types-rP5rUMZn.js} +1 -1
- package/dist/client/assets/{use-ai-providers-lCLndm4q.js → use-ai-providers-CT4a2iz0.js} +1 -1
- package/dist/client/assets/{use-api-keys-DIf_dJV8.js → use-api-keys-DD9pwnUK.js} +1 -1
- package/dist/client/assets/{use-automations-B1WSk7pE.js → use-automations-UY8UF1m8.js} +1 -1
- package/dist/client/assets/{use-autosave-BldfP4_V.js → use-autosave-D4y5kjRn.js} +1 -1
- package/dist/client/assets/{use-capability-BnTFVUVn.js → use-capability-BLZr0kmJ.js} +1 -1
- package/dist/client/assets/{use-clock-tick-2qKCmy-l.js → use-clock-tick-_AHSjUrM.js} +1 -1
- package/dist/client/assets/{use-commerce-diagnostic-DmNbu9Go.js → use-commerce-diagnostic-DtK7iSjj.js} +1 -1
- package/dist/client/assets/{use-connection-nVJvlf0i.js → use-connection-ChW97zoH.js} +1 -1
- package/dist/client/assets/{use-copy-CWheebeq.js → use-copy-B_jMqXF7.js} +1 -1
- package/dist/client/assets/{use-create-virtual-mcp-CPTi2SvY.js → use-create-virtual-mcp-B0o8aHQY.js} +1 -1
- package/dist/client/assets/{use-debounced-autosave-CDyK2_Fe.js → use-debounced-autosave-CcUqeYWH.js} +1 -1
- package/dist/client/assets/{use-debounced-value-nt9aVQKU.js → use-debounced-value-DsXCgSWN.js} +1 -1
- package/dist/client/assets/{use-decopilot-events-BBTPByyF.js → use-decopilot-events-Btp6RCZh.js} +1 -1
- package/dist/client/assets/{use-delete-connection-CTppf6x9.js → use-delete-connection-ZrjE3GOP.js} +1 -1
- package/dist/client/assets/{use-deployment-admin-D7GlHZ96.js → use-deployment-admin-CMpf9hZR.js} +1 -1
- package/dist/client/assets/{use-file-configs-DJzlBC0J.js → use-file-configs-DmWSlDs-.js} +1 -1
- package/dist/client/assets/{use-infinite-scroll-BwKhm6f5.js → use-infinite-scroll-Bsh2t_KZ.js} +1 -1
- package/dist/client/assets/{use-infra-billing-DUfd1_Gg.js → use-infra-billing-BPegRse-.js} +1 -1
- package/dist/client/assets/{use-join-requests-DzJimdP0.js → use-join-requests-CE4_Wb9F.js} +1 -1
- package/dist/client/assets/{use-mcp-client-CxvI45QI.js → use-mcp-client-DzEcWYew.js} +1 -1
- package/dist/client/assets/{use-mcp-tools-BOBITOuN.js → use-mcp-tools-D7yt0SrH.js} +1 -1
- package/dist/client/assets/{use-members-CreuP9XH.js → use-members-DVMc5Ljv.js} +1 -1
- package/dist/client/assets/{use-mobile-CkKJnd8I.js → use-mobile-Dk_QK-JJ.js} +1 -1
- package/dist/client/assets/{use-navigate-to-agent-C8K0LvqK.js → use-navigate-to-agent-CmbFhaTs.js} +1 -1
- package/dist/client/assets/{use-open-billing-url-LKnB2CfL.js → use-open-billing-url-CEzLYl25.js} +1 -1
- package/dist/client/assets/{use-org-auth-client-9DJPfBrO.js → use-org-auth-client-BcSiyIOb.js} +1 -1
- package/dist/client/assets/{use-org-sso-D0FCw_SS.js → use-org-sso-WxQa5yj2.js} +1 -1
- package/dist/client/assets/{use-organization-roles-Br96PXSr.js → use-organization-roles-Dae2X2_P.js} +1 -1
- package/dist/client/assets/{use-organization-settings-Dcl9H5Qn.js → use-organization-settings-BVcM1Nu5.js} +1 -1
- package/dist/client/assets/{use-registry-connections-FF3o2RF6.js → use-registry-connections-DRUo14P4.js} +1 -1
- package/dist/client/assets/{use-secrets-B2cnizip.js → use-secrets-BtUqR7Sa.js} +1 -1
- package/dist/client/assets/{use-section-preview-base-Ljo7zX-X.js → use-section-preview-base-BbT3W5Op.js} +1 -1
- package/dist/client/assets/{use-status-sounds-JDHQGIbg.js → use-status-sounds-DMfk2_cA.js} +1 -1
- package/dist/client/assets/{use-tags-DGBhOsLh.js → use-tags-CJBihZhN.js} +1 -1
- package/dist/client/assets/{use-view-mode-CxSQTzuL.js → use-view-mode-CNGJ756Z.js} +1 -1
- package/dist/client/assets/{use-virtual-mcp-CUFRh7sC.js → use-virtual-mcp-CWPjvdR-.js} +1 -1
- package/dist/client/assets/useInfiniteQuery-B-xk4Z8r.js +1 -0
- package/dist/client/assets/{useRouterState-x0BysrMi.js → useRouterState-CcBZesOD.js} +1 -1
- package/dist/client/assets/useSuspenseInfiniteQuery-D539X74A.js +1 -0
- package/dist/client/assets/{users-8rcAKLr8.js → users-Bi5nxmVA.js} +1 -1
- package/dist/client/assets/{variant-calendar-CFq9YN_E.js → variant-calendar-DV2kIs9K.js} +1 -1
- package/dist/client/assets/{view-mode-toggle-CoAJ8r51.js → view-mode-toggle-fs4bDHAY.js} +1 -1
- package/dist/client/index.html +1 -1
- package/dist/server/cli.js +2 -2
- package/dist/server/server.js +2 -2
- package/package.json +1 -1
- package/dist/client/assets/record-editor-CUqvqg_T.js +0 -1
- package/dist/client/assets/registry-BByFk_Kq.js +0 -2
- package/dist/client/assets/store-registry-oltpUBA5.js +0 -2
- package/dist/client/assets/useInfiniteQuery-Sl-XkdKS.js +0 -1
- package/dist/client/assets/useSuspenseInfiniteQuery-CcUtTMJZ.js +0 -1
package/dist/server/server.js
CHANGED
|
@@ -106,7 +106,7 @@ You are running the brand-context onboarding for the user's organization. Your o
|
|
|
106
106
|
4. Do NOT call any other tools in this thread. Do NOT call \`brand_context_setup\` more than once.
|
|
107
107
|
|
|
108
108
|
If the tool returns an error, surface the error message to the user and ask whether they want to try a different URL.
|
|
109
|
-
`.trim();Ox1=PY("site-diagnostics_"),Yh6=Ox1.is,Gh6=Ox1.get,Bx1=PY("commerce-discovery_"),Jh6=Bx1.is,T80=Bx1.get;dH={AGENT_MANAGER:PY("studio-agent-manager_"),AUTOMATION_MANAGER:PY("studio-automation-manager_"),CONNECTION_MANAGER:PY("studio-connection-manager_"),API_KEY_MANAGER:PY("studio-api-key-manager_"),STORE_MANAGER:PY("studio-store-manager_"),BRAND_MANAGER:PY("studio-brand-manager_"),TASK_MANAGER:PY("studio-task-manager_"),USAGE_MANAGER:PY("studio-usage-manager_")},g7={AGENT_MANAGER:dH.AGENT_MANAGER.get,AUTOMATION_MANAGER:dH.AUTOMATION_MANAGER.get,CONNECTION_MANAGER:dH.CONNECTION_MANAGER.get,API_KEY_MANAGER:dH.API_KEY_MANAGER.get,STORE_MANAGER:dH.STORE_MANAGER.get,BRAND_MANAGER:dH.BRAND_MANAGER.get,TASK_MANAGER:dH.TASK_MANAGER.get,USAGE_MANAGER:dH.USAGE_MANAGER.get}});function zx1($){return $.toLowerCase().replace(/[^a-z0-9]/g,"")}function aS8($){return zx1($).includes("deepresearch")}function Px1($){let Z=zx1($);if(Z.includes("deepresearch"))return!1;return sS8.some((X)=>Z.includes(X))}function eS8($){return $.asyncResearch!==!0&&Px1($.modelId)}function $V8($){return $.asyncResearch===!0||aS8($.modelId)||Px1($.modelId)}function kf($,Z,X,Q){for(let Y of X){let G=$.find((J)=>J.modelId===Y);if(G)return{keyId:Z,modelId:G.modelId,title:G.title}}for(let Y of X){let G=$.find((J)=>J.modelId.includes(Y));if(G)return{keyId:Z,modelId:G.modelId,title:G.title}}if(Q){let Y=$.find(Q);if(Y)return{keyId:Z,modelId:Y.modelId,title:Y.title}}return null}function Ax1($,Z){let X={chat:{fast:null,smart:null,thinking:null},image:null,webSearch:null,deepResearch:null};for(let Q of $){let Y=Z[Q.id]??[],G=Q.providerId;if(!X.chat.fast)X.chat.fast=kf(Y,Q.id,iS8[G]??[]);if(!X.chat.smart)X.chat.smart=kf(Y,Q.id,nS8[G]??[]);if(!X.chat.thinking)X.chat.thinking=kf(Y,Q.id,pS8[G]??[]);if(!X.image)X.image=kf(Y,Q.id,tS8[G]??[],(J)=>J.capabilities?.includes("image")===!0);if(!X.webSearch)X.webSearch=kf(Y,Q.id,oS8[G]??[],eS8);if(!X.deepResearch)X.deepResearch=kf(Y,Q.id,rS8[G]??[],$V8)}return X}var iS8,nS8,pS8,tS8,oS8,rS8,sS8;var Tx1=w(()=>{iS8={anthropic:["claude-haiku-4-5","claude-haiku"],openrouter:["qwen/qwen3.5-flash","anthropic/claude-haiku-4.5","anthropic/claude-haiku","google/gemini-3-flash"],deco:["qwen/qwen3.5-flash","anthropic/claude-haiku"],llmapi:["claude-haiku-4-5","claude-haiku","gpt-4o-mini"],google:["gemini-2.5-flash","gemini-3-flash"]},nS8={anthropic:["claude-sonnet-5","claude-sonnet"],openrouter:["anthropic/claude-sonnet-5","anthropic/claude-sonnet","anthropic/claude-opus-4.8","google/gemini-3-pro"],deco:["anthropic/claude-sonnet-5","anthropic/claude-sonnet","anthropic/claude"],llmapi:["claude-sonnet-4-6","claude-sonnet"],google:["gemini-3-pro","gemini-3-flash"]},pS8={anthropic:["claude-opus-4-8","claude-sonnet-5","claude-sonnet","claude-fable-5"],openrouter:["anthropic/claude-opus-4.8:extended","anthropic/claude-opus-4.8","anthropic/claude-sonnet-5:extended","anthropic/claude-sonnet-5","google/gemini-3-pro","anthropic/claude-fable-5"],deco:["anthropic/claude-opus","anthropic/claude-sonnet-4.6","anthropic/claude-sonnet","anthropic/claude-fable"],llmapi:["claude-opus-4-8","claude-opus","claude-sonnet-4-6"],google:["gemini-3-pro"]},tS8={openrouter:["openai/gpt-image-1","google/gemini-2.0-flash-image"],deco:["openai/gpt-image-1","google/gemini-2.0-flash-image"],llmapi:["gemini-2.5-flash-image","gpt-image-1"],google:["gemini-2.0-flash-image"]},oS8={openrouter:["perplexity/sonar","perplexity/sonar-pro"],deco:["perplexity/sonar","perplexity/sonar-pro"]},rS8={openrouter:["perplexity/deep-research","perplexity/sonar-pro"],deco:["perplexity/deep-research","perplexity/sonar-pro"]};sS8=["sonar","searchpreview","online"]});function R80($){if(!$)return;let Z={};for(let X in $){let Q=$[X];if(typeof Q==="object"&&Q!==null){let Y={};for(let G of ZV8)if(G in Q)Y[G]=Q[G];Z[X]=Y}}return Object.keys(Z).length>0?Z:void 0}var ZV8;var Rx1=w(()=>{ZV8=["usage","cost","model"]});var F8=w(()=>{Z$0();jx1();Tx1();Rx1()});function I80($){return $.toLowerCase().trim().replace(/\//g,"-").replace(/[^a-z0-9\s_-]+/g,"").replace(/[\s_-]+/g,"-").replace(/^-+|-+$/g,"")}function RU($){if($.app_name)return $.app_name;if($.connection_url)try{let Z=new URL($.connection_url),Q=((Z.port?`${Z.hostname}-${Z.port}`:Z.hostname)+Z.pathname).replace(/\/+$/,"");return I80(Q)}catch{return I80($.connection_url)}if($.title)return I80($.title);return $.id??"unknown"}var q80=()=>{};var Sf=300000,M80=5000,Yx0=3,Gx0=30000,Ix1=65000,k80=1000,Vf=3,qx1=5,Mx1=60000,kx1=300000,Jx0=60000;function Sx1(){if(mH.size<k80)return;let $=null,Z=1/0;for(let[X,Q]of mH)if(Q.lastFailureAt<Z)Z=Q.lastFailureAt,$=X;if($)mH.delete($)}function Vx1($){let Z=mH.get($);if(!Z)return Sx1(),mH.set($,{consecutiveFailures:1,disabled:!1,lastFailureAt:Date.now()}),{consecutiveFailures:1,thresholdCrossed:1>=Vf};return Z.consecutiveFailures++,Z.lastFailureAt=Date.now(),{consecutiveFailures:Z.consecutiveFailures,thresholdCrossed:Z.consecutiveFailures>=Vf}}function Wx0($){let Z=mH.get($);if(Z){Z.disabled=!0;return}Sx1(),mH.set($,{consecutiveFailures:Vf,disabled:!0,lastFailureAt:Date.now()})}function Cx1($){return mH.get($)?.disabled??!1}function _x1($){mH.delete($)}var mH;var vx1=w(()=>{mH=new Map});import{sql as d$}from"kysely";function bx1($){if($.length===0)return null;let Z=$[0];if($.length===1&&QV8.has(Z))return d$.ref(Z);if($.length===2&&fx1.has(Z)){let X=$[1];return d$`${d$.ref(Z)}->>${d$.lit(X)}`}if($.length>2&&fx1.has(Z)){let X=`{${$.slice(1).join(",")}}`;return d$`${d$.ref(Z)}#>>${d$.lit(X)}`}return null}function xx1($){if("conditions"in $){let{operator:G,conditions:J}=$;if(J.length===0)return d$`true`;let W=J.map((K)=>xx1(K));switch(G){case"and":return d$`(${d$.join(W,d$` AND `)})`;case"or":return d$`(${d$.join(W,d$` OR `)})`;case"not":return d$`NOT (${d$.join(W,d$` AND `)})`;default:return d$`true`}}let{field:Z,operator:X,value:Q}=$,Y=bx1(Z);if(!Y)return d$`true`;switch(X){case"eq":return Q===null?d$`${Y} IS NULL`:d$`${Y} = ${d$.val(Q)}`;case"gt":return d$`${Y} > ${d$.val(Q)}`;case"gte":return d$`${Y} >= ${d$.val(Q)}`;case"lt":return d$`${Y} < ${d$.val(Q)}`;case"lte":return d$`${Y} <= ${d$.val(Q)}`;case"in":if(!Array.isArray(Q)||Q.length===0)return d$`false`;return d$`${Y} IN (${d$.join(Q.map((G)=>d$.val(G)))})`;case"like":return d$`${Y} ILIKE ${d$.val(Q)}`;case"contains":{let G=String(Q).replace(/[%_\\]/g,"\\$&");return d$`${Y} ILIKE ${d$.val(`%${G}%`)}`}default:return d$`true`}}class yl{db;vault;constructor($,Z){this.db=$;this.vault=Z}async create($){let Z=$.id??l8("conn"),X=new Date().toISOString(),Q=await this.findById(Z);if(Q){if(Q.organization_id!==$.organization_id)throw Error("Connection ID already exists");return this.update(Z,$)}let Y=RU($),G=await this.serializeConnection({...$,id:$.id??Z,slug:Y,status:"active",created_at:X,updated_at:X}),J=await this.db.insertInto("connections").values(G).returningAll().executeTakeFirst();if(!J)throw Error(`Failed to create connection with id: ${Z}`);return this.deserializeConnection(J)}async createNew($){let Z=$.id??l8("conn"),X=new Date().toISOString(),Q=RU($),Y=await this.serializeConnection({...$,id:Z,slug:Q,status:"active",created_at:X,updated_at:X}),G;try{G=await this.db.insertInto("connections").values(Y).returningAll().executeTakeFirst()}catch(J){if(J instanceof Error&&(J.message.includes("duplicate key")||J.message.includes("unique constraint")))throw Error("Connection ID already exists");throw J}if(!G)throw Error(`Failed to create connection with id: ${Z}`);return this.deserializeConnection(G)}async findById($,Z){let X=AG($);if(X)return Ex1(Z??X);let Q=this.db.selectFrom("connections").selectAll().where("id","=",$);if(Z)Q=Q.where("organization_id","=",Z);let Y=await Q.executeTakeFirst();return Y?this.deserializeConnection(Y):null}async list($,Z){let X=this.db.selectFrom("connections").selectAll().where("organization_id","=",$);if(!Z?.includeVirtual)X=X.where("connection_type","!=","VIRTUAL");if(Z?.slug)X=X.where("slug","=",Z.slug);if(Z?.where)X=X.where(xx1(Z.where));let G=(await this.db.selectFrom(X.as("filtered")).select(d$`count(*)::int`.as("count")).executeTakeFirst())?.count??0;if(Z?.orderBy&&Z.orderBy.length>0)for(let K of Z.orderBy){let H=bx1(K.field);if(!H)continue;let F=K.direction==="desc"?d$`desc`:d$`asc`,N=K.nulls==="first"?d$`nulls first`:d$`nulls last`;X=X.orderBy(d$`${H} ${F} ${N}`)}if(Z?.limit)X=X.limit(Z.limit);if(Z?.offset)X=X.offset(Z.offset);let J=await X.execute();return{items:await Promise.all(J.map((K)=>this.deserializeConnection(K))),totalCount:G}}async update($,Z){if(Object.keys(Z).length===0){let J=await this.findById($);if(!J)throw Error("Connection not found");return J}let X={...Z},Q=await this.findById($);if(Q){let J=(W)=>Z[W]===void 0?Q[W]:Z[W];X.slug=RU({app_name:J("app_name"),connection_url:J("connection_url"),title:J("title"),id:$})}let Y=await this.serializeConnection({...X,updated_at:new Date().toISOString()}),G=await this.db.updateTable("connections").set(Y).where("id","=",$).returningAll().executeTakeFirst();if(!G)throw Error("Connection not found after update");return this.deserializeConnection(G)}async isReferencedByThread($){return await this.db.selectFrom("threads").select("id").where(d$`metadata -> 'githubRepo' ->> 'connectionId' = ${$}`).limit(1).executeTakeFirst()!==void 0}async delete($){await this.db.deleteFrom("connections").where("id","=",$).execute()}async testConnection($,Z){let X=await this.findById($);if(!X)throw Error("Connection not found");let Q=Date.now();if(X.connection_type==="STDIO")return{healthy:!0,latencyMs:Date.now()-Q};if(!X.connection_url)return{healthy:!1,latencyMs:Date.now()-Q};try{if(await If(X.connection_url))return{healthy:!1,latencyMs:Date.now()-Q};let G=X.connection_headers,J=new AbortController,W=setTimeout(()=>J.abort(),1e4),K;try{K=await qf()(X.connection_url,{method:"POST",signal:J.signal,headers:{"Content-Type":"application/json",...X.connection_token&&{Authorization:`Bearer ${X.connection_token}`},...G?.headers,...Z},body:JSON.stringify({jsonrpc:"2.0",method:"ping",id:1})})}finally{clearTimeout(W)}return{healthy:K.ok||K.status===404,latencyMs:Date.now()-Q}}catch{return{healthy:!1,latencyMs:Date.now()-Q}}}async serializeConnection($){let Z={};for(let[X,Q]of Object.entries($)){if(Q===void 0)continue;if(X==="tools")continue;if(X==="connection_token"&&Q)Z[X]=await this.vault.encrypt(Q);else if(X==="configuration_state"&&Q){let Y=JSON.stringify(Q);Z[X]=await this.vault.encrypt(Y)}else if(X==="connection_headers"&&Q){let Y=Q;if(zW(Y)&&Y.envVars){let G={};for(let[J,W]of Object.entries(Y.envVars))G[J]=await this.vault.encrypt(W);Z[X]=JSON.stringify({...Y,envVars:G})}else Z[X]=JSON.stringify(Y)}else if(XV8.includes(X))Z[X]=Q?JSON.stringify(Q):null;else Z[X]=Q}return Z}async handleDecryptFailures($,Z){let X=`connection ${$.id} (org: ${$.organization_id}, type: ${$.connection_type}, title: ${$.title})`;if(Cx1($.id))return;if($.status!=="active"){Wx0($.id);return}let{thresholdCrossed:Q}=Vx1($.id);if(!Q){for(let{label:Y,error:G}of Z)console.error(`Failed to decrypt ${Y} for ${X}:`,G);return}try{await this.db.updateTable("connections").set({status:"error"}).where("id","=",$.id).execute(),Wx0($.id),console.error(`Disabled ${X} after ${Vf} consecutive decryption failures.`,Z[0]?.error)}catch(Y){console.error(`Failed to disable ${X} after decryption failures:`,Y)}}async deserializeConnection($){let Z=[],X=null;if($.connection_token)try{X=await this.vault.decrypt($.connection_token)}catch(J){Z.push({label:"connection token",error:J})}let Q=null;if($.configuration_state)try{let J=await this.vault.decrypt($.configuration_state);Q=JSON.parse(J)}catch(J){Z.push({label:"configuration state",error:J})}if(Z.length>0)await this.handleDecryptFailures($,Z);else if($.connection_token||$.configuration_state)_x1($.id);let Y=null;if($.connection_headers)try{let J=JSON.parse($.connection_headers);if(zW(J)&&J.envVars){let W={};for(let[K,H]of Object.entries(J.envVars))try{W[K]=await this.vault.decrypt(H)}catch{W[K]=H}Y={...J,envVars:W}}else Y=J}catch(J){console.error(`Failed to parse connection_headers for connection ${$.id} (org: ${$.organization_id}, type: ${$.connection_type}, title: ${$.title}):`,J)}let G=(J)=>{if(J===null)return null;if(typeof J==="string")try{return JSON.parse(J)}catch{return null}return J};return{id:$.id,organization_id:$.organization_id,created_by:$.created_by,updated_by:$.updated_by??void 0,title:$.title,description:$.description,icon:$.icon,app_name:$.app_name,app_id:$.app_id,slug:$.slug,connection_type:$.connection_type,connection_url:$.connection_url,connection_token:X,connection_headers:Y,oauth_config:G($.oauth_config),configuration_state:Q,configuration_scopes:G($.configuration_scopes),metadata:G($.metadata),tools:null,bindings:G($.bindings),status:$.status,created_at:$.created_at,updated_at:$.updated_at}}}var XV8,QV8,fx1;var Kx0=w(()=>{AW();xl();CX();F8();q80();vx1();XV8=["connection_headers","oauth_config","configuration_scopes","metadata","bindings"],QV8=new Set(["id","organization_id","created_by","updated_by","title","description","icon","app_name","app_id","slug","connection_type","connection_url","status","created_at","updated_at"]),fx1=new Set(["metadata","configuration_scopes","bindings"])});import{createHash as YV8,randomBytes as GV8,timingSafeEqual as Ch6}from"crypto";function WV8($){return $.toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function Fx0($){return YV8("sha256").update($).digest("hex")}function hx1($){let Z=Hx0.length+1,X=Z+gx1;if(!$.startsWith(`${Hx0}_`)||$.length<=X+1||$[X]!=="_")return null;let Q=$.slice(Z,X),Y=$.slice(X+1);if(!yx1.test(Q)||!yx1.test(Y))return null;return Q}function ux1(){let $=WV8(GV8(JV8)),Z=$.slice(0,gx1),X=`${Hx0}_${Z}_${$}`;return{plaintext:X,prefix:Z,hash:Fx0(X)}}var Hx0="stv",JV8=32,gx1=12,yx1;var cx1=w(()=>{yx1=/^[A-Za-z0-9_-]+$/});function lx1($){return{id:$.id,organizationId:$.organization_id,subjectConnectionId:$.subject_connection_id,tokenHash:$.token_hash,tokenPrefix:$.token_prefix,name:$.name,revokedAt:$.revoked_at,lastUsedAt:$.last_used_at,createdAt:$.created_at,updatedAt:$.updated_at}}class Nx0{db;constructor($){this.db=$}async createOrRotateWorkloadToken($){let Z=$.name??"default";return await this.db.transaction().execute(async(Q)=>{if(!await Q.selectFrom("connections").select("id").where("id","=",$.subjectConnectionId).where("organization_id","=",$.organizationId).executeTakeFirst())throw Error("Subject connection not found in organization");let G=ux1(),J=new Date().toISOString();await Q.updateTable("connection_workload_tokens").set({revoked_at:J,updated_at:J}).where("organization_id","=",$.organizationId).where("subject_connection_id","=",$.subjectConnectionId).where("name","=",Z).where("revoked_at","is",null).execute();let W=await Q.insertInto("connection_workload_tokens").values({id:l8("cwt"),organization_id:$.organizationId,subject_connection_id:$.subjectConnectionId,token_hash:G.hash,token_prefix:G.prefix,name:Z,revoked_at:null,last_used_at:null,created_at:J,updated_at:J}).returningAll().executeTakeFirstOrThrow();return{plaintextToken:G.plaintext,record:lx1(W)}})}async findActiveWorkloadToken($){let Z=await this.db.selectFrom("connection_workload_tokens").selectAll().where("organization_id","=",$.organizationId).where("subject_connection_id","=",$.subjectConnectionId).where("name","=",$.name??"default").where("revoked_at","is",null).executeTakeFirst();return Z?lx1(Z):null}async revokeWorkloadToken($){let Z=new Date().toISOString();await this.db.updateTable("connection_workload_tokens").set({revoked_at:Z,updated_at:Z}).where("id","=",$.tokenId).where("organization_id","=",$.organizationId).where("subject_connection_id","=",$.subjectConnectionId).where("revoked_at","is",null).execute()}async authenticateWorkloadToken($){let Z=hx1($);if(!Z)return null;let X=Fx0($),Q=await this.db.selectFrom("connection_workload_tokens").select(["id","organization_id","subject_connection_id","token_prefix"]).where("token_prefix","=",Z).where("token_hash","=",X).where("revoked_at","is",null).executeTakeFirst();if(!Q)return null;let Y=new Date().toISOString();return await this.db.updateTable("connection_workload_tokens").set({last_used_at:Y,updated_at:Y}).where("id","=",Q.id).execute(),{tokenId:Q.id,tokenPrefix:Q.token_prefix,organizationId:Q.organization_id,subjectConnectionId:Q.subject_connection_id}}async replaceGrantsForSubject($){await this.db.transaction().execute(async(Z)=>{if(!await Z.selectFrom("connections").select("id").where("id","=",$.subjectConnectionId).where("organization_id","=",$.organizationId).executeTakeFirst())throw Error("Referenced connection not found in organization");let Q=[...new Set($.grants.map((J)=>J.targetConnectionId))];if(Q.length>0){if((await Z.selectFrom("connections").select("id").where("organization_id","=",$.organizationId).where("id","in",Q).execute()).length!==Q.length)throw Error("Referenced connection not found in organization")}if(await Z.deleteFrom("connection_credential_grants").where("organization_id","=",$.organizationId).where("subject_connection_id","=",$.subjectConnectionId).execute(),$.grants.length===0)return;let Y=new Date().toISOString(),G=$.grants.map((J)=>({id:l8("ccg"),organization_id:$.organizationId,subject_connection_id:$.subjectConnectionId,target_connection_id:J.targetConnectionId,scope:J.scope,created_by:$.createdBy,created_at:Y,updated_at:Y}));await Z.insertInto("connection_credential_grants").values(G).execute()})}async hasGrant($){return!!await this.db.selectFrom("connection_credential_grants").select("id").where("organization_id","=",$.organizationId).where("subject_connection_id","=",$.subjectConnectionId).where("target_connection_id","=",$.targetConnectionId).where("scope","=",$.scope).executeTakeFirst()}}var S80="credential:access-token:read",V80="credential:configuration:read";var C80=w(()=>{CX();cx1()});class Cf{db;constructor($){this.db=$}async create($,Z,X,Q){let Y=Q?.id??l8("vir"),G=new Date().toISOString();await this.db.transaction().execute(async(W)=>{if(await W.insertInto("connections").values({id:Y,organization_id:$,created_by:Z,title:X.title,description:X.description??null,icon:X.icon??null,app_name:null,app_id:null,connection_type:"VIRTUAL",pinned:X.pinned??!1,connection_url:`virtual://${Y}`,connection_token:null,connection_headers:null,oauth_config:null,configuration_state:null,configuration_scopes:null,metadata:X.metadata?JSON.stringify(X.metadata):null,bindings:null,status:X.status??"active",created_at:G,updated_at:G}).execute(),X.connections.length>0)await W.insertInto("connection_aggregations").values(X.connections.map((K)=>({id:l8("agg"),parent_connection_id:Y,child_connection_id:K.connection_id,selected_tools:K.selected_tools?JSON.stringify(K.selected_tools):null,selected_resources:K.selected_resources?JSON.stringify(K.selected_resources):null,selected_prompts:K.selected_prompts?JSON.stringify(K.selected_prompts):null,dependency_mode:"direct",created_at:G}))).execute()});let J=await this.findById(Y);if(!J)throw Error(`Failed to create virtual MCP with id: ${Y}`);return J}async findById($,Z){let X=AG($);if(X)return{...Qx0(Z??X),pinned:!1,connections:[]};let Q=A80($);if(Q)return{...Ux1(Z??Q),pinned:!1,connections:[]};return this.findByIdInternal(this.db,$)}async findByIdInternal($,Z){let X=await $.selectFrom("connections").selectAll().where("id","=",Z).where("connection_type","=","VIRTUAL").executeTakeFirst();if(!X)return null;let Q=await $.selectFrom("connection_aggregations").selectAll().where("parent_connection_id","=",Z).where("dependency_mode","=","direct").execute();return this.deserializeVirtualMCPEntity(X,Q)}async list($,Z){let X=this.db.selectFrom("connections").selectAll().where("organization_id","=",$).where("connection_type","=","VIRTUAL");if(Z?.pinnedOnly)X=X.where("pinned","=",!0);let Q=await X.execute(),Y=Q.map((W)=>W.id);if(Y.length===0)return[];let G=await this.db.selectFrom("connection_aggregations").selectAll().where("parent_connection_id","in",Y).where("dependency_mode","=","direct").execute(),J=new Map;for(let W of G){let K=J.get(W.parent_connection_id)??[];K.push(W),J.set(W.parent_connection_id,K)}return Q.map((W)=>this.deserializeVirtualMCPEntity(W,J.get(W.id)??[]))}async listByIds($,Z){if(Z.length===0)return[];let X=await this.db.selectFrom("connections").selectAll().where("id","in",Z).where("organization_id","=",$).where("connection_type","=","VIRTUAL").execute();if(X.length===0)return[];let Q=X.map((J)=>J.id),Y=await this.db.selectFrom("connection_aggregations").selectAll().where("parent_connection_id","in",Q).where("dependency_mode","=","direct").execute(),G=new Map;for(let J of Y){let W=G.get(J.parent_connection_id)??[];W.push(J),G.set(J.parent_connection_id,W)}return X.map((J)=>this.deserializeVirtualMCPEntity(J,G.get(J.id)??[]))}async listByConnectionId($,Z){let Q=(await this.db.selectFrom("connection_aggregations").select("parent_connection_id").where("child_connection_id","=",Z).execute()).map((K)=>K.parent_connection_id);if(Q.length===0)return[];let Y=await this.db.selectFrom("connections").selectAll().where("id","in",Q).where("organization_id","=",$).where("connection_type","=","VIRTUAL").execute();if(Y.length===0)return[];let G=Y.map((K)=>K.id),J=await this.db.selectFrom("connection_aggregations").selectAll().where("parent_connection_id","in",G).where("dependency_mode","=","direct").execute(),W=new Map;for(let K of J){let H=W.get(K.parent_connection_id)??[];H.push(K),W.set(K.parent_connection_id,H)}return Y.map((K)=>this.deserializeVirtualMCPEntity(K,W.get(K.id)??[]))}async update($,Z,X){let Q=new Date().toISOString(),Y={updated_at:Q,updated_by:Z};if(X.title!==void 0)Y.title=X.title;if(X.description!==void 0)Y.description=X.description;if(X.icon!==void 0)Y.icon=X.icon;if(X.status!==void 0)Y.status=X.status;if(X.pinned!==void 0)Y.pinned=X.pinned;if(X.metadata!==void 0)Y.metadata=X.metadata?JSON.stringify(X.metadata):null;let G=[];await this.db.transaction().execute(async(W)=>{if(await W.updateTable("connections").set(Y).where("id","=",$).where("connection_type","=","VIRTUAL").execute(),X.connections!==void 0){let K=await W.selectFrom("connection_aggregations").select("child_connection_id").where("parent_connection_id","=",$).where("dependency_mode","=","direct").execute(),H=new Set(K.map((N)=>N.child_connection_id));if(await W.deleteFrom("connection_aggregations").where("parent_connection_id","=",$).where("dependency_mode","=","direct").execute(),X.connections.length>0)await W.insertInto("connection_aggregations").values(X.connections.map((N)=>({id:l8("agg"),parent_connection_id:$,child_connection_id:N.connection_id,selected_tools:N.selected_tools?JSON.stringify(N.selected_tools):null,selected_resources:N.selected_resources?JSON.stringify(N.selected_resources):null,selected_prompts:N.selected_prompts?JSON.stringify(N.selected_prompts):null,dependency_mode:"direct",created_at:Q}))).execute();let F=new Set(X.connections.map((N)=>N.connection_id));for(let N of H)if(!F.has(N))G.push(N)}});for(let W of G)await this.cleanOrphanedPinnedViews([$],W);let J=await this.findById($);if(!J)throw Error("Virtual MCP not found after update");return J}async delete($){await this.db.transaction().execute(async(Z)=>{await Z.deleteFrom("threads").where("virtual_mcp_id","=",$).execute(),await Z.deleteFrom("connection_aggregations").where("parent_connection_id","=",$).execute(),await Z.deleteFrom("connections").where("id","=",$).where("connection_type","=","VIRTUAL").execute()})}async removeConnectionReferences($){let Z=await this.db.selectFrom("connection_aggregations").select("parent_connection_id").where("child_connection_id","=",$).execute();await this.db.deleteFrom("connection_aggregations").where("child_connection_id","=",$).execute(),await this.cleanOrphanedPinnedViews(Z.map((X)=>X.parent_connection_id),$)}async cleanOrphanedPinnedViews($,Z){for(let X of $){let Q=await this.db.selectFrom("connections").select("metadata").where("id","=",X).executeTakeFirst();if(!Q?.metadata)continue;let Y;try{Y=typeof Q.metadata==="string"?JSON.parse(Q.metadata):Q.metadata}catch{continue}let G=Y?.ui?.pinnedViews;if(!Array.isArray(G))continue;let J=G.filter((H)=>H.connectionId!==Z);if(J.length===G.length)continue;let W=Y.ui??{},K={...Y,ui:{...W,pinnedViews:J.length>0?J:null}};await this.db.updateTable("connections").set({metadata:JSON.stringify(K)}).where("id","=",X).execute()}}deserializeVirtualMCPEntity($,Z){let X=$.created_at instanceof Date?$.created_at.toISOString():$.created_at,Q=$.updated_at instanceof Date?$.updated_at.toISOString():$.updated_at,Y=$.status==="active"?"active":"inactive",G=this.parseJson($.metadata),{sandboxMap:J,...W}=G??{},K=J!==void 0?kv0(J):void 0;return{id:$.id,organization_id:$.organization_id,title:$.title,description:$.description,icon:$.icon,status:Y,pinned:$.pinned,created_at:X,updated_at:Q,created_by:$.created_by,updated_by:$.updated_by??void 0,metadata:{...W,instructions:G?.instructions??null,...K!==void 0?{sandboxMap:K}:{}},connections:Z.map((H)=>({connection_id:H.child_connection_id,selected_tools:this.parseJson(H.selected_tools),selected_resources:this.parseJson(H.selected_resources),selected_prompts:this.parseJson(H.selected_prompts)}))}}parseJson($){if($===null)return null;if(typeof $==="string")try{return JSON.parse($)}catch{return null}return $}}function dx1($){let Z=new Map,X=(Q,Y)=>{let G=Z.get(Q);if(G)return G;let J=Y();return Z.set(Q,J),J};return new Proxy($,{get(Q,Y,G){if(Y==="list")return(J,W)=>X(`list:${J}:${W?.pinnedOnly?1:0}`,()=>Q.list(J,W));if(Y==="create"||Y==="update"||Y==="delete"||Y==="removeConnectionReferences")return(...J)=>{return Z.clear(),Q[Y](...J)};return Reflect.get(Q,Y,G)}})}var Ux0=w(()=>{CX();F8()});function _D($){let Z=String($??"");if(Z&&!Z.includes("T"))return Z.replace(" ","T")+"Z";return Z}function w$($){return $.replace(/\0/g,"").replace(/\\/g,"\\\\").replace(/'/g,"''")}function b8($){let Z=Number($??0);return Number.isFinite(Z)?Z:0}function HV8($){if(!KV8.has($))throw Error(`Invalid groupByColumn: ${$}`);return $}function Ox0($){if(!FV8.test($))throw Error(`Invalid JSONPath: ${$}`);if($.startsWith("$."))return $;if($.startsWith("."))return`$${$}`;return`$.${$}`}function Lx0($){return $.replace(/^\$\./,"").split(".").map((X)=>`'${w$(X)}'`).join(", ")}function OV8($){let Z=NV8.exec($);if(!Z||!Z[1]||!Z[2])throw Error(`Invalid interval: ${$}`);let X=parseInt(Z[1],10),Q=Z[2],Y=UV8[Q];if(X<1||X>Y)throw Error(`Invalid interval amount: ${X}${Q} (max ${Y}${Q})`);return{amount:X,unit:Q}}function IU($,Z,X="timestamp"){let{amount:Q,unit:Y}=OV8($),J={m:"MINUTE",h:"HOUR",d:"DAY"}[Y];if(Z==="duckdb")return`time_bucket(INTERVAL '${Q} ${J}', CAST(${X} AS TIMESTAMP))`;return`toStartOfInterval(${X}, INTERVAL ${Q} ${J})`}function gl($,Z,X){if(X==="duckdb")return`json_extract_string(${$}, '${Z}')`;let Q=Lx0(Z);return`JSONExtractString(${$}, ${Q})`}function BV8($,Z,X){if(X==="duckdb")return`CAST(json_extract_string(${$}, '${Z}') AS DOUBLE)`;let Q=Lx0(Z);return`JSONExtractFloat(${$}, ${Q})`}function mx1($,Z,X){if(X==="duckdb")return`TRY_CAST(json_extract_string(${$}, '${Z}') AS DOUBLE)`;let Q=Lx0(Z);return`toFloat64OrZero(JSONExtractString(${$}, ${Q}))`}function Bx0($){if($===null||$===void 0)return{};if(typeof $==="object")return $;let Z=String($);try{return JSON.parse(Z)}catch{return{_decocms_truncated:Z}}}function wx0($){return{id:String($.id??""),organizationId:String($.organization_id??""),connectionId:String($.connection_id??""),toolName:String($.tool_name??""),input:Bx0($.input),output:Bx0($.output),isError:$.is_error===1||$.is_error===!0||$.is_error==="1"||typeof $.is_error==="bigint"&&$.is_error===1n,errorMessage:$.error_message!=null?String($.error_message):null,durationMs:Number($.duration_ms??0),timestamp:(()=>{if($.timestamp instanceof Date)return $.timestamp.toISOString();let Z=String($.timestamp??""),X=new Date(Z.includes("T")?Z:Z.replace(" ","T")+"Z");return Number.isNaN(X.getTime())?Z:X.toISOString()})(),userId:$.user_id!=null?String($.user_id):null,requestId:String($.request_id??""),userAgent:$.user_agent!=null?String($.user_agent):null,virtualMcpId:$.virtual_mcp_id!=null?String($.virtual_mcp_id):null,properties:$.properties?Bx0($.properties):null}}function tx1($,Z){let X=[];if($.properties)for(let[Q,Y]of Object.entries($.properties)){let G=w$(Q),J=w$(Y);if(Z==="duckdb")X.push(`json_extract_string(properties, '$.${G}') = '${J}'`);else X.push(`JSONExtractString(properties, '${G}') = '${J}'`)}if($.propertyKeys)for(let Q of $.propertyKeys){let Y=w$(Q);if(Z==="duckdb")X.push(`json_extract_string(properties, '$.${Y}') IS NOT NULL AND json_extract_string(properties, '$.${Y}') != ''`);else X.push(`JSONExtractString(properties, '${Y}') IS NOT NULL AND JSONExtractString(properties, '${Y}') != ''`)}if($.propertyPatterns)for(let[Q,Y]of Object.entries($.propertyPatterns)){let G=w$(Q),J=w$(Y);if(Z==="duckdb")X.push(`json_extract_string(properties, '$.${G}') ILIKE '${J}'`);else X.push(`JSONExtractString(properties, '${G}') ILIKE '${J}'`)}if($.propertyInValues)for(let[Q,Y]of Object.entries($.propertyInValues)){let G=w$(Q),J=w$(Y);if(Z==="duckdb")X.push(`list_contains(string_split(json_extract_string(properties, '$.${G}'), ','), '${J}')`);else X.push(`has(splitByChar(',', JSONExtractString(properties, '${G}')), '${J}')`)}return X}function nx1($,Z){let X=[];if(RG(X,Z?.startDate,$),!Z)return X;if(Z.connectionIds?.length){let Q=Z.connectionIds.map((Y)=>`'${w$(Y)}'`).join(",");X.push(`connection_id IN (${Q})`)}if(Z.toolNames?.length){let Q=Z.toolNames.map((Y)=>`'${w$(Y)}'`).join(",");X.push(`tool_name IN (${Q})`)}if(Z.virtualMcpIds?.length){let Q=Z.virtualMcpIds.map((Y)=>`'${w$(Y)}'`).join(",");X.push(`virtual_mcp_id IN (${Q})`)}if(Z.endDate)X.push(TG(Z.endDate,$));if(Z.propertyFilters)X.push(...tx1(Z.propertyFilters,$));return X}function px1($,Z,X="timestamp"){if(Z==="duckdb")return`CAST(${X} AS TIMESTAMP) >= TIMESTAMP '${$.toISOString()}'`;if(X==="bucket")return`${X} >= parseDateTimeBestEffort('${$.toISOString()}')`;return`${X} >= parseDateTime64BestEffort('${$.toISOString()}', 9)`}function TG($,Z,X="timestamp"){if(Z==="duckdb")return`CAST(${X} AS TIMESTAMP) <= TIMESTAMP '${$.toISOString()}'`;if(X==="bucket")return`${X} <= parseDateTimeBestEffort('${$.toISOString()}')`;return`${X} <= parseDateTime64BestEffort('${$.toISOString()}', 9)`}function RG($,Z,X,Q="timestamp"){if(Z)$.push(px1(Z,X,Q));else if(X==="clickhouse")$.push(px1(new Date(Date.now()-wV8),X,Q))}class Ex0{engine;sourceFactory;metricEngine;metricSourceFactory;dialect;metricsFromLogs;constructor($,Z,X,Q,Y="clickhouse",G=!1){this.engine=$;this.sourceFactory=Z;this.metricEngine=X;this.metricSourceFactory=Q;this.dialect=Y;this.metricsFromLogs=G}async query($){if(!$.organizationId)throw Error("organizationId is required");let Z=this.sourceFactory($.organizationId,{startDate:$.startDate,endDate:$.endDate}),X=[`organization_id = '${w$($.organizationId)}'`];if($.connectionId)X.push(`connection_id = '${w$($.connectionId)}'`);if($.excludeConnectionIds?.length){let U=$.excludeConnectionIds.map((O)=>`'${w$(O)}'`).join(",");X.push(`connection_id NOT IN (${U})`)}if($.virtualMcpId)X.push(`virtual_mcp_id = '${w$($.virtualMcpId)}'`);if($.toolName)X.push(`tool_name = '${w$($.toolName)}'`);if($.isError!==void 0)X.push(`is_error = ${$.isError?1:0}`);if(RG(X,$.startDate,this.dialect),$.endDate)X.push(TG($.endDate,this.dialect));if($.propertyFilters)X.push(...tx1($.propertyFilters,this.dialect));let Q=1000,Y=Math.min(Math.max(1,Math.floor($.limit??50)),Q),G=Math.max(0,Math.floor($.offset??0)),J=X.join(" AND ");if(this.dialect==="duckdb"){let U=`SELECT ${ix1}, count(*) OVER () AS _total FROM ${Z} WHERE ${J} ORDER BY timestamp DESC LIMIT ${Y} OFFSET ${G}`,O=await this.engine.query(U);if(O.length===0)return{logs:[],total:0};let B=Number(O[0]._total??0);return{logs:O.map(wx0),total:B}}let W=`SELECT count(*) AS total FROM ${Z} WHERE ${J}`,K=`SELECT ${ix1} FROM ${Z} WHERE ${J} ORDER BY timestamp DESC LIMIT ${Y} OFFSET ${G}`,[H,F]=await Promise.all([this.engine.query(W),this.engine.query(K)]),N=Number(H[0]?.total??0);return{logs:F.map(wx0),total:N}}async getById($,Z){if(!$||!Z)return null;let Q=`SELECT * FROM ${this.sourceFactory($)} WHERE organization_id = '${w$($)}' AND id = '${w$(Z)}' LIMIT 1`,Y=await this.engine.query(Q);if(Y.length===0)return null;return wx0(Y[0])}async getStats($){if(!$.organizationId)throw Error("organizationId is required");let Z=this.sourceFactory($.organizationId,{startDate:$.startDate,endDate:$.endDate}),X=[`organization_id = '${w$($.organizationId)}'`];if(RG(X,$.startDate,this.dialect),$.endDate)X.push(TG($.endDate,this.dialect));let Q=`SELECT count(*) AS total_calls, coalesce(sum(CASE WHEN is_error = 1 THEN 1.0 ELSE 0.0 END) / NULLIF(count(*), 0), 0) AS error_rate, coalesce(avg(duration_ms), 0) AS avg_duration_ms FROM ${Z} WHERE ${X.join(" AND ")}`,G=(await this.engine.query(Q))[0]??{};return{totalCalls:Number(G.total_calls??0),errorRate:Number(G.error_rate??0),avgDurationMs:Number(G.avg_duration_ms??0)}}async queryToolCallHeatmap($){if(!$.organizationId)throw Error("organizationId is required");let Z=this.sourceFactory($.organizationId,{startDate:$.startDate,endDate:$.endDate}),X=[`organization_id = '${w$($.organizationId)}'`,"type = 'tool_call'"];if($.filters?.virtualMcpIds?.length){let J=$.filters.virtualMcpIds.map((W)=>`'${w$(W)}'`).join(",");X.push(`virtual_mcp_id IN (${J})`)}if($.filters?.excludeConnectionIds?.length){let J=$.filters.excludeConnectionIds.map((W)=>`'${w$(W)}'`).join(",");X.push(`connection_id NOT IN (${J})`)}if(RG(X,$.startDate,this.dialect),$.endDate)X.push(TG($.endDate,this.dialect));let Q=Math.min(Math.max(1,Math.floor($.limit??500)),1000),Y=`SELECT virtual_mcp_id, tool_name, count(*) AS calls, coalesce(sum(CASE WHEN is_error = 1 THEN 1 ELSE 0 END), 0) AS errors, coalesce(sum(length(output)), 0) AS output_size FROM ${Z} WHERE ${X.join(" AND ")} GROUP BY virtual_mcp_id, tool_name ORDER BY calls DESC LIMIT ${Q}`;return{cells:(await this.engine.query(Y)).map((J)=>({virtualMcpId:J.virtual_mcp_id?String(J.virtual_mcp_id):null,toolName:String(J.tool_name??""),calls:Number(J.calls??0),errors:Number(J.errors??0),outputSize:Number(J.output_size??0)}))}}async queryLlmUsageStats($){let Z={totalCalls:0,totalErrors:0,avgDurationMs:0,p50DurationMs:0,p95DurationMs:0,totalInputTokens:0,totalOutputTokens:0,totalTokens:0,totalCostUsd:0,topTools:[],timeseries:[]};if(!$.organizationId||!$.connectionId)return Z;let X=this.dialect,Q=X==="clickhouse",Y=this.sourceFactory($.organizationId,{startDate:$.startDate,endDate:$.endDate}),G=IU($.interval,X,"timestamp"),J=(E)=>`coalesce(${mx1("properties",`$.${E}`,X)}, 0)`,W=Q?"count()":"count(*)",K=Q?"countIf(is_error = 1)":"count(*) FILTER (WHERE is_error = 1)",H=(E)=>Q?`quantile(${E})(duration_ms)`:`quantile_cont(duration_ms, ${E})`,F=[`organization_id = '${w$($.organizationId)}'`,`connection_id = '${w$($.connectionId)}'`];if(RG(F,$.startDate,X),$.endDate)F.push(TG($.endDate,X));if($.userIds?.length){let E=$.userIds.slice(0,100).map((j)=>`'${w$(j)}'`).join(",");F.push(`user_id IN (${E})`)}let N=F.join(" AND "),U=Math.min(Math.max(1,Math.floor($.topN??5)),20),O=`${W} AS calls,
|
|
109
|
+
`.trim();Ox1=PY("site-diagnostics_"),Yh6=Ox1.is,Gh6=Ox1.get,Bx1=PY("commerce-discovery_"),Jh6=Bx1.is,T80=Bx1.get;dH={AGENT_MANAGER:PY("studio-agent-manager_"),AUTOMATION_MANAGER:PY("studio-automation-manager_"),CONNECTION_MANAGER:PY("studio-connection-manager_"),API_KEY_MANAGER:PY("studio-api-key-manager_"),STORE_MANAGER:PY("studio-store-manager_"),BRAND_MANAGER:PY("studio-brand-manager_"),TASK_MANAGER:PY("studio-task-manager_"),USAGE_MANAGER:PY("studio-usage-manager_")},g7={AGENT_MANAGER:dH.AGENT_MANAGER.get,AUTOMATION_MANAGER:dH.AUTOMATION_MANAGER.get,CONNECTION_MANAGER:dH.CONNECTION_MANAGER.get,API_KEY_MANAGER:dH.API_KEY_MANAGER.get,STORE_MANAGER:dH.STORE_MANAGER.get,BRAND_MANAGER:dH.BRAND_MANAGER.get,TASK_MANAGER:dH.TASK_MANAGER.get,USAGE_MANAGER:dH.USAGE_MANAGER.get}});function zx1($){return $.toLowerCase().replace(/[^a-z0-9]/g,"")}function aS8($){return zx1($).includes("deepresearch")}function Px1($){let Z=zx1($);if(Z.includes("deepresearch"))return!1;return sS8.some((X)=>Z.includes(X))}function eS8($){return $.asyncResearch!==!0&&Px1($.modelId)}function $V8($){return $.asyncResearch===!0||aS8($.modelId)||Px1($.modelId)}function kf($,Z,X,Q){for(let Y of X){let G=$.find((J)=>J.modelId===Y);if(G)return{keyId:Z,modelId:G.modelId,title:G.title}}for(let Y of X){let G=$.find((J)=>J.modelId.includes(Y));if(G)return{keyId:Z,modelId:G.modelId,title:G.title}}if(Q){let Y=$.find(Q);if(Y)return{keyId:Z,modelId:Y.modelId,title:Y.title}}return null}function Ax1($,Z){let X={chat:{fast:null,smart:null,thinking:null},image:null,webSearch:null,deepResearch:null};for(let Q of $){let Y=Z[Q.id]??[],G=Q.providerId;if(!X.chat.fast)X.chat.fast=kf(Y,Q.id,iS8[G]??[]);if(!X.chat.smart)X.chat.smart=kf(Y,Q.id,nS8[G]??[]);if(!X.chat.thinking)X.chat.thinking=kf(Y,Q.id,pS8[G]??[]);if(!X.image)X.image=kf(Y,Q.id,tS8[G]??[],(J)=>J.capabilities?.includes("image")===!0);if(!X.webSearch)X.webSearch=kf(Y,Q.id,oS8[G]??[],eS8);if(!X.deepResearch)X.deepResearch=kf(Y,Q.id,rS8[G]??[],$V8)}return X}var iS8,nS8,pS8,tS8,oS8,rS8,sS8;var Tx1=w(()=>{iS8={anthropic:["claude-haiku-4-5","claude-haiku"],openrouter:["qwen/qwen3.5-flash","anthropic/claude-haiku-4.5","anthropic/claude-haiku","google/gemini-3-flash"],deco:["qwen/qwen3.5-flash","anthropic/claude-haiku"],llmapi:["claude-haiku-4-5","claude-haiku","gpt-4o-mini"],google:["gemini-2.5-flash","gemini-3-flash"]},nS8={anthropic:["claude-sonnet-5","claude-sonnet"],openrouter:["anthropic/claude-sonnet-5","anthropic/claude-sonnet","anthropic/claude-opus-4.8","google/gemini-3-pro"],deco:["anthropic/claude-sonnet-5","anthropic/claude-sonnet","anthropic/claude"],llmapi:["claude-sonnet-4-6","claude-sonnet"],google:["gemini-3-pro","gemini-3-flash"]},pS8={anthropic:["claude-opus-4-8","claude-sonnet-5","claude-sonnet","claude-fable-5"],openrouter:["anthropic/claude-opus-4.8:extended","anthropic/claude-opus-4.8","anthropic/claude-sonnet-5:extended","anthropic/claude-sonnet-5","google/gemini-3-pro","anthropic/claude-fable-5"],deco:["anthropic/claude-opus","anthropic/claude-sonnet-4.6","anthropic/claude-sonnet","anthropic/claude-fable"],llmapi:["claude-opus-4-8","claude-opus","claude-sonnet-4-6"],google:["gemini-3-pro"]},tS8={openrouter:["openai/gpt-image-1","google/gemini-2.0-flash-image"],deco:["openai/gpt-image-1","google/gemini-2.0-flash-image"],llmapi:["gemini-2.5-flash-image","gpt-image-1"],google:["gemini-2.0-flash-image"]},oS8={openrouter:["perplexity/sonar","perplexity/sonar-pro"],deco:["perplexity/sonar","perplexity/sonar-pro"]},rS8={openrouter:["perplexity/deep-research","perplexity/sonar-pro"],deco:["perplexity/deep-research","perplexity/sonar-pro"]};sS8=["sonar","searchpreview","online"]});function R80($){if(!$)return;let Z={};for(let X in $){let Q=$[X];if(typeof Q==="object"&&Q!==null){let Y={};for(let G of ZV8)if(G in Q)Y[G]=Q[G];Z[X]=Y}}return Object.keys(Z).length>0?Z:void 0}var ZV8;var Rx1=w(()=>{ZV8=["usage","cost","model"]});var F8=w(()=>{Z$0();jx1();Tx1();Rx1()});function I80($){return $.toLowerCase().trim().replace(/\//g,"-").replace(/[^a-z0-9\s_-]+/g,"").replace(/[\s_-]+/g,"-").replace(/^-+|-+$/g,"")}function RU($){if($.app_name)return $.app_name;if($.connection_url)try{let Z=new URL($.connection_url),Q=((Z.port?`${Z.hostname}-${Z.port}`:Z.hostname)+Z.pathname).replace(/\/+$/,"");return I80(Q)}catch{return I80($.connection_url)}if($.title)return I80($.title);return $.id??"unknown"}var q80=()=>{};var Sf=300000,M80=5000,Yx0=3,Gx0=30000,Ix1=65000,k80=1000,Vf=3,qx1=5,Mx1=60000,kx1=300000,Jx0=60000;function Sx1(){if(mH.size<k80)return;let $=null,Z=1/0;for(let[X,Q]of mH)if(Q.lastFailureAt<Z)Z=Q.lastFailureAt,$=X;if($)mH.delete($)}function Vx1($){let Z=mH.get($);if(!Z)return Sx1(),mH.set($,{consecutiveFailures:1,disabled:!1,lastFailureAt:Date.now()}),{consecutiveFailures:1,thresholdCrossed:1>=Vf};return Z.consecutiveFailures++,Z.lastFailureAt=Date.now(),{consecutiveFailures:Z.consecutiveFailures,thresholdCrossed:Z.consecutiveFailures>=Vf}}function Wx0($){let Z=mH.get($);if(Z){Z.disabled=!0;return}Sx1(),mH.set($,{consecutiveFailures:Vf,disabled:!0,lastFailureAt:Date.now()})}function Cx1($){return mH.get($)?.disabled??!1}function _x1($){mH.delete($)}var mH;var vx1=w(()=>{mH=new Map});import{sql as d$}from"kysely";function bx1($){if($.length===0)return null;let Z=$[0];if($.length===1&&QV8.has(Z))return d$.ref(Z);if($.length===2&&fx1.has(Z)){let X=$[1];return d$`${d$.ref(Z)}->>${d$.lit(X)}`}if($.length>2&&fx1.has(Z)){let X=`{${$.slice(1).join(",")}}`;return d$`${d$.ref(Z)}#>>${d$.lit(X)}`}return null}function xx1($){if("conditions"in $){let{operator:G,conditions:J}=$;if(J.length===0)return d$`true`;let W=J.map((K)=>xx1(K));switch(G){case"and":return d$`(${d$.join(W,d$` AND `)})`;case"or":return d$`(${d$.join(W,d$` OR `)})`;case"not":return d$`NOT (${d$.join(W,d$` AND `)})`;default:return d$`true`}}let{field:Z,operator:X,value:Q}=$,Y=bx1(Z);if(!Y)return d$`true`;switch(X){case"eq":return Q===null?d$`${Y} IS NULL`:d$`${Y} = ${d$.val(Q)}`;case"gt":return d$`${Y} > ${d$.val(Q)}`;case"gte":return d$`${Y} >= ${d$.val(Q)}`;case"lt":return d$`${Y} < ${d$.val(Q)}`;case"lte":return d$`${Y} <= ${d$.val(Q)}`;case"in":if(!Array.isArray(Q)||Q.length===0)return d$`false`;return d$`${Y} IN (${d$.join(Q.map((G)=>d$.val(G)))})`;case"like":return d$`${Y} ILIKE ${d$.val(Q)}`;case"contains":{let G=String(Q).replace(/[%_\\]/g,"\\$&");return d$`${Y} ILIKE ${d$.val(`%${G}%`)}`}default:return d$`true`}}class yl{db;vault;constructor($,Z){this.db=$;this.vault=Z}async create($){let Z=$.id??l8("conn"),X=new Date().toISOString(),Q=await this.findById(Z);if(Q){if(Q.organization_id!==$.organization_id)throw Error("Connection ID already exists");return this.update(Z,$)}let Y=RU($),G=await this.serializeConnection({...$,id:$.id??Z,slug:Y,status:"active",created_at:X,updated_at:X}),J=await this.db.insertInto("connections").values(G).returningAll().executeTakeFirst();if(!J)throw Error(`Failed to create connection with id: ${Z}`);return this.deserializeConnection(J)}async createNew($){let Z=$.id??l8("conn"),X=new Date().toISOString(),Q=RU($),Y=await this.serializeConnection({...$,id:Z,slug:Q,status:"active",created_at:X,updated_at:X}),G;try{G=await this.db.insertInto("connections").values(Y).returningAll().executeTakeFirst()}catch(J){if(J instanceof Error&&(J.message.includes("duplicate key")||J.message.includes("unique constraint")))throw Error("Connection ID already exists");throw J}if(!G)throw Error(`Failed to create connection with id: ${Z}`);return this.deserializeConnection(G)}async findById($,Z){let X=AG($);if(X)return Ex1(Z??X);let Q=this.db.selectFrom("connections").selectAll().where("id","=",$);if(Z)Q=Q.where("organization_id","=",Z);let Y=await Q.executeTakeFirst();return Y?this.deserializeConnection(Y):null}async list($,Z){let X=this.db.selectFrom("connections").selectAll().where("organization_id","=",$);if(!Z?.includeVirtual)X=X.where("connection_type","!=","VIRTUAL");if(Z?.slug)X=X.where("slug","=",Z.slug);if(Z?.where)X=X.where(xx1(Z.where));let G=(await this.db.selectFrom(X.as("filtered")).select(d$`count(*)::int`.as("count")).executeTakeFirst())?.count??0;if(Z?.orderBy&&Z.orderBy.length>0)for(let K of Z.orderBy){let H=bx1(K.field);if(!H)continue;let F=K.direction==="desc"?d$`desc`:d$`asc`,N=K.nulls==="first"?d$`nulls first`:d$`nulls last`;X=X.orderBy(d$`${H} ${F} ${N}`)}if(Z?.limit)X=X.limit(Z.limit);if(Z?.offset)X=X.offset(Z.offset);let J=await X.execute();return{items:await Promise.all(J.map((K)=>this.deserializeConnection(K))),totalCount:G}}async update($,Z){if(Object.keys(Z).length===0){let J=await this.findById($);if(!J)throw Error("Connection not found");return J}let X={...Z},Q=await this.db.selectFrom("connections").select(["app_name","connection_url","title"]).where("id","=",$).executeTakeFirst();if(Q){let J=(W)=>Z[W]===void 0?Q[W]:Z[W];X.slug=RU({app_name:J("app_name"),connection_url:J("connection_url"),title:J("title"),id:$})}let Y=await this.serializeConnection({...X,updated_at:new Date().toISOString()}),G=await this.db.updateTable("connections").set(Y).where("id","=",$).returningAll().executeTakeFirst();if(!G)throw Error("Connection not found after update");return this.deserializeConnection(G)}async isReferencedByThread($){return await this.db.selectFrom("threads").select("id").where(d$`metadata -> 'githubRepo' ->> 'connectionId' = ${$}`).limit(1).executeTakeFirst()!==void 0}async delete($){await this.db.deleteFrom("connections").where("id","=",$).execute()}async testConnection($,Z){let X=await this.findById($);if(!X)throw Error("Connection not found");let Q=Date.now();if(X.connection_type==="STDIO")return{healthy:!0,latencyMs:Date.now()-Q};if(!X.connection_url)return{healthy:!1,latencyMs:Date.now()-Q};try{if(await If(X.connection_url))return{healthy:!1,latencyMs:Date.now()-Q};let G=X.connection_headers,J=new AbortController,W=setTimeout(()=>J.abort(),1e4),K;try{K=await qf()(X.connection_url,{method:"POST",signal:J.signal,headers:{"Content-Type":"application/json",...X.connection_token&&{Authorization:`Bearer ${X.connection_token}`},...G?.headers,...Z},body:JSON.stringify({jsonrpc:"2.0",method:"ping",id:1})})}finally{clearTimeout(W)}return{healthy:K.ok||K.status===404,latencyMs:Date.now()-Q}}catch{return{healthy:!1,latencyMs:Date.now()-Q}}}async serializeConnection($){let Z={};for(let[X,Q]of Object.entries($)){if(Q===void 0)continue;if(X==="tools")continue;if(X==="connection_token"&&Q)Z[X]=await this.vault.encrypt(Q);else if(X==="configuration_state"&&Q){let Y=JSON.stringify(Q);Z[X]=await this.vault.encrypt(Y)}else if(X==="connection_headers"&&Q){let Y=Q;if(zW(Y)&&Y.envVars){let G={};for(let[J,W]of Object.entries(Y.envVars))G[J]=await this.vault.encrypt(W);Z[X]=JSON.stringify({...Y,envVars:G})}else Z[X]=JSON.stringify(Y)}else if(XV8.includes(X))Z[X]=Q?JSON.stringify(Q):null;else Z[X]=Q}return Z}async handleDecryptFailures($,Z){let X=`connection ${$.id} (org: ${$.organization_id}, type: ${$.connection_type}, title: ${$.title})`;if(Cx1($.id))return;if($.status!=="active"){Wx0($.id);return}let{thresholdCrossed:Q}=Vx1($.id);if(!Q){for(let{label:Y,error:G}of Z)console.error(`Failed to decrypt ${Y} for ${X}:`,G);return}try{await this.db.updateTable("connections").set({status:"error"}).where("id","=",$.id).execute(),Wx0($.id),console.error(`Disabled ${X} after ${Vf} consecutive decryption failures.`,Z[0]?.error)}catch(Y){console.error(`Failed to disable ${X} after decryption failures:`,Y)}}async deserializeConnection($){let Z=[],X=null;if($.connection_token)try{X=await this.vault.decrypt($.connection_token)}catch(J){Z.push({label:"connection token",error:J})}let Q=null;if($.configuration_state)try{let J=await this.vault.decrypt($.configuration_state);Q=JSON.parse(J)}catch(J){Z.push({label:"configuration state",error:J})}if(Z.length>0)await this.handleDecryptFailures($,Z);else if($.connection_token||$.configuration_state)_x1($.id);let Y=null;if($.connection_headers)try{let J=JSON.parse($.connection_headers);if(zW(J)&&J.envVars){let W={};for(let[K,H]of Object.entries(J.envVars))try{W[K]=await this.vault.decrypt(H)}catch{W[K]=H}Y={...J,envVars:W}}else Y=J}catch(J){console.error(`Failed to parse connection_headers for connection ${$.id} (org: ${$.organization_id}, type: ${$.connection_type}, title: ${$.title}):`,J)}let G=(J)=>{if(J===null)return null;if(typeof J==="string")try{return JSON.parse(J)}catch{return null}return J};return{id:$.id,organization_id:$.organization_id,created_by:$.created_by,updated_by:$.updated_by??void 0,title:$.title,description:$.description,icon:$.icon,app_name:$.app_name,app_id:$.app_id,slug:$.slug,connection_type:$.connection_type,connection_url:$.connection_url,connection_token:X,connection_headers:Y,oauth_config:G($.oauth_config),configuration_state:Q,configuration_scopes:G($.configuration_scopes),metadata:G($.metadata),tools:null,bindings:G($.bindings),status:$.status,created_at:$.created_at,updated_at:$.updated_at}}}var XV8,QV8,fx1;var Kx0=w(()=>{AW();xl();CX();F8();q80();vx1();XV8=["connection_headers","oauth_config","configuration_scopes","metadata","bindings"],QV8=new Set(["id","organization_id","created_by","updated_by","title","description","icon","app_name","app_id","slug","connection_type","connection_url","status","created_at","updated_at"]),fx1=new Set(["metadata","configuration_scopes","bindings"])});import{createHash as YV8,randomBytes as GV8,timingSafeEqual as Ch6}from"crypto";function WV8($){return $.toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function Fx0($){return YV8("sha256").update($).digest("hex")}function hx1($){let Z=Hx0.length+1,X=Z+gx1;if(!$.startsWith(`${Hx0}_`)||$.length<=X+1||$[X]!=="_")return null;let Q=$.slice(Z,X),Y=$.slice(X+1);if(!yx1.test(Q)||!yx1.test(Y))return null;return Q}function ux1(){let $=WV8(GV8(JV8)),Z=$.slice(0,gx1),X=`${Hx0}_${Z}_${$}`;return{plaintext:X,prefix:Z,hash:Fx0(X)}}var Hx0="stv",JV8=32,gx1=12,yx1;var cx1=w(()=>{yx1=/^[A-Za-z0-9_-]+$/});function lx1($){return{id:$.id,organizationId:$.organization_id,subjectConnectionId:$.subject_connection_id,tokenHash:$.token_hash,tokenPrefix:$.token_prefix,name:$.name,revokedAt:$.revoked_at,lastUsedAt:$.last_used_at,createdAt:$.created_at,updatedAt:$.updated_at}}class Nx0{db;constructor($){this.db=$}async createOrRotateWorkloadToken($){let Z=$.name??"default";return await this.db.transaction().execute(async(Q)=>{if(!await Q.selectFrom("connections").select("id").where("id","=",$.subjectConnectionId).where("organization_id","=",$.organizationId).executeTakeFirst())throw Error("Subject connection not found in organization");let G=ux1(),J=new Date().toISOString();await Q.updateTable("connection_workload_tokens").set({revoked_at:J,updated_at:J}).where("organization_id","=",$.organizationId).where("subject_connection_id","=",$.subjectConnectionId).where("name","=",Z).where("revoked_at","is",null).execute();let W=await Q.insertInto("connection_workload_tokens").values({id:l8("cwt"),organization_id:$.organizationId,subject_connection_id:$.subjectConnectionId,token_hash:G.hash,token_prefix:G.prefix,name:Z,revoked_at:null,last_used_at:null,created_at:J,updated_at:J}).returningAll().executeTakeFirstOrThrow();return{plaintextToken:G.plaintext,record:lx1(W)}})}async findActiveWorkloadToken($){let Z=await this.db.selectFrom("connection_workload_tokens").selectAll().where("organization_id","=",$.organizationId).where("subject_connection_id","=",$.subjectConnectionId).where("name","=",$.name??"default").where("revoked_at","is",null).executeTakeFirst();return Z?lx1(Z):null}async revokeWorkloadToken($){let Z=new Date().toISOString();await this.db.updateTable("connection_workload_tokens").set({revoked_at:Z,updated_at:Z}).where("id","=",$.tokenId).where("organization_id","=",$.organizationId).where("subject_connection_id","=",$.subjectConnectionId).where("revoked_at","is",null).execute()}async authenticateWorkloadToken($){let Z=hx1($);if(!Z)return null;let X=Fx0($),Q=await this.db.selectFrom("connection_workload_tokens").select(["id","organization_id","subject_connection_id","token_prefix"]).where("token_prefix","=",Z).where("token_hash","=",X).where("revoked_at","is",null).executeTakeFirst();if(!Q)return null;let Y=new Date().toISOString();return await this.db.updateTable("connection_workload_tokens").set({last_used_at:Y,updated_at:Y}).where("id","=",Q.id).execute(),{tokenId:Q.id,tokenPrefix:Q.token_prefix,organizationId:Q.organization_id,subjectConnectionId:Q.subject_connection_id}}async replaceGrantsForSubject($){await this.db.transaction().execute(async(Z)=>{if(!await Z.selectFrom("connections").select("id").where("id","=",$.subjectConnectionId).where("organization_id","=",$.organizationId).executeTakeFirst())throw Error("Referenced connection not found in organization");let Q=[...new Set($.grants.map((J)=>J.targetConnectionId))];if(Q.length>0){if((await Z.selectFrom("connections").select("id").where("organization_id","=",$.organizationId).where("id","in",Q).execute()).length!==Q.length)throw Error("Referenced connection not found in organization")}if(await Z.deleteFrom("connection_credential_grants").where("organization_id","=",$.organizationId).where("subject_connection_id","=",$.subjectConnectionId).execute(),$.grants.length===0)return;let Y=new Date().toISOString(),G=$.grants.map((J)=>({id:l8("ccg"),organization_id:$.organizationId,subject_connection_id:$.subjectConnectionId,target_connection_id:J.targetConnectionId,scope:J.scope,created_by:$.createdBy,created_at:Y,updated_at:Y}));await Z.insertInto("connection_credential_grants").values(G).execute()})}async hasGrant($){return!!await this.db.selectFrom("connection_credential_grants").select("id").where("organization_id","=",$.organizationId).where("subject_connection_id","=",$.subjectConnectionId).where("target_connection_id","=",$.targetConnectionId).where("scope","=",$.scope).executeTakeFirst()}}var S80="credential:access-token:read",V80="credential:configuration:read";var C80=w(()=>{CX();cx1()});class Cf{db;constructor($){this.db=$}async create($,Z,X,Q){let Y=Q?.id??l8("vir"),G=new Date().toISOString();await this.db.transaction().execute(async(W)=>{if(await W.insertInto("connections").values({id:Y,organization_id:$,created_by:Z,title:X.title,description:X.description??null,icon:X.icon??null,app_name:null,app_id:null,connection_type:"VIRTUAL",pinned:X.pinned??!1,connection_url:`virtual://${Y}`,connection_token:null,connection_headers:null,oauth_config:null,configuration_state:null,configuration_scopes:null,metadata:X.metadata?JSON.stringify(X.metadata):null,bindings:null,status:X.status??"active",created_at:G,updated_at:G}).execute(),X.connections.length>0)await W.insertInto("connection_aggregations").values(X.connections.map((K)=>({id:l8("agg"),parent_connection_id:Y,child_connection_id:K.connection_id,selected_tools:K.selected_tools?JSON.stringify(K.selected_tools):null,selected_resources:K.selected_resources?JSON.stringify(K.selected_resources):null,selected_prompts:K.selected_prompts?JSON.stringify(K.selected_prompts):null,dependency_mode:"direct",created_at:G}))).execute()});let J=await this.findById(Y);if(!J)throw Error(`Failed to create virtual MCP with id: ${Y}`);return J}async findById($,Z){let X=AG($);if(X)return{...Qx0(Z??X),pinned:!1,connections:[]};let Q=A80($);if(Q)return{...Ux1(Z??Q),pinned:!1,connections:[]};return this.findByIdInternal(this.db,$)}async findByIdInternal($,Z){let X=await $.selectFrom("connections").selectAll().where("id","=",Z).where("connection_type","=","VIRTUAL").executeTakeFirst();if(!X)return null;let Q=await $.selectFrom("connection_aggregations").selectAll().where("parent_connection_id","=",Z).where("dependency_mode","=","direct").execute();return this.deserializeVirtualMCPEntity(X,Q)}async list($,Z){let X=this.db.selectFrom("connections").selectAll().where("organization_id","=",$).where("connection_type","=","VIRTUAL");if(Z?.pinnedOnly)X=X.where("pinned","=",!0);let Q=await X.execute(),Y=Q.map((W)=>W.id);if(Y.length===0)return[];let G=await this.db.selectFrom("connection_aggregations").selectAll().where("parent_connection_id","in",Y).where("dependency_mode","=","direct").execute(),J=new Map;for(let W of G){let K=J.get(W.parent_connection_id)??[];K.push(W),J.set(W.parent_connection_id,K)}return Q.map((W)=>this.deserializeVirtualMCPEntity(W,J.get(W.id)??[]))}async listByIds($,Z){if(Z.length===0)return[];let X=await this.db.selectFrom("connections").selectAll().where("id","in",Z).where("organization_id","=",$).where("connection_type","=","VIRTUAL").execute();if(X.length===0)return[];let Q=X.map((J)=>J.id),Y=await this.db.selectFrom("connection_aggregations").selectAll().where("parent_connection_id","in",Q).where("dependency_mode","=","direct").execute(),G=new Map;for(let J of Y){let W=G.get(J.parent_connection_id)??[];W.push(J),G.set(J.parent_connection_id,W)}return X.map((J)=>this.deserializeVirtualMCPEntity(J,G.get(J.id)??[]))}async listByConnectionId($,Z){let Q=(await this.db.selectFrom("connection_aggregations").select("parent_connection_id").where("child_connection_id","=",Z).execute()).map((K)=>K.parent_connection_id);if(Q.length===0)return[];let Y=await this.db.selectFrom("connections").selectAll().where("id","in",Q).where("organization_id","=",$).where("connection_type","=","VIRTUAL").execute();if(Y.length===0)return[];let G=Y.map((K)=>K.id),J=await this.db.selectFrom("connection_aggregations").selectAll().where("parent_connection_id","in",G).where("dependency_mode","=","direct").execute(),W=new Map;for(let K of J){let H=W.get(K.parent_connection_id)??[];H.push(K),W.set(K.parent_connection_id,H)}return Y.map((K)=>this.deserializeVirtualMCPEntity(K,W.get(K.id)??[]))}async update($,Z,X){let Q=new Date().toISOString(),Y={updated_at:Q,updated_by:Z};if(X.title!==void 0)Y.title=X.title;if(X.description!==void 0)Y.description=X.description;if(X.icon!==void 0)Y.icon=X.icon;if(X.status!==void 0)Y.status=X.status;if(X.pinned!==void 0)Y.pinned=X.pinned;if(X.metadata!==void 0)Y.metadata=X.metadata?JSON.stringify(X.metadata):null;let G=[];await this.db.transaction().execute(async(W)=>{if(await W.updateTable("connections").set(Y).where("id","=",$).where("connection_type","=","VIRTUAL").execute(),X.connections!==void 0){let K=await W.selectFrom("connection_aggregations").select("child_connection_id").where("parent_connection_id","=",$).where("dependency_mode","=","direct").execute(),H=new Set(K.map((N)=>N.child_connection_id));if(await W.deleteFrom("connection_aggregations").where("parent_connection_id","=",$).where("dependency_mode","=","direct").execute(),X.connections.length>0)await W.insertInto("connection_aggregations").values(X.connections.map((N)=>({id:l8("agg"),parent_connection_id:$,child_connection_id:N.connection_id,selected_tools:N.selected_tools?JSON.stringify(N.selected_tools):null,selected_resources:N.selected_resources?JSON.stringify(N.selected_resources):null,selected_prompts:N.selected_prompts?JSON.stringify(N.selected_prompts):null,dependency_mode:"direct",created_at:Q}))).execute();let F=new Set(X.connections.map((N)=>N.connection_id));for(let N of H)if(!F.has(N))G.push(N)}});for(let W of G)await this.cleanOrphanedPinnedViews([$],W);let J=await this.findById($);if(!J)throw Error("Virtual MCP not found after update");return J}async delete($){await this.db.transaction().execute(async(Z)=>{await Z.deleteFrom("threads").where("virtual_mcp_id","=",$).execute(),await Z.deleteFrom("connection_aggregations").where("parent_connection_id","=",$).execute(),await Z.deleteFrom("connections").where("id","=",$).where("connection_type","=","VIRTUAL").execute()})}async removeConnectionReferences($){let Z=await this.db.selectFrom("connection_aggregations").select("parent_connection_id").where("child_connection_id","=",$).execute();await this.db.deleteFrom("connection_aggregations").where("child_connection_id","=",$).execute(),await this.cleanOrphanedPinnedViews(Z.map((X)=>X.parent_connection_id),$)}async cleanOrphanedPinnedViews($,Z){for(let X of $){let Q=await this.db.selectFrom("connections").select("metadata").where("id","=",X).executeTakeFirst();if(!Q?.metadata)continue;let Y;try{Y=typeof Q.metadata==="string"?JSON.parse(Q.metadata):Q.metadata}catch{continue}let G=Y?.ui?.pinnedViews;if(!Array.isArray(G))continue;let J=G.filter((H)=>H.connectionId!==Z);if(J.length===G.length)continue;let W=Y.ui??{},K={...Y,ui:{...W,pinnedViews:J.length>0?J:null}};await this.db.updateTable("connections").set({metadata:JSON.stringify(K)}).where("id","=",X).execute()}}deserializeVirtualMCPEntity($,Z){let X=$.created_at instanceof Date?$.created_at.toISOString():$.created_at,Q=$.updated_at instanceof Date?$.updated_at.toISOString():$.updated_at,Y=$.status==="active"?"active":"inactive",G=this.parseJson($.metadata),{sandboxMap:J,...W}=G??{},K=J!==void 0?kv0(J):void 0;return{id:$.id,organization_id:$.organization_id,title:$.title,description:$.description,icon:$.icon,status:Y,pinned:$.pinned,created_at:X,updated_at:Q,created_by:$.created_by,updated_by:$.updated_by??void 0,metadata:{...W,instructions:G?.instructions??null,...K!==void 0?{sandboxMap:K}:{}},connections:Z.map((H)=>({connection_id:H.child_connection_id,selected_tools:this.parseJson(H.selected_tools),selected_resources:this.parseJson(H.selected_resources),selected_prompts:this.parseJson(H.selected_prompts)}))}}parseJson($){if($===null)return null;if(typeof $==="string")try{return JSON.parse($)}catch{return null}return $}}function dx1($){let Z=new Map,X=(Q,Y)=>{let G=Z.get(Q);if(G)return G;let J=Y();return Z.set(Q,J),J};return new Proxy($,{get(Q,Y,G){if(Y==="list")return(J,W)=>X(`list:${J}:${W?.pinnedOnly?1:0}`,()=>Q.list(J,W));if(Y==="create"||Y==="update"||Y==="delete"||Y==="removeConnectionReferences")return(...J)=>{return Z.clear(),Q[Y](...J)};return Reflect.get(Q,Y,G)}})}var Ux0=w(()=>{CX();F8()});function _D($){let Z=String($??"");if(Z&&!Z.includes("T"))return Z.replace(" ","T")+"Z";return Z}function w$($){return $.replace(/\0/g,"").replace(/\\/g,"\\\\").replace(/'/g,"''")}function b8($){let Z=Number($??0);return Number.isFinite(Z)?Z:0}function HV8($){if(!KV8.has($))throw Error(`Invalid groupByColumn: ${$}`);return $}function Ox0($){if(!FV8.test($))throw Error(`Invalid JSONPath: ${$}`);if($.startsWith("$."))return $;if($.startsWith("."))return`$${$}`;return`$.${$}`}function Lx0($){return $.replace(/^\$\./,"").split(".").map((X)=>`'${w$(X)}'`).join(", ")}function OV8($){let Z=NV8.exec($);if(!Z||!Z[1]||!Z[2])throw Error(`Invalid interval: ${$}`);let X=parseInt(Z[1],10),Q=Z[2],Y=UV8[Q];if(X<1||X>Y)throw Error(`Invalid interval amount: ${X}${Q} (max ${Y}${Q})`);return{amount:X,unit:Q}}function IU($,Z,X="timestamp"){let{amount:Q,unit:Y}=OV8($),J={m:"MINUTE",h:"HOUR",d:"DAY"}[Y];if(Z==="duckdb")return`time_bucket(INTERVAL '${Q} ${J}', CAST(${X} AS TIMESTAMP))`;return`toStartOfInterval(${X}, INTERVAL ${Q} ${J})`}function gl($,Z,X){if(X==="duckdb")return`json_extract_string(${$}, '${Z}')`;let Q=Lx0(Z);return`JSONExtractString(${$}, ${Q})`}function BV8($,Z,X){if(X==="duckdb")return`CAST(json_extract_string(${$}, '${Z}') AS DOUBLE)`;let Q=Lx0(Z);return`JSONExtractFloat(${$}, ${Q})`}function mx1($,Z,X){if(X==="duckdb")return`TRY_CAST(json_extract_string(${$}, '${Z}') AS DOUBLE)`;let Q=Lx0(Z);return`toFloat64OrZero(JSONExtractString(${$}, ${Q}))`}function Bx0($){if($===null||$===void 0)return{};if(typeof $==="object")return $;let Z=String($);try{return JSON.parse(Z)}catch{return{_decocms_truncated:Z}}}function wx0($){return{id:String($.id??""),organizationId:String($.organization_id??""),connectionId:String($.connection_id??""),toolName:String($.tool_name??""),input:Bx0($.input),output:Bx0($.output),isError:$.is_error===1||$.is_error===!0||$.is_error==="1"||typeof $.is_error==="bigint"&&$.is_error===1n,errorMessage:$.error_message!=null?String($.error_message):null,durationMs:Number($.duration_ms??0),timestamp:(()=>{if($.timestamp instanceof Date)return $.timestamp.toISOString();let Z=String($.timestamp??""),X=new Date(Z.includes("T")?Z:Z.replace(" ","T")+"Z");return Number.isNaN(X.getTime())?Z:X.toISOString()})(),userId:$.user_id!=null?String($.user_id):null,requestId:String($.request_id??""),userAgent:$.user_agent!=null?String($.user_agent):null,virtualMcpId:$.virtual_mcp_id!=null?String($.virtual_mcp_id):null,properties:$.properties?Bx0($.properties):null}}function tx1($,Z){let X=[];if($.properties)for(let[Q,Y]of Object.entries($.properties)){let G=w$(Q),J=w$(Y);if(Z==="duckdb")X.push(`json_extract_string(properties, '$.${G}') = '${J}'`);else X.push(`JSONExtractString(properties, '${G}') = '${J}'`)}if($.propertyKeys)for(let Q of $.propertyKeys){let Y=w$(Q);if(Z==="duckdb")X.push(`json_extract_string(properties, '$.${Y}') IS NOT NULL AND json_extract_string(properties, '$.${Y}') != ''`);else X.push(`JSONExtractString(properties, '${Y}') IS NOT NULL AND JSONExtractString(properties, '${Y}') != ''`)}if($.propertyPatterns)for(let[Q,Y]of Object.entries($.propertyPatterns)){let G=w$(Q),J=w$(Y);if(Z==="duckdb")X.push(`json_extract_string(properties, '$.${G}') ILIKE '${J}'`);else X.push(`JSONExtractString(properties, '${G}') ILIKE '${J}'`)}if($.propertyInValues)for(let[Q,Y]of Object.entries($.propertyInValues)){let G=w$(Q),J=w$(Y);if(Z==="duckdb")X.push(`list_contains(string_split(json_extract_string(properties, '$.${G}'), ','), '${J}')`);else X.push(`has(splitByChar(',', JSONExtractString(properties, '${G}')), '${J}')`)}return X}function nx1($,Z){let X=[];if(RG(X,Z?.startDate,$),!Z)return X;if(Z.connectionIds?.length){let Q=Z.connectionIds.map((Y)=>`'${w$(Y)}'`).join(",");X.push(`connection_id IN (${Q})`)}if(Z.toolNames?.length){let Q=Z.toolNames.map((Y)=>`'${w$(Y)}'`).join(",");X.push(`tool_name IN (${Q})`)}if(Z.virtualMcpIds?.length){let Q=Z.virtualMcpIds.map((Y)=>`'${w$(Y)}'`).join(",");X.push(`virtual_mcp_id IN (${Q})`)}if(Z.endDate)X.push(TG(Z.endDate,$));if(Z.propertyFilters)X.push(...tx1(Z.propertyFilters,$));return X}function px1($,Z,X="timestamp"){if(Z==="duckdb")return`CAST(${X} AS TIMESTAMP) >= TIMESTAMP '${$.toISOString()}'`;if(X==="bucket")return`${X} >= parseDateTimeBestEffort('${$.toISOString()}')`;return`${X} >= parseDateTime64BestEffort('${$.toISOString()}', 9)`}function TG($,Z,X="timestamp"){if(Z==="duckdb")return`CAST(${X} AS TIMESTAMP) <= TIMESTAMP '${$.toISOString()}'`;if(X==="bucket")return`${X} <= parseDateTimeBestEffort('${$.toISOString()}')`;return`${X} <= parseDateTime64BestEffort('${$.toISOString()}', 9)`}function RG($,Z,X,Q="timestamp"){if(Z)$.push(px1(Z,X,Q));else if(X==="clickhouse")$.push(px1(new Date(Date.now()-wV8),X,Q))}class Ex0{engine;sourceFactory;metricEngine;metricSourceFactory;dialect;metricsFromLogs;constructor($,Z,X,Q,Y="clickhouse",G=!1){this.engine=$;this.sourceFactory=Z;this.metricEngine=X;this.metricSourceFactory=Q;this.dialect=Y;this.metricsFromLogs=G}async query($){if(!$.organizationId)throw Error("organizationId is required");let Z=this.sourceFactory($.organizationId,{startDate:$.startDate,endDate:$.endDate}),X=[`organization_id = '${w$($.organizationId)}'`];if($.connectionId)X.push(`connection_id = '${w$($.connectionId)}'`);if($.excludeConnectionIds?.length){let U=$.excludeConnectionIds.map((O)=>`'${w$(O)}'`).join(",");X.push(`connection_id NOT IN (${U})`)}if($.virtualMcpId)X.push(`virtual_mcp_id = '${w$($.virtualMcpId)}'`);if($.toolName)X.push(`tool_name = '${w$($.toolName)}'`);if($.isError!==void 0)X.push(`is_error = ${$.isError?1:0}`);if(RG(X,$.startDate,this.dialect),$.endDate)X.push(TG($.endDate,this.dialect));if($.propertyFilters)X.push(...tx1($.propertyFilters,this.dialect));let Q=1000,Y=Math.min(Math.max(1,Math.floor($.limit??50)),Q),G=Math.max(0,Math.floor($.offset??0)),J=X.join(" AND ");if(this.dialect==="duckdb"){let U=`SELECT ${ix1}, count(*) OVER () AS _total FROM ${Z} WHERE ${J} ORDER BY timestamp DESC LIMIT ${Y} OFFSET ${G}`,O=await this.engine.query(U);if(O.length===0)return{logs:[],total:0};let B=Number(O[0]._total??0);return{logs:O.map(wx0),total:B}}let W=`SELECT count(*) AS total FROM ${Z} WHERE ${J}`,K=`SELECT ${ix1} FROM ${Z} WHERE ${J} ORDER BY timestamp DESC LIMIT ${Y} OFFSET ${G}`,[H,F]=await Promise.all([this.engine.query(W),this.engine.query(K)]),N=Number(H[0]?.total??0);return{logs:F.map(wx0),total:N}}async getById($,Z){if(!$||!Z)return null;let Q=`SELECT * FROM ${this.sourceFactory($)} WHERE organization_id = '${w$($)}' AND id = '${w$(Z)}' LIMIT 1`,Y=await this.engine.query(Q);if(Y.length===0)return null;return wx0(Y[0])}async getStats($){if(!$.organizationId)throw Error("organizationId is required");let Z=this.sourceFactory($.organizationId,{startDate:$.startDate,endDate:$.endDate}),X=[`organization_id = '${w$($.organizationId)}'`];if(RG(X,$.startDate,this.dialect),$.endDate)X.push(TG($.endDate,this.dialect));let Q=`SELECT count(*) AS total_calls, coalesce(sum(CASE WHEN is_error = 1 THEN 1.0 ELSE 0.0 END) / NULLIF(count(*), 0), 0) AS error_rate, coalesce(avg(duration_ms), 0) AS avg_duration_ms FROM ${Z} WHERE ${X.join(" AND ")}`,G=(await this.engine.query(Q))[0]??{};return{totalCalls:Number(G.total_calls??0),errorRate:Number(G.error_rate??0),avgDurationMs:Number(G.avg_duration_ms??0)}}async queryToolCallHeatmap($){if(!$.organizationId)throw Error("organizationId is required");let Z=this.sourceFactory($.organizationId,{startDate:$.startDate,endDate:$.endDate}),X=[`organization_id = '${w$($.organizationId)}'`,"type = 'tool_call'"];if($.filters?.virtualMcpIds?.length){let J=$.filters.virtualMcpIds.map((W)=>`'${w$(W)}'`).join(",");X.push(`virtual_mcp_id IN (${J})`)}if($.filters?.excludeConnectionIds?.length){let J=$.filters.excludeConnectionIds.map((W)=>`'${w$(W)}'`).join(",");X.push(`connection_id NOT IN (${J})`)}if(RG(X,$.startDate,this.dialect),$.endDate)X.push(TG($.endDate,this.dialect));let Q=Math.min(Math.max(1,Math.floor($.limit??500)),1000),Y=`SELECT virtual_mcp_id, tool_name, count(*) AS calls, coalesce(sum(CASE WHEN is_error = 1 THEN 1 ELSE 0 END), 0) AS errors, coalesce(sum(length(output)), 0) AS output_size FROM ${Z} WHERE ${X.join(" AND ")} GROUP BY virtual_mcp_id, tool_name ORDER BY calls DESC LIMIT ${Q}`;return{cells:(await this.engine.query(Y)).map((J)=>({virtualMcpId:J.virtual_mcp_id?String(J.virtual_mcp_id):null,toolName:String(J.tool_name??""),calls:Number(J.calls??0),errors:Number(J.errors??0),outputSize:Number(J.output_size??0)}))}}async queryLlmUsageStats($){let Z={totalCalls:0,totalErrors:0,avgDurationMs:0,p50DurationMs:0,p95DurationMs:0,totalInputTokens:0,totalOutputTokens:0,totalTokens:0,totalCostUsd:0,topTools:[],timeseries:[]};if(!$.organizationId||!$.connectionId)return Z;let X=this.dialect,Q=X==="clickhouse",Y=this.sourceFactory($.organizationId,{startDate:$.startDate,endDate:$.endDate}),G=IU($.interval,X,"timestamp"),J=(E)=>`coalesce(${mx1("properties",`$.${E}`,X)}, 0)`,W=Q?"count()":"count(*)",K=Q?"countIf(is_error = 1)":"count(*) FILTER (WHERE is_error = 1)",H=(E)=>Q?`quantile(${E})(duration_ms)`:`quantile_cont(duration_ms, ${E})`,F=[`organization_id = '${w$($.organizationId)}'`,`connection_id = '${w$($.connectionId)}'`];if(RG(F,$.startDate,X),$.endDate)F.push(TG($.endDate,X));if($.userIds?.length){let E=$.userIds.slice(0,100).map((j)=>`'${w$(j)}'`).join(",");F.push(`user_id IN (${E})`)}let N=F.join(" AND "),U=Math.min(Math.max(1,Math.floor($.topN??5)),20),O=`${W} AS calls,
|
|
110
110
|
${K} AS errors,
|
|
111
111
|
avg(duration_ms) AS avg,
|
|
112
112
|
sum(${J("input_tokens")}) AS in_tok,
|
|
@@ -2761,7 +2761,7 @@ Do NOT require review (requiresReview = false) when the changes are low-risk, su
|
|
|
2761
2761
|
When unsure between the two, lean toward NOT requiring review for small frontend-only diffs, and toward requiring it for anything backend or large.
|
|
2762
2762
|
|
|
2763
2763
|
Respond with the structured verdict and a short reason.`,Ox$;var wx$=w(()=>{C4();XB();M51();ZX6=k51.object({requiresReview:k51.boolean().describe("true if the changes should go through pull-request review"),reason:k51.string().describe("One short sentence explaining the decision (max ~120 chars)")});Ox$={requiresReview:!1,reason:""}});function Dx$(){return process.env.GITHUB_API_BASE_URL??"https://api.github.com"}function Lx$($,Z){return $==="GET"&&!Z.includes("/git/blobs/")&&!Z.includes("/git/trees/")&&!Z.includes("/tarball/")}function Ex$($){let Z=Mh.get($);if(!Z)return;Mh.delete($),S51-=Z.bytes}function WX6($,Z,X){let Q;try{Q=JSON.stringify(X)?.length??0}catch{return}if(Ex$($),Q>JX6)return;Mh.set($,{etag:Z,body:X,bytes:Q}),S51+=Q;while(S51>GX6||Mh.size>YX6){let Y=Mh.keys().next().value;if(Y===void 0)break;Ex$(Y)}}function jx$($){let{owner:Z,repo:X,accessToken:Q}=$,Y=`/repos/${Z}/${X}`,G=null;async function J(W,K,H,F){let N=`${Dx$()}${K}`,U=Lx$(W,K)?Mh.get(N):void 0,O=await fetch(N,{method:W,headers:{Accept:"application/vnd.github+json","User-Agent":"studio-decofile",Authorization:`token ${Q}`,...U?{"If-None-Match":U.etag}:{},...H!==void 0?{"content-type":"application/json"}:{}},body:H!==void 0?JSON.stringify(H):void 0,signal:AbortSignal.timeout(15000)});if(U&&O.status===304)return{status:200,json:U.body};if(!O.ok&&!F?.allow?.includes(O.status)){let D=await O.text().catch(()=>""),L=D;try{L=JSON.parse(D).message??D}catch{}throw new C6(O.status,W,K,L)}let B=O.status===204?void 0:await O.json();if(O.status===200&&Lx$(W,K)){let D=O.headers.get("etag");if(D)WX6(N,D,B)}return{status:O.status,json:B}}return{owner:Z,repo:X,async getDefaultBranch(){if(G)return G;let{json:W}=await J("GET",Y);return G=W.default_branch,G},async getHeadSha(W){let{json:K}=await J("GET",`${Y}/git/ref/heads/${K_(W)}`);return K.object.sha},async getTarballStream(W){let K=`${Y}/tarball/${K_(W)}`,H=await fetch(`${Dx$()}${K}`,{headers:{"User-Agent":"studio-decofile",Authorization:`token ${Q}`},signal:AbortSignal.timeout(60000)});if(!H.ok){let F=await H.text().catch(()=>"");throw new C6(H.status,"GET",K,F.slice(0,300))}if(!H.body)throw new C6(502,"GET",K,"tarball had no body");return H.body},async getCommitTreeSha(W){let{json:K}=await J("GET",`${Y}/git/commits/${W}`);return K.tree.sha},async getTreeRecursive(W){let{json:K}=await J("GET",`${Y}/git/trees/${W}?recursive=1`);if(K.truncated)throw new C6(502,"GET",`${Y}/git/trees/${W}`,"tree listing truncated by GitHub; repo too large for recursive read");return K.tree},async getBlobText(W){let{json:K}=await J("GET",`${Y}/git/blobs/${W}`);if(K.encoding!=="base64")throw new C6(502,"GET",`${Y}/git/blobs/${W}`,`unexpected blob encoding ${K.encoding}`);return Buffer.from(K.content,"base64").toString("utf-8")},async createBlob(W){let{json:K}=await J("POST",`${Y}/git/blobs`,{content:W,encoding:"utf-8"});return K.sha},async createTree(W,K){let{json:H}=await J("POST",`${Y}/git/trees`,{base_tree:W,tree:K});return H.sha},async createCommit({message:W,treeSha:K,parentShas:H}){let{json:F}=await J("POST",`${Y}/git/commits`,{message:W,tree:K,parents:H});return F.sha},async updateRef(W,K){await J("PATCH",`${Y}/git/refs/heads/${K_(W)}`,{sha:K,force:!1})},async createRef(W,K){await J("POST",`${Y}/git/refs`,{ref:`refs/heads/${W}`,sha:K})},async mergeBranch(W,K,H){let{status:F,json:N}=await J("POST",`${Y}/merges`,{base:W,head:K,commit_message:H},{allow:[204]});return F===204?null:N?.sha??null},async createPullRequest({base:W,head:K,title:H}){let{json:F}=await J("POST",`${Y}/pulls`,{base:W,head:K,title:H});return{number:F.number,html_url:F.html_url}},async findOpenPullRequest(W,K){let{json:H}=await J("GET",`${Y}/pulls?state=open&base=${encodeURIComponent(W)}&head=${encodeURIComponent(`${Z}:${K}`)}`),F=H[0];return F?{number:F.number,html_url:F.html_url}:null},async compare(W,K){let{json:H}=await J("GET",`${Y}/compare/${K_(W)}...${K_(K)}`);return{aheadBy:H.ahead_by,behindBy:H.behind_by}},async compareDetailed(W,K){let{json:H}=await J("GET",`${Y}/compare/${K_(W)}...${K_(K)}`);return{aheadBy:H.ahead_by,behindBy:H.behind_by,mergeBaseSha:H.merge_base_commit.sha,files:(H.files??[]).map((F)=>({filename:F.filename,status:F.status,sha:F.sha,...F.previous_filename?{previousFilename:F.previous_filename}:{}}))}}}}function K_($){return $.split("/").map(encodeURIComponent).join("/")}var YX6=512,GX6=8388608,JX6=262144,Mh,S51=0,C6;var H_=w(()=>{Mh=new Map;C6=class C6 extends Error{status;method;path;constructor($,Z,X,Q){super(`GitHub ${Z} ${X} failed (${$}): ${Q}`);this.status=$;this.method=Z;this.path=X;this.name="GitHubApiError"}}});async function ZP0($,Z,X){if(!X.connectionId)throw new C6(401,"AUTH","connection","Project's GitHub connection is missing \u2014 reconnect GitHub");let Q=await $.storage.connections.findById(X.connectionId,Z);if(!Q)throw new C6(401,"AUTH","connection","Project's GitHub connection is missing \u2014 reconnect GitHub");let Y=await KX6($,Q);if(!Y)throw new C6(401,"AUTH","connection",_Z);return jx$({owner:X.owner,repo:X.name,accessToken:Y})}async function KX6($,Z){if(T5(Z)?.sourceConnectionId)return Tx($,Z);return(await bY({connectionId:Z.id,connectionUrl:Z.connection_url,tokenStorage:new q6($.db,$.vault)})).accessToken}var V51=w(()=>{zQ();C90();P3();kY();H_()});function HX6($){if(!$||$.includes("\\")||$.includes("..")||$.includes("\x00"))return!0;try{let Z=decodeURIComponent($);if(Z.includes("\\")||Z.includes("..")||Z.includes("\x00"))return!0;if(Z!==$&&Z.includes("/")){let X=($.match(/\//g)??[]).length;if((Z.match(/\//g)??[]).length>X)return!0}return!1}catch{return!0}}function XP0($){if(HX6($))throw Error(`Invalid block key: ${$||"(empty)"}`)}function _r($){try{return decodeURIComponent($)}catch{return $}}function C51($){return XP0($),encodeURIComponent($)}function vr($){let Z=$.map((J)=>({file:J,name:`${J.stem}.json`})).sort((J,W)=>J.name<W.name?-1:J.name>W.name?1:0),X=[],Q=new Set,Y="{",G=!0;for(let{file:J}of Z){let W=J.content.trim();if(W.length===0)continue;let K=_r(J.stem);if(Q.has(K)){X.push({key:K,stem:J.stem,error:`duplicate block key "${K}" (another file already maps to it)`});continue}try{JSON.parse(W)}catch(H){X.push({key:K,stem:J.stem,error:H instanceof Error?H.message:String(H)});continue}if(Q.add(K),!G)Y+=",";G=!1,Y+=`${JSON.stringify(K)}:${W}`}return{decofile:`${Y}}`,skipped:X}}var zx$=()=>{};var QP0=w(()=>{zx$()});function FX6($){return $.startsWith("merged/")?"merged":"blobs"}function _51($,Z){let X=new Map;for(let G of $){let J=X.get(G.path);if(!J||G.mtimeMs>=J.mtimeMs)X.set(G.path,{bytes:G.bytes,mtimeMs:G.mtimeMs})}let Q=[...X.entries()].sort((G,J)=>G[1].mtimeMs-J[1].mtimeMs),Y={config:Z,entries:new Map,totalBytes:0,areaBytes:{blobs:0,merged:0}};for(let[G,{bytes:J}]of Q){let W=FX6(G);Y.entries.set(G,{bytes:J,area:W}),Y.totalBytes+=J,Y.areaBytes[W]+=J}return Y}function Px$($,Z){let X=$.entries.get(Z);if(!X)return;$.entries.delete(Z),$.entries.set(Z,X)}function kh($,Z){let X=$.entries.get(Z);if(!X)return;$.entries.delete(Z),$.totalBytes-=X.bytes,$.areaBytes[X.area]-=X.bytes}function Ax$($,Z){let{path:X,bytes:Q,area:Y}=Z,{config:G}=$;if(!Number.isFinite(Q)||Q<0||Q>G.maxEntryBytes[Y]||Q>G.maxTotalBytes||Y==="merged"&&Q>G.maxMergedBytes)return{admitted:!1,evict:[]};let W=$.entries.get(X),K=$.totalBytes-(W?.bytes??0),H=$.areaBytes.merged-(W?.area==="merged"?W.bytes:0),F=[],N=new Set;if(Y==="merged")for(let[U,O]of $.entries){if(H+Q<=G.maxMergedBytes)break;if(U===X||O.area!=="merged")continue;F.push(U),N.add(U),H-=O.bytes,K-=O.bytes}for(let[U,O]of $.entries){if(K+Q<=G.maxTotalBytes)break;if(U===X||N.has(U))continue;F.push(U),N.add(U),K-=O.bytes}for(let U of F)kh($,U);return kh($,X),$.entries.set(X,{bytes:Q,area:Y}),$.totalBytes+=Q,$.areaBytes[Y]+=Q,{admitted:!0,evict:F}}function fr($){if($==="")throw TypeError("cache path segment must not be empty");let Z=$.toLowerCase(),X="";for(let Q of new TextEncoder().encode(Z)){let Y=String.fromCharCode(Q);X+=/[a-z0-9._-]/.test(Y)?Y:`%${Q.toString(16).padStart(2,"0")}`}if(X==="."||X==="..")X=X.replaceAll(".","%2e");return X}function v51($){return/^[0-9a-f]{40}$/.test($)}import{randomUUID as kx$}from"crypto";import{mkdir as br,readdir as NX6,readFile as UX6,rename as OX6,rm as Sx$,stat as Vx$,statfs as BX6,unlink as wX6,writeFile as DX6}from"fs/promises";import{tmpdir as LX6}from"os";import{dirname as EX6,join as R7}from"path";function Sh($,Z){let X=Bun.env[$];if(X===void 0||X==="")return Z;let Q=Number(X);return Number.isFinite(Q)&&Q>=0?Math.floor(Q):Z}function PX6(){if(YP0)return YP0;let $=Bun.env.FAST_PREVIEW_CACHE_DIR,Z=$===void 0?R7(LX6(),"studio-fast-preview-cache"):$;return YP0={enabled:Z!=="",root:Z,index:{maxTotalBytes:Sh("FAST_PREVIEW_CACHE_MAX_BYTES",2*Tx$),maxMergedBytes:Sh("FAST_PREVIEW_CACHE_MERGED_MAX_BYTES",512*GP0),maxEntryBytes:{blobs:Sh("FAST_PREVIEW_CACHE_MAX_BLOB_BYTES",GP0),merged:Sh("FAST_PREVIEW_CACHE_MAX_MERGED_BYTES",32*GP0)}},freeFloorBytes:Sh("FAST_PREVIEW_CACHE_FREE_FLOOR_BYTES",Tx$),sweepIntervalMs:Sh("FAST_PREVIEW_CACHE_SWEEP_INTERVAL_MS",600000)},YP0}function AX6(){return{hits:{blobs:0,merged:0},misses:{blobs:0,merged:0},evictions:0,errors:0,floorSkips:0,invalidKeySkips:0,admissionRefusals:0}}function TX6(){if(Ww)return;Ww={hits:q$.createCounter("fast_preview_cache_hits",{description:"Decofile disk cache hits by area",unit:"{reads}"}),misses:q$.createCounter("fast_preview_cache_misses",{description:"Decofile disk cache misses by area",unit:"{reads}"}),evictions:q$.createCounter("fast_preview_cache_evictions",{description:"Decofile disk cache entries evicted",unit:"{entries}"}),errors:q$.createCounter("fast_preview_cache_errors",{description:"Decofile disk cache swallowed errors by operation",unit:"{errors}"}),floorSkips:q$.createCounter("fast_preview_cache_floor_skips",{description:"Decofile disk cache writes skipped by the free-space floor",unit:"{writes}"})},q$.createObservableGauge("fast_preview_cache_bytes",{description:"Decofile disk cache bytes by area",unit:"By"}).addCallback(($)=>{if(!Vh)return;$.observe(Vh.index.areaBytes.blobs,{area:"blobs"}),$.observe(Vh.index.areaBytes.merged,{area:"merged"})}),q$.createObservableGauge("fast_preview_cache_entries",{description:"Decofile disk cache entry count by area",unit:"{entries}"}).addCallback(($)=>{if(!Vh)return;let Z={blobs:0,merged:0};for(let X of Vh.index.entries.values())Z[X.area]+=1;$.observe(Z.blobs,{area:"blobs"}),$.observe(Z.merged,{area:"merged"})})}function RX6($){F_.hits[$]+=1,Ww?.hits.add(1,{area:$})}function Rx$($){F_.misses[$]+=1,Ww?.misses.add(1,{area:$})}function f51(){F_.evictions+=1,Ww?.evictions.add(1)}function BN($){F_.errors+=1,Ww?.errors.add(1,{op:$})}function IX6($){F_.invalidKeySkips+=1,Ww?.errors.add(1,{op:`${$}_invalid_key`})}function b51(){return Ix$??=MX6(),Ix$}async function MX6(){let $=PX6();if(!$.enabled)return null;TX6();try{await br(R7($.root,"blobs"),{recursive:!0}),await br(R7($.root,"merged"),{recursive:!0}),await br(R7($.root,"tmp"),{recursive:!0})}catch{return BN("init"),null}let Z=[];try{Z=await Cx$($.root)}catch{BN("scan"),Z=[]}let X={root:$.root,index:_51(Z,$.index),cfg:$};return Vh=X,VX6(X),X}async function JP0($){try{return await NX6($)}catch{return[]}}async function Cx$($){let Z=[];for(let X of["blobs","merged"]){let Q=R7($,X);for(let Y of await JP0(Q)){let G=R7(Q,Y);for(let J of await JP0(G)){let W=R7(G,J);for(let K of await JP0(W))try{let H=await Vx$(R7(W,K));if(!H.isFile())continue;Z.push({path:`${X}/${Y}/${J}/${K}`,bytes:H.size,mtimeMs:H.mtimeMs})}catch{}}}}return Z}function _x$($,Z,X){if(!v51(X))return null;try{return`blobs/${fr($)}/${fr(Z)}/${X}`}catch{return null}}function vx$($,Z,X){if(!v51(X))return null;try{return`merged/${fr($)}/${fr(Z)}/${X}.json`}catch{return null}}async function fx$($,Z){try{let X=await b51();if(!X)return null;if(Z===null)return Rx$($),null;try{let Q=await UX6(R7(X.root,Z),"utf8");return Px$(X.index,Z),RX6($),Q}catch{return Rx$($),null}}catch{return BN(`get_${$}`),null}}function bx$($,Z,X){return fx$("blobs",_x$($,Z,X))}function xx$($,Z,X){return fx$("merged",vx$($,Z,X))}async function kX6($){if($.cfg.freeFloorBytes<=0)return!0;try{let Z=await BX6($.root);return Z.bavail*Z.bsize>=$.cfg.freeFloorBytes}catch{return!0}}async function WP0($){try{await wX6($)}catch{}}async function SX6($){try{let Z=$.cfg.index.maxTotalBytes/2;while($.index.totalBytes>Z){let X=$.index.entries.keys().next();if(X.done)break;kh($.index,X.value),await WP0(R7($.root,X.value)),f51()}}catch{BN("emergency_evict")}}async function yx$($,Z,X,Q){try{let Y=await b51();if(!Y)return;if(X===null){IX6(Z);return}if(!await kX6(Y)){F_.floorSkips+=1,Ww?.floorSkips.add(1);return}let G=Buffer.byteLength(Q,"utf8"),J=Ax$(Y.index,{path:X,bytes:G,area:$});if(!J.admitted){F_.admissionRefusals+=1;return}for(let K of J.evict)await WP0(R7(Y.root,K)),f51();let W=R7(Y.root,"tmp",`stage-${kx$()}`);try{await DX6(W,Q,"utf8");let K=R7(Y.root,X);await br(EX6(K),{recursive:!0}),await OX6(W,K)}catch(K){if(kh(Y.index,X),await WP0(W),BN(Z),K?.code==="ENOSPC")await SX6(Y)}}catch{BN(Z)}}function KP0($,Z,X,Q){return yx$("blobs","put_blob",_x$($,Z,X),Q)}function gx$($,Z,X,Q){return yx$("merged","put_merged",vx$($,Z,X),Q)}async function hx$(){try{let $=await b51();if(!$)return null;let Z=R7($.root,"tmp",kx$());return await br(Z,{recursive:!0}),Z}catch{return BN("make_scratch"),null}}async function ux$($){try{await Sx$($,{recursive:!0,force:!0})}catch{BN("remove_scratch")}}function VX6($){let Z=$.cfg.sweepIntervalMs;if(Z<=0)return;qx$=new AbortController,I$(Math.random()*Z,{signal:qx$.signal}).then(()=>{Mx$($);let X=setInterval(()=>void Mx$($),Z);X.unref?.(),qX6=X}).catch(()=>{})}async function Mx$($){try{let Z=_51(await Cx$($.root),$.cfg.index),X=$.cfg.index;for(let[G,J]of Z.entries){let W=Z.totalBytes>X.maxTotalBytes,K=Z.areaBytes.merged>X.maxMergedBytes;if(!W&&!K)break;if(!W&&K&&J.area!=="merged")continue;kh(Z,G),await WP0(R7($.root,G)),f51()}$.index=Z;let Q=R7($.root,"tmp"),Y=Date.now();for(let G of await JP0(Q)){let J=R7(Q,G);try{let W=await Vx$(J);if(Y-W.mtimeMs>zX6)await Sx$(J,{recursive:!0,force:!0})}catch{}}}catch{BN("sweep")}}var jX6=1024,GP0,Tx$,zX6=3600000,YP0=null,Ww=null,F_,Ix$=null,Vh=null,qX6=null,qx$=null;var cx$=w(()=>{t4();f6();GP0=1024*jX6,Tx$=1024*GP0;F_=AX6()});function lx$(){let $=new Map;return{run(Z,X){let Q=$.get(Z);if(Q)return Q;let Y=Promise.resolve().then(X).finally(()=>{$.delete(Z)});return $.set(Z,Y),Y}}}import{readdir as CX6,stat as _X6}from"fs/promises";import{join as dx$}from"path";function vX6($,Z,X){let Q=["-xz","--strip-components=1","-C",Z];return $==="gnu"?[...Q,"--wildcards",X]:[...Q,X]}function fX6(){return mx$??=(async()=>{try{let $=Bun.spawn(["tar","--version"],{stdin:"ignore",stdout:"pipe",stderr:"ignore"}),Z=await new Response($.stdout).text();return await $.exited,Z.includes("GNU")?"gnu":"bsd"}catch{return"bsd"}})(),mx$}async function ix$($,Z,X){let Q=X.replace(/^\.\//,"").replace(/^\/+/,"").replace(/\/+$/,"");if(Q===""||Q.split("/").includes(".."))throw new xr(`invalid blocks path prefix: ${X}`);let Y=await fX6(),G=`*/${Q}/*.json`,J=()=>Bun.spawn(["tar",...vX6(Y,Z,G)],{stdin:$,stdout:"ignore",stderr:"pipe"}),W;try{W=J()}catch(N){throw new xr("failed to spawn tar",{cause:N})}let K=new Response(W.stderr).text().catch(()=>""),H=await W.exited;if(H!==0){let N=(await K).trim().slice(0,500);throw new xr(`tar exited with code ${H}${N?`: ${N}`:""}`)}let F=await bX6(Z,Q);if(F.length===0)throw new xr(`tar extracted no ${G} members into ${Z}`);return F}async function bX6($,Z){let X=dx$($,...Z.split("/")),Q;try{Q=await CX6(X)}catch{return[]}let Y=[];for(let G of Q){if(!G.endsWith(".json"))continue;let J=dx$(X,G);try{if(!(await _X6(J)).isFile())continue}catch{continue}Y.push({path:`${Z}/${G}`,diskPath:J})}return Y.sort((G,J)=>G.path.localeCompare(J.path))}var xr,mx$=null;var nx$=w(()=>{xr=class xr extends Error{constructor($,Z){super($,Z);this.name="TarExtractError"}}});import{createHash as xX6}from"crypto";import{readFile as yX6}from"fs/promises";async function yr($,Z){try{return await $.getHeadSha(Z)}catch(Q){if(!(Q instanceof C6)||Q.status!==404)throw Q}let X=await $.getHeadSha(await $.getDefaultBranch());try{return await $.createRef(Z,X),X}catch(Q){if(Q instanceof C6&&Q.status===422)return $.getHeadSha(Z);throw Q}}function hX6(){let $=Bun.env.FAST_PREVIEW_COLD_TARBALL_MAX_BYTES;if($===void 0||$==="")return tx$;let Z=Number($);return Number.isFinite(Z)&&Z>=0?Math.floor(Z):tx$}function uX6($){ox$??=q$.createCounter("decofile_cold_reads",{description:"Decofile cold snapshot reads by resolution path",unit:"{reads}"}),ox$.add(1,{path:$})}function cX6($){rx$??=q$.createCounter("decofile_skipped_blocks",{description:"Decofile blocks dropped from a merge for not being valid JSON",unit:"{blocks}"}),rx$.add($)}async function HP0($,Z,X){let Q=Array($.length),Y=0,G=Array.from({length:Math.min(Z,$.length)},async()=>{for(;;){let J=Y++;if(J>=$.length)return;Q[J]=await X($[J])}});return await Promise.all(G),Q}function FP0($){return $?`${$}/.deco/blocks`:".deco/blocks"}function x51($,Z){let X=`${FP0(Z)}/`,Q=[];for(let Y of $){if(Y.type!=="blob"||!Y.path.startsWith(X))continue;let G=Y.path.slice(X.length);if(G.includes("/"))continue;if(!G.toLowerCase().endsWith(".json"))continue;Q.push({stem:G.slice(0,-5),sha:Y.sha,path:Y.path,size:Y.size})}return Q}function y51($,Z){return $.filter((X)=>_r(X.stem)===Z).map((X)=>X.path).sort()}function ax$($,Z,X,Q){return KP0($,Z,X,Q)}function dX6($,Z){return xX6("sha1").update(`${lX6}:${$}:${Z??""}`).digest("hex")}async function sx$($,Z,X,Q){let Y=Q?.createBranchIfMissing?await yr($,Z):await $.getHeadSha(Z);return mX6.run(`${$.owner}/${$.repo}@${Y}:${X??""}`,()=>iX6($,Y,X))}async function iX6($,Z,X){let{owner:Q,repo:Y}=$,G=dX6(Z,X),J=await xx$(Q,Y,G);if(J!==null)return{sha:Z,decofile:J};let W=await $.getCommitTreeSha(Z),K=await $.getTreeRecursive(W),H=x51(K,X),F=new Map;if(await HP0(H,px$,async(D)=>{let L=await bx$(Q,Y,D.sha);if(L!==null)F.set(D.path,L)}),H.length-F.size>gX6){let D=await nX6($,Z,X,H);if(uX6(D!==null?"tarball":"blobs"),D!==null)for(let[L,E]of D)F.set(L,E)}let U=await HP0(H,px$,async(D)=>{let L=F.get(D.path);if(L!==void 0)return{stem:D.stem,content:L};let E=await $.getBlobText(D.sha);return await KP0(Q,Y,D.sha,E),{stem:D.stem,content:E}}),{decofile:O,skipped:B}=vr(U);if(B.length>0)cX6(B.length),console.warn("decofile read: dropped blocks that were not valid JSON",{repo:`${Q}/${Y}`,sha:Z,packagePath:X,blocks:B.map((D)=>D.key)});return await gx$(Q,Y,G,O),{sha:Z,decofile:O}}async function nX6($,Z,X,Q){let Y=`${$.owner}/${$.repo}`,G=hX6(),J=0;for(let K of Q){if(K.size===void 0)return console.warn("decofile cold read: tarball skipped (tree entry missing size; cannot pre-validate)",{repo:Y,sha:Z,path:K.path}),null;J+=K.size}if(J>G)return console.warn("decofile cold read: tarball skipped (blocks over FAST_PREVIEW_COLD_TARBALL_MAX_BYTES)",{repo:Y,sha:Z,aggregateBytes:J,maxBytes:G}),null;let W=await hx$();if(W===null)return null;try{let K=await $.getTarballStream(Z),H=await ix$(K,W,FP0(X)),F=new Map(Q.map((U)=>[U.path,U.sha])),N=new Map;for(let U of H){let O=F.get(U.path);if(O===void 0)continue;let B=await yX6(U.diskPath,"utf8");await KP0($.owner,$.repo,O,B),N.set(U.path,B)}return N}catch(K){return console.warn("decofile cold read: tarball path failed; falling back to blob fetches",{repo:Y,sha:Z,error:K instanceof Error?K.message:String(K)}),null}finally{await ux$(W)}}var px$=12,gX6=50,tx$=134217728,ox$=null,rx$=null,lX6="3",mX6;var NP0=w(()=>{QP0();f6();cx$();H_();nx$();mX6=lx$()});async function UP0($,Z){let X=await $.getDefaultBranch(),Q=await yr($,Z),Y=X===Z?{aheadBy:0,behindBy:0}:await $.compare(X,Z);return{not_added:[],conflicted:[],created:[],deleted:[],modified:[],renamed:[],files:[],staged:[],ahead:0,behind:0,current:Z,tracking:`origin/${Z}`,detached:!1,base:X,aheadOfBase:Y.aheadBy,behindBase:Y.behindBy,headSha:Q,unpushed:0}}async function OP0($,Z,X){let Q=X??await $.getDefaultBranch(),Y=await $.compareDetailed(Q,Z),G=Y.files.slice(0,pX6),J=await $.getCommitTreeSha(Y.mergeBaseSha),W=await $.getTreeRecursive(J),K=new Map(W.filter((F)=>F.type==="blob").map((F)=>[F.path,F.sha])),H=await HP0(G,tX6,async(F)=>{let N=F.previousFilename??F.filename,U=F.status==="added"?void 0:K.get(N),O=U?await $.getBlobText(U):null,B=F.status==="removed"?null:await $.getBlobText(F.sha);return[F.filename,{from:O,to:B}]});return{diffs:Object.fromEntries(H),mergeBaseSha:Y.mergeBaseSha}}async function ex$($,Z,X,Q="fail"){try{await $.mergeBranch(Z,X,`chore(decofile): merge ${X} into ${Z}`);return}catch(Y){if(!(Y instanceof C6&&Y.status===409))throw Y;if(Q!=="branch-wins")throw new C6(409,"POST","merges",`Merge conflict updating ${Z} from ${X} \u2014 resolve on GitHub`)}await sX6($,Z,X)}function aX6($,Z){let X=new Map;for(let Q of $){let Y=Z.get(Q.filename);X.set(Q.filename,{path:Q.filename,mode:"100644",type:"blob",sha:Q.status==="removed"||!Y?null:Y.sha})}for(let Q of $)if(Q.previousFilename&&Q.previousFilename!==Q.filename&&!X.has(Q.previousFilename))X.set(Q.previousFilename,{path:Q.previousFilename,mode:"100644",type:"blob",sha:null});return[...X.values()]}async function sX6($,Z,X){for(let Q=1;;Q++){let Y=await $.getHeadSha(Z),G=await $.getHeadSha(X),{files:J}=await $.compareDetailed(X,Z);if(J.length>=oX6)throw new C6(409,"POST","merges",`Too many changed files on ${Z} to auto-merge (${J.length}); resolve on GitHub`);let W=await $.getTreeRecursive(await $.getCommitTreeSha(Y)),K=new Map(W.filter((U)=>U.type==="blob").map((U)=>[U.path,U])),H=aX6(J,K),F=await $.createTree(await $.getCommitTreeSha(G),H),N=await $.createCommit({message:`chore(decofile): merge ${X} into ${Z} (branch content wins)`,treeSha:F,parentShas:[Y,G]});try{await $.updateRef(Z,N);return}catch(U){if(U instanceof C6&&U.status===422&&Q<rX6)continue;throw U}}}var pX6=200,tX6=12,oX6=300,rX6=3;var $y$=w(()=>{H_();NP0()});function $Q6($){if(!$||$.includes(".."))return!1;return eX6.test($)}function Zy$($){let Z=typeof $.__resolveType==="string"?$.__resolveType:null;if(!Z||!$Q6(Z))return null;let{__resolveType:X,...Q}=$;return{resolveType:Z,payload:Q}}function Xy$($,Z){return`${$.replace(/\/+$/,"")}/deco/invoke/${Z}`}var eX6;var Qy$=w(()=>{eX6=/^[\w./@-]+$/});function g51($){let Z;try{Z=new URL($)}catch{return null}if(!Z.hostname.endsWith(".localhost"))return null;let X=Z.host;return Z.hostname="127.0.0.1",{url:Z.toString(),hostHeader:X}}function gr($,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 Yy$($,Z,X,Q){if(!Q.connectionId)throw new N_("Push requires a connected GitHub account. Connect mcp-github for this project and restart the sandbox.");let Y=$.organization?.id;if(!Y)throw new N_(_Z);await xO({ctx:$,connectionId:Q.connectionId,organizationId:Y,forceRefresh:!0,onLegacyMintError:(F)=>{let N=F instanceof Error?F.message:_Z;throw new N_(N)}});let{cloneUrl:G,gitUserName:J,gitUserEmail:W}=await yO(Q.connectionId,Q.owner,Q.name,$.db,$.vault).catch((F)=>{let{code:N,message:U}=j8$(F instanceof Error?F.message:String(F));throw N?new N_(U):F}),K=qh($),H=await Z.proxyDaemonRequest(X,"/_sandbox/config",{method:"PUT",headers:new Headers({"content-type":"application/json"}),body:JSON.stringify({git:{repository:{cloneUrl:G},identity:{userName:J,userEmail:W}},...K?{operator:K}:{}})});if(!H.ok){let F=await $B(H,ZQ6).catch(()=>H.statusText);throw Error(`Failed to refresh sandbox git credentials (${H.status}): ${F}`)}}var ZQ6=10485760,N_;var h51=w(()=>{P3();$P0();En();Ud0();Rx();N_=class N_ extends Error{constructor($){super($);this.name="GitPushAuthError"}}});function QQ6($){let Z=$.startsWith("thread:")?$.slice(7):$;if(!Z||Z.length>255||Z.includes("..")||Z.startsWith("/")||Z.endsWith("/")||Z.endsWith(".lock")||!XQ6.test(Z))throw Error(`Invalid branch name: ${$}`)}function U_($){return AbortSignal.any([$.req.raw.signal,AbortSignal.timeout(GQ6)])}function JQ6($,Z,X){let Q=O5($)[Z]?.[X];return!!Q&&Object.keys(jY(Q)).length>0}function O_($){let{runner:Z}=$.get("vmClaim");if(!Z)return $.json({error:"No sandbox runner configured"},503);return Z}async function hr($){let{virtualMcpMetadata:Z,connectionIds:X}=$.get("vmClaim"),Q=$.var.studioContext,Y=gr(Z,X);if(!Y)throw new C6(404,"AUTH","repo","Project has no GitHub repository");let G=t(Q);return ZP0(Q,G.id,Y)}function u51($,Z){if(Z instanceof C6){let Q=Z.status===404?404:Z.status===409||Z.status===422?409:502;return $.json({error:Z.message},Q,A9)}let X=Z instanceof Error?Z.message:String(Z);return $.json({error:X},502,A9)}async function Wy$($){try{let Z=await hr($),X=await UP0(Z,$.get("vmClaim").branch);return $.json(X,200,A9)}catch(Z){return u51($,Z)}}function wP0($,Z){let Q=(BP0.get($)??Promise.resolve()).catch(()=>{}).then(Z),Y=Q.catch(()=>{});return BP0.set($,Y),Y.finally(()=>{if(BP0.get($)===Y)BP0.delete($)}),Q}async function cZ($,Z,X){if($.get("vmClaim").fastPreview)return $.json({error:"sandbox not found: Fast Preview projects are sandbox-less"},404,A9);let Q=O_($);if(Q instanceof Response)return Q;let{claimName:Y,userId:G,projectRef:J}=$.get("vmClaim"),W=X?.method??"POST",K=null,H=new Headers;if(X?.jsonBody!==void 0)K=X.jsonBody,H.set("content-type","application/json");else if(X?.forwardJsonBody)K=await $.req.text(),H.set("content-type","application/json");let F=X?.signal,N={method:W,headers:H,body:K,...F?{signal:F}:{}},U=async()=>{let O=await Q.proxyDaemonRequest(Y,Z,N);if(X?.map404to410&&O.status===404){try{await O.body?.cancel()}catch{}if(await Q.adoptLiveClaim?.({userId:G,projectRef:J},Y))O=await Q.proxyDaemonRequest(Y,Z,N);if(O.status===404){try{await O.body?.cancel()}catch{}return new Response(JSON.stringify({error:"Sandbox handle is gone. The sandbox needs to be re-provisioned."}),{status:410,headers:{"content-type":"application/json",...A9}})}}let B=await O.text(),D=X?.redactRepoDirUnlessDesktop&&Q.kind!=="user-desktop"?KQ6(B):B,L=O.headers.get("content-type")??"application/json";return new Response(D,{status:O.status,headers:{"content-type":L,...A9}})};try{if(F){let O=U();return O.catch(()=>{}),await Promise.race([O,new Promise((D,L)=>{if(F.aborted)return L(F.reason);F.addEventListener("abort",()=>L(F.reason),{once:!0})})])}return await U()}catch(O){let B=O instanceof Error?O.message:String(O);return $.json({error:`Daemon unreachable: ${B}`},502)}}function KQ6($){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 DP0($,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 HQ6($){return Ky$.includes($)}var XQ6,Gy$=524288,YQ6=65536,GQ6=1e4,Jy$=2000,WQ6,BP0,A9,Ky$,Hy$=()=>{let $=new U1;$.use("/:virtualMcpId/:branch/*",WQ6),$.post("/:virtualMcpId/:branch/write",(X)=>cZ(X,"/_sandbox/write",{forwardJsonBody:!0,signal:U_(X)})),$.post("/:virtualMcpId/:branch/unlink",(X)=>cZ(X,"/_sandbox/unlink",{forwardJsonBody:!0,signal:U_(X)})),$.post("/:virtualMcpId/:branch/mkdir",(X)=>cZ(X,"/_sandbox/mkdir",{forwardJsonBody:!0,signal:U_(X)})),$.post("/:virtualMcpId/:branch/rename",(X)=>cZ(X,"/_sandbox/rename",{forwardJsonBody:!0,signal:U_(X)})),$.post("/:virtualMcpId/:branch/read",(X)=>cZ(X,"/_sandbox/read",{forwardJsonBody:!0,signal:U_(X)})),$.post("/:virtualMcpId/:branch/glob",(X)=>cZ(X,"/_sandbox/glob",{forwardJsonBody:!0,signal:U_(X)})),$.post("/:virtualMcpId/:branch/grep",(X)=>cZ(X,"/_sandbox/grep",{forwardJsonBody:!0,signal:U_(X)})),$.post("/:virtualMcpId/:branch/exec/:script",async(X)=>{let Q=X.req.param("script");if(!Q)return X.json({error:"missing script name"},400);return cZ(X,`/_sandbox/exec/${encodeURIComponent(Q)}`)}),$.post("/:virtualMcpId/:branch/exec/:script/kill",async(X)=>{let Q=X.req.param("script");if(!Q)return X.json({error:"missing script name"},400);return cZ(X,`/_sandbox/exec/${encodeURIComponent(Q)}/kill`)}),$.get("/:virtualMcpId/:branch/config",(X)=>cZ(X,"/_sandbox/config",{method:"GET",map404to410:!0,redactRepoDirUnlessDesktop:!0})),$.put("/:virtualMcpId/:branch/config",(X)=>cZ(X,"/_sandbox/config",{method:"PUT",forwardJsonBody:!0,map404to410:!0})),$.post("/:virtualMcpId/:branch/setup/:step",async(X)=>{let Q=X.req.param("step");if(!Q||!HQ6(Q))return X.json({error:`step must be one of: ${Ky$.join(", ")}`},400);if(Q==="start"){let Y=X.get("vmClaim");if(Y.runner){let G=t(X.var.studioContext),J=cx(Y.virtualMcpMetadata);try{await HO0({ctx:X.var.studioContext,runner:Y.runner,handle:Y.claimName,orgId:G.id,userId:Y.callerUserId,entries:J})}catch(W){let K=W instanceof Error?W.message:String(W);return X.json({error:`Failed to push env to daemon: ${K}`},502)}}}return cZ(X,`/_sandbox/setup/${Q}`,{signal:X.req.raw.signal,map404to410:!0})}),$.get("/:virtualMcpId/:branch/events",(X)=>{let Q=X.get("vmClaim");if(!Q.runner)return ON(X,async(Y)=>{await Y.writeSSE({event:"phase",data:JSON.stringify({kind:"failed",reason:"unknown",message:"No sandbox runner configured on this studio instance."})})});return Wx$(X,{ctx:X.var.studioContext,claimName:Q.claimName,runner:Q.runner,virtualMcpId:Q.virtualMcpId,branch:Q.branch,userId:Q.userId,projectRef:Q.projectRef,virtualMcpMetadata:Q.virtualMcpMetadata})}),$.get("/:virtualMcpId/:branch/git/status",(X)=>{if(X.get("vmClaim").fastPreview)return Wy$(X);return Z(X)});let Z=(X)=>cZ(X,"/_sandbox/git/status",{method:"GET",map404to410:!0,signal:AbortSignal.any([X.req.raw.signal,AbortSignal.timeout(Jy$)])});return $.post("/:virtualMcpId/:branch/git/status",(X)=>{if(X.get("vmClaim").fastPreview)return Wy$(X);return cZ(X,"/_sandbox/git/status",{map404to410:!0,signal:AbortSignal.any([X.req.raw.signal,AbortSignal.timeout(Jy$)])})}),$.post("/:virtualMcpId/:branch/git/diff",async(X)=>{let Q=X.get("vmClaim");if(Q.fastPreview)try{let Y=await X.req.json().catch(()=>({})),G=await hr(X),J=await OP0(G,Q.branch,Y.base);return X.json(J,200,A9)}catch(Y){return u51(X,Y)}return cZ(X,"/_sandbox/git/diff",{forwardJsonBody:!0,map404to410:!0})}),$.post("/:virtualMcpId/:branch/git/publish",async(X)=>{if(X.get("vmClaim").fastPreview)return X.json({ok:!0},200,A9);let Q=O_(X);if(Q instanceof Response)return Q;let{claimName:Y,virtualMcpMetadata:G,connectionIds:J}=X.get("vmClaim"),W=X.var.studioContext;return wP0(Y,async()=>{try{await P51(W,Q,Y);let K=gr(G,J);if(K)await Yy$(W,Q,Y,K)}catch(K){if(K instanceof N_)return X.json({error:K.message},403,A9);let H=K instanceof Error?K.message:String(K);return X.json({error:H},502,A9)}return cZ(X,"/_sandbox/git/publish",{forwardJsonBody:!0,map404to410:!0})})}),$.post("/:virtualMcpId/:branch/git/discard",async(X)=>{let{claimName:Q,fastPreview:Y}=X.get("vmClaim");if(Y)return X.json({error:"Nothing to discard: Fast Preview projects have no working tree"},400,A9);return wP0(Q,()=>cZ(X,"/_sandbox/git/discard",{forwardJsonBody:!0,map404to410:!0}))}),$.post("/:virtualMcpId/:branch/git/rebase",async(X)=>{let Q=X.get("vmClaim");if(Q.fastPreview)return wP0(Q.claimName,async()=>{try{let W=await X.req.json().catch(()=>({})),K=await hr(X),H=W.base??await K.getDefaultBranch();return await ex$(K,Q.branch,H,W.onConflict==="branch-wins"?"branch-wins":"fail"),X.json({ok:!0},200,A9)}catch(W){return u51(X,W)}});let Y=O_(X);if(Y instanceof Response)return Y;let{claimName:G}=X.get("vmClaim"),J=X.var.studioContext;return wP0(G,async()=>{try{await P51(J,Y,G)}catch(W){let K=W instanceof Error?W.message:String(W);return X.json({error:K},502,A9)}return cZ(X,"/_sandbox/git/rebase",{forwardJsonBody:!0,map404to410:!0})})}),$.post("/:virtualMcpId/:branch/git/suggest-commit",wZ({maxSize:Gy$,onError:(X)=>X.json({error:"Payload too large"},413,A9)}),async(X)=>{let Q=X.get("vmClaim"),Y=null;if(!Q.fastPreview){let H=O_(X);if(H instanceof Response)return H;Y=H}let{claimName:G,userId:J,projectRef:W}=Q,K=X.var.studioContext;try{let H=await X.req.json().catch(()=>({})),F=H.status,N=H.diff,U=N!=null&&typeof N.diffs==="object"&&N.diffs!==null,[O,B]=R51(F)&&U?[F,N]:Y?await Promise.all([DP0(Y,G,"/_sandbox/git/status","GET",{userId:J,projectRef:W}),DP0(Y,G,"/_sandbox/git/diff","GET",{userId:J,projectRef:W})]):await(async()=>{let L=await hr(X);return Promise.all([UP0(L,Q.branch),OP0(L,Q.branch)])})(),D=await Ux$(K,O,B);return X.json(D,200,A9)}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,A9);return X.json({error:F},502,A9)}}),$.post("/:virtualMcpId/:branch/git/judge-review",wZ({maxSize:Gy$,onError:(X)=>X.json({error:"Payload too large"},413,A9)}),async(X)=>{let Q=X.get("vmClaim"),Y=null;if(!Q.fastPreview){let H=O_(X);if(H instanceof Response)return H;Y=H}let{claimName:G,userId:J,projectRef:W}=Q,K=X.var.studioContext;try{let H=await X.req.json().catch(()=>({})),F=H.status,N=H.diff,U=N!=null&&typeof N.diffs==="object"&&N.diffs!==null,[O,B]=R51(F)&&U?[F,N]:Y?await Promise.all([DP0(Y,G,"/_sandbox/git/status","GET",{userId:J,projectRef:W}),DP0(Y,G,"/_sandbox/git/diff","GET",{userId:J,projectRef:W})]):await(async()=>{let L=await hr(X);return Promise.all([UP0(L,Q.branch),OP0(L,Q.branch)])})(),D=await Bx$(K,O,B,typeof H.language==="string"?H.language:void 0);return X.json(D,200,A9)}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,A9);return X.json({error:F},502,A9)}}),$.get("/:virtualMcpId/:branch/preview-fetch",async(X)=>{let Q=O_(X);if(Q instanceof Response)return Q;let{claimName:Y}=X.get("vmClaim"),G=X.req.query("path");if(!G||!G.startsWith("/")||G.startsWith("//")||G.includes("..")||G.includes("\\"))return X.json({error:"Path not allowed"},403);let J;try{J=await Q.getPreviewUrl(Y)}catch{return X.json({error:"Preview not available"},502)}if(!J)return X.json({error:"Preview not available"},502);let W=J.replace(/\/+$/,""),K=g51(`${W}${G}`),H;try{H=await fetch(K?.url??`${W}${G}`,{...K?{headers:{host:K.hostHeader}}:{}})}catch{return X.json({error:"Preview unreachable"},502)}let F;try{F=await H.text()}catch{return X.json({error:"Preview unreachable"},502)}return new Response(F,{status:H.status,headers:{"content-type":H.headers.get("content-type")??"application/json"}})}),$.post("/:virtualMcpId/:branch/preview-invoke",wZ({maxSize:YQ6,onError:(X)=>X.json({error:"Payload too large"},413)}),async(X)=>{let Q=O_(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=Zy$(J);if(!W)return X.json({error:"Invalid or missing __resolveType"},400);let K=Xy$(G,W.resolveType),H=g51(K),F;try{F=await fetch(H?.url??K,{method:"POST",headers:{"content-type":"application/json",...H?{host:H.hostHeader}:{}},body:JSON.stringify(W.payload),signal:AbortSignal.timeout(30000)})}catch{return X.json({error:"Preview unreachable"},502)}let N;try{N=await F.text()}catch{return X.json({error:"Preview unreachable"},502)}return new Response(N,{status:F.status,headers:{"content-type":F.headers.get("content-type")??"application/json"}})}),$};var Fy$=w(()=>{C8();Xw();Ih();z51();BF();Gx$();M3();lX();F8();Yp0();rO();Jx$();Kx$();_i0();Dn();M51();wx$();V51();H_();$y$();Qy$();h51();XQ6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;WQ6=ez0(async($,Z)=>{let X=$.var.studioContext;try{e(X)}catch{return $.json({error:"Unauthorized"},401)}let Q=W1(X);if(!Q)return $.json({error:"Unauthorized"},401);let Y;try{Y=t(X)}catch{return $.json({error:"Organization scope required"},403)}let G=$.req.param("virtualMcpId"),J=$.req.param("branch");if(!G||!J)return $.json({error:"virtualMcpId and branch are required"},400);try{QQ6(J)}catch(O){let B=O instanceof Error?O.message:String(O);return $.json({error:B},400)}let W=await X.storage.virtualMcps.findById(G);if(!W||W.organization_id!==Y.id)return $.json({error:"Virtual MCP not found"},404);let K=yi({orgId:Y.id,virtualMcpId:G,branch:J}),H=await RF(X,J,Q),F=Yx$({userId:H,projectRef:K}),N=W.metadata??null;if(y3$(N).fastPreviewCapability&&!JQ6(N,H,J))return $.set("vmClaim",{claimName:F,callerUserId:Q,runner:null,virtualMcpId:G,branch:J,userId:H,projectRef:K,virtualMcpMetadata:N,connectionIds:W.connections?.map((O)=>O.connection_id)??[],fastPreview:!0}),Z();let U;try{U=(await tX(X,{userId:H,branch:J,virtualMcpMetadata:N})).provider}catch{U=null}if(!U)return $.json({error:"No sandbox runner found"},404);return $.set("vmClaim",{claimName:F,callerUserId:Q,runner:U,virtualMcpId:G,branch:J,userId:H,projectRef:K,virtualMcpMetadata:N,connectionIds:W.connections?.map((O)=>O.connection_id)??[]}),Z()});BP0=new Map;A9={"Cache-Control":"no-store, no-cache, must-revalidate",Pragma:"no-cache"};Ky$=["clone","install","start"]});function Ny$($,Z,X){let Q=c51.get($);if(!Q)Q={pending:null,running:!1},c51.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)NQ6($,Q);return G}async function NQ6($,Z){Z.running=!0;try{while(Z.pending){let X=Z.pending;Z.pending=null;try{let Q=await UQ6(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)c51.delete($)}}async function UQ6($){let{client:Z,branch:X,packagePath:Q}=$.deps;for(let Y=0;;Y++){let G=await yr(Z,X),J=await Z.getCommitTreeSha(G),W=await Z.getTreeRecursive(J),K=x51(W,Q),H=[],F=new Map(K.map((B)=>[B.path,{stem:B.stem,sha:B.sha}]));for(let[B,D]of $.set){let L=y51(K,B),E=`${JSON.stringify(D,null,2)}
|
|
2764
|
-
`,j=await Z.createBlob(E);await ax$(Z.owner,Z.repo,j,E);let z=L[0]??`${FP0(Q)}/${C51(B)}.json`;H.push({path:z,mode:"100644",type:"blob",sha:j});let A=z.slice(z.lastIndexOf("/")+1,-5);F.set(z,{stem:A,sha:j,content:E});for(let P of L.slice(1))H.push({path:P,mode:"100644",type:"blob",sha:null}),F.delete(P)}for(let B of $.del)for(let D of y51(K,B))H.push({path:D,mode:"100644",type:"blob",sha:null}),F.delete(D);if(H.length===0)return G;let N=Q?`${Q}/.deco/blocks.gen.json`:".deco/blocks.gen.json";if(W.some((B)=>B.type==="blob"&&B.path===N)){let B=await Promise.all([...F.values()].map(async(j)=>({stem:j.stem,content:j.content??await Z.getBlobText(j.sha)}))),{decofile:D,skipped:L}=vr(B);if(L.length>0)console.warn("decofile gen: dropped blocks that were not valid JSON",{repo:`${Z.owner}/${Z.repo}`,branch:X,packagePath:Q,blocks:L.map((j)=>j.key)});let E=await Z.createBlob(D);H.push({path:N,mode:"100644",type:"blob",sha:E})}let U=await Z.createTree(J,H),O=await Z.createCommit({message:OQ6($),treeSha:U,parentShas:[G]});try{return await Z.updateRef(X,O),O}catch(B){if(!(B instanceof C6&&B.status===422)||Y>=FQ6-1)throw B;await I$(mZ(2000,200,Y,2,0.5))}}}function OQ6($){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 Qd0(Q,$.deps.coAuthor)}var FQ6=3,c51;var Uy$=w(()=>{ZO0();QP0();t4();H_();NP0();c51=new Map});import{createHmac as Oy$,randomBytes as BQ6,timingSafeEqual as wQ6}from"crypto";function By$(){if(LP0)return LP0;let $;try{let Z=b0();$=Z.studioJwtSecret??Z.betterAuthSecret}catch{$=void 0}return LP0=$?Buffer.from($):BQ6(32),LP0}function l51($){let Z=$.nowMs??Date.now(),X={o:$.organizationId,m:$.virtualMcpId,b:$.branch,e:Math.floor((Z+DQ6)/1000)},Q=Buffer.from(JSON.stringify(X)).toString("base64url"),Y=Oy$("sha256",By$()).update(Q).digest("base64url");return`${Q}.${Y}`}function wy$($,Z){let X=$.indexOf(".");if(X<0)return!1;let Q=$.slice(0,X),Y=Buffer.from($.slice(X+1)),G=Buffer.from(Oy$("sha256",By$()).update(Q).digest("base64url"));if(Y.length!==G.length||!wQ6(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 DQ6=21600000,LP0=null;var Dy$=w(()=>{A$()});import{z as Ch}from"zod";function EQ6($){return $.length>0&&$.length<=255&&!$.includes("..")&&!$.endsWith("/")&&!$.endsWith(".lock")&&LQ6.test($)}function Ey$($){return $.req.header("x-forwarded-host")??new URL($.req.url).host}async function EP0($){let Z=$.get("decofileScope");return ZP0($.var.studioContext,Z.organizationId,Z.githubRepo)}function jP0($,Z){if(Z instanceof C6){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 jy$(){let $=new U1;return $.use("/:virtualMcpId/:branch",Ly$),$.use("/:virtualMcpId/:branch/*",Ly$),$.get("/:virtualMcpId/:branch",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await EP0(Z),Y=await sx$(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=l51({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.body(`{"version":${JSON.stringify(Y.sha)},"token":${JSON.stringify(J)},"apiHost":${JSON.stringify(Ey$(Z))},"decofile":${Y.decofile}}`,200,{...G,"content-type":"application/json"})}catch(Q){return jP0(Z,Q)}}),$.patch("/:virtualMcpId/:branch",async(Z)=>{let X=Z.get("decofileScope"),Q=Z.var.studioContext,Y=jQ6.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{XP0(J)}catch(W){let K=W instanceof Error?W.message:String(W);return Z.json({error:K},400)}for(let[J,W]of Object.entries(G.set??{}))if(typeof W!=="object"||W===null||Array.isArray(W))return Z.json({error:`Block "${J}" must be a JSON object`},400);try{let J=await EP0(Z),W=await Ny$(`${X.organizationId}/${X.virtualMcpId}/${X.branch}`,{client:J,branch:X.branch,packagePath:X.packagePath,coAuthor:qh(Q)},G),K=l51({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.json({version:W,token:K,apiHost:Ey$(Z)})}catch(J){return jP0(Z,J)}}),$.post("/:virtualMcpId/:branch/publish",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await EP0(Z),Y=await Q.getDefaultBranch();if(Y===X.branch)return Z.json({error:"Branch is already the default branch"},400);try{let G=await Q.mergeBranch(Y,X.branch,`chore(decofile): publish ${X.branch}`);return G?Z.json({result:"merged",sha:G}):Z.json({result:"up-to-date"})}catch(G){if(G instanceof C6&&G.status===409)return Z.json({error:"merge-conflict"},409);if(G instanceof C6&&G.status===405){let W=await Q.findOpenPullRequest(Y,X.branch)??await Q.createPullRequest({base:Y,head:X.branch,title:`Publish ${X.branch}`});return Z.json({result:"pull-request",number:W.number,url:W.html_url})}throw G}}catch(Q){return jP0(Z,Q)}}),$.get("/:virtualMcpId/:branch/status",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await EP0(Z),Y=await Q.getDefaultBranch();if(Y===X.branch)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0});try{let{aheadBy:G,behindBy:J}=await Q.compare(Y,X.branch);return Z.json({baseBranch:Y,aheadBy:G,behindBy:J})}catch(G){if(G instanceof C6&&G.status===404)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0});throw G}}catch(Q){return jP0(Z,Q)}}),$}var LQ6,jQ6,Ly$;var zy$=w(()=>{QP0();C8();z51();$P0();h51();V51();Uy$();Dy$();H_();NP0();LQ6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;jQ6=Ch.object({set:Ch.record(Ch.string(),Ch.unknown()).optional(),delete:Ch.array(Ch.string()).optional()}).refine(($)=>Object.keys($.set??{}).length>0||($.delete?.length??0)>0,{message:"Patch must set or delete at least one block"}),Ly$=ez0(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(!EQ6(G))return $.json({error:`Invalid branch name: ${G}`},400);let J=X.auth?.user?.id??null;if(!J){let O=$.req.query("token");if(!($.req.method==="GET"&&!$.req.path.match(/\/(publish|status)$/)))return $.json({error:"Unauthorized"},401);if(!O||!wy$(O,{organizationId:Q.id,virtualMcpId:Y,branch:G}))return $.json({error:"Unauthorized"},401)}let W=await X.storage.virtualMcps.findById(Y);if(!W||W.organization_id!==Q.id)return $.json({error:"Virtual MCP not found"},404);let K=W.metadata??null;if(!UB0(K)||K?.fastPreview!==!0)return $.json({error:"Fast Preview is not enabled for this project"},404);let F=W.connections?.map((O)=>O.connection_id)??[],N=gr(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 Py$=($)=>{let Z=new U1;if(Z.use("*",Z_),Z.route("/",Dz0()),Z.route("/",i_$()),Z.route("/",ib$()),Z.route("/",lb$()),Z.route("/",rz0()),Z.route("/tools",sb$()),Z.route("/",ob$()),Z.route("/",Rb$({kvStorage:$.kvStorage})),Z.route("/",Ab$()),Z.route("/fs",bb$({getConnection:$.getNatsConnection})),Z.route("/sandbox",Hy$()),Z.route("/decofile",jy$()),Z.route("/",hb$()),Z.route("/deco-sites",Ez0()),Z.route("/sso",Fz0()),Z.route("/",az0({tokenStorage:$.tokenStorage,automationEventDispatcher:$.automationEventDispatcher})),Z.route("/webhooks",y_$()),$.mountDevAssets)Z.route("/dev-assets",jz0({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("/",PV$()),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",yb$()),Z.route("/mcp",qw0()),Z.route("/mcp/self",oz0()),Z.route("/mcp",Sw0()),Z.all("/oauth-proxy/:connectionId/*",$.oauthProxyHandler),Z.get("/watch",$.watchHandler),Z};var Ay$=w(()=>{C8();l41();g_$();n41();zz0();Gr();u41();Tb$();Ib$();xb$();wp();_41();Vw0();O51();gb$();ub$();db$();nb$();rb$();w51();eb$();D51();Mw0();Fy$();zy$()});function zQ6($){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 PQ6=async($,Z)=>{if(!$.get("studioContext").auth.user?.id)return $.json({error:"Unauthorized"},401);return Z()},Ty$=()=>{let $=new U1;return $.use("*",PQ6),$.get("/",async(Z)=>{let X=b0(),Q=X.decoSupabaseUrl,Y=X.decoSupabaseServiceKey;if(!Q||!Y)return Z.json({apps:[]});try{let G=await uZ(Q,Y,"apps?select=name,title,description,logo,category,vendors(alias,url)");return Z.json({apps:zQ6(G)})}catch(G){return console.error("[deco-apps] GET error:",G),Z.json({error:"Failed to fetch apps"},502)}}),$};var Ry$=w(()=>{C8();A$();jj0()});import{z as M1}from"zod";function tK($,Z="invalid_request_error",X=null,Q=null){return{error:{message:$,type:Z,param:X,code:Q}}}function CQ6($){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 _Q6($,Z,X){try{return JSON.parse($)}catch{throw new My$(`Invalid JSON in tool call arguments for function '${X}' (tool_call_id: ${Z}): ${$}`)}}function vQ6($){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:_Q6(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 fQ6($){let Z=$.map((X)=>{let Q=X.function.parameters?vY(X.function.parameters):vY({type:"object",properties:{}});return[X.function.name,f$({description:X.function.description,inputSchema:Q})]});return Object.fromEntries(Z)}function bQ6($){if(!$)return;return{openai:{response_format:$}}}function xQ6(){return`chatcmpl-${crypto.randomUUID().replace(/-/g,"").substring(0,29)}`}function Iy$($,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 qy$($){if($==="tool-calls")return"tool_calls";if($==="length")return"length";return"stop"}var AQ6=256,TQ6,RQ6,IQ6,qQ6,MQ6,kQ6,SQ6,VQ6,My$,ky$,Sy$;var Vy$=w(()=>{C4();C8();Ih();pF();TQ6=M1.object({type:M1.literal("function"),function:M1.object({name:M1.string(),description:M1.string().optional(),parameters:M1.record(M1.string(),M1.unknown()).optional()})}),RQ6=M1.object({id:M1.string(),type:M1.literal("function"),function:M1.object({name:M1.string(),arguments:M1.string()})}),IQ6=M1.discriminatedUnion("role",[M1.object({role:M1.literal("system"),content:M1.string(),name:M1.string().optional()}),M1.object({role:M1.literal("user"),content:M1.union([M1.string(),M1.array(M1.union([M1.object({type:M1.literal("text"),text:M1.string()}),M1.object({type:M1.literal("image_url"),image_url:M1.object({url:M1.string(),detail:M1.string().optional()})})]))]),name:M1.string().optional()}),M1.object({role:M1.literal("assistant"),content:M1.string().nullable().optional(),name:M1.string().optional(),tool_calls:M1.array(RQ6).optional()}),M1.object({role:M1.literal("tool"),content:M1.string(),tool_call_id:M1.string()})]),qQ6=M1.object({type:M1.literal("text")}),MQ6=M1.object({type:M1.literal("json_object")}),kQ6=M1.object({type:M1.literal("json_schema"),json_schema:M1.object({name:M1.string(),description:M1.string().optional(),schema:M1.record(M1.string(),M1.unknown()),strict:M1.boolean().optional()})}),SQ6=M1.union([qQ6,MQ6,kQ6]),VQ6=M1.object({model:M1.string().describe("Format: 'model_id' or 'credential_id:model_id'"),messages:M1.array(IQ6),stream:M1.boolean().optional().default(!1),temperature:M1.number().min(0).max(2).optional(),max_tokens:M1.number().positive().optional(),top_p:M1.number().min(0).max(1).optional(),frequency_penalty:M1.number().min(-2).max(2).optional(),presence_penalty:M1.number().min(-2).max(2).optional(),stop:M1.union([M1.string(),M1.array(M1.string())]).optional(),tools:M1.array(TQ6).optional(),tool_choice:M1.union([M1.literal("auto"),M1.literal("none"),M1.literal("required"),M1.object({type:M1.literal("function"),function:M1.object({name:M1.string()})})]).optional(),response_format:SQ6.optional(),user:M1.string().optional()});My$=class My$ extends Error{constructor($){super($);this.name="MessageConversionError"}};ky$=new U1;ky$.post("/:org/v1/chat/completions",async($)=>{let Z=$.get("studioContext"),X=$.req.param("org");try{if(!Z.auth.apiKey?.id)return $.json(tK("API key authentication required. Provide a valid API key via Authorization header.","authentication_error"),401);if(!Z.organization)return $.json(tK("Organization context is required. Ensure your API key has organization metadata.","invalid_request_error","organization"),400);if((Z.organization.slug??Z.organization.id)!==X)return $.json(tK("Organization mismatch. The API key's organization does not match the requested organization.","invalid_request_error","organization"),403);let Q=await $.req.json(),Y=VQ6.safeParse(Q);if(!Y.success){let L=Y.error.issues[0]??{message:"Invalid request",path:[]};return $.json(tK(`Invalid request: ${L.message}`,"invalid_request_error",L.path.length>0?L.path.join("."):null),400)}let G=Y.data,J=CQ6(G.model);if(!J)return $.json(tK("Invalid model format. Expected 'model_id' or 'credential_id:model_id' (e.g., 'claude-sonnet-4-6' or 'key_abc123:claude-sonnet-4-6')","invalid_request_error","model"),400);let{credentialId:W}=J,{modelId:K}=J;if(!W){let E=(await Z.storage.aiProviderKeys.list({organizationId:Z.organization.id})).find((j)=>LD(j.providerId));if(!E)return $.json(tK("No AI provider credentials configured for this organization. Add a credential in settings or specify one explicitly via 'credential_id:model_id'.","invalid_request_error","model"),400);W=E.id}let H;try{H=await Z.aiProviders.activate(W,Z.organization.id)}catch{return $.json(tK(`AI provider credential not found or inaccessible: ${W}`,"invalid_request_error","model"),404)}let F=H.aiSdk.languageModel(K),N=vQ6(G.messages),U=G.tools?fQ6(G.tools):void 0,O=bQ6(G.response_format),B=xQ6(),D=Math.floor(Date.now()/1000);if(G.stream)return ON($,async(L)=>{let E=Iy$(F,N,U,G,O,$.req.raw.signal);try{let j=fO(E),z=!1,A=0,P="",q=async()=>{if(P.length===0)return;let M=P;P="",await L.writeSSE({data:JSON.stringify({id:B,object:"chat.completion.chunk",created:D,model:G.model,choices:[{index:0,delta:{content:M},finish_reason:null}]})})};for await(let M of j.fullStream){if(!z&&(M.type==="text-delta"||M.type==="tool-call"))await L.writeSSE({data:JSON.stringify({id:B,object:"chat.completion.chunk",created:D,model:G.model,choices:[{index:0,delta:{role:"assistant",content:""},finish_reason:null}]})}),z=!0;if(M.type==="text-delta"){if(P+=M.text,P.length>=AQ6)await q()}else if(M.type==="tool-call"){await q();let k=A++;await L.writeSSE({data:JSON.stringify({id:B,object:"chat.completion.chunk",created:D,model:G.model,choices:[{index:0,delta:{tool_calls:[{index:k,id:M.toolCallId,type:"function",function:{name:M.toolName,arguments:JSON.stringify(M.input)}}]},finish_reason:null}]})})}else if(M.type==="finish")await q(),await L.writeSSE({data:JSON.stringify({id:B,object:"chat.completion.chunk",created:D,model:G.model,choices:[{index:0,delta:{},finish_reason:qy$(M.finishReason)}],usage:M.totalUsage?{prompt_tokens:M.totalUsage.inputTokens??0,completion_tokens:M.totalUsage.outputTokens??0,total_tokens:M.totalUsage.totalTokens??0}:void 0})})}await q(),await L.writeSSE({data:"[DONE]"})}catch(j){let z=j;console.error("[openai-compat:stream] Error:",z.message),await L.writeSSE({data:JSON.stringify({error:{message:z.message,type:"server_error"}})})}});else{let L=Iy$(F,N,U,G,O,$.req.raw.signal),E=await _O(L),j={role:"assistant",content:E.text||null};if(E.toolCalls&&E.toolCalls.length>0)j.tool_calls=E.toolCalls.map((z)=>({id:z.toolCallId,type:"function",function:{name:z.toolName,arguments:JSON.stringify("input"in z?z.input:{})}})),j.content=null;return $.json({id:B,object:"chat.completion",created:D,model:G.model,choices:[{index:0,message:j,finish_reason:qy$(E.finishReason)}],usage:{prompt_tokens:E.usage?.inputTokens??0,completion_tokens:E.usage?.outputTokens??0,total_tokens:E.usage?.totalTokens??0}})}}catch(Q){let Y=Q;if(Y.name==="AbortError")return $.json(tK("Request aborted","invalid_request_error"),400);if(Y.name==="MessageConversionError")return $.json(tK(Y.message,"invalid_request_error","messages"),400);return console.error("[openai-compat] Error:",Y.message,Y.stack),$.json(tK(Y.message,"server_error"),500)}});Sy$=ky$});var _y$;var Cy$=w(()=>{_y$={name:"decocms",version:"4.230.7",description:"Deco CMS \u2014 Self-hostable MCP Gateway for managing AI connections and tools",author:"Deco team",repository:{type:"git",url:"git+https://github.com/decocms/studio.git",directory:"apps/api"},bugs:{url:"https://github.com/decocms/studio/issues"},type:"module",bin:{deco:"./dist/server/cli.js"},files:["dist/**/*"],scripts:{dev:"bun run migrate && bun run dev:server","dev:server":"bun run --cwd=../../packages/sandbox build && NODE_ENV=development bun --env-file=.env --hot run src/index.ts",build:"bun run build:server","build:server":"bun run scripts/bundle-server-script.ts --dist ./dist/server","generate:tool-contracts":"bun run scripts/generate-tool-contracts.ts","db:migrate":"bun run ./dist/server/migrate.js","db:migrate:dbos":"bun run ./dist/server/migrate-dbos.js",check:"tsc --noEmit",start:"bun run ./dist/server/server.js",migrate:"bun run src/database/migrate.ts","migrate:dbos":"bun run src/database/migrate-dbos.ts",test:"bun test src","better-auth:migrate":"bunx --bun @better-auth/cli migrate -y --config src/auth/index.ts",prepublishOnly:"bun run --cwd=../.. build:studio"},optionalDependencies:{"@duckdb/node-api":"^1.5.0-r.1"},dependencies:{"@ai-sdk/anthropic":"^3.0.85","@ai-sdk/google":"^3.0.83","@ai-sdk/openai":"^3.0.73","@anthropic-ai/sdk":"^0.105.0","@aws-sdk/client-s3":"^3.1013.0","@aws-sdk/client-sts":"^3.1013.0","@aws-sdk/lib-storage":"^3.1013.0","@aws-sdk/s3-request-presigner":"^3.1013.0","@clickhouse/client":"^1.8.1","@dbos-inc/dbos-sdk":"^4.21.6","@inkjs/ui":"^2.0.0","@nats-io/jetstream":"3.4.0","@nats-io/kv":"3.4.0","@nats-io/nats-core":"3.4.0","@nats-io/transport-node":"3.4.0","@openrouter/ai-sdk-provider":"^2.9.1","@opentelemetry/core":"^2.6.0","embedded-postgres":"^18.3.0-beta.16",ink:"^6.8.0",kysely:"^0.28.12","posthog-node":"^5.0.0",react:"^19.2.6","react-dom":"^19.2.6"},devDependencies:{"@ai-sdk/provider":"^3.0.10","@better-auth/sso":"1.4.1","@decocms/better-auth":"1.5.17","@decocms/bindings":"workspace:*","@decocms/mcp-utils":"workspace:*","@decocms/runtime":"workspace:*","@decocms/sandbox":"workspace:*","@decocms/shared":"workspace:*","@jitl/quickjs-wasmfile-release-sync":"0.31.0","@modelcontextprotocol/sdk":"1.29.0","@nats-io/jwt":"0.0.10-5","@opentelemetry/api":"^1.9.0","@opentelemetry/api-logs":"^0.211.0","@opentelemetry/exporter-logs-otlp-proto":"^0.211.0","@opentelemetry/exporter-prometheus":"^0.208.0","@opentelemetry/exporter-trace-otlp-proto":"^0.207.0","@opentelemetry/instrumentation-runtime-node":"^0.24.0","@opentelemetry/resources":"^2.6.0","@opentelemetry/sdk-logs":"^0.211.0","@opentelemetry/sdk-metrics":"^2.2.0","@opentelemetry/sdk-node":"^0.207.0","@opentelemetry/sdk-trace-base":"^2.5.0","@types/bun":"^1.3.1","@types/google.maps":"^3.65.2","@types/pg":"^8.15.6","@types/react-syntax-highlighter":"^15.5.13","@vercel/nft":"^1.1.1",ai:"^6.0.208","better-auth":"1.4.22",croner:"^9.1.0",degit:"^2.8.4",hono:"^4.10.7",jose:"^6.0.11",nanoid:"^5.1.6",pg:"^8.16.3",typescript:"^7.0.2",typescript5:"npm:typescript@^5.9.3",zod:"4.3.6"},homepage:"https://github.com/decocms/studio",keywords:["mcp","model-context-protocol","ai","gateway","self-hosted","tools"],license:"MIT",publishConfig:{access:"public"}}});function hQ6(){let $=process.env.POSTHOG_KEY;if(!$)return null;return{key:$,host:process.env.POSTHOG_HOST??gQ6}}var vy$,gQ6="https://ph.studio.decocms.com",fy$;var by$=w(()=>{C8();yg0();mV();r9();A$();M41();Cy$();vy$=new U1;vy$.get("/",($)=>{let Z={version:_y$.version,theme:gl1(),...WL().logo&&{logo:WL().logo},...LK()&&{internalUrl:BS1()},...b0().enableDecoImport&&{enableDecoImport:!0},brandExtractEnabled:!!b0().firecrawlApiKey,auth:$_$(),posthog:hQ6(),googleMapsApiKey:process.env.GOOGLE_MAPS_API_KEY?.trim()||null,runtime:{agentSandbox:!LK()&&b0().sandboxProviderKind==="agent-sandbox"}};return $.header("Cache-Control","no-store"),$.json({success:!0,config:Z})});fy$=vy$});function _h($){let Z=($??"").trim().toLowerCase();return Z=Z.replace(/^https?:\/\//,""),Z=Z.replace(/^www\./,""),Z=Z.split(/[/?#]/)[0]??"",Z.replace(/\/+$/,"")}function d51($){return(_h($).split(".")[0]||$).replace(/[-_]/g," ").split(" ").filter(Boolean).map((X)=>X.charAt(0).toUpperCase()+X.slice(1)).join(" ")}function yy$($,Z=64){return`https://www.google.com/s2/favicons?domain=${encodeURIComponent(_h($))}&sz=${Z}`}function xy$($,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 gy$($){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()?xy$(`${Y.trim().replace(/\s+/g," ")} \u2014 ${J}`,200):xy$(`How does ${X} really perform? ${J}`,200);return{title:G,description:W}}import{z as l0}from"zod";var B_,uQ6,cQ6,lQ6,dQ6,hy$;var uy$=w(()=>{B_=l0.enum(["good","bad","neutral"]),uQ6=l0.preprocess(($)=>{if(Array.isArray($))return{kind:"text",value:$.find((X)=>X!==null&&typeof X!=="object")??""};return $!==null&&typeof $==="object"?$:{kind:"text",value:$}},l0.object({kind:l0.enum(["text","number","sparkline","badge","score"]).catch("text"),value:l0.coerce.string().optional(),tone:B_.optional(),muted:l0.boolean().optional(),delta:l0.coerce.string().optional(),deltaDir:l0.enum(["up","down","neutral"]).optional(),points:l0.array(l0.coerce.number()).optional(),label:l0.coerce.string().optional()}).transform(($)=>{if($.kind==="badge"&&$.label==null)$.label=$.value??"";if($.kind==="score"){let Z=Number($.value);if(Number.isNaN(Z))return{...$,kind:"text"}}return $})),cQ6=l0.preprocess(($)=>{let Z=$;if(Z&&typeof Z==="object"&&!Array.isArray(Z)&&Array.isArray(Z.cells))Z=Z.cells;if(Array.isArray(Z)&&Z.length===1&&Array.isArray(Z[0]))Z=Z[0];if(Array.isArray(Z))return Z;if(Z&&typeof Z==="object")return Object.values(Z);return Z},l0.array(uQ6)),lQ6={key:l0.coerce.string(),title:l0.coerce.string(),eyebrow:l0.coerce.string().optional(),headline:l0.coerce.string(),annotation:l0.coerce.string().optional(),methodology:l0.coerce.string().optional(),sources:l0.array(l0.object({name:l0.coerce.string(),logoUrl:l0.coerce.string()})).optional()},dQ6=l0.discriminatedUnion("template",[l0.object({template:l0.literal("cover"),score:l0.object({value:l0.coerce.number(),max:l0.coerce.number().optional(),grade:l0.coerce.string().optional(),label:l0.coerce.string().optional()}).optional(),brandImage:l0.coerce.string().optional(),screenshot:l0.coerce.string().optional(),mobileScreenshot:l0.coerce.string().optional()}),l0.object({template:l0.literal("cta"),ctaUrl:l0.coerce.string().optional(),ctaLabel:l0.coerce.string().optional(),bullets:l0.array(l0.coerce.string()).optional()}),l0.object({template:l0.literal("series"),points:l0.array(l0.coerce.number()).min(2),xLabels:l0.array(l0.coerce.string()).min(1),unit:l0.coerce.string().optional(),callout:l0.object({index:l0.coerce.number(),value:l0.coerce.string(),tone:B_.optional()})}),l0.object({template:l0.literal("threshold"),value:l0.coerce.string().default(""),metricLabel:l0.coerce.string().optional(),ratio:l0.coerce.number(),thresholdRatio:l0.coerce.number().optional(),thresholdLabel:l0.coerce.string().default(""),tone:B_.optional()}),l0.object({template:l0.literal("stats"),stats:l0.array(l0.object({value:l0.coerce.string(),label:l0.coerce.string(),tone:B_.optional()})).min(1)}),l0.object({template:l0.literal("bars"),items:l0.array(l0.object({value:l0.coerce.string(),label:l0.coerce.string(),ratio:l0.coerce.number(),tone:B_.optional()})).min(1)}),l0.object({template:l0.literal("gauges"),gauges:l0.array(l0.object({label:l0.coerce.string(),value:l0.coerce.string(),status:l0.enum(["good","warn","bad"]).catch("warn"),caption:l0.coerce.string().optional(),ratio:l0.coerce.number().optional()})).min(1)}),l0.object({template:l0.literal("checklist"),checks:l0.array(l0.object({label:l0.coerce.string(),status:l0.enum(["pass","fail","warn"]).catch("fail"),value:l0.coerce.string().optional()})).min(1)}),l0.object({template:l0.literal("table"),columns:l0.array(l0.object({label:l0.coerce.string(),align:l0.enum(["left","right"]).optional()})).min(1),rows:l0.array(cQ6).min(1),highlightRow:l0.coerce.number().optional()}),l0.object({template:l0.literal("products"),products:l0.array(l0.object({name:l0.coerce.string(),price:l0.coerce.string().optional(),image:l0.coerce.string().optional(),url:l0.coerce.string().optional()})).min(1)}),l0.object({template:l0.literal("list"),entries:l0.array(l0.object({label:l0.coerce.string(),severity:l0.enum(["error","warning","notice"]).catch("notice")})).min(1),moreCount:l0.coerce.number().optional()}),l0.object({template:l0.literal("keywords"),volumeLabel:l0.coerce.string().optional(),keywords:l0.array(l0.object({term:l0.coerce.string(),volume:l0.coerce.string(),position:l0.coerce.number().catch(0)})).min(1)}),l0.object({template:l0.literal("competitor"),metricLabel:l0.coerce.string().optional(),competitors:l0.array(l0.object({name:l0.coerce.string(),value:l0.coerce.string(),tone:B_.optional(),isYou:l0.boolean().optional()})).min(1)}),l0.object({template:l0.literal("scorecard"),rivalLabel:l0.coerce.string().optional(),dimensions:l0.array(l0.object({label:l0.coerce.string(),you:l0.coerce.string(),rival:l0.coerce.string().optional(),rivalName:l0.coerce.string().optional(),tone:B_.optional()})).min(1)})]),hy$=l0.object({...lQ6,template:dQ6})});function zP0($){let Z=[],X=[...$.sections].sort((Y,G)=>Y.position-G.position).map((Y)=>{let G=hy$.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 m51=w(()=>{uy$()});import{join as cy$}from"path";async function iQ6($){try{let Z=await fetch(`${lW({})}/api/v2/public/diagnostics/${encodeURIComponent($)}`,{headers:{Accept:"application/json"},signal:AbortSignal.timeout(mQ6)});if(!Z.ok)return null;let X=await Z.json(),{deck:Q}=zP0(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()||d51($),score:Q.meta.scores?.cover??J?.score?.value,verdict:Y?.annotation?.trim()||Y?.headline?.trim()||void 0}}catch{return null}}function XG($){return $.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function nQ6($,Z){let X=_h($),Q=Z?.brand?.trim()||d51(X),Y=yy$(X,128),J=`${(b0().baseUrl??"https://studio.decocms.com").replace(/\/+$/,"")}/report/${encodeURIComponent(X)}`,{title:W,description:K}=gy$({brand:Q,domain:X,score:Z?.score,verdict:Z?.verdict}),H=`${J}/og.png`,F=`${Q} commerce report by decocms`;return[`<title>${XG(W)}</title>`,`<meta name="description" content="${XG(K)}" />`,'<meta name="robots" content="noindex, follow" />','<meta property="og:type" content="website" />','<meta property="og:site_name" content="decocms" />',`<meta property="og:title" content="${XG(W)}" />`,`<meta property="og:description" content="${XG(K)}" />`,`<meta property="og:url" content="${XG(J)}" />`,`<meta property="og:image" content="${XG(H)}" />`,'<meta property="og:image:width" content="1200" />','<meta property="og:image:height" content="630" />',`<meta property="og:image:alt" content="${XG(F)}" />`,'<meta name="twitter:card" content="summary_large_image" />',`<meta name="twitter:title" content="${XG(W)}" />`,`<meta name="twitter:description" content="${XG(K)}" />`,`<meta name="twitter:image" content="${XG(H)}" />`,`<meta name="twitter:image:alt" content="${XG(F)}" />`,`<link rel="canonical" href="${XG(J)}" />`,`<link rel="icon" href="${XG(Y)}" sizes="any" />`].join(`
|
|
2764
|
+
`,j=await Z.createBlob(E);await ax$(Z.owner,Z.repo,j,E);let z=L[0]??`${FP0(Q)}/${C51(B)}.json`;H.push({path:z,mode:"100644",type:"blob",sha:j});let A=z.slice(z.lastIndexOf("/")+1,-5);F.set(z,{stem:A,sha:j,content:E});for(let P of L.slice(1))H.push({path:P,mode:"100644",type:"blob",sha:null}),F.delete(P)}for(let B of $.del)for(let D of y51(K,B))H.push({path:D,mode:"100644",type:"blob",sha:null}),F.delete(D);if(H.length===0)return G;let N=Q?`${Q}/.deco/blocks.gen.json`:".deco/blocks.gen.json";if(W.some((B)=>B.type==="blob"&&B.path===N)){let B=await Promise.all([...F.values()].map(async(j)=>({stem:j.stem,content:j.content??await Z.getBlobText(j.sha)}))),{decofile:D,skipped:L}=vr(B);if(L.length>0)console.warn("decofile gen: dropped blocks that were not valid JSON",{repo:`${Z.owner}/${Z.repo}`,branch:X,packagePath:Q,blocks:L.map((j)=>j.key)});let E=await Z.createBlob(D);H.push({path:N,mode:"100644",type:"blob",sha:E})}let U=await Z.createTree(J,H),O=await Z.createCommit({message:OQ6($),treeSha:U,parentShas:[G]});try{return await Z.updateRef(X,O),O}catch(B){if(!(B instanceof C6&&B.status===422)||Y>=FQ6-1)throw B;await I$(mZ(2000,200,Y,2,0.5))}}}function OQ6($){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 Qd0(Q,$.deps.coAuthor)}var FQ6=3,c51;var Uy$=w(()=>{ZO0();QP0();t4();H_();NP0();c51=new Map});import{createHmac as Oy$,randomBytes as BQ6,timingSafeEqual as wQ6}from"crypto";function By$(){if(LP0)return LP0;let $;try{let Z=b0();$=Z.studioJwtSecret??Z.betterAuthSecret}catch{$=void 0}return LP0=$?Buffer.from($):BQ6(32),LP0}function l51($){let Z=$.nowMs??Date.now(),X={o:$.organizationId,m:$.virtualMcpId,b:$.branch,e:Math.floor((Z+DQ6)/1000)},Q=Buffer.from(JSON.stringify(X)).toString("base64url"),Y=Oy$("sha256",By$()).update(Q).digest("base64url");return`${Q}.${Y}`}function wy$($,Z){let X=$.indexOf(".");if(X<0)return!1;let Q=$.slice(0,X),Y=Buffer.from($.slice(X+1)),G=Buffer.from(Oy$("sha256",By$()).update(Q).digest("base64url"));if(Y.length!==G.length||!wQ6(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 DQ6=21600000,LP0=null;var Dy$=w(()=>{A$()});import{z as Ch}from"zod";function EQ6($){return $.length>0&&$.length<=255&&!$.includes("..")&&!$.endsWith("/")&&!$.endsWith(".lock")&&LQ6.test($)}function Ey$($){return $.req.header("x-forwarded-host")??new URL($.req.url).host}async function EP0($){let Z=$.get("decofileScope");return ZP0($.var.studioContext,Z.organizationId,Z.githubRepo)}function jP0($,Z){if(Z instanceof C6){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 jy$(){let $=new U1;return $.use("/:virtualMcpId/:branch",Ly$),$.use("/:virtualMcpId/:branch/*",Ly$),$.get("/:virtualMcpId/:branch",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await EP0(Z),Y=await sx$(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=l51({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.body(`{"version":${JSON.stringify(Y.sha)},"token":${JSON.stringify(J)},"apiHost":${JSON.stringify(Ey$(Z))},"decofile":${Y.decofile}}`,200,{...G,"content-type":"application/json"})}catch(Q){return jP0(Z,Q)}}),$.patch("/:virtualMcpId/:branch",async(Z)=>{let X=Z.get("decofileScope"),Q=Z.var.studioContext,Y=jQ6.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{XP0(J)}catch(W){let K=W instanceof Error?W.message:String(W);return Z.json({error:K},400)}for(let[J,W]of Object.entries(G.set??{}))if(typeof W!=="object"||W===null||Array.isArray(W))return Z.json({error:`Block "${J}" must be a JSON object`},400);try{let J=await EP0(Z),W=await Ny$(`${X.organizationId}/${X.virtualMcpId}/${X.branch}`,{client:J,branch:X.branch,packagePath:X.packagePath,coAuthor:qh(Q)},G),K=l51({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.json({version:W,token:K,apiHost:Ey$(Z)})}catch(J){return jP0(Z,J)}}),$.post("/:virtualMcpId/:branch/publish",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await EP0(Z),Y=await Q.getDefaultBranch();if(Y===X.branch)return Z.json({error:"Branch is already the default branch"},400);try{let G=await Q.mergeBranch(Y,X.branch,`chore(decofile): publish ${X.branch}`);return G?Z.json({result:"merged",sha:G}):Z.json({result:"up-to-date"})}catch(G){if(G instanceof C6&&G.status===409)return Z.json({error:"merge-conflict"},409);if(G instanceof C6&&G.status===405){let W=await Q.findOpenPullRequest(Y,X.branch)??await Q.createPullRequest({base:Y,head:X.branch,title:`Publish ${X.branch}`});return Z.json({result:"pull-request",number:W.number,url:W.html_url})}throw G}}catch(Q){return jP0(Z,Q)}}),$.get("/:virtualMcpId/:branch/status",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await EP0(Z),Y=await Q.getDefaultBranch();if(Y===X.branch)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0});try{let{aheadBy:G,behindBy:J}=await Q.compare(Y,X.branch);return Z.json({baseBranch:Y,aheadBy:G,behindBy:J})}catch(G){if(G instanceof C6&&G.status===404)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0});throw G}}catch(Q){return jP0(Z,Q)}}),$}var LQ6,jQ6,Ly$;var zy$=w(()=>{QP0();C8();z51();$P0();h51();V51();Uy$();Dy$();H_();NP0();LQ6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;jQ6=Ch.object({set:Ch.record(Ch.string(),Ch.unknown()).optional(),delete:Ch.array(Ch.string()).optional()}).refine(($)=>Object.keys($.set??{}).length>0||($.delete?.length??0)>0,{message:"Patch must set or delete at least one block"}),Ly$=ez0(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(!EQ6(G))return $.json({error:`Invalid branch name: ${G}`},400);let J=X.auth?.user?.id??null;if(!J){let O=$.req.query("token");if(!($.req.method==="GET"&&!$.req.path.match(/\/(publish|status)$/)))return $.json({error:"Unauthorized"},401);if(!O||!wy$(O,{organizationId:Q.id,virtualMcpId:Y,branch:G}))return $.json({error:"Unauthorized"},401)}let W=await X.storage.virtualMcps.findById(Y);if(!W||W.organization_id!==Q.id)return $.json({error:"Virtual MCP not found"},404);let K=W.metadata??null;if(!UB0(K)||K?.fastPreview!==!0)return $.json({error:"Fast Preview is not enabled for this project"},404);let F=W.connections?.map((O)=>O.connection_id)??[],N=gr(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 Py$=($)=>{let Z=new U1;if(Z.use("*",Z_),Z.route("/",Dz0()),Z.route("/",i_$()),Z.route("/",ib$()),Z.route("/",lb$()),Z.route("/",rz0()),Z.route("/tools",sb$()),Z.route("/",ob$()),Z.route("/",Rb$({kvStorage:$.kvStorage})),Z.route("/",Ab$()),Z.route("/fs",bb$({getConnection:$.getNatsConnection})),Z.route("/sandbox",Hy$()),Z.route("/decofile",jy$()),Z.route("/",hb$()),Z.route("/deco-sites",Ez0()),Z.route("/sso",Fz0()),Z.route("/",az0({tokenStorage:$.tokenStorage,automationEventDispatcher:$.automationEventDispatcher})),Z.route("/webhooks",y_$()),$.mountDevAssets)Z.route("/dev-assets",jz0({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("/",PV$()),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",yb$()),Z.route("/mcp",qw0()),Z.route("/mcp/self",oz0()),Z.route("/mcp",Sw0()),Z.all("/oauth-proxy/:connectionId/*",$.oauthProxyHandler),Z.get("/watch",$.watchHandler),Z};var Ay$=w(()=>{C8();l41();g_$();n41();zz0();Gr();u41();Tb$();Ib$();xb$();wp();_41();Vw0();O51();gb$();ub$();db$();nb$();rb$();w51();eb$();D51();Mw0();Fy$();zy$()});function zQ6($){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 PQ6=async($,Z)=>{if(!$.get("studioContext").auth.user?.id)return $.json({error:"Unauthorized"},401);return Z()},Ty$=()=>{let $=new U1;return $.use("*",PQ6),$.get("/",async(Z)=>{let X=b0(),Q=X.decoSupabaseUrl,Y=X.decoSupabaseServiceKey;if(!Q||!Y)return Z.json({apps:[]});try{let G=await uZ(Q,Y,"apps?select=name,title,description,logo,category,vendors(alias,url)");return Z.json({apps:zQ6(G)})}catch(G){return console.error("[deco-apps] GET error:",G),Z.json({error:"Failed to fetch apps"},502)}}),$};var Ry$=w(()=>{C8();A$();jj0()});import{z as M1}from"zod";function tK($,Z="invalid_request_error",X=null,Q=null){return{error:{message:$,type:Z,param:X,code:Q}}}function CQ6($){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 _Q6($,Z,X){try{return JSON.parse($)}catch{throw new My$(`Invalid JSON in tool call arguments for function '${X}' (tool_call_id: ${Z}): ${$}`)}}function vQ6($){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:_Q6(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 fQ6($){let Z=$.map((X)=>{let Q=X.function.parameters?vY(X.function.parameters):vY({type:"object",properties:{}});return[X.function.name,f$({description:X.function.description,inputSchema:Q})]});return Object.fromEntries(Z)}function bQ6($){if(!$)return;return{openai:{response_format:$}}}function xQ6(){return`chatcmpl-${crypto.randomUUID().replace(/-/g,"").substring(0,29)}`}function Iy$($,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 qy$($){if($==="tool-calls")return"tool_calls";if($==="length")return"length";return"stop"}var AQ6=256,TQ6,RQ6,IQ6,qQ6,MQ6,kQ6,SQ6,VQ6,My$,ky$,Sy$;var Vy$=w(()=>{C4();C8();Ih();pF();TQ6=M1.object({type:M1.literal("function"),function:M1.object({name:M1.string(),description:M1.string().optional(),parameters:M1.record(M1.string(),M1.unknown()).optional()})}),RQ6=M1.object({id:M1.string(),type:M1.literal("function"),function:M1.object({name:M1.string(),arguments:M1.string()})}),IQ6=M1.discriminatedUnion("role",[M1.object({role:M1.literal("system"),content:M1.string(),name:M1.string().optional()}),M1.object({role:M1.literal("user"),content:M1.union([M1.string(),M1.array(M1.union([M1.object({type:M1.literal("text"),text:M1.string()}),M1.object({type:M1.literal("image_url"),image_url:M1.object({url:M1.string(),detail:M1.string().optional()})})]))]),name:M1.string().optional()}),M1.object({role:M1.literal("assistant"),content:M1.string().nullable().optional(),name:M1.string().optional(),tool_calls:M1.array(RQ6).optional()}),M1.object({role:M1.literal("tool"),content:M1.string(),tool_call_id:M1.string()})]),qQ6=M1.object({type:M1.literal("text")}),MQ6=M1.object({type:M1.literal("json_object")}),kQ6=M1.object({type:M1.literal("json_schema"),json_schema:M1.object({name:M1.string(),description:M1.string().optional(),schema:M1.record(M1.string(),M1.unknown()),strict:M1.boolean().optional()})}),SQ6=M1.union([qQ6,MQ6,kQ6]),VQ6=M1.object({model:M1.string().describe("Format: 'model_id' or 'credential_id:model_id'"),messages:M1.array(IQ6),stream:M1.boolean().optional().default(!1),temperature:M1.number().min(0).max(2).optional(),max_tokens:M1.number().positive().optional(),top_p:M1.number().min(0).max(1).optional(),frequency_penalty:M1.number().min(-2).max(2).optional(),presence_penalty:M1.number().min(-2).max(2).optional(),stop:M1.union([M1.string(),M1.array(M1.string())]).optional(),tools:M1.array(TQ6).optional(),tool_choice:M1.union([M1.literal("auto"),M1.literal("none"),M1.literal("required"),M1.object({type:M1.literal("function"),function:M1.object({name:M1.string()})})]).optional(),response_format:SQ6.optional(),user:M1.string().optional()});My$=class My$ extends Error{constructor($){super($);this.name="MessageConversionError"}};ky$=new U1;ky$.post("/:org/v1/chat/completions",async($)=>{let Z=$.get("studioContext"),X=$.req.param("org");try{if(!Z.auth.apiKey?.id)return $.json(tK("API key authentication required. Provide a valid API key via Authorization header.","authentication_error"),401);if(!Z.organization)return $.json(tK("Organization context is required. Ensure your API key has organization metadata.","invalid_request_error","organization"),400);if((Z.organization.slug??Z.organization.id)!==X)return $.json(tK("Organization mismatch. The API key's organization does not match the requested organization.","invalid_request_error","organization"),403);let Q=await $.req.json(),Y=VQ6.safeParse(Q);if(!Y.success){let L=Y.error.issues[0]??{message:"Invalid request",path:[]};return $.json(tK(`Invalid request: ${L.message}`,"invalid_request_error",L.path.length>0?L.path.join("."):null),400)}let G=Y.data,J=CQ6(G.model);if(!J)return $.json(tK("Invalid model format. Expected 'model_id' or 'credential_id:model_id' (e.g., 'claude-sonnet-4-6' or 'key_abc123:claude-sonnet-4-6')","invalid_request_error","model"),400);let{credentialId:W}=J,{modelId:K}=J;if(!W){let E=(await Z.storage.aiProviderKeys.list({organizationId:Z.organization.id})).find((j)=>LD(j.providerId));if(!E)return $.json(tK("No AI provider credentials configured for this organization. Add a credential in settings or specify one explicitly via 'credential_id:model_id'.","invalid_request_error","model"),400);W=E.id}let H;try{H=await Z.aiProviders.activate(W,Z.organization.id)}catch{return $.json(tK(`AI provider credential not found or inaccessible: ${W}`,"invalid_request_error","model"),404)}let F=H.aiSdk.languageModel(K),N=vQ6(G.messages),U=G.tools?fQ6(G.tools):void 0,O=bQ6(G.response_format),B=xQ6(),D=Math.floor(Date.now()/1000);if(G.stream)return ON($,async(L)=>{let E=Iy$(F,N,U,G,O,$.req.raw.signal);try{let j=fO(E),z=!1,A=0,P="",q=async()=>{if(P.length===0)return;let M=P;P="",await L.writeSSE({data:JSON.stringify({id:B,object:"chat.completion.chunk",created:D,model:G.model,choices:[{index:0,delta:{content:M},finish_reason:null}]})})};for await(let M of j.fullStream){if(!z&&(M.type==="text-delta"||M.type==="tool-call"))await L.writeSSE({data:JSON.stringify({id:B,object:"chat.completion.chunk",created:D,model:G.model,choices:[{index:0,delta:{role:"assistant",content:""},finish_reason:null}]})}),z=!0;if(M.type==="text-delta"){if(P+=M.text,P.length>=AQ6)await q()}else if(M.type==="tool-call"){await q();let k=A++;await L.writeSSE({data:JSON.stringify({id:B,object:"chat.completion.chunk",created:D,model:G.model,choices:[{index:0,delta:{tool_calls:[{index:k,id:M.toolCallId,type:"function",function:{name:M.toolName,arguments:JSON.stringify(M.input)}}]},finish_reason:null}]})})}else if(M.type==="finish")await q(),await L.writeSSE({data:JSON.stringify({id:B,object:"chat.completion.chunk",created:D,model:G.model,choices:[{index:0,delta:{},finish_reason:qy$(M.finishReason)}],usage:M.totalUsage?{prompt_tokens:M.totalUsage.inputTokens??0,completion_tokens:M.totalUsage.outputTokens??0,total_tokens:M.totalUsage.totalTokens??0}:void 0})})}await q(),await L.writeSSE({data:"[DONE]"})}catch(j){let z=j;console.error("[openai-compat:stream] Error:",z.message),await L.writeSSE({data:JSON.stringify({error:{message:z.message,type:"server_error"}})})}});else{let L=Iy$(F,N,U,G,O,$.req.raw.signal),E=await _O(L),j={role:"assistant",content:E.text||null};if(E.toolCalls&&E.toolCalls.length>0)j.tool_calls=E.toolCalls.map((z)=>({id:z.toolCallId,type:"function",function:{name:z.toolName,arguments:JSON.stringify("input"in z?z.input:{})}})),j.content=null;return $.json({id:B,object:"chat.completion",created:D,model:G.model,choices:[{index:0,message:j,finish_reason:qy$(E.finishReason)}],usage:{prompt_tokens:E.usage?.inputTokens??0,completion_tokens:E.usage?.outputTokens??0,total_tokens:E.usage?.totalTokens??0}})}}catch(Q){let Y=Q;if(Y.name==="AbortError")return $.json(tK("Request aborted","invalid_request_error"),400);if(Y.name==="MessageConversionError")return $.json(tK(Y.message,"invalid_request_error","messages"),400);return console.error("[openai-compat] Error:",Y.message,Y.stack),$.json(tK(Y.message,"server_error"),500)}});Sy$=ky$});var _y$;var Cy$=w(()=>{_y$={name:"decocms",version:"4.230.8",description:"Deco CMS \u2014 Self-hostable MCP Gateway for managing AI connections and tools",author:"Deco team",repository:{type:"git",url:"git+https://github.com/decocms/studio.git",directory:"apps/api"},bugs:{url:"https://github.com/decocms/studio/issues"},type:"module",bin:{deco:"./dist/server/cli.js"},files:["dist/**/*"],scripts:{dev:"bun run migrate && bun run dev:server","dev:server":"bun run --cwd=../../packages/sandbox build && NODE_ENV=development bun --env-file=.env --hot run src/index.ts",build:"bun run build:server","build:server":"bun run scripts/bundle-server-script.ts --dist ./dist/server","generate:tool-contracts":"bun run scripts/generate-tool-contracts.ts","db:migrate":"bun run ./dist/server/migrate.js","db:migrate:dbos":"bun run ./dist/server/migrate-dbos.js",check:"tsc --noEmit",start:"bun run ./dist/server/server.js",migrate:"bun run src/database/migrate.ts","migrate:dbos":"bun run src/database/migrate-dbos.ts",test:"bun test src","better-auth:migrate":"bunx --bun @better-auth/cli migrate -y --config src/auth/index.ts",prepublishOnly:"bun run --cwd=../.. build:studio"},optionalDependencies:{"@duckdb/node-api":"^1.5.0-r.1"},dependencies:{"@ai-sdk/anthropic":"^3.0.85","@ai-sdk/google":"^3.0.83","@ai-sdk/openai":"^3.0.73","@anthropic-ai/sdk":"^0.105.0","@aws-sdk/client-s3":"^3.1013.0","@aws-sdk/client-sts":"^3.1013.0","@aws-sdk/lib-storage":"^3.1013.0","@aws-sdk/s3-request-presigner":"^3.1013.0","@clickhouse/client":"^1.8.1","@dbos-inc/dbos-sdk":"^4.21.6","@inkjs/ui":"^2.0.0","@nats-io/jetstream":"3.4.0","@nats-io/kv":"3.4.0","@nats-io/nats-core":"3.4.0","@nats-io/transport-node":"3.4.0","@openrouter/ai-sdk-provider":"^2.9.1","@opentelemetry/core":"^2.6.0","embedded-postgres":"^18.3.0-beta.16",ink:"^6.8.0",kysely:"^0.28.12","posthog-node":"^5.0.0",react:"^19.2.6","react-dom":"^19.2.6"},devDependencies:{"@ai-sdk/provider":"^3.0.10","@better-auth/sso":"1.4.1","@decocms/better-auth":"1.5.17","@decocms/bindings":"workspace:*","@decocms/mcp-utils":"workspace:*","@decocms/runtime":"workspace:*","@decocms/sandbox":"workspace:*","@decocms/shared":"workspace:*","@jitl/quickjs-wasmfile-release-sync":"0.31.0","@modelcontextprotocol/sdk":"1.29.0","@nats-io/jwt":"0.0.10-5","@opentelemetry/api":"^1.9.0","@opentelemetry/api-logs":"^0.211.0","@opentelemetry/exporter-logs-otlp-proto":"^0.211.0","@opentelemetry/exporter-prometheus":"^0.208.0","@opentelemetry/exporter-trace-otlp-proto":"^0.207.0","@opentelemetry/instrumentation-runtime-node":"^0.24.0","@opentelemetry/resources":"^2.6.0","@opentelemetry/sdk-logs":"^0.211.0","@opentelemetry/sdk-metrics":"^2.2.0","@opentelemetry/sdk-node":"^0.207.0","@opentelemetry/sdk-trace-base":"^2.5.0","@types/bun":"^1.3.1","@types/google.maps":"^3.65.2","@types/pg":"^8.15.6","@types/react-syntax-highlighter":"^15.5.13","@vercel/nft":"^1.1.1",ai:"^6.0.208","better-auth":"1.4.22",croner:"^9.1.0",degit:"^2.8.4",hono:"^4.10.7",jose:"^6.0.11",nanoid:"^5.1.6",pg:"^8.16.3",typescript:"^7.0.2",typescript5:"npm:typescript@^5.9.3",zod:"4.3.6"},homepage:"https://github.com/decocms/studio",keywords:["mcp","model-context-protocol","ai","gateway","self-hosted","tools"],license:"MIT",publishConfig:{access:"public"}}});function hQ6(){let $=process.env.POSTHOG_KEY;if(!$)return null;return{key:$,host:process.env.POSTHOG_HOST??gQ6}}var vy$,gQ6="https://ph.studio.decocms.com",fy$;var by$=w(()=>{C8();yg0();mV();r9();A$();M41();Cy$();vy$=new U1;vy$.get("/",($)=>{let Z={version:_y$.version,theme:gl1(),...WL().logo&&{logo:WL().logo},...LK()&&{internalUrl:BS1()},...b0().enableDecoImport&&{enableDecoImport:!0},brandExtractEnabled:!!b0().firecrawlApiKey,auth:$_$(),posthog:hQ6(),googleMapsApiKey:process.env.GOOGLE_MAPS_API_KEY?.trim()||null,runtime:{agentSandbox:!LK()&&b0().sandboxProviderKind==="agent-sandbox"}};return $.header("Cache-Control","no-store"),$.json({success:!0,config:Z})});fy$=vy$});function _h($){let Z=($??"").trim().toLowerCase();return Z=Z.replace(/^https?:\/\//,""),Z=Z.replace(/^www\./,""),Z=Z.split(/[/?#]/)[0]??"",Z.replace(/\/+$/,"")}function d51($){return(_h($).split(".")[0]||$).replace(/[-_]/g," ").split(" ").filter(Boolean).map((X)=>X.charAt(0).toUpperCase()+X.slice(1)).join(" ")}function yy$($,Z=64){return`https://www.google.com/s2/favicons?domain=${encodeURIComponent(_h($))}&sz=${Z}`}function xy$($,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 gy$($){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()?xy$(`${Y.trim().replace(/\s+/g," ")} \u2014 ${J}`,200):xy$(`How does ${X} really perform? ${J}`,200);return{title:G,description:W}}import{z as l0}from"zod";var B_,uQ6,cQ6,lQ6,dQ6,hy$;var uy$=w(()=>{B_=l0.enum(["good","bad","neutral"]),uQ6=l0.preprocess(($)=>{if(Array.isArray($))return{kind:"text",value:$.find((X)=>X!==null&&typeof X!=="object")??""};return $!==null&&typeof $==="object"?$:{kind:"text",value:$}},l0.object({kind:l0.enum(["text","number","sparkline","badge","score"]).catch("text"),value:l0.coerce.string().optional(),tone:B_.optional(),muted:l0.boolean().optional(),delta:l0.coerce.string().optional(),deltaDir:l0.enum(["up","down","neutral"]).optional(),points:l0.array(l0.coerce.number()).optional(),label:l0.coerce.string().optional()}).transform(($)=>{if($.kind==="badge"&&$.label==null)$.label=$.value??"";if($.kind==="score"){let Z=Number($.value);if(Number.isNaN(Z))return{...$,kind:"text"}}return $})),cQ6=l0.preprocess(($)=>{let Z=$;if(Z&&typeof Z==="object"&&!Array.isArray(Z)&&Array.isArray(Z.cells))Z=Z.cells;if(Array.isArray(Z)&&Z.length===1&&Array.isArray(Z[0]))Z=Z[0];if(Array.isArray(Z))return Z;if(Z&&typeof Z==="object")return Object.values(Z);return Z},l0.array(uQ6)),lQ6={key:l0.coerce.string(),title:l0.coerce.string(),eyebrow:l0.coerce.string().optional(),headline:l0.coerce.string(),annotation:l0.coerce.string().optional(),methodology:l0.coerce.string().optional(),sources:l0.array(l0.object({name:l0.coerce.string(),logoUrl:l0.coerce.string()})).optional()},dQ6=l0.discriminatedUnion("template",[l0.object({template:l0.literal("cover"),score:l0.object({value:l0.coerce.number(),max:l0.coerce.number().optional(),grade:l0.coerce.string().optional(),label:l0.coerce.string().optional()}).optional(),brandImage:l0.coerce.string().optional(),screenshot:l0.coerce.string().optional(),mobileScreenshot:l0.coerce.string().optional()}),l0.object({template:l0.literal("cta"),ctaUrl:l0.coerce.string().optional(),ctaLabel:l0.coerce.string().optional(),bullets:l0.array(l0.coerce.string()).optional()}),l0.object({template:l0.literal("series"),points:l0.array(l0.coerce.number()).min(2),xLabels:l0.array(l0.coerce.string()).min(1),unit:l0.coerce.string().optional(),callout:l0.object({index:l0.coerce.number(),value:l0.coerce.string(),tone:B_.optional()})}),l0.object({template:l0.literal("threshold"),value:l0.coerce.string().default(""),metricLabel:l0.coerce.string().optional(),ratio:l0.coerce.number(),thresholdRatio:l0.coerce.number().optional(),thresholdLabel:l0.coerce.string().default(""),tone:B_.optional()}),l0.object({template:l0.literal("stats"),stats:l0.array(l0.object({value:l0.coerce.string(),label:l0.coerce.string(),tone:B_.optional()})).min(1)}),l0.object({template:l0.literal("bars"),items:l0.array(l0.object({value:l0.coerce.string(),label:l0.coerce.string(),ratio:l0.coerce.number(),tone:B_.optional()})).min(1)}),l0.object({template:l0.literal("gauges"),gauges:l0.array(l0.object({label:l0.coerce.string(),value:l0.coerce.string(),status:l0.enum(["good","warn","bad"]).catch("warn"),caption:l0.coerce.string().optional(),ratio:l0.coerce.number().optional()})).min(1)}),l0.object({template:l0.literal("checklist"),checks:l0.array(l0.object({label:l0.coerce.string(),status:l0.enum(["pass","fail","warn"]).catch("fail"),value:l0.coerce.string().optional()})).min(1)}),l0.object({template:l0.literal("table"),columns:l0.array(l0.object({label:l0.coerce.string(),align:l0.enum(["left","right"]).optional()})).min(1),rows:l0.array(cQ6).min(1),highlightRow:l0.coerce.number().optional()}),l0.object({template:l0.literal("products"),products:l0.array(l0.object({name:l0.coerce.string(),price:l0.coerce.string().optional(),image:l0.coerce.string().optional(),url:l0.coerce.string().optional()})).min(1)}),l0.object({template:l0.literal("list"),entries:l0.array(l0.object({label:l0.coerce.string(),severity:l0.enum(["error","warning","notice"]).catch("notice")})).min(1),moreCount:l0.coerce.number().optional()}),l0.object({template:l0.literal("keywords"),volumeLabel:l0.coerce.string().optional(),keywords:l0.array(l0.object({term:l0.coerce.string(),volume:l0.coerce.string(),position:l0.coerce.number().catch(0)})).min(1)}),l0.object({template:l0.literal("competitor"),metricLabel:l0.coerce.string().optional(),competitors:l0.array(l0.object({name:l0.coerce.string(),value:l0.coerce.string(),tone:B_.optional(),isYou:l0.boolean().optional()})).min(1)}),l0.object({template:l0.literal("scorecard"),rivalLabel:l0.coerce.string().optional(),dimensions:l0.array(l0.object({label:l0.coerce.string(),you:l0.coerce.string(),rival:l0.coerce.string().optional(),rivalName:l0.coerce.string().optional(),tone:B_.optional()})).min(1)})]),hy$=l0.object({...lQ6,template:dQ6})});function zP0($){let Z=[],X=[...$.sections].sort((Y,G)=>Y.position-G.position).map((Y)=>{let G=hy$.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 m51=w(()=>{uy$()});import{join as cy$}from"path";async function iQ6($){try{let Z=await fetch(`${lW({})}/api/v2/public/diagnostics/${encodeURIComponent($)}`,{headers:{Accept:"application/json"},signal:AbortSignal.timeout(mQ6)});if(!Z.ok)return null;let X=await Z.json(),{deck:Q}=zP0(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()||d51($),score:Q.meta.scores?.cover??J?.score?.value,verdict:Y?.annotation?.trim()||Y?.headline?.trim()||void 0}}catch{return null}}function XG($){return $.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function nQ6($,Z){let X=_h($),Q=Z?.brand?.trim()||d51(X),Y=yy$(X,128),J=`${(b0().baseUrl??"https://studio.decocms.com").replace(/\/+$/,"")}/report/${encodeURIComponent(X)}`,{title:W,description:K}=gy$({brand:Q,domain:X,score:Z?.score,verdict:Z?.verdict}),H=`${J}/og.png`,F=`${Q} commerce report by decocms`;return[`<title>${XG(W)}</title>`,`<meta name="description" content="${XG(K)}" />`,'<meta name="robots" content="noindex, follow" />','<meta property="og:type" content="website" />','<meta property="og:site_name" content="decocms" />',`<meta property="og:title" content="${XG(W)}" />`,`<meta property="og:description" content="${XG(K)}" />`,`<meta property="og:url" content="${XG(J)}" />`,`<meta property="og:image" content="${XG(H)}" />`,'<meta property="og:image:width" content="1200" />','<meta property="og:image:height" content="630" />',`<meta property="og:image:alt" content="${XG(F)}" />`,'<meta name="twitter:card" content="summary_large_image" />',`<meta name="twitter:title" content="${XG(W)}" />`,`<meta name="twitter:description" content="${XG(K)}" />`,`<meta name="twitter:image" content="${XG(H)}" />`,`<meta name="twitter:image:alt" content="${XG(F)}" />`,`<link rel="canonical" href="${XG(J)}" />`,`<link rel="icon" href="${XG(Y)}" sizes="any" />`].join(`
|
|
2765
2765
|
`)}function pQ6($,Z){return $.replace(/<title>[\s\S]*?<\/title>\s*/i,"").replace(/<meta\s+name="(?:description|twitter:[^"]*)"[^>]*>\s*/gi,"").replace(/<meta\s+property="og:[^"]*"[^>]*>\s*/gi,"").replace(/<link\s+rel="icon"[^>]*>\s*/gi,"").replace("</head>",` ${Z}
|
|
2766
2766
|
</head>`)}function ly$($){let Z=new U1;return Z.get("/:domain/og.png",async(X)=>{let Q=_h(X.req.param("domain")),Y=async()=>{let G=$?Bun.file(cy$($,"report-og-fallback.png")):null;if(!G||!await G.exists())return X.notFound();return X.body(new Uint8Array(await G.arrayBuffer()),200,{"Content-Type":"image/png","Cache-Control":"public, max-age=0, s-maxage=3600"})};try{let G=await fetch(`${lW({})}/api/v2/public/diagnostics/${encodeURIComponent(Q)}/og.png`,{signal:AbortSignal.timeout(tQ6)}),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=$?cy$($,"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 iQ6(_h(Q)),K=nQ6(Q,W);return X.html(pQ6(J,K),200,{"Cache-Control":"public, max-age=0, s-maxage=300"})}catch{return X.html(J)}}),Z}var mQ6=2500,tQ6=1e4;var dy$=w(()=>{C8();m51();PL();A$()});function ur($,Z){return fetch(`${lW({})}${$}`,Z)}async function oQ6($,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 ur(`/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}=zP0(J);return{status:W.slides.length?"ready":"empty",deck:W,scanned_at:J.scanned_at,drops:K}}var rQ6,wN,my$=async($,Z)=>{if(!$.get("reportUser"))return $.json({error:"Authentication required"},401);await Z();return},iy$;var ny$=w(()=>{C8();xG();PL();m51();rQ6=new Set(["complete","errored","terminated","unknown"]),wN=new U1;wN.use("*",async($,Z)=>{let X=await j8.api.getSession({headers:$.req.raw.headers});$.set("reportUser",X?.user?.id?{email:X.user.email}:void 0),await Z(),$.header("Cache-Control","private, no-store"),$.header("Vary","Cookie");return});wN.use("/link-token/*",my$);wN.use("/suggest",my$);wN.get("/site/:domain",async($)=>{let Z=$.req.param("domain").trim();if(!Z)return $.json({error:"domain is required"},400);let X=$.get("reportUser"),Q=$.req.query("key")?.trim()||void 0,Y=$.req.query("lang")?.trim()||void 0;try{let G=await oQ6(Z,Q,Y);if($.header("Cache-Control","private, no-store"),X||!G.deck)return $.json(G);return $.json({...G,deck:{...G.deck,slides:G.deck.slides.slice(0,1)},truncated:G.status==="ready"})}catch{return $.json({error:"report read failed"},502)}});wN.post("/run",async($)=>{let Z=$.get("reportUser"),X;try{X=await $.req.json()}catch{return $.json({error:"invalid JSON"},400)}let Q=typeof X.domain==="string"?X.domain.trim():"";if(!Q)return $.json({error:"domain is required"},400);let Y=Z?.email,G=typeof X.distinctId==="string"&&X.distinctId.trim()&&X.distinctId.length<=200?X.distinctId.trim():void 0;try{let J=await ur("/api/v2/diagnostics/run",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${zL({})}`},body:JSON.stringify({url:Q,...Y?{email:Y}:{},distinct_id:G})});if(!J.ok)return $.json({error:`run HTTP ${J.status}`},502);let W=await J.json(),K=W.blocked?{state:"blocked"}:W.status==="fresh"?{state:"fresh"}:W.mode==="sync"?{state:"sync"}:{state:"running",id:W.id??null};return $.json(K)}catch{return $.json({error:"run failed"},502)}});wN.get("/status",async($)=>{let Z=$.req.query("id");if(!Z)return $.json({error:"id is required"},400);try{let X=await ur(`/api/v2/diagnostics/status?id=${encodeURIComponent(Z)}`,{headers:{Authorization:`Bearer ${zL({})}`}});if(!X.ok)return $.json({error:`status HTTP ${X.status}`},502);let Y=(await X.json()).status??"unknown",G={done:rQ6.has(Y),status:Y};return $.json(G)}catch{return $.json({error:"status failed"},502)}});wN.get("/link-token/:id",async($)=>{let Z=$.req.param("id");try{let X=await ur(`/api/v2/public/link-tokens/${encodeURIComponent(Z)}`,{headers:{Accept:"application/json"}});if(X.status===404)return $.json(null);if(!X.ok)return $.json({error:`link token HTTP ${X.status}`},502);return $.json(await X.json())}catch{return $.json({error:"link token resolve failed"},502)}});wN.get("/suggest",async($)=>{let Z=($.req.query("q")??"").trim().slice(0,64);if(Z.length<2)return $.json({suggestions:[]});try{let X=await ur(`/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:[]})}});iy$=wN});import{createHmac as aQ6,timingSafeEqual as sQ6}from"crypto";function ty$($,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)>eQ6)return!1;let W=aQ6("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&&sQ6(K,F)})}function oy$($){let Z;try{Z=JSON.parse($)}catch{return null}let X=LJ(Z),Q=LJ(LJ(X?.data)?.object);if(!X||typeof X.type!=="string"||!Q)return null;return{id:oK(X.id),type:X.type,created:typeof X.created==="number"?X.created:void 0,livemode:typeof X.livemode==="boolean"?X.livemode:void 0,data:{object:Q}}}function ry$($){switch($){case"active":case"trialing":return"active";case"past_due":return"past_due";default:return"canceled"}}function oK($){return typeof $==="string"?$:void 0}function LJ($){return typeof $==="object"&&$!==null?$:void 0}function PP0($){return typeof $==="number"?new Date($*1000):null}function p51($){return oK($)??oK(LJ($)?.id)}function $Y6($){return p51($.subscription)??oK(LJ(LJ($.parent)?.subscription_details)?.subscription)}function ZY6($){let Z=PP0($.current_period_end);if(Z)return Z;let X=LJ($.items)?.data;if(!Array.isArray(X))return null;let Q=0;for(let Y of X){let G=LJ(Y)?.current_period_end;if(typeof G==="number"&&G>Q)Q=G}return Q>0?new Date(Q*1000):null}function i51($,Z){let X=PP0($.created);return!!X&&!!Z.lastStripeEventAt&&X<Z.lastStripeEventAt}function n51($,Z){let X=PP0($.created);if(!X)return;return Z.lastStripeEventAt&&Z.lastStripeEventAt>X?void 0:X}async function XY6($,Z){let X=Z.data.object;switch(Z.type){case"checkout.session.completed":case"checkout.session.async_payment_succeeded":{let Q=oK(LJ(X.metadata)?.orgId);if(!Q)return{handled:!1,reason:"no orgId"};if(oK(LJ(X.metadata)?.kind)==="topup"){if(X.mode!=="payment")return{handled:!1,reason:"topup with wrong mode"};if(oK(X.payment_status)!=="paid")return{handled:!1,reason:"payment not confirmed"};let J=oK(X.id);if(!J)return console.error("stripe webhook: topup session without id",{eventId:Z.id,organizationId:Q}),{handled:!1,reason:"topup session without id"};let W=Number(LJ(X.metadata)?.creditCents);if(!Number.isInteger(W)||W<=0)return console.error("stripe webhook: paid topup with bad metadata \u2014 credit NOT applied",{eventId:Z.id,organizationId:Q,creditCents:LJ(X.metadata)?.creditCents}),{handled:!1,reason:"bad topup metadata"};return{handled:!0,organizationId:Q,topUp:{creditCents:W,referenceId:`stripe-topup:${J}`}}}if(X.mode!=="subscription")return{handled:!1,reason:"not a subscription checkout"};if(oK(X.payment_status)!=="paid")return{handled:!1,reason:"payment not confirmed"};let Y=await $.getBilling(Q);if(!Y)return{handled:!1,reason:"unknown org"};let G=p51(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(i51(Z,Y))return{handled:!1,reason:"stale event"};return await $.updateStripeState(Q,{stripeCustomerId:p51(X.customer),stripeSubscriptionId:G,status:"active",lastStripeEventAt:n51(Z,Y)}),{handled:!0,organizationId:Q}}case"customer.subscription.updated":case"customer.subscription.deleted":{let Q=oK(X.id);if(!Q)return{handled:!1,reason:"no sub id"};let Y=await $.getBillingByStripeSubscriptionId(Q);if(!Y)return{handled:!1,reason:"unknown subscription"};let G=Z.type==="customer.subscription.deleted";if(!G&&i51(Z,Y))return{handled:!1,reason:"stale event"};let J=G?"canceled":ry$(X.status);return await $.updateStripeState(Y.organizationId,{status:J,currentPeriodEnd:ZY6(X),...G&&{stripeSubscriptionId:null},lastStripeEventAt:n51(Z,Y)}),{handled:!0,organizationId:Y.organizationId}}case"invoice.paid":{let Q=$Y6(X);if(!Q)return{handled:!1,reason:"no sub id"};let Y=await $.getBillingByStripeSubscriptionId(Q);if(!Y)return{handled:!1,reason:"unknown subscription"};if(i51(Z,Y))return{handled:!1,reason:"stale event"};return await $.updateStripeState(Y.organizationId,{status:"active",currentPeriodEnd:PP0(X.period_end),lastStripeEventAt:n51(Z,Y)}),{handled:!0,organizationId:Y.organizationId}}default:return{handled:!1,reason:`unhandled event ${Z.type}`}}}function QY6($,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:ry$(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 py$($,Z){let X=QY6($,Z);if(!X)return;RY({event:X.name,organizationId:X.organizationId,...$.id?{uuid:nm1(`stripe:${$.id}:${X.name}`)}:{},...$.created?{timestamp:new Date($.created*1000)}:{},properties:X.properties})}async function ay$($){let Z=new gW(m8().db),X=await XY6(Z,$);if(!(X.handled&&X.topUp))py$($,X);if(X.handled&&X.topUp)await FB$({organizationId:X.organizationId,amountCents:X.topUp.creditCents,referenceId:X.topUp.referenceId}),py$($,X);if(!X.handled&&X.orphanSubscriptionId)try{await Ga1(X.orphanSubscriptionId),console.error("stripe webhook: canceled orphan subscription",{subscriptionId:X.orphanSubscriptionId,eventId:$.id})}catch(Q){if(!(Q instanceof VY&&(Q.status===400||Q.status===404)))throw Q}return X}var eQ6=300;var sy$=w(()=>{CG();q4();l40();VL();Gs0()});var YY6=1048576,t51;var ey$=w(()=>{C8();Xw();A$();sy$();t51=new U1;t51.post("/webhook",wZ({maxSize:YY6,onError:($)=>$.json({error:"payload too large"},413)}),async($)=>{let Z=b0().stripeWebhookSecret;if(!Z)return $.json({error:"stripe billing not configured"},503);let X=await $.req.text();if(!ty$(X,$.req.header("stripe-signature"),Z))return $.json({error:"invalid signature"},400);let Y=oy$(X);if(!Y)return $.json({error:"invalid payload"},400);let G=await ay$(Y);return console.log("stripe webhook",{eventId:Y.id,type:Y.type,livemode:Y.livemode,...G}),$.json({received:!0})})});import{timingSafeEqual as GY6}from"crypto";function WY6($,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 GY6(Buffer.from(Y),Buffer.from(Q))}var JY6=5242880,o51;var $g$=w(()=>{C8();Xw();On();o51=new U1;o51.post("/webhook",wZ({maxSize:JY6,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(!WY6(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 qi0())?.markTenantPoolsDirty(G,Y)??[];return $.json({ok:!0,pools:W})})});function Zg$($,Z){if(Z.startsWith("text/html")||Z.startsWith("image/svg"))$.set("Content-Security-Policy","sandbox allow-scripts allow-modals allow-same-origin")}var Xg$,KY6,HY6,Qg$;var Yg$=w(()=>{C8();Y3();Qy();Zx();Xg$=new U1,KY6=["range","if-none-match","if-modified-since"],HY6=["content-type","content-length","content-range","accept-ranges","etag","last-modified"];Xg$.get("/:org/files/*",async($)=>{let Z=$.get("studioContext"),X=Z.organization?.id;if(!Z.auth?.user?.id){if(Wh($))return $.redirect(`/login?next=${encodeURIComponent($.req.path)}`,302);throw new $$(401,{message:"Authentication required"})}if(!X)throw new $$(401,{message:"Organization context required"});let Q=$.req.path.replace(/^.*\/files\//,"");if(!Q)throw new $$(400,{message:"Missing file key"});let Y=await dn(Q,Z);if(!Y)throw new $$(503,{message:"Object storage not configured"});if(Y.startsWith("data:")&&H3()){let K=Y.match(/^data:([^;]+);base64,(.+)$/s);if(!K)throw new $$(500,{message:"Invalid data URL from storage"});let[,H,F]=K,N=Buffer.from(F,"base64"),U=new Headers({"Content-Type":H,"Cache-Control":"private, max-age=86400"});return Zg$(U,H),new Response(N,{status:200,headers:U})}let G=new Headers;for(let K of KY6){let H=$.req.header(K);if(H)G.set(K,H)}let J=await fetch(Y,{headers:G});if(J.status===403||J.status===404)throw new $$(404,{message:"File not found"});if(!J.ok&&J.status!==304&&J.status!==416)throw console.error(`[files] upstream storage error ${J.status} for key:`,Q),new $$(502,{message:"Upstream storage error"});let W=new Headers;for(let K of HY6){let H=J.headers.get(K);if(H)W.set(K,H)}return W.set("Cache-Control","private, max-age=86400"),Zg$(W,W.get("content-type")??""),new Response(J.body,{status:J.status,headers:W})});Qg$=Xg$});var cr=C((w_)=>{var FY6=w_&&w_.__createBinding||(Object.create?function($,Z,X,Q){if(Q===void 0)Q=X;var Y=Object.getOwnPropertyDescriptor(Z,X);if(!Y||("get"in Y?!Z.__esModule:Y.writable||Y.configurable))Y={enumerable:!0,get:function(){return Z[X]}};Object.defineProperty($,Q,Y)}:function($,Z,X,Q){if(Q===void 0)Q=X;$[Q]=Z[X]}),NY6=w_&&w_.__exportStar||function($,Z){for(var X in $)if(X!=="default"&&!Object.prototype.hasOwnProperty.call(Z,X))FY6(Z,$,X)};Object.defineProperty(w_,"__esModule",{value:!0});NY6(KY(),w_)});var Wg$=C((Gg$)=>{Object.defineProperty(Gg$,"__esModule",{value:!0});Gg$.version=void 0;Gg$.version="3.4.0"});var Fg$=C((rK)=>{var UY6=rK&&rK.__importDefault||function($){return $&&$.__esModule?$:{default:$}};Object.defineProperty(rK,"__esModule",{value:!0});rK.NodeTransport=rK.VERSION=void 0;rK.nodeResolveHost=EY6;var p6=cr(),OY6=z0("net"),r51=z0("tls"),BY6=z0("path"),Kg$=z0("fs"),wY6=UY6(z0("dns")),DY6=Wg$();rK.VERSION=DY6.version;var LY6="nats.js";class Hg${socket;version;lang;yields=[];signal=(0,p6.deferred)();closedNotification=(0,p6.deferred)();options;connected=!1;tlsName="";done=!1;closeError;constructor(){this.lang=LY6,this.version=rK.VERSION}async connect($,Z){this.tlsName=$.tlsName,this.options=Z;let{tls:X}=this.options,{handshakeFirst:Q}=X||{};try{if(Q===!0)this.socket=await this.tlsFirst($);else this.socket=await this.dial($);if(this.done)this.socket?.destroy();let Y=await this.peekInfo();(0,p6.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 p6.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 p6.errors.ConnectionError("error connecting - node provided an undefined error");let{code:J}=G,W=J==="ECONNREFUSED"?new p6.errors.ConnectionError("connection refused",{cause:G}):G;throw this.socket?.destroy(),W}}dial($){let Z=(0,p6.deferred)(),X,Q=(0,OY6.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,p6.deferred)(),Z;return this.socket.on("data",(X)=>{this.yields.push(X);let Q=p6.DataBuffer.concat(...this.yields),Y=(0,p6.extractProtocolMessage)(Q);if(Y!=="")try{let G=p6.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,p6.deferred)();try{if($=(0,BY6.resolve)($),!(0,Kg$.existsSync)($))Z.reject(Error(`${$} doesn't exist`));(0,Kg$.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,p6.extend)(X,this.options.tls,Y)}catch(Y){return Promise.reject(new p6.errors.ConnectionError(Y.message,{cause:Y}))}let Q=(0,p6.deferred)();try{let Y=(0,r51.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 p6.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,p6.extend)(Z,this.options.tls,Q)}catch(Q){return Promise.reject(new p6.errors.ConnectionError(Q.message,{cause:Q}))}let X=(0,p6.deferred)();try{let Q=(0,r51.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 p6.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,p6.render)($[Z])}`);yield $[Z]}if(this.done)break;else if(this.yields.length===0)$.length=0,this.yields=$,this.signal=(0,p6.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 r51.TLSSocket}_send($){if(this.isClosed||this.socket===void 0)return Promise.resolve();if(this.options.debug)console.info(`< ${(0,p6.render)($)}`);let Z=(0,p6.deferred)();try{this.socket.write($,(X)=>{if(X){if(this.options.debug)console.error(`!!! ${(0,p6.render)($)}: ${X}`);return Z.reject(X)}return Z.resolve()})}catch(X){if(this.options.debug)console.error(`!!! ${(0,p6.render)($)}: ${X}`);Z.reject(X)}return Z}send($){this._send($).catch((X)=>{})}async _closed($,Z=!0){if(!this.connected)return;if(this.done){this.socket?.destroy();return}if(this.closeError=$,!$&&this.socket&&Z)try{await this._send(new TextEncoder().encode(""))}catch(X){if(this.options.debug)console.log("transport close terminated with an error",X)}try{if(this.socket)this.socket.removeAllListeners(),this.socket?.destroy(),this.socket=void 0}catch(X){console.log(X)}this.done=!0,this.closedNotification.resolve(this.closeError)}closed(){return this.closedNotification}}rK.NodeTransport=Hg$;function EY6($){let Z=(0,p6.deferred)();return wY6.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 wg$=C((Bg$)=>{Object.defineProperty(Bg$,"__esModule",{value:!0});Bg$.connect=jY6;var Ng$=Fg$(),Ug$=cr(),Og$=cr();function jY6($={}){if((0,Og$.hasWsProtocol)($))return Promise.reject(Og$.errors.InvalidArgumentError.format("servers","node client doesn't support websockets, use the 'wsconnect' function instead"));return(0,Ug$.setTransportFactory)({factory:()=>{return new Ng$.NodeTransport},dnsResolveFn:Ng$.nodeResolveHost}),Ug$.NatsConnectionImpl.connect($)}});var Dg$=C((DN)=>{var PY6=DN&&DN.__createBinding||(Object.create?function($,Z,X,Q){if(Q===void 0)Q=X;var Y=Object.getOwnPropertyDescriptor(Z,X);if(!Y||("get"in Y?!Z.__esModule:Y.writable||Y.configurable))Y={enumerable:!0,get:function(){return Z[X]}};Object.defineProperty($,Q,Y)}:function($,Z,X,Q){if(Q===void 0)Q=X;$[Q]=Z[X]}),AY6=DN&&DN.__exportStar||function($,Z){for(var X in $)if(X!=="default"&&!Object.prototype.hasOwnProperty.call(Z,X))PY6(Z,$,X)};Object.defineProperty(DN,"__esModule",{value:!0});DN.connect=void 0;var TY6=wg$();Object.defineProperty(DN,"connect",{enumerable:!0,get:function(){return TY6.connect}});AY6(cr(),DN)});function zg$($){let Z=$?.connectFn??MY6,X=null,Q=null,Y=!1,G=!1,J=!1,W=[];function K(){return X!==null&&!X.isClosed()&&!X.isDraining()&&!J}function H(){console.log(`[NatsProvider] fireReady: ${W.length} callbacks`);for(let U of W)try{U()}catch{}}function F(U){(async()=>{for await(let O of U.status())if(O.type==="disconnect")console.log("[NatsProvider] Disconnected"),J=!0;else if(O.type==="reconnect")console.log("[NatsProvider] Reconnected, re-firing ready callbacks"),J=!1,Q=null,H()})().catch(()=>{})}async function N(U,O){let B=0;while(!G)try{X=await Z({servers:U,timeout:qY6,reconnect:!0,maxReconnectAttempts:-1,...O?{authenticator:O}:{}}),console.log(`[NatsProvider] Connected to ${X.getServer()} after ${B} attempt(s)`),Q=null,J=!1,F(X),H();return}catch{B++;let D=mZ(IY6,RY6,B-1,2,0.5);await I$(D)}}return{init(U,O){if(Y)return;Y=!0,G=!1;let B=O?.creds?Lg$.credsAuthenticator(new TextEncoder().encode(O.creds)):void 0;N(U,B).catch(()=>{})},isConnected(){return K()},getConnection(){return K()?X:null},getJetStream(){if(!K())return null;if(!Q)Q=jg$.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 MY6($){return Eg$.connect($)}var Lg$,Eg$,jg$,RY6=100,IY6=3000,qY6=3000;var Pg$=w(()=>{t4();Lg$=S(Qu(),1),Eg$=S(Dg$(),1),jg$=S(Iw(),1)});function a51($,Z){return`${$}.${Z}`}class s51{cache;constructor($){this.cache=tg({ttlMs:$?.ttlMs??kY6,maxSize:$?.maxSize??SY6})}async get($,Z){return this.cache.get(a51($,Z))??null}async set($,Z,X){this.cache.set(a51($,Z),X)}async invalidate($,Z){this.cache.delete(a51($,Z))}teardown(){this.cache.clear()}}var kY6=600000,SY6=5000;var Ag$=()=>{};function AP0($,Z){return`${$}:${Z}`}function e51($){let Z=tg({ttlMs:$?.ttlMs??VY6,maxSize:$?.maxSize??CY6}),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(Tg$,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(AP0(K,H))},set(K,H,F){Z.set(AP0(K,H),F)},invalidate(K,H){Z.delete(AP0(K,H)),W(K,H)},start(){if(J)return;let K=X?.();if(!K)return;J=K.subscribe(Tg$),(async()=>{for await(let H of J)try{let F=JSON.parse(G.decode(H.data));if(F.originId===Q)continue;Z.delete(AP0(F.organizationId,F.keyId))}catch{}})().catch(console.error)},teardown(){J?.unsubscribe(),J=null,Z.clear()}}}var Tg$="studio.ai-provider-keys.invalidate",VY6=30000,CY6=5000;var Rg$=()=>{};class $91{options;subscriptions=[];onCancel=null;encoder=new TextEncoder;originId=crypto.randomUUID();seenMessageIds=new Set;constructor($){this.options=$}async start($){if($)this.onCancel=$;if(this.subscriptions.length>0)return;if(!this.onCancel)return;let Z=this.options.getConnection();if(!Z)return;let X=new TextDecoder;this.subscriptions=Ig$.map((Q)=>Z.subscribe(Q));for(let Q of this.subscriptions)(async()=>{for await(let Y of Q)try{let G=JSON.parse(X.decode(Y.data));if(G.originId===this.originId)continue;if(G.messageId&&this.hasSeen(G.messageId))continue;this.onCancel?.(G.taskId)}catch{}})().catch(console.error)}broadcast($){if(/[.*>\s]/.test($)){console.warn("[NatsCancelBroadcast] Invalid threadId, skipping broadcast");return}this.onCancel?.($);try{let Z=this.options.getConnection();if(!Z)return;let X=this.encoder.encode(JSON.stringify({taskId:$,originId:this.originId,messageId:crypto.randomUUID()}));for(let Q of Ig$)Z.publish(Q,X)}catch(Z){console.warn("[NatsCancelBroadcast] Publish failed (non-critical):",Z)}}publishControlFrame($,Z){}async stop(){for(let $ of this.subscriptions)$.unsubscribe();this.subscriptions=[],this.seenMessageIds.clear(),this.onCancel=null}hasSeen($){if(this.seenMessageIds.has($))return!0;if(this.seenMessageIds.add($),this.seenMessageIds.size>1000){let Z=this.seenMessageIds.values().next().value;if(Z)this.seenMessageIds.delete(Z)}return!1}}var Ig$;var qg$=w(()=>{Ig$=["studio.decopilot.cancel","mesh.decopilot.cancel"]});var Mg$=($)=>{let Z;return()=>Z??=$()},Z91,X91;var kg$=w(()=>{f6();Z91=Mg$(()=>q$.createHistogram("decopilot.stream.encode_ms",{description:"Per-chunk JSON.stringify+encode time for decopilot stream",unit:"ms"})),X91=Mg$(()=>q$.createCounter("decopilot.stream.published_chunks",{description:"Logical decopilot stream chunks published to JetStream",unit:"{chunks}"}))});function gY6(){return{name:bF,subjects:[`${mB0}.>`],storage:e3.StorageType.File,max_age:fY6,max_bytes:xY6,max_msgs_per_subject:yY6,discard:e3.DiscardPolicy.Old,retention:e3.RetentionPolicy.Limits,duplicate_window:bY6,num_replicas:1}}class Cg${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 Sg$($){let Z=Vg$.headers();for(let[X,Q]of Object.entries($))Z.set(X,Q);return Z}function lY6($,Z){let X=0;return{publish(Q,Y,G,J){Q.publish(Y,G,J?{headers:J}:void 0).catch((W)=>{if(X++,vY6().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 dY6($){if(!($ instanceof Error))return!1;if($.name==="TimeoutError")return!0;return/timeout|no responders|503/i.test($.message)}class Q91{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=gY6(),X=await m9(async()=>{let Q=this.options.getJetStreamManager?await this.options.getJetStreamManager():await e3.jetstreamManager($);try{await Q.streams.info(bF),await Q.streams.update(bF,Z)}catch(Y){if(Y instanceof Error&&Y.message.includes("stream not found"))await Q.streams.add(Z);else if(Y instanceof Error&&/can ?not change.*storage|storage type/i.test(Y.message))await Q.streams.delete(bF),await Q.streams.add(Z);else throw Y}return Q},{maxAttempts:5,minTimeout:250,maxTimeout:4000,jitter:0.5,isRetriable:dY6});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=lY6(Z,Q),J=!1,W=()=>{if(J)return;J=!0;let H=cK$(Z);Y.publish(H.subject,H.data).catch(()=>{})};X.addEventListener("abort",W,{once:!0});let K=(H)=>{let F=performance.now(),N=ep0(H,{runId:Z}),U=performance.now()-F;if(Z91().record(U),X91().add(1,{"org.id":Q??"unknown"}),cY6?.record(U,N.reduce((O,B)=>O+B.data.length,0)),N.length===0){console.warn(`[Decopilot] dropping oversized stream chunk for thread ${Z}`);return}for(let O of N)G.publish(Y,O.subject,O.data,O.headers?Sg$(O.headers):void 0)};return(async()=>{let H=$.getReader(),F=0,N=0,U;try{while(!0){let{done:O,value:B}=await H.read();if(O)break;if(K(B),N++,++F>=64)F=0,await new Promise((D)=>setImmediate(D))}}catch(O){U=O,console.warn(`[Decopilot] stream pump error for thread ${Z}:`,O?.message??O)}finally{if(H.releaseLock(),W(),uY6)console.warn(JSON.stringify({msg:"decopilot-stream-diag",event:"pump-done",taskId:Z,publishedChunks:N,publishErrors:G.errorCount}))}if(U!==void 0)throw U})()}async publishRawChunk($,Z,X){let Q=this.js;if(!Q)return!1;let Y=performance.now(),G=ep0(Z,{runId:$,dedup:X});if(Z91().record(performance.now()-Y),X91().add(1),G.length===0)return console.warn(`[Decopilot] dropping oversized raw chunk for thread ${$} (> MAX_CHUNKED_BYTES)`),!0;for(let J of G)await Q.publish(J.subject,J.data,{...J.headers?{headers:Sg$(J.headers)}:{},...J.msgId?{msgID:J.msgId}:{}});return!0}async publishDone($,Z,X){let Q=this.js;if(!Q)return!1;let Y=uK$({runId:$,fenceToken:Z,finalSeq:X});return await Q.publish(Y.subject,Y.data,{msgID:Y.msgId}),!0}async createTailStream($,Z,X){let Q=this.js;if(!Q)return console.warn(`[Decopilot] createTailStream: JetStream client unavailable for thread ${$}; no live tail`),null;let Y=X?.deliverPolicy==="new"?e3.DeliverPolicy.New:e3.DeliverPolicy.All,G=X?.closeOnDone??!1,J=BB($),W;try{W=await(await Q.consumers.get(bF,{filter_subjects:J,deliver_policy:Y})).consume()}catch(D){return console.warn("[Decopilot] JetStream tail unavailable (non-critical):",D?.message??D),null}let F=oB0({messages:async function*(){try{for await(let D of W)yield{subject:D.subject,data:D.data,headers:D.headers}}finally{W.stop()}}(),onCancel:()=>W.stop()}).pipeThrough(iB0()).pipeThrough(nB0()).getReader(),N=!1,U=()=>{if(N)return;N=!0;try{F.releaseLock()}catch{}},O=!1,B=()=>{if(O)return;O=!0,W.stop(),F.cancel().catch(()=>{}),U()};return Z?.addEventListener("abort",B,{once:!0}),new ReadableStream({async pull(D){for(;;){let{done:L,value:E}=await F.read();if(L){B(),D.close();return}let j=E;if(j.kind==="done"){if(G){B(),D.close();return}continue}D.enqueue(j.chunk);return}},cancel(){B()}})}purge($){if(!this.jsm)return;this.jsm.streams.purge(bF,{filter:BB($)}).catch(()=>{})}teardown(){this.js=null,this.jsm=null}}var e3,Vg$,_Y6=($)=>{let Z;return()=>Z??=$()},vY6,fY6=86400000000000,bY6=120000000000,xY6=4294967296,yY6=500000,hY6,uY6,cY6;var _g$=w(()=>{t4();$t0();rB0();pB0();f6();kg$();e3=S(Iw(),1),Vg$=S(Qu(),1),vY6=_Y6(()=>q$.createCounter("decopilot.stream.publish_errors",{description:"Number of JetStream publish failures for decopilot stream chunks",unit:"{errors}"}));hY6=process.env.STREAM_ENCODE_TRACE==="1",uY6=process.env.DECOPILOT_STREAM_TRACE==="1";cY6=hY6?new Cg$:null});function TP0($,Z,X,Q){if(!Q)return!1;return $.emit(Z,PW(X,Q.status,{title:Q.title??void 0,virtualMcpId:Q.virtual_mcp_id??void 0,createdBy:Q.created_by??void 0,triggerId:Q.trigger_id??null,branch:Q.branch??null,harnessId:Q.harness_id??void 0,createdAt:Q.created_at,updatedAt:Q.updated_at})),!0}var vg$=w(()=>{F8()});class Y91{storage;options;timer=null;constructor($,Z={}){this.storage=$;this.options=Z}start(){if(this.timer)return;let $=this.options.intervalMs??300000;this.timer=setInterval(()=>{this.runOnce()},$)}async runOnce(){let $=this.options.staleAfterMs??3600000;try{let Z=await this.storage.sweepAbandoned($);if(Z>0)console.log(`[async-research-sweeper] marked ${Z} stale jobs as abandoned`);return Z}catch(Z){return console.error("[async-research-sweeper] sweep failed",Z),0}}dispose(){if(this.timer)clearInterval(this.timer),this.timer=null}}function rY6($){return $ instanceof n7}function aY6($,Z){return Z-$>=tY6}class G91{taskBoard;contextFactory;billing;options;timer=null;running=!1;cursor=null;constructor($,Z,X,Q={}){this.taskBoard=$;this.contextFactory=Z;this.billing=X;this.options=Q}start(){if(this.timer)return;let $=this.options.intervalMs??mY6;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??nY6,X=this.options.itemIntervalMs??iY6,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()-Zp0),ht0);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()-oY6));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 Pp0(this.taskBoard,Y,Q),await Ap0(this.taskBoard,this.billing,Y,Q)}catch(G){console.error(`[task-board-review-sweeper] unhandled-failure reaction for ${X} failed`,G)}}async dispatchDueRetries($){let Z=0,X=await this.taskBoard.listItemsDueForRetry($,new Date);for(let{id:Q,organizationId:Y,attempts:G}of X)try{if(!await this.taskBoard.claimDueRetry(Q,Y,new Date))continue;let J=await this.taskBoard.getById(Q,Y);if(!J||J.status!=="in_progress"||J.assigneeId!==E4)continue;let W=await this.contextFactory(Y,J.assignedBy??J.createdBy);if(!W)continue;await xF(W,J,{runClass:"retry"}),Z++,console.warn(`[task-board-review-sweeper] re-dispatched ${Q} after a failure (attempt ${G})`)}catch(J){if(console.error(`[task-board-review-sweeper] retry dispatch for ${Q} failed`,J),rY6(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()+pY6)).catch((W)=>console.error(`[task-board-review-sweeper] re-arming ${Q} failed`,W))}return Z}async returnToTodo($,Z,X){try{let Q=await this.taskBoard.getById($,Z);if(!Q||Q.status!=="in_progress")return;let Y=await this.taskBoard.returnToTodoAfterFailure($,Z,Q.updatedBy);if(!Y)return;await this.taskBoard.recordActivity({taskBoardItemId:$,action:"status_changed",actorId:null,data:{from:"in_progress",to:"todo",reason:X}}).catch(()=>{}),p8(Z,Y)}catch(Q){console.error(`[task-board-review-sweeper] returning ${$} to todo failed`,Q)}}async handOffReviewWithoutPr($,Z){let X=await this.taskBoard.listActivity(Z.id,Z.organizationId);if(!aY6(KF(X),Date.now()))return;await EK($,Z,"no pull request is linked to this task \u2014 there is nothing for a "+"reviewer to review")}async reconcileItem($,Z,X){if(!await this.taskBoard.claimSweep($,Z,X))return!1;let Q=await this.taskBoard.getById($,Z);if(!Q)return!1;if(Q.status!=="in_review")return!1;let Y=Q.assigneeId===E4,G=await this.taskBoard.listPrs($,Z),J=await this.contextFactory(Z,Q.assignedBy??Q.createdBy);if(!J)return!1;if(G.length===0){if(Y)await this.handOffReviewWithoutPr(J,Q);return!1}if(await ZF$(J,Q))return!0;if(!Y)return!1;let W=await Promise.all(G.map(async(K)=>({...K,...await Ly(Z,K)})));if(W.every((K)=>K.state===null))console.warn(`[task-board-review-sweeper] ${$}: no live PR state from GitHub (${W.length} PR(s)) \u2014 proceeding on unknown`);if(!bt0(W))return!1;return await Xw0(J,Q,{previewMatchesHead:xt0(W)}),!0}dispose(){if(this.timer)clearInterval(this.timer),this.timer=null}}var mY6=60000,iY6=300000,nY6=50,pY6=60000,tY6=900000,oY6=120000;var fg$=w(()=>{v9();Mt0();wB();Fp();P9();B3();ut0();zK();Yp()});import{readdir as sY6,rm as RP0}from"fs/promises";import{join as IP0}from"path";async function qP0($){let Z=new Date;Z.setUTCDate(Z.getUTCDate()-eY6),Z.setUTCHours(0,0,0,0);let X=0;try{let Q=await D_($);for(let Y of Q)if(/^\d{4}$/.test(Y))X+=await bg$($,Y,Z);else if(!Y.startsWith(".")){let G=IP0($,Y),J=await D_(G);for(let K of J){if(!/^\d{4}$/.test(K))continue;X+=await bg$(G,K,Z)}if((await D_(G)).length===0)await RP0(G,{recursive:!0,force:!0})}}catch(Q){console.warn("monitoring retention cleanup failed:",Q)}return X}async function bg$($,Z,X){let Q=0,Y=IP0($,Z),G=await D_(Y);for(let W of G){if(!/^\d{2}$/.test(W))continue;let K=IP0(Y,W),H=await D_(K);for(let N of H){if(!/^\d{2}$/.test(N))continue;let U=new Date(`${Z}-${W}-${N}T00:00:00Z`);if(isNaN(U.getTime()))continue;if(U<X){let O=IP0(K,N);await RP0(O,{recursive:!0,force:!0}),Q++}}if((await D_(K)).length===0)await RP0(K,{recursive:!0,force:!0})}if((await D_(Y)).length===0)await RP0(Y,{recursive:!0,force:!0});return Q}async function D_($){try{return(await sY6($)).filter((X)=>!X.startsWith("."))}catch{return[]}}var eY6=30;var J91=()=>{};import{DBOS as W91,SchedulerMode as $G6}from"@dbos-inc/dbos-sdk";async function XG6(){let $=[AJ(),E_(),eK()],Z=0;for(let X of $)try{Z+=await qP0(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 QG6($,Z){await W91.runStep(()=>XG6(),{name:"monitoringRetention"})}function yg$(){if(xg$)return;xg$=!0;let $=W91.registerWorkflow(QG6,{name:"monitoringRetentionWorkflow"});W91.registerScheduled($,{name:"monitoringRetentionWorkflow",crontab:ZG6,mode:$G6.ExactlyOncePerIntervalWhenActive})}var ZG6="23 4 * * *",xg$=!1;var gg$=w(()=>{YY();J91()});function hg$($){return async(Z,X)=>{let Q=await $.db.selectFrom("member").innerJoin("organization","organization.id","member.organizationId").select(["member.role","organization.id as orgId","organization.slug as orgSlug","organization.name as orgName"]).where("member.userId","=",X).where("member.organizationId","=",Z).executeTakeFirst();if(!Q)return console.warn(`[automationContextFactory] User ${X} not found in org ${Z} \u2014 returning null`),null;let Y=await rG.create();Y.auth.user={id:X,role:Q.role},Y.organization={id:Q.orgId,slug:Q.orgSlug,name:Q.orgName};let G=await H41($.db,Z,Q.role);return Y.boundAuth=K41({auth:Y.authInstance,headers:new Headers,role:Q.role,permissions:G,userId:X}),Y.access=new QL(X,void 0,Y.boundAuth,Q.role,"self"),DB(Y,{id:Q.orgId,slug:Q.orgSlug}),Y}}var ug$=w(()=>{YL();tV()});function YG6(){return{services:[{name:"Postgres",status:"pending",port:0},{name:"NATS",status:"pending",port:0}],migrationsStatus:"pending",serverUrl:null,logs:[]}}function JG6(){for(let $ of GG6)$()}function cg$($){let Z=[...K91.logs,$];K91={...K91,logs:Z.length>500?Z.slice(-500):Z},JG6()}function H91(){return WG6}var K91,GG6,WG6=!1;var F91=w(()=>{K91=YG6(),GG6=new Set});import{EventEmitter as KG6}from"events";var N91;var lg$=w(()=>{F91();N91=new KG6;N91.on("request",($)=>{cg$($)})});function dg$(){return async($,Z)=>{let X=Date.now(),Q=$.req.method,Y=$.req.path;if(Y==="/api/auth/get-session"||Y.includes("favicon")){await Z();return}let G="",J=!1;if(Y.startsWith("/mcp")&&Q==="POST"){J=!0;try{if($.req.header("Content-Type")?.includes("application/json")){let U=await $.req.raw.clone().json();if(U.method==="tools/call"&&U.params?.name){let O=vh(U.params.name),B=U.params.arguments||{},D=Object.keys(B).map((E)=>vh(E)),L=D.length>0?D.slice(0,3).join(",")+(D.length>3?"\u2026":""):"";G=`${Q5.tool}${O}${Q5.dim}(${L})${Q5.reset}`}else if(U.method)G=`${Q5.dim}${vh(U.method)}${Q5.reset}`}}catch{}}let W=vh(Y);if(Y.startsWith("/mcp/conn_")){let F=Y.split("/")[2]??"";W=`/mcp/${Q5.mcp}${vh(F.slice(0,12))}\u2026${Q5.reset}`}else if(Y==="/mcp")W=`${Q5.mcp}/mcp${Q5.reset}`;else if(Y==="/mcp/registry")W=`${Q5.mcp}/mcp/registry${Q5.reset}`;let K=FG6(Q),H=J?"\u25C0":"\u2190";if(!H91())console.log(`${Q5.dim}${H}${Q5.reset} ${K}${Q}${Q5.reset} ${W}${G?` ${G}`:""}`);try{await Z()}finally{let F=Date.now()-X,N=$.res.status,U=HG6(N),O=F<1000?`${F}ms`:`${(F/1000).toFixed(1)}s`,B=J?"\u25B6":"\u2192";if(!H91())console.log(`${Q5.dim}${B}${Q5.reset} ${K}${Q}${Q5.reset} ${W}${G?` ${G}`:""} ${U}${N}${Q5.reset} ${Q5.duration}${O}${Q5.reset}`);N91.emit("request",{method:Q,path:vh(Y),status:N,duration:F,timestamp:new Date})}}}var Q5,HG6=($)=>{if($>=500)return Q5.serverError;if($>=400)return Q5.clientError;if($>=300)return Q5.redirect;return Q5.ok},FG6=($)=>{return Q5[$]||Q5.reset},vh=($)=>{return $.replace(/\r/g,"").replace(/\n/g,"").replace(/\x1b\[[0-9;]*m/g,"").replace(/[\x00-\x1f\x7f-\x9f]/g,"")};var mg$=w(()=>{F91();lg$();Q5={reset:"\x1B[0m",dim:"\x1B[2m",bold:"\x1B[1m",GET:"\x1B[36m",POST:"\x1B[33m",PUT:"\x1B[35m",DELETE:"\x1B[31m",ok:"\x1B[32m",redirect:"\x1B[36m",clientError:"\x1B[33m",serverError:"\x1B[31m",mcp:"\x1B[35m",tool:"\x1B[96m",duration:"\x1B[90m"}});import{createHmac as tg$}from"crypto";import{mkdir as NG6,readdir as UG6,rm as ig$,stat as og$}from"fs/promises";import{join as O91,relative as OG6}from"path";import{z as j$}from"zod";function ag$($){let Z=$.replace(/[^a-zA-Z0-9_-]/g,"_");return O91(BG6,Z)}function sg$($){return $.replace(/^\/+/,"").replace(/\.\./g,"")}function U91($,Z){let X=ag$($),Q=sg$(Z);return O91(X,Q)}function wG6($,Z,X,Q){let Y=b0().encryptionKey||"dev-secret",G=`${$}:${Z}:${X}:${Q}`;return tg$("sha256",Y).update(G).digest("hex")}function pg$($,Z,X,Q,Y){let G=Math.floor(Date.now()/1000)+Q,J=wG6(Z,X,G,Y),W=new URL(`/api/dev-assets/${Z}/${sg$(X)}`,$);return W.searchParams.set("expires",G.toString()),W.searchParams.set("signature",J),W.searchParams.set("method",Y),W.toString()}function eg$($,Z,X){let Q=`${$}:${Z.getTime()}:${X}`;return`"${tg$("md5","etag").update(Q).digest("hex")}"`}async function $h$($,Z,X,Q,Y){try{let G=await UG6($,{withFileTypes:!0});for(let J of G){let W=O91($,J.name),H=OG6(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 $h$(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 og$(W);Y.objects.push({key:H,size:F.size,lastModified:F.mtime.toISOString(),etag:eg$(W,F.mtime,F.size)})}catch{}}}}catch{}}function Zh$($,Z){let Q=t($).id;return[{name:"LIST_OBJECTS",description:"List objects in the local assets directory with pagination support",inputSchema:j$.object({prefix:j$.string().optional(),maxKeys:j$.number().optional().default(1000),continuationToken:j$.string().optional(),delimiter:j$.string().optional()}),outputSchema:j$.object({objects:j$.array(j$.object({key:j$.string(),size:j$.number(),lastModified:j$.string(),etag:j$.string()})),nextContinuationToken:j$.string().optional(),isTruncated:j$.boolean(),commonPrefixes:j$.array(j$.string()).optional()}),handler:async(Y)=>{let G=Y,J=G.prefix||"",W=G.maxKeys??1000,K=G.delimiter,H=G.continuationToken,F=ag$(Q);await NG6(F,{recursive:!0});let N={objects:[],commonPrefixes:new Set};await $h$(F,F,J,K,N),N.objects.sort((L,E)=>L.key.localeCompare(E.key));let U=0;if(H){if(U=N.objects.findIndex((L)=>L.key>H),U===-1)U=N.objects.length}let O=N.objects.slice(U,U+W),B=U+W<N.objects.length,D=B?O[O.length-1]?.key:void 0;return{objects:O,isTruncated:B,nextContinuationToken:D,commonPrefixes:Array.from(N.commonPrefixes).sort()}}},{name:"GET_OBJECT_METADATA",description:"Get metadata for a file in the local assets directory",inputSchema:j$.object({key:j$.string()}),outputSchema:j$.object({contentType:j$.string().optional(),contentLength:j$.number(),lastModified:j$.string(),etag:j$.string(),metadata:j$.record(j$.string(),j$.string()).optional()}),handler:async(Y)=>{let G=Y,J=U91(Q,G.key),W=await og$(J);return{contentType:t41(G.key),contentLength:W.size,lastModified:W.mtime.toISOString(),etag:eg$(J,W.mtime,W.size)}}},{name:"GET_PRESIGNED_URL",description:"Generate a presigned URL for downloading a file from local storage",inputSchema:j$.object({key:j$.string(),expiresIn:j$.number().optional()}),outputSchema:j$.object({url:j$.string(),expiresIn:j$.number()}),handler:async(Y)=>{let G=Y,J=G.expiresIn??ng$;return{url:pg$(Z,Q,G.key,J,"GET"),expiresIn:J}}},{name:"PUT_PRESIGNED_URL",description:"Generate a presigned URL for uploading a file to local storage",inputSchema:j$.object({key:j$.string(),expiresIn:j$.number().optional(),contentType:j$.string().optional()}),outputSchema:j$.object({url:j$.string(),expiresIn:j$.number()}),handler:async(Y)=>{let G=Y,J=G.expiresIn??ng$;return{url:pg$(Z,Q,G.key,J,"PUT"),expiresIn:J}}},{name:"DELETE_OBJECT",description:"Delete a single file from local storage",inputSchema:j$.object({key:j$.string()}),outputSchema:j$.object({success:j$.boolean(),key:j$.string()}),handler:async(Y)=>{let G=Y,J=U91(Q,G.key);try{return await ig$(J),{success:!0,key:G.key}}catch{return{success:!1,key:G.key}}}},{name:"DELETE_OBJECTS",description:"Delete multiple files from local storage",inputSchema:j$.object({keys:j$.array(j$.string()).max(1000)}),outputSchema:j$.object({deleted:j$.array(j$.string()),errors:j$.array(j$.object({key:j$.string(),message:j$.string()}))}),handler:async(Y)=>{let G=Y,J=[],W=[];return await Promise.all(G.keys.map(async(K)=>{let H=U91(Q,K);try{await ig$(H),J.push(K)}catch(F){W.push({key:K,message:F instanceof Error?F.message:"Unknown error"})}})),{deleted:J,errors:W}}}]}async function B91($,Z,X){let Q=Zh$(Z,X),Y=new kW({name:"dev-assets-mcp",version:"1.0.0"},{capabilities:{tools:{}},jsonSchemaValidator:K5});for(let J of Q){let W="shape"in J.inputSchema?J.inputSchema.shape:j$.object({}).shape,K=J.outputSchema&&"shape"in J.outputSchema?J.outputSchema.shape:j$.object({}).shape;Y.registerTool(J.name,{description:J.description??"",inputSchema:W,outputSchema:K,annotations:J.annotations,_meta:J._meta},async(H)=>{try{let F=await J.handler(H);return{content:[{type:"text",text:JSON.stringify(F)}],structuredContent:F}}catch(F){return{content:[{type:"text",text:`Error: ${F.message}`}],isError:!0}}})}let G=new rX({enableJsonResponse:$.headers.get("Accept")?.includes("application/json")??!1});return await Y.connect(G),XJ(Y,G,$,"mcp:dev-assets")}async function Xh$($,Z,X,Q){let G=Zh$(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 BG6="./data/assets",ng$=3600,rg$,Qh$;var Yh$=w(()=>{A$();Ry();C8();kl();eV();VX();zz0();rg$=new U1;rg$.all("/",async($)=>{let Z=$.get("studioContext"),X=new URL($.req.url),Q=`${X.protocol}//${X.host}`;return B91($.req.raw,Z,Q)});Qh$=rg$});var Gh$={};N4(Gh$,{mountDevRoutes:()=>DG6});function DG6($,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 B91(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 Xh$(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",Qh$);let X=new U1;X.use("*",a3({mountPath:"/api/dev-assets"})),X.route("/",jz0({orgFromPath:!1})),$.route("/api/dev-assets",X)}var Jh$=w(()=>{C8();c41();zz0();Yh$()});import{sql as LG6}from"kysely";import{randomUUID as Wh$}from"crypto";import{z as EG6}from"zod";async function zG6($){let Z=new Date().toISOString(),X=Wh$(),Q=u4.SELF($.organizationId),Y="registry.publish_request.created",G={requestId:$.request.id,requestedId:$.request.requested_id,title:$.request.title,status:$.request.status,createdAt:$.request.created_at,requester:{name:$.request.requester_name,email:$.request.requester_email}};await $.db.insertInto("events").values({id:X,organization_id:$.organizationId,type:"registry.publish_request.created",source:Q,specversion:"1.0",subject:$.request.id,time:Z,datacontenttype:"application/json",dataschema:null,data:JSON.stringify(G),cron:null,status:"pending",attempts:0,last_error:null,next_retry_at:null,created_at:Z,updated_at:Z}).execute();let J=await $.db.selectFrom("event_subscriptions").select(["id"]).where("organization_id","=",$.organizationId).where("enabled","=",1).where("event_type","=","registry.publish_request.created").where((W)=>W.or([W("publisher","is",null),W("publisher","=",Q)])).execute();if(J.length>0)await $.db.insertInto("event_deliveries").values(J.map((W)=>({id:Wh$(),event_id:X,subscription_id:W.id,status:"pending",attempts:0,last_error:null,delivered_at:null,next_retry_at:null,created_at:Z}))).execute();try{await LG6`SELECT
|
|
2767
2767
|
pg_notify('studio_events', ${X}),
|