decocms 4.319.11 → 4.319.12
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-C8XDzPRu.js → AlertCircle-ClToruK0.js} +1 -1
- package/dist/client/assets/{AreaChart-BFuLhEAJ.js → AreaChart-BfrQSNFq.js} +1 -1
- package/dist/client/assets/{ArrowLeft-CTfYqAeL.js → ArrowLeft-B4E-Sahc.js} +1 -1
- package/dist/client/assets/{ArrowUp-Dndx_psT.js → ArrowUp-CNhm6eFH.js} +1 -1
- package/dist/client/assets/{Check-Bxq3sAMT.js → Check-PMgjjdTe.js} +1 -1
- package/dist/client/assets/{CheckCircle-OPjRGmHJ.js → CheckCircle-RBxlsZl2.js} +1 -1
- package/dist/client/assets/{ChevronDown-B78Z7JhJ.js → ChevronDown-oY26mbX7.js} +1 -1
- package/dist/client/assets/{ChevronRight-DoxpMYgv.js → ChevronRight-BEHZ6NZL.js} +1 -1
- package/dist/client/assets/{ChevronSelectorVertical-CqkEIUhB.js → ChevronSelectorVertical-JcGnBvEL.js} +1 -1
- package/dist/client/assets/{ChevronUp-BLvCCCZc.js → ChevronUp-BZirzRB6.js} +1 -1
- package/dist/client/assets/{Copy01-CS_So4Uz.js → Copy01-B_2vcBlF.js} +1 -1
- package/dist/client/assets/{CreditCard01-CpyYSvQ3.js → CreditCard01-ChimmSCJ.js} +1 -1
- package/dist/client/assets/{DotsVertical-CL1uf5Bu.js → DotsVertical-Cft1i3iA.js} +1 -1
- package/dist/client/assets/{Download01-CxWUyG_X.js → Download01-CA2CYlYl.js} +1 -1
- package/dist/client/assets/{ErrorBarContext-BOZ7dcPi.js → ErrorBarContext-Cm9VzL4a.js} +1 -1
- package/dist/client/assets/{Eye-CmND_DBa.js → Eye-DVnZY3NV.js} +1 -1
- package/dist/client/assets/{FilterLines-CSE_Ogu_.js → FilterLines-DrGmxI0g.js} +1 -1
- package/dist/client/assets/{GitBranch01-D_a1MiQQ.js → GitBranch01-DQckacwW.js} +1 -1
- package/dist/client/assets/{Globe01-Cm4DSICd.js → Globe01-jbXb6ulu.js} +1 -1
- package/dist/client/assets/{Globe04-DbBcV-E2.js → Globe04-xCK3nTmA.js} +1 -1
- package/dist/client/assets/{HardDrive-B4mHXAle.js → HardDrive-C9KdcNlI.js} +1 -1
- package/dist/client/assets/{Image01-DDlYl6aL.js → Image01-CRujAxHg.js} +1 -1
- package/dist/client/assets/{Key01-GYKWVO36.js → Key01-DK8RhZHE.js} +1 -1
- package/dist/client/assets/{LinkExternal01-BiUY26Aw.js → LinkExternal01-BtC-p5Va.js} +1 -1
- package/dist/client/assets/{LockUnlocked01-DDHVAeu0.js → LockUnlocked01-B2L4GLRl.js} +1 -1
- package/dist/client/assets/{LogOut01-L3qCYWBe.js → LogOut01-D5WcJfJs.js} +1 -1
- package/dist/client/assets/{Monitor01-DDDZk1T8.js → Monitor01-CQH6tCva.js} +1 -1
- package/dist/client/assets/{Package-BQ4aGZ5C.js → Package-CORPPwT-.js} +1 -1
- package/dist/client/assets/{Palette-CMzcklHM.js → Palette-dFQD8LKQ.js} +1 -1
- package/dist/client/assets/{Play-DjvcK07v.js → Play-CcGw_Uni.js} +1 -1
- package/dist/client/assets/{Plus-DD6ql5SQ.js → Plus-bwHRKSue.js} +1 -1
- package/dist/client/assets/{SearchLg-DrCbydJX.js → SearchLg-kHGYPtIw.js} +1 -1
- package/dist/client/assets/{SearchMd-CYXNgks8.js → SearchMd-CrM8FgeA.js} +1 -1
- package/dist/client/assets/{Sector-DxIBB5iA.js → Sector-vmxMniJ8.js} +1 -1
- package/dist/client/assets/{Settings02-BkuHKQTT.js → Settings02-gqR-NFC9.js} +1 -1
- package/dist/client/assets/{Share07-DFkS5ZA9.js → Share07-BJMsRk6Q.js} +1 -1
- package/dist/client/assets/{Shield01-BqNKNsE_.js → Shield01-B3IGGfe8.js} +1 -1
- package/dist/client/assets/{Stars01-DLcNnYnQ.js → Stars01-CyIrFIKT.js} +1 -1
- package/dist/client/assets/{Stars02-DpgnX4j3.js → Stars02-CgssSvzZ.js} +1 -1
- package/dist/client/assets/{Sun-Cfdg0-fN.js → Sun-BFVshSLm.js} +1 -1
- package/dist/client/assets/{SwitchHorizontal01-CDfbzUMe.js → SwitchHorizontal01-CmezVjc5.js} +1 -1
- package/dist/client/assets/{Tool01-BkIa9J-T.js → Tool01-DP7l3n3Y.js} +1 -1
- package/dist/client/assets/{Tool02-LyDsiEcj.js → Tool02-BvJSq7kS.js} +1 -1
- package/dist/client/assets/{Trash01-DMEyL-_r.js → Trash01-8aRDtn4y.js} +1 -1
- package/dist/client/assets/{TrendUp01-CRVwTA9x.js → TrendUp01-iZTQHtO4.js} +1 -1
- package/dist/client/assets/{Upload01-BXETp31V.js → Upload01-zJC35Q7D.js} +1 -1
- package/dist/client/assets/{User01--NR0wcxR.js → User01-Cg1rezA0.js} +1 -1
- package/dist/client/assets/{UserSquare-BDMyjzaF.js → UserSquare-Bxd4pDXm.js} +1 -1
- package/dist/client/assets/{Users01-CYdUUADt.js → Users01-BjZALObG.js} +1 -1
- package/dist/client/assets/{Users03-BJfM2ts1.js → Users03-DLm7BQsJ.js} +1 -1
- package/dist/client/assets/{XCircle-D1lTnv45.js → XCircle-DQCubZzT.js} +1 -1
- package/dist/client/assets/{XClose-7CTyOeCs.js → XClose-DAiJgSzs.js} +1 -1
- package/dist/client/assets/{YAxis-BZmDD3lJ.js → YAxis-Dcyix6od.js} +1 -1
- package/dist/client/assets/{Zap-Bzfi7ZdU.js → Zap-DnE9jTWD.js} +1 -1
- package/dist/client/assets/{ZapSquare-C6EnYa3u.js → ZapSquare-CqhgOeLt.js} +1 -1
- package/dist/client/assets/{ZoomOut-BQOaUyto.js → ZoomOut-nXvYYjVw.js} +1 -1
- package/dist/client/assets/{access-gate-3UKF-T20.js → access-gate-_zqgY-K4.js} +1 -1
- package/dist/client/assets/{agent-icon-CEcN5Ilk.js → agent-icon-CqMkVI2H.js} +1 -1
- package/dist/client/assets/{agents-list-DW-wbAoT.js → agents-list-CwEiM3H8.js} +1 -1
- package/dist/client/assets/{ai-providers-CgPv--a3.js → ai-providers-DmcZJOxT.js} +1 -1
- package/dist/client/assets/{alert-DRkYko5H.js → alert-BR-p4tVC.js} +1 -1
- package/dist/client/assets/{alert-dialog-BwmNFu1l.js → alert-dialog-DHosdfGA.js} +1 -1
- package/dist/client/assets/{analytics-tab-D9IxcyEr.js → analytics-tab-HW971fV1.js} +1 -1
- package/dist/client/assets/{api-keys-BHFa04t3.js → api-keys-B2mOY4WU.js} +1 -1
- package/dist/client/assets/{app-editor-DBcySaWI.js → app-editor-CKOBupDJ.js} +1 -1
- package/dist/client/assets/{auth-CJkvZW-k.js → auth-Cdu_Esoc.js} +1 -1
- package/dist/client/assets/{auth-catchall-D5gdcATu.js → auth-catchall-CiyXXkH8.js} +1 -1
- package/dist/client/assets/{auth-entry-Dz_QxirS.js → auth-entry-FfywnvVK.js} +1 -1
- package/dist/client/assets/{auth-split-layout-BzJIXr1y.js → auth-split-layout-F9RN8kfA.js} +1 -1
- package/dist/client/assets/{authenticate-and-persist-oauth-B-zmVWY9.js → authenticate-and-persist-oauth-CxNMau8p.js} +1 -1
- package/dist/client/assets/{automation-list-row-LC7AzU8H.js → automation-list-row-DlhKbcWS.js} +1 -1
- package/dist/client/assets/{automation-runs-DhRngbfS.js → automation-runs-BSZspOPk.js} +1 -1
- package/dist/client/assets/{automations-Dpuh5mTg.js → automations-Bsy1xegM.js} +1 -1
- package/dist/client/assets/{avatar-Be32ceEV.js → avatar-C4y8xmhb.js} +1 -1
- package/dist/client/assets/{badge-DeycDEDa.js → badge-bKgqq_hn.js} +1 -1
- package/dist/client/assets/{block-document-0VJ4mJz2.js → block-document-Cq9xvEs5.js} +1 -1
- package/dist/client/assets/{breadcrumb-BkUUiSOA.js → breadcrumb-BxiaCaRI.js} +1 -1
- package/dist/client/assets/{buckets-DjkxmYYc.js → buckets-D2H9tI7C.js} +1 -1
- package/dist/client/assets/{bulk-category-panel-DITCXe6Q.js → bulk-category-panel-Bs99v8a6.js} +1 -1
- package/dist/client/assets/{capability-load-error-D6ZvKvlf.js → capability-load-error-BMapM_nu.js} +1 -1
- package/dist/client/assets/{cards-odjp1n2S.js → cards-AKnEBiwF.js} +1 -1
- package/dist/client/assets/{category-editor-T2MgeHT9.js → category-editor-CeGZPq10.js} +1 -1
- package/dist/client/assets/{cdn-tab-D-8RFlx4.js → cdn-tab-BkoLgXRq.js} +1 -1
- package/dist/client/assets/{chart-jg4AMjQe.js → chart-DsFfwadF.js} +1 -1
- package/dist/client/assets/{chat-context-VFkTmrKQ.js → chat-context-Bv0NCGao.js} +1 -1
- package/dist/client/assets/{checkbox-5B3Nsb_j.js → checkbox-DC7ImXSU.js} +1 -1
- package/dist/client/assets/{choose-editor-KuVvTNHJ.js → choose-editor-CQ2RdklR.js} +1 -1
- package/dist/client/assets/{cli-auth-success-yOUjDdHq.js → cli-auth-success-C386HV7Q.js} +1 -1
- package/dist/client/assets/{collection-detail-Bn7-81rP.js → collection-detail-BGM1bL7e.js} +1 -1
- package/dist/client/assets/{collection-display-button-DuqsXIIA.js → collection-display-button-Y0tL3jai.js} +1 -1
- package/dist/client/assets/{collection-search-Czd9Mfxw.js → collection-search-BYP7-ZxX.js} +1 -1
- package/dist/client/assets/{collection-table-wrapper-rSXxT4FT.js → collection-table-wrapper-D-Nt7RKb.js} +1 -1
- package/dist/client/assets/{collection-tabs-BjHY3CU9.js → collection-tabs-CL2MtumN.js} +1 -1
- package/dist/client/assets/{command-DIZ2TwJ6.js → command-D92GDJ41.js} +1 -1
- package/dist/client/assets/{commerce-onboarding-CkB2ni0H.js → commerce-onboarding-DH9EqffA.js} +1 -1
- package/dist/client/assets/{config-DlgHqtbo.js → config-uvG_j2hY.js} +1 -1
- package/dist/client/assets/{connect-BCbNCJEo.js → connect-0_8Pifz1.js} +1 -1
- package/dist/client/assets/{connection-iXS4K9V0.js → connection-B4xscr6U.js} +1 -1
- package/dist/client/assets/{connection-card-CxFJyjO4.js → connection-card-Dyoy7mvf.js} +1 -1
- package/dist/client/assets/{connection-detail-B9Zh-X_H.js → connection-detail-ihgx40IB.js} +1 -1
- package/dist/client/assets/{connection-form-helpers-DjjPEqBy.js → connection-form-helpers-B2TmfMw7.js} +1 -1
- package/dist/client/assets/{connections-BqxcXL-b.js → connections-Cl1sPtGg.js} +1 -1
- package/dist/client/assets/{decopilot-sse-pool-C_kQApdo.js → decopilot-sse-pool-ULdMGH4U.js} +1 -1
- package/dist/client/assets/{dialog-DJ6N9l-G.js → dialog-BSQPsnMV.js} +1 -1
- package/dist/client/assets/{domain-settings-5FqfMlZM.js → domain-settings-DzbX9zl8.js} +1 -1
- package/dist/client/assets/{drawer-BYjZcQUP.js → drawer-s9F4KtK0.js} +1 -1
- package/dist/client/assets/{dropdown-menu-BdmGKLTp.js → dropdown-menu-Br5tvBrx.js} +1 -1
- package/dist/client/assets/{e2e-tab-Dmto2BvH.js → e2e-tab-CDsd7wp2.js} +1 -1
- package/dist/client/assets/{editor-RaHtOP3X.js → editor-99Sk7gK7.js} +1 -1
- package/dist/client/assets/{empty-state--CA0lu67.js → empty-state-BzoJWDN3.js} +1 -1
- package/dist/client/assets/{empty-state-DGCuDv4_.js → empty-state-FLuorgA8.js} +1 -1
- package/dist/client/assets/{extract-connection-data-CpinTMij.js → extract-connection-data-DMuGjDrw.js} +1 -1
- package/dist/client/assets/{file-explorer-DC_nRPAI.js → file-explorer-C60EN7cX.js} +1 -1
- package/dist/client/assets/{file-type-icon-C9Vyxyzp.js → file-type-icon-7YC5ilNl.js} +1 -1
- package/dist/client/assets/{folder-icon-Nahco-AM.js → folder-icon-aYJXq_Sg.js} +1 -1
- package/dist/client/assets/{form-TAHU_OLd.js → form-BZ8QASyF.js} +1 -1
- package/dist/client/assets/{general-DoAdvreU.js → general-j2-fP1Wb.js} +1 -1
- package/dist/client/assets/{github-repo-picker-DcDZAelp.js → github-repo-picker-U8Jxu_k4.js} +1 -1
- package/dist/client/assets/{hooks-EhdE0h-7.js → hooks-DwArKZRm.js} +1 -1
- package/dist/client/assets/{hosting-tab-DYQ8Rh0p.js → hosting-tab-BjO3qC08.js} +1 -1
- package/dist/client/assets/{index-DTpUqPGy.js → index-BPjd7Fa5.js} +1 -1
- package/dist/client/assets/{index-BSB_rTjt.js → index-BWlAD4Il.js} +7 -7
- package/dist/client/assets/{index-XxU95hLt.js → index-BhbrnC4j.js} +1 -1
- package/dist/client/assets/{index-B_PnK48y.js → index-BkCEfktg.js} +1 -1
- package/dist/client/assets/{index-DXDhcB-_.js → index-CtR_rkl8.js} +1 -1
- package/dist/client/assets/{index-njvL_iv-.js → index-CuEniakk.js} +5 -5
- package/dist/client/assets/{index-e1yVTHen.js → index-DHli4OJD.js} +1 -1
- package/dist/client/assets/{index-ziMCET_V.js → index-DwFqKD4D.js} +1 -1
- package/dist/client/assets/{index-BnaWJdfu.js → index-eUVJhFEB.js} +1 -1
- package/dist/client/assets/{index-CiP0VfIv.css → index-kzZCkC89.css} +1 -1
- package/dist/client/assets/{index-redirect-DcvvF4me.js → index-redirect-BsHoZbs8.js} +1 -1
- package/dist/client/assets/{infra-billing-zFBwV-Bi.js → infra-billing-CIPoZsfw.js} +1 -1
- package/dist/client/assets/{input-CCmRphpL.js → input-B2d8pbq0.js} +1 -1
- package/dist/client/assets/{integration-icon-CLm79Cz9.js → integration-icon-lEisOJE0.js} +1 -1
- package/dist/client/assets/{invite-member-dialog-BWEp7j-t.js → invite-member-dialog-CAqnpZ1B.js} +1 -1
- package/dist/client/assets/{label-jr1tiCXK.js → label-Dj9n2KWw.js} +1 -1
- package/dist/client/assets/{layout-CuYgYf2e.js → layout-pJ9WPLAN.js} +1 -1
- package/dist/client/assets/{login-BGhHR9SE.js → login-BtEGN9kh.js} +1 -1
- package/dist/client/assets/{markdown-MMd0qT30.js → markdown-BYs65uiN.js} +1 -1
- package/dist/client/assets/{mcp-oauth-B5cJEXYr.js → mcp-oauth-tpftyvwO.js} +1 -1
- package/dist/client/assets/{members-CpLGPdSP.js → members-BTLsFLZ0.js} +1 -1
- package/dist/client/assets/{monaco-editor-C_3KWawd.js → monaco-editor-BiUVO8An.js} +1 -1
- package/dist/client/assets/{monitoring-stats-row-DJlyss5H.js → monitoring-stats-row-DIS2Ng3n.js} +1 -1
- package/dist/client/assets/{multi-select-DFfNcFAX.js → multi-select-CzdqhztJ.js} +1 -1
- package/dist/client/assets/{oauth-callback-DRLYAO9G.js → oauth-callback-DXe8PVwE.js} +1 -1
- package/dist/client/assets/{oauth-callback-ai-provider-Vj5hLNxZ.js → oauth-callback-ai-provider-Bsf8PW_9.js} +1 -1
- package/dist/client/assets/{onboarding-INsGyMnf.js → onboarding-CDgoW0pS.js} +1 -1
- package/dist/client/assets/{org-layout-C86xmjPw.js → org-layout-lclG8H1X.js} +1 -1
- package/dist/client/assets/{organization-choice-BxYiuqxF.js → organization-choice-CCsvXCVj.js} +1 -1
- package/dist/client/assets/{orgs-Bogprpnh.js → orgs-BFtrEspw.js} +1 -1
- package/dist/client/assets/{page-seo-form-B49U1eCV.js → page-seo-form-k3DvmPXi.js} +1 -1
- package/dist/client/assets/{popover-cjpdW0PR.js → popover-BLouf8R5.js} +1 -1
- package/dist/client/assets/{post-calendar-Z98btd7F.js → post-calendar-nMyVgAGR.js} +1 -1
- package/dist/client/assets/{post-editor-RYd6MZIf.js → post-editor-BPKO1Xmm.js} +1 -1
- package/dist/client/assets/{primitives-CYUQQWQi.js → primitives-DIn583iu.js} +1 -1
- package/dist/client/assets/{profile-TFt2hVsu.js → profile-8I31Lkkz.js} +1 -1
- package/dist/client/assets/{project-app-view-BHLllTKH.js → project-app-view-DLbH_B-S.js} +1 -1
- package/dist/client/assets/{prompts-CjUUqHWf.js → prompts-Bexe0hSI.js} +1 -1
- package/dist/client/assets/record-editor-CUEBm5uF.js +1 -0
- package/dist/client/assets/{redirect-editor-BcD4Ju-C.js → redirect-editor-DEIkb4ZD.js} +1 -1
- package/dist/client/assets/registry-C-rbq1xD.js +2 -0
- package/dist/client/assets/{registry-layout-CBdcAHJ8.js → registry-layout-DfnpYXYo.js} +1 -1
- package/dist/client/assets/{reports-BjRZn6gZ.js → reports-C_Iv8HvU.js} +1 -1
- package/dist/client/assets/{require-capability-l2lCTIGp.js → require-capability-DU1QAieO.js} +1 -1
- package/dist/client/assets/{required-auth-layout--fQKy98Q.js → required-auth-layout-XmkPJ52B.js} +1 -1
- package/dist/client/assets/{reset-password-BRKCCVlU.js → reset-password-CWh5Gdcr.js} +1 -1
- package/dist/client/assets/{review-settings-Cyt_g6jL.js → review-settings-B8mMOsOP.js} +1 -1
- package/dist/client/assets/{roles-ByxJJBrB.js → roles-Cw96Wn1G.js} +1 -1
- package/dist/client/assets/{schema-BsZ1HkQH.js → schema-B5fnKlHk.js} +1 -1
- package/dist/client/assets/{scroll-area-jAQrzpp2.js → scroll-area-bf_SAd7o.js} +1 -1
- package/dist/client/assets/{search-input-C15FIKPL.js → search-input-DwyuZ_4a.js} +1 -1
- package/dist/client/assets/{secrets-DyE8liHV.js → secrets-CaLbVXxE.js} +1 -1
- package/dist/client/assets/{sections-editor-Cx_CzMX5.js → sections-editor-DUyabDLF.js} +1 -1
- package/dist/client/assets/{select-Bg-S5PZO.js → select-CmM2ytba.js} +1 -1
- package/dist/client/assets/{select-model-5Xzal1s4.js → select-model-DsvUVXBH.js} +1 -1
- package/dist/client/assets/{self-tool-result-osA4F31H.js → self-tool-result-C0cbe0zd.js} +1 -1
- package/dist/client/assets/{seo-editor-CwIeX_yG.js → seo-editor-nln9KG1F.js} +1 -1
- package/dist/client/assets/{settings-layout-B4n75gy7.js → settings-layout-BnYfqMlI.js} +1 -1
- package/dist/client/assets/{shell-controls-Cn32tr22.js → shell-controls-Bnw3_sbs.js} +1 -1
- package/dist/client/assets/{shell-layout-CoDkvfyR.js → shell-layout-Vi7dV7Tx.js} +1 -1
- package/dist/client/assets/{skill-preview-BpS1_5XY.js → skill-preview-D2ESeOXu.js} +1 -1
- package/dist/client/assets/{skills-8Vq6CVxq.js → skills-Btmp4dlw.js} +1 -1
- package/dist/client/assets/{spinner-D9ug9Q1y.js → spinner-DIj1Go6P.js} +1 -1
- package/dist/client/assets/{sso-CGEpeY_P.js → sso-qzDzZoOE.js} +1 -1
- package/dist/client/assets/{store-6m9JBKBn.js → store-BTrvNs7j.js} +1 -1
- package/dist/client/assets/store-registry-AWG9Gyro.js +2 -0
- package/dist/client/assets/{super-agent-icon-D-3T1HXs.js → super-agent-icon-C7NH1oj0.js} +1 -1
- package/dist/client/assets/{switch-DBban6IE.js → switch-CNDFjuCH.js} +1 -1
- package/dist/client/assets/{synced-repos-H3jyZPic.js → synced-repos-DOekzSvu.js} +1 -1
- package/dist/client/assets/{table-CAOEHHPQ.js → table-uC7dq7Qx.js} +1 -1
- package/dist/client/assets/{tabs-CvrmBfQO.js → tabs-C3hyhgOx.js} +1 -1
- package/dist/client/assets/{task-board-CTg_E5Fs.js → task-board--321T69G.js} +1 -1
- package/dist/client/assets/{tasks-C9kEnEiV.js → tasks-D3pnNEuI.js} +1 -1
- package/dist/client/assets/{textarea-CyDCIDOx.js → textarea-BR3Z3FW5.js} +1 -1
- package/dist/client/assets/{thread-route-COH2-gRV.js → thread-route-CI9Oyaed.js} +1 -1
- package/dist/client/assets/{toggle-group-1Jrd7Xpn.js → toggle-group-BFZvVfAz.js} +1 -1
- package/dist/client/assets/{toolbar-_C8oY14e.js → toolbar-DK9YZczJ.js} +1 -1
- package/dist/client/assets/{track-BK5moGgb.js → track-C2sql3Ri.js} +1 -1
- package/dist/client/assets/{types-FUTmbzUT.js → types-FOnqs_ep.js} +1 -1
- package/dist/client/assets/{use-ai-providers-uMQb3FdW.js → use-ai-providers-Bm-sHcqw.js} +1 -1
- package/dist/client/assets/{use-api-keys-C45qY1K8.js → use-api-keys-FRwuUb-z.js} +1 -1
- package/dist/client/assets/{use-automations-DY5_FOmk.js → use-automations-BBJJLcRi.js} +1 -1
- package/dist/client/assets/{use-autosave-D-GAQv5-.js → use-autosave-D3jq2t0Z.js} +1 -1
- package/dist/client/assets/{use-connection-Dh_bIzzB.js → use-connection-DrhFr-BW.js} +1 -1
- package/dist/client/assets/{use-copy-CmPdqNRj.js → use-copy-Ccsu-LzF.js} +1 -1
- package/dist/client/assets/{use-create-virtual-mcp-Dz8Drv5c.js → use-create-virtual-mcp-C26cIWFm.js} +1 -1
- package/dist/client/assets/{use-debounced-autosave-Dj_RFaNt.js → use-debounced-autosave-bJxU4-DP.js} +1 -1
- package/dist/client/assets/{use-debounced-value-BcvP9lXD.js → use-debounced-value-C-4MWtE7.js} +1 -1
- package/dist/client/assets/{use-decopilot-events-CQuUMu-T.js → use-decopilot-events-AJSxmtjR.js} +1 -1
- package/dist/client/assets/{use-delete-connection-CFL69P-u.js → use-delete-connection-CHfcT2G2.js} +1 -1
- package/dist/client/assets/{use-deployment-admin-DfO6Vw2T.js → use-deployment-admin-LcZqRkfE.js} +1 -1
- package/dist/client/assets/{use-destination-route-B1mohgaf.js → use-destination-route-DDLoaveW.js} +1 -1
- package/dist/client/assets/{use-file-configs-ChX0Q-qZ.js → use-file-configs-6uuFnaeT.js} +1 -1
- package/dist/client/assets/{use-infinite-scroll-C0bcw_ds.js → use-infinite-scroll-DR2K3ike.js} +1 -1
- package/dist/client/assets/{use-join-requests-mjq6Qeh_.js → use-join-requests-BX9Sap62.js} +1 -1
- package/dist/client/assets/{use-mcp-auth-status-CyiJec79.js → use-mcp-auth-status-DEiewDKN.js} +1 -1
- package/dist/client/assets/{use-mcp-client-BPQGAz1L.js → use-mcp-client-BbnLyE8Y.js} +1 -1
- package/dist/client/assets/{use-mcp-tools-B1nBebmG.js → use-mcp-tools-DAOq320g.js} +1 -1
- package/dist/client/assets/{use-members-Dc-_EVO5.js → use-members-ymHQ6DPO.js} +1 -1
- package/dist/client/assets/{use-navigate-to-agent-CfRCE8Wt.js → use-navigate-to-agent-DIKXG43X.js} +1 -1
- package/dist/client/assets/{use-org-auth-client-BG5CQ5ml.js → use-org-auth-client-B2Dtccrj.js} +1 -1
- package/dist/client/assets/{use-org-repo-syncs-Dmq6Cu1Y.js → use-org-repo-syncs-BraC28gq.js} +1 -1
- package/dist/client/assets/{use-org-sso-Du7xcTXp.js → use-org-sso-DqX_yfsK.js} +1 -1
- package/dist/client/assets/{use-organization-roles-GK60Cru6.js → use-organization-roles-BQf6ZfaR.js} +1 -1
- package/dist/client/assets/{use-organization-settings-D4VQHySG.js → use-organization-settings-mos5d4Yb.js} +1 -1
- package/dist/client/assets/{use-panel-navigate-DWQx8OEi.js → use-panel-navigate-Dzed7hXE.js} +1 -1
- package/dist/client/assets/{use-registry-connections-zLS0bbue.js → use-registry-connections-C1MprIyF.js} +1 -1
- package/dist/client/assets/{use-secrets-Bpxg79PA.js → use-secrets-MfuKxy-T.js} +1 -1
- package/dist/client/assets/{use-section-preview-base-ihTnkgdH.js → use-section-preview-base-CJFnX7tM.js} +1 -1
- package/dist/client/assets/{use-status-sounds-CkZXTqrB.js → use-status-sounds-9ZjtdYdG.js} +1 -1
- package/dist/client/assets/{use-tags-Bl8RkIGi.js → use-tags-FMu3sWNF.js} +1 -1
- package/dist/client/assets/{use-view-mode-goCGZ2jO.js → use-view-mode-CB9pJw4V.js} +1 -1
- package/dist/client/assets/{use-virtual-mcp-DOjC0pS0.js → use-virtual-mcp-CUrHAeNi.js} +1 -1
- package/dist/client/assets/useInfiniteQuery-UPxaQjph.js +1 -0
- package/dist/client/assets/useSuspenseInfiniteQuery-91qpgWTX.js +1 -0
- package/dist/client/assets/{users-OV8pJiY0.js → users-mfz705Ex.js} +1 -1
- package/dist/client/assets/{variant-calendar-ChVU0zWF.js → variant-calendar-DNADnJDP.js} +1 -1
- package/dist/client/assets/{view-mode-toggle-02-6otvj.js → view-mode-toggle-CliygtAG.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-DD-wTaHw.js +0 -1
- package/dist/client/assets/registry-BLiW5cT7.js +0 -2
- package/dist/client/assets/store-registry-DShejGKc.js +0 -2
- package/dist/client/assets/useInfiniteQuery-DlP2r0mK.js +0 -1
- package/dist/client/assets/useSuspenseInfiniteQuery-By9ZBJLW.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();ch1=mG("site-diagnostics_"),Gs6=ch1.is,Js6=ch1.get,dh1=mG("commerce-discovery_"),Ws6=dh1.is,T60=dh1.get;jB={AGENT_MANAGER:mG("studio-agent-manager_"),AUTOMATION_MANAGER:mG("studio-automation-manager_"),CONNECTION_MANAGER:mG("studio-connection-manager_"),API_KEY_MANAGER:mG("studio-api-key-manager_"),STORE_MANAGER:mG("studio-store-manager_"),BRAND_MANAGER:mG("studio-brand-manager_"),USAGE_MANAGER:mG("studio-usage-manager_")},_Q={AGENT_MANAGER:jB.AGENT_MANAGER.get,AUTOMATION_MANAGER:jB.AUTOMATION_MANAGER.get,CONNECTION_MANAGER:jB.CONNECTION_MANAGER.get,API_KEY_MANAGER:jB.API_KEY_MANAGER.get,STORE_MANAGER:jB.STORE_MANAGER.get,BRAND_MANAGER:jB.BRAND_MANAGER.get,USAGE_MANAGER:jB.USAGE_MANAGER.get}});function oh1($){return $.toLowerCase().replace(/[^a-z0-9]/g,"")}function Yy8($){return oh1($).includes("deepresearch")}function rh1($){let Z=oh1($);if(Z.includes("deepresearch"))return!1;return Gy8.some((X)=>Z.includes(X))}function Jy8($){return $.asyncResearch!==!0&&rh1($.modelId)}function Wy8($){return $.asyncResearch===!0||Yy8($.modelId)||rh1($.modelId)}function ib($,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 sh1($,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=ib(Y,Q.id,ax8[G]??[]);if(!X.chat.smart)X.chat.smart=ib(Y,Q.id,ex8[G]??[]);if(!X.chat.thinking)X.chat.thinking=ib(Y,Q.id,$y8[G]??[]);if(!X.image)X.image=ib(Y,Q.id,Zy8[G]??[],(J)=>J.capabilities?.includes("image")===!0);if(!X.webSearch)X.webSearch=ib(Y,Q.id,Xy8[G]??[],Jy8);if(!X.deepResearch)X.deepResearch=ib(Y,Q.id,Qy8[G]??[],Wy8)}return X}var ax8,ex8,$y8,Zy8,Xy8,Qy8,Gy8;var ah1=D(()=>{ax8={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"]},ex8={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"]},$y8={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"]},Zy8={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"]},Xy8={openrouter:["perplexity/sonar","perplexity/sonar-pro"],deco:["perplexity/sonar","perplexity/sonar-pro"]},Qy8={openrouter:["perplexity/deep-research","perplexity/sonar-pro"],deco:["perplexity/deep-research","perplexity/sonar-pro"]};Gy8=["sonar","searchpreview","online"]});function R60($){if(!$)return;let Z={};for(let X in $){let Q=$[X];if(typeof Q==="object"&&Q!==null){let Y={};for(let G of Ky8)if(G in Q)Y[G]=Q[G];Z[X]=Y}}return Object.keys(Z).length>0?Z:void 0}var Ky8;var eh1=D(()=>{Ky8=["usage","cost","model"]});var v8=D(()=>{Z40();th1();ah1();eh1()});function I60($){return $.toLowerCase().trim().replace(/\//g,"-").replace(/[^a-z0-9\s_-]+/g,"").replace(/[\s_-]+/g,"-").replace(/^-+|-+$/g,"")}function zB($){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 I60(Q)}catch{return I60($.connection_url)}if($.title)return I60($.title);return $.id??"unknown"}var q60=()=>{};var pb=300000,M60=5000,k60=1e4,Ig0=3,qg0=30000,$u1=65000,V60=1000,nb=3,Zu1=5,Xu1=60000,Qu1=300000,Mg0=60000;function Yu1(){if(SF.size<V60)return;let $=null,Z=1/0;for(let[X,Q]of SF)if(Q.lastFailureAt<Z)Z=Q.lastFailureAt,$=X;if($)SF.delete($)}function Gu1($){let Z=SF.get($);if(!Z)return Yu1(),SF.set($,{consecutiveFailures:1,disabled:!1,lastFailureAt:Date.now()}),{consecutiveFailures:1,thresholdCrossed:1>=nb};return Z.consecutiveFailures++,Z.lastFailureAt=Date.now(),{consecutiveFailures:Z.consecutiveFailures,thresholdCrossed:Z.consecutiveFailures>=nb}}function kg0($){let Z=SF.get($);if(Z){Z.disabled=!0;return}Yu1(),SF.set($,{consecutiveFailures:nb,disabled:!0,lastFailureAt:Date.now()})}function Ju1($){return SF.get($)?.disabled??!1}function Wu1($){SF.delete($)}var SF;var Ku1=D(()=>{SF=new Map});import{sql as c$}from"kysely";function Fu1($){if($.length===0)return null;let Z=$[0];if($.length===1&&Fy8.has(Z))return c$.ref(Z);if($.length===2&&Hu1.has(Z)){let X=$[1];return c$`${c$.ref(Z)}->>${c$.lit(X)}`}if($.length>2&&Hu1.has(Z)){let X=`{${$.slice(1).join(",")}}`;return c$`${c$.ref(Z)}#>>${c$.lit(X)}`}return null}function Nu1($){if("conditions"in $){let{operator:G,conditions:J}=$;if(J.length===0)return c$`true`;let W=J.map((K)=>Nu1(K));switch(G){case"and":return c$`(${c$.join(W,c$` AND `)})`;case"or":return c$`(${c$.join(W,c$` OR `)})`;case"not":return c$`NOT (${c$.join(W,c$` AND `)})`;default:return c$`true`}}let{field:Z,operator:X,value:Q}=$,Y=Fu1(Z);if(!Y)return c$`true`;switch(X){case"eq":return Q===null?c$`${Y} IS NULL`:c$`${Y} = ${c$.val(Q)}`;case"gt":return c$`${Y} > ${c$.val(Q)}`;case"gte":return c$`${Y} >= ${c$.val(Q)}`;case"lt":return c$`${Y} < ${c$.val(Q)}`;case"lte":return c$`${Y} <= ${c$.val(Q)}`;case"in":if(!Array.isArray(Q)||Q.length===0)return c$`false`;return c$`${Y} IN (${c$.join(Q.map((G)=>c$.val(G)))})`;case"like":return c$`${Y} ILIKE ${c$.val(Q)}`;case"contains":{let G=String(Q).replace(/[%_\\]/g,"\\$&");return c$`${Y} ILIKE ${c$.val(`%${G}%`)}`}default:return c$`true`}}class Lm{db;vault;constructor($,Z){this.db=$;this.vault=Z}async create($){let Z=$.id??J8("conn"),X=new Date().toISOString(),Q=await this.db.selectFrom("connections").select("organization_id").where("id","=",Z).executeTakeFirst();if(Q){if(Q.organization_id!==$.organization_id)throw Error("Connection ID already exists");return this.update(Z,$)}let Y=zB($),G=await this.serializeConnection({...$,id:$.id??Z,slug:Y,status:"active",created_at:X,updated_at:X}),J;try{J=await this.db.insertInto("connections").values(G).returningAll().executeTakeFirst()}catch(W){if(W instanceof Error&&(W.message.includes("duplicate key")||W.message.includes("unique constraint")))throw Error("Connection ID already exists");throw W}if(!J)throw Error(`Failed to create connection with id: ${Z}`);return this.deserializeConnection(J)}async createNew($){let Z=$.id??J8("conn"),X=new Date().toISOString(),Q=zB($),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=iG($);if(X)return nh1(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 findBySanitizedId($){let Z=$.replace(/-/g,"_"),X=await this.db.selectFrom("connections").selectAll().where(c$`replace(id, '-', '_')`,"=",Z).where("id","!=",$).executeTakeFirst();return X?this.deserializeConnection(X):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(Nu1(Z.where));let G=(await this.db.selectFrom(X.as("filtered")).select(c$`count(*)::int`.as("count")).executeTakeFirst())?.count??0;if(Z?.orderBy&&Z.orderBy.length>0)for(let K of Z.orderBy){let H=Fu1(K.field);if(!H)continue;let F=K.direction==="desc"?c$`desc`:c$`asc`,N=K.nulls==="first"?c$`nulls first`:c$`nulls last`;X=X.orderBy(c$`${H} ${F} ${N}`)}if(Z?.limit!==void 0)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){let{id:X,organization_id:Q,created_by:Y,created_at:G,...J}=Z;if(Z=J,Object.keys(Z).length===0){let N=await this.findById($);if(!N)throw Error("Connection not found");return N}let W={...Z},K=await this.db.selectFrom("connections").select(["app_name","connection_url","title"]).where("id","=",$).executeTakeFirst();if(K){let N=(U)=>Z[U]===void 0?K[U]:Z[U];W.slug=zB({app_name:N("app_name"),connection_url:N("connection_url"),title:N("title"),id:$})}let H=await this.serializeConnection({...W,updated_at:new Date().toISOString()}),F=await this.db.updateTable("connections").set(H).where("id","=",$).returningAll().executeTakeFirst();if(!F)throw Error("Connection not found after update");return this.deserializeConnection(F)}async isReferencedByThread($){return await this.db.selectFrom("threads").select("id").where(c$`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 db(X.connection_url))return{healthy:!1,latencyMs:Date.now()-Q};let G=X.connection_headers,J=await EB()(X.connection_url,{method:"POST",signal:AbortSignal.timeout(1e4),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})});return{healthy:J.ok||J.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(nW(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(Hy8.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(Ju1($.id))return;if($.status!=="active"){kg0($.id);return}let{thresholdCrossed:Q}=Gu1($.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(),kg0($.id),console.error(`Disabled ${X} after ${nb} 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)Wu1($.id);let Y=null;if($.connection_headers)try{let J=JSON.parse($.connection_headers);if(nW(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 Hy8,Fy8,Hu1;var Vg0=D(()=>{oW();_w();w7();v8();q60();Ku1();Hy8=["connection_headers","oauth_config","configuration_scopes","metadata","bindings"],Fy8=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"]),Hu1=new Set(["metadata","configuration_scopes","bindings"])});import{createHash as Ny8,randomBytes as Uy8,timingSafeEqual as _s6}from"crypto";function Oy8($){return $.toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function Cg0($){return Ny8("sha256").update($).digest("hex")}function Ou1($){let Z=Sg0.length+1,X=Z+Bu1;if(!$.startsWith(`${Sg0}_`)||$.length<=X+1||$[X]!=="_")return null;let Q=$.slice(Z,X),Y=$.slice(X+1);if(!Uu1.test(Q)||!Uu1.test(Y))return null;return Q}function Du1(){let $=Oy8(Uy8(By8)),Z=$.slice(0,Bu1),X=`${Sg0}_${Z}_${$}`;return{plaintext:X,prefix:Z,hash:Cg0(X)}}var Sg0="stv",By8=32,Bu1=12,Uu1;var Lu1=D(()=>{Uu1=/^[A-Za-z0-9_-]+$/});function wu1($){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 _g0{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=Du1(),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:J8("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:wu1(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?wu1(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=Ou1($);if(!Z)return null;let X=Cg0($),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:J8("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 S60="credential:access-token:read",C60="credential:configuration:read";var _60=D(()=>{w7();Lu1()});function Eu1($,Z){let X=!1,Q={...$},Y=$.pinnedViews;if(Array.isArray(Y)){let W=Y.filter((K)=>K.connectionId!==Z);if(W.length!==Y.length)X=!0,Q.pinnedViews=W.length>0?W:null}let G=$.homeTile;if(G&&G.connectionId===Z)X=!0,Q.homeTile=null;let J=$.homeTiles;if(Array.isArray(J)){let W=J.filter((K)=>K.connectionId!==Z);if(W.length!==J.length)X=!0,Q.homeTiles=W.length>0?W:null}return{ui:Q,changed:X}}class tb{db;constructor($){this.db=$}async create($,Z,X,Q){let Y=Q?.id??J8("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:J8("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=iG($);if(X)return{...Rg0(Z??X),pinned:!1,connections:[]};let Q=A60($);if(Q)return{...lh1(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:J8("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??null;if(!G)continue;let{ui:J,changed:W}=Eu1(G,Z);if(!W)continue;let K={...Y,ui:J};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?eb0(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 ju1($){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 vg0=D(()=>{w7();v8()});function bw($){let Z=String($??"");if(Z&&!Z.includes("T"))return Z.replace(" ","T")+"Z";return Z}function j$($){return $.replace(/\0/g,"").replace(/\\/g,"\\\\").replace(/'/g,"''")}function c8($){let Z=Number($??0);return Number.isFinite(Z)?Z:0}function Ly8($){if(!Dy8.has($))throw Error(`Invalid groupByColumn: ${$}`);return $}function fg0($){if(!wy8.test($))throw Error(`Invalid JSONPath: ${$}`);if($.startsWith("$."))return $;if($.startsWith("."))return`$${$}`;return`$.${$}`}function gg0($){return $.replace(/^\$\./,"").split(".").map((X)=>`'${j$(X)}'`).join(", ")}function zy8($){let Z=Ey8.exec($);if(!Z||!Z[1]||!Z[2])throw Error(`Invalid interval: ${$}`);let X=parseInt(Z[1],10),Q=Z[2],Y=jy8[Q];if(X<1||X>Y)throw Error(`Invalid interval amount: ${X}${Q} (max ${Y}${Q})`);return{amount:X,unit:Q}}function PB($,Z,X="timestamp"){let{amount:Q,unit:Y}=zy8($),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 wm($,Z,X){if(X==="duckdb")return`json_extract_string(${$}, '${Z}')`;let Q=gg0(Z);return`JSONExtractString(${$}, ${Q})`}function Py8($,Z,X){if(X==="duckdb")return`CAST(json_extract_string(${$}, '${Z}') AS DOUBLE)`;let Q=gg0(Z);return`JSONExtractFloat(${$}, ${Q})`}function zu1($,Z,X){if(X==="duckdb")return`TRY_CAST(json_extract_string(${$}, '${Z}') AS DOUBLE)`;let Q=gg0(Z);return`toFloat64OrZero(JSONExtractString(${$}, ${Q}))`}function bg0($){if($===null||$===void 0)return{};if(typeof $==="object")return $;let Z=String($);try{return JSON.parse(Z)}catch{return{_decocms_truncated:Z}}}function xg0($){return{id:String($.id??""),organizationId:String($.organization_id??""),connectionId:String($.connection_id??""),toolName:String($.tool_name??""),input:bg0($.input),output:bg0($.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?bg0($.properties):null}}function Ru1($,Z){let X=[];if($.properties)for(let[Q,Y]of Object.entries($.properties)){let G=j$(Q),J=j$(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=j$(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=j$(Q),J=j$(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=j$(Q),J=j$(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 Au1($,Z){let X=[];if(nG(X,Z?.startDate,$),!Z)return X;if(Z.connectionIds?.length){let Q=Z.connectionIds.map((Y)=>`'${j$(Y)}'`).join(",");X.push(`connection_id IN (${Q})`)}if(Z.toolNames?.length){let Q=Z.toolNames.map((Y)=>`'${j$(Y)}'`).join(",");X.push(`tool_name IN (${Q})`)}if(Z.virtualMcpIds?.length){let Q=Z.virtualMcpIds.map((Y)=>`'${j$(Y)}'`).join(",");X.push(`virtual_mcp_id IN (${Q})`)}if(Z.endDate)X.push(pG(Z.endDate,$));if(Z.propertyFilters)X.push(...Ru1(Z.propertyFilters,$));return X}function Tu1($,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 pG($,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 nG($,Z,X,Q="timestamp"){if(Z)$.push(Tu1(Z,X,Q));else if(X==="clickhouse")$.push(Tu1(new Date(Date.now()-Ay8),X,Q))}class hg0{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 = '${j$($.organizationId)}'`];if($.connectionId)X.push(`connection_id = '${j$($.connectionId)}'`);if($.excludeConnectionIds?.length){let U=$.excludeConnectionIds.map((B)=>`'${j$(B)}'`).join(",");X.push(`connection_id NOT IN (${U})`)}if($.virtualMcpId)X.push(`virtual_mcp_id = '${j$($.virtualMcpId)}'`);if($.toolName)X.push(`tool_name = '${j$($.toolName)}'`);if($.isError!==void 0)X.push(`is_error = ${$.isError?1:0}`);if(nG(X,$.startDate,this.dialect),$.endDate)X.push(pG($.endDate,this.dialect));if($.propertyFilters)X.push(...Ru1($.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 ${Pu1}, count(*) OVER () AS _total FROM ${Z} WHERE ${J} ORDER BY timestamp DESC LIMIT ${Y} OFFSET ${G}`,B=await this.engine.query(U);if(B.length===0)return{logs:[],total:0};let O=Number(B[0]._total??0);return{logs:B.map(xg0),total:O}}let W=`SELECT count(*) AS total FROM ${Z} WHERE ${J}`,K=`SELECT ${Pu1} 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(xg0),total:N}}async getById($,Z){if(!$||!Z)return null;let Q=`SELECT * FROM ${this.sourceFactory($)} WHERE organization_id = '${j$($)}' AND id = '${j$(Z)}' LIMIT 1`,Y=await this.engine.query(Q);if(Y.length===0)return null;return xg0(Y[0])}async getStats($){if(!$.organizationId)throw Error("organizationId is required");let Z=this.sourceFactory($.organizationId,{startDate:$.startDate,endDate:$.endDate}),X=[`organization_id = '${j$($.organizationId)}'`];if(nG(X,$.startDate,this.dialect),$.endDate)X.push(pG($.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 = '${j$($.organizationId)}'`,"type = 'tool_call'"];if($.filters?.virtualMcpIds?.length){let J=$.filters.virtualMcpIds.map((W)=>`'${j$(W)}'`).join(",");X.push(`virtual_mcp_id IN (${J})`)}if($.filters?.excludeConnectionIds?.length){let J=$.filters.excludeConnectionIds.map((W)=>`'${j$(W)}'`).join(",");X.push(`connection_id NOT IN (${J})`)}if(nG(X,$.startDate,this.dialect),$.endDate)X.push(pG($.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=PB($.interval,X,"timestamp"),J=(E)=>`coalesce(${zu1("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 = '${j$($.organizationId)}'`,`connection_id = '${j$($.connectionId)}'`];if(nG(F,$.startDate,X),$.endDate)F.push(pG($.endDate,X));if($.userIds?.length){let E=$.userIds.slice(0,100).map((j)=>`'${j$(j)}'`).join(",");F.push(`user_id IN (${E})`)}let N=F.join(" AND "),U=Math.min(Math.max(1,Math.floor($.topN??5)),20),B=`${W} AS calls,
|
|
109
|
+
`.trim();ch1=mG("site-diagnostics_"),Gs6=ch1.is,Js6=ch1.get,dh1=mG("commerce-discovery_"),Ws6=dh1.is,T60=dh1.get;jB={AGENT_MANAGER:mG("studio-agent-manager_"),AUTOMATION_MANAGER:mG("studio-automation-manager_"),CONNECTION_MANAGER:mG("studio-connection-manager_"),API_KEY_MANAGER:mG("studio-api-key-manager_"),STORE_MANAGER:mG("studio-store-manager_"),BRAND_MANAGER:mG("studio-brand-manager_"),USAGE_MANAGER:mG("studio-usage-manager_")},_Q={AGENT_MANAGER:jB.AGENT_MANAGER.get,AUTOMATION_MANAGER:jB.AUTOMATION_MANAGER.get,CONNECTION_MANAGER:jB.CONNECTION_MANAGER.get,API_KEY_MANAGER:jB.API_KEY_MANAGER.get,STORE_MANAGER:jB.STORE_MANAGER.get,BRAND_MANAGER:jB.BRAND_MANAGER.get,USAGE_MANAGER:jB.USAGE_MANAGER.get}});function oh1($){return $.toLowerCase().replace(/[^a-z0-9]/g,"")}function Yy8($){return oh1($).includes("deepresearch")}function rh1($){let Z=oh1($);if(Z.includes("deepresearch"))return!1;return Gy8.some((X)=>Z.includes(X))}function Jy8($){return $.asyncResearch!==!0&&rh1($.modelId)}function Wy8($){return $.asyncResearch===!0||Yy8($.modelId)||rh1($.modelId)}function ib($,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 sh1($,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=ib(Y,Q.id,ax8[G]??[]);if(!X.chat.smart)X.chat.smart=ib(Y,Q.id,ex8[G]??[]);if(!X.chat.thinking)X.chat.thinking=ib(Y,Q.id,$y8[G]??[]);if(!X.image)X.image=ib(Y,Q.id,Zy8[G]??[],(J)=>J.capabilities?.includes("image")===!0);if(!X.webSearch)X.webSearch=ib(Y,Q.id,Xy8[G]??[],Jy8);if(!X.deepResearch)X.deepResearch=ib(Y,Q.id,Qy8[G]??[],Wy8)}return X}var ax8,ex8,$y8,Zy8,Xy8,Qy8,Gy8;var ah1=D(()=>{ax8={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"]},ex8={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"]},$y8={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"]},Zy8={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"]},Xy8={openrouter:["perplexity/sonar","perplexity/sonar-pro"],deco:["perplexity/sonar","perplexity/sonar-pro"]},Qy8={openrouter:["perplexity/deep-research","perplexity/sonar-pro"],deco:["perplexity/deep-research","perplexity/sonar-pro"]};Gy8=["sonar","searchpreview","online"]});function R60($){if(!$)return;let Z={};for(let X in $){let Q=$[X];if(typeof Q==="object"&&Q!==null){let Y={};for(let G of Ky8)if(G in Q)Y[G]=Q[G];Z[X]=Y}}return Object.keys(Z).length>0?Z:void 0}var Ky8;var eh1=D(()=>{Ky8=["usage","cost","model"]});var v8=D(()=>{Z40();th1();ah1();eh1()});function I60($){return $.toLowerCase().trim().replace(/\//g,"-").replace(/[^a-z0-9\s_-]+/g,"").replace(/[\s_-]+/g,"-").replace(/^-+|-+$/g,"")}function zB($){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 I60(Q)}catch{return I60($.connection_url)}if($.title)return I60($.title);return $.id??"unknown"}var q60=()=>{};var pb=300000,M60=5000,k60=1e4,Ig0=3,qg0=30000,$u1=65000,V60=1000,nb=3,Zu1=5,Xu1=60000,Qu1=300000,Mg0=60000;function Yu1(){if(SF.size<V60)return;let $=null,Z=1/0;for(let[X,Q]of SF)if(Q.lastFailureAt<Z)Z=Q.lastFailureAt,$=X;if($)SF.delete($)}function Gu1($){let Z=SF.get($);if(!Z)return Yu1(),SF.set($,{consecutiveFailures:1,disabled:!1,lastFailureAt:Date.now()}),{consecutiveFailures:1,thresholdCrossed:1>=nb};return Z.consecutiveFailures++,Z.lastFailureAt=Date.now(),{consecutiveFailures:Z.consecutiveFailures,thresholdCrossed:Z.consecutiveFailures>=nb}}function kg0($){let Z=SF.get($);if(Z){Z.disabled=!0;return}Yu1(),SF.set($,{consecutiveFailures:nb,disabled:!0,lastFailureAt:Date.now()})}function Ju1($){return SF.get($)?.disabled??!1}function Wu1($){SF.delete($)}var SF;var Ku1=D(()=>{SF=new Map});import{sql as c$}from"kysely";function Fu1($){if($.length===0)return null;let Z=$[0];if($.length===1&&Fy8.has(Z))return c$.ref(Z);if($.length===2&&Hu1.has(Z)){let X=$[1];return c$`${c$.ref(Z)}->>${c$.lit(X)}`}if($.length>2&&Hu1.has(Z)){let X=`{${$.slice(1).join(",")}}`;return c$`${c$.ref(Z)}#>>${c$.lit(X)}`}return null}function Nu1($){if("conditions"in $){let{operator:G,conditions:J}=$;if(J.length===0)return c$`true`;let W=J.map((K)=>Nu1(K));switch(G){case"and":return c$`(${c$.join(W,c$` AND `)})`;case"or":return c$`(${c$.join(W,c$` OR `)})`;case"not":return c$`NOT (${c$.join(W,c$` AND `)})`;default:return c$`true`}}let{field:Z,operator:X,value:Q}=$,Y=Fu1(Z);if(!Y)return c$`true`;switch(X){case"eq":return Q===null?c$`${Y} IS NULL`:c$`${Y} = ${c$.val(Q)}`;case"gt":return c$`${Y} > ${c$.val(Q)}`;case"gte":return c$`${Y} >= ${c$.val(Q)}`;case"lt":return c$`${Y} < ${c$.val(Q)}`;case"lte":return c$`${Y} <= ${c$.val(Q)}`;case"in":if(!Array.isArray(Q)||Q.length===0)return c$`false`;return c$`${Y} IN (${c$.join(Q.map((G)=>c$.val(G)))})`;case"like":return c$`${Y} ILIKE ${c$.val(Q)}`;case"contains":{let G=String(Q).replace(/[%_\\]/g,"\\$&");return c$`${Y} ILIKE ${c$.val(`%${G}%`)}`}default:return c$`true`}}class Lm{db;vault;constructor($,Z){this.db=$;this.vault=Z}async create($){let Z=$.id??J8("conn"),X=new Date().toISOString(),Q=await this.db.selectFrom("connections").select("organization_id").where("id","=",Z).executeTakeFirst();if(Q){if(Q.organization_id!==$.organization_id)throw Error("Connection ID already exists");return this.update(Z,$)}let Y=zB($),G=await this.serializeConnection({...$,id:$.id??Z,slug:Y,status:"active",created_at:X,updated_at:X}),J;try{J=await this.db.insertInto("connections").values(G).returningAll().executeTakeFirst()}catch(W){if(W instanceof Error&&(W.message.includes("duplicate key")||W.message.includes("unique constraint")))throw Error("Connection ID already exists");throw W}if(!J)throw Error(`Failed to create connection with id: ${Z}`);return this.deserializeConnection(J)}async createNew($){let Z=$.id??J8("conn"),X=new Date().toISOString(),Q=zB($),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=iG($);if(X)return nh1(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 findBySanitizedId($){let Z=$.replace(/-/g,"_"),X=await this.db.selectFrom("connections").selectAll().where(c$`replace(id, '-', '_')`,"=",Z).where("id","!=",$).executeTakeFirst();return X?this.deserializeConnection(X):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(Nu1(Z.where));let G=(await this.db.selectFrom(X.as("filtered")).select(c$`count(*)::int`.as("count")).executeTakeFirst())?.count??0;if(Z?.orderBy&&Z.orderBy.length>0)for(let K of Z.orderBy){let H=Fu1(K.field);if(!H)continue;let F=K.direction==="desc"?c$`desc`:c$`asc`,N=K.nulls==="first"?c$`nulls first`:c$`nulls last`;X=X.orderBy(c$`${H} ${F} ${N}`)}if(Z?.limit!==void 0)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){let{id:X,organization_id:Q,created_by:Y,created_at:G,...J}=Z;if(Z=J,Object.keys(Z).length===0){let N=await this.findById($);if(!N)throw Error("Connection not found");return N}let W={...Z},K=await this.db.selectFrom("connections").select(["app_name","connection_url","title"]).where("id","=",$).executeTakeFirst();if(K){let N=(U)=>Z[U]===void 0?K[U]:Z[U];W.slug=zB({app_name:N("app_name"),connection_url:N("connection_url"),title:N("title"),id:$})}let H=await this.serializeConnection({...W,updated_at:new Date().toISOString()}),F=await this.db.updateTable("connections").set(H).where("id","=",$).returningAll().executeTakeFirst();if(!F)throw Error("Connection not found after update");return this.deserializeConnection(F)}async isReferencedByThread($){return await this.db.selectFrom("threads").select("id").where(c$`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 db(X.connection_url))return{healthy:!1,latencyMs:Date.now()-Q};let G=X.connection_headers,J=await EB()(X.connection_url,{method:"POST",signal:AbortSignal.timeout(1e4),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})});return{healthy:J.ok||J.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(nW(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(Hy8.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(Ju1($.id))return;if($.status!=="active"){kg0($.id);return}let{thresholdCrossed:Q}=Gu1($.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(),kg0($.id),console.error(`Disabled ${X} after ${nb} 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)Wu1($.id);let Y=null;if($.connection_headers)try{let J=JSON.parse($.connection_headers);if(nW(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 Hy8,Fy8,Hu1;var Vg0=D(()=>{oW();_w();w7();v8();q60();Ku1();Hy8=["connection_headers","oauth_config","configuration_scopes","metadata","bindings"],Fy8=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"]),Hu1=new Set(["metadata","configuration_scopes","bindings"])});import{createHash as Ny8,randomBytes as Uy8,timingSafeEqual as _s6}from"crypto";function Oy8($){return $.toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function Cg0($){return Ny8("sha256").update($).digest("hex")}function Ou1($){let Z=Sg0.length+1,X=Z+Bu1;if(!$.startsWith(`${Sg0}_`)||$.length<=X+1||$[X]!=="_")return null;let Q=$.slice(Z,X),Y=$.slice(X+1);if(!Uu1.test(Q)||!Uu1.test(Y))return null;return Q}function Du1(){let $=Oy8(Uy8(By8)),Z=$.slice(0,Bu1),X=`${Sg0}_${Z}_${$}`;return{plaintext:X,prefix:Z,hash:Cg0(X)}}var Sg0="stv",By8=32,Bu1=12,Uu1;var Lu1=D(()=>{Uu1=/^[A-Za-z0-9_-]+$/});function wu1($){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 _g0{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=Du1(),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:J8("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:wu1(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?wu1(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=Ou1($);if(!Z)return null;let X=Cg0($),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:J8("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 S60="credential:access-token:read",C60="credential:configuration:read";var _60=D(()=>{w7();Lu1()});function Eu1($,Z){let X=!1,Q={...$},Y=$.pinnedViews;if(Array.isArray(Y)){let W=Y.filter((K)=>K.connectionId!==Z);if(W.length!==Y.length)X=!0,Q.pinnedViews=W.length>0?W:null}let G=$.homeTile;if(G&&G.connectionId===Z)X=!0,Q.homeTile=null;let J=$.homeTiles;if(Array.isArray(J)){let W=J.filter((K)=>K.connectionId!==Z);if(W.length!==J.length)X=!0,Q.homeTiles=W.length>0?W:null}return{ui:Q,changed:X}}class tb{db;constructor($){this.db=$}async create($,Z,X,Q){let Y=Q?.id??J8("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,updated_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:J8("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=iG($);if(X)return{...Rg0(Z??X),pinned:!1,connections:[]};let Q=A60($);if(Q)return{...lh1(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:J8("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??null;if(!G)continue;let{ui:J,changed:W}=Eu1(G,Z);if(!W)continue;let K={...Y,ui:J};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?eb0(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 ju1($){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 vg0=D(()=>{w7();v8()});function bw($){let Z=String($??"");if(Z&&!Z.includes("T"))return Z.replace(" ","T")+"Z";return Z}function j$($){return $.replace(/\0/g,"").replace(/\\/g,"\\\\").replace(/'/g,"''")}function c8($){let Z=Number($??0);return Number.isFinite(Z)?Z:0}function Ly8($){if(!Dy8.has($))throw Error(`Invalid groupByColumn: ${$}`);return $}function fg0($){if(!wy8.test($))throw Error(`Invalid JSONPath: ${$}`);if($.startsWith("$."))return $;if($.startsWith("."))return`$${$}`;return`$.${$}`}function gg0($){return $.replace(/^\$\./,"").split(".").map((X)=>`'${j$(X)}'`).join(", ")}function zy8($){let Z=Ey8.exec($);if(!Z||!Z[1]||!Z[2])throw Error(`Invalid interval: ${$}`);let X=parseInt(Z[1],10),Q=Z[2],Y=jy8[Q];if(X<1||X>Y)throw Error(`Invalid interval amount: ${X}${Q} (max ${Y}${Q})`);return{amount:X,unit:Q}}function PB($,Z,X="timestamp"){let{amount:Q,unit:Y}=zy8($),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 wm($,Z,X){if(X==="duckdb")return`json_extract_string(${$}, '${Z}')`;let Q=gg0(Z);return`JSONExtractString(${$}, ${Q})`}function Py8($,Z,X){if(X==="duckdb")return`CAST(json_extract_string(${$}, '${Z}') AS DOUBLE)`;let Q=gg0(Z);return`JSONExtractFloat(${$}, ${Q})`}function zu1($,Z,X){if(X==="duckdb")return`TRY_CAST(json_extract_string(${$}, '${Z}') AS DOUBLE)`;let Q=gg0(Z);return`toFloat64OrZero(JSONExtractString(${$}, ${Q}))`}function bg0($){if($===null||$===void 0)return{};if(typeof $==="object")return $;let Z=String($);try{return JSON.parse(Z)}catch{return{_decocms_truncated:Z}}}function xg0($){return{id:String($.id??""),organizationId:String($.organization_id??""),connectionId:String($.connection_id??""),toolName:String($.tool_name??""),input:bg0($.input),output:bg0($.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?bg0($.properties):null}}function Ru1($,Z){let X=[];if($.properties)for(let[Q,Y]of Object.entries($.properties)){let G=j$(Q),J=j$(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=j$(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=j$(Q),J=j$(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=j$(Q),J=j$(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 Au1($,Z){let X=[];if(nG(X,Z?.startDate,$),!Z)return X;if(Z.connectionIds?.length){let Q=Z.connectionIds.map((Y)=>`'${j$(Y)}'`).join(",");X.push(`connection_id IN (${Q})`)}if(Z.toolNames?.length){let Q=Z.toolNames.map((Y)=>`'${j$(Y)}'`).join(",");X.push(`tool_name IN (${Q})`)}if(Z.virtualMcpIds?.length){let Q=Z.virtualMcpIds.map((Y)=>`'${j$(Y)}'`).join(",");X.push(`virtual_mcp_id IN (${Q})`)}if(Z.endDate)X.push(pG(Z.endDate,$));if(Z.propertyFilters)X.push(...Ru1(Z.propertyFilters,$));return X}function Tu1($,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 pG($,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 nG($,Z,X,Q="timestamp"){if(Z)$.push(Tu1(Z,X,Q));else if(X==="clickhouse")$.push(Tu1(new Date(Date.now()-Ay8),X,Q))}class hg0{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 = '${j$($.organizationId)}'`];if($.connectionId)X.push(`connection_id = '${j$($.connectionId)}'`);if($.excludeConnectionIds?.length){let U=$.excludeConnectionIds.map((B)=>`'${j$(B)}'`).join(",");X.push(`connection_id NOT IN (${U})`)}if($.virtualMcpId)X.push(`virtual_mcp_id = '${j$($.virtualMcpId)}'`);if($.toolName)X.push(`tool_name = '${j$($.toolName)}'`);if($.isError!==void 0)X.push(`is_error = ${$.isError?1:0}`);if(nG(X,$.startDate,this.dialect),$.endDate)X.push(pG($.endDate,this.dialect));if($.propertyFilters)X.push(...Ru1($.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 ${Pu1}, count(*) OVER () AS _total FROM ${Z} WHERE ${J} ORDER BY timestamp DESC LIMIT ${Y} OFFSET ${G}`,B=await this.engine.query(U);if(B.length===0)return{logs:[],total:0};let O=Number(B[0]._total??0);return{logs:B.map(xg0),total:O}}let W=`SELECT count(*) AS total FROM ${Z} WHERE ${J}`,K=`SELECT ${Pu1} 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(xg0),total:N}}async getById($,Z){if(!$||!Z)return null;let Q=`SELECT * FROM ${this.sourceFactory($)} WHERE organization_id = '${j$($)}' AND id = '${j$(Z)}' LIMIT 1`,Y=await this.engine.query(Q);if(Y.length===0)return null;return xg0(Y[0])}async getStats($){if(!$.organizationId)throw Error("organizationId is required");let Z=this.sourceFactory($.organizationId,{startDate:$.startDate,endDate:$.endDate}),X=[`organization_id = '${j$($.organizationId)}'`];if(nG(X,$.startDate,this.dialect),$.endDate)X.push(pG($.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 = '${j$($.organizationId)}'`,"type = 'tool_call'"];if($.filters?.virtualMcpIds?.length){let J=$.filters.virtualMcpIds.map((W)=>`'${j$(W)}'`).join(",");X.push(`virtual_mcp_id IN (${J})`)}if($.filters?.excludeConnectionIds?.length){let J=$.filters.excludeConnectionIds.map((W)=>`'${j$(W)}'`).join(",");X.push(`connection_id NOT IN (${J})`)}if(nG(X,$.startDate,this.dialect),$.endDate)X.push(pG($.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=PB($.interval,X,"timestamp"),J=(E)=>`coalesce(${zu1("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 = '${j$($.organizationId)}'`,`connection_id = '${j$($.connectionId)}'`];if(nG(F,$.startDate,X),$.endDate)F.push(pG($.endDate,X));if($.userIds?.length){let E=$.userIds.slice(0,100).map((j)=>`'${j$(j)}'`).join(",");F.push(`user_id IN (${E})`)}let N=F.join(" AND "),U=Math.min(Math.max(1,Math.floor($.topN??5)),20),B=`${W} AS calls,
|
|
110
110
|
${K} AS errors,
|
|
111
111
|
avg(duration_ms) AS avg,
|
|
112
112
|
sum(${J("input_tokens")}) AS in_tok,
|
|
@@ -2981,7 +2981,7 @@ Respond with ONLY a JSON object of this shape, and nothing else:
|
|
|
2981
2981
|
${G.join(`
|
|
2982
2982
|
`)}`:Y}function dB6($){let Z=new Set;for(let X of $)for(let Q of X.split(`
|
|
2983
2983
|
`)){let Y=Q.trim();if(/^Co-authored-by:\s/i.test(Y))Z.add(Y)}return[...Z]}var td$=200,vB6=12,bB6,yB6=300,WX1=3;var KX1=D(()=>{XL();cT0();bB6={aheadBy:0,behindBy:0,files:[]}});function iB6($){if(!$||$.includes(".."))return!1;return mB6.test($)}function rd$($){let Z=typeof $.__resolveType==="string"?$.__resolveType:null;if(!Z||!iB6(Z))return null;let{__resolveType:X,...Q}=$;return{resolveType:Z,payload:Q}}function sd$($,Z){return`${$.replace(/\/+$/,"")}/deco/invoke/${Z}`}var mB6;var ad$=D(()=>{mB6=/^[\w./@-]+$/});function xa($,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 ed$($,Z,X,Q){if(!Q.connectionId)throw new Vv("Push requires a connected GitHub account. Connect mcp-github for this project and restart the sandbox.");let Y=$.organization?.id;if(!Y)throw new Vv(H9);await lO({ctx:$,connectionId:Q.connectionId,organizationId:Y,forceRefresh:!0,onLegacyMintError:(F)=>{let N=F instanceof Error?F.message:H9;throw new Vv(N)}});let{cloneUrl:G,gitUserName:J,gitUserEmail:W}=await fK(Q.connectionId,Q.owner,Q.name,$.db,$.vault).catch((F)=>{let{code:N,message:U}=z9$(F instanceof Error?F.message:String(F));throw N?new Vv(U):F}),K=Wl($),H=await Z.proxyDaemonRequest(X,"/_sandbox/config",{method:"PUT",headers:new Headers({"content-type":"application/json"}),body:JSON.stringify({git:{repository:{cloneUrl:G},identity:{userName:J,userEmail:W}},...K?{operator:K}:{}})});if(!H.ok){let F=await uO(H,pB6).catch(()=>H.statusText);throw Error(`Failed to refresh sandbox git credentials (${H.status}): ${F}`)}}var pB6=10485760,Vv;var HX1=D(()=>{NJ();CT0();Pn();li0();iy();Vv=class Vv extends Error{constructor($){super($);this.name="GitPushAuthError"}}});function tB6($){let Z=$.startsWith("thread:")?$.slice(7):$;if(!Z||Z.length>255||Z.includes("..")||Z.startsWith("/")||Z.endsWith("/")||Z.endsWith(".lock")||!nB6.test(Z))throw Error(`Invalid branch name: ${$}`)}function Sv($){return AbortSignal.any([$.req.raw.signal,AbortSignal.timeout(rB6)])}async function aB6($,Z){let X=$.var.studioContext,Q=HJ(Z.branch),Y=$.req.query("thread")??Q,G=Y&&Y===Q?Z.branchThread:Y?await X.storage.threads.get(Y).catch(()=>null):null,J=G?.virtual_mcp_id===Z.virtualMcpId?G:null,W=VC(J?.metadata?.runtime);if(W)return W;let K=ED0(Z.virtualMcpMetadata),H=K==="cms"?await d71(X,{claimName:Z.claimName}):"alive",F=K==="cms"&&H!=="alive"?"cms":"sandbox",N=!!J&&(H==="gone"||H==="alive"&&K==="cms");if(N&&J)sn(X,J.id,F);if(K==="cms")console.log("sandbox proxy: no runtime stamp",{route:$.req.path,method:$.req.method,reason:J?"unstamped":"threadless",liveness:H,resolved:F,stamped:N});return F}async function eB6($){let Z=$.get("vmClaim");if(Z.runner)return Z.runner;try{return await WQ($.var.studioContext)}catch{return null}}function Cv($){let{runner:Z}=$.get("vmClaim");if(!Z)return $.json({error:"No sandbox runner configured"},503);return Z}async function Ul($){let{virtualMcpMetadata:Z,connectionIds:X}=$.get("vmClaim"),Q=$.var.studioContext,Y=xa(Z,X);if(!Y)throw new h4(404,"AUTH","repo","Project has no GitHub repository");let G=n(Q);return _T0(Q,G.id,Y)}function FX1($,Z){if(Z instanceof fA0)return $.json({error:Z.message},429,{...T5,...Z.retryAfterMs===null?{}:{"Retry-After":String(Math.ceil(Z.retryAfterMs/1000))}});if(Z instanceof h4){let Q=Z.status===404?404:Z.status===409||Z.status===422?409:502;return $.json({error:Z.message},Q,T5)}let X=Z instanceof Error?Z.message:String(Z);return $.json({error:X},502,T5)}async function Xm$($,Z,X){let Q;try{Q=await fetch(Z,X)}catch{return $.json({error:"Preview unreachable"},502)}let Y;try{Y=await Q.text()}catch{return $.json({error:"Preview unreachable"},502)}return new Response(Y,{status:Q.status,headers:{"content-type":Q.headers.get("content-type")??"application/json"}})}async function Qm$($){try{let Z=await Ul($),X=await dT0(Z,$.get("vmClaim").branch);return $.json(X,200,T5)}catch(Z){return FX1($,Z)}}function ya($,Z){let Q=(pT0.get($)??Promise.resolve()).catch(()=>{}).then(Z),Y=Q.catch(()=>{});return pT0.set($,Y),Y.finally(()=>{if(pT0.get($)===Y)pT0.delete($)}),Q}async function $7($,Z,X){if(!X?.runner&&$.get("vmClaim").runtime==="cms")return $.json({error:"sandbox not found: this session is sandbox-less"},404,T5);let Q=X?.runner??Cv($);if(Q instanceof Response)return Q;let{claimName:Y,userId:G,projectRef:J}=$.get("vmClaim"),W=X?.method??"POST",K=null,H=new Headers;if(X?.jsonBody!==void 0)K=X.jsonBody,H.set("content-type","application/json");else if(X?.forwardJsonBody)K=await $.req.text(),H.set("content-type","application/json");let F=X?.signal,N={method:W,headers:H,body:K,...F?{signal:F}:{}},U=async()=>{let B=await Q.proxyDaemonRequest(Y,Z,N);if(X?.map404to410&&B.status===404){try{await B.body?.cancel()}catch{}if(await Q.adoptLiveClaim({userId:G,projectRef:J},Y))B=await Q.proxyDaemonRequest(Y,Z,N);if(B.status===404){try{await B.body?.cancel()}catch{}return new Response(JSON.stringify({error:"Sandbox handle is gone. The sandbox needs to be re-provisioned."}),{status:410,headers:{"content-type":"application/json",...T5}})}}let O=await B.text(),L=X?.redactRepoDir?$O6(O):O,w=B.headers.get("content-type")??"application/json";return new Response(L,{status:B.status,headers:{"content-type":w,...T5}})};try{if(F){let B=U();return B.catch(()=>{}),await Promise.race([B,new Promise((L,w)=>{if(F.aborted)return w(F.reason);F.addEventListener("abort",()=>w(F.reason),{once:!0})})])}return await U()}catch(B){let O=B instanceof Error?B.message:String(B);return $.json({error:`Daemon unreachable: ${O}`},502)}}function $O6($){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 nT0($,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 ZO6($){return Ym$.includes($)}var nB6,$m$=524288,oB6=65536,rB6=1e4,Zm$=2000,sB6,pT0,T5,Ym$,Gm$=()=>{let $=new K1;$.use("/:virtualMcpId/:branch/*",sB6),$.post("/:virtualMcpId/:branch/write",(X)=>$7(X,"/_sandbox/write",{forwardJsonBody:!0,signal:Sv(X)})),$.post("/:virtualMcpId/:branch/unlink",(X)=>$7(X,"/_sandbox/unlink",{forwardJsonBody:!0,signal:Sv(X)})),$.post("/:virtualMcpId/:branch/mkdir",(X)=>$7(X,"/_sandbox/mkdir",{forwardJsonBody:!0,signal:Sv(X)})),$.post("/:virtualMcpId/:branch/rename",(X)=>$7(X,"/_sandbox/rename",{forwardJsonBody:!0,signal:Sv(X)})),$.post("/:virtualMcpId/:branch/read",(X)=>$7(X,"/_sandbox/read",{forwardJsonBody:!0,signal:Sv(X)})),$.post("/:virtualMcpId/:branch/glob",(X)=>$7(X,"/_sandbox/glob",{forwardJsonBody:!0,signal:Sv(X)})),$.post("/:virtualMcpId/:branch/grep",(X)=>$7(X,"/_sandbox/grep",{forwardJsonBody:!0,signal:Sv(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 $7(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 $7(X,`/_sandbox/exec/${encodeURIComponent(Q)}/kill`)}),$.get("/:virtualMcpId/:branch/config",(X)=>$7(X,"/_sandbox/config",{method:"GET",map404to410:!0,redactRepoDir:!0})),$.put("/:virtualMcpId/:branch/config",(X)=>$7(X,"/_sandbox/config",{method:"PUT",forwardJsonBody:!0,map404to410:!0})),$.post("/:virtualMcpId/:branch/setup/:step",async(X)=>{let Q=X.req.param("step");if(!Q||!ZO6(Q))return X.json({error:`step must be one of: ${Ym$.join(", ")}`},400);let Y=X.get("vmClaim"),G=await d71(X.var.studioContext,{claimName:Y.claimName})==="gone"?null:await eB6(X);if(!G)return X.json({error:"sandbox not found: nothing is running at this ref"},404,T5);if(Q==="start"){let J=n(X.var.studioContext),W=dy(Y.virtualMcpMetadata);try{await f70({ctx:X.var.studioContext,runner:G,handle:Y.claimName,orgId:J.id,userId:Y.callerUserId,entries:W})}catch(K){let H=K instanceof Error?K.message:String(K);return X.json({error:`Failed to push env to daemon: ${H}`},502)}}return $7(X,`/_sandbox/setup/${Q}`,{signal:X.req.raw.signal,map404to410:!0,runner:G})}),$.get("/:virtualMcpId/:branch/events",(X)=>{let Q=X.get("vmClaim");if(!Q.runner)return QU(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 Gd$(X,{ctx:X.var.studioContext,claimName:Q.claimName,runner:Q.runner,virtualMcpId:Q.virtualMcpId,branch:Q.branch,userId:Q.userId,projectRef:Q.projectRef,virtualMcpMetadata:Q.virtualMcpMetadata})}),$.get("/:virtualMcpId/:branch/git/status",(X)=>{if(X.get("vmClaim").runtime==="cms")return Qm$(X);return Z(X)});let Z=(X)=>$7(X,"/_sandbox/git/status",{method:"GET",map404to410:!0,signal:AbortSignal.any([X.req.raw.signal,AbortSignal.timeout(Zm$)])});return $.post("/:virtualMcpId/:branch/git/status",(X)=>{if(X.get("vmClaim").runtime==="cms")return Qm$(X);return $7(X,"/_sandbox/git/status",{map404to410:!0,signal:AbortSignal.any([X.req.raw.signal,AbortSignal.timeout(Zm$)])})}),$.post("/:virtualMcpId/:branch/git/diff",async(X)=>{let Q=X.get("vmClaim");if(Q.runtime==="cms")try{let Y=await X.req.json().catch(()=>({})),G=await Ul(X),J=await mT0(G,Q.branch,Y.base);return X.json(J,200,T5)}catch(Y){return FX1(X,Y)}return $7(X,"/_sandbox/git/diff",{forwardJsonBody:!0,map404to410:!0})}),$.post("/:virtualMcpId/:branch/git/publish",async(X)=>{if(X.get("vmClaim").runtime==="cms")return X.json({ok:!0},200,T5);let Q=Cv(X);if(Q instanceof Response)return Q;let{claimName:Y,virtualMcpMetadata:G,connectionIds:J}=X.get("vmClaim"),W=X.var.studioContext;return ya(Y,async()=>{try{await m71(W,Q,Y);let K=xa(G,J);if(K)await ed$(W,Q,Y,K)}catch(K){if(K instanceof Vv)return X.json({error:K.message},403,T5);let H=K instanceof Error?K.message:String(K);return X.json({error:H},502,T5)}return $7(X,"/_sandbox/git/publish",{forwardJsonBody:!0,map404to410:!0})})}),$.post("/:virtualMcpId/:branch/git/discard",async(X)=>{let Q=X.get("vmClaim");if(Q.runtime==="cms")return ya(Q.claimName,async()=>{let Y=await X.req.json().catch(()=>({})),G=Array.isArray(Y.filepaths)?Y.filepaths.filter((J)=>typeof J==="string"):[];if(G.length===0)return X.json({error:"filepaths is required"},400,T5);try{let J=await Ul(X);return await od$(J,Q.branch,G),X.json({ok:!0},200,T5)}catch(J){let W=J instanceof h4&&J.status===409?409:502,K=J instanceof Error?J.message:String(J);return X.json({error:K},W,T5)}});return ya(Q.claimName,()=>$7(X,"/_sandbox/git/discard",{forwardJsonBody:!0,map404to410:!0}))}),$.post("/:virtualMcpId/:branch/git/rebase",async(X)=>{let Q=X.get("vmClaim");if(Q.runtime==="cms")return ya(Q.claimName,async()=>{try{let W=await X.req.json().catch(()=>({})),K=await Ul(X),H=W.base??await K.getDefaultBranch();return await iT0(K,Q.branch,H),X.json({ok:!0},200,T5)}catch(W){return FX1(X,W)}});let Y=Cv(X);if(Y instanceof Response)return Y;let{claimName:G}=X.get("vmClaim"),J=X.var.studioContext;return ya(G,async()=>{try{await m71(J,Y,G)}catch(W){let K=W instanceof Error?W.message:String(W);return X.json({error:K},502,T5)}return $7(X,"/_sandbox/git/rebase",{forwardJsonBody:!0,map404to410:!0})})}),$.post("/:virtualMcpId/:branch/git/suggest-commit",o5({maxSize:$m$,onError:(X)=>X.json({error:"Payload too large"},413,T5)}),async(X)=>{let Q=X.get("vmClaim"),Y=null;if(Q.runtime!=="cms"){let H=Cv(X);if(H instanceof Response)return H;Y=H}let{claimName:G,userId:J,projectRef:W}=Q,K=X.var.studioContext;try{let H=await X.req.json().catch(()=>({})),F=H.status,N=H.diff,U=N!=null&&typeof N.diffs==="object"&&N.diffs!==null,[B,O]=n71(F)&&U?[F,N]:Y?await Promise.all([nT0(Y,G,"/_sandbox/git/status","GET",{userId:J,projectRef:W}),nT0(Y,G,"/_sandbox/git/diff","GET",{userId:J,projectRef:W})]):await(async()=>{let w=await Ul(X);return Promise.all([dT0(w,Q.branch),mT0(w,Q.branch)])})(),L=await Fd$(K,B,O);return X.json(L,200,T5)}catch(H){let F=H instanceof Error?H.message:String(H);if(F==="SANDBOX_GONE")return X.json({error:"Sandbox handle is gone. The sandbox needs to be re-provisioned."},410,T5);return X.json({error:F},502,T5)}}),$.post("/:virtualMcpId/:branch/git/judge-review",o5({maxSize:$m$,onError:(X)=>X.json({error:"Payload too large"},413,T5)}),async(X)=>{let Q=X.get("vmClaim"),Y=null;if(Q.runtime!=="cms"){let H=Cv(X);if(H instanceof Response)return H;Y=H}let{claimName:G,userId:J,projectRef:W}=Q,K=X.var.studioContext;try{let H=await X.req.json().catch(()=>({})),F=H.status,N=H.diff,U=N!=null&&typeof N.diffs==="object"&&N.diffs!==null,[B,O]=n71(F)&&U?[F,N]:Y?await Promise.all([nT0(Y,G,"/_sandbox/git/status","GET",{userId:J,projectRef:W}),nT0(Y,G,"/_sandbox/git/diff","GET",{userId:J,projectRef:W})]):await(async()=>{let w=await Ul(X);return Promise.all([dT0(w,Q.branch),mT0(w,Q.branch)])})(),L=await Ud$(K,B,O,typeof H.language==="string"?H.language:void 0);return X.json(L,200,T5)}catch(H){let F=H instanceof Error?H.message:String(H);if(F==="SANDBOX_GONE")return X.json({error:"Sandbox handle is gone. The sandbox needs to be re-provisioned."},410,T5);return X.json({error:F},502,T5)}}),$.get("/:virtualMcpId/:branch/preview-fetch",async(X)=>{let Q=Cv(X);if(Q instanceof Response)return Q;let{claimName:Y}=X.get("vmClaim"),G=X.req.query("path");if(!G||!G.startsWith("/")||G.startsWith("//")||G.includes("..")||G.includes("\\"))return X.json({error:"Path not allowed"},403);let J;try{J=await Q.getPreviewUrl(Y)}catch{return X.json({error:"Preview not available"},502)}if(!J)return X.json({error:"Preview not available"},502);let W=J.replace(/\/+$/,"");return Xm$(X,`${W}${G}`)}),$.post("/:virtualMcpId/:branch/preview-invoke",o5({maxSize:oB6,onError:(X)=>X.json({error:"Payload too large"},413)}),async(X)=>{let Q=Cv(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=rd$(J);if(!W)return X.json({error:"Invalid or missing __resolveType"},400);let K=sd$(G,W.resolveType);return Xm$(X,K,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(W.payload),signal:AbortSignal.timeout(30000)})}),$};var Jm$=D(()=>{X8();kH();Jl();c71();Ln();Xd$();n3();Kg();Qd$();a3();Yd$();Jd$();gi0();jn();r71();Bd$();a71();XL();KX1();ad$();HX1();nB6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;sB6=ST0(async($,Z)=>{let X=$.var.studioContext;try{t(X)}catch{return $.json({error:"Unauthorized"},401)}let Q=o0(X);if(!Q)return $.json({error:"Unauthorized"},401);let Y;try{Y=n(X)}catch{return $.json({error:"Organization scope required"},403)}let G=$.req.param("virtualMcpId"),J=$.req.param("branch");if(!G||!J)return $.json({error:"virtualMcpId and branch are required"},400);try{tB6(J)}catch(L){let w=L instanceof Error?L.message:String(L);return $.json({error:w},400)}let W=await X.storage.virtualMcps.findById(G);if(!W||W.organization_id!==Y.id)return $.json({error:"Virtual MCP not found"},404);let K=On({orgId:Y.id,virtualMcpId:G,branch:J}),H=await _i0(X,J),F=vi0(H,Q),N=Zd$({userId:F,projectRef:K}),U=W.metadata??null,B=await aB6($,{claimName:N,branch:J,virtualMcpId:G,sandboxUserId:F,virtualMcpMetadata:U,branchThread:H});if(B==="cms")return $.set("vmClaim",{claimName:N,callerUserId:Q,runner:null,virtualMcpId:G,branch:J,userId:F,projectRef:K,virtualMcpMetadata:U,connectionIds:W.connections?.map((L)=>L.connection_id)??[],runtime:B}),Z();let O;try{O=await WQ(X)}catch{O=null}if(!O)return $.json({error:"No sandbox runner found"},404);return $.set("vmClaim",{claimName:N,callerUserId:Q,runner:O,virtualMcpId:G,branch:J,userId:F,projectRef:K,virtualMcpMetadata:U,connectionIds:W.connections?.map((L)=>L.connection_id)??[],runtime:B}),Z()});pT0=new Map;T5={"Cache-Control":"no-store, no-cache, must-revalidate",Pragma:"no-cache"};Ym$=["clone","install","start"]});function Wm$($,Z,X){let Q=NX1.get($);if(!Q)Q={pending:null,running:!1},NX1.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)QO6($,Q);return G}async function QO6($,Z){Z.running=!0;try{while(Z.pending){let X=Z.pending;Z.pending=null;try{let Q=await YO6(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)NX1.delete($)}}async function YO6($){let{client:Z,branch:X,packagePath:Q}=$.deps;for(let Y=0;;Y++){let G=await Nl(Z,X),J=await Z.getCommitTreeSha(G),W=await Z.getDecofileTree(J,Q),K=GX1(W,Q),H=[],F=new Map(K.map((O)=>[O.path,{stem:O.stem,sha:O.sha}]));for(let[O,L]of $.set){let w=JX1(K,O),E=`${JSON.stringify(L,null,2)}
|
|
2984
|
-
`,j=await Z.createBlob(E);await id$(Z.owner,Z.repo,j,E);let z=w[0]??`${lT0(Q)}/${$X1(O)}.json`;H.push({path:z,mode:"100644",type:"blob",sha:j});let P=z.slice(z.lastIndexOf("/")+1,-5);F.set(z,{stem:P,sha:j,content:E});for(let A of w.slice(1))H.push({path:A,mode:"100644",type:"blob",sha:null}),F.delete(A)}for(let O of $.del)for(let L of JX1(K,O))H.push({path:L,mode:"100644",type:"blob",sha:null}),F.delete(L);if(H.length===0)return G;let N=Q?`${Q}/.deco/blocks.gen.json`:".deco/blocks.gen.json";if(W.some((O)=>O.type==="blob"&&O.path===N)){let O=await Promise.all([...F.values()].map(async(j)=>({stem:j.stem,content:j.content??await Z.getBlobText(j.sha)}))),{decofile:L,skipped:w}=_a(O);if(w.length>0)console.warn("decofile gen: dropped blocks that were not valid JSON",{repo:`${Z.owner}/${Z.repo}`,branch:X,packagePath:Q,blocks:w.map((j)=>j.key)});let E=await Z.createBlob(L);H.push({path:N,mode:"100644",type:"blob",sha:E})}let U=await Z.createTree(J,H),B=await Z.createCommit({message:GO6($),treeSha:U,parentShas:[G]});try{return await Z.updateRef(X,B),B}catch(O){if(!(O instanceof h4&&O.status===422)||Y>=XO6-1)throw O;await w$(Q7(2000,200,Y,2,0.5))}}}function GO6($){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 qi0(Q,$.deps.coAuthor)}var XO6=3,NX1;var Km$=D(()=>{UD0();fT0();Z4();XL();cT0();NX1=new Map});import{createHmac as Hm$,randomBytes as JO6,timingSafeEqual as WO6}from"crypto";function Fm$(){if(tT0)return tT0;let $;try{let Z=S0();$=Z.studioJwtSecret??Z.betterAuthSecret}catch{$=void 0}return tT0=$?Buffer.from($):JO6(32),tT0}function UX1($){let Z=$.nowMs??Date.now(),X={o:$.organizationId,m:$.virtualMcpId,b:$.branch,e:Math.floor((Z+KO6)/1000)},Q=Buffer.from(JSON.stringify(X)).toString("base64url"),Y=Hm$("sha256",Fm$()).update(Q).digest("base64url");return`${Q}.${Y}`}function Nm$($,Z){let X=$.indexOf(".");if(X<0)return!1;let Q=$.slice(0,X),Y=Buffer.from($.slice(X+1)),G=Buffer.from(Hm$("sha256",Fm$()).update(Q).digest("base64url"));if(Y.length!==G.length||!WO6(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 KO6=21600000,tT0=null;var Um$=D(()=>{E$()});import{z as Bl}from"zod";function FO6($){return $.length>0&&$.length<=255&&!$.includes("..")&&!$.endsWith("/")&&!$.endsWith(".lock")&&HO6.test($)}function wm$($){return $.req.header("x-forwarded-host")??new URL($.req.url).host}async function ga($){let Z=$.get("decofileScope");return _T0($.var.studioContext,Z.organizationId,Z.githubRepo)}function ha($,Z){if(Z instanceof h4){let Q=Z.status===404?404:Z.status===409?409:Z.status===422?409:502;return $.json({error:Z.message},Q)}let X=Z instanceof Error?Z.message:String(Z);return $.json({error:X},500)}function Em$(){let $=new K1;return $.use("/:virtualMcpId/:branch",Lm$),$.use("/:virtualMcpId/:branch/*",Lm$),$.get("/:virtualMcpId/:branch",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await ga(Z),Y=await pd$(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=UX1({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.body(`{"version":${JSON.stringify(Y.sha)},"token":${JSON.stringify(J)},"apiHost":${JSON.stringify(wm$(Z))},"decofile":${Y.decofile}}`,200,{...G,"content-type":"application/json"})}catch(Q){return ha(Z,Q)}}),$.get("/:virtualMcpId/:branch/meta",async(Z)=>{let X=Z.get("decofileScope"),Q=X.packagePath?`${X.packagePath}/.deco/meta.gen.json`:".deco/meta.gen.json";try{let Y=await ga(Z),G=await Y.getFileTextAtRef(X.branch,Q);if(G===null){let J=await Y.getDefaultBranch();if(J!==X.branch)G=await Y.getFileTextAtRef(J,Q)}if(G===null)return Z.json({error:"meta.gen.json not committed"},404);return Z.body(G,200,{"content-type":"application/json","Cache-Control":"no-store","Access-Control-Allow-Origin":"*"})}catch(Y){return ha(Z,Y)}}),$.patch("/:virtualMcpId/:branch",UO6,async(Z)=>{let X=Z.get("decofileScope"),Q=Z.var.studioContext,Y=BO6.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{vT0(J)}catch(W){let K=W instanceof Error?W.message:String(W);return Z.json({error:K},400)}for(let[J,W]of Object.entries(G.set??{})){if(typeof W!=="object"||W===null||Array.isArray(W))return Z.json({error:`Block "${J}" must be a JSON object`},400);if(e71(J))return Z.json({error:`Block key "${J}" collides with a framework resolver module and cannot be written`},400)}try{let J=await ga(Z),W=await Wm$(`${X.organizationId}/${X.virtualMcpId}/${X.branch}`,{client:J,branch:X.branch,packagePath:X.packagePath,coAuthor:Wl(Q)},G),K=UX1({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.json({version:W,token:K,apiHost:wm$(Z)})}catch(J){return ha(Z,J)}}),$.post("/:virtualMcpId/:branch/publish",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await ga(Z),Y=await Q.getDefaultBranch();if(Y===X.branch)return Z.json({error:"Branch is already the default branch"},400);let G=`chore(decofile): publish ${X.branch}`;try{let J;try{J=await Q.mergeBranch(Y,X.branch,G)}catch(W){if(!(W instanceof h4&&W.status===409))throw W;await iT0(Q,X.branch,Y),J=await Q.mergeBranch(Y,X.branch,G)}return J?Z.json({result:"merged",sha:J}):Z.json({result:"up-to-date"})}catch(J){if(J instanceof h4&&J.status===409)return Z.json({error:"merge-conflict"},409);if(J instanceof h4&&J.status===405){let K=await Q.findOpenPullRequest(Y,X.branch)??await Q.createPullRequest({base:Y,head:X.branch,title:`Publish ${X.branch}`});return Z.json({result:"pull-request",number:K.number,url:K.html_url})}throw J}}catch(Q){return ha(Z,Q)}}),$.get("/:virtualMcpId/:branch/status",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await ga(Z),Y=await Q.getDefaultBranch();if(Y===X.branch)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0,lastCommitAt:null});try{let[{aheadBy:G,behindBy:J},W]=await Promise.all([Q.compare(Y,X.branch),Q.getBranchHead(X.branch)]);return Z.json({baseBranch:Y,aheadBy:G,behindBy:J,lastCommitAt:W.committedAt})}catch(G){if(G instanceof h4&&G.status===404)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0,lastCommitAt:null});throw G}}catch(Q){return ha(Z,Q)}}),$}var HO6,Bm$=500,Om$=1048576,Dm$=1024,NO6=8388608,UO6,BO6,Lm$;var jm$=D(()=>{Ht0();fT0();X8();kH();c71();CT0();HX1();a71();Km$();Um$();KX1();XL();cT0();HO6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;UO6=o5({maxSize:NO6,onError:($)=>$.json({error:"Payload too large"},413)}),BO6=Bl.object({set:Bl.record(Bl.string(),Bl.unknown()).optional(),delete:Bl.array(Bl.string()).optional()}).refine(($)=>Object.keys($.set??{}).length>0||($.delete?.length??0)>0,{message:"Patch must set or delete at least one block"}).refine(($)=>Object.keys($.set??{}).length+($.delete?.length??0)<=Bm$,{message:`Patch cannot touch more than ${Bm$} blocks`}).refine(($)=>Object.values($.set??{}).every((Z)=>JSON.stringify(Z).length<=Om$),{message:`Each block must be at most ${Om$} bytes`}).refine(($)=>[...Object.keys($.set??{}),...$.delete??[]].every((Z)=>Z.length<=Dm$),{message:`Each block key must be at most ${Dm$} characters`}),Lm$=ST0(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(!FO6(G))return $.json({error:`Invalid branch name: ${G}`},400);let J=X.auth?.user?.id??null;if(!J){let B=$.req.query("token");if(!($.req.method==="GET"&&!$.req.path.match(/\/(publish|status)$/)))return $.json({error:"Unauthorized"},401);if(!B||!Nm$(B,{organizationId:Q.id,virtualMcpId:Y,branch:G}))return $.json({error:"Unauthorized"},401)}let W=await X.storage.virtualMcps.findById(Y);if(!W||W.organization_id!==Q.id)return $.json({error:"Virtual MCP not found"},404);let K=W.metadata??null;if(!wD0(K))return $.json({error:"Project has no preview server configured"},404);let F=W.connections?.map((B)=>B.connection_id)??[],N=xa(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 zm$=($)=>{let Z=new K1;if(Z.use("*",jv),Z.route("/",mA0()),Z.route("/",xh$()),Z.route("/",cc$()),Z.route("/",hc$()),Z.route("/",MT0()),Z.route("/tools",oc$()),Z.route("/",pc$()),Z.route("/",Ec$({kvStorage:$.kvStorage})),Z.route("/",Lc$()),Z.route("/fs",_c$({getConnection:$.getNatsConnection})),Z.route("/sandbox",Gm$()),Z.route("/decofile",Em$()),Z.route("/",xc$()),Z.route("/deco-sites",pA0()),Z.route("/hosting",Ih$()),Z.route("/monitor",_h$()),Z.route("/sso",gA0()),Z.route("/",kT0({tokenStorage:$.tokenStorage,automationEventDispatcher:$.automationEventDispatcher})),Z.route("/webhooks",zh$()),$.mountDevAssets)Z.route("/dev-assets",rA0({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("/",cx$()),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",fc$()),Z.route("/mcp",ow0()),Z.route("/mcp/self",qT0()),Z.route("/mcp",aw0()),Z.all("/oauth-proxy/:connectionId/*",$.oauthProxyHandler),Z.get("/watch",$.watchHandler),Z};var Pm$=D(()=>{X8();KZ1();Ph$();UZ1();qh$();vh$();sA0();Ya();JZ1();wc$();jc$();vc$();Wo();$Z1();ew0();b71();bc$();yc$();uc$();dc$();nc$();y71();rc$();g71();rw0();Jm$();jm$()});function OO6($){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 DO6=async($,Z)=>{if(!$.get("studioContext").auth.user?.id)return $.json({error:"Unauthorized"},401);return Z()},Am$=()=>{let $=new K1;return $.use("*",DO6),$.get("/",async(Z)=>{let X=S0(),Q=X.decoSupabaseUrl,Y=X.decoSupabaseServiceKey;if(!Q||!Y)return Z.json({apps:[]});try{let G=await TY(Q,Y,"apps?select=name,title,description,logo,category,vendors(alias,url)");return Z.json({apps:OO6(G)})}catch(G){return console.error("[deco-apps] GET error:",G),Z.json({error:"Failed to fetch apps"},502)}}),$};var Tm$=D(()=>{X8();E$();dP0()});import{z as k1}from"zod";function fH($,Z="invalid_request_error",X=null,Q=null){return{error:{message:$,type:Z,param:X,code:Q}}}function IO6($){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 qO6($,Z,X){try{return JSON.parse($)}catch{throw new qm$(`Invalid JSON in tool call arguments for function '${X}' (tool_call_id: ${Z}): ${$}`)}}function MO6($){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:qO6(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 kO6($){let Z=$.map((X)=>{let Q=X.function.parameters?ZG(X.function.parameters):ZG({type:"object",properties:{}});return[X.function.name,u$({description:X.function.description,inputSchema:Q})]});return Object.fromEntries(Z)}function VO6($){if(!$)return;return{openai:{response_format:$}}}function SO6(){return`chatcmpl-${crypto.randomUUID().replace(/-/g,"").substring(0,29)}`}function Rm$($,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 Im$($){if($==="tool-calls")return"tool_calls";if($==="length")return"length";return"stop"}var LO6=256,wO6,EO6,jO6,zO6,PO6,AO6,TO6,RO6,qm$,Mm$,km$;var Vm$=D(()=>{c4();X8();Jl();xN();wO6=k1.object({type:k1.literal("function"),function:k1.object({name:k1.string(),description:k1.string().optional(),parameters:k1.record(k1.string(),k1.unknown()).optional()})}),EO6=k1.object({id:k1.string(),type:k1.literal("function"),function:k1.object({name:k1.string(),arguments:k1.string()})}),jO6=k1.discriminatedUnion("role",[k1.object({role:k1.literal("system"),content:k1.string(),name:k1.string().optional()}),k1.object({role:k1.literal("user"),content:k1.union([k1.string(),k1.array(k1.union([k1.object({type:k1.literal("text"),text:k1.string()}),k1.object({type:k1.literal("image_url"),image_url:k1.object({url:k1.string(),detail:k1.string().optional()})})]))]),name:k1.string().optional()}),k1.object({role:k1.literal("assistant"),content:k1.string().nullable().optional(),name:k1.string().optional(),tool_calls:k1.array(EO6).optional()}),k1.object({role:k1.literal("tool"),content:k1.string(),tool_call_id:k1.string()})]),zO6=k1.object({type:k1.literal("text")}),PO6=k1.object({type:k1.literal("json_object")}),AO6=k1.object({type:k1.literal("json_schema"),json_schema:k1.object({name:k1.string(),description:k1.string().optional(),schema:k1.record(k1.string(),k1.unknown()),strict:k1.boolean().optional()})}),TO6=k1.union([zO6,PO6,AO6]),RO6=k1.object({model:k1.string().describe("Format: 'model_id' or 'credential_id:model_id'"),messages:k1.array(jO6),stream:k1.boolean().optional().default(!1),temperature:k1.number().min(0).max(2).optional(),max_tokens:k1.number().positive().optional(),top_p:k1.number().min(0).max(1).optional(),frequency_penalty:k1.number().min(-2).max(2).optional(),presence_penalty:k1.number().min(-2).max(2).optional(),stop:k1.union([k1.string(),k1.array(k1.string())]).optional(),tools:k1.array(wO6).optional(),tool_choice:k1.union([k1.literal("auto"),k1.literal("none"),k1.literal("required"),k1.object({type:k1.literal("function"),function:k1.object({name:k1.string()})})]).optional(),response_format:TO6.optional(),user:k1.string().optional()});qm$=class qm$ extends Error{constructor($){super($);this.name="MessageConversionError"}};Mm$=new K1;Mm$.post("/:org/v1/chat/completions",async($)=>{let Z=$.get("studioContext"),X=$.req.param("org");try{if(!Z.auth.apiKey?.id)return $.json(fH("API key authentication required. Provide a valid API key via Authorization header.","authentication_error"),401);if(!Z.organization)return $.json(fH("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(fH("Organization mismatch. The API key's organization does not match the requested organization.","invalid_request_error","organization"),403);let Q=await $.req.json(),Y=RO6.safeParse(Q);if(!Y.success){let w=Y.error.issues[0]??{message:"Invalid request",path:[]};return $.json(fH(`Invalid request: ${w.message}`,"invalid_request_error",w.path.length>0?w.path.join("."):null),400)}let G=Y.data,J=IO6(G.model);if(!J)return $.json(fH("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)=>Ew(j.providerId));if(!E)return $.json(fH("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(fH(`AI provider credential not found or inaccessible: ${W}`,"invalid_request_error","model"),404)}let F=H.aiSdk.languageModel(K),N=MO6(G.messages),U=G.tools?kO6(G.tools):void 0,B=VO6(G.response_format),O=SO6(),L=Math.floor(Date.now()/1000);if(G.stream)return QU($,async(w)=>{let E=Rm$(F,N,U,G,B,$.req.raw.signal);try{let j=bO(E),z=!1,P=0,A="",I=async()=>{if(A.length===0)return;let k=A;A="",await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{content:k},finish_reason:null}]})})};for await(let k of j.fullStream){if(!z&&(k.type==="text-delta"||k.type==="tool-call"))await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{role:"assistant",content:""},finish_reason:null}]})}),z=!0;if(k.type==="text-delta"){if(A+=k.text,A.length>=LO6)await I()}else if(k.type==="tool-call"){await I();let M=P++;await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{tool_calls:[{index:M,id:k.toolCallId,type:"function",function:{name:k.toolName,arguments:JSON.stringify(k.input)}}]},finish_reason:null}]})})}else if(k.type==="finish")await I(),await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{},finish_reason:Im$(k.finishReason)}],usage:k.totalUsage?{prompt_tokens:k.totalUsage.inputTokens??0,completion_tokens:k.totalUsage.outputTokens??0,total_tokens:k.totalUsage.totalTokens??0}:void 0})})}await I(),await w.writeSSE({data:"[DONE]"})}catch(j){let z=j;console.error("[openai-compat:stream] Error:",z.message),await w.writeSSE({data:JSON.stringify({error:{message:z.message,type:"server_error"}})})}});else{let w=Rm$(F,N,U,G,B,$.req.raw.signal),E=await vO(w),j={role:"assistant",content:E.text||null};if(E.toolCalls&&E.toolCalls.length>0)j.tool_calls=E.toolCalls.map((z)=>({id:z.toolCallId,type:"function",function:{name:z.toolName,arguments:JSON.stringify("input"in z?z.input:{})}})),j.content=null;return $.json({id:O,object:"chat.completion",created:L,model:G.model,choices:[{index:0,message:j,finish_reason:Im$(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(fH("Request aborted","invalid_request_error"),400);if(Y.name==="MessageConversionError")return $.json(fH(Y.message,"invalid_request_error","messages"),400);return console.error("[openai-compat] Error:",Y.message,Y.stack),$.json(fH(Y.message,"server_error"),500)}});km$=Mm$});function CO6($){if(typeof $!=="object"||$===null)return!1;let X=$.githubRepo?.url;return typeof X==="string"&&X.length>0}function Sm$(){let $=new K1;return $.use("*",async(Z,X)=>{await X(),Z.header("Cache-Control","private, no-store"),Z.header("Vary","Cookie")}),$.get("/",async(Z)=>{let X=Z.get("studioContext"),Q=o0(X);if(!Q)return Z.json({error:"Authentication required"},401);let G=(Z.req.query("site")??"").trim().toLowerCase();if(!sX(G))return Z.json({error:"Invalid site slug"},400);let J=await X.db.selectFrom("member").innerJoin("organization","organization.id","member.organizationId").select(["organization.id as id","organization.slug as slug","organization.name as name","organization.metadata as metadata"]).where("member.userId","=",Q).execute(),W=[];for(let H of J){if(!H.slug||hZ(H))continue;let F=await X.storage.virtualMcps.list(H.id);for(let N of F){if(se1(N)!==G)continue;if(!CO6(N.metadata))continue;W.push({orgSlug:H.slug,orgName:H.name??H.slug,project:{id:N.id,title:N.title,icon:N.icon??null}})}}let K={matches:W};return Z.json(K)}),$}var Cm$=D(()=>{X8();cF()});var vm$;var _m$=D(()=>{vm$={name:"decocms",version:"4.319.11",description:"Deco CMS \u2014 Self-hostable MCP Gateway for managing AI connections and tools",author:"Deco team",repository:{type:"git",url:"git+https://github.com/decocms/studio.git",directory:"apps/api"},bugs:{url:"https://github.com/decocms/studio/issues"},type:"module",bin:{deco:"./dist/server/cli.js"},files:["dist/**/*"],scripts:{dev:"bun run migrate && bun run dev:server","dev:server":"bun run --cwd=../../packages/sandbox build && NODE_ENV=development bun --env-file=.env --hot run src/index.ts",build:"bun run build:server","build:server":"bun run scripts/bundle-server-script.ts --dist ./dist/server","generate:tool-contracts":"bun run scripts/generate-tool-contracts.ts","db:migrate":"bun run ./dist/server/migrate.js","db:migrate:dbos":"bun run ./dist/server/migrate-dbos.js",check:"tsc --noEmit",start:"bun run ./dist/server/server.js",migrate:"bun run src/database/migrate.ts","migrate:dbos":"bun run src/database/migrate-dbos.ts",test:"bun test src","better-auth:migrate":"bunx --bun @better-auth/cli migrate -y --config src/auth/index.ts",prepublishOnly:"bun run --cwd=../.. build:studio"},optionalDependencies:{"@duckdb/node-api":"^1.5.0-r.1"},dependencies:{"@ai-sdk/anthropic":"^3.0.85","@ai-sdk/google":"^3.0.83","@ai-sdk/openai":"^3.0.73","@anthropic-ai/sdk":"^0.105.0","@aws-sdk/client-s3":"^3.1013.0","@aws-sdk/client-sts":"^3.1013.0","@aws-sdk/lib-storage":"^3.1013.0","@aws-sdk/s3-request-presigner":"^3.1013.0","@clickhouse/client":"^1.8.1","@dbos-inc/dbos-sdk":"^4.21.6","@inkjs/ui":"^2.0.0","@nats-io/jetstream":"3.4.0","@nats-io/kv":"3.4.0","@nats-io/nats-core":"3.4.0","@nats-io/transport-node":"3.4.0","@openrouter/ai-sdk-provider":"^2.9.1","@opentelemetry/core":"^2.6.0","embedded-postgres":"^18.3.0-beta.16",ink:"^6.8.0",kysely:"^0.28.12","posthog-node":"^5.0.0",react:"^19.2.6","react-dom":"^19.2.6"},devDependencies:{"@ai-sdk/provider":"^3.0.10","@better-auth/sso":"1.4.1","@decocms/better-auth":"1.5.17","@decocms/bindings":"workspace:*","@decocms/mcp-utils":"workspace:*","@decocms/runtime":"workspace:*","@decocms/sandbox":"workspace:*","@decocms/shared":"workspace:*","@jitl/quickjs-wasmfile-release-sync":"0.31.0","@modelcontextprotocol/sdk":"1.29.0","@opentelemetry/api":"^1.9.0","@opentelemetry/api-logs":"^0.211.0","@opentelemetry/exporter-logs-otlp-proto":"^0.211.0","@opentelemetry/exporter-prometheus":"^0.208.0","@opentelemetry/exporter-trace-otlp-proto":"^0.207.0","@opentelemetry/instrumentation-runtime-node":"^0.24.0","@opentelemetry/resources":"^2.6.0","@opentelemetry/sdk-logs":"^0.211.0","@opentelemetry/sdk-metrics":"^2.2.0","@opentelemetry/sdk-node":"^0.207.0","@opentelemetry/sdk-trace-base":"^2.5.0","@types/bun":"^1.3.1","@types/google.maps":"^3.65.2","@types/pg":"^8.15.6","@types/react-syntax-highlighter":"^15.5.13","@vercel/nft":"^1.1.1",ai:"^6.0.208","better-auth":"1.4.22",croner:"^9.1.0",degit:"^2.8.4",hono:"^4.10.7",jose:"^6.0.11",nanoid:"^5.1.6",pg:"^8.16.3",typescript:"^7.0.2",typescript5:"npm:typescript@^5.9.3",zod:"4.3.6"},homepage:"https://github.com/decocms/studio",keywords:["mcp","model-context-protocol","ai","gateway","self-hosted","tools"],license:"MIT",publishConfig:{access:"public"}}});function fO6(){let $=process.env.POSTHOG_KEY;if(!$)return null;return{key:$,host:process.env.POSTHOG_HOST??vO6}}var fm$,vO6="https://ph.studio.decocms.com",bm$;var xm$=D(()=>{X8();N90();eC();Q9();E$();d91();_m$();fm$=new K1;fm$.get("/",($)=>{let Z={version:vm$.version,theme:Bp1(),...bF().logo&&{logo:bF().logo},...TN()&&{internalUrl:l_1()},...S0().enableDecoImport&&{enableDecoImport:!0},brandExtractEnabled:!!S0().firecrawlApiKey,hostingEnabled:!!S0().controlplaneRestUrl&&!!S0().controlplaneServiceToken,hostingControlPlaneGa:S0().hostingControlPlaneGa,monitorEnabled:!!S0().clickhouseAnalyticsUrl&&!!S0().clickhouseAnalyticsPassword,monitorGa:S0().monitorGa,auth:Sg$(),posthog:fO6(),googleMapsApiKey:process.env.GOOGLE_MAPS_API_KEY?.trim()||null,runtime:{agentSandbox:na()}};return $.header("Cache-Control","no-store"),$.json({success:!0,config:Z})});bm$=fm$});function Ol($){let Z=($??"").trim().toLowerCase();return Z=Z.replace(/^https?:\/\//,""),Z=Z.replace(/^www\./,""),Z=Z.split(/[/?#]/)[0]??"",Z.replace(/\/+$/,"")}function BX1($){return(Ol($).split(".")[0]||$).replace(/[-_]/g," ").split(" ").filter(Boolean).map((X)=>X.charAt(0).toUpperCase()+X.slice(1)).join(" ")}function gm$($,Z=64){return`https://www.google.com/s2/favicons?domain=${encodeURIComponent(Ol($))}&sz=${Z}`}function ym$($,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 hm$($){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()?ym$(`${Y.trim().replace(/\s+/g," ")} \u2014 ${J}`,200):ym$(`How does ${X} really perform? ${J}`,200);return{title:G,description:W}}import{z as c0}from"zod";var _v,bO6,xO6,yO6,gO6,um$;var lm$=D(()=>{_v=c0.enum(["good","bad","neutral"]),bO6=c0.preprocess(($)=>{if(Array.isArray($))return{kind:"text",value:$.find((X)=>X!==null&&typeof X!=="object")??""};return $!==null&&typeof $==="object"?$:{kind:"text",value:$}},c0.object({kind:c0.enum(["text","number","sparkline","badge","score"]).catch("text"),value:c0.coerce.string().optional(),tone:_v.optional(),muted:c0.boolean().optional(),delta:c0.coerce.string().optional(),deltaDir:c0.enum(["up","down","neutral"]).optional(),points:c0.array(c0.coerce.number()).optional(),label:c0.coerce.string().optional()}).transform(($)=>{if($.kind==="badge"&&$.label==null)$.label=$.value??"";if($.kind==="score"){let Z=Number($.value);if(Number.isNaN(Z))return{...$,kind:"text"}}return $})),xO6=c0.preprocess(($)=>{let Z=$;if(Z&&typeof Z==="object"&&!Array.isArray(Z)&&Array.isArray(Z.cells))Z=Z.cells;if(Array.isArray(Z)&&Z.length===1&&Array.isArray(Z[0]))Z=Z[0];if(Array.isArray(Z))return Z;if(Z&&typeof Z==="object")return Object.values(Z);return Z},c0.array(bO6)),yO6={key:c0.coerce.string(),title:c0.coerce.string(),eyebrow:c0.coerce.string().optional(),headline:c0.coerce.string(),annotation:c0.coerce.string().optional(),methodology:c0.coerce.string().optional(),sources:c0.array(c0.object({name:c0.coerce.string(),logoUrl:c0.coerce.string()})).optional()},gO6=c0.discriminatedUnion("template",[c0.object({template:c0.literal("cover"),score:c0.object({value:c0.coerce.number(),max:c0.coerce.number().optional(),grade:c0.coerce.string().optional(),label:c0.coerce.string().optional()}).optional(),brandImage:c0.coerce.string().optional(),screenshot:c0.coerce.string().optional(),mobileScreenshot:c0.coerce.string().optional()}),c0.object({template:c0.literal("cta"),ctaUrl:c0.coerce.string().optional(),ctaLabel:c0.coerce.string().optional(),bullets:c0.array(c0.coerce.string()).optional()}),c0.object({template:c0.literal("series"),points:c0.array(c0.coerce.number()).min(2),xLabels:c0.array(c0.coerce.string()).min(1),unit:c0.coerce.string().optional(),callout:c0.object({index:c0.coerce.number(),value:c0.coerce.string(),tone:_v.optional()})}),c0.object({template:c0.literal("threshold"),value:c0.coerce.string().default(""),metricLabel:c0.coerce.string().optional(),ratio:c0.coerce.number(),thresholdRatio:c0.coerce.number().optional(),thresholdLabel:c0.coerce.string().default(""),tone:_v.optional()}),c0.object({template:c0.literal("stats"),stats:c0.array(c0.object({value:c0.coerce.string(),label:c0.coerce.string(),tone:_v.optional()})).min(1)}),c0.object({template:c0.literal("bars"),items:c0.array(c0.object({value:c0.coerce.string(),label:c0.coerce.string(),ratio:c0.coerce.number(),tone:_v.optional()})).min(1)}),c0.object({template:c0.literal("gauges"),gauges:c0.array(c0.object({label:c0.coerce.string(),value:c0.coerce.string(),status:c0.enum(["good","warn","bad"]).catch("warn"),caption:c0.coerce.string().optional(),ratio:c0.coerce.number().optional()})).min(1)}),c0.object({template:c0.literal("checklist"),checks:c0.array(c0.object({label:c0.coerce.string(),status:c0.enum(["pass","fail","warn"]).catch("fail"),value:c0.coerce.string().optional()})).min(1)}),c0.object({template:c0.literal("table"),columns:c0.array(c0.object({label:c0.coerce.string(),align:c0.enum(["left","right"]).optional()})).min(1),rows:c0.array(xO6).min(1),highlightRow:c0.coerce.number().optional()}),c0.object({template:c0.literal("products"),products:c0.array(c0.object({name:c0.coerce.string(),price:c0.coerce.string().optional(),image:c0.coerce.string().optional(),url:c0.coerce.string().optional()})).min(1)}),c0.object({template:c0.literal("list"),entries:c0.array(c0.object({label:c0.coerce.string(),severity:c0.enum(["error","warning","notice"]).catch("notice")})).min(1),moreCount:c0.coerce.number().optional()}),c0.object({template:c0.literal("keywords"),volumeLabel:c0.coerce.string().optional(),keywords:c0.array(c0.object({term:c0.coerce.string(),volume:c0.coerce.string(),position:c0.coerce.number().catch(0)})).min(1)}),c0.object({template:c0.literal("competitor"),metricLabel:c0.coerce.string().optional(),competitors:c0.array(c0.object({name:c0.coerce.string(),value:c0.coerce.string(),tone:_v.optional(),isYou:c0.boolean().optional()})).min(1)}),c0.object({template:c0.literal("scorecard"),rivalLabel:c0.coerce.string().optional(),dimensions:c0.array(c0.object({label:c0.coerce.string(),you:c0.coerce.string(),rival:c0.coerce.string().optional(),rivalName:c0.coerce.string().optional(),tone:_v.optional()})).min(1)})]),um$=c0.object({...yO6,template:gO6})});function oT0($){let Z=[],X=[...$.sections].sort((Y,G)=>Y.position-G.position).map((Y)=>{let G=um$.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 OX1=D(()=>{lm$()});import{join as cm$}from"path";async function uO6($){try{let Z=await fetch(`${DK({})}/api/v2/public/diagnostics/${encodeURIComponent($)}`,{headers:{Accept:"application/json"},signal:AbortSignal.timeout(hO6)});if(!Z.ok)return null;let X=await Z.json(),{deck:Q}=oT0(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()||BX1($),score:Q.meta.scores?.cover??J?.score?.value,verdict:Y?.annotation?.trim()||Y?.headline?.trim()||void 0}}catch{return null}}function RG($){return $.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function lO6($,Z){let X=Ol($),Q=Z?.brand?.trim()||BX1(X),Y=gm$(X,128),J=`${(S0().baseUrl??"https://studio.decocms.com").replace(/\/+$/,"")}/report/${encodeURIComponent(X)}`,{title:W,description:K}=hm$({brand:Q,domain:X,score:Z?.score,verdict:Z?.verdict}),H=`${J}/og.png`,F=`${Q} commerce report by decocms`;return[`<title>${RG(W)}</title>`,`<meta name="description" content="${RG(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="${RG(W)}" />`,`<meta property="og:description" content="${RG(K)}" />`,`<meta property="og:url" content="${RG(J)}" />`,`<meta property="og:image" content="${RG(H)}" />`,'<meta property="og:image:width" content="1200" />','<meta property="og:image:height" content="630" />',`<meta property="og:image:alt" content="${RG(F)}" />`,'<meta name="twitter:card" content="summary_large_image" />',`<meta name="twitter:title" content="${RG(W)}" />`,`<meta name="twitter:description" content="${RG(K)}" />`,`<meta name="twitter:image" content="${RG(H)}" />`,`<meta name="twitter:image:alt" content="${RG(F)}" />`,`<link rel="canonical" href="${RG(J)}" />`,`<link rel="icon" href="${RG(Y)}" sizes="any" />`].join(`
|
|
2984
|
+
`,j=await Z.createBlob(E);await id$(Z.owner,Z.repo,j,E);let z=w[0]??`${lT0(Q)}/${$X1(O)}.json`;H.push({path:z,mode:"100644",type:"blob",sha:j});let P=z.slice(z.lastIndexOf("/")+1,-5);F.set(z,{stem:P,sha:j,content:E});for(let A of w.slice(1))H.push({path:A,mode:"100644",type:"blob",sha:null}),F.delete(A)}for(let O of $.del)for(let L of JX1(K,O))H.push({path:L,mode:"100644",type:"blob",sha:null}),F.delete(L);if(H.length===0)return G;let N=Q?`${Q}/.deco/blocks.gen.json`:".deco/blocks.gen.json";if(W.some((O)=>O.type==="blob"&&O.path===N)){let O=await Promise.all([...F.values()].map(async(j)=>({stem:j.stem,content:j.content??await Z.getBlobText(j.sha)}))),{decofile:L,skipped:w}=_a(O);if(w.length>0)console.warn("decofile gen: dropped blocks that were not valid JSON",{repo:`${Z.owner}/${Z.repo}`,branch:X,packagePath:Q,blocks:w.map((j)=>j.key)});let E=await Z.createBlob(L);H.push({path:N,mode:"100644",type:"blob",sha:E})}let U=await Z.createTree(J,H),B=await Z.createCommit({message:GO6($),treeSha:U,parentShas:[G]});try{return await Z.updateRef(X,B),B}catch(O){if(!(O instanceof h4&&O.status===422)||Y>=XO6-1)throw O;await w$(Q7(2000,200,Y,2,0.5))}}}function GO6($){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 qi0(Q,$.deps.coAuthor)}var XO6=3,NX1;var Km$=D(()=>{UD0();fT0();Z4();XL();cT0();NX1=new Map});import{createHmac as Hm$,randomBytes as JO6,timingSafeEqual as WO6}from"crypto";function Fm$(){if(tT0)return tT0;let $;try{let Z=S0();$=Z.studioJwtSecret??Z.betterAuthSecret}catch{$=void 0}return tT0=$?Buffer.from($):JO6(32),tT0}function UX1($){let Z=$.nowMs??Date.now(),X={o:$.organizationId,m:$.virtualMcpId,b:$.branch,e:Math.floor((Z+KO6)/1000)},Q=Buffer.from(JSON.stringify(X)).toString("base64url"),Y=Hm$("sha256",Fm$()).update(Q).digest("base64url");return`${Q}.${Y}`}function Nm$($,Z){let X=$.indexOf(".");if(X<0)return!1;let Q=$.slice(0,X),Y=Buffer.from($.slice(X+1)),G=Buffer.from(Hm$("sha256",Fm$()).update(Q).digest("base64url"));if(Y.length!==G.length||!WO6(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 KO6=21600000,tT0=null;var Um$=D(()=>{E$()});import{z as Bl}from"zod";function FO6($){return $.length>0&&$.length<=255&&!$.includes("..")&&!$.endsWith("/")&&!$.endsWith(".lock")&&HO6.test($)}function wm$($){return $.req.header("x-forwarded-host")??new URL($.req.url).host}async function ga($){let Z=$.get("decofileScope");return _T0($.var.studioContext,Z.organizationId,Z.githubRepo)}function ha($,Z){if(Z instanceof h4){let Q=Z.status===404?404:Z.status===409?409:Z.status===422?409:502;return $.json({error:Z.message},Q)}let X=Z instanceof Error?Z.message:String(Z);return $.json({error:X},500)}function Em$(){let $=new K1;return $.use("/:virtualMcpId/:branch",Lm$),$.use("/:virtualMcpId/:branch/*",Lm$),$.get("/:virtualMcpId/:branch",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await ga(Z),Y=await pd$(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=UX1({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.body(`{"version":${JSON.stringify(Y.sha)},"token":${JSON.stringify(J)},"apiHost":${JSON.stringify(wm$(Z))},"decofile":${Y.decofile}}`,200,{...G,"content-type":"application/json"})}catch(Q){return ha(Z,Q)}}),$.get("/:virtualMcpId/:branch/meta",async(Z)=>{let X=Z.get("decofileScope"),Q=X.packagePath?`${X.packagePath}/.deco/meta.gen.json`:".deco/meta.gen.json";try{let Y=await ga(Z),G=await Y.getFileTextAtRef(X.branch,Q);if(G===null){let J=await Y.getDefaultBranch();if(J!==X.branch)G=await Y.getFileTextAtRef(J,Q)}if(G===null)return Z.json({error:"meta.gen.json not committed"},404);return Z.body(G,200,{"content-type":"application/json","Cache-Control":"no-store","Access-Control-Allow-Origin":"*"})}catch(Y){return ha(Z,Y)}}),$.patch("/:virtualMcpId/:branch",UO6,async(Z)=>{let X=Z.get("decofileScope"),Q=Z.var.studioContext,Y=BO6.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{vT0(J)}catch(W){let K=W instanceof Error?W.message:String(W);return Z.json({error:K},400)}for(let[J,W]of Object.entries(G.set??{})){if(typeof W!=="object"||W===null||Array.isArray(W))return Z.json({error:`Block "${J}" must be a JSON object`},400);if(e71(J))return Z.json({error:`Block key "${J}" collides with a framework resolver module and cannot be written`},400)}try{let J=await ga(Z),W=await Wm$(`${X.organizationId}/${X.virtualMcpId}/${X.branch}`,{client:J,branch:X.branch,packagePath:X.packagePath,coAuthor:Wl(Q)},G),K=UX1({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.json({version:W,token:K,apiHost:wm$(Z)})}catch(J){return ha(Z,J)}}),$.post("/:virtualMcpId/:branch/publish",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await ga(Z),Y=await Q.getDefaultBranch();if(Y===X.branch)return Z.json({error:"Branch is already the default branch"},400);let G=`chore(decofile): publish ${X.branch}`;try{let J;try{J=await Q.mergeBranch(Y,X.branch,G)}catch(W){if(!(W instanceof h4&&W.status===409))throw W;await iT0(Q,X.branch,Y),J=await Q.mergeBranch(Y,X.branch,G)}return J?Z.json({result:"merged",sha:J}):Z.json({result:"up-to-date"})}catch(J){if(J instanceof h4&&J.status===409)return Z.json({error:"merge-conflict"},409);if(J instanceof h4&&J.status===405){let K=await Q.findOpenPullRequest(Y,X.branch)??await Q.createPullRequest({base:Y,head:X.branch,title:`Publish ${X.branch}`});return Z.json({result:"pull-request",number:K.number,url:K.html_url})}throw J}}catch(Q){return ha(Z,Q)}}),$.get("/:virtualMcpId/:branch/status",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await ga(Z),Y=await Q.getDefaultBranch();if(Y===X.branch)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0,lastCommitAt:null});try{let[{aheadBy:G,behindBy:J},W]=await Promise.all([Q.compare(Y,X.branch),Q.getBranchHead(X.branch)]);return Z.json({baseBranch:Y,aheadBy:G,behindBy:J,lastCommitAt:W.committedAt})}catch(G){if(G instanceof h4&&G.status===404)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0,lastCommitAt:null});throw G}}catch(Q){return ha(Z,Q)}}),$}var HO6,Bm$=500,Om$=1048576,Dm$=1024,NO6=8388608,UO6,BO6,Lm$;var jm$=D(()=>{Ht0();fT0();X8();kH();c71();CT0();HX1();a71();Km$();Um$();KX1();XL();cT0();HO6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;UO6=o5({maxSize:NO6,onError:($)=>$.json({error:"Payload too large"},413)}),BO6=Bl.object({set:Bl.record(Bl.string(),Bl.unknown()).optional(),delete:Bl.array(Bl.string()).optional()}).refine(($)=>Object.keys($.set??{}).length>0||($.delete?.length??0)>0,{message:"Patch must set or delete at least one block"}).refine(($)=>Object.keys($.set??{}).length+($.delete?.length??0)<=Bm$,{message:`Patch cannot touch more than ${Bm$} blocks`}).refine(($)=>Object.values($.set??{}).every((Z)=>JSON.stringify(Z).length<=Om$),{message:`Each block must be at most ${Om$} bytes`}).refine(($)=>[...Object.keys($.set??{}),...$.delete??[]].every((Z)=>Z.length<=Dm$),{message:`Each block key must be at most ${Dm$} characters`}),Lm$=ST0(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(!FO6(G))return $.json({error:`Invalid branch name: ${G}`},400);let J=X.auth?.user?.id??null;if(!J){let B=$.req.query("token");if(!($.req.method==="GET"&&!$.req.path.match(/\/(publish|status)$/)))return $.json({error:"Unauthorized"},401);if(!B||!Nm$(B,{organizationId:Q.id,virtualMcpId:Y,branch:G}))return $.json({error:"Unauthorized"},401)}let W=await X.storage.virtualMcps.findById(Y);if(!W||W.organization_id!==Q.id)return $.json({error:"Virtual MCP not found"},404);let K=W.metadata??null;if(!wD0(K))return $.json({error:"Project has no preview server configured"},404);let F=W.connections?.map((B)=>B.connection_id)??[],N=xa(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 zm$=($)=>{let Z=new K1;if(Z.use("*",jv),Z.route("/",mA0()),Z.route("/",xh$()),Z.route("/",cc$()),Z.route("/",hc$()),Z.route("/",MT0()),Z.route("/tools",oc$()),Z.route("/",pc$()),Z.route("/",Ec$({kvStorage:$.kvStorage})),Z.route("/",Lc$()),Z.route("/fs",_c$({getConnection:$.getNatsConnection})),Z.route("/sandbox",Gm$()),Z.route("/decofile",Em$()),Z.route("/",xc$()),Z.route("/deco-sites",pA0()),Z.route("/hosting",Ih$()),Z.route("/monitor",_h$()),Z.route("/sso",gA0()),Z.route("/",kT0({tokenStorage:$.tokenStorage,automationEventDispatcher:$.automationEventDispatcher})),Z.route("/webhooks",zh$()),$.mountDevAssets)Z.route("/dev-assets",rA0({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("/",cx$()),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",fc$()),Z.route("/mcp",ow0()),Z.route("/mcp/self",qT0()),Z.route("/mcp",aw0()),Z.all("/oauth-proxy/:connectionId/*",$.oauthProxyHandler),Z.get("/watch",$.watchHandler),Z};var Pm$=D(()=>{X8();KZ1();Ph$();UZ1();qh$();vh$();sA0();Ya();JZ1();wc$();jc$();vc$();Wo();$Z1();ew0();b71();bc$();yc$();uc$();dc$();nc$();y71();rc$();g71();rw0();Jm$();jm$()});function OO6($){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 DO6=async($,Z)=>{if(!$.get("studioContext").auth.user?.id)return $.json({error:"Unauthorized"},401);return Z()},Am$=()=>{let $=new K1;return $.use("*",DO6),$.get("/",async(Z)=>{let X=S0(),Q=X.decoSupabaseUrl,Y=X.decoSupabaseServiceKey;if(!Q||!Y)return Z.json({apps:[]});try{let G=await TY(Q,Y,"apps?select=name,title,description,logo,category,vendors(alias,url)");return Z.json({apps:OO6(G)})}catch(G){return console.error("[deco-apps] GET error:",G),Z.json({error:"Failed to fetch apps"},502)}}),$};var Tm$=D(()=>{X8();E$();dP0()});import{z as k1}from"zod";function fH($,Z="invalid_request_error",X=null,Q=null){return{error:{message:$,type:Z,param:X,code:Q}}}function IO6($){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 qO6($,Z,X){try{return JSON.parse($)}catch{throw new qm$(`Invalid JSON in tool call arguments for function '${X}' (tool_call_id: ${Z}): ${$}`)}}function MO6($){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:qO6(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 kO6($){let Z=$.map((X)=>{let Q=X.function.parameters?ZG(X.function.parameters):ZG({type:"object",properties:{}});return[X.function.name,u$({description:X.function.description,inputSchema:Q})]});return Object.fromEntries(Z)}function VO6($){if(!$)return;return{openai:{response_format:$}}}function SO6(){return`chatcmpl-${crypto.randomUUID().replace(/-/g,"").substring(0,29)}`}function Rm$($,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 Im$($){if($==="tool-calls")return"tool_calls";if($==="length")return"length";return"stop"}var LO6=256,wO6,EO6,jO6,zO6,PO6,AO6,TO6,RO6,qm$,Mm$,km$;var Vm$=D(()=>{c4();X8();Jl();xN();wO6=k1.object({type:k1.literal("function"),function:k1.object({name:k1.string(),description:k1.string().optional(),parameters:k1.record(k1.string(),k1.unknown()).optional()})}),EO6=k1.object({id:k1.string(),type:k1.literal("function"),function:k1.object({name:k1.string(),arguments:k1.string()})}),jO6=k1.discriminatedUnion("role",[k1.object({role:k1.literal("system"),content:k1.string(),name:k1.string().optional()}),k1.object({role:k1.literal("user"),content:k1.union([k1.string(),k1.array(k1.union([k1.object({type:k1.literal("text"),text:k1.string()}),k1.object({type:k1.literal("image_url"),image_url:k1.object({url:k1.string(),detail:k1.string().optional()})})]))]),name:k1.string().optional()}),k1.object({role:k1.literal("assistant"),content:k1.string().nullable().optional(),name:k1.string().optional(),tool_calls:k1.array(EO6).optional()}),k1.object({role:k1.literal("tool"),content:k1.string(),tool_call_id:k1.string()})]),zO6=k1.object({type:k1.literal("text")}),PO6=k1.object({type:k1.literal("json_object")}),AO6=k1.object({type:k1.literal("json_schema"),json_schema:k1.object({name:k1.string(),description:k1.string().optional(),schema:k1.record(k1.string(),k1.unknown()),strict:k1.boolean().optional()})}),TO6=k1.union([zO6,PO6,AO6]),RO6=k1.object({model:k1.string().describe("Format: 'model_id' or 'credential_id:model_id'"),messages:k1.array(jO6),stream:k1.boolean().optional().default(!1),temperature:k1.number().min(0).max(2).optional(),max_tokens:k1.number().positive().optional(),top_p:k1.number().min(0).max(1).optional(),frequency_penalty:k1.number().min(-2).max(2).optional(),presence_penalty:k1.number().min(-2).max(2).optional(),stop:k1.union([k1.string(),k1.array(k1.string())]).optional(),tools:k1.array(wO6).optional(),tool_choice:k1.union([k1.literal("auto"),k1.literal("none"),k1.literal("required"),k1.object({type:k1.literal("function"),function:k1.object({name:k1.string()})})]).optional(),response_format:TO6.optional(),user:k1.string().optional()});qm$=class qm$ extends Error{constructor($){super($);this.name="MessageConversionError"}};Mm$=new K1;Mm$.post("/:org/v1/chat/completions",async($)=>{let Z=$.get("studioContext"),X=$.req.param("org");try{if(!Z.auth.apiKey?.id)return $.json(fH("API key authentication required. Provide a valid API key via Authorization header.","authentication_error"),401);if(!Z.organization)return $.json(fH("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(fH("Organization mismatch. The API key's organization does not match the requested organization.","invalid_request_error","organization"),403);let Q=await $.req.json(),Y=RO6.safeParse(Q);if(!Y.success){let w=Y.error.issues[0]??{message:"Invalid request",path:[]};return $.json(fH(`Invalid request: ${w.message}`,"invalid_request_error",w.path.length>0?w.path.join("."):null),400)}let G=Y.data,J=IO6(G.model);if(!J)return $.json(fH("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)=>Ew(j.providerId));if(!E)return $.json(fH("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(fH(`AI provider credential not found or inaccessible: ${W}`,"invalid_request_error","model"),404)}let F=H.aiSdk.languageModel(K),N=MO6(G.messages),U=G.tools?kO6(G.tools):void 0,B=VO6(G.response_format),O=SO6(),L=Math.floor(Date.now()/1000);if(G.stream)return QU($,async(w)=>{let E=Rm$(F,N,U,G,B,$.req.raw.signal);try{let j=bO(E),z=!1,P=0,A="",I=async()=>{if(A.length===0)return;let k=A;A="",await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{content:k},finish_reason:null}]})})};for await(let k of j.fullStream){if(!z&&(k.type==="text-delta"||k.type==="tool-call"))await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{role:"assistant",content:""},finish_reason:null}]})}),z=!0;if(k.type==="text-delta"){if(A+=k.text,A.length>=LO6)await I()}else if(k.type==="tool-call"){await I();let M=P++;await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{tool_calls:[{index:M,id:k.toolCallId,type:"function",function:{name:k.toolName,arguments:JSON.stringify(k.input)}}]},finish_reason:null}]})})}else if(k.type==="finish")await I(),await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{},finish_reason:Im$(k.finishReason)}],usage:k.totalUsage?{prompt_tokens:k.totalUsage.inputTokens??0,completion_tokens:k.totalUsage.outputTokens??0,total_tokens:k.totalUsage.totalTokens??0}:void 0})})}await I(),await w.writeSSE({data:"[DONE]"})}catch(j){let z=j;console.error("[openai-compat:stream] Error:",z.message),await w.writeSSE({data:JSON.stringify({error:{message:z.message,type:"server_error"}})})}});else{let w=Rm$(F,N,U,G,B,$.req.raw.signal),E=await vO(w),j={role:"assistant",content:E.text||null};if(E.toolCalls&&E.toolCalls.length>0)j.tool_calls=E.toolCalls.map((z)=>({id:z.toolCallId,type:"function",function:{name:z.toolName,arguments:JSON.stringify("input"in z?z.input:{})}})),j.content=null;return $.json({id:O,object:"chat.completion",created:L,model:G.model,choices:[{index:0,message:j,finish_reason:Im$(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(fH("Request aborted","invalid_request_error"),400);if(Y.name==="MessageConversionError")return $.json(fH(Y.message,"invalid_request_error","messages"),400);return console.error("[openai-compat] Error:",Y.message,Y.stack),$.json(fH(Y.message,"server_error"),500)}});km$=Mm$});function CO6($){if(typeof $!=="object"||$===null)return!1;let X=$.githubRepo?.url;return typeof X==="string"&&X.length>0}function Sm$(){let $=new K1;return $.use("*",async(Z,X)=>{await X(),Z.header("Cache-Control","private, no-store"),Z.header("Vary","Cookie")}),$.get("/",async(Z)=>{let X=Z.get("studioContext"),Q=o0(X);if(!Q)return Z.json({error:"Authentication required"},401);let G=(Z.req.query("site")??"").trim().toLowerCase();if(!sX(G))return Z.json({error:"Invalid site slug"},400);let J=await X.db.selectFrom("member").innerJoin("organization","organization.id","member.organizationId").select(["organization.id as id","organization.slug as slug","organization.name as name","organization.metadata as metadata"]).where("member.userId","=",Q).execute(),W=[];for(let H of J){if(!H.slug||hZ(H))continue;let F=await X.storage.virtualMcps.list(H.id);for(let N of F){if(se1(N)!==G)continue;if(!CO6(N.metadata))continue;W.push({orgSlug:H.slug,orgName:H.name??H.slug,project:{id:N.id,title:N.title,icon:N.icon??null}})}}let K={matches:W};return Z.json(K)}),$}var Cm$=D(()=>{X8();cF()});var vm$;var _m$=D(()=>{vm$={name:"decocms",version:"4.319.12",description:"Deco CMS \u2014 Self-hostable MCP Gateway for managing AI connections and tools",author:"Deco team",repository:{type:"git",url:"git+https://github.com/decocms/studio.git",directory:"apps/api"},bugs:{url:"https://github.com/decocms/studio/issues"},type:"module",bin:{deco:"./dist/server/cli.js"},files:["dist/**/*"],scripts:{dev:"bun run migrate && bun run dev:server","dev:server":"bun run --cwd=../../packages/sandbox build && NODE_ENV=development bun --env-file=.env --hot run src/index.ts",build:"bun run build:server","build:server":"bun run scripts/bundle-server-script.ts --dist ./dist/server","generate:tool-contracts":"bun run scripts/generate-tool-contracts.ts","db:migrate":"bun run ./dist/server/migrate.js","db:migrate:dbos":"bun run ./dist/server/migrate-dbos.js",check:"tsc --noEmit",start:"bun run ./dist/server/server.js",migrate:"bun run src/database/migrate.ts","migrate:dbos":"bun run src/database/migrate-dbos.ts",test:"bun test src","better-auth:migrate":"bunx --bun @better-auth/cli migrate -y --config src/auth/index.ts",prepublishOnly:"bun run --cwd=../.. build:studio"},optionalDependencies:{"@duckdb/node-api":"^1.5.0-r.1"},dependencies:{"@ai-sdk/anthropic":"^3.0.85","@ai-sdk/google":"^3.0.83","@ai-sdk/openai":"^3.0.73","@anthropic-ai/sdk":"^0.105.0","@aws-sdk/client-s3":"^3.1013.0","@aws-sdk/client-sts":"^3.1013.0","@aws-sdk/lib-storage":"^3.1013.0","@aws-sdk/s3-request-presigner":"^3.1013.0","@clickhouse/client":"^1.8.1","@dbos-inc/dbos-sdk":"^4.21.6","@inkjs/ui":"^2.0.0","@nats-io/jetstream":"3.4.0","@nats-io/kv":"3.4.0","@nats-io/nats-core":"3.4.0","@nats-io/transport-node":"3.4.0","@openrouter/ai-sdk-provider":"^2.9.1","@opentelemetry/core":"^2.6.0","embedded-postgres":"^18.3.0-beta.16",ink:"^6.8.0",kysely:"^0.28.12","posthog-node":"^5.0.0",react:"^19.2.6","react-dom":"^19.2.6"},devDependencies:{"@ai-sdk/provider":"^3.0.10","@better-auth/sso":"1.4.1","@decocms/better-auth":"1.5.17","@decocms/bindings":"workspace:*","@decocms/mcp-utils":"workspace:*","@decocms/runtime":"workspace:*","@decocms/sandbox":"workspace:*","@decocms/shared":"workspace:*","@jitl/quickjs-wasmfile-release-sync":"0.31.0","@modelcontextprotocol/sdk":"1.29.0","@opentelemetry/api":"^1.9.0","@opentelemetry/api-logs":"^0.211.0","@opentelemetry/exporter-logs-otlp-proto":"^0.211.0","@opentelemetry/exporter-prometheus":"^0.208.0","@opentelemetry/exporter-trace-otlp-proto":"^0.207.0","@opentelemetry/instrumentation-runtime-node":"^0.24.0","@opentelemetry/resources":"^2.6.0","@opentelemetry/sdk-logs":"^0.211.0","@opentelemetry/sdk-metrics":"^2.2.0","@opentelemetry/sdk-node":"^0.207.0","@opentelemetry/sdk-trace-base":"^2.5.0","@types/bun":"^1.3.1","@types/google.maps":"^3.65.2","@types/pg":"^8.15.6","@types/react-syntax-highlighter":"^15.5.13","@vercel/nft":"^1.1.1",ai:"^6.0.208","better-auth":"1.4.22",croner:"^9.1.0",degit:"^2.8.4",hono:"^4.10.7",jose:"^6.0.11",nanoid:"^5.1.6",pg:"^8.16.3",typescript:"^7.0.2",typescript5:"npm:typescript@^5.9.3",zod:"4.3.6"},homepage:"https://github.com/decocms/studio",keywords:["mcp","model-context-protocol","ai","gateway","self-hosted","tools"],license:"MIT",publishConfig:{access:"public"}}});function fO6(){let $=process.env.POSTHOG_KEY;if(!$)return null;return{key:$,host:process.env.POSTHOG_HOST??vO6}}var fm$,vO6="https://ph.studio.decocms.com",bm$;var xm$=D(()=>{X8();N90();eC();Q9();E$();d91();_m$();fm$=new K1;fm$.get("/",($)=>{let Z={version:vm$.version,theme:Bp1(),...bF().logo&&{logo:bF().logo},...TN()&&{internalUrl:l_1()},...S0().enableDecoImport&&{enableDecoImport:!0},brandExtractEnabled:!!S0().firecrawlApiKey,hostingEnabled:!!S0().controlplaneRestUrl&&!!S0().controlplaneServiceToken,hostingControlPlaneGa:S0().hostingControlPlaneGa,monitorEnabled:!!S0().clickhouseAnalyticsUrl&&!!S0().clickhouseAnalyticsPassword,monitorGa:S0().monitorGa,auth:Sg$(),posthog:fO6(),googleMapsApiKey:process.env.GOOGLE_MAPS_API_KEY?.trim()||null,runtime:{agentSandbox:na()}};return $.header("Cache-Control","no-store"),$.json({success:!0,config:Z})});bm$=fm$});function Ol($){let Z=($??"").trim().toLowerCase();return Z=Z.replace(/^https?:\/\//,""),Z=Z.replace(/^www\./,""),Z=Z.split(/[/?#]/)[0]??"",Z.replace(/\/+$/,"")}function BX1($){return(Ol($).split(".")[0]||$).replace(/[-_]/g," ").split(" ").filter(Boolean).map((X)=>X.charAt(0).toUpperCase()+X.slice(1)).join(" ")}function gm$($,Z=64){return`https://www.google.com/s2/favicons?domain=${encodeURIComponent(Ol($))}&sz=${Z}`}function ym$($,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 hm$($){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()?ym$(`${Y.trim().replace(/\s+/g," ")} \u2014 ${J}`,200):ym$(`How does ${X} really perform? ${J}`,200);return{title:G,description:W}}import{z as c0}from"zod";var _v,bO6,xO6,yO6,gO6,um$;var lm$=D(()=>{_v=c0.enum(["good","bad","neutral"]),bO6=c0.preprocess(($)=>{if(Array.isArray($))return{kind:"text",value:$.find((X)=>X!==null&&typeof X!=="object")??""};return $!==null&&typeof $==="object"?$:{kind:"text",value:$}},c0.object({kind:c0.enum(["text","number","sparkline","badge","score"]).catch("text"),value:c0.coerce.string().optional(),tone:_v.optional(),muted:c0.boolean().optional(),delta:c0.coerce.string().optional(),deltaDir:c0.enum(["up","down","neutral"]).optional(),points:c0.array(c0.coerce.number()).optional(),label:c0.coerce.string().optional()}).transform(($)=>{if($.kind==="badge"&&$.label==null)$.label=$.value??"";if($.kind==="score"){let Z=Number($.value);if(Number.isNaN(Z))return{...$,kind:"text"}}return $})),xO6=c0.preprocess(($)=>{let Z=$;if(Z&&typeof Z==="object"&&!Array.isArray(Z)&&Array.isArray(Z.cells))Z=Z.cells;if(Array.isArray(Z)&&Z.length===1&&Array.isArray(Z[0]))Z=Z[0];if(Array.isArray(Z))return Z;if(Z&&typeof Z==="object")return Object.values(Z);return Z},c0.array(bO6)),yO6={key:c0.coerce.string(),title:c0.coerce.string(),eyebrow:c0.coerce.string().optional(),headline:c0.coerce.string(),annotation:c0.coerce.string().optional(),methodology:c0.coerce.string().optional(),sources:c0.array(c0.object({name:c0.coerce.string(),logoUrl:c0.coerce.string()})).optional()},gO6=c0.discriminatedUnion("template",[c0.object({template:c0.literal("cover"),score:c0.object({value:c0.coerce.number(),max:c0.coerce.number().optional(),grade:c0.coerce.string().optional(),label:c0.coerce.string().optional()}).optional(),brandImage:c0.coerce.string().optional(),screenshot:c0.coerce.string().optional(),mobileScreenshot:c0.coerce.string().optional()}),c0.object({template:c0.literal("cta"),ctaUrl:c0.coerce.string().optional(),ctaLabel:c0.coerce.string().optional(),bullets:c0.array(c0.coerce.string()).optional()}),c0.object({template:c0.literal("series"),points:c0.array(c0.coerce.number()).min(2),xLabels:c0.array(c0.coerce.string()).min(1),unit:c0.coerce.string().optional(),callout:c0.object({index:c0.coerce.number(),value:c0.coerce.string(),tone:_v.optional()})}),c0.object({template:c0.literal("threshold"),value:c0.coerce.string().default(""),metricLabel:c0.coerce.string().optional(),ratio:c0.coerce.number(),thresholdRatio:c0.coerce.number().optional(),thresholdLabel:c0.coerce.string().default(""),tone:_v.optional()}),c0.object({template:c0.literal("stats"),stats:c0.array(c0.object({value:c0.coerce.string(),label:c0.coerce.string(),tone:_v.optional()})).min(1)}),c0.object({template:c0.literal("bars"),items:c0.array(c0.object({value:c0.coerce.string(),label:c0.coerce.string(),ratio:c0.coerce.number(),tone:_v.optional()})).min(1)}),c0.object({template:c0.literal("gauges"),gauges:c0.array(c0.object({label:c0.coerce.string(),value:c0.coerce.string(),status:c0.enum(["good","warn","bad"]).catch("warn"),caption:c0.coerce.string().optional(),ratio:c0.coerce.number().optional()})).min(1)}),c0.object({template:c0.literal("checklist"),checks:c0.array(c0.object({label:c0.coerce.string(),status:c0.enum(["pass","fail","warn"]).catch("fail"),value:c0.coerce.string().optional()})).min(1)}),c0.object({template:c0.literal("table"),columns:c0.array(c0.object({label:c0.coerce.string(),align:c0.enum(["left","right"]).optional()})).min(1),rows:c0.array(xO6).min(1),highlightRow:c0.coerce.number().optional()}),c0.object({template:c0.literal("products"),products:c0.array(c0.object({name:c0.coerce.string(),price:c0.coerce.string().optional(),image:c0.coerce.string().optional(),url:c0.coerce.string().optional()})).min(1)}),c0.object({template:c0.literal("list"),entries:c0.array(c0.object({label:c0.coerce.string(),severity:c0.enum(["error","warning","notice"]).catch("notice")})).min(1),moreCount:c0.coerce.number().optional()}),c0.object({template:c0.literal("keywords"),volumeLabel:c0.coerce.string().optional(),keywords:c0.array(c0.object({term:c0.coerce.string(),volume:c0.coerce.string(),position:c0.coerce.number().catch(0)})).min(1)}),c0.object({template:c0.literal("competitor"),metricLabel:c0.coerce.string().optional(),competitors:c0.array(c0.object({name:c0.coerce.string(),value:c0.coerce.string(),tone:_v.optional(),isYou:c0.boolean().optional()})).min(1)}),c0.object({template:c0.literal("scorecard"),rivalLabel:c0.coerce.string().optional(),dimensions:c0.array(c0.object({label:c0.coerce.string(),you:c0.coerce.string(),rival:c0.coerce.string().optional(),rivalName:c0.coerce.string().optional(),tone:_v.optional()})).min(1)})]),um$=c0.object({...yO6,template:gO6})});function oT0($){let Z=[],X=[...$.sections].sort((Y,G)=>Y.position-G.position).map((Y)=>{let G=um$.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 OX1=D(()=>{lm$()});import{join as cm$}from"path";async function uO6($){try{let Z=await fetch(`${DK({})}/api/v2/public/diagnostics/${encodeURIComponent($)}`,{headers:{Accept:"application/json"},signal:AbortSignal.timeout(hO6)});if(!Z.ok)return null;let X=await Z.json(),{deck:Q}=oT0(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()||BX1($),score:Q.meta.scores?.cover??J?.score?.value,verdict:Y?.annotation?.trim()||Y?.headline?.trim()||void 0}}catch{return null}}function RG($){return $.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function lO6($,Z){let X=Ol($),Q=Z?.brand?.trim()||BX1(X),Y=gm$(X,128),J=`${(S0().baseUrl??"https://studio.decocms.com").replace(/\/+$/,"")}/report/${encodeURIComponent(X)}`,{title:W,description:K}=hm$({brand:Q,domain:X,score:Z?.score,verdict:Z?.verdict}),H=`${J}/og.png`,F=`${Q} commerce report by decocms`;return[`<title>${RG(W)}</title>`,`<meta name="description" content="${RG(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="${RG(W)}" />`,`<meta property="og:description" content="${RG(K)}" />`,`<meta property="og:url" content="${RG(J)}" />`,`<meta property="og:image" content="${RG(H)}" />`,'<meta property="og:image:width" content="1200" />','<meta property="og:image:height" content="630" />',`<meta property="og:image:alt" content="${RG(F)}" />`,'<meta name="twitter:card" content="summary_large_image" />',`<meta name="twitter:title" content="${RG(W)}" />`,`<meta name="twitter:description" content="${RG(K)}" />`,`<meta name="twitter:image" content="${RG(H)}" />`,`<meta name="twitter:image:alt" content="${RG(F)}" />`,`<link rel="canonical" href="${RG(J)}" />`,`<link rel="icon" href="${RG(Y)}" sizes="any" />`].join(`
|
|
2985
2985
|
`)}function cO6($,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}
|
|
2986
2986
|
</head>`)}function dm$($){let Z=new K1;return Z.get("/:domain/og.png",async(X)=>{let Q=Ol(X.req.param("domain")),Y=async()=>{let G=$?Bun.file(cm$($,"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(`${DK({})}/api/v2/public/diagnostics/${encodeURIComponent(Q)}/og.png`,{signal:AbortSignal.timeout(dO6)}),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=$?cm$($,"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 uO6(Ol(Q)),K=lO6(Q,W);return X.html(cO6(J,K),200,{"Cache-Control":"public, max-age=0, s-maxage=300"})}catch{return X.html(J)}}),Z}var hO6=2500,dO6=1e4;var mm$=D(()=>{X8();OX1();AE();E$()});function ua($,Z){return fetch(`${DK({})}${$}`,Z)}async function mO6($,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 ua(`/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}=oT0(J);return{status:W.slides.length?"ready":"empty",deck:W,scanned_at:J.scanned_at,drops:K}}var iO6,GU,im$=async($,Z)=>{if(!$.get("reportUser"))return $.json({error:"Authentication required"},401);await Z();return},pm$;var nm$=D(()=>{X8();sY();AE();OX1();iO6=new Set(["complete","errored","terminated","unknown"]),GU=new K1;GU.use("*",async($,Z)=>{let X=await a$.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});GU.use("/link-token/*",im$);GU.use("/suggest",im$);GU.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 mO6(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)}});GU.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 ua("/api/v2/diagnostics/run",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${PE({})}`},body:JSON.stringify({url:Q,...Y?{email:Y}:{},distinct_id:G})});if(!J.ok)return $.json({error:`run HTTP ${J.status}`},502);let W=await J.json(),K=W.blocked?{state:"blocked"}:W.status==="fresh"?{state:"fresh"}:W.mode==="sync"?{state:"sync"}:{state:"running",id:W.id??null};return $.json(K)}catch{return $.json({error:"run failed"},502)}});GU.get("/status",async($)=>{let Z=$.req.query("id");if(!Z)return $.json({error:"id is required"},400);try{let X=await ua(`/api/v2/diagnostics/status?id=${encodeURIComponent(Z)}`,{headers:{Authorization:`Bearer ${PE({})}`}});if(!X.ok)return $.json({error:`status HTTP ${X.status}`},502);let Y=(await X.json()).status??"unknown",G={done:iO6.has(Y),status:Y};return $.json(G)}catch{return $.json({error:"status failed"},502)}});GU.get("/link-token/:id",async($)=>{let Z=$.req.param("id");try{let X=await ua(`/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)}});GU.get("/suggest",async($)=>{let Z=($.req.query("q")??"").trim().slice(0,64);if(Z.length<2)return $.json({suggestions:[]});try{let X=await ua(`/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:[]})}});pm$=GU});import{createHmac as pO6,timingSafeEqual as nO6}from"crypto";function om$($,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)>tO6)return!1;let W=pO6("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&&nO6(K,F)})}function rm$($){let Z;try{Z=JSON.parse($)}catch{return null}let X=mJ(Z),Q=mJ(mJ(X?.data)?.object);if(!X||typeof X.type!=="string"||!Q)return null;return{id:bH(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 sm$($){switch($){case"active":case"trialing":return"active";case"past_due":return"past_due";default:return"canceled"}}function bH($){return typeof $==="string"?$:void 0}function mJ($){return typeof $==="object"&&$!==null?$:void 0}function rT0($){return typeof $==="number"?new Date($*1000):null}function wX1($){return bH($)??bH(mJ($)?.id)}function oO6($){return wX1($.subscription)??bH(mJ(mJ($.parent)?.subscription_details)?.subscription)}function rO6($){let Z=rT0($.current_period_end);if(Z)return Z;let X=mJ($.items)?.data;if(!Array.isArray(X))return null;let Q=0;for(let Y of X){let G=mJ(Y)?.current_period_end;if(typeof G==="number"&&G>Q)Q=G}return Q>0?new Date(Q*1000):null}function DX1($,Z){let X=rT0($.created);return!!X&&!!Z.lastStripeEventAt&&X<Z.lastStripeEventAt}function LX1($,Z){let X=rT0($.created);if(!X)return;return Z.lastStripeEventAt&&Z.lastStripeEventAt>X?void 0:X}async function sO6($,Z){let X=Z.data.object;switch(Z.type){case"checkout.session.completed":case"checkout.session.async_payment_succeeded":{let Q=bH(mJ(X.metadata)?.orgId);if(!Q)return{handled:!1,reason:"no orgId"};if(bH(mJ(X.metadata)?.kind)==="topup"){if(X.mode!=="payment")return{handled:!1,reason:"topup with wrong mode"};if(bH(X.payment_status)!=="paid")return{handled:!1,reason:"payment not confirmed"};let J=bH(X.id);if(!J)return console.error("stripe webhook: topup session without id",{eventId:Z.id,organizationId:Q}),{handled:!1,reason:"topup session without id"};let W=Number(mJ(X.metadata)?.creditCents);if(!Number.isInteger(W)||W<=0)return console.error("stripe webhook: paid topup with bad metadata \u2014 credit NOT applied",{eventId:Z.id,organizationId:Q,creditCents:mJ(X.metadata)?.creditCents}),{handled:!1,reason:"bad topup metadata"};return{handled:!0,organizationId:Q,topUp:{creditCents:W,referenceId:`stripe-topup:${J}`}}}if(X.mode!=="subscription")return{handled:!1,reason:"not a subscription checkout"};if(bH(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=wX1(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(DX1(Z,Y))return{handled:!1,reason:"stale event"};return await $.updateStripeState(Q,{stripeCustomerId:wX1(X.customer),stripeSubscriptionId:G,status:"active",lastStripeEventAt:LX1(Z,Y)}),{handled:!0,organizationId:Q}}case"customer.subscription.updated":case"customer.subscription.deleted":{let Q=bH(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&&DX1(Z,Y))return{handled:!1,reason:"stale event"};let J=G?"canceled":sm$(X.status);return await $.updateStripeState(Y.organizationId,{status:J,currentPeriodEnd:rO6(X),...G&&{stripeSubscriptionId:null},lastStripeEventAt:LX1(Z,Y)}),{handled:!0,organizationId:Y.organizationId}}case"invoice.paid":{let Q=oO6(X);if(!Q)return{handled:!1,reason:"no sub id"};let Y=await $.getBillingByStripeSubscriptionId(Q);if(!Y)return{handled:!1,reason:"unknown subscription"};if(DX1(Z,Y))return{handled:!1,reason:"stale event"};return await $.updateStripeState(Y.organizationId,{status:"active",currentPeriodEnd:rT0(X.period_end),lastStripeEventAt:LX1(Z,Y)}),{handled:!0,organizationId:Y.organizationId}}default:return{handled:!1,reason:`unhandled event ${Z.type}`}}}function aO6($,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:sm$(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 tm$($,Z){let X=aO6($,Z);if(!X)return;nY({event:X.name,organizationId:X.organizationId,...$.id?{uuid:Pt1(`stripe:${$.id}:${X.name}`)}:{},...$.created?{timestamp:new Date($.created*1000)}:{},properties:X.properties})}async function am$($){let Z=new NK(B8().db),X=await sO6(Z,$);if(!(X.handled&&X.topUp))tm$($,X);if(X.handled&&X.topUp)await Bz$({organizationId:X.organizationId,amountCents:X.topUp.creditCents,referenceId:X.topUp.referenceId}),tm$($,X);if(!X.handled&&X.orphanSubscriptionId)try{await o0$(X.orphanSubscriptionId),console.error("stripe webhook: canceled orphan subscription",{subscriptionId:X.orphanSubscriptionId,eventId:$.id})}catch(Q){if(!(Q instanceof aY&&(Q.status===400||Q.status===404)))throw Q}return X}var tO6=300;var em$=D(()=>{aG();S4();m50();vE();R11()});var eO6=1048576,EX1;var $i$=D(()=>{X8();kH();E$();em$();EX1=new K1;EX1.post("/webhook",o5({maxSize:eO6,onError:($)=>$.json({error:"payload too large"},413)}),async($)=>{let Z=S0().stripeWebhookSecret;if(!Z)return $.json({error:"stripe billing not configured"},503);let X=await $.req.text();if(!om$(X,$.req.header("stripe-signature"),Z))return $.json({error:"invalid signature"},400);let Y=rm$(X);if(!Y)return $.json({error:"invalid payload"},400);let G=await am$(Y);return console.log("stripe webhook",{eventId:Y.id,type:Y.type,livemode:Y.livemode,...G}),$.json({received:!0})})});import{timingSafeEqual as $D6}from"crypto";function XD6($,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 $D6(Buffer.from(Y),Buffer.from(Q))}var ZD6=5242880,jX1;var Zi$=D(()=>{X8();kH();a3();jX1=new K1;jX1.post("/webhook",o5({maxSize:ZD6,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(!XD6(X,$.req.header("x-hub-signature-256"),Z))return $.json({error:"invalid signature"},400);if($.req.header("x-github-event")!=="push")return $.json({ok:!0,ignored:"event"});let Q;try{Q=JSON.parse(X)}catch{return $.json({error:"invalid payload"},400)}let Y=Q.ref,G=Q.repository?.full_name;if(!Y||!G)return $.json({ok:!0,ignored:"shape"});let W=(await Wt0())?.markTenantPoolsDirty(G,Y)??[];return $.json({ok:!0,pools:W})})});function Xi$($,Z){if(Z.startsWith("text/html")||Z.startsWith("image/svg"))$.set("Content-Security-Policy","sandbox allow-scripts allow-modals allow-same-origin")}var Qi$,QD6,YD6,Yi$;var Gi$=D(()=>{X8();S3();vg();Ay();Qi$=new K1,QD6=["range","if-none-match","if-modified-since"],YD6=["content-type","content-length","content-range","accept-ranges","etag","last-modified"];Qi$.get("/:org/files/*",async($)=>{let Z=$.get("studioContext"),X=Z.organization?.id;if(!Z.auth?.user?.id){if(uu($))return $.redirect(`/login?next=${encodeURIComponent($.req.path)}`,302);throw new Z$(401,{message:"Authentication required"})}if(!X)throw new Z$(401,{message:"Organization context required"});let Q=$.req.path.replace(/^.*\/files\//,"");if(!Q)throw new Z$(400,{message:"Missing file key"});let Y=await _t(Q,Z);if(!Y)throw new Z$(503,{message:"Object storage not configured"});if(Y.startsWith("data:")&&XJ()){let K=Y.match(/^data:([^;]+);base64,(.+)$/s);if(!K)throw new Z$(500,{message:"Invalid data URL from storage"});let[,H,F]=K,N=Buffer.from(F,"base64"),U=new Headers({"Content-Type":H,"Cache-Control":"private, max-age=86400"});return Xi$(U,H),new Response(N,{status:200,headers:U})}let G=new Headers;for(let K of QD6){let H=$.req.header(K);if(H)G.set(K,H)}let J=await fetch(Y,{headers:G});if(J.status===403||J.status===404)throw new Z$(404,{message:"File not found"});if(!J.ok&&J.status!==304&&J.status!==416)throw console.error(`[files] upstream storage error ${J.status} for key:`,Q),new Z$(502,{message:"Upstream storage error"});let W=new Headers;for(let K of YD6){let H=J.headers.get(K);if(H)W.set(K,H)}return W.set("Cache-Control","private, max-age=86400"),Xi$(W,W.get("content-type")??""),new Response(J.body,{status:J.status,headers:W})});Yi$=Qi$});var la=_((vv)=>{var GD6=vv&&vv.__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]}),JD6=vv&&vv.__exportStar||function($,Z){for(var X in $)if(X!=="default"&&!Object.prototype.hasOwnProperty.call(Z,X))GD6(Z,$,X)};Object.defineProperty(vv,"__esModule",{value:!0});JD6(_Y(),vv)});var Ki$=_((Ji$)=>{Object.defineProperty(Ji$,"__esModule",{value:!0});Ji$.version=void 0;Ji$.version="3.4.0"});var Ni$=_((xH)=>{var WD6=xH&&xH.__importDefault||function($){return $&&$.__esModule?$:{default:$}};Object.defineProperty(xH,"__esModule",{value:!0});xH.NodeTransport=xH.VERSION=void 0;xH.nodeResolveHost=BD6;var $5=la(),KD6=A0("net"),zX1=A0("tls"),HD6=A0("path"),Hi$=A0("fs"),FD6=WD6(A0("dns")),ND6=Ki$();xH.VERSION=ND6.version;var UD6="nats.js";class Fi${socket;version;lang;yields=[];signal=(0,$5.deferred)();closedNotification=(0,$5.deferred)();options;connected=!1;tlsName="";done=!1;closeError;constructor(){this.lang=UD6,this.version=xH.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,$5.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 $5.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 $5.errors.ConnectionError("error connecting - node provided an undefined error");let{code:J}=G,W=J==="ECONNREFUSED"?new $5.errors.ConnectionError("connection refused",{cause:G}):G;throw this.socket?.destroy(),W}}dial($){let Z=(0,$5.deferred)(),X,Q=(0,KD6.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,$5.deferred)(),Z;return this.socket.on("data",(X)=>{this.yields.push(X);let Q=$5.DataBuffer.concat(...this.yields),Y=(0,$5.extractProtocolMessage)(Q);if(Y!=="")try{let G=$5.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,$5.deferred)();try{if($=(0,HD6.resolve)($),!(0,Hi$.existsSync)($))Z.reject(Error(`${$} doesn't exist`));(0,Hi$.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,$5.extend)(X,this.options.tls,Y)}catch(Y){return Promise.reject(new $5.errors.ConnectionError(Y.message,{cause:Y}))}let Q=(0,$5.deferred)();try{let Y=(0,zX1.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 $5.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,$5.extend)(Z,this.options.tls,Q)}catch(Q){return Promise.reject(new $5.errors.ConnectionError(Q.message,{cause:Q}))}let X=(0,$5.deferred)();try{let Q=(0,zX1.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 $5.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,$5.render)($[Z])}`);yield $[Z]}if(this.done)break;else if(this.yields.length===0)$.length=0,this.yields=$,this.signal=(0,$5.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 zX1.TLSSocket}_send($){if(this.isClosed||this.socket===void 0)return Promise.resolve();if(this.options.debug)console.info(`< ${(0,$5.render)($)}`);let Z=(0,$5.deferred)();try{this.socket.write($,(X)=>{if(X){if(this.options.debug)console.error(`!!! ${(0,$5.render)($)}: ${X}`);return Z.reject(X)}return Z.resolve()})}catch(X){if(this.options.debug)console.error(`!!! ${(0,$5.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}}xH.NodeTransport=Fi$;function BD6($){let Z=(0,$5.deferred)();return FD6.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 Li$=_((Di$)=>{Object.defineProperty(Di$,"__esModule",{value:!0});Di$.connect=OD6;var Ui$=Ni$(),Bi$=la(),Oi$=la();function OD6($={}){if((0,Oi$.hasWsProtocol)($))return Promise.reject(Oi$.errors.InvalidArgumentError.format("servers","node client doesn't support websockets, use the 'wsconnect' function instead"));return(0,Bi$.setTransportFactory)({factory:()=>{return new Ui$.NodeTransport},dnsResolveFn:Ui$.nodeResolveHost}),Bi$.NatsConnectionImpl.connect($)}});var wi$=_((JU)=>{var LD6=JU&&JU.__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]}),wD6=JU&&JU.__exportStar||function($,Z){for(var X in $)if(X!=="default"&&!Object.prototype.hasOwnProperty.call(Z,X))LD6(Z,$,X)};Object.defineProperty(JU,"__esModule",{value:!0});JU.connect=void 0;var ED6=Li$();Object.defineProperty(JU,"connect",{enumerable:!0,get:function(){return ED6.connect}});wD6(la(),JU)});function Pi$($){let Z=$?.connectFn??AD6,X=null,Q=null,Y=!1,G=!1,J=!1,W=[];function K(){return X!==null&&!X.isClosed()&&!X.isDraining()&&!J}function H(){console.log(`[NatsProvider] fireReady: ${W.length} callbacks`);for(let U of W)try{U()}catch{}}function F(U){(async()=>{for await(let B of U.status())if(B.type==="disconnect")console.log("[NatsProvider] Disconnected"),J=!0;else if(B.type==="reconnect")console.log("[NatsProvider] Reconnected, re-firing ready callbacks"),J=!1,Q=null,H()})().catch(()=>{})}async function N(U,B){let O=0;while(!G)try{X=await Z({servers:U,timeout:PD6,reconnect:!0,maxReconnectAttempts:-1,...B?{authenticator:B}:{}}),console.log(`[NatsProvider] Connected to ${X.getServer()} after ${O} attempt(s)`),Q=null,J=!1,F(X),H();return}catch{O++;let L=Q7(zD6,jD6,O-1,2,0.5);await w$(L)}}return{init(U,B){if(Y)return;Y=!0,G=!1;let O=B?.creds?Ei$.credsAuthenticator(new TextEncoder().encode(B.creds)):void 0;N(U,O).catch(()=>{})},isConnected(){return K()},getConnection(){return K()?X:null},getJetStream(){if(!K())return null;if(!Q)Q=zi$.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 AD6($){return ji$.connect($)}var Ei$,ji$,zi$,jD6=100,zD6=3000,PD6=3000;var Ai$=D(()=>{Z4();Ei$=V(hl(),1),ji$=V(wi$(),1),zi$=V(wU(),1)});function PX1($,Z){return`${$}.${Z}`}class AX1{cache;constructor($){this.cache=Pu({ttlMs:$?.ttlMs??TD6,maxSize:$?.maxSize??RD6})}async get($,Z){return this.cache.get(PX1($,Z))??null}async set($,Z,X){this.cache.set(PX1($,Z),X)}async invalidate($,Z){this.cache.delete(PX1($,Z))}teardown(){this.cache.clear()}}var TD6=600000,RD6=5000;var Ti$=()=>{};function sT0($,Z){return`${$}:${Z}`}function TX1($){let Z=Pu({ttlMs:$?.ttlMs??ID6,maxSize:$?.maxSize??qD6}),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(Ri$,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(sT0(K,H))},set(K,H,F){Z.set(sT0(K,H),F)},invalidate(K,H){Z.delete(sT0(K,H)),W(K,H)},start(){if(J)return;let K=X?.();if(!K)return;J=K.subscribe(Ri$),(async()=>{for await(let H of J)try{let F=JSON.parse(G.decode(H.data));if(F.originId===Q)continue;Z.delete(sT0(F.organizationId,F.keyId))}catch{}})().catch(console.error)},teardown(){J?.unsubscribe(),J=null,Z.clear()}}}var Ri$="studio.ai-provider-keys.invalidate",ID6=30000,qD6=5000;var Ii$=()=>{};class RX1{options;subscription=null;onCancel=null;encoder=new TextEncoder;originId=crypto.randomUUID();constructor($){this.options=$}async start($){if($)this.onCancel=$;if(this.subscription)return;if(!this.onCancel)return;let Z=this.options.getConnection();if(!Z)return;let X=new TextDecoder,Q=Z.subscribe("studio.decopilot.cancel");this.subscription=Q,(async()=>{for await(let Y of Q)try{let G=JSON.parse(X.decode(Y.data));if(G.originId===this.originId)continue;this.onCancel?.(G.taskId)}catch{}})().catch(console.error)}broadcast($){if(/[.*>\s]/.test($)){console.warn("[NatsCancelBroadcast] Invalid threadId, skipping broadcast");return}this.onCancel?.($);try{let Z=this.options.getConnection();if(!Z)return;let X=this.encoder.encode(JSON.stringify({taskId:$,originId:this.originId}));Z.publish("studio.decopilot.cancel",X)}catch(Z){console.warn("[NatsCancelBroadcast] Publish failed (non-critical):",Z)}}async stop(){this.subscription?.unsubscribe(),this.subscription=null,this.onCancel=null}}var qi$=($)=>{let Z;return()=>Z??=$()},IX1,qX1;var Mi$=D(()=>{G6();IX1=qi$(()=>J$.createHistogram("decopilot.stream.encode_ms",{description:"Per-chunk JSON.stringify+encode time for decopilot stream",unit:"ms"})),qX1=qi$(()=>J$.createCounter("decopilot.stream.published_chunks",{description:"Logical decopilot stream chunks published to JetStream",unit:"{chunks}"}))});function vD6($=Si$){return{name:ZH,subjects:[`${fs0}.>`],storage:IW.StorageType.File,max_age:VD6,max_bytes:CD6,max_msgs_per_subject:_D6,discard:IW.DiscardPolicy.Old,retention:IW.RetentionPolicy.Limits,duplicate_window:SD6,num_replicas:$}}class Ci${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 ki$($){let Z=Vi$.headers();for(let[X,Q]of Object.entries($))Z.set(X,Q);return Z}function yD6($,Z){let X=0;return{publish(Q,Y,G,J){Q.publish(Y,G,J?{headers:J}:void 0).catch((W)=>{if(X++,kD6().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 gD6($,Z){return $.info?.cluster?Z:1}function hD6($){if(!($ instanceof Error))return!1;if(/non-clustered/i.test($.message))return!0;return/replicas?\b/i.test($.message)&&/not supported|can ?not|exceed|insufficient|greater than/i.test($.message)}class MX1{options;js=null;jsm=null;constructor($){this.options=$}async init(){let $=this.options.getConnection();if(!$){console.log("[Decopilot] StreamBuffer.init skipped: NATS not connected yet");return}let Z=async(Q,Y)=>{let G=vD6(Y);try{await Q.streams.info(ZH),await Q.streams.update(ZH,G)}catch(J){if(J instanceof Error&&J.message.includes("stream not found"))await Q.streams.add(G),await Q.streams.update(ZH,G);else if(J instanceof Error&&/can ?not change.*storage|storage type/i.test(J.message))await Q.streams.delete(ZH),await Q.streams.add(G);else throw J}},X=await O6(async()=>{let Q=this.options.getJetStreamManager?await this.options.getJetStreamManager():await IW.jetstreamManager($),Y=gD6($,Si$);try{await Z(Q,Y)}catch(G){if(Y<=1||!hD6(G))throw G;console.warn(`[Decopilot] StreamBuffer: NATS rejected num_replicas=${Y} (${G.message}); falling back to an unreplicated stream`),await Z(Q,1)}return Q},{maxAttempts:5,minTimeout:250,maxTimeout:4000,jitter:0.5,isRetriable:mg});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=yD6(Z,Q),J=!1,W=()=>{if(J)return;J=!0;let H=eO$(Z);Y.publish(H.subject,H.data).catch(()=>{})};X.addEventListener("abort",W,{once:!0});let K=(H)=>{let F=performance.now(),N=xs0(H,{runId:Z}),U=performance.now()-F;IX1().record(U),qX1().add(1,{"org.id":Q??"unknown"}),xD6?.record(U,N.reduce((B,O)=>B+O.data.length,0));for(let B of N)G.publish(Y,B.subject,B.data,B.headers?ki$(B.headers):void 0)};return(async()=>{let H=$.getReader(),F=0,N=0,U;try{while(!0){let{done:B,value:O}=await H.read();if(B)break;if(K(O),N++,++F>=64)F=0,await new Promise((L)=>setImmediate(L))}}catch(B){U=B,console.warn(`[Decopilot] stream pump error for thread ${Z}:`,B?.message??B)}finally{if(H.releaseLock(),W(),bD6)console.warn(JSON.stringify({msg:"decopilot-stream-diag",event:"pump-done",taskId:Z,publishedChunks:N,publishErrors:G.errorCount}))}if(U!==void 0)throw U})()}async publishSerialized($,Z){try{return await O6(()=>$.publish(Z.subject,Z.data,{...Z.headers?{headers:ki$(Z.headers)}:{},...Z.msgId?{msgID:Z.msgId}:{}}),{maxAttempts:6,minTimeout:250,maxTimeout:5000,jitter:0.5,isRetriable:mg}),!0}catch(X){return console.error(`[Decopilot] publish failed after retries subject=${Z.subject}`,X),!1}}async publishRawChunk($,Z,X){let Q=this.js;if(!Q)return!1;let Y=performance.now(),G=xs0(Z,{runId:$,dedup:X});IX1().record(performance.now()-Y),qX1().add(1);for(let J of G)if(!await this.publishSerialized(Q,J))return!1;return!0}async publishDone($,Z,X){let Q=this.js;if(!Q)return!1;let Y=aO$({runId:$,fenceToken:Z,finalSeq:X});return await this.publishSerialized(Q,Y)}async createTailStream($,Z,X){let Q=this.js;if(!Q)return console.warn(`[Decopilot] createTailStream: JetStream client unavailable for thread ${$}; no live tail`),null;let Y=X?.deliverPolicy==="new"?IW.DeliverPolicy.New:IW.DeliverPolicy.All,G=X?.closeOnDone??!1,J=ED($),W;try{W=await O6(async()=>{return(await Q.consumers.get(ZH,{filter_subjects:J,deliver_policy:Y})).consume()},{maxAttempts:6,minTimeout:250,maxTimeout:5000,jitter:0.5,isRetriable:mg})}catch(L){return console.warn("[Decopilot] JetStream tail unavailable (non-critical):",L?.message??L),null}let F=Vw0({messages:async function*(){try{for await(let L of W)yield{subject:L.subject,data:L.data,headers:L.headers}}finally{W.stop()}}(),onCancel:()=>W.stop()}).pipeThrough(Iw0()).pipeThrough(qw0()).getReader(),N=!1,U=()=>{if(N)return;N=!0;try{F.releaseLock()}catch{}},B=!1,O=()=>{if(B)return;B=!0,W.stop(),F.cancel().catch(()=>{}),U()};return Z?.addEventListener("abort",O,{once:!0}),new ReadableStream({async pull(L){for(;;){let{done:w,value:E}=await F.read();if(w){O(),L.close();return}let j=E;if(j.kind==="done"){if(G){O(),L.close();return}continue}L.enqueue(j.chunk);return}},cancel(){O()}})}purge($){if(!this.jsm)return;this.jsm.streams.purge(ZH,{filter:ED($)}).catch(()=>{})}teardown(){this.js=null,this.jsm=null}}var IW,Vi$,MD6=($)=>{let Z;return()=>Z??=$()},kD6,VD6=86400000000000,SD6=120000000000,CD6=4294967296,Si$,_D6=500000,fD6,bD6,xD6;var _i$=D(()=>{Z4();ys0();Sw0();Mw0();G6();Mi$();IW=V(wU(),1),Vi$=V(hl(),1),kD6=MD6(()=>J$.createCounter("decopilot.stream.publish_errors",{description:"Number of JetStream publish failures for decopilot stream chunks",unit:"{errors}"})),Si$=Math.max(1,Number(process.env.DECOPILOT_STREAM_REPLICAS??3)||3);fD6=process.env.STREAM_ENCODE_TRACE==="1",bD6=process.env.DECOPILOT_STREAM_TRACE==="1";xD6=fD6?new Ci$:null});function aT0($,Z,X,Q){if(!Q)return!1;return $.emit(Z,tW(X,Q.status,{title:Q.title??void 0,virtualMcpId:Q.virtual_mcp_id??void 0,createdBy:Q.created_by??void 0,triggerId:Q.trigger_id??null,branch:Q.branch??null,harnessId:Q.harness_id??void 0,createdAt:Q.created_at,updatedAt:Q.updated_at})),!0}var vi$=D(()=>{v8()});class kX1{storage;options;timer=null;constructor($,Z={}){this.storage=$;this.options=Z}start(){if(this.timer)return;let $=this.options.intervalMs??300000;this.timer=setInterval(()=>{this.runOnce()},$)}async runOnce(){let $=this.options.staleAfterMs??3600000;try{let Z=await this.storage.sweepAbandoned($);if(Z>0)console.log(`[async-research-sweeper] marked ${Z} stale jobs as abandoned`);return Z}catch(Z){return console.error("[async-research-sweeper] sweep failed",Z),0}}dispose(){if(this.timer)clearInterval(this.timer),this.timer=null}}async function fi$($,Z,X){let Q=Z.organizationId;if(!QY(Z,(await t9($,Q)).review))return!1;if(!dC(X))return!1;if(await $.storage.taskBoard.hasHumanRejectedDone(Z.id,Q))return!1;let Y=await $.storage.organizationSettings.get(Q),G=IK(Y?.flags),J=await T6($,Q),W=await $.storage.taskBoard.update(Z.id,Q,XY(J,G),Z.updatedBy);return await R6($,{taskBoardItemId:Z.id,action:"status_changed",actorId:null,data:{from:Z.status,to:G,reason:"pr_merged"}}),x$(Q,W),console.log(`[task-board-review-sweeper] ${Z.id}: linked PR already merged \u2014 moved to ${G}`),!0}var bi$=D(()=>{z6();UX();qg();v5();pK();z5()});function pD6($){return $ instanceof $Q}function nD6($,Z){return Z-$>=mD6}class VX1{taskBoard;contextFactory;billing;db;options;timer=null;running=!1;cursor=null;constructor($,Z,X,Q,Y={}){this.taskBoard=$;this.contextFactory=Z;this.billing=X;this.db=Q;this.options=Y}start(){if(this.timer)return;let $=this.options.intervalMs??uD6;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??cD6,X=this.options.itemIntervalMs??lD6,Q=new Date(Date.now()-X),Y=await this.taskBoard.listItemsPendingReview(Z,this.cursor,Q),G=Y.at(-1);this.cursor=Y.length===Z&&G?{updatedAt:G.updatedAt,id:G.id}:null;for(let{id:J,organizationId:W}of Y)try{if(await this.reconcileItem(J,W,Q))$++}catch(K){console.error(`[task-board-review-sweeper] ${J} failed`,K)}await this.reapNeverStartedThreads(Z),$+=await this.dispatchDueRetries(Z),await this.reactToUnhandledFailures(Z)}catch(Z){console.error("[task-board-review-sweeper] sweep failed",Z)}finally{this.running=!1}return $}async reapNeverStartedThreads($){try{let Z=await this.taskBoard.failNeverStartedLinkedThreads($,new Date(Date.now()-et0),Lr0);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()-iD6));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 Br0(this.taskBoard,Y,Q,await lK(this.db,Q)),await Or0(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),W=await lK(this.db,Y);if(!J||J.status!==W.progress||J.assigneeId!==Q8)continue;let K=await this.contextFactory(Y,J.assignedBy??J.createdBy);if(!K)continue;await zN(K,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),pD6(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()+dD6),(await lK(this.db,Y)).progress).catch((W)=>console.error(`[task-board-review-sweeper] re-arming ${Q} failed`,W))}return Z}async returnToTodo($,Z,X){try{let Q=await lK(this.db,Z),Y=await this.taskBoard.getById($,Z);if(!Y||Y.status!==Q.progress)return;let G=await this.taskBoard.returnToTodoAfterFailure($,Z,Y.updatedBy,Q);if(!G)return;await this.taskBoard.recordActivity({taskBoardItemId:$,action:"status_changed",actorId:null,data:{from:"in_progress",to:"todo",reason:X}}).catch(()=>{}),x$(Z,G)}catch(Q){console.error(`[task-board-review-sweeper] returning ${$} to todo failed`,Q)}}async handOffReviewWithoutPr($,Z){let X=await this.taskBoard.listActivity(Z.id,Z.organizationId);if(!nD6(nF(X,Z.reviewCycleStartedAt),Date.now()))return;await tK($,Z,"no pull request is linked to this task \u2014 there is nothing for a "+"reviewer to review")}async reconcileItem($,Z,X){if(!await this.taskBoard.claimSweep($,Z,X))return!1;let Q=await this.taskBoard.getById($,Z);if(!Q)return!1;let Y=await lK(this.db,Z);if(!QY(Q,Y.review))return!1;let G=Q.assigneeId===Q8,J=await this.taskBoard.listPrs($,Z),W=await this.contextFactory(Z,Q.assignedBy??Q.createdBy);if(!W)return!1;if(J.length===0){if(G)await this.handOffReviewWithoutPr(W,Q);return!1}let K=await Promise.all(J.map(async(H)=>({...H,...await kg(Z,H)})));if(K.every((H)=>H.state===null))console.warn(`[task-board-review-sweeper] ${$}: no live PR state from GitHub (${K.length} PR(s)) \u2014 proceeding on unknown`);if(await fi$(W,Q,K))return!0;if(await mD$(W,Q))return!0;if(await this.resolveConflictFromSweep(W,Q,K))return!0;if(!G)return!1;if(!$r0(K))return!1;return await vL0(W,Q,{previewMatchesHead:Zr0(K)}),!0}async resolveConflictFromSweep($,Z,X){let Q=X.find((Y)=>Y.state!=="closed"&&Y.conflict===!0);if(!Q)return!1;return await FD($,Z.organizationId,Z,{pr:{number:Q.number,url:Q.url},conflict:!0}).catch((Y)=>{return console.error("[task-board-review-sweeper] conflict resolve failed",Y),!1})}dispose(){if(this.timer)clearInterval(this.timer),this.timer=null}}var uD6=60000,lD6=300000,cD6=50,dD6=60000,mD6=900000,iD6=120000;var xi$=D(()=>{v5();z6();po0();PN();et();pK();bi$();z5();JJ();wr0();YY();kt();Mg()});import{readdir as tD6,rm as eT0}from"fs/promises";import{join as $20}from"path";async function Z20($){let Z=new Date;Z.setUTCDate(Z.getUTCDate()-oD6),Z.setUTCHours(0,0,0,0);let X=0;try{let Q=await fv($);for(let Y of Q)if(/^\d{4}$/.test(Y))X+=await yi$($,Y,Z);else if(!Y.startsWith(".")){let G=$20($,Y),J=await fv(G);for(let K of J){if(!/^\d{4}$/.test(K))continue;X+=await yi$(G,K,Z)}if((await fv(G)).length===0)await eT0(G,{recursive:!0,force:!0})}}catch(Q){console.warn("monitoring retention cleanup failed:",Q)}return X}async function yi$($,Z,X){let Q=0,Y=$20($,Z),G=await fv(Y);for(let W of G){if(!/^\d{2}$/.test(W))continue;let K=$20(Y,W),H=await fv(K);for(let N of H){if(!/^\d{2}$/.test(N))continue;let U=new Date(`${Z}-${W}-${N}T00:00:00Z`);if(isNaN(U.getTime()))continue;if(U<X){let B=$20(K,N);await eT0(B,{recursive:!0,force:!0}),Q++}}if((await fv(K)).length===0)await eT0(K,{recursive:!0,force:!0})}if((await fv(Y)).length===0)await eT0(Y,{recursive:!0,force:!0});return Q}async function fv($){try{return(await tD6($)).filter((X)=>!X.startsWith("."))}catch{return[]}}var oD6=30;var SX1=()=>{};import{DBOS as CX1,SchedulerMode as rD6}from"@dbos-inc/dbos-sdk";async function aD6(){let $=[nJ(),bv(),uH()],Z=0;for(let X of $)try{Z+=await Z20(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 eD6($,Z){await CX1.runStep(()=>aD6(),{name:"monitoringRetention"})}function hi$(){if(gi$)return;gi$=!0;let $=CX1.registerWorkflow(eD6,{name:"monitoringRetentionWorkflow"});CX1.registerScheduled($,{name:"monitoringRetentionWorkflow",crontab:sD6,mode:rD6.ExactlyOncePerIntervalWhenActive})}var sD6="23 4 * * *",gi$=!1;var ui$=D(()=>{kY();SX1()});function li$($){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 EJ.create();Y.auth.user={id:X,role:Q.role},Y.organization={id:Q.orgId,slug:Q.orgSlug,name:Q.orgName};let G=await xt($.db,Z,Q.role);return Y.boundAuth=q91({auth:Y.authInstance,headers:new Headers,role:Q.role,permissions:G,userId:X}),Y.access=new JE(X,void 0,Y.boundAuth,Q.role,"self"),WD(Y,{id:Q.orgId,slug:Q.orgSlug}),Y}}var ci$=D(()=>{tB();KD()});function $L6(){return[{name:"Postgres",status:"pending",port:0},{name:"NATS",status:"pending",port:0}]}function ZL6(){return{services:$L6(),migrationsStatus:"pending",serverUrl:null,logs:[]}}function QL6(){for(let $ of XL6)$()}function di$($){let Z=[..._X1.logs,$];_X1={..._X1,logs:Z.length>500?Z.slice(-500):Z},QL6()}function vX1(){return YL6}var _X1,XL6,YL6=!1;var fX1=D(()=>{_X1=ZL6(),XL6=new Set});import{EventEmitter as GL6}from"events";var bX1;var mi$=D(()=>{fX1();bX1=new GL6;bX1.on("request",($)=>{di$($)})});function ii$(){return async($,Z)=>{let X=Date.now(),Q=$.req.method,Y=$.req.path;if(Y==="/api/auth/get-session"||Y.includes("favicon")){await Z();return}let G="",J=!1;if(Y.startsWith("/mcp")&&Q==="POST"){J=!0;try{if($.req.header("Content-Type")?.includes("application/json")){let U=await $.req.raw.clone().json();if(U.method==="tools/call"&&U.params?.name){let B=Dl(U.params.name),O=U.params.arguments||{},L=Object.keys(O).map((E)=>Dl(E)),w=L.length>0?L.slice(0,3).join(",")+(L.length>3?"\u2026":""):"";G=`${K5.tool}${B}${K5.dim}(${w})${K5.reset}`}else if(U.method)G=`${K5.dim}${Dl(U.method)}${K5.reset}`}}catch{}}let W=Dl(Y);if(Y.startsWith("/mcp/conn_")){let F=Y.split("/")[2]??"";W=`/mcp/${K5.mcp}${Dl(F.slice(0,12))}\u2026${K5.reset}`}else if(Y==="/mcp")W=`${K5.mcp}/mcp${K5.reset}`;else if(Y==="/mcp/registry")W=`${K5.mcp}/mcp/registry${K5.reset}`;let K=WL6(Q),H=J?"\u25C0":"\u2190";if(!vX1())console.log(`${K5.dim}${H}${K5.reset} ${K}${Q}${K5.reset} ${W}${G?` ${G}`:""}`);try{await Z()}finally{let F=Date.now()-X,N=$.res.status,U=JL6(N),B=F<1000?`${F}ms`:`${(F/1000).toFixed(1)}s`,O=J?"\u25B6":"\u2192";if(!vX1())console.log(`${K5.dim}${O}${K5.reset} ${K}${Q}${K5.reset} ${W}${G?` ${G}`:""} ${U}${N}${K5.reset} ${K5.duration}${B}${K5.reset}`);bX1.emit("request",{method:Q,path:Dl(Y),status:N,duration:F,timestamp:new Date})}}}var K5,JL6=($)=>{if($>=500)return K5.serverError;if($>=400)return K5.clientError;if($>=300)return K5.redirect;return K5.ok},WL6=($)=>{return K5[$]||K5.reset},Dl=($)=>{return $.replace(/\r/g,"").replace(/\n/g,"").replace(/\x1b\[[0-9;]*m/g,"").replace(/[\x00-\x1f\x7f-\x9f]/g,"")};var pi$=D(()=>{fX1();mi$();K5={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 ri$}from"crypto";import{mkdir as KL6,readdir as HL6,rm as ni$,stat as si$}from"fs/promises";import{join as yX1,relative as FL6}from"path";import{z as T$}from"zod";function ei$($){let Z=$.replace(/[^a-zA-Z0-9_-]/g,"_");return yX1(NL6,Z)}function $p$($){return $.replace(/^\/+/,"").replace(/\.\./g,"")}function xX1($,Z){let X=ei$($),Q=$p$(Z);return yX1(X,Q)}function UL6($,Z,X,Q){let Y=S0().encryptionKey||"dev-secret",G=`${$}:${Z}:${X}:${Q}`;return ri$("sha256",Y).update(G).digest("hex")}function oi$($,Z,X,Q,Y){let G=Math.floor(Date.now()/1000)+Q,J=UL6(Z,X,G,Y),W=new URL(`/api/dev-assets/${Z}/${$p$(X)}`,$);return W.searchParams.set("expires",G.toString()),W.searchParams.set("signature",J),W.searchParams.set("method",Y),W.toString()}function Zp$($,Z,X){let Q=`${$}:${Z.getTime()}:${X}`;return`"${ri$("md5","etag").update(Q).digest("hex")}"`}async function Xp$($,Z,X,Q,Y){try{let G=await HL6($,{withFileTypes:!0});for(let J of G){let W=yX1($,J.name),H=FL6(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 Xp$(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 si$(W);Y.objects.push({key:H,size:F.size,lastModified:F.mtime.toISOString(),etag:Zp$(W,F.mtime,F.size)})}catch{}}}}catch{}}function Qp$($,Z){let Q=n($).id;return[{name:"LIST_OBJECTS",description:"List objects in the local assets directory with pagination support",inputSchema:T$.object({prefix:T$.string().optional(),maxKeys:T$.number().optional().default(1000),continuationToken:T$.string().optional(),delimiter:T$.string().optional()}),outputSchema:T$.object({objects:T$.array(T$.object({key:T$.string(),size:T$.number(),lastModified:T$.string(),etag:T$.string()})),nextContinuationToken:T$.string().optional(),isTruncated:T$.boolean(),commonPrefixes:T$.array(T$.string()).optional()}),handler:async(Y)=>{let G=Y,J=G.prefix||"",W=G.maxKeys??1000,K=G.delimiter,H=G.continuationToken,F=ei$(Q);await KL6(F,{recursive:!0});let N={objects:[],commonPrefixes:new Set};await Xp$(F,F,J,K,N),N.objects.sort((w,E)=>w.key.localeCompare(E.key));let U=0;if(H){if(U=N.objects.findIndex((w)=>w.key>H),U===-1)U=N.objects.length}let B=N.objects.slice(U,U+W),O=U+W<N.objects.length,L=O?B[B.length-1]?.key:void 0;return{objects:B,isTruncated:O,nextContinuationToken:L,commonPrefixes:Array.from(N.commonPrefixes).sort()}}},{name:"GET_OBJECT_METADATA",description:"Get metadata for a file in the local assets directory",inputSchema:T$.object({key:T$.string()}),outputSchema:T$.object({contentType:T$.string().optional(),contentLength:T$.number(),lastModified:T$.string(),etag:T$.string(),metadata:T$.record(T$.string(),T$.string()).optional()}),handler:async(Y)=>{let G=Y,J=xX1(Q,G.key),W=await si$(J);return{contentType:LZ1(G.key),contentLength:W.size,lastModified:W.mtime.toISOString(),etag:Zp$(J,W.mtime,W.size)}}},{name:"GET_PRESIGNED_URL",description:"Generate a presigned URL for downloading a file from local storage",inputSchema:T$.object({key:T$.string(),expiresIn:T$.number().optional()}),outputSchema:T$.object({url:T$.string(),expiresIn:T$.number()}),handler:async(Y)=>{let G=Y,J=G.expiresIn??ti$;return{url:oi$(Z,Q,G.key,J,"GET"),expiresIn:J}}},{name:"PUT_PRESIGNED_URL",description:"Generate a presigned URL for uploading a file to local storage",inputSchema:T$.object({key:T$.string(),expiresIn:T$.number().optional(),contentType:T$.string().optional()}),outputSchema:T$.object({url:T$.string(),expiresIn:T$.number()}),handler:async(Y)=>{let G=Y,J=G.expiresIn??ti$;return{url:oi$(Z,Q,G.key,J,"PUT"),expiresIn:J}}},{name:"DELETE_OBJECT",description:"Delete a single file from local storage",inputSchema:T$.object({key:T$.string()}),outputSchema:T$.object({success:T$.boolean(),key:T$.string()}),handler:async(Y)=>{let G=Y,J=xX1(Q,G.key);try{return await ni$(J),{success:!0,key:G.key}}catch{return{success:!1,key:G.key}}}},{name:"DELETE_OBJECTS",description:"Delete multiple files from local storage",inputSchema:T$.object({keys:T$.array(T$.string()).max(1000)}),outputSchema:T$.object({deleted:T$.array(T$.string()),errors:T$.array(T$.object({key:T$.string(),message:T$.string()}))}),handler:async(Y)=>{let G=Y,J=[],W=[];return await Promise.all(G.keys.map(async(K)=>{let H=xX1(Q,K);try{await ni$(H),J.push(K)}catch(F){W.push({key:K,message:F instanceof Error?F.message:"Unknown error"})}})),{deleted:J,errors:W}}}]}async function gX1($,Z,X){let Q=Qp$(Z,X),Y=new ZK({name:"dev-assets-mcp",version:"1.0.0"},{capabilities:{tools:{}},jsonSchemaValidator:B5});for(let J of Q){let W="shape"in J.inputSchema?J.inputSchema.shape:T$.object({}).shape,K=J.outputSchema&&"shape"in J.outputSchema?J.outputSchema.shape:T$.object({}).shape;Y.registerTool(J.name,{description:J.description??"",inputSchema:W,outputSchema:K,annotations:J.annotations,_meta:J._meta},async(H)=>{try{let F=await J.handler(H);return{content:[{type:"text",text:JSON.stringify(F)}],structuredContent:F}}catch(F){return{content:[{type:"text",text:`Error: ${F.message}`}],isError:!0}}})}let G=new FQ({enableJsonResponse:$.headers.get("Accept")?.includes("application/json")??!1});return await Y.connect(G),MJ(Y,G,$,"mcp:dev-assets")}async function Yp$($,Z,X,Q){let G=Qp$(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 NL6="./data/assets",ti$=3600,ai$,Gp$;var Jp$=D(()=>{E$();sg();X8();Km();w_();dX();sA0();ai$=new K1;ai$.all("/",async($)=>{let Z=$.get("studioContext"),X=new URL($.req.url),Q=`${X.protocol}//${X.host}`;return gX1($.req.raw,Z,Q)});Gp$=ai$});var Wp$={};W4(Wp$,{mountDevRoutes:()=>BL6});function BL6($,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 gX1(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 Yp$(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",Gp$);let X=new K1;X.use("*",TW({mountPath:"/api/dev-assets"})),X.route("/",rA0({orgFromPath:!1})),$.route("/api/dev-assets",X)}var Kp$=D(()=>{X8();WZ1();sA0();Jp$()});import{sql as OL6}from"kysely";import{randomUUID as Hp$}from"crypto";import{z as DL6}from"zod";async function wL6($){let Z=new Date().toISOString(),X=Hp$(),Q=_8.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:Hp$(),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 OL6`SELECT
|
|
2987
2987
|
pg_notify('studio_events', ${X}),
|