decocms 4.358.2 → 4.358.3
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-B4feVBXY.js → AlertCircle-CeZShh3U.js} +1 -1
- package/dist/client/assets/{AreaChart-xk7ixbvq.js → AreaChart-DaOi1JnH.js} +1 -1
- package/dist/client/assets/{ArrowLeft-CEiALrg5.js → ArrowLeft-BHyMBVmj.js} +1 -1
- package/dist/client/assets/{ArrowRight-BTq6Mik4.js → ArrowRight-t0H2SUBp.js} +1 -1
- package/dist/client/assets/{ArrowUp-DUd1tvoY.js → ArrowUp-Dk3SGv4e.js} +1 -1
- package/dist/client/assets/{Check-DSznPieK.js → Check-CUGiQ-dz.js} +1 -1
- package/dist/client/assets/{CheckCircle-BoKMuFFK.js → CheckCircle-DVzwjrU9.js} +1 -1
- package/dist/client/assets/{ChevronRight-hScC2vQT.js → ChevronRight-8Tl2pOiS.js} +1 -1
- package/dist/client/assets/{ChevronSelectorVertical-DYGDtqQU.js → ChevronSelectorVertical-CSPUzgWr.js} +1 -1
- package/dist/client/assets/{ChevronUp-D2N9Rnsm.js → ChevronUp-DxkK9vWN.js} +1 -1
- package/dist/client/assets/{Copy01-D6tBkCFE.js → Copy01-BfKD11Tj.js} +1 -1
- package/dist/client/assets/{CreditCard01-DHrVBbVQ.js → CreditCard01-PGpP4uYs.js} +1 -1
- package/dist/client/assets/{DotsVertical-DCodbdte.js → DotsVertical-BJxRgf31.js} +1 -1
- package/dist/client/assets/{Download01-DABFHb1d.js → Download01-VIgSb1Gt.js} +1 -1
- package/dist/client/assets/{ErrorBarContext-B6wKzwbu.js → ErrorBarContext-C1op1w1d.js} +1 -1
- package/dist/client/assets/{Eye-B3oSsvLj.js → Eye-Bc8Bp32w.js} +1 -1
- package/dist/client/assets/{GitBranch01-DzMJOGpq.js → GitBranch01-BmA02Aq6.js} +1 -1
- package/dist/client/assets/{Globe01-BrqsrpDf.js → Globe01-CsQbY1jq.js} +1 -1
- package/dist/client/assets/{HardDrive-GH60QJZP.js → HardDrive-CHfQTYzU.js} +1 -1
- package/dist/client/assets/{Image01-BXIhjY0H.js → Image01-ovi_dtKK.js} +1 -1
- package/dist/client/assets/{Key01-Cu5VaAjI.js → Key01-BUn_5WkH.js} +1 -1
- package/dist/client/assets/{Link01-BX-inToB.js → Link01-BPl-rDCZ.js} +1 -1
- package/dist/client/assets/{LinkExternal01-BeqAzxr0.js → LinkExternal01-DXt1rDQh.js} +1 -1
- package/dist/client/assets/{Monitor01-B8Eiio86.js → Monitor01-CL2iHj9m.js} +1 -1
- package/dist/client/assets/{Package-nKUXgWuw.js → Package-C_-Q5Esp.js} +1 -1
- package/dist/client/assets/{Palette-DR1mcJdO.js → Palette-Dusg_py1.js} +1 -1
- package/dist/client/assets/{Play-CUMxd8pI.js → Play-Cpfdc7s2.js} +1 -1
- package/dist/client/assets/{Plus-CWZNNoAx.js → Plus-BJwCMzrn.js} +1 -1
- package/dist/client/assets/{SearchLg-XAxRszGI.js → SearchLg-BaYqDNtw.js} +1 -1
- package/dist/client/assets/{SearchMd-s6uNB4wI.js → SearchMd-Dh1-DUlX.js} +1 -1
- package/dist/client/assets/{Sector-CJ2wnW0I.js → Sector-B1HJlQHP.js} +1 -1
- package/dist/client/assets/{Settings02-DbPGs1Rx.js → Settings02-BWRldyBo.js} +1 -1
- package/dist/client/assets/{Share07-sjsNxfH0.js → Share07-BDlgOZKG.js} +1 -1
- package/dist/client/assets/{Shield01-CXJEVef8.js → Shield01-CMKtSWGe.js} +1 -1
- package/dist/client/assets/{Stars01-BbALL_Dz.js → Stars01-DGMYzyka.js} +1 -1
- package/dist/client/assets/{Sun-D9EHkDHZ.js → Sun-oQiFMWS2.js} +1 -1
- package/dist/client/assets/{Tool01-Cgauvp7A.js → Tool01-Bx-khC3K.js} +1 -1
- package/dist/client/assets/{Tool02-CKD21joz.js → Tool02-DxZfvlXn.js} +1 -1
- package/dist/client/assets/{Trash01-D5k8EQTh.js → Trash01-SnqdhQxc.js} +1 -1
- package/dist/client/assets/{TrendUp01-Cp4l1k_8.js → TrendUp01-fhZolcLR.js} +1 -1
- package/dist/client/assets/{Upload01-jz7bmbIK.js → Upload01-CmJh_MJ7.js} +1 -1
- package/dist/client/assets/{User01-BwDlOx51.js → User01-BhatsblZ.js} +1 -1
- package/dist/client/assets/{UserSquare-CWwSbzOR.js → UserSquare-BSX82kso.js} +1 -1
- package/dist/client/assets/{Users01-BMy_qWce.js → Users01-Bjak-4We.js} +1 -1
- package/dist/client/assets/{Users03-ug4mReK5.js → Users03-B_lI977b.js} +1 -1
- package/dist/client/assets/{XCircle-CN2ioUu0.js → XCircle-BP-HhMLp.js} +1 -1
- package/dist/client/assets/{XClose-ClZTxkdu.js → XClose-DRn4_qWI.js} +1 -1
- package/dist/client/assets/{Zap-B4KpUTOC.js → Zap-CQJqW5vE.js} +1 -1
- package/dist/client/assets/{ZoomOut-DUIhc7iI.js → ZoomOut-y6M1cE6I.js} +1 -1
- package/dist/client/assets/{access-gate-PswGCIi5.js → access-gate-C_DMg6fs.js} +1 -1
- package/dist/client/assets/{agent-icon-PWN9uPtp.js → agent-icon-D228wxkn.js} +1 -1
- package/dist/client/assets/{agents-list-Cy704Di0.js → agents-list-1mLjidX7.js} +1 -1
- package/dist/client/assets/{ai-providers-D_yn2Kps.js → ai-providers-JgzkSKb9.js} +1 -1
- package/dist/client/assets/{alert-KgicFiyn.js → alert-CFqpXhB7.js} +1 -1
- package/dist/client/assets/{alert-dialog-Bjg29J3P.js → alert-dialog-B4oyCkOY.js} +1 -1
- package/dist/client/assets/{analytics-tab-WLPbHPxB.js → analytics-tab-imq4dkjn.js} +1 -1
- package/dist/client/assets/api-keys-BpxbZDLX.js +1 -0
- package/dist/client/assets/{api-keys-8V378lXS.js → api-keys-CsETZa8r.js} +1 -1
- package/dist/client/assets/{app-editor-CR5r-AtS.js → app-editor-BBvxmYsX.js} +1 -1
- package/dist/client/assets/{auth-catchall-C_UCoG9W.js → auth-catchall-Cwgd9j8I.js} +1 -1
- package/dist/client/assets/{auth-entry-Cuwr_VGY.js → auth-entry-DKTd-XWt.js} +1 -1
- package/dist/client/assets/{auth-Bc7owB5v.js → auth-qrQV_TPS.js} +1 -1
- package/dist/client/assets/{auth-split-layout-Botzu9So.js → auth-split-layout-CMRDUfSn.js} +1 -1
- package/dist/client/assets/{authenticate-and-persist-oauth-AWML-ztq.js → authenticate-and-persist-oauth-BLT-4u1H.js} +1 -1
- package/dist/client/assets/{automation-list-row-C4w0_Yq6.js → automation-list-row-mggz5xf0.js} +1 -1
- package/dist/client/assets/{automation-runs-B_p5OeyC.js → automation-runs-Bu6vmoPh.js} +1 -1
- package/dist/client/assets/{automations-CR1Pv9Ly.js → automations-CfcnI6My.js} +1 -1
- package/dist/client/assets/{autosend-CrytFey2.js → autosend-Z96CEx8G.js} +1 -1
- package/dist/client/assets/{avatar-yu57dhaD.js → avatar-DeXAxDZB.js} +1 -1
- package/dist/client/assets/{badge-mMw16-Pu.js → badge-DvDU4LEK.js} +1 -1
- package/dist/client/assets/{block-document-CkRsAO_A.js → block-document-ido7ztgK.js} +1 -1
- package/dist/client/assets/{breadcrumb-CC2ZhPB-.js → breadcrumb-gaxFV_EO.js} +1 -1
- package/dist/client/assets/{buckets-COWiCqWm.js → buckets-Hd3sFm29.js} +1 -1
- package/dist/client/assets/{bulk-category-panel-CqcCwrQ0.js → bulk-category-panel-C8oGx6ik.js} +1 -1
- package/dist/client/assets/{capability-load-error-CFvjxFBc.js → capability-load-error-C4J1O2Gg.js} +1 -1
- package/dist/client/assets/{cards-Dlq0pGY7.js → cards-BbNDRKbI.js} +1 -1
- package/dist/client/assets/{category-editor-B5y0eMGh.js → category-editor-CJzz5Prx.js} +1 -1
- package/dist/client/assets/{cdn-tab-BbhbA0tB.js → cdn-tab-C-Ot3r6K.js} +1 -1
- package/dist/client/assets/{chart-B1NG_PuC.js → chart-BBE-b-Nh.js} +1 -1
- package/dist/client/assets/{chat-context-Bz9AX9yW.js → chat-context-BeZYUQ1L.js} +1 -1
- package/dist/client/assets/{checkbox-C0yVK60S.js → checkbox-D6tCUs9Q.js} +1 -1
- package/dist/client/assets/{choose-editor-Cu-okl5i.js → choose-editor-_mZTthu2.js} +1 -1
- package/dist/client/assets/{cli-auth-success-yNjPM-kO.js → cli-auth-success-BdVdOnRf.js} +1 -1
- package/dist/client/assets/{client-icons-lMh-sqiv.js → client-icons-L8im1ccX.js} +1 -1
- package/dist/client/assets/{collection-detail-CClSHkGH.js → collection-detail-Cka0jgiZ.js} +1 -1
- package/dist/client/assets/{collection-display-button-BdIYh2Ep.js → collection-display-button-BIciTVsL.js} +1 -1
- package/dist/client/assets/{collection-search-CwqJ9Dia.js → collection-search-E3r51olD.js} +1 -1
- package/dist/client/assets/{collection-table-wrapper-DLYv8gtk.js → collection-table-wrapper-BrWvVUZZ.js} +1 -1
- package/dist/client/assets/{collection-tabs-B_eSFPng.js → collection-tabs-DBBgWhhB.js} +1 -1
- package/dist/client/assets/{command-CkDjlTXU.js → command-DR3zyIhn.js} +1 -1
- package/dist/client/assets/{commerce-onboarding-BgFEuUtH.js → commerce-onboarding-D--LvBER.js} +1 -1
- package/dist/client/assets/{connect-QTqdrw1M.js → connect-DFYj93VY.js} +1 -1
- package/dist/client/assets/{connect-layout-BLSobfTy.js → connect-layout-Bi2aLO5E.js} +1 -1
- package/dist/client/assets/{connection-CKyNZYOJ.js → connection-YtRx9C0l.js} +1 -1
- package/dist/client/assets/{connection-card-CdA6w6nj.js → connection-card-DsMi9xa_.js} +1 -1
- package/dist/client/assets/{connection-detail-BveeSkor.js → connection-detail-C2tUkW1w.js} +1 -1
- package/dist/client/assets/{connection-form-helpers-BEELjr90.js → connection-form-helpers-XypSEqtp.js} +1 -1
- package/dist/client/assets/{connections-DuV040Zr.js → connections-C3pSVu59.js} +1 -1
- package/dist/client/assets/{create-organization-dialog-5fYd65TA.js → create-organization-dialog-CoCfQ8aS.js} +1 -1
- package/dist/client/assets/{decopilot-sse-pool-CkQ6ZRGu.js → decopilot-sse-pool-MgvD7iUo.js} +1 -1
- package/dist/client/assets/{dialog-yNkqhTt0.js → dialog-BMI17Dr2.js} +1 -1
- package/dist/client/assets/{domain-settings-BIup9mMA.js → domain-settings-Dsjgm8YG.js} +1 -1
- package/dist/client/assets/{drawer-Osy8uHfr.js → drawer-CxGUNehS.js} +1 -1
- package/dist/client/assets/{dropdown-menu-BsVti3MJ.js → dropdown-menu-DNyVknXD.js} +1 -1
- package/dist/client/assets/{e2e-tab-DLCsUR2p.js → e2e-tab-C0657lIk.js} +1 -1
- package/dist/client/assets/{editor-DriQrOTE.js → editor-C3XqvbX1.js} +1 -1
- package/dist/client/assets/{empty-state-0cyTMWAI.js → empty-state-B-Y5pIFs.js} +1 -1
- package/dist/client/assets/{empty-state-CGlXCCL3.js → empty-state-DWq9gil9.js} +1 -1
- package/dist/client/assets/{extract-connection-data-CgsoMbpk.js → extract-connection-data-D0btXV7A.js} +1 -1
- package/dist/client/assets/{file-explorer-C4b--YYN.js → file-explorer-B-Qy7P-2.js} +1 -1
- package/dist/client/assets/{file-type-icon-D4mjEpYh.js → file-type-icon-DlYHlErF.js} +1 -1
- package/dist/client/assets/{folder-icon-BTkY4QvK.js → folder-icon-Bg2xl_5i.js} +1 -1
- package/dist/client/assets/{form-JHjimXp-.js → form-DpBqT9rl.js} +1 -1
- package/dist/client/assets/{general-DEkc0htC.js → general-BpNSACBM.js} +1 -1
- package/dist/client/assets/{github-icon-CsrFdTqg.js → github-icon-DuzjqkoH.js} +1 -1
- package/dist/client/assets/{hooks-DANXBliL.js → hooks-D5lhSBKy.js} +1 -1
- package/dist/client/assets/index-B8IzgUC-.js +834 -0
- package/dist/client/assets/{index-wCxpHMXU.js → index-BNii9H3k.js} +2 -2
- package/dist/client/assets/{index-Du0UrpQW.js → index-BPLs_zH-.js} +1 -1
- package/dist/client/assets/{index-C2EC-8EL.js → index-BW0cYi0A.js} +1 -1
- package/dist/client/assets/{index-C-470Zac.js → index-BpVl9Iu6.js} +1 -1
- package/dist/client/assets/{index-BzV3bISK.js → index-C9yX5Zq8.js} +1 -1
- package/dist/client/assets/{index-Cr9NwzG_.js → index-CFRMjuAc.js} +1 -1
- package/dist/client/assets/{index-CYGHWhAG.js → index-CfOIZC95.js} +1 -1
- package/dist/client/assets/{index-BQbrxApR.js → index-CtY9-Vkx.js} +1 -1
- package/dist/client/assets/{index-DYMgyYa7.js → index-DJV1tPju.js} +1 -1
- package/dist/client/assets/{index-D6Wx8_a-.js → index-DPsms1XK.js} +1 -1
- package/dist/client/assets/{index-DWoH_HtY.js → index-DagJRKZX.js} +1 -1
- package/dist/client/assets/{index-redirect-DES_itg8.js → index-redirect-ARk9vwUp.js} +1 -1
- package/dist/client/assets/{infiniteQueryObserver-BeHrAgTJ.js → infiniteQueryObserver-9dBDgBK1.js} +1 -1
- package/dist/client/assets/{infra-billing-B4wQxygg.js → infra-billing-wxfhmC0A.js} +1 -1
- package/dist/client/assets/{input-B1KBCyOs.js → input-o_y8vbED.js} +1 -1
- package/dist/client/assets/{integration-icon-CePBNsW5.js → integration-icon-sBwTb2sI.js} +1 -1
- package/dist/client/assets/{invite-member-dialog-Bt5E6A0n.js → invite-member-dialog-CkstR_WT.js} +1 -1
- package/dist/client/assets/{label-Yogy3AMi.js → label-KmEwpC8j.js} +1 -1
- package/dist/client/assets/{layout-vR4ZjU0Y.js → layout-8pO8nta4.js} +1 -1
- package/dist/client/assets/{login-BNEwujRE.js → login-Cd41ZmSK.js} +1 -1
- package/dist/client/assets/{markdown-pR8dS8tN.js → markdown-DI5UctqV.js} +1 -1
- package/dist/client/assets/{mcp-app-renderer-yKTik6A5.js → mcp-app-renderer-BoKI1qFl.js} +1 -1
- package/dist/client/assets/{mcp-oauth-Blxm9yu4.js → mcp-oauth-BXbJ2tLV.js} +1 -1
- package/dist/client/assets/{members-B-zfccSk.js → members-DnmVkKyQ.js} +1 -1
- package/dist/client/assets/{monaco-editor-C1EipHZw.js → monaco-editor-DT8LsDWU.js} +1 -1
- package/dist/client/assets/{monitoring-stats-row-kZlGn9lw.js → monitoring-stats-row-DofnKsMg.js} +1 -1
- package/dist/client/assets/{multi-select-DbQIPTvx.js → multi-select-CuSWP3Ip.js} +1 -1
- package/dist/client/assets/{oauth-callback-go6uCK8z.js → oauth-callback-D8BLMDQv.js} +1 -1
- package/dist/client/assets/{oauth-callback-ai-provider-CkT7e4xe.js → oauth-callback-ai-provider-C2E7G63x.js} +1 -1
- package/dist/client/assets/{onboarding-ZsHNNbTD.js → onboarding-D3oibVje.js} +1 -1
- package/dist/client/assets/{org-layout-DGEdM2Nu.js → org-layout-DGHWOl-M.js} +1 -1
- package/dist/client/assets/{organization-choice-dpjOK7dX.js → organization-choice-BpDfYFGk.js} +1 -1
- package/dist/client/assets/{orgs-D9Thop-7.js → orgs-YCpk-jvz.js} +1 -1
- package/dist/client/assets/{page-seo-form-FpfB128L.js → page-seo-form-CzNSZ9sj.js} +1 -1
- package/dist/client/assets/{popover-KRufMKxS.js → popover-SMAK3S-U.js} +1 -1
- package/dist/client/assets/{post-calendar-C3AebbbR.js → post-calendar-BMjvabK0.js} +1 -1
- package/dist/client/assets/{post-editor-B1vjx1wx.js → post-editor-C9ML4-3t.js} +1 -1
- package/dist/client/assets/{primitives-BUOq_WQw.js → primitives-BcsiqfJ5.js} +1 -1
- package/dist/client/assets/{profile-W9d1pU_e.js → profile-BWSi0G8T.js} +1 -1
- package/dist/client/assets/{project-app-view-CfpylulM.js → project-app-view-Dxcl1aT4.js} +1 -1
- package/dist/client/assets/{project-icon-B94kMA3_.js → project-icon-DPaLVtKI.js} +1 -1
- package/dist/client/assets/{prompts-DaUX-VsQ.js → prompts-B-CxKnVg.js} +1 -1
- package/dist/client/assets/record-editor-D9UkDkip.js +1 -0
- package/dist/client/assets/redirect-editor-D4HhQlHy.js +1 -0
- package/dist/client/assets/registry-g-fmSyh6.js +2 -0
- package/dist/client/assets/{registry-layout-zvbeoiS_.js → registry-layout-CYouan_f.js} +1 -1
- package/dist/client/assets/{reports-Cu8NNHJP.js → reports-BSLLlkvy.js} +1 -1
- package/dist/client/assets/{repositories-D-8nbJWQ.js → repositories-CUwZd1SG.js} +1 -1
- package/dist/client/assets/{repository-import-picker-B16wm8S6.js → repository-import-picker-B0VIBWE5.js} +1 -1
- package/dist/client/assets/{repository-picker-BDbRX4J2.js → repository-picker-Cx-6wloW.js} +1 -1
- package/dist/client/assets/{require-capability-Brgi9MZC.js → require-capability-DBvMdnbk.js} +1 -1
- package/dist/client/assets/{required-auth-layout-7OnYlzzI.js → required-auth-layout-vMOV7A-1.js} +1 -1
- package/dist/client/assets/{reset-password-Bpi4U0v1.js → reset-password-D7rNtMox.js} +1 -1
- package/dist/client/assets/{review-settings-BB0z6lbx.js → review-settings-BJD--bpz.js} +1 -1
- package/dist/client/assets/{roles-BZxoN_WF.js → roles-DYPFenvJ.js} +1 -1
- package/dist/client/assets/{schema-DEBkVaPA.js → schema-CMNH6jkB.js} +1 -1
- package/dist/client/assets/{scroll-area-5Gm53RHY.js → scroll-area-C0mQJlt6.js} +1 -1
- package/dist/client/assets/{search-input-BfRFSUX5.js → search-input-tUbF1ptE.js} +1 -1
- package/dist/client/assets/{secrets-BI5nZAHq.js → secrets-D5j1zABQ.js} +1 -1
- package/dist/client/assets/{sections-editor-Dy4bMVx9.js → sections-editor-gTvkeaCt.js} +1 -1
- package/dist/client/assets/{select-D2esvO84.js → select-DwV8X7f6.js} +1 -1
- package/dist/client/assets/{select-model-C02TlxcO.js → select-model-ZhFhgPBA.js} +1 -1
- package/dist/client/assets/{self-tool-result-DG5s1xX7.js → self-tool-result-ClWTH_bI.js} +1 -1
- package/dist/client/assets/{seo-editor-Dx9vDVJD.js → seo-editor-BAaldpLU.js} +1 -1
- package/dist/client/assets/settings-layout-2nHZ-xUy.js +1 -0
- package/dist/client/assets/{settings-sidebar-8bs0eLOB.js → settings-sidebar-CPy3LeC5.js} +1 -1
- package/dist/client/assets/{shell-controls-sw1RAMWc.js → shell-controls-CqyJgQ7j.js} +1 -1
- package/dist/client/assets/{shell-layout-BKNo8IP7.js → shell-layout-BYg8XQbK.js} +1 -1
- package/dist/client/assets/{skill-preview-COY_tzil.js → skill-preview-CKQetGjJ.js} +1 -1
- package/dist/client/assets/{skills-CirkkNm8.js → skills-xI-UVBa4.js} +1 -1
- package/dist/client/assets/{sso-BYOvoXWp.js → sso-CfNklRih.js} +1 -1
- package/dist/client/assets/{store-93oYAikO.js → store-BadQgxeZ.js} +1 -1
- package/dist/client/assets/store-registry-EfqkQfUX.js +2 -0
- package/dist/client/assets/{switch-C83YjSMx.js → switch-CS27na4M.js} +1 -1
- package/dist/client/assets/{synced-repos-B1PdvR5A.js → synced-repos-CoMJQQ9Y.js} +1 -1
- package/dist/client/assets/{table-CaELPge9.js → table-qzWiQSpc.js} +1 -1
- package/dist/client/assets/{tabs-DNXilkmX.js → tabs-QNWV2GCs.js} +1 -1
- package/dist/client/assets/{task-board-UoxyHghA.js → task-board-Cn_pHjsF.js} +1 -1
- package/dist/client/assets/{task-route-BTYDQRMB.js → task-route-B7ei82Gq.js} +1 -1
- package/dist/client/assets/{tasks-DB8ZBOnH.js → tasks-_RvPcTaN.js} +1 -1
- package/dist/client/assets/{textarea-BVGL4VzR.js → textarea-BVhDYcc1.js} +1 -1
- package/dist/client/assets/{thread-intent-DlW98pT-.js → thread-intent-Loysb1I9.js} +1 -1
- package/dist/client/assets/{thread-route-BfZqAdlp.js → thread-route-Byu3ebg8.js} +1 -1
- package/dist/client/assets/{toggle-group-BFoG8LvG.js → toggle-group-B-tj3XKh.js} +1 -1
- package/dist/client/assets/{toolbar-CSi4T63u.js → toolbar-Bm2rm9wx.js} +1 -1
- package/dist/client/assets/{toolbar-icon-button-BDwbo3iu.js → toolbar-icon-button-CVH99K3A.js} +1 -1
- package/dist/client/assets/{track-BwotVDYq.js → track-CeGHDOSL.js} +1 -1
- package/dist/client/assets/{types-CxLXVtsa.js → types-DiuASwJM.js} +1 -1
- package/dist/client/assets/{use-ai-providers-DAIKj8K_.js → use-ai-providers-Dq95BiGx.js} +1 -1
- package/dist/client/assets/{use-automations-CcJYDVHH.js → use-automations-BfncXBxU.js} +1 -1
- package/dist/client/assets/{use-autosave-DkYdqG5Q.js → use-autosave-BhZ1NKNk.js} +1 -1
- package/dist/client/assets/{use-connection-Ckt2VSVj.js → use-connection-BHOM1KCS.js} +1 -1
- package/dist/client/assets/{use-copy-D_r7vUr3.js → use-copy-DP-dn8NK.js} +1 -1
- package/dist/client/assets/{use-create-virtual-mcp-Bcr83t2O.js → use-create-virtual-mcp-BLl-W3F1.js} +1 -1
- package/dist/client/assets/{use-date-fns-locale-BhkvBGh5.js → use-date-fns-locale-BeNxPbWX.js} +1 -1
- package/dist/client/assets/{use-debounced-autosave-9KKq9zM9.js → use-debounced-autosave-BW8ckVjz.js} +1 -1
- package/dist/client/assets/{use-debounced-value-zfbRgwSa.js → use-debounced-value-Df9tl1Js.js} +1 -1
- package/dist/client/assets/{use-decopilot-events-Dk2thWkI.js → use-decopilot-events-ChjgrZYX.js} +1 -1
- package/dist/client/assets/{use-delete-connection-BTwremoh.js → use-delete-connection-1N9PZehZ.js} +1 -1
- package/dist/client/assets/{use-deployment-admin-B-blvFdu.js → use-deployment-admin-MUXNvpjB.js} +1 -1
- package/dist/client/assets/{use-destination-route-DOmalBIZ.js → use-destination-route-Bhiy4EoU.js} +1 -1
- package/dist/client/assets/{use-file-configs-Dnm1IOUj.js → use-file-configs-y2zMW2WE.js} +1 -1
- package/dist/client/assets/{use-infinite-scroll-C_KRQFtJ.js → use-infinite-scroll-DpakBpEW.js} +1 -1
- package/dist/client/assets/{use-join-requests-j7pP3D2t.js → use-join-requests-DYy9A_hL.js} +1 -1
- package/dist/client/assets/{use-mcp-auth-status-9fSmzejd.js → use-mcp-auth-status-CoOsHfD4.js} +1 -1
- package/dist/client/assets/{use-mcp-client-B0Utyl6_.js → use-mcp-client-CTci8Fpw.js} +1 -1
- package/dist/client/assets/{use-mcp-prompts-DyVA4Qsg.js → use-mcp-prompts-DMMC0Xlr.js} +1 -1
- package/dist/client/assets/{use-mcp-tools-Bl1AaPU5.js → use-mcp-tools-DuSarxbB.js} +1 -1
- package/dist/client/assets/{use-members-DHE1d9JH.js → use-members-MlPQdN4X.js} +1 -1
- package/dist/client/assets/{use-navigate-to-agent-gzG4Ilg4.js → use-navigate-to-agent-Cx0i3xh7.js} +1 -1
- package/dist/client/assets/{use-org-auth-client-CNCWRij0.js → use-org-auth-client-JVIoeMxe.js} +1 -1
- package/dist/client/assets/{use-org-notice-BvKoElEP.js → use-org-notice---l3wso1.js} +1 -1
- package/dist/client/assets/{use-org-sso-BdRX_9vq.js → use-org-sso-DUVDDhja.js} +1 -1
- package/dist/client/assets/{use-organization-roles-BK2K8Im9.js → use-organization-roles-BHCsacjS.js} +1 -1
- package/dist/client/assets/{use-organization-settings-QMzmHJ8V.js → use-organization-settings-k0fnufc_.js} +1 -1
- package/dist/client/assets/{use-panel-navigate-BHUMH5LJ.js → use-panel-navigate-HDWlFxjd.js} +1 -1
- package/dist/client/assets/{use-registry-connections-Ce9R841t.js → use-registry-connections-YYlPIx2s.js} +1 -1
- package/dist/client/assets/{use-secrets-BzfnIrZM.js → use-secrets-DN6b0vCF.js} +1 -1
- package/dist/client/assets/{use-section-preview-base-DCtnTCwm.js → use-section-preview-base-BsdTD0NP.js} +1 -1
- package/dist/client/assets/{use-status-sounds-B3rVna2J.js → use-status-sounds-Ct0vFbvq.js} +1 -1
- package/dist/client/assets/{use-tags-J0GNorDt.js → use-tags-CfOhaYdy.js} +1 -1
- package/dist/client/assets/{use-view-mode-Baq2aGok.js → use-view-mode-C_R4jd67.js} +1 -1
- package/dist/client/assets/{use-virtual-mcp-b2E02BqA.js → use-virtual-mcp-D2iJ6ogQ.js} +1 -1
- package/dist/client/assets/useInfiniteQuery-BdnThnOb.js +1 -0
- package/dist/client/assets/useSuspenseInfiniteQuery-DO0PekCG.js +1 -0
- package/dist/client/assets/{users-DUGKGMNy.js → users-B2ixGvua.js} +1 -1
- package/dist/client/assets/{variant-calendar-DlPcIlwu.js → variant-calendar-CtHnxvJ8.js} +1 -1
- package/dist/client/assets/{view-mode-toggle-C7NegMIk.js → view-mode-toggle-Bor1__4t.js} +1 -1
- package/dist/client/index.html +1 -1
- package/dist/server/cli.js +1 -1
- package/dist/server/server.js +1 -1
- package/package.json +1 -1
- package/dist/client/assets/api-keys-B-u9SWvl.js +0 -1
- package/dist/client/assets/index-jVjQV0hI.js +0 -834
- package/dist/client/assets/record-editor-CkacRj41.js +0 -1
- package/dist/client/assets/redirect-editor-QFv5yaYh.js +0 -1
- package/dist/client/assets/registry-BKojoZoQ.js +0 -2
- package/dist/client/assets/settings-layout-voBtcJ4c.js +0 -1
- package/dist/client/assets/store-registry-DLLF2duk.js +0 -2
- package/dist/client/assets/useInfiniteQuery-DWBUS5nx.js +0 -1
- package/dist/client/assets/useSuspenseInfiniteQuery-o9ts3gfL.js +0 -1
package/dist/server/server.js
CHANGED
|
@@ -2938,7 +2938,7 @@ Respond with ONLY a JSON object of this shape, and nothing else:
|
|
|
2938
2938
|
${J.join(`
|
|
2939
2939
|
`)}`:X}function KA6($){let Z=new Set;for(let Q of $)for(let Y of Q.split(`
|
|
2940
2940
|
`)){let X=Y.trim();if(/^Co-authored-by:\s/i.test(X))Z.add(X)}return[...Z]}var Io$=200,aP6=12,$A6,QA6=300,Pq0=3;var $G1=D(()=>{sZ();G8();zq0();$A6={aheadBy:0,behindBy:0,files:[]}});function FA6($){if(!$||$.includes(".."))return!1;return HA6.test($)}function ko$($){let Z=typeof $.__resolveType==="string"?$.__resolveType:null;if(!Z||!FA6(Z))return null;let{__resolveType:Q,...Y}=$;return{resolveType:Z,payload:Y}}function Vo$($,Z){return`${$.replace(/\/+$/,"")}/deco/invoke/${Z}`}var HA6;var So$=D(()=>{HA6=/^[\w./@-]+$/});function l00($,Z){let Q=$?.githubRepo;if(!Q?.owner||!Q?.name)return null;if(!Q.connectionId)return Q;if(!Z.includes(Q.connectionId))return null;return Q}async function _o$($,Z,Q,Y){let X=$.organization?.id;if(!X)throw new Xw(zZ);let J=await MD($.storage,X,Y);if(J&&await vU($.storage,J)){let F=await HH($,J,{forceRefresh:!0}).catch((U)=>{throw new Xw(U instanceof Error?U.message:zZ)});await Co$($,Z,Q,F);return}let G=Y.connectionId??J?.legacyConnectionId;if(!G)throw new Xw("Push requires a connected git account. Connect the repository's provider for this project and restart the sandbox.");await Dh({ctx:$,connectionId:G,organizationId:X,forceRefresh:!0,onLegacyMintError:(F)=>{let U=F instanceof Error?F.message:zZ;throw new Xw(U)}});let{cloneUrl:W,gitUserName:K,gitUserEmail:H}=await FH(G,Y.owner,Y.name,$.db,$.vault).catch((F)=>{let{code:U,message:N}=f5$(F instanceof Error?F.message:String(F));throw U?new Xw(N):F});await Co$($,Z,Q,{cloneUrl:W,gitUserName:K,gitUserEmail:H})}async function Co$($,Z,Q,Y){let{cloneUrl:X,gitUserName:J,gitUserEmail:G}=Y,W=yc($),K=await Z.proxyDaemonRequest(Q,"/_sandbox/config",{method:"PUT",headers:new Headers({"content-type":"application/json"}),body:JSON.stringify({git:{repository:{cloneUrl:X},identity:{userName:J,userEmail:G}},...W?{operator:W}:{}})});if(!K.ok){let H=await ZL(K,UA6).catch(()=>K.statusText);throw Error(`Failed to refresh sandbox git credentials (${K.status}): ${H}`)}}var UA6=10485760,Xw;var ZG1=D(()=>{uG();Uq0();Wr();kY0();$o();sZ();Xw=class Xw extends Error{constructor($){super($);this.name="GitPushAuthError"}}});function BA6($){let Z=$.startsWith("thread:")?$.slice(7):$;if(!Z||Z.length>255||Z.includes("..")||Z.startsWith("/")||Z.endsWith("/")||Z.endsWith(".lock")||!NA6.test(Z))throw Error(`Invalid branch name: ${$}`)}function Yb($){return AbortSignal.any([$.req.raw.signal,AbortSignal.timeout(DA6)])}async function wA6($,Z){let Q=$.var.studioContext,Y=EH(Z.branch),X=$.req.query("thread")??Y,J=X&&X===Y?Z.branchThread:X?await Q.storage.threads.get(X).catch(()=>null):null,G=J?.virtual_mcp_id===Z.virtualMcpId?J:null,W=a_(G?.metadata?.runtime);if(W)return W;let K=LE0(Z.virtualMcpMetadata),H=K==="cms"?await fJ1(Q,{claimName:Z.claimName}):"alive",F=K==="cms"&&H!=="alive"?"cms":"sandbox",U=!!G&&(H==="gone"||H==="alive"&&K==="cms");if(U&&G)Kr(Q,G.id,F);if(K==="cms")console.log("sandbox proxy: no runtime stamp",{route:$.req.path,method:$.req.method,reason:G?"unstamped":"threadless",liveness:H,resolved:F,stamped:U});return F}async function EA6($){let Z=$.get("vmClaim");if(Z.runner)return Z.runner;try{return await RY($.var.studioContext)}catch{return null}}function Xb($){let{runner:Z}=$.get("vmClaim");if(!Z)return $.json({error:"No sandbox runner configured"},503);return Z}async function cc($){let{virtualMcpMetadata:Z,connectionIds:Q}=$.get("vmClaim"),Y=$.var.studioContext,X=l00(Z,Q);if(!X)throw new p0({provider:"github",status:404,message:"Project has no GitHub repository"});let J=p(Y);return Bh(Y,J.id,X)}function QG1($,Z){let Q=Z instanceof Error?Z.message:String(Z),Y=O6$(Z);if(Y!==void 0)return $.json({error:Q},429,{...L5,...Y===null?{}:{"Retry-After":String(Math.ceil(Y/1000))}});if(Z instanceof D6)return $.json({error:Q},409,L5);let X=dG(Z);if(X!==null){let J=X===404?404:X===409||X===422?409:502;return $.json({error:Q},J,L5)}return $.json({error:Q},502,L5)}async function bo$($,Z,Q){let Y;try{Y=await fetch(Z,Q)}catch{return $.json({error:"Preview unreachable"},502)}let X;try{X=await Y.text()}catch{return $.json({error:"Preview unreachable"},502)}return new Response(X,{status:Y.status,headers:{"content-type":Y.headers.get("content-type")??"application/json"}})}async function xo$($){try{let Z=await cc($),Q=await Aq0(Z,$.get("vmClaim").branch);return $.json(Q,200,L5)}catch(Z){return QG1($,Z)}}function c00($,Z){let Y=(qq0.get($)??Promise.resolve()).catch(()=>{}).then(Z),X=Y.catch(()=>{});return qq0.set($,X),X.finally(()=>{if(qq0.get($)===X)qq0.delete($)}),Y}async function K7($,Z,Q){if(!Q?.runner&&$.get("vmClaim").runtime==="cms")return $.json({error:"sandbox not found: this session is sandbox-less"},404,L5);let Y=Q?.runner??Xb($);if(Y instanceof Response)return Y;let{claimName:X,userId:J,projectRef:G}=$.get("vmClaim"),W=Q?.method??"POST",K=null,H=new Headers;if(Q?.jsonBody!==void 0)K=Q.jsonBody,H.set("content-type","application/json");else if(Q?.forwardJsonBody)K=await $.req.text(),H.set("content-type","application/json");let F=Q?.signal,U={method:W,headers:H,body:K,...F?{signal:F}:{}},N=async()=>{let B=await Y.proxyDaemonRequest(X,Z,U);if(Q?.map404to410&&B.status===404){try{await B.body?.cancel()}catch{}if(await Y.adoptLiveClaim({userId:J,projectRef:G},X))B=await Y.proxyDaemonRequest(X,Z,U);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",...L5}})}}let O=await B.text(),L=Q?.redactRepoDir?jA6(O):O,w=B.headers.get("content-type")??"application/json";return new Response(L,{status:B.status,headers:{"content-type":w,...L5}})};try{if(F){let B=N();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 N()}catch(B){let O=B instanceof Error?B.message:String(B);return $.json({error:`Daemon unreachable: ${O}`},502)}}function jA6($){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 Iq0($,Z,Q,Y="GET",X){let J=await $.proxyDaemonRequest(Z,Q,{method:Y,headers:new Headers,body:null});if(J.status===404&&X){try{await J.body?.cancel()}catch{}if(await $.adoptLiveClaim(X,Z))J=await $.proxyDaemonRequest(Z,Q,{method:Y,headers:new Headers,body:null})}if(J.status===404){try{await J.body?.cancel()}catch{}throw Error("SANDBOX_GONE")}let G=await J.text();if(!J.ok){let W=`Daemon error (${J.status})`;try{W=JSON.parse(G).error??W}catch{}throw Error(W)}return JSON.parse(G)}function zA6($){return yo$.includes($)}var NA6,vo$=524288,OA6=65536,DA6=1e4,fo$=2000,LA6,qq0,L5,yo$,go$=()=>{let $=new $1;$.use("/:virtualMcpId/:branch/*",LA6),$.post("/:virtualMcpId/:branch/write",(Q)=>K7(Q,"/_sandbox/write",{forwardJsonBody:!0,signal:Yb(Q)})),$.post("/:virtualMcpId/:branch/unlink",(Q)=>K7(Q,"/_sandbox/unlink",{forwardJsonBody:!0,signal:Yb(Q)})),$.post("/:virtualMcpId/:branch/mkdir",(Q)=>K7(Q,"/_sandbox/mkdir",{forwardJsonBody:!0,signal:Yb(Q)})),$.post("/:virtualMcpId/:branch/rename",(Q)=>K7(Q,"/_sandbox/rename",{forwardJsonBody:!0,signal:Yb(Q)})),$.post("/:virtualMcpId/:branch/read",(Q)=>K7(Q,"/_sandbox/read",{forwardJsonBody:!0,signal:Yb(Q)})),$.post("/:virtualMcpId/:branch/glob",(Q)=>K7(Q,"/_sandbox/glob",{forwardJsonBody:!0,signal:Yb(Q)})),$.post("/:virtualMcpId/:branch/grep",(Q)=>K7(Q,"/_sandbox/grep",{forwardJsonBody:!0,signal:Yb(Q)})),$.post("/:virtualMcpId/:branch/exec/:script",async(Q)=>{let Y=Q.req.param("script");if(!Y)return Q.json({error:"missing script name"},400);return K7(Q,`/_sandbox/exec/${encodeURIComponent(Y)}`)}),$.post("/:virtualMcpId/:branch/exec/:script/kill",async(Q)=>{let Y=Q.req.param("script");if(!Y)return Q.json({error:"missing script name"},400);return K7(Q,`/_sandbox/exec/${encodeURIComponent(Y)}/kill`)}),$.get("/:virtualMcpId/:branch/config",(Q)=>K7(Q,"/_sandbox/config",{method:"GET",map404to410:!0,redactRepoDir:!0})),$.put("/:virtualMcpId/:branch/config",(Q)=>K7(Q,"/_sandbox/config",{method:"PUT",forwardJsonBody:!0,map404to410:!0})),$.post("/:virtualMcpId/:branch/setup/:step",async(Q)=>{let Y=Q.req.param("step");if(!Y||!zA6(Y))return Q.json({error:`step must be one of: ${yo$.join(", ")}`},400);let X=Q.get("vmClaim"),J=await fJ1(Q.var.studioContext,{claimName:X.claimName})==="gone"?null:await EA6(Q);if(!J)return Q.json({error:"sandbox not found: nothing is running at this ref"},404,L5);if(Y==="start"){let G=p(Q.var.studioContext),W=ah(X.virtualMcpMetadata);try{await NE0({ctx:Q.var.studioContext,runner:J,handle:X.claimName,orgId:G.id,userId:X.callerUserId,entries:W})}catch(K){let H=K instanceof Error?K.message:String(K);return Q.json({error:`Failed to push env to daemon: ${H}`},502)}}return K7(Q,`/_sandbox/setup/${Y}`,{signal:Q.req.raw.signal,map404to410:!0,runner:J})}),$.get("/:virtualMcpId/:branch/events",(Q)=>{let Y=Q.get("vmClaim");if(!Y.runner)return dN(Q,async(X)=>{await X.writeSSE({event:"phase",data:JSON.stringify({kind:"failed",reason:"unknown",message:"No sandbox runner configured on this studio instance."})})});return yt$(Q,{ctx:Q.var.studioContext,claimName:Y.claimName,runner:Y.runner,virtualMcpId:Y.virtualMcpId,branch:Y.branch,userId:Y.userId,projectRef:Y.projectRef,virtualMcpMetadata:Y.virtualMcpMetadata})}),$.get("/:virtualMcpId/:branch/git/status",(Q)=>{if(Q.get("vmClaim").runtime==="cms")return xo$(Q);return Z(Q)});let Z=(Q)=>K7(Q,"/_sandbox/git/status",{method:"GET",map404to410:!0,signal:AbortSignal.any([Q.req.raw.signal,AbortSignal.timeout(fo$)])});return $.post("/:virtualMcpId/:branch/git/status",(Q)=>{if(Q.get("vmClaim").runtime==="cms")return xo$(Q);return K7(Q,"/_sandbox/git/status",{map404to410:!0,signal:AbortSignal.any([Q.req.raw.signal,AbortSignal.timeout(fo$)])})}),$.post("/:virtualMcpId/:branch/git/diff",async(Q)=>{let Y=Q.get("vmClaim");if(Y.runtime==="cms")try{let X=await Q.req.json().catch(()=>({})),J=await cc(Q),G=await Tq0(J,Y.branch,X.base);return Q.json(G,200,L5)}catch(X){return QG1(Q,X)}return K7(Q,"/_sandbox/git/diff",{forwardJsonBody:!0,map404to410:!0})}),$.post("/:virtualMcpId/:branch/git/publish",async(Q)=>{if(Q.get("vmClaim").runtime==="cms")return Q.json({ok:!0},200,L5);let Y=Xb(Q);if(Y instanceof Response)return Y;let{claimName:X,virtualMcpMetadata:J,connectionIds:G}=Q.get("vmClaim"),W=Q.var.studioContext;return c00(X,async()=>{try{await bJ1(W,Y,X);let K=l00(J,G);if(K)await _o$(W,Y,X,K)}catch(K){if(K instanceof Xw)return Q.json({error:K.message},403,L5);let H=K instanceof Error?K.message:String(K);return Q.json({error:H},502,L5)}return K7(Q,"/_sandbox/git/publish",{forwardJsonBody:!0,map404to410:!0})})}),$.post("/:virtualMcpId/:branch/git/discard",async(Q)=>{let Y=Q.get("vmClaim");if(Y.runtime==="cms")return c00(Y.claimName,async()=>{let X=await Q.req.json().catch(()=>({})),J=Array.isArray(X.filepaths)?X.filepaths.filter((G)=>typeof G==="string"):[];if(J.length===0)return Q.json({error:"filepaths is required"},400,L5);try{let G=await cc(Q);return await Mo$(G,Y.branch,J),Q.json({ok:!0},200,L5)}catch(G){let W=dG(G)===409||G instanceof D6?409:502,K=G instanceof Error?G.message:String(G);return Q.json({error:K},W,L5)}});return c00(Y.claimName,()=>K7(Q,"/_sandbox/git/discard",{forwardJsonBody:!0,map404to410:!0}))}),$.post("/:virtualMcpId/:branch/git/rebase",async(Q)=>{let Y=Q.get("vmClaim");if(Y.runtime==="cms")return c00(Y.claimName,async()=>{try{let W=await Q.req.json().catch(()=>({})),K=await cc(Q),H=W.base??await K.getDefaultBranch();return await Rq0(K,Y.branch,H),Q.json({ok:!0},200,L5)}catch(W){return QG1(Q,W)}});let X=Xb(Q);if(X instanceof Response)return X;let{claimName:J}=Q.get("vmClaim"),G=Q.var.studioContext;return c00(J,async()=>{try{await bJ1(G,X,J)}catch(W){let K=W instanceof Error?W.message:String(W);return Q.json({error:K},502,L5)}return K7(Q,"/_sandbox/git/rebase",{forwardJsonBody:!0,map404to410:!0})})}),$.post("/:virtualMcpId/:branch/git/suggest-commit",v5({maxSize:vo$,onError:(Q)=>Q.json({error:"Payload too large"},413,L5)}),async(Q)=>{let Y=Q.get("vmClaim"),X=null;if(Y.runtime!=="cms"){let H=Xb(Q);if(H instanceof Response)return H;X=H}let{claimName:J,userId:G,projectRef:W}=Y,K=Q.var.studioContext;try{let H=await Q.req.json().catch(()=>({})),F=H.status,U=H.diff,N=U!=null&&typeof U.diffs==="object"&&U.diffs!==null,[B,O]=gJ1(F)&&N?[F,U]:X?await Promise.all([Iq0(X,J,"/_sandbox/git/status","GET",{userId:G,projectRef:W}),Iq0(X,J,"/_sandbox/git/diff","GET",{userId:G,projectRef:W})]):await(async()=>{let w=await cc(Q);return Promise.all([Aq0(w,Y.branch),Tq0(w,Y.branch)])})(),L=await ct$(K,B,O);return Q.json(L,200,L5)}catch(H){let F=H instanceof Error?H.message:String(H);if(F==="SANDBOX_GONE")return Q.json({error:"Sandbox handle is gone. The sandbox needs to be re-provisioned."},410,L5);return Q.json({error:F},502,L5)}}),$.post("/:virtualMcpId/:branch/git/judge-review",v5({maxSize:vo$,onError:(Q)=>Q.json({error:"Payload too large"},413,L5)}),async(Q)=>{let Y=Q.get("vmClaim"),X=null;if(Y.runtime!=="cms"){let H=Xb(Q);if(H instanceof Response)return H;X=H}let{claimName:J,userId:G,projectRef:W}=Y,K=Q.var.studioContext;try{let H=await Q.req.json().catch(()=>({})),F=H.status,U=H.diff,N=U!=null&&typeof U.diffs==="object"&&U.diffs!==null,[B,O]=gJ1(F)&&N?[F,U]:X?await Promise.all([Iq0(X,J,"/_sandbox/git/status","GET",{userId:G,projectRef:W}),Iq0(X,J,"/_sandbox/git/diff","GET",{userId:G,projectRef:W})]):await(async()=>{let w=await cc(Q);return Promise.all([Aq0(w,Y.branch),Tq0(w,Y.branch)])})(),L=await mt$(K,B,O,typeof H.language==="string"?H.language:void 0);return Q.json(L,200,L5)}catch(H){let F=H instanceof Error?H.message:String(H);if(F==="SANDBOX_GONE")return Q.json({error:"Sandbox handle is gone. The sandbox needs to be re-provisioned."},410,L5);return Q.json({error:F},502,L5)}}),$.get("/:virtualMcpId/:branch/preview-fetch",async(Q)=>{let Y=Xb(Q);if(Y instanceof Response)return Y;let{claimName:X}=Q.get("vmClaim"),J=Q.req.query("path");if(!J||!J.startsWith("/")||J.startsWith("//")||J.includes("..")||J.includes("\\"))return Q.json({error:"Path not allowed"},403);let G;try{G=await Y.getPreviewUrl(X)}catch{return Q.json({error:"Preview not available"},502)}if(!G)return Q.json({error:"Preview not available"},502);let W=G.replace(/\/+$/,"");return bo$(Q,`${W}${J}`)}),$.post("/:virtualMcpId/:branch/preview-invoke",v5({maxSize:OA6,onError:(Q)=>Q.json({error:"Payload too large"},413)}),async(Q)=>{let Y=Xb(Q);if(Y instanceof Response)return Y;let{claimName:X}=Q.get("vmClaim"),J;try{J=await Y.getPreviewUrl(X)}catch{return Q.json({error:"Preview not available"},502)}if(!J)return Q.json({error:"Preview not available"},502);let G;try{G=await Q.req.json()}catch{return Q.json({error:"Invalid JSON body"},400)}if(!G||typeof G!=="object"||Array.isArray(G))return Q.json({error:"Invalid JSON body"},400);let W=ko$(G);if(!W)return Q.json({error:"Invalid or missing __resolveType"},400);let K=Vo$(J,W.resolveType);return bo$(Q,K,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(W.payload),signal:AbortSignal.timeout(30000)})}),$};var ho$=D(()=>{g$();XK();xc();vJ1();Yr();ft$();nG();eh();bt$();RW();xt$();gt$();Na0();Jr();lJ1();it$();sZ();o5();$G1();So$();ZG1();NA6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;LA6=Fq0(async($,Z)=>{let Q=$.var.studioContext;try{n(Q)}catch{return $.json({error:"Unauthorized"},401)}let Y=n0(Q);if(!Y)return $.json({error:"Unauthorized"},401);let X;try{X=p(Q)}catch{return $.json({error:"Organization scope required"},403)}let J=$.req.param("virtualMcpId"),G=$.req.param("branch");if(!J||!G)return $.json({error:"virtualMcpId and branch are required"},400);try{BA6(G)}catch(L){let w=L instanceof Error?L.message:String(L);return $.json({error:w},400)}let W=await Q.storage.virtualMcps.findById(J);if(!W||W.organization_id!==X.id)return $.json({error:"Virtual MCP not found"},404);let K=qo({orgId:X.id,virtualMcpId:J,branch:G}),H=await Sr0(Q,G),F=Cr0(H,Y),U=vt$({userId:F,projectRef:K}),N=W.metadata??null,B=await wA6($,{claimName:U,branch:G,virtualMcpId:J,sandboxUserId:F,virtualMcpMetadata:N,branchThread:H});if(B==="cms")return $.set("vmClaim",{claimName:U,callerUserId:Y,runner:null,virtualMcpId:J,branch:G,userId:F,projectRef:K,virtualMcpMetadata:N,connectionIds:W.connections?.map((L)=>L.connection_id)??[],runtime:B}),Z();let O;try{O=await RY(Q)}catch{O=null}if(!O)return $.json({error:"No sandbox runner found"},404);return $.set("vmClaim",{claimName:U,callerUserId:Y,runner:O,virtualMcpId:J,branch:G,userId:F,projectRef:K,virtualMcpMetadata:N,connectionIds:W.connections?.map((L)=>L.connection_id)??[],runtime:B}),Z()});qq0=new Map;L5={"Cache-Control":"no-store, no-cache, must-revalidate",Pragma:"no-cache"};yo$=["clone","install","start"]});function uo$($,Z,Q){let Y=YG1.get($);if(!Y)Y={pending:null,running:!1},YG1.set($,Y);if(!Y.pending)Y.pending={set:new Map,del:new Set,deps:Z,resolvers:[],rejecters:[]};let X=Y.pending;X.deps=Z;for(let[G,W]of Object.entries(Q.set??{}))X.set.set(G,W),X.del.delete(G);for(let G of Q.delete??[])X.del.add(G),X.set.delete(G);let J=new Promise((G,W)=>{X.resolvers.push(G),X.rejecters.push(W)});if(!Y.running)AA6($,Y);return J}async function AA6($,Z){Z.running=!0;try{while(Z.pending){let Q=Z.pending;Z.pending=null;try{let Y=await TA6(Q);for(let X of Q.resolvers)X(Y)}catch(Y){for(let X of Q.rejecters)X(Y)}}}finally{if(Z.running=!1,!Z.pending)YG1.delete($)}}async function TA6($){let{client:Z,branch:Q,packagePath:Y}=$.deps,X=new Map;for(let J=0;;J++){let G=await lc(Z,Q),W=await Z.listDecofileEntries(G,Y),K=sJ1(W,Y),H=[],F=new Map(K.map((N)=>[N.path,{stem:N.stem,sha:N.sha}]));for(let[N,B]of $.set){let O=aJ1(K,N),L=`${JSON.stringify(B,null,2)}
|
|
2941
|
-
`;await Ao$(Z.repo,L);let w=O[0]??`${jq0(Y)}/${mJ1(N)}.json`;H.push({path:w,content:L});let E=w.slice(w.lastIndexOf("/")+1,-5);F.set(w,{stem:E,content:L});for(let j of O.slice(1))H.push({path:j,deleted:!0}),F.delete(j)}for(let N of $.del)for(let B of aJ1(K,N))H.push({path:B,deleted:!0}),F.delete(B);if(H.length===0)return G;let U=Y?`${Y}/.deco/blocks.gen.json`:".deco/blocks.gen.json";if(W.some((N)=>N.type==="blob"&&N.path===U)){let N=await To$(Z,F.values(),X),{decofile:B,skipped:O}=x00(N);if(O.length>0)console.warn("decofile gen: dropped blocks that were not valid JSON",{repo:wW(Z.repo),branch:Q,packagePath:Y,blocks:O.map((L)=>L.key)});H.push({path:U,content:B})}try{let{sha:N}=await Z.commitFiles({branch:Q,message:RA6($),expectedHead:G,changes:H});return N}catch(N){if(!(N instanceof D6)||J>=PA6-1)throw N;await z$(U7(2000,200,J,2,0.5))}}}function RA6($){let Z=(X)=>{let J=X.slice(0,3).join(", ");return X.length>3?`${J} (+${X.length-3} more)`:J},Q=[];if($.set.size>0)Q.push(`update ${Z([...$.set.keys()])}`);if($.del.size>0)Q.push(`delete ${Z([...$.del])}`);let Y=`chore(decofile): ${Q.join("; ")}`;return Yr0(Y,$.deps.coAuthor)}var PA6=3,YG1;var lo$=D(()=>{Zw0();Bq0();c6();G8();sZ();zq0();YG1=new Map});import{createHmac as co$,randomBytes as qA6,timingSafeEqual as IA6}from"crypto";function do$(){if(Mq0)return Mq0;let $;try{let Z=M0();$=Z.studioJwtSecret??Z.betterAuthSecret}catch{$=void 0}return Mq0=$?Buffer.from($):qA6(32),Mq0}function XG1($){let Z=$.nowMs??Date.now(),Q={o:$.organizationId,m:$.virtualMcpId,b:$.branch,e:Math.floor((Z+MA6)/1000)},Y=Buffer.from(JSON.stringify(Q)).toString("base64url"),X=co$("sha256",do$()).update(Y).digest("base64url");return`${Y}.${X}`}function mo$($,Z){let Q=$.indexOf(".");if(Q<0)return!1;let Y=$.slice(0,Q),X=Buffer.from($.slice(Q+1)),J=Buffer.from(co$("sha256",do$()).update(Y).digest("base64url"));if(X.length!==J.length||!IA6(X,J))return!1;let G;try{G=JSON.parse(Buffer.from(Y,"base64url").toString())}catch{return!1}let W=Math.floor((Z.nowMs??Date.now())/1000);return G.o===Z.organizationId&&G.m===Z.virtualMcpId&&G.b===Z.branch&&typeof G.e==="number"&&G.e>=W}var MA6=21600000,Mq0=null;var io$=D(()=>{E$()});import{z as dc}from"zod";function VA6($){return $.length>0&&$.length<=255&&!$.includes("..")&&!$.endsWith("/")&&!$.endsWith(".lock")&&kA6.test($)}function ro$($){return $.req.header("x-forwarded-host")??new URL($.req.url).host}async function d00($){let Z=$.get("decofileScope");return Bh($.var.studioContext,Z.organizationId,Z.githubRepo)}function m00($,Z){let Q=Z instanceof Error?Z.message:String(Z);if(Z instanceof D6)return $.json({error:Q},409);let Y=dG(Z);if(Y!==null){let X=Y===404?404:Y===409||Y===422?409:502;return $.json({error:Q},X)}return $.json({error:Q},500)}function so$(){let $=new $1;return $.use("/:virtualMcpId/:branch",oo$),$.use("/:virtualMcpId/:branch/*",oo$),$.get("/:virtualMcpId/:branch",async(Z)=>{let Q=Z.get("decofileScope");try{let Y=await d00(Z),X=await Ro$(Y,Q.branch,Q.packagePath,{createBranchIfMissing:!!Q.userId}),J={ETag:`"${X.sha}"`,"Cache-Control":"no-store","Access-Control-Allow-Origin":"*"};if(Z.req.header("if-none-match")===`"${X.sha}"`)return Z.body(null,304,J);if(!Q.userId)return Z.body(X.decofile,200,{...J,"content-type":"application/json"});let G=XG1({organizationId:Q.organizationId,virtualMcpId:Q.virtualMcpId,branch:Q.branch});return Z.body(`{"version":${JSON.stringify(X.sha)},"token":${JSON.stringify(G)},"apiHost":${JSON.stringify(ro$(Z))},"decofile":${X.decofile}}`,200,{...J,"content-type":"application/json"})}catch(Y){return m00(Z,Y)}}),$.get("/:virtualMcpId/:branch/meta",async(Z)=>{let Q=Z.get("decofileScope"),Y=Q.packagePath?`${Q.packagePath}/.deco/meta.gen.json`:".deco/meta.gen.json";try{let X=await d00(Z),J=await X.readFileAtRef(Q.branch,Y);if(J===null){let G=await X.getDefaultBranch();if(G!==Q.branch)J=await X.readFileAtRef(G,Y)}if(J===null)return Z.json({error:"meta.gen.json not committed"},404);return Z.body(J,200,{"content-type":"application/json","Cache-Control":"no-store","Access-Control-Allow-Origin":"*"})}catch(X){return m00(Z,X)}}),$.patch("/:virtualMcpId/:branch",CA6,async(Z)=>{let Q=Z.get("decofileScope"),Y=Z.var.studioContext,X=_A6.safeParse(await Z.req.json().catch(()=>null));if(!X.success)return Z.json({error:"Invalid body",details:X.error.issues},400);let J=X.data;for(let G of[...Object.keys(J.set??{}),...J.delete??[]])try{Nq0(G)}catch(W){let K=W instanceof Error?W.message:String(W);return Z.json({error:K},400)}for(let[G,W]of Object.entries(J.set??{})){if(typeof W!=="object"||W===null||Array.isArray(W))return Z.json({error:`Block "${G}" must be a JSON object`},400);if(dJ1(G))return Z.json({error:`Block key "${G}" collides with a framework resolver module and cannot be written`},400)}try{let G=await d00(Z),W=await uo$(`${Q.organizationId}/${Q.virtualMcpId}/${Q.branch}`,{client:G,branch:Q.branch,packagePath:Q.packagePath,coAuthor:yc(Y)},J),K=XG1({organizationId:Q.organizationId,virtualMcpId:Q.virtualMcpId,branch:Q.branch});return Z.json({version:W,token:K,apiHost:ro$(Z)})}catch(G){return m00(Z,G)}}),$.post("/:virtualMcpId/:branch/publish",async(Z)=>{let Q=Z.get("decofileScope");try{let Y=await d00(Z),X=await Y.getDefaultBranch();if(X===Q.branch)return Z.json({error:"Branch is already the default branch"},400);let J=`chore(decofile): publish ${Q.branch}`;try{let G;try{G=await Y.mergeBranches(X,Q.branch,J)}catch(W){if(dG(W)!==409)throw W;await Rq0(Y,Q.branch,X),G=await Y.mergeBranches(X,Q.branch,J)}return G?Z.json({result:"merged",sha:G}):Z.json({result:"up-to-date"})}catch(G){if(dG(G)===409)return Z.json({error:"merge-conflict"},409);if(dG(G)===405){let K=await Y.findOpenChangeRequest(X,Q.branch)??await Y.createChangeRequest({base:X,head:Q.branch,title:`Publish ${Q.branch}`});return Z.json({result:"pull-request",number:K.number,url:K.url})}throw G}}catch(Y){return m00(Z,Y)}}),$.get("/:virtualMcpId/:branch/status",async(Z)=>{let Q=Z.get("decofileScope");try{let Y=await d00(Z),X=await Y.getDefaultBranch();if(X===Q.branch)return Z.json({baseBranch:X,aheadBy:0,behindBy:0,lastCommitAt:null});try{let[{aheadBy:J,behindBy:G},W]=await Promise.all([Y.compare(X,Q.branch),Y.getBranch(Q.branch)]);return Z.json({baseBranch:X,aheadBy:J,behindBy:G,lastCommitAt:W?.committedAt??null})}catch(J){if(dG(J)===404)return Z.json({baseBranch:X,aheadBy:0,behindBy:0,lastCommitAt:null});throw J}}catch(Y){return m00(Z,Y)}}),$}var kA6,po$=500,no$=1048576,to$=1024,SA6=8388608,CA6,_A6,oo$;var ao$=D(()=>{Ba0();Bq0();g$();XK();vJ1();Uq0();ZG1();sZ();lo$();io$();$G1();zq0();kA6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;CA6=v5({maxSize:SA6,onError:($)=>$.json({error:"Payload too large"},413)}),_A6=dc.object({set:dc.record(dc.string(),dc.unknown()).optional(),delete:dc.array(dc.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)<=po$,{message:`Patch cannot touch more than ${po$} blocks`}).refine(($)=>Object.values($.set??{}).every((Z)=>JSON.stringify(Z).length<=no$),{message:`Each block must be at most ${no$} bytes`}).refine(($)=>[...Object.keys($.set??{}),...$.delete??[]].every((Z)=>Z.length<=to$),{message:`Each block key must be at most ${to$} characters`}),oo$=Fq0(async($,Z)=>{let Q=$.var.studioContext,Y=Q.organization;if(!Y)return $.json({error:"Organization scope required"},500);let X=$.req.param("virtualMcpId"),J=$.req.param("branch");if(!X||!J)return $.json({error:"virtualMcpId and branch are required"},400);if(!VA6(J))return $.json({error:`Invalid branch name: ${J}`},400);let G=Q.auth?.user?.id??null;if(!G){let B=$.req.query("token");if(!($.req.method==="GET"&&!$.req.path.match(/\/(publish|status)$/)))return $.json({error:"Unauthorized"},401);if(!B||!mo$(B,{organizationId:Y.id,virtualMcpId:X,branch:J}))return $.json({error:"Unauthorized"},401)}let W=await Q.storage.virtualMcps.findById(X);if(!W||W.organization_id!==Y.id)return $.json({error:"Virtual MCP not found"},404);let K=W.metadata??null;if(!DE0(K))return $.json({error:"Project has no preview server configured"},404);let F=W.connections?.map((B)=>B.connection_id)??[],U=l00(K,F);if(!U)return $.json({error:"Project has no GitHub repository"},404);let N=K?.runtime;return $.set("decofileScope",{organizationId:Y.id,virtualMcpId:X,branch:J,packagePath:N?.path?.replace(/^\/+|\/+$/g,"")||null,githubRepo:U,userId:G}),Z()})});var eo$=($)=>{let Z=new $1;if(Z.use("*",hf),Z.use("*",Cm$),Z.route("/",zR0()),Z.route("/",Ni$()),Z.route("/",em$()),Z.route("/",zt$()),Z.route("/",Bt$()),Z.route("/",wt$()),Z.route("/",Wq0()),Z.route("/tools",Mt$()),Z.route("/",Rt$()),Z.route("/",in$({kvStorage:$.kvStorage})),Z.route("/",dn$()),Z.route("/fs",Xt$({getConnection:$.getNatsConnection})),Z.route("/sandbox",go$()),Z.route("/decofile",so$()),Z.route("/",Ft$()),Z.route("/",Gt$()),Z.route("/deco-sites",AR0()),Z.route("/hosting",cm$()),Z.route("/monitor",om$()),Z.route("/sso",OR0()),Z.route("/",Kq0({tokenStorage:$.tokenStorage,automationEventDispatcher:$.automationEventDispatcher})),Z.route("/webhooks",ym$()),$.mountDevAssets)Z.route("/dev-assets",IR0({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("/",ol$()),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",Kt$()),Z.route("/mcp",wz0()),Z.route("/mcp/self",Xq0()),Z.route("/mcp",zz0()),Z.all("/oauth-proxy/:connectionId/*",$.oauthProxyHandler),Z.get("/watch",$.watchHandler),Z};var $r$=D(()=>{g$();_m$();XR0();gm$();$X1();dm$();rm$();MR0();jc();oY1();JX1();mn$();pn$();Jt$();Wt$();Hs();dY1();Pz0();RJ1();Ht$();Ut$();Ot$();MJ1();Pt$();qt$();kJ1();kt$();VJ1();Ez0();ho$();ao$()});function vA6($){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 fA6=async($,Z)=>{if(!$.get("studioContext").auth.user?.id)return $.json({error:"Unauthorized"},401);return Z()},Zr$=()=>{let $=new $1;return $.use("*",fA6),$.get("/",async(Z)=>{let Q=M0(),Y=Q.decoSupabaseUrl,X=Q.decoSupabaseServiceKey;if(!Y||!X)return Z.json({apps:[]});try{let J=await lX(Y,X,"apps?select=name,title,description,logo,category,vendors(alias,url)");return Z.json({apps:vA6(J)})}catch(J){return console.error("[deco-apps] GET error:",J),Z.json({error:"Failed to fetch apps"},502)}}),$};var Qr$=D(()=>{g$();E$();UT0()});import{z as k1}from"zod";function LF($,Z="invalid_request_error",Q=null,Y=null){return{error:{message:$,type:Z,param:Q,code:Y}}}function mA6($){if(!$)return null;let Z=$.indexOf(":");if(Z===-1)return{credentialId:null,modelId:$};let Q=$.substring(0,Z),Y=$.substring(Z+1);if(!Q||!Y)return null;return{credentialId:Q,modelId:Y}}function iA6($,Z,Q){try{return JSON.parse($)}catch{throw new Jr$(`Invalid JSON in tool call arguments for function '${Q}' (tool_call_id: ${Z}): ${$}`)}}function pA6($){let Z={};for(let Q of $)if(Q.role==="assistant"&&Q.tool_calls)for(let Y of Q.tool_calls)Z[Y.id]=Y.function.name;return $.map((Q)=>{switch(Q.role){case"system":return{role:"system",content:Q.content};case"user":if(typeof Q.content==="string")return{role:"user",content:Q.content};return{role:"user",content:Q.content.map((X)=>{if(X.type==="text")return{type:"text",text:X.text};return{type:"image",image:X.image_url.url}})};case"assistant":if(Q.tool_calls&&Q.tool_calls.length>0)return{role:"assistant",content:Q.tool_calls.map((X)=>({type:"tool-call",toolCallId:X.id,toolName:X.function.name,input:iA6(X.function.arguments,X.id,X.function.name)}))};return{role:"assistant",content:Q.content??""};case"tool":let Y=Z[Q.tool_call_id]??"unknown";return{role:"tool",content:[{type:"tool-result",toolCallId:Q.tool_call_id,toolName:Y,output:{type:"text",value:Q.content}}]}}})}function nA6($){let Z=$.map((Q)=>{let Y=Q.function.parameters?bJ(Q.function.parameters):bJ({type:"object",properties:{}});return[Q.function.name,W$({description:Q.function.description,inputSchema:Y})]});return Object.fromEntries(Z)}function tA6($){if(!$)return;return{openai:{response_format:$}}}function oA6(){return`chatcmpl-${crypto.randomUUID().replace(/-/g,"").substring(0,29)}`}function Yr$($,Z,Q,Y,X,J){let G={model:$,messages:Z,tools:Q,temperature:Y.temperature,maxTokens:Y.max_tokens,topP:Y.top_p,frequencyPenalty:Y.frequency_penalty,presencePenalty:Y.presence_penalty,stopSequences:Y.stop?Array.isArray(Y.stop)?Y.stop:[Y.stop]:void 0,abortSignal:J};return X?{...G,providerOptions:X}:G}function Xr$($){if($==="tool-calls")return"tool_calls";if($==="length")return"length";return"stop"}var bA6=256,xA6,yA6,gA6,hA6,uA6,lA6,cA6,dA6,Jr$,Gr$,Wr$;var Kr$=D(()=>{C4();g$();xc();EN();xA6=k1.object({type:k1.literal("function"),function:k1.object({name:k1.string(),description:k1.string().optional(),parameters:k1.record(k1.string(),k1.unknown()).optional()})}),yA6=k1.object({id:k1.string(),type:k1.literal("function"),function:k1.object({name:k1.string(),arguments:k1.string()})}),gA6=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(yA6).optional()}),k1.object({role:k1.literal("tool"),content:k1.string(),tool_call_id:k1.string()})]),hA6=k1.object({type:k1.literal("text")}),uA6=k1.object({type:k1.literal("json_object")}),lA6=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()})}),cA6=k1.union([hA6,uA6,lA6]),dA6=k1.object({model:k1.string().describe("Format: 'model_id' or 'credential_id:model_id'"),messages:k1.array(gA6),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(xA6).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:cA6.optional(),user:k1.string().optional()});Jr$=class Jr$ extends Error{constructor($){super($);this.name="MessageConversionError"}};Gr$=new $1;Gr$.post("/:org/v1/chat/completions",async($)=>{let Z=$.get("studioContext"),Q=$.req.param("org");try{if(!Z.auth.apiKey?.id)return $.json(LF("API key authentication required. Provide a valid API key via Authorization header.","authentication_error"),401);if(!Z.organization)return $.json(LF("Organization context is required. Ensure your API key has organization metadata.","invalid_request_error","organization"),400);if((Z.organization.slug??Z.organization.id)!==Q)return $.json(LF("Organization mismatch. The API key's organization does not match the requested organization.","invalid_request_error","organization"),403);let Y=await $.req.json(),X=dA6.safeParse(Y);if(!X.success){let w=X.error.issues[0]??{message:"Invalid request",path:[]};return $.json(LF(`Invalid request: ${w.message}`,"invalid_request_error",w.path.length>0?w.path.join("."):null),400)}let J=X.data,G=mA6(J.model);if(!G)return $.json(LF("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}=G,{modelId:K}=G;if(!W){let E=(await Z.storage.aiProviderKeys.list({organizationId:Z.organization.id})).find((j)=>OE(j.providerId));if(!E)return $.json(LF("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(LF(`AI provider credential not found or inaccessible: ${W}`,"invalid_request_error","model"),404)}let F=H.aiSdk.languageModel(K),U=pA6(J.messages),N=J.tools?nA6(J.tools):void 0,B=tA6(J.response_format),O=oA6(),L=Math.floor(Date.now()/1000);if(J.stream)return dN($,async(w)=>{let E=Yr$(F,U,N,J,B,$.req.raw.signal);try{let j=aD(E),z=!1,P=0,A="",q=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:J.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:J.model,choices:[{index:0,delta:{role:"assistant",content:""},finish_reason:null}]})}),z=!0;if(k.type==="text-delta"){if(A+=k.text,A.length>=bA6)await q()}else if(k.type==="tool-call"){await q();let M=P++;await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:J.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 q(),await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:J.model,choices:[{index:0,delta:{},finish_reason:Xr$(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 q(),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=Yr$(F,U,N,J,B,$.req.raw.signal),E=await rD(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:J.model,choices:[{index:0,message:j,finish_reason:Xr$(E.finishReason)}],usage:{prompt_tokens:E.usage?.inputTokens??0,completion_tokens:E.usage?.outputTokens??0,total_tokens:E.usage?.totalTokens??0}})}}catch(Y){let X=Y;if(X.name==="AbortError")return $.json(LF("Request aborted","invalid_request_error"),400);if(X.name==="MessageConversionError")return $.json(LF(X.message,"invalid_request_error","messages"),400);return console.error("[openai-compat] Error:",X.message,X.stack),$.json(LF(X.message,"server_error"),500)}});Wr$=Gr$});function rA6($){if(typeof $!=="object"||$===null)return!1;let Q=$.githubRepo?.url;return typeof Q==="string"&&Q.length>0}function Hr$(){let $=new $1;return $.use("*",async(Z,Q)=>{await Q(),Z.header("Cache-Control","private, no-store"),Z.header("Vary","Cookie")}),$.get("/",async(Z)=>{let Q=Z.get("studioContext"),Y=n0(Q);if(!Y)return Z.json({error:"Authentication required"},401);let J=(Z.req.query("site")??"").trim().toLowerCase();if(!V7(J))return Z.json({error:"Invalid site slug"},400);let G=await Q.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","=",Y).execute(),W=[];for(let H of G){if(!H.slug||l5(H))continue;let F=await Q.storage.virtualMcps.list(H.id);for(let U of F){if(Z4$(U)!==J)continue;if(!rA6(U.metadata))continue;W.push({orgSlug:H.slug,orgName:H.name??H.slug,project:{id:U.id,title:U.title,icon:U.icon??null}})}}let K={matches:W};return Z.json(K)}),$}var Fr$=D(()=>{g$();QH()});var Nr$;var Ur$=D(()=>{Nr$={name:"decocms",version:"4.358.2",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 eA6(){let $=process.env.POSTHOG_KEY;if(!$)return null;return{key:$,host:process.env.POSTHOG_HOST??aA6}}var Br$,aA6="https://ph.studio.decocms.com",Or$;var Dr$=D(()=>{g$();Tn();Tv();P5();E$();kY1();Ur$();Br$=new $1;Br$.get("/",($)=>{let Z={version:Nr$.version,theme:qr1(),...GW().logo&&{logo:GW().logo},...JN()&&{internalUrl:gx1()},...M0().enableDecoImport&&{enableDecoImport:!0},brandExtractEnabled:!!M0().firecrawlApiKey,hostingEnabled:!!M0().controlplaneRestUrl&&!!M0().controlplaneServiceToken,hostingControlPlaneGa:M0().hostingControlPlaneGa,monitorEnabled:!!M0().clickhouseAnalyticsUrl&&!!M0().clickhouseAnalyticsPassword,monitorGa:M0().monitorGa,auth:_d$(),posthog:eA6(),googleMapsApiKey:process.env.GOOGLE_MAPS_API_KEY?.trim()||null,runtime:{agentSandbox:a00()}};return $.header("Cache-Control","no-store"),$.json({success:!0,config:Z})});Or$=Br$});function mc($){let Z=($??"").trim().toLowerCase();return Z=Z.replace(/^https?:\/\//,""),Z=Z.replace(/^www\./,""),Z=Z.split(/[/?#]/)[0]??"",Z.replace(/\/+$/,"")}function JG1($){return(mc($).split(".")[0]||$).replace(/[-_]/g," ").split(" ").filter(Boolean).map((Q)=>Q.charAt(0).toUpperCase()+Q.slice(1)).join(" ")}function wr$($,Z=64){return`https://www.google.com/s2/favicons?domain=${encodeURIComponent(mc($))}&sz=${Z}`}function Lr$($,Z){let Q=$.trim();if(Q.length<=Z)return Q;let Y=Q.slice(0,Z-1),X=Y.lastIndexOf(" ");return`${(X>Z*0.6?Y.slice(0,X):Y).trimEnd()}\u2026`}function Er$($){let{brand:Z,domain:Q,score:Y,verdict:X}=$,J=typeof Y==="number"?`${Z} commerce report \u2014 ${Math.round(Y)}/100 \xB7 decocms`:`${Z} commerce report \xB7 decocms`,G=`See the full ${Z} scorecard \u2014 SEO, performance, conversion & AEO signals scored by decocms.`,W=X?.trim()?Lr$(`${X.trim().replace(/\s+/g," ")} \u2014 ${G}`,200):Lr$(`How does ${Q} really perform? ${G}`,200);return{title:J,description:W}}import{z as c0}from"zod";var Jb,$26,Z26,Q26,Y26,jr$;var zr$=D(()=>{Jb=c0.enum(["good","bad","neutral"]),$26=c0.preprocess(($)=>{if(Array.isArray($))return{kind:"text",value:$.find((Q)=>Q!==null&&typeof Q!=="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:Jb.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 $})),Z26=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($26)),Q26={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()},Y26=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:Jb.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:Jb.optional()}),c0.object({template:c0.literal("stats"),stats:c0.array(c0.object({value:c0.coerce.string(),label:c0.coerce.string(),tone:Jb.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:Jb.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(Z26).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:Jb.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:Jb.optional()})).min(1)})]),jr$=c0.object({...Q26,template:Y26})});function kq0($){let Z=[],Q=[...$.sections].sort((X,J)=>X.position-J.position).map((X)=>{let J=jr$.safeParse(X.props);if(J.success)return J.data;let G=J.error.issues[0];return Z.push({section_type:X.section_type,position:X.position,reason:G?`${G.path.join(".")||"(root)"}: ${G.message}`:"contract violation"}),null}).filter((X)=>X!==null),Y=Q.filter((X)=>X.template.template!=="cover"&&X.template.template!=="cta").map((X)=>({key:X.key,title:X.title}));return{deck:{meta:{...$.meta,scores:$.summary?.scores,scannedAt:$.scanned_at,toc:Y},slides:Q},drops:Z}}var GG1=D(()=>{zr$()});import{join as Pr$}from"path";async function J26($){try{let Z=await fetch(`${tK({})}/api/v2/public/diagnostics/${encodeURIComponent($)}`,{headers:{Accept:"application/json"},signal:AbortSignal.timeout(X26)});if(!Z.ok)return null;let Q=await Z.json(),{deck:Y}=kq0(Q);if(!Y.slides.length)return null;let X=Y.slides.find((W)=>W.template.template==="cover"),J=X?.template,G=J&&J.template==="cover"?J:void 0;return{brand:Y.meta.brand?.trim()||JG1($),score:Y.meta.scores?.cover??G?.score?.value,verdict:X?.annotation?.trim()||X?.headline?.trim()||void 0}}catch{return null}}function $G($){return $.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function G26($,Z){let Q=mc($),Y=Z?.brand?.trim()||JG1(Q),X=wr$(Q,128),G=`${(M0().baseUrl??"https://studio.decocms.com").replace(/\/+$/,"")}/report/${encodeURIComponent(Q)}`,{title:W,description:K}=Er$({brand:Y,domain:Q,score:Z?.score,verdict:Z?.verdict}),H=`${G}/og.png`,F=`${Y} commerce report by decocms`;return[`<title>${$G(W)}</title>`,`<meta name="description" content="${$G(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="${$G(W)}" />`,`<meta property="og:description" content="${$G(K)}" />`,`<meta property="og:url" content="${$G(G)}" />`,`<meta property="og:image" content="${$G(H)}" />`,'<meta property="og:image:width" content="1200" />','<meta property="og:image:height" content="630" />',`<meta property="og:image:alt" content="${$G(F)}" />`,'<meta name="twitter:card" content="summary_large_image" />',`<meta name="twitter:title" content="${$G(W)}" />`,`<meta name="twitter:description" content="${$G(K)}" />`,`<meta name="twitter:image" content="${$G(H)}" />`,`<meta name="twitter:image:alt" content="${$G(F)}" />`,`<link rel="canonical" href="${$G(G)}" />`,`<link rel="icon" href="${$G(X)}" sizes="any" />`].join(`
|
|
2941
|
+
`;await Ao$(Z.repo,L);let w=O[0]??`${jq0(Y)}/${mJ1(N)}.json`;H.push({path:w,content:L});let E=w.slice(w.lastIndexOf("/")+1,-5);F.set(w,{stem:E,content:L});for(let j of O.slice(1))H.push({path:j,deleted:!0}),F.delete(j)}for(let N of $.del)for(let B of aJ1(K,N))H.push({path:B,deleted:!0}),F.delete(B);if(H.length===0)return G;let U=Y?`${Y}/.deco/blocks.gen.json`:".deco/blocks.gen.json";if(W.some((N)=>N.type==="blob"&&N.path===U)){let N=await To$(Z,F.values(),X),{decofile:B,skipped:O}=x00(N);if(O.length>0)console.warn("decofile gen: dropped blocks that were not valid JSON",{repo:wW(Z.repo),branch:Q,packagePath:Y,blocks:O.map((L)=>L.key)});H.push({path:U,content:B})}try{let{sha:N}=await Z.commitFiles({branch:Q,message:RA6($),expectedHead:G,changes:H});return N}catch(N){if(!(N instanceof D6)||J>=PA6-1)throw N;await z$(U7(2000,200,J,2,0.5))}}}function RA6($){let Z=(X)=>{let J=X.slice(0,3).join(", ");return X.length>3?`${J} (+${X.length-3} more)`:J},Q=[];if($.set.size>0)Q.push(`update ${Z([...$.set.keys()])}`);if($.del.size>0)Q.push(`delete ${Z([...$.del])}`);let Y=`chore(decofile): ${Q.join("; ")}`;return Yr0(Y,$.deps.coAuthor)}var PA6=3,YG1;var lo$=D(()=>{Zw0();Bq0();c6();G8();sZ();zq0();YG1=new Map});import{createHmac as co$,randomBytes as qA6,timingSafeEqual as IA6}from"crypto";function do$(){if(Mq0)return Mq0;let $;try{let Z=M0();$=Z.studioJwtSecret??Z.betterAuthSecret}catch{$=void 0}return Mq0=$?Buffer.from($):qA6(32),Mq0}function XG1($){let Z=$.nowMs??Date.now(),Q={o:$.organizationId,m:$.virtualMcpId,b:$.branch,e:Math.floor((Z+MA6)/1000)},Y=Buffer.from(JSON.stringify(Q)).toString("base64url"),X=co$("sha256",do$()).update(Y).digest("base64url");return`${Y}.${X}`}function mo$($,Z){let Q=$.indexOf(".");if(Q<0)return!1;let Y=$.slice(0,Q),X=Buffer.from($.slice(Q+1)),J=Buffer.from(co$("sha256",do$()).update(Y).digest("base64url"));if(X.length!==J.length||!IA6(X,J))return!1;let G;try{G=JSON.parse(Buffer.from(Y,"base64url").toString())}catch{return!1}let W=Math.floor((Z.nowMs??Date.now())/1000);return G.o===Z.organizationId&&G.m===Z.virtualMcpId&&G.b===Z.branch&&typeof G.e==="number"&&G.e>=W}var MA6=21600000,Mq0=null;var io$=D(()=>{E$()});import{z as dc}from"zod";function VA6($){return $.length>0&&$.length<=255&&!$.includes("..")&&!$.endsWith("/")&&!$.endsWith(".lock")&&kA6.test($)}function ro$($){return $.req.header("x-forwarded-host")??new URL($.req.url).host}async function d00($){let Z=$.get("decofileScope");return Bh($.var.studioContext,Z.organizationId,Z.githubRepo)}function m00($,Z){let Q=Z instanceof Error?Z.message:String(Z);if(Z instanceof D6)return $.json({error:Q},409);let Y=dG(Z);if(Y!==null){let X=Y===404?404:Y===409||Y===422?409:502;return $.json({error:Q},X)}return $.json({error:Q},500)}function so$(){let $=new $1;return $.use("/:virtualMcpId/:branch",oo$),$.use("/:virtualMcpId/:branch/*",oo$),$.get("/:virtualMcpId/:branch",async(Z)=>{let Q=Z.get("decofileScope");try{let Y=await d00(Z),X=await Ro$(Y,Q.branch,Q.packagePath,{createBranchIfMissing:!!Q.userId}),J={ETag:`"${X.sha}"`,"Cache-Control":"no-store","Access-Control-Allow-Origin":"*"};if(Z.req.header("if-none-match")===`"${X.sha}"`)return Z.body(null,304,J);if(!Q.userId)return Z.body(X.decofile,200,{...J,"content-type":"application/json"});let G=XG1({organizationId:Q.organizationId,virtualMcpId:Q.virtualMcpId,branch:Q.branch});return Z.body(`{"version":${JSON.stringify(X.sha)},"token":${JSON.stringify(G)},"apiHost":${JSON.stringify(ro$(Z))},"decofile":${X.decofile}}`,200,{...J,"content-type":"application/json"})}catch(Y){return m00(Z,Y)}}),$.get("/:virtualMcpId/:branch/meta",async(Z)=>{let Q=Z.get("decofileScope"),Y=Q.packagePath?`${Q.packagePath}/.deco/meta.gen.json`:".deco/meta.gen.json";try{let X=await d00(Z),J=await X.readFileAtRef(Q.branch,Y);if(J===null){let G=await X.getDefaultBranch();if(G!==Q.branch)J=await X.readFileAtRef(G,Y)}if(J===null)return Z.json({error:"meta.gen.json not committed"},404);return Z.body(J,200,{"content-type":"application/json","Cache-Control":"no-store","Access-Control-Allow-Origin":"*"})}catch(X){return m00(Z,X)}}),$.patch("/:virtualMcpId/:branch",CA6,async(Z)=>{let Q=Z.get("decofileScope"),Y=Z.var.studioContext,X=_A6.safeParse(await Z.req.json().catch(()=>null));if(!X.success)return Z.json({error:"Invalid body",details:X.error.issues},400);let J=X.data;for(let G of[...Object.keys(J.set??{}),...J.delete??[]])try{Nq0(G)}catch(W){let K=W instanceof Error?W.message:String(W);return Z.json({error:K},400)}for(let[G,W]of Object.entries(J.set??{})){if(typeof W!=="object"||W===null||Array.isArray(W))return Z.json({error:`Block "${G}" must be a JSON object`},400);if(dJ1(G))return Z.json({error:`Block key "${G}" collides with a framework resolver module and cannot be written`},400)}try{let G=await d00(Z),W=await uo$(`${Q.organizationId}/${Q.virtualMcpId}/${Q.branch}`,{client:G,branch:Q.branch,packagePath:Q.packagePath,coAuthor:yc(Y)},J),K=XG1({organizationId:Q.organizationId,virtualMcpId:Q.virtualMcpId,branch:Q.branch});return Z.json({version:W,token:K,apiHost:ro$(Z)})}catch(G){return m00(Z,G)}}),$.post("/:virtualMcpId/:branch/publish",async(Z)=>{let Q=Z.get("decofileScope");try{let Y=await d00(Z),X=await Y.getDefaultBranch();if(X===Q.branch)return Z.json({error:"Branch is already the default branch"},400);let J=`chore(decofile): publish ${Q.branch}`;try{let G;try{G=await Y.mergeBranches(X,Q.branch,J)}catch(W){if(dG(W)!==409)throw W;await Rq0(Y,Q.branch,X),G=await Y.mergeBranches(X,Q.branch,J)}return G?Z.json({result:"merged",sha:G}):Z.json({result:"up-to-date"})}catch(G){if(dG(G)===409)return Z.json({error:"merge-conflict"},409);if(dG(G)===405){let K=await Y.findOpenChangeRequest(X,Q.branch)??await Y.createChangeRequest({base:X,head:Q.branch,title:`Publish ${Q.branch}`});return Z.json({result:"pull-request",number:K.number,url:K.url})}throw G}}catch(Y){return m00(Z,Y)}}),$.get("/:virtualMcpId/:branch/status",async(Z)=>{let Q=Z.get("decofileScope");try{let Y=await d00(Z),X=await Y.getDefaultBranch();if(X===Q.branch)return Z.json({baseBranch:X,aheadBy:0,behindBy:0,lastCommitAt:null});try{let[{aheadBy:J,behindBy:G},W]=await Promise.all([Y.compare(X,Q.branch),Y.getBranch(Q.branch)]);return Z.json({baseBranch:X,aheadBy:J,behindBy:G,lastCommitAt:W?.committedAt??null})}catch(J){if(dG(J)===404)return Z.json({baseBranch:X,aheadBy:0,behindBy:0,lastCommitAt:null});throw J}}catch(Y){return m00(Z,Y)}}),$}var kA6,po$=500,no$=1048576,to$=1024,SA6=8388608,CA6,_A6,oo$;var ao$=D(()=>{Ba0();Bq0();g$();XK();vJ1();Uq0();ZG1();sZ();lo$();io$();$G1();zq0();kA6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;CA6=v5({maxSize:SA6,onError:($)=>$.json({error:"Payload too large"},413)}),_A6=dc.object({set:dc.record(dc.string(),dc.unknown()).optional(),delete:dc.array(dc.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)<=po$,{message:`Patch cannot touch more than ${po$} blocks`}).refine(($)=>Object.values($.set??{}).every((Z)=>JSON.stringify(Z).length<=no$),{message:`Each block must be at most ${no$} bytes`}).refine(($)=>[...Object.keys($.set??{}),...$.delete??[]].every((Z)=>Z.length<=to$),{message:`Each block key must be at most ${to$} characters`}),oo$=Fq0(async($,Z)=>{let Q=$.var.studioContext,Y=Q.organization;if(!Y)return $.json({error:"Organization scope required"},500);let X=$.req.param("virtualMcpId"),J=$.req.param("branch");if(!X||!J)return $.json({error:"virtualMcpId and branch are required"},400);if(!VA6(J))return $.json({error:`Invalid branch name: ${J}`},400);let G=Q.auth?.user?.id??null;if(!G){let B=$.req.query("token");if(!($.req.method==="GET"&&!$.req.path.match(/\/(publish|status)$/)))return $.json({error:"Unauthorized"},401);if(!B||!mo$(B,{organizationId:Y.id,virtualMcpId:X,branch:J}))return $.json({error:"Unauthorized"},401)}let W=await Q.storage.virtualMcps.findById(X);if(!W||W.organization_id!==Y.id)return $.json({error:"Virtual MCP not found"},404);let K=W.metadata??null;if(!DE0(K))return $.json({error:"Project has no preview server configured"},404);let F=W.connections?.map((B)=>B.connection_id)??[],U=l00(K,F);if(!U)return $.json({error:"Project has no GitHub repository"},404);let N=K?.runtime;return $.set("decofileScope",{organizationId:Y.id,virtualMcpId:X,branch:J,packagePath:N?.path?.replace(/^\/+|\/+$/g,"")||null,githubRepo:U,userId:G}),Z()})});var eo$=($)=>{let Z=new $1;if(Z.use("*",hf),Z.use("*",Cm$),Z.route("/",zR0()),Z.route("/",Ni$()),Z.route("/",em$()),Z.route("/",zt$()),Z.route("/",Bt$()),Z.route("/",wt$()),Z.route("/",Wq0()),Z.route("/tools",Mt$()),Z.route("/",Rt$()),Z.route("/",in$({kvStorage:$.kvStorage})),Z.route("/",dn$()),Z.route("/fs",Xt$({getConnection:$.getNatsConnection})),Z.route("/sandbox",go$()),Z.route("/decofile",so$()),Z.route("/",Ft$()),Z.route("/",Gt$()),Z.route("/deco-sites",AR0()),Z.route("/hosting",cm$()),Z.route("/monitor",om$()),Z.route("/sso",OR0()),Z.route("/",Kq0({tokenStorage:$.tokenStorage,automationEventDispatcher:$.automationEventDispatcher})),Z.route("/webhooks",ym$()),$.mountDevAssets)Z.route("/dev-assets",IR0({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("/",ol$()),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",Kt$()),Z.route("/mcp",wz0()),Z.route("/mcp/self",Xq0()),Z.route("/mcp",zz0()),Z.all("/oauth-proxy/:connectionId/*",$.oauthProxyHandler),Z.get("/watch",$.watchHandler),Z};var $r$=D(()=>{g$();_m$();XR0();gm$();$X1();dm$();rm$();MR0();jc();oY1();JX1();mn$();pn$();Jt$();Wt$();Hs();dY1();Pz0();RJ1();Ht$();Ut$();Ot$();MJ1();Pt$();qt$();kJ1();kt$();VJ1();Ez0();ho$();ao$()});function vA6($){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 fA6=async($,Z)=>{if(!$.get("studioContext").auth.user?.id)return $.json({error:"Unauthorized"},401);return Z()},Zr$=()=>{let $=new $1;return $.use("*",fA6),$.get("/",async(Z)=>{let Q=M0(),Y=Q.decoSupabaseUrl,X=Q.decoSupabaseServiceKey;if(!Y||!X)return Z.json({apps:[]});try{let J=await lX(Y,X,"apps?select=name,title,description,logo,category,vendors(alias,url)");return Z.json({apps:vA6(J)})}catch(J){return console.error("[deco-apps] GET error:",J),Z.json({error:"Failed to fetch apps"},502)}}),$};var Qr$=D(()=>{g$();E$();UT0()});import{z as k1}from"zod";function LF($,Z="invalid_request_error",Q=null,Y=null){return{error:{message:$,type:Z,param:Q,code:Y}}}function mA6($){if(!$)return null;let Z=$.indexOf(":");if(Z===-1)return{credentialId:null,modelId:$};let Q=$.substring(0,Z),Y=$.substring(Z+1);if(!Q||!Y)return null;return{credentialId:Q,modelId:Y}}function iA6($,Z,Q){try{return JSON.parse($)}catch{throw new Jr$(`Invalid JSON in tool call arguments for function '${Q}' (tool_call_id: ${Z}): ${$}`)}}function pA6($){let Z={};for(let Q of $)if(Q.role==="assistant"&&Q.tool_calls)for(let Y of Q.tool_calls)Z[Y.id]=Y.function.name;return $.map((Q)=>{switch(Q.role){case"system":return{role:"system",content:Q.content};case"user":if(typeof Q.content==="string")return{role:"user",content:Q.content};return{role:"user",content:Q.content.map((X)=>{if(X.type==="text")return{type:"text",text:X.text};return{type:"image",image:X.image_url.url}})};case"assistant":if(Q.tool_calls&&Q.tool_calls.length>0)return{role:"assistant",content:Q.tool_calls.map((X)=>({type:"tool-call",toolCallId:X.id,toolName:X.function.name,input:iA6(X.function.arguments,X.id,X.function.name)}))};return{role:"assistant",content:Q.content??""};case"tool":let Y=Z[Q.tool_call_id]??"unknown";return{role:"tool",content:[{type:"tool-result",toolCallId:Q.tool_call_id,toolName:Y,output:{type:"text",value:Q.content}}]}}})}function nA6($){let Z=$.map((Q)=>{let Y=Q.function.parameters?bJ(Q.function.parameters):bJ({type:"object",properties:{}});return[Q.function.name,W$({description:Q.function.description,inputSchema:Y})]});return Object.fromEntries(Z)}function tA6($){if(!$)return;return{openai:{response_format:$}}}function oA6(){return`chatcmpl-${crypto.randomUUID().replace(/-/g,"").substring(0,29)}`}function Yr$($,Z,Q,Y,X,J){let G={model:$,messages:Z,tools:Q,temperature:Y.temperature,maxTokens:Y.max_tokens,topP:Y.top_p,frequencyPenalty:Y.frequency_penalty,presencePenalty:Y.presence_penalty,stopSequences:Y.stop?Array.isArray(Y.stop)?Y.stop:[Y.stop]:void 0,abortSignal:J};return X?{...G,providerOptions:X}:G}function Xr$($){if($==="tool-calls")return"tool_calls";if($==="length")return"length";return"stop"}var bA6=256,xA6,yA6,gA6,hA6,uA6,lA6,cA6,dA6,Jr$,Gr$,Wr$;var Kr$=D(()=>{C4();g$();xc();EN();xA6=k1.object({type:k1.literal("function"),function:k1.object({name:k1.string(),description:k1.string().optional(),parameters:k1.record(k1.string(),k1.unknown()).optional()})}),yA6=k1.object({id:k1.string(),type:k1.literal("function"),function:k1.object({name:k1.string(),arguments:k1.string()})}),gA6=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(yA6).optional()}),k1.object({role:k1.literal("tool"),content:k1.string(),tool_call_id:k1.string()})]),hA6=k1.object({type:k1.literal("text")}),uA6=k1.object({type:k1.literal("json_object")}),lA6=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()})}),cA6=k1.union([hA6,uA6,lA6]),dA6=k1.object({model:k1.string().describe("Format: 'model_id' or 'credential_id:model_id'"),messages:k1.array(gA6),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(xA6).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:cA6.optional(),user:k1.string().optional()});Jr$=class Jr$ extends Error{constructor($){super($);this.name="MessageConversionError"}};Gr$=new $1;Gr$.post("/:org/v1/chat/completions",async($)=>{let Z=$.get("studioContext"),Q=$.req.param("org");try{if(!Z.auth.apiKey?.id)return $.json(LF("API key authentication required. Provide a valid API key via Authorization header.","authentication_error"),401);if(!Z.organization)return $.json(LF("Organization context is required. Ensure your API key has organization metadata.","invalid_request_error","organization"),400);if((Z.organization.slug??Z.organization.id)!==Q)return $.json(LF("Organization mismatch. The API key's organization does not match the requested organization.","invalid_request_error","organization"),403);let Y=await $.req.json(),X=dA6.safeParse(Y);if(!X.success){let w=X.error.issues[0]??{message:"Invalid request",path:[]};return $.json(LF(`Invalid request: ${w.message}`,"invalid_request_error",w.path.length>0?w.path.join("."):null),400)}let J=X.data,G=mA6(J.model);if(!G)return $.json(LF("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}=G,{modelId:K}=G;if(!W){let E=(await Z.storage.aiProviderKeys.list({organizationId:Z.organization.id})).find((j)=>OE(j.providerId));if(!E)return $.json(LF("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(LF(`AI provider credential not found or inaccessible: ${W}`,"invalid_request_error","model"),404)}let F=H.aiSdk.languageModel(K),U=pA6(J.messages),N=J.tools?nA6(J.tools):void 0,B=tA6(J.response_format),O=oA6(),L=Math.floor(Date.now()/1000);if(J.stream)return dN($,async(w)=>{let E=Yr$(F,U,N,J,B,$.req.raw.signal);try{let j=aD(E),z=!1,P=0,A="",q=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:J.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:J.model,choices:[{index:0,delta:{role:"assistant",content:""},finish_reason:null}]})}),z=!0;if(k.type==="text-delta"){if(A+=k.text,A.length>=bA6)await q()}else if(k.type==="tool-call"){await q();let M=P++;await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:J.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 q(),await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:J.model,choices:[{index:0,delta:{},finish_reason:Xr$(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 q(),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=Yr$(F,U,N,J,B,$.req.raw.signal),E=await rD(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:J.model,choices:[{index:0,message:j,finish_reason:Xr$(E.finishReason)}],usage:{prompt_tokens:E.usage?.inputTokens??0,completion_tokens:E.usage?.outputTokens??0,total_tokens:E.usage?.totalTokens??0}})}}catch(Y){let X=Y;if(X.name==="AbortError")return $.json(LF("Request aborted","invalid_request_error"),400);if(X.name==="MessageConversionError")return $.json(LF(X.message,"invalid_request_error","messages"),400);return console.error("[openai-compat] Error:",X.message,X.stack),$.json(LF(X.message,"server_error"),500)}});Wr$=Gr$});function rA6($){if(typeof $!=="object"||$===null)return!1;let Q=$.githubRepo?.url;return typeof Q==="string"&&Q.length>0}function Hr$(){let $=new $1;return $.use("*",async(Z,Q)=>{await Q(),Z.header("Cache-Control","private, no-store"),Z.header("Vary","Cookie")}),$.get("/",async(Z)=>{let Q=Z.get("studioContext"),Y=n0(Q);if(!Y)return Z.json({error:"Authentication required"},401);let J=(Z.req.query("site")??"").trim().toLowerCase();if(!V7(J))return Z.json({error:"Invalid site slug"},400);let G=await Q.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","=",Y).execute(),W=[];for(let H of G){if(!H.slug||l5(H))continue;let F=await Q.storage.virtualMcps.list(H.id);for(let U of F){if(Z4$(U)!==J)continue;if(!rA6(U.metadata))continue;W.push({orgSlug:H.slug,orgName:H.name??H.slug,project:{id:U.id,title:U.title,icon:U.icon??null}})}}let K={matches:W};return Z.json(K)}),$}var Fr$=D(()=>{g$();QH()});var Nr$;var Ur$=D(()=>{Nr$={name:"decocms",version:"4.358.3",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 eA6(){let $=process.env.POSTHOG_KEY;if(!$)return null;return{key:$,host:process.env.POSTHOG_HOST??aA6}}var Br$,aA6="https://ph.studio.decocms.com",Or$;var Dr$=D(()=>{g$();Tn();Tv();P5();E$();kY1();Ur$();Br$=new $1;Br$.get("/",($)=>{let Z={version:Nr$.version,theme:qr1(),...GW().logo&&{logo:GW().logo},...JN()&&{internalUrl:gx1()},...M0().enableDecoImport&&{enableDecoImport:!0},brandExtractEnabled:!!M0().firecrawlApiKey,hostingEnabled:!!M0().controlplaneRestUrl&&!!M0().controlplaneServiceToken,hostingControlPlaneGa:M0().hostingControlPlaneGa,monitorEnabled:!!M0().clickhouseAnalyticsUrl&&!!M0().clickhouseAnalyticsPassword,monitorGa:M0().monitorGa,auth:_d$(),posthog:eA6(),googleMapsApiKey:process.env.GOOGLE_MAPS_API_KEY?.trim()||null,runtime:{agentSandbox:a00()}};return $.header("Cache-Control","no-store"),$.json({success:!0,config:Z})});Or$=Br$});function mc($){let Z=($??"").trim().toLowerCase();return Z=Z.replace(/^https?:\/\//,""),Z=Z.replace(/^www\./,""),Z=Z.split(/[/?#]/)[0]??"",Z.replace(/\/+$/,"")}function JG1($){return(mc($).split(".")[0]||$).replace(/[-_]/g," ").split(" ").filter(Boolean).map((Q)=>Q.charAt(0).toUpperCase()+Q.slice(1)).join(" ")}function wr$($,Z=64){return`https://www.google.com/s2/favicons?domain=${encodeURIComponent(mc($))}&sz=${Z}`}function Lr$($,Z){let Q=$.trim();if(Q.length<=Z)return Q;let Y=Q.slice(0,Z-1),X=Y.lastIndexOf(" ");return`${(X>Z*0.6?Y.slice(0,X):Y).trimEnd()}\u2026`}function Er$($){let{brand:Z,domain:Q,score:Y,verdict:X}=$,J=typeof Y==="number"?`${Z} commerce report \u2014 ${Math.round(Y)}/100 \xB7 decocms`:`${Z} commerce report \xB7 decocms`,G=`See the full ${Z} scorecard \u2014 SEO, performance, conversion & AEO signals scored by decocms.`,W=X?.trim()?Lr$(`${X.trim().replace(/\s+/g," ")} \u2014 ${G}`,200):Lr$(`How does ${Q} really perform? ${G}`,200);return{title:J,description:W}}import{z as c0}from"zod";var Jb,$26,Z26,Q26,Y26,jr$;var zr$=D(()=>{Jb=c0.enum(["good","bad","neutral"]),$26=c0.preprocess(($)=>{if(Array.isArray($))return{kind:"text",value:$.find((Q)=>Q!==null&&typeof Q!=="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:Jb.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 $})),Z26=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($26)),Q26={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()},Y26=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:Jb.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:Jb.optional()}),c0.object({template:c0.literal("stats"),stats:c0.array(c0.object({value:c0.coerce.string(),label:c0.coerce.string(),tone:Jb.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:Jb.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(Z26).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:Jb.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:Jb.optional()})).min(1)})]),jr$=c0.object({...Q26,template:Y26})});function kq0($){let Z=[],Q=[...$.sections].sort((X,J)=>X.position-J.position).map((X)=>{let J=jr$.safeParse(X.props);if(J.success)return J.data;let G=J.error.issues[0];return Z.push({section_type:X.section_type,position:X.position,reason:G?`${G.path.join(".")||"(root)"}: ${G.message}`:"contract violation"}),null}).filter((X)=>X!==null),Y=Q.filter((X)=>X.template.template!=="cover"&&X.template.template!=="cta").map((X)=>({key:X.key,title:X.title}));return{deck:{meta:{...$.meta,scores:$.summary?.scores,scannedAt:$.scanned_at,toc:Y},slides:Q},drops:Z}}var GG1=D(()=>{zr$()});import{join as Pr$}from"path";async function J26($){try{let Z=await fetch(`${tK({})}/api/v2/public/diagnostics/${encodeURIComponent($)}`,{headers:{Accept:"application/json"},signal:AbortSignal.timeout(X26)});if(!Z.ok)return null;let Q=await Z.json(),{deck:Y}=kq0(Q);if(!Y.slides.length)return null;let X=Y.slides.find((W)=>W.template.template==="cover"),J=X?.template,G=J&&J.template==="cover"?J:void 0;return{brand:Y.meta.brand?.trim()||JG1($),score:Y.meta.scores?.cover??G?.score?.value,verdict:X?.annotation?.trim()||X?.headline?.trim()||void 0}}catch{return null}}function $G($){return $.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function G26($,Z){let Q=mc($),Y=Z?.brand?.trim()||JG1(Q),X=wr$(Q,128),G=`${(M0().baseUrl??"https://studio.decocms.com").replace(/\/+$/,"")}/report/${encodeURIComponent(Q)}`,{title:W,description:K}=Er$({brand:Y,domain:Q,score:Z?.score,verdict:Z?.verdict}),H=`${G}/og.png`,F=`${Y} commerce report by decocms`;return[`<title>${$G(W)}</title>`,`<meta name="description" content="${$G(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="${$G(W)}" />`,`<meta property="og:description" content="${$G(K)}" />`,`<meta property="og:url" content="${$G(G)}" />`,`<meta property="og:image" content="${$G(H)}" />`,'<meta property="og:image:width" content="1200" />','<meta property="og:image:height" content="630" />',`<meta property="og:image:alt" content="${$G(F)}" />`,'<meta name="twitter:card" content="summary_large_image" />',`<meta name="twitter:title" content="${$G(W)}" />`,`<meta name="twitter:description" content="${$G(K)}" />`,`<meta name="twitter:image" content="${$G(H)}" />`,`<meta name="twitter:image:alt" content="${$G(F)}" />`,`<link rel="canonical" href="${$G(G)}" />`,`<link rel="icon" href="${$G(X)}" sizes="any" />`].join(`
|
|
2942
2942
|
`)}function W26($,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}
|
|
2943
2943
|
</head>`)}function Ar$($){let Z=new $1;return Z.get("/:domain/og.png",async(Q)=>{let Y=mc(Q.req.param("domain")),X=async()=>{let J=$?Bun.file(Pr$($,"report-og-fallback.png")):null;if(!J||!await J.exists())return Q.notFound();return Q.body(new Uint8Array(await J.arrayBuffer()),200,{"Content-Type":"image/png","Cache-Control":"public, max-age=0, s-maxage=3600"})};try{let J=await fetch(`${tK({})}/api/v2/public/diagnostics/${encodeURIComponent(Y)}/og.png`,{signal:AbortSignal.timeout(K26)}),G=J.headers.get("content-type")??"";if(!J.ok||!G.startsWith("image/")||!J.body)return X();return Q.body(J.body,200,{"Content-Type":G,"Cache-Control":"public, max-age=0, s-maxage=604800"})}catch{return X()}}),Z.get("/:domain",async(Q)=>{let Y=Q.req.param("domain"),X=$?Pr$($,"index.html"):null,J=X?Bun.file(X):null;if(!J||!await J.exists())return Q.notFound();let G=await J.text();try{let W=await J26(mc(Y)),K=G26(Y,W);return Q.html(W26(G,K),200,{"Cache-Control":"public, max-age=0, s-maxage=300"})}catch{return Q.html(G)}}),Z}var X26=2500,K26=1e4;var Tr$=D(()=>{g$();GG1();qj();E$()});function i00($,Z){return fetch(`${tK({})}${$}`,Z)}async function H26($,Z,Q){let Y=new URLSearchParams;if(Z)Y.set("pw",Z);if(Q)Y.set("lang",Q);let X=Y.toString()?`?${Y.toString()}`:"",J=await i00(`/api/v2/public/diagnostics/${encodeURIComponent($)}${X}`,{headers:{Accept:"application/json"}});if(J.status===404)return{status:"not_found",deck:null,scanned_at:null,drops:[]};if(!J.ok)throw Error(`report read HTTP ${J.status}`);let G=await J.json(),{deck:W,drops:K}=kq0(G);return{status:W.slides.length?"ready":"empty",deck:W,scanned_at:G.scanned_at,drops:K}}var F26,iN,Rr$=async($,Z)=>{if(!$.get("reportUser"))return $.json({error:"Authentication required"},401);await Z();return},qr$;var Ir$=D(()=>{g$();zJ();qj();GG1();F26=new Set(["complete","errored","terminated","unknown"]),iN=new $1;iN.use("*",async($,Z)=>{let Q=await Q8.api.getSession({headers:$.req.raw.headers});$.set("reportUser",Q?.user?.id?{email:Q.user.email}:void 0),await Z(),$.header("Cache-Control","private, no-store"),$.header("Vary","Cookie");return});iN.use("/link-token/*",Rr$);iN.use("/suggest",Rr$);iN.get("/site/:domain",async($)=>{let Z=$.req.param("domain").trim();if(!Z)return $.json({error:"domain is required"},400);let Q=$.get("reportUser"),Y=$.req.query("key")?.trim()||void 0,X=$.req.query("lang")?.trim()||void 0;try{let J=await H26(Z,Y,X);if($.header("Cache-Control","private, no-store"),Q||!J.deck)return $.json(J);return $.json({...J,deck:{...J.deck,slides:J.deck.slides.slice(0,1)},truncated:J.status==="ready"})}catch{return $.json({error:"report read failed"},502)}});iN.post("/run",async($)=>{let Z=$.get("reportUser"),Q;try{Q=await $.req.json()}catch{return $.json({error:"invalid JSON"},400)}let Y=typeof Q.domain==="string"?Q.domain.trim():"";if(!Y)return $.json({error:"domain is required"},400);let X=Z?.email,J=typeof Q.distinctId==="string"&&Q.distinctId.trim()&&Q.distinctId.length<=200?Q.distinctId.trim():void 0;try{let G=await i00("/api/v2/diagnostics/run",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${Rj({})}`},body:JSON.stringify({url:Y,...X?{email:X}:{},distinct_id:J})});if(!G.ok)return $.json({error:`run HTTP ${G.status}`},502);let W=await G.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)}});iN.get("/status",async($)=>{let Z=$.req.query("id");if(!Z)return $.json({error:"id is required"},400);try{let Q=await i00(`/api/v2/diagnostics/status?id=${encodeURIComponent(Z)}`,{headers:{Authorization:`Bearer ${Rj({})}`}});if(!Q.ok)return $.json({error:`status HTTP ${Q.status}`},502);let X=(await Q.json()).status??"unknown",J={done:F26.has(X),status:X};return $.json(J)}catch{return $.json({error:"status failed"},502)}});iN.get("/link-token/:id",async($)=>{let Z=$.req.param("id");try{let Q=await i00(`/api/v2/public/link-tokens/${encodeURIComponent(Z)}`,{headers:{Accept:"application/json"}});if(Q.status===404)return $.json(null);if(!Q.ok)return $.json({error:`link token HTTP ${Q.status}`},502);return $.json(await Q.json())}catch{return $.json({error:"link token resolve failed"},502)}});iN.get("/suggest",async($)=>{let Z=($.req.query("q")??"").trim().slice(0,64);if(Z.length<2)return $.json({suggestions:[]});try{let Q=await i00(`/api/v2/public/suggest?q=${encodeURIComponent(Z)}`,{headers:{Accept:"application/json"}});if(!Q.ok)return $.json({suggestions:[]});let Y=await Q.json();return $.json({suggestions:Array.isArray(Y.suggestions)?Y.suggestions:[]})}catch{return $.json({suggestions:[]})}});qr$=iN});import{createHmac as U26,timingSafeEqual as N26}from"crypto";function kr$($,Z,Q,Y=Date.now()){if(!Z||!Q)return!1;let X,J=[];for(let H of Z.split(",")){let F=H.indexOf("=");if(F<=0)continue;let U=H.slice(0,F).trim(),N=H.slice(F+1).trim();if(U==="t")X=N;else if(U==="v1")J.push(N)}if(!X||J.length===0)return!1;let G=Number(X);if(!Number.isFinite(G)||Math.abs(Y/1000-G)>B26)return!1;let W=U26("sha256",Q).update(`${X}.${$}`).digest("hex"),K=Buffer.from(W,"hex");return J.some((H)=>{let F=Buffer.from(H,"hex");return K.length===F.length&&N26(K,F)})}function Vr$($){let Z;try{Z=JSON.parse($)}catch{return null}let Q=T3(Z),Y=T3(T3(Q?.data)?.object);if(!Q||typeof Q.type!=="string"||!Y)return null;return{id:wF(Q.id),type:Q.type,created:typeof Q.created==="number"?Q.created:void 0,livemode:typeof Q.livemode==="boolean"?Q.livemode:void 0,data:{object:Y}}}function Sr$($){switch($){case"active":case"trialing":return"active";case"past_due":return"past_due";default:return"canceled"}}function wF($){return typeof $==="string"?$:void 0}function T3($){return typeof $==="object"&&$!==null?$:void 0}function Vq0($){return typeof $==="number"?new Date($*1000):null}function HG1($){return wF($)??wF(T3($)?.id)}function O26($){return HG1($.subscription)??wF(T3(T3($.parent)?.subscription_details)?.subscription)}function D26($){let Z=Vq0($.current_period_end);if(Z)return Z;let Q=T3($.items)?.data;if(!Array.isArray(Q))return null;let Y=0;for(let X of Q){let J=T3(X)?.current_period_end;if(typeof J==="number"&&J>Y)Y=J}return Y>0?new Date(Y*1000):null}function WG1($,Z){let Q=Vq0($.created);return!!Q&&!!Z.lastStripeEventAt&&Q<Z.lastStripeEventAt}function KG1($,Z){let Q=Vq0($.created);if(!Q)return;return Z.lastStripeEventAt&&Z.lastStripeEventAt>Q?void 0:Q}async function L26($,Z){let Q=Z.data.object;switch(Z.type){case"checkout.session.completed":case"checkout.session.async_payment_succeeded":{let Y=wF(T3(Q.metadata)?.orgId);if(!Y)return{handled:!1,reason:"no orgId"};if(wF(T3(Q.metadata)?.kind)==="topup"){if(Q.mode!=="payment")return{handled:!1,reason:"topup with wrong mode"};if(wF(Q.payment_status)!=="paid")return{handled:!1,reason:"payment not confirmed"};let G=wF(Q.id);if(!G)return console.error("stripe webhook: topup session without id",{eventId:Z.id,organizationId:Y}),{handled:!1,reason:"topup session without id"};let W=Number(T3(Q.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:Y,creditCents:T3(Q.metadata)?.creditCents}),{handled:!1,reason:"bad topup metadata"};return{handled:!0,organizationId:Y,topUp:{creditCents:W,referenceId:`stripe-topup:${G}`}}}if(Q.mode!=="subscription")return{handled:!1,reason:"not a subscription checkout"};if(wF(Q.payment_status)!=="paid")return{handled:!1,reason:"payment not confirmed"};let X=await $.getBilling(Y);if(!X)return{handled:!1,reason:"unknown org"};let J=HG1(Q.subscription);if(X.stripeSubscriptionId&&J&&X.stripeSubscriptionId!==J)return console.error("stripe webhook: refused checkout rebind",{organizationId:Y,eventId:Z.id}),{handled:!1,reason:"org already bound to another subscription",orphanSubscriptionId:J};if(WG1(Z,X))return{handled:!1,reason:"stale event"};return await $.updateStripeState(Y,{stripeCustomerId:HG1(Q.customer),stripeSubscriptionId:J,status:"active",lastStripeEventAt:KG1(Z,X)}),{handled:!0,organizationId:Y}}case"customer.subscription.updated":case"customer.subscription.deleted":{let Y=wF(Q.id);if(!Y)return{handled:!1,reason:"no sub id"};let X=await $.getBillingByStripeSubscriptionId(Y);if(!X)return{handled:!1,reason:"unknown subscription"};let J=Z.type==="customer.subscription.deleted";if(!J&&WG1(Z,X))return{handled:!1,reason:"stale event"};let G=J?"canceled":Sr$(Q.status);return await $.updateStripeState(X.organizationId,{status:G,currentPeriodEnd:D26(Q),...J&&{stripeSubscriptionId:null},lastStripeEventAt:KG1(Z,X)}),{handled:!0,organizationId:X.organizationId}}case"invoice.paid":{let Y=O26(Q);if(!Y)return{handled:!1,reason:"no sub id"};let X=await $.getBillingByStripeSubscriptionId(Y);if(!X)return{handled:!1,reason:"unknown subscription"};if(WG1(Z,X))return{handled:!1,reason:"stale event"};return await $.updateStripeState(X.organizationId,{status:"active",currentPeriodEnd:Vq0(Q.period_end),lastStripeEventAt:KG1(Z,X)}),{handled:!0,organizationId:X.organizationId}}default:return{handled:!1,reason:`unhandled event ${Z.type}`}}}function w26($,Z){if(!Z.handled||$.livemode===!1)return null;let Q=$.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:Sr$(Q.status),...typeof Q.cancel_at_period_end==="boolean"?{cancel_at_period_end:Q.cancel_at_period_end}:{}}};case"invoice.paid":if(Q.billing_reason==="subscription_create")return null;return{name:"subscription_renewed",organizationId:Z.organizationId,properties:{}};default:return null}}function Mr$($,Z){let Q=w26($,Z);if(!Q)return;NJ({event:Q.name,organizationId:Q.organizationId,...$.id?{uuid:va1(`stripe:${$.id}:${Q.name}`)}:{},...$.created?{timestamp:new Date($.created*1000)}:{},properties:Q.properties})}async function Cr$($){let Z=new mK(Z8().db),Q=await L26(Z,$);if(!(Q.handled&&Q.topUp))Mr$($,Q);if(Q.handled&&Q.topUp)await aT$({organizationId:Q.organizationId,amountCents:Q.topUp.creditCents,referenceId:Q.topUp.referenceId}),Mr$($,Q);if(!Q.handled&&Q.orphanSubscriptionId)try{await r4$(Q.orphanSubscriptionId),console.error("stripe webhook: canceled orphan subscription",{subscriptionId:Q.orphanSubscriptionId,eventId:$.id})}catch(Y){if(!(Y instanceof PJ&&(Y.status===400||Y.status===404)))throw Y}return Q}var B26=300;var _r$=D(()=>{bG();V4();eZ0();tj();Z61()});var E26=1048576,FG1;var vr$=D(()=>{g$();XK();E$();_r$();FG1=new $1;FG1.post("/webhook",v5({maxSize:E26,onError:($)=>$.json({error:"payload too large"},413)}),async($)=>{let Z=M0().stripeWebhookSecret;if(!Z)return $.json({error:"stripe billing not configured"},503);let Q=await $.req.text();if(!kr$(Q,$.req.header("stripe-signature"),Z))return $.json({error:"invalid signature"},400);let X=Vr$(Q);if(!X)return $.json({error:"invalid payload"},400);let J=await Cr$(X);return console.log("stripe webhook",{eventId:X.id,type:X.type,livemode:X.livemode,...J}),$.json({received:!0})})});import{timingSafeEqual as j26}from"crypto";function A26($,Z,Q){if(!Z?.startsWith("sha256="))return!1;let Y=new Bun.CryptoHasher("sha256",Q).update($).digest("hex"),X=Z.slice(7);if(X.length!==Y.length)return!1;return j26(Buffer.from(X),Buffer.from(Y))}function T26($,Z){let Q=Z,Y=Q?.repository?.name,X=Q?.repository?.owner?.login;if(typeof Y!=="string"||typeof X!=="string")return[];let J=[];if($==="check_suite"){if(Q.action!=="completed")return[];let G=Q.check_suite?.pull_requests;for(let W of Array.isArray(G)?G:[]){let K=W?.number;if(typeof K==="number")J.push(K)}}else if($==="issue_comment"&&Q.issue?.pull_request){let G=Q.issue.number;if(typeof G==="number")J.push(G)}return[...new Set(J)].map((G)=>({repoOwner:X,repoName:Y,number:G}))}function fr$($){let Z=new $1;return Z.post("/webhook",v5({maxSize:z26,onError:(Q)=>Q.json({error:"payload too large"},413)}),async(Q)=>{let Y=process.env.GITHUB_WEBHOOK_SECRET;if(!Y)return Q.json({error:"github webhook not configured"},503);let X=await Q.req.text();if(!A26(X,Q.req.header("x-hub-signature-256"),Y))return Q.json({error:"invalid signature"},400);let J=Q.req.header("x-github-event");if(J!=="push"&&!P26.has(J??""))return Q.json({ok:!0,ignored:"event"});let G;try{G=JSON.parse(X)}catch{return Q.json({error:"invalid payload"},400)}if(J==="push"){let H=G.ref,F=G.repository?.full_name;if(!H||!F)return Q.json({ok:!0,ignored:"shape"});let N=(await Mr0())?.markTenantPoolsDirty(F,H)??[];return Q.json({ok:!0,pools:N})}let W=T26(J??"",G);if(W.length===0)return Q.json({ok:!0,ignored:"no-pr"});let K=await R26($,W);return Q.json({ok:!0,refreshed:K})}),Z}async function R26($,Z){let Q=0;for(let Y of Z){let X=$.taskBoard(),J;try{J=await X.findPrLinks(Y)}catch(G){console.error("[github-webhook] pr link lookup failed:",G);continue}for(let G of J)try{let W=await X.getById(G.taskBoardItemId,G.organizationId),K=W?await $.contextFactory()(G.organizationId,W.assignedBy??W.createdBy):null;if(!K)continue;if(await VD$(K,G.organizationId,G.taskBoardItemId)!==null)Q++}catch(W){console.error(`[github-webhook] pr card refresh failed for ${G.taskBoardItemId}:`,W)}}return Q}var z26=5242880,P26;var br$=D(()=>{g$();XK();RW();IZ();P26=new Set(["check_suite","issue_comment"])});function xr$($){let Z=new _N($.db,new XY($.encryptionKey)),Q=new $1;return Q.get("/attachments/:token",async(Y)=>{let X=oB$(Y.req.param("token"));if(!X)return Y.json({error:"Invalid or expired link"},404);let J=await Z.getByOrg(X.organizationId);if(!J)return Y.json({error:"Jira is not connected"},404);let W=await new gJ(J.siteUrl,J.email,J.apiToken).downloadAttachment(X.attachmentId);if(!W.ok||!W.body)return Y.json({error:"Jira refused the download"},502);let K=new Headers;for(let H of["content-type","content-length","content-disposition"]){let F=W.headers.get(H);if(F)K.set(H,F)}return K.set("cache-control","no-store"),new Response(W.body,{status:200,headers:K})}),Q}var yr$=D(()=>{g$();xB();ua0();Wv()});function gr$($){let Z=new _N($.db,new XY($.encryptionKey));async function Q(X,J){let G=Cx$(J);if(!G)return;let W=await Z.getByWebhookSecret(X);if(!W?.enabled)return;let K=await _H($.db,W.organizationId);if(!K)return;if(await BT0(K,W,G)==="started")console.log(`[jira-webhook] started a run for ${G.issueKey} entering "${G.toStatus}"`)}let Y=new $1;return Y.post("/webhook/:secret",v5({maxSize:q26}),async(X)=>{let J=X.req.param("secret");if(!await Z.getByWebhookSecret(J))return X.json({error:"Unknown webhook"},404);let W;try{W=await X.req.json()}catch{return X.json({error:"Body must be JSON"},400)}return Q(J,W).catch((K)=>{console.error("[jira-webhook] trigger failed",K)}),X.body(null,202)}),Y}var q26=1048576;var hr$=D(()=>{g$();XK();xB();OT0();Uu()});import{DBOS as Sq0,SchedulerMode as I26}from"@dbos-inc/dbos-sdk";function lr$($){NG1=$}function cr$(){if(!NG1)throw Error("[jira-trigger] runtime not initialized \u2014 setJiraTriggerSweepRuntime() must run before the workflow fires");return NG1}function dr$(){let $=cr$();return new _N($.db,new XY($.encryptionKey))}async function V26($,Z){try{let Q=await dr$().getById($);if(!Q?.enabled||!Q.boardId)return{integrationId:$,started:0};let Y=await _H(cr$().db,Q.organizationId);if(!Y)return{integrationId:$,started:0};if((await Y.storage.jiraIntegrations.listAutomations(Q.organizationId)).length===0)return{integrationId:$,started:0};let J=new gJ(Q.siteUrl,Q.email,Q.apiToken),W=`(${await J.getBoardScopeJql(Q.boardId)}) AND status CHANGED AFTER "-${ur$}m"`,K=0,H;for(let F=0;F<k26;F++){let U=await J.searchIssues({jql:W,nextPageToken:H,expandChangelog:!0});for(let N of U.issues){let B=_x$(N,N.changelog?.histories??[],Z);for(let O of B)if(await BT0(Y,Q,O)==="started")K++}if(H=U.nextPageToken??void 0,!H)break}return{integrationId:$,started:K}}catch(Q){return{integrationId:$,started:0,error:Q instanceof Error?Q.message:String(Q)}}}async function S26($,Z){let Q=new Date($.getTime()-ur$*60000),Y=await Sq0.runStep(()=>dr$().listEnabledIds(),{name:"loadJiraIntegrations"});if(Y.length===0)return;let X=await Promise.all(Y.map((J)=>Sq0.runStep(()=>V26(J,Q),{name:`sweepJira:${J}`})));for(let J of X)if(J.error)console.warn(`[jira-trigger] integration ${J.integrationId} failed: ${J.error}`);else if(J.started>0)console.log(`[jira-trigger] integration ${J.integrationId} started ${J.started} run(s) the webhook missed`)}function mr$(){if(UG1)return;UG1=Sq0.registerWorkflow(S26,{name:"jiraTriggerSweepWorkflow"}),Sq0.registerScheduled(UG1,{name:"jiraTriggerSweepWorkflow",crontab:M26,mode:I26.ExactlyOncePerIntervalWhenActive})}var M26="7-59/10 * * * *",ur$=15,k26=5,NG1=null,UG1=null;var ir$=D(()=>{xB();Uu();Wv();OT0()});function pr$($,Z){if(Z.startsWith("text/html")||Z.startsWith("image/svg"))$.set("Content-Security-Policy","sandbox allow-scripts allow-modals allow-same-origin")}var nr$,C26,_26,tr$;var or$=D(()=>{g$();JW();Du();vj();nr$=new $1,C26=["range","if-none-match","if-modified-since"],_26=["content-type","content-length","content-range","accept-ranges","etag","last-modified"];nr$.get("/:org/files/*",async($)=>{let Z=$.get("studioContext"),Q=Z.organization?.id;if(!Z.auth?.user?.id){if(Nc($))return $.redirect(`/login?next=${encodeURIComponent($.req.path)}`,302);throw new Y$(401,{message:"Authentication required"})}if(!Q)throw new Y$(401,{message:"Organization context required"});let Y=$.req.path.replace(/^.*\/files\//,"");if(!Y)throw new Y$(400,{message:"Missing file key"});let X=await br(Y,Z);if(!X)throw new Y$(503,{message:"Object storage not configured"});if(X.startsWith("data:")&&$X()){let K=X.match(/^data:([^;]+);base64,(.+)$/s);if(!K)throw new Y$(500,{message:"Invalid data URL from storage"});let[,H,F]=K,U=Buffer.from(F,"base64"),N=new Headers({"Content-Type":H,"Cache-Control":"private, max-age=86400"});return pr$(N,H),new Response(U,{status:200,headers:N})}let J=new Headers;for(let K of C26){let H=$.req.header(K);if(H)J.set(K,H)}let G=await fetch(X,{headers:J});if(G.status===403||G.status===404)throw new Y$(404,{message:"File not found"});if(!G.ok&&G.status!==304&&G.status!==416)throw console.error(`[files] upstream storage error ${G.status} for key:`,Y),new Y$(502,{message:"Upstream storage error"});let W=new Headers;for(let K of _26){let H=G.headers.get(K);if(H)W.set(K,H)}return W.set("Cache-Control","private, max-age=86400"),pr$(W,W.get("content-type")??""),new Response(G.body,{status:G.status,headers:W})});tr$=nr$});var p00=_((Gb)=>{var v26=Gb&&Gb.__createBinding||(Object.create?function($,Z,Q,Y){if(Y===void 0)Y=Q;var X=Object.getOwnPropertyDescriptor(Z,Q);if(!X||("get"in X?!Z.__esModule:X.writable||X.configurable))X={enumerable:!0,get:function(){return Z[Q]}};Object.defineProperty($,Y,X)}:function($,Z,Q,Y){if(Y===void 0)Y=Q;$[Y]=Z[Q]}),f26=Gb&&Gb.__exportStar||function($,Z){for(var Q in $)if(Q!=="default"&&!Object.prototype.hasOwnProperty.call(Z,Q))v26(Z,$,Q)};Object.defineProperty(Gb,"__esModule",{value:!0});f26(oX(),Gb)});var ar$=_((rr$)=>{Object.defineProperty(rr$,"__esModule",{value:!0});rr$.version=void 0;rr$.version="3.4.0"});var Zs$=_((EF)=>{var b26=EF&&EF.__importDefault||function($){return $&&$.__esModule?$:{default:$}};Object.defineProperty(EF,"__esModule",{value:!0});EF.NodeTransport=EF.VERSION=void 0;EF.nodeResolveHost=l26;var W5=p00(),x26=z0("net"),BG1=z0("tls"),y26=z0("path"),er$=z0("fs"),g26=b26(z0("dns")),h26=ar$();EF.VERSION=h26.version;var u26="nats.js";class $s${socket;version;lang;yields=[];signal=(0,W5.deferred)();closedNotification=(0,W5.deferred)();options;connected=!1;tlsName="";done=!1;closeError;constructor(){this.lang=u26,this.version=EF.VERSION}async connect($,Z){this.tlsName=$.tlsName,this.options=Z;let{tls:Q}=this.options,{handshakeFirst:Y}=Q||{};try{if(Y===!0)this.socket=await this.tlsFirst($);else this.socket=await this.dial($);if(this.done)this.socket?.destroy();let X=await this.peekInfo();(0,W5.checkOptions)(X,Z);let{tls_required:J,tls_available:G}=X,W=G===!0&&Z.tls!==null;if(!Y&&(J||W))this.socket=await this.startTLS();if(this.done)this.socket?.destroy();if(J&&this.socket.encrypted!==!0)throw W5.errors.InvalidArgumentError.format("tls","is not available on this server");return this.connected=!0,this.setupHandlers(),this.signal.resolve(),Promise.resolve()}catch(X){let J=X;if(!J)J=new W5.errors.ConnectionError("error connecting - node provided an undefined error");let{code:G}=J,W=G==="ECONNREFUSED"?new W5.errors.ConnectionError("connection refused",{cause:J}):J;throw this.socket?.destroy(),W}}dial($){let Z=(0,W5.deferred)(),Q,Y=(0,x26.createConnection)($.port,$.hostname,()=>{Z.resolve(Y),Y.removeAllListeners()});return Y.on("error",(X)=>{Q=X}),Y.on("close",()=>{Y.removeAllListeners(),Z.reject(Q)}),Y.setNoDelay(!0),Z}get isClosed(){return this.done}close($){return this._closed($,!1)}peekInfo(){let $=(0,W5.deferred)(),Z;return this.socket.on("data",(Q)=>{this.yields.push(Q);let Y=W5.DataBuffer.concat(...this.yields),X=(0,W5.extractProtocolMessage)(Y);if(X!=="")try{let J=W5.INFO.exec(X);if(!J)throw Error("unexpected response from server");let G=JSON.parse(J[1]);$.resolve(G)}catch(J){$.reject(J)}finally{this.socket.removeAllListeners()}}),this.socket.on("error",(Q)=>{Z=Q}),this.socket.on("close",()=>{this.socket.removeAllListeners(),$.reject(Z)}),$}loadFile($){if(!$)return Promise.resolve();let Z=(0,W5.deferred)();try{if($=(0,y26.resolve)($),!(0,er$.existsSync)($))Z.reject(Error(`${$} doesn't exist`));(0,er$.readFile)($,(Q,Y)=>{if(Q)return Z.reject(Q);Z.resolve(Y)})}catch(Q){Z.reject(Q)}return Z}async loadClientCerts(){let $={},{certFile:Z,cert:Q,caFile:Y,ca:X,keyFile:J,key:G}=this.options.tls;try{if(Z){let W=await this.loadFile(Z);if(W)$.cert=W}else if(Q)$.cert=Q;if(J){let W=await this.loadFile(J);if(W)$.key=W}else if(G)$.key=G;if(Y){let W=await this.loadFile(Y);if(W)$.ca=[W]}else if(X)$.ca=X;return Promise.resolve($)}catch(W){return Promise.reject(W)}}async tlsFirst($){let Z,Q={servername:this.tlsName,rejectUnauthorized:!0};if(this.socket)Q.socket=this.socket;if(typeof this.options.tls==="object")try{let X=await this.loadClientCerts()||{};Q=(0,W5.extend)(Q,this.options.tls,X)}catch(X){return Promise.reject(new W5.errors.ConnectionError(X.message,{cause:X}))}let Y=(0,W5.deferred)();try{let X=(0,BG1.connect)($.port,$.hostname,Q,()=>{X.removeAllListeners(),Y.resolve(X)});X.on("error",(J)=>{Z=J}),X.on("secureConnect",()=>{if(Q.rejectUnauthorized===!1)return;if(!X.authorized)throw X.authorizationError}),X.on("close",()=>{Y.reject(Z),X.removeAllListeners()}),X.setNoDelay(!0)}catch(X){Y.reject(new W5.errors.ConnectionError(X.message,{cause:X}))}return Y}async startTLS(){let $,Z={socket:this.socket,servername:this.tlsName,rejectUnauthorized:!0};if(typeof this.options.tls==="object")try{let Y=await this.loadClientCerts()||{};Z=(0,W5.extend)(Z,this.options.tls,Y)}catch(Y){return Promise.reject(new W5.errors.ConnectionError(Y.message,{cause:Y}))}let Q=(0,W5.deferred)();try{let Y=(0,BG1.connect)(Z,()=>{Y.removeAllListeners(),Q.resolve(Y)});Y.on("error",(X)=>{$=X}),Y.on("secureConnect",()=>{if(Z.rejectUnauthorized===!1)return;if(!Y.authorized)throw Y.authorizationError}),Y.on("close",()=>{Q.reject($),Y.removeAllListeners()})}catch(Y){Q.reject(new W5.errors.ConnectionError(Y.message,{cause:Y}))}return Q}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,W5.render)($[Z])}`);yield $[Z]}if(this.done)break;else if(this.yields.length===0)$.length=0,this.yields=$,this.signal=(0,W5.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 BG1.TLSSocket}_send($){if(this.isClosed||this.socket===void 0)return Promise.resolve();if(this.options.debug)console.info(`< ${(0,W5.render)($)}`);let Z=(0,W5.deferred)();try{this.socket.write($,(Q)=>{if(Q){if(this.options.debug)console.error(`!!! ${(0,W5.render)($)}: ${Q}`);return Z.reject(Q)}return Z.resolve()})}catch(Q){if(this.options.debug)console.error(`!!! ${(0,W5.render)($)}: ${Q}`);Z.reject(Q)}return Z}send($){this._send($).catch((Q)=>{})}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(Q){if(this.options.debug)console.log("transport close terminated with an error",Q)}try{if(this.socket)this.socket.removeAllListeners(),this.socket?.destroy(),this.socket=void 0}catch(Q){console.log(Q)}this.done=!0,this.closedNotification.resolve(this.closeError)}closed(){return this.closedNotification}}EF.NodeTransport=$s$;function l26($){let Z=(0,W5.deferred)();return g26.default.lookup($,{all:!0},(Q,Y)=>{if(Q){Z.reject(Q);return}let X=[];for(let J of Y)X.push(J.address);if(X.length===0)X.push($);Z.resolve(X)}),Z}});var Gs$=_((Js$)=>{Object.defineProperty(Js$,"__esModule",{value:!0});Js$.connect=c26;var Qs$=Zs$(),Ys$=p00(),Xs$=p00();function c26($={}){if((0,Xs$.hasWsProtocol)($))return Promise.reject(Xs$.errors.InvalidArgumentError.format("servers","node client doesn't support websockets, use the 'wsconnect' function instead"));return(0,Ys$.setTransportFactory)({factory:()=>{return new Qs$.NodeTransport},dnsResolveFn:Qs$.nodeResolveHost}),Ys$.NatsConnectionImpl.connect($)}});var Ws$=_((pN)=>{var m26=pN&&pN.__createBinding||(Object.create?function($,Z,Q,Y){if(Y===void 0)Y=Q;var X=Object.getOwnPropertyDescriptor(Z,Q);if(!X||("get"in X?!Z.__esModule:X.writable||X.configurable))X={enumerable:!0,get:function(){return Z[Q]}};Object.defineProperty($,Y,X)}:function($,Z,Q,Y){if(Y===void 0)Y=Q;$[Y]=Z[Q]}),i26=pN&&pN.__exportStar||function($,Z){for(var Q in $)if(Q!=="default"&&!Object.prototype.hasOwnProperty.call(Z,Q))m26(Z,$,Q)};Object.defineProperty(pN,"__esModule",{value:!0});pN.connect=void 0;var p26=Gs$();Object.defineProperty(pN,"connect",{enumerable:!0,get:function(){return p26.connect}});i26(p00(),pN)});function Us$($){let Z=$?.connectFn??r26,Q=null,Y=null,X=!1,J=!1,G=!1,W=[];function K(){return Q!==null&&!Q.isClosed()&&!Q.isDraining()&&!G}function H(){console.log(`[NatsProvider] fireReady: ${W.length} callbacks`);for(let N of W)try{N()}catch{}}function F(N){(async()=>{for await(let B of N.status())if(B.type==="disconnect")console.log("[NatsProvider] Disconnected"),G=!0;else if(B.type==="reconnect")console.log("[NatsProvider] Reconnected, re-firing ready callbacks"),G=!1,Y=null,H()})().catch(()=>{})}async function U(N,B){let O=0;while(!J)try{Q=await Z({servers:N,timeout:o26,reconnect:!0,maxReconnectAttempts:-1,...B?{authenticator:B}:{}}),console.log(`[NatsProvider] Connected to ${Q.getServer()} after ${O} attempt(s)`),Y=null,G=!1,F(Q),H();return}catch{O++;let L=U7(t26,n26,O-1,2,0.5);await z$(L)}}return{init(N,B){if(X)return;X=!0,J=!1;let O=B?.creds?Ks$.credsAuthenticator(new TextEncoder().encode(B.creds)):void 0;U(N,O).catch(()=>{})},isConnected(){return K()},getConnection(){return K()?Q:null},getJetStream(){if(!K())return null;if(!Y)Y=Fs$.jetstream(Q);return Y},onReady(N){if(W.push(N),K())try{N()}catch{}},async drain(){if(J=!0,X=!1,Y=null,G=!1,Q){let N=Q;Q=null,await N.drain().catch(()=>{})}}}}function r26($){return Hs$.connect($)}var Ks$,Hs$,Fs$,n26=100,t26=3000,o26=3000;var Ns$=D(()=>{G8();Ks$=V(Dd(),1),Hs$=V(Ws$(),1),Fs$=V(kF(),1)});function OG1($,Z){return`${$}.${Z}`}class DG1{cache;constructor($){this.cache=Zc({ttlMs:$?.ttlMs??s26,maxSize:$?.maxSize??a26})}async get($,Z){return this.cache.get(OG1($,Z))??null}async set($,Z,Q){this.cache.set(OG1($,Z),Q)}async invalidate($,Z){this.cache.delete(OG1($,Z))}teardown(){this.cache.clear()}}var s26=600000,a26=5000;var Bs$=()=>{};function Cq0($,Z){return`${$}:${Z}`}function LG1($){let Z=Zc({ttlMs:$?.ttlMs??e26,maxSize:$?.maxSize??$T6}),Q=$?.getConnection,Y=crypto.randomUUID(),X=new TextEncoder,J=new TextDecoder,G=null;function W(K,H){let F=Q?.();if(!F)return;try{F.publish(Os$,X.encode(JSON.stringify({organizationId:K,keyId:H,originId:Y})))}catch(U){console.warn("[ProviderKeyCache] Publish failed (non-critical):",U)}}return{get(K,H){return Z.get(Cq0(K,H))},set(K,H,F){Z.set(Cq0(K,H),F)},invalidate(K,H){Z.delete(Cq0(K,H)),W(K,H)},start(){if(G)return;let K=Q?.();if(!K)return;G=K.subscribe(Os$),(async()=>{for await(let H of G)try{let F=JSON.parse(J.decode(H.data));if(F.originId===Y)continue;Z.delete(Cq0(F.organizationId,F.keyId))}catch{}})().catch(console.error)},teardown(){G?.unsubscribe(),G=null,Z.clear()}}}var Os$="studio.ai-provider-keys.invalidate",e26=30000,$T6=5000;var Ds$=()=>{};class wG1{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 Q=new TextDecoder,Y=Z.subscribe("studio.decopilot.cancel");this.subscription=Y,(async()=>{for await(let X of Y)try{let J=JSON.parse(Q.decode(X.data));if(J.originId===this.originId)continue;this.onCancel?.(J.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 Q=this.encoder.encode(JSON.stringify({taskId:$,originId:this.originId}));Z.publish("studio.decopilot.cancel",Q)}catch(Z){console.warn("[NatsCancelBroadcast] Publish failed (non-critical):",Z)}}async stop(){this.subscription?.unsubscribe(),this.subscription=null,this.onCancel=null}}var Ls$=($)=>{let Z;return()=>Z??=$()},EG1,jG1;var ws$=D(()=>{X6();EG1=Ls$(()=>Z$.createHistogram("decopilot.stream.encode_ms",{description:"Per-chunk JSON.stringify+encode time for decopilot stream",unit:"ms"})),jG1=Ls$(()=>Z$.createCounter("decopilot.stream.published_chunks",{description:"Logical decopilot stream chunks published to JetStream",unit:"{chunks}"}))});function WT6($=zs$){return{name:hH,subjects:[`${F11}.>`],storage:WK.StorageType.File,max_age:YT6,max_bytes:JT6,max_msgs_per_subject:GT6,discard:WK.DiscardPolicy.Old,retention:WK.RetentionPolicy.Limits,duplicate_window:XT6,num_replicas:$}}class Ps${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 Es$($){let Z=js$.headers();for(let[Q,Y]of Object.entries($))Z.set(Q,Y);return Z}function UT6($,Z){let Q=0;return{publish(Y,X,J,G){Y.publish(X,J,G?{headers:G}:void 0).catch((W)=>{if(Q++,QT6().add(1,{"org.id":Z??"unknown"}),Q===1||Q%100===0)console.warn(`[Decopilot] JetStream publish failed for thread ${$} (${Q} total):`,W)})},get errorCount(){return Q}}}function NT6($,Z){return $.info?.cluster?Z:1}function BT6($){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 zG1{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(Y,X)=>{let J=WT6(X);try{await Y.streams.info(hH),await Y.streams.update(hH,J)}catch(G){if(G instanceof Error&&G.message.includes("stream not found"))await Y.streams.add(J),await Y.streams.update(hH,J);else if(G instanceof Error&&/can ?not change.*storage|storage type/i.test(G.message))await Y.streams.delete(hH),await Y.streams.add(J);else throw G}},Q=await b8(async()=>{let Y=this.options.getJetStreamManager?await this.options.getJetStreamManager():await WK.jetstreamManager($),X=NT6($,zs$);try{await Z(Y,X)}catch(J){if(X<=1||!BT6(J))throw J;console.warn(`[Decopilot] StreamBuffer: NATS rejected num_replicas=${X} (${J.message}); falling back to an unreplicated stream`),await Z(Y,1)}return Y},{maxAttempts:5,minTimeout:250,maxTimeout:4000,jitter:0.5,isRetriable:Iu});this.js=this.options.getJetStream(),this.jsm=Q,console.log(`[Decopilot] StreamBuffer.init ${this.js?"ready":"degraded (js=null)"}`)}pump($,Z,Q,Y){let X=this.js;if(!X)return console.warn(`[Decopilot] pump: JetStream client unavailable for thread ${Z}; chunks NOT published to NATS`),Promise.resolve();let J=UT6(Z,Y),G=!1,W=()=>{if(G)return;G=!0;let H=uj$(Z);X.publish(H.subject,H.data).catch(()=>{})};Q.addEventListener("abort",W,{once:!0});let K=(H)=>{let F=performance.now(),U=N11(H,{runId:Z}),N=performance.now()-F;EG1().record(N),jG1().add(1,{"org.id":Y??"unknown"}),FT6?.record(N,U.reduce((B,O)=>B+O.data.length,0));for(let B of U)J.publish(X,B.subject,B.data,B.headers?Es$(B.headers):void 0)};return(async()=>{let H=$.getReader(),F=0,U=0,N;try{while(!0){let{done:B,value:O}=await H.read();if(B)break;if(K(O),U++,++F>=64)F=0,await new Promise((L)=>setImmediate(L))}}catch(B){N=B,console.warn(`[Decopilot] stream pump error for thread ${Z}:`,B?.message??B)}finally{if(H.releaseLock(),W(),HT6)console.warn(JSON.stringify({msg:"decopilot-stream-diag",event:"pump-done",taskId:Z,publishedChunks:U,publishErrors:J.errorCount}))}if(N!==void 0)throw N})()}async publishSerialized($,Z){try{return await b8(()=>$.publish(Z.subject,Z.data,{...Z.headers?{headers:Es$(Z.headers)}:{},...Z.msgId?{msgID:Z.msgId}:{}}),{maxAttempts:6,minTimeout:250,maxTimeout:5000,jitter:0.5,isRetriable:Iu}),!0}catch(Q){return console.error(`[Decopilot] publish failed after retries subject=${Z.subject}`,Q),!1}}async publishRawChunk($,Z,Q){let Y=this.js;if(!Y)return!1;let X=performance.now(),J=N11(Z,{runId:$,dedup:Q});EG1().record(performance.now()-X),jG1().add(1);for(let G of J)if(!await this.publishSerialized(Y,G))return!1;return!0}async publishDone($,Z,Q){let Y=this.js;if(!Y)return!1;let X=hj$({runId:$,fenceToken:Z,finalSeq:Q});return await this.publishSerialized(Y,X)}async createTailStream($,Z,Q){let Y=this.js;if(!Y)return console.warn(`[Decopilot] createTailStream: JetStream client unavailable for thread ${$}; no live tail`),null;let X=Q?.deliverPolicy==="new"?WK.DeliverPolicy.New:WK.DeliverPolicy.All,J=Q?.closeOnDone??!1,G=DL($),W;try{W=await b8(async()=>{return(await Y.consumers.get(hH,{filter_subjects:G,deliver_policy:X})).consume()},{maxAttempts:6,minTimeout:250,maxTimeout:5000,jitter:0.5,isRetriable:Iu})}catch(L){return console.warn("[Decopilot] JetStream tail unavailable (non-critical):",L?.message??L),null}let F=sj0({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(nj0()).pipeThrough(tj0()).getReader(),U=!1,N=()=>{if(U)return;U=!0;try{F.releaseLock()}catch{}},B=!1,O=()=>{if(B)return;B=!0,W.stop(),F.cancel().catch(()=>{}),N()};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(J){O(),L.close();return}continue}L.enqueue(j.chunk);return}},cancel(){O()}})}purge($){if(!this.jsm)return;this.jsm.streams.purge(hH,{filter:DL($)}).catch(()=>{})}teardown(){this.js=null,this.jsm=null}}var WK,js$,ZT6=($)=>{let Z;return()=>Z??=$()},QT6,YT6=86400000000000,XT6=120000000000,JT6=4294967296,zs$,GT6=500000,KT6,HT6,FT6;var As$=D(()=>{G8();B11();aj0();oj0();X6();ws$();WK=V(kF(),1),js$=V(Dd(),1),QT6=ZT6(()=>Z$.createCounter("decopilot.stream.publish_errors",{description:"Number of JetStream publish failures for decopilot stream chunks",unit:"{errors}"})),zs$=Math.max(1,Number(process.env.DECOPILOT_STREAM_REPLICAS??3)||3);KT6=process.env.STREAM_ENCODE_TRACE==="1",HT6=process.env.DECOPILOT_STREAM_TRACE==="1";FT6=KT6?new Ps$:null});function _q0($,Z,Q,Y){if(!Y)return!1;return $.emit(Z,MK(Q,Y.status,{title:Y.title??void 0,virtualMcpId:Y.virtual_mcp_id??void 0,createdBy:Y.created_by??void 0,triggerId:Y.trigger_id??null,branch:Y.branch??null,harnessId:Y.harness_id??void 0,createdAt:Y.created_at,updatedAt:Y.updated_at})),!0}var Ts$=D(()=>{V8()});class PG1{storage;options;timer=null;constructor($,Z={}){this.storage=$;this.options=Z}start(){if(this.timer)return;let $=this.options.intervalMs??300000;this.timer=setInterval(()=>{this.runOnce()},$)}async runOnce(){let $=this.options.staleAfterMs??3600000;try{let Z=await this.storage.sweepAbandoned($);if(Z>0)console.log(`[async-research-sweeper] marked ${Z} stale jobs as abandoned`);return Z}catch(Z){return console.error("[async-research-sweeper] sweep failed",Z),0}}dispose(){if(this.timer)clearInterval(this.timer),this.timer=null}}function OT6($,Z){let Q=$.startsWith("thread:")?qW($):$;return[...new Set([Z,Q].filter((Y)=>!!Y))]}async function Rs$($,Z){let Q=Z.organizationId;try{let Y=await $.storage.taskBoard.linkedThreadIds(Z.id,Q);for(let X of Y){let J=await jH($,X);if(!J?.owner||!J?.name)continue;let G=await $.storage.threads.get(X),W=await _h($,{threadId:X,runBranch:G?.branch}),K=OT6(W,await Fw0($,X)),H=await rt($,Q,Zt0(J)).catch(()=>null);if(!H){console.warn(`[task-board] no credential for ${J.owner}/${J.name} \u2014 `+`cannot look up ${Z.id}'s change request by branch`);continue}for(let F of K){let U=await H.readForBranch(F).catch(()=>null);if(!U)continue;return await $.storage.taskBoard.linkPr({taskBoardItemId:Z.id,organizationId:Q,url:U.url,prNumber:U.number,repo:H.repo}),await $.storage.taskBoard.openReviewCycleIfInProgress(Z.id,Q),await eG(Q).catch(()=>{}),console.log(`[task-board] ${Z.id}: linked ${U.url} found on branch ${F}`),!0}}}catch(Y){console.error("[task-board] PR lookup by branch failed",Y)}return!1}var qs$=D(()=>{sZ();nG();IZ()});async function Is$($,Z,Q){let Y=Z.organizationId;if(!RX(Z))return!1;if(!Bv(Q))return!1;if(await $.storage.taskBoard.hasHumanRejectedDone(Z.id,Y))return!1;let X=await $.storage.organizationSettings.get(Y),J=GH(X?.flags),G=await $.storage.taskBoard.update(Z.id,Y,{status:J},Z.updatedBy);return await S6($,{taskBoardItemId:Z.id,action:"status_changed",actorId:null,data:{from:Z.status,to:J,reason:"pr_merged"}}),H8(Y,G),console.log(`[task-board-review-sweeper] ${Z.id}: linked PR already merged \u2014 moved to ${J}`),!0}var Ms$=D(()=>{j4();VQ();Hu();bW();X9()});function PT6($){return $ instanceof wY}function AT6($,Z){return Z-$>=jT6}class AG1{taskBoard;contextFactory;billing;options;timer=null;running=!1;cursor=null;constructor($,Z,Q,Y={}){this.taskBoard=$;this.contextFactory=Z;this.billing=Q;this.options=Y}start(){if(this.timer)return;let $=this.options.intervalMs??DT6;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??wT6,Q=this.options.itemIntervalMs??LT6,Y=new Date(Date.now()-Q),X=await this.taskBoard.listItemsPendingReview(Z,this.cursor,Y),J=X.at(-1);this.cursor=X.length===Z&&J?{updatedAt:J.updatedAt,id:J.id}:null;for(let{id:G,organizationId:W}of X)try{if(await this.reconcileItem(G,W,Y))$++}catch(K){console.error(`[task-board-review-sweeper] ${G} 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()-fa0),pe0);for(let Q of Z)console.warn(`[task-board-review-sweeper] failed never-started thread ${Q.threadId} on ${Q.itemId}`)}catch(Z){console.error("[task-board-review-sweeper] reaping failed",Z)}}async reactToUnhandledFailures($){let Z=await this.taskBoard.listItemsStuckAfterFailure($,new Date(Date.now()-zT6));for(let{id:Q,organizationId:Y,threadId:X}of Z)try{console.warn(`[task-board-review-sweeper] reacting to an unhandled failure on ${Q}`),await de0(this.taskBoard,X,Y),await me0(this.taskBoard,this.billing,X,Y)}catch(J){console.error(`[task-board-review-sweeper] unhandled-failure reaction for ${Q} failed`,J)}}async dispatchDueRetries($){let Z=0,Q=await this.taskBoard.listItemsDueForRetry($,new Date);for(let{id:Y,organizationId:X,attempts:J}of Q)try{if(!await this.taskBoard.claimDueRetry(Y,X,new Date))continue;let G=await this.taskBoard.getById(Y,X);if(!G||G.status!==A$.progress||G.assigneeId!==n$)continue;let W=await this.contextFactory(X,G.assignedBy??G.createdBy);if(!W)continue;await xW(W,G,{runClass:"retry"}),Z++,console.warn(`[task-board-review-sweeper] re-dispatched ${Y} after a failure (attempt ${J})`)}catch(G){if(console.error(`[task-board-review-sweeper] retry dispatch for ${Y} failed`,G),PT6(G)){await this.returnToTodo(Y,X,G instanceof Error?G.message:String(G));continue}await this.taskBoard.scheduleRunRetry(Y,X,J,new Date(Date.now()+ET6)).catch((W)=>console.error(`[task-board-review-sweeper] re-arming ${Y} failed`,W))}return Z}async returnToTodo($,Z,Q){try{let Y=await this.taskBoard.getById($,Z);if(!Y||Y.status!==A$.progress)return;let X=await this.taskBoard.returnToTodoAfterFailure($,Z,Y.updatedBy);if(!X)return;await this.taskBoard.recordActivity({taskBoardItemId:$,action:"status_changed",actorId:null,data:{from:"in_progress",to:"todo",reason:Q}}).catch(()=>{}),H8(Z,X)}catch(Y){console.error(`[task-board-review-sweeper] returning ${$} to todo failed`,Y)}}async handOffReviewWithoutPr($,Z){let Q=await this.taskBoard.listActivity(Z.id,Z.organizationId);if(!AT6(kU(Q,Z.reviewCycleStartedAt),Date.now()))return;await SH($,Z,"no pull request is linked to this task \u2014 there is nothing for a "+"reviewer to review")}async reconcileItem($,Z,Q){if(!await this.taskBoard.claimSweep($,Z,Q))return!1;let Y=await this.taskBoard.getById($,Z);if(!Y)return!1;if(!RX(Y))return!1;let X=Y.assigneeId===n$,J=await this.taskBoard.listPrs($,Z),G=await this.contextFactory(Z,Y.assignedBy??Y.createdBy);if(!G)return!1;if(J.length===0){if(await Rs$(G,Y))J=await this.taskBoard.listPrs($,Z);if(J.length===0){if(X)await this.handOffReviewWithoutPr(G,Y);return!1}}let W=await Promise.all(J.map(async(K)=>({...K,...await Nu(Z,K)})));if(W.every((K)=>K.state===null))console.warn(`[task-board-review-sweeper] ${$}: no live PR state from GitHub (${W.length} PR(s)) \u2014 proceeding on unknown`);if(await Is$(G,Y,W))return!0;if(await Sz$(G,Y))return!0;if(await this.resolveConflictFromSweep(G,Y,W))return!0;if(!X)return!1;if(!he0(W))return!1;return await Yj0(G,Y,{previewMatchesHead:ue0(W)}),!0}async resolveConflictFromSweep($,Z,Q){let Y=Q.find((X)=>X.state!=="closed"&&X.conflict===!0);if(!Y)return!1;return await WL($,Z.organizationId,Z,{pr:{number:Y.number,url:Y.url},conflict:!0}).catch((X)=>{return console.error("[task-board-review-sweeper] conflict resolve failed",X),!1})}dispose(){if(this.timer)clearInterval(this.timer),this.timer=null}}var DT6=60000,LT6=300000,wT6=50,ET6=60000,jT6=900000,zT6=120000;var ks$=D(()=>{j4();Me0();qs$();CH();Zs();bW();Ms$();X9();cG();ne0();IZ();Cr();Fu()});import{readdir as TT6,rm as vq0}from"fs/promises";import{join as fq0}from"path";async function bq0($){let Z=new Date;Z.setUTCDate(Z.getUTCDate()-RT6),Z.setUTCHours(0,0,0,0);let Q=0;try{let Y=await Wb($);for(let X of Y)if(/^\d{4}$/.test(X))Q+=await Vs$($,X,Z);else if(!X.startsWith(".")){let J=fq0($,X),G=await Wb(J);for(let K of G){if(!/^\d{4}$/.test(K))continue;Q+=await Vs$(J,K,Z)}if((await Wb(J)).length===0)await vq0(J,{recursive:!0,force:!0})}}catch(Y){console.warn("monitoring retention cleanup failed:",Y)}return Q}async function Vs$($,Z,Q){let Y=0,X=fq0($,Z),J=await Wb(X);for(let W of J){if(!/^\d{2}$/.test(W))continue;let K=fq0(X,W),H=await Wb(K);for(let U of H){if(!/^\d{2}$/.test(U))continue;let N=new Date(`${Z}-${W}-${U}T00:00:00Z`);if(isNaN(N.getTime()))continue;if(N<Q){let B=fq0(K,U);await vq0(B,{recursive:!0,force:!0}),Y++}}if((await Wb(K)).length===0)await vq0(K,{recursive:!0,force:!0})}if((await Wb(X)).length===0)await vq0(X,{recursive:!0,force:!0});return Y}async function Wb($){try{return(await TT6($)).filter((Q)=>!Q.startsWith("."))}catch{return[]}}var RT6=30;var TG1=()=>{};import{DBOS as RG1,SchedulerMode as qT6}from"@dbos-inc/dbos-sdk";async function MT6(){let $=[R3(),Kb(),PF()],Z=0;for(let Q of $)try{Z+=await bq0(Q)}catch(Y){console.error("[monitoring-retention] cleanup failed:",Y)}return console.log(`[monitoring-retention] deleted ${Z} day-dir(s) across ${$.length} signal dir(s)`),{deleted:Z,dirs:$.length}}async function kT6($,Z){await RG1.runStep(()=>MT6(),{name:"monitoringRetention"})}function Cs$(){if(Ss$)return;Ss$=!0;let $=RG1.registerWorkflow(kT6,{name:"monitoringRetentionWorkflow"});RG1.registerScheduled($,{name:"monitoringRetentionWorkflow",crontab:IT6,mode:qT6.ExactlyOncePerIntervalWhenActive})}var IT6="23 4 * * *",Ss$=!1;var _s$=D(()=>{GG();TG1()});function vs$($){return async(Z,Q)=>{let Y=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","=",Q).where("member.organizationId","=",Z).executeTakeFirst();if(!Y)return console.warn(`[automationContextFactory] User ${Q} not found in org ${Z} \u2014 returning null`),null;let X=await v7.create();X.auth.user={id:Q,role:Y.role},X.organization={id:Y.orgId,slug:Y.orgSlug,name:Y.orgName};let J=await gj($.db,Z,Y.role);return X.boundAuth=UY1({auth:X.authInstance,headers:new Headers,role:Y.role,permissions:J,userId:Q}),X.access=new LE(Q,void 0,X.boundAuth,Y.role,"self"),KL(X,{id:Y.orgId,slug:Y.orgSlug}),X}}var fs$=D(()=>{JU();ZH()});function VT6(){return[{name:"Postgres",status:"pending",port:0},{name:"NATS",status:"pending",port:0}]}function ST6(){return{services:VT6(),migrationsStatus:"pending",serverUrl:null,logs:[]}}function _T6(){for(let $ of CT6)$()}function bs$($){let Z=[...qG1.logs,$];qG1={...qG1,logs:Z.length>500?Z.slice(-500):Z},_T6()}function IG1(){return vT6}var qG1,CT6,vT6=!1;var MG1=D(()=>{qG1=ST6(),CT6=new Set});import{EventEmitter as fT6}from"events";var kG1;var xs$=D(()=>{MG1();kG1=new fT6;kG1.on("request",($)=>{bs$($)})});function ys$(){return async($,Z)=>{let Q=Date.now(),Y=$.req.method,X=$.req.path;if(X==="/api/auth/get-session"||X.includes("favicon")){await Z();return}let J="",G=!1;if(X.startsWith("/mcp")&&Y==="POST"){G=!0;try{if($.req.header("Content-Type")?.includes("application/json")){let N=await $.req.raw.clone().json();if(N.method==="tools/call"&&N.params?.name){let B=ic(N.params.name),O=N.params.arguments||{},L=Object.keys(O).map((E)=>ic(E)),w=L.length>0?L.slice(0,3).join(",")+(L.length>3?"\u2026":""):"";J=`${w5.tool}${B}${w5.dim}(${w})${w5.reset}`}else if(N.method)J=`${w5.dim}${ic(N.method)}${w5.reset}`}}catch{}}let W=ic(X);if(X.startsWith("/mcp/conn_")){let F=X.split("/")[2]??"";W=`/mcp/${w5.mcp}${ic(F.slice(0,12))}\u2026${w5.reset}`}else if(X==="/mcp")W=`${w5.mcp}/mcp${w5.reset}`;else if(X==="/mcp/registry")W=`${w5.mcp}/mcp/registry${w5.reset}`;let K=xT6(Y),H=G?"\u25C0":"\u2190";if(!IG1())console.log(`${w5.dim}${H}${w5.reset} ${K}${Y}${w5.reset} ${W}${J?` ${J}`:""}`);try{await Z()}finally{let F=Date.now()-Q,U=$.res.status,N=bT6(U),B=F<1000?`${F}ms`:`${(F/1000).toFixed(1)}s`,O=G?"\u25B6":"\u2192";if(!IG1())console.log(`${w5.dim}${O}${w5.reset} ${K}${Y}${w5.reset} ${W}${J?` ${J}`:""} ${N}${U}${w5.reset} ${w5.duration}${B}${w5.reset}`);kG1.emit("request",{method:Y,path:ic(X),status:U,duration:F,timestamp:new Date})}}}var w5,bT6=($)=>{if($>=500)return w5.serverError;if($>=400)return w5.clientError;if($>=300)return w5.redirect;return w5.ok},xT6=($)=>{return w5[$]||w5.reset},ic=($)=>{return $.replace(/\r/g,"").replace(/\n/g,"").replace(/\x1b\[[0-9;]*m/g,"").replace(/[\x00-\x1f\x7f-\x9f]/g,"")};var gs$=D(()=>{MG1();xs$();w5={reset:"\x1B[0m",dim:"\x1B[2m",bold:"\x1B[1m",GET:"\x1B[36m",POST:"\x1B[33m",PUT:"\x1B[35m",DELETE:"\x1B[31m",ok:"\x1B[32m",redirect:"\x1B[36m",clientError:"\x1B[33m",serverError:"\x1B[31m",mcp:"\x1B[35m",tool:"\x1B[96m",duration:"\x1B[90m"}});import{createHmac as cs$}from"crypto";import{mkdir as yT6,readdir as gT6,rm as hs$,stat as ds$}from"fs/promises";import{join as SG1,relative as hT6}from"path";import{z as k$}from"zod";function is$($){let Z=$.replace(/[^a-zA-Z0-9_-]/g,"_");return SG1(uT6,Z)}function ps$($){return $.replace(/^\/+/,"").replace(/\.\./g,"")}function VG1($,Z){let Q=is$($),Y=ps$(Z);return SG1(Q,Y)}function lT6($,Z,Q,Y){let X=M0().encryptionKey||"dev-secret",J=`${$}:${Z}:${Q}:${Y}`;return cs$("sha256",X).update(J).digest("hex")}function ls$($,Z,Q,Y,X){let J=Math.floor(Date.now()/1000)+Y,G=lT6(Z,Q,J,X),W=new URL(`/api/dev-assets/${Z}/${ps$(Q)}`,$);return W.searchParams.set("expires",J.toString()),W.searchParams.set("signature",G),W.searchParams.set("method",X),W.toString()}function ns$($,Z,Q){let Y=`${$}:${Z.getTime()}:${Q}`;return`"${cs$("md5","etag").update(Y).digest("hex")}"`}async function ts$($,Z,Q,Y,X){try{let J=await gT6($,{withFileTypes:!0});for(let G of J){let W=SG1($,G.name),H=hT6(Z,W).replace(/\\/g,"/");if(Q&&!H.startsWith(Q))continue;if(G.isDirectory())if(Y){let F=H+"/";if(!Q||F.startsWith(Q)){if(!(Q?H.slice(Q.length):H).includes("/"))X.commonPrefixes.add(F)}}else await ts$(W,Z,Q,Y,X);else if(G.isFile()){if(Y&&Q){let F=H.slice(Q.length);if(F.includes(Y)){let U=F.indexOf(Y),N=Q+F.slice(0,U+1);X.commonPrefixes.add(N);continue}}try{let F=await ds$(W);X.objects.push({key:H,size:F.size,lastModified:F.mtime.toISOString(),etag:ns$(W,F.mtime,F.size)})}catch{}}}}catch{}}function os$($,Z){let Y=p($).id;return[{name:"LIST_OBJECTS",description:"List objects in the local assets directory with pagination support",inputSchema:k$.object({prefix:k$.string().optional(),maxKeys:k$.number().optional().default(1000),continuationToken:k$.string().optional(),delimiter:k$.string().optional()}),outputSchema:k$.object({objects:k$.array(k$.object({key:k$.string(),size:k$.number(),lastModified:k$.string(),etag:k$.string()})),nextContinuationToken:k$.string().optional(),isTruncated:k$.boolean(),commonPrefixes:k$.array(k$.string()).optional()}),handler:async(X)=>{let J=X,G=J.prefix||"",W=J.maxKeys??1000,K=J.delimiter,H=J.continuationToken,F=is$(Y);await yT6(F,{recursive:!0});let U={objects:[],commonPrefixes:new Set};await ts$(F,F,G,K,U),U.objects.sort((w,E)=>w.key.localeCompare(E.key));let N=0;if(H){if(N=U.objects.findIndex((w)=>w.key>H),N===-1)N=U.objects.length}let B=U.objects.slice(N,N+W),O=N+W<U.objects.length,L=O?B[B.length-1]?.key:void 0;return{objects:B,isTruncated:O,nextContinuationToken:L,commonPrefixes:Array.from(U.commonPrefixes).sort()}}},{name:"GET_OBJECT_METADATA",description:"Get metadata for a file in the local assets directory",inputSchema:k$.object({key:k$.string()}),outputSchema:k$.object({contentType:k$.string().optional(),contentLength:k$.number(),lastModified:k$.string(),etag:k$.string(),metadata:k$.record(k$.string(),k$.string()).optional()}),handler:async(X)=>{let J=X,G=VG1(Y,J.key),W=await ds$(G);return{contentType:YX1(J.key),contentLength:W.size,lastModified:W.mtime.toISOString(),etag:ns$(G,W.mtime,W.size)}}},{name:"GET_PRESIGNED_URL",description:"Generate a presigned URL for downloading a file from local storage",inputSchema:k$.object({key:k$.string(),expiresIn:k$.number().optional()}),outputSchema:k$.object({url:k$.string(),expiresIn:k$.number()}),handler:async(X)=>{let J=X,G=J.expiresIn??us$;return{url:ls$(Z,Y,J.key,G,"GET"),expiresIn:G}}},{name:"PUT_PRESIGNED_URL",description:"Generate a presigned URL for uploading a file to local storage",inputSchema:k$.object({key:k$.string(),expiresIn:k$.number().optional(),contentType:k$.string().optional()}),outputSchema:k$.object({url:k$.string(),expiresIn:k$.number()}),handler:async(X)=>{let J=X,G=J.expiresIn??us$;return{url:ls$(Z,Y,J.key,G,"PUT"),expiresIn:G}}},{name:"DELETE_OBJECT",description:"Delete a single file from local storage",inputSchema:k$.object({key:k$.string()}),outputSchema:k$.object({success:k$.boolean(),key:k$.string()}),handler:async(X)=>{let J=X,G=VG1(Y,J.key);try{return await hs$(G),{success:!0,key:J.key}}catch{return{success:!1,key:J.key}}}},{name:"DELETE_OBJECTS",description:"Delete multiple files from local storage",inputSchema:k$.object({keys:k$.array(k$.string()).max(1000)}),outputSchema:k$.object({deleted:k$.array(k$.string()),errors:k$.array(k$.object({key:k$.string(),message:k$.string()}))}),handler:async(X)=>{let J=X,G=[],W=[];return await Promise.all(J.keys.map(async(K)=>{let H=VG1(Y,K);try{await hs$(H),G.push(K)}catch(F){W.push({key:K,message:F instanceof Error?F.message:"Unknown error"})}})),{deleted:G,errors:W}}}]}async function CG1($,Z,Q){let Y=os$(Z,Q),X=new bK({name:"dev-assets-mcp",version:"1.0.0"},{capabilities:{tools:{}},jsonSchemaValidator:T5});for(let G of Y){let W="shape"in G.inputSchema?G.inputSchema.shape:k$.object({}).shape,K=G.outputSchema&&"shape"in G.outputSchema?G.outputSchema.shape:k$.object({}).shape;X.registerTool(G.name,{description:G.description??"",inputSchema:W,outputSchema:K,annotations:G.annotations,_meta:G._meta},async(H)=>{try{let F=await G.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 J=new MY({enableJsonResponse:$.headers.get("Accept")?.includes("application/json")??!1});return await X.connect(J),W3(X,J,$,"mcp:dev-assets")}async function rs$($,Z,Q,Y){let J=os$(Q,Y).find((G)=>G.name===$);if(!J)return{content:[{type:"text",text:`Tool not found: ${$}`}],isError:!0};try{let G=await J.handler(Z);return{content:[{type:"text",text:JSON.stringify(G)}]}}catch(G){return{content:[{type:"text",text:G instanceof Error?G.message:String(G)}],isError:!0}}}var uT6="./data/assets",us$=3600,ms$,ss$;var as$=D(()=>{E$();Cu();g$();ui();lv();HQ();MR0();ms$=new $1;ms$.all("/",async($)=>{let Z=$.get("studioContext"),Q=new URL($.req.url),Y=`${Q.protocol}//${Q.host}`;return CG1($.req.raw,Z,Y)});ss$=ms$});var es$={};T4(es$,{mountDevRoutes:()=>cT6});function cT6($,Z){$.all("/mcp/:connectionId{.*_dev-assets$}",Z,async(Y)=>{let X=Y.get("studioContext"),J=new URL(Y.req.url),G=`${J.protocol}//${J.host}`;return CG1(Y.req.raw,X,G)}),$.all("/mcp/:connectionId{.*_dev-assets$}/call-tool/:toolName",Z,async(Y)=>{let X=Y.get("studioContext"),J=new URL(Y.req.url),G=`${J.protocol}//${J.host}`,W=Y.req.param("toolName");if(!W)return Y.json({error:"Missing tool name"},400);let K=await Y.req.json(),H=await rs$(W,K,X,G);if(H.isError)return Y.json(H.content,500);return Y.json(H.content)}),$.use("/mcp/dev-assets",Z),$.route("/mcp/dev-assets",ss$);let Q=new $1;Q.use("*",JK({mountPath:"/api/dev-assets"})),Q.route("/",IR0({orgFromPath:!1})),$.route("/api/dev-assets",Q)}var $a$=D(()=>{g$();rY1();MR0();as$()});import{sql as dT6}from"kysely";import{randomUUID as Za$}from"crypto";import{z as mT6}from"zod";async function pT6($){let Z=new Date().toISOString(),Q=Za$(),Y=h8.SELF($.organizationId),X="registry.publish_request.created",J={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:Q,organization_id:$.organizationId,type:"registry.publish_request.created",source:Y,specversion:"1.0",subject:$.request.id,time:Z,datacontenttype:"application/json",dataschema:null,data:JSON.stringify(J),cron:null,status:"pending",attempts:0,last_error:null,next_retry_at:null,created_at:Z,updated_at:Z}).execute();let G=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","=",Y)])).execute();if(G.length>0)await $.db.insertInto("event_deliveries").values(G.map((W)=>({id:Za$(),event_id:Q,subscription_id:W.id,status:"pending",attempts:0,last_error:null,delivered_at:null,next_retry_at:null,created_at:Z}))).execute();try{await dT6`SELECT
|
|
2944
2944
|
pg_notify('studio_events', ${Q}),
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{c as o,j as r}from"./index-wCxpHMXU.js";import{O as m}from"./api-keys-8V378lXS.js";import{R as p}from"./require-capability-Brgi9MZC.js";import"./AlertCircle-B4feVBXY.js";import"./Copy01-D6tBkCFE.js";import"./Key01-Cu5VaAjI.js";import"./Plus-CWZNNoAx.js";import"./Trash01-D5k8EQTh.js";import"./alert-dialog-Bjg29J3P.js";import"./dialog-yNkqhTt0.js";import"./input-B1KBCyOs.js";import"./label-Yogy3AMi.js";import"./use-mcp-client-B0Utyl6_.js";import"./auth-Bc7owB5v.js";import"./access-gate-PswGCIi5.js";import"./capability-load-error-CFvjxFBc.js";function k(){const t=o.c(1);let i;return t[0]===Symbol.for("react.memo_cache_sentinel")?(i=r.jsx(p,{capability:"api-keys:manage",area:"api-keys",children:r.jsx(m,{})}),t[0]=i):i=t[0],i}export{k as default};
|