decocms 4.340.2 → 4.340.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-DIaOW2a4.js → AlertCircle-D4eptcdD.js} +1 -1
- package/dist/client/assets/{AreaChart-BVyS7qyZ.js → AreaChart-T4EDIvYF.js} +1 -1
- package/dist/client/assets/{ArrowLeft-CkraMrWi.js → ArrowLeft-By7NdTU-.js} +1 -1
- package/dist/client/assets/{ArrowUp-CFyv7zL2.js → ArrowUp-edD97XIY.js} +1 -1
- package/dist/client/assets/{Check-D0mMHHlb.js → Check-D2l5BF-Z.js} +1 -1
- package/dist/client/assets/{CheckCircle-BB5yvEMr.js → CheckCircle-qxgqqPk6.js} +1 -1
- package/dist/client/assets/{ChevronRight-Xvqi3w2g.js → ChevronRight-CTzgHliU.js} +1 -1
- package/dist/client/assets/{ChevronSelectorVertical-BbPpE54m.js → ChevronSelectorVertical--U_-SmJI.js} +1 -1
- package/dist/client/assets/{ChevronUp-DM3lVQvO.js → ChevronUp-LXuYKq_u.js} +1 -1
- package/dist/client/assets/{Copy01-C5l-FH59.js → Copy01-Da7Gwpg8.js} +1 -1
- package/dist/client/assets/{CreditCard01-ou0G_vVT.js → CreditCard01-B6Je6ds6.js} +1 -1
- package/dist/client/assets/{DotsVertical-Bckkg8cp.js → DotsVertical-oKCtfNDV.js} +1 -1
- package/dist/client/assets/{Download01-D0KBmU4w.js → Download01-DFVY5rQN.js} +1 -1
- package/dist/client/assets/{ErrorBarContext-BPGigIRF.js → ErrorBarContext-BFbX9b5Z.js} +1 -1
- package/dist/client/assets/{Eye-CuiKxWrx.js → Eye-yCkz-G0q.js} +1 -1
- package/dist/client/assets/{GitBranch01-D2fzBGbc.js → GitBranch01-BYBggGnl.js} +1 -1
- package/dist/client/assets/{Globe01-D6xB9Mh2.js → Globe01-DwNzZ366.js} +1 -1
- package/dist/client/assets/{HardDrive-Cdypi8LO.js → HardDrive-qXE-7yCu.js} +1 -1
- package/dist/client/assets/{Image01-BOWgFwfS.js → Image01-BI0pxSgO.js} +1 -1
- package/dist/client/assets/{Key01-B0AICybO.js → Key01-DjaX2pWd.js} +1 -1
- package/dist/client/assets/{Link01-CAhHX8ns.js → Link01-BHjLm33S.js} +1 -1
- package/dist/client/assets/{LinkExternal01-CpwYQqZD.js → LinkExternal01-BPqjvb8k.js} +1 -1
- package/dist/client/assets/{Monitor01-ffWugAAw.js → Monitor01-BA0D5du5.js} +1 -1
- package/dist/client/assets/{Package-MUKgMq_w.js → Package-CEcFeOI2.js} +1 -1
- package/dist/client/assets/{Palette-UhuDUxlx.js → Palette-A4Wns4ig.js} +1 -1
- package/dist/client/assets/{Play-66-HzwM1.js → Play-B6EOv-3E.js} +1 -1
- package/dist/client/assets/{Plus-0-zPgPOn.js → Plus-o0Y2PUSC.js} +1 -1
- package/dist/client/assets/{SearchLg-Brp4p9U_.js → SearchLg-Dmp-TaSc.js} +1 -1
- package/dist/client/assets/{SearchMd-CnkxOr9Y.js → SearchMd-DRqnwlLc.js} +1 -1
- package/dist/client/assets/{Sector-D1B61d6s.js → Sector-CNSFn1D1.js} +1 -1
- package/dist/client/assets/{Settings02-DqdykjE2.js → Settings02-BYSzjS8c.js} +1 -1
- package/dist/client/assets/{Share07-qW4uv6qn.js → Share07-C4GWKp8b.js} +1 -1
- package/dist/client/assets/{Shield01-BdgsYHSs.js → Shield01-DyES_6E-.js} +1 -1
- package/dist/client/assets/{Stars01-BgcxgOJU.js → Stars01-wkPjgYzm.js} +1 -1
- package/dist/client/assets/{Sun-BJkcdqUz.js → Sun-BcFJuXPi.js} +1 -1
- package/dist/client/assets/{Tool01-DHl_ryV7.js → Tool01-Ds6CNk32.js} +1 -1
- package/dist/client/assets/{Tool02-Croom4pd.js → Tool02-q0KsYMT-.js} +1 -1
- package/dist/client/assets/{Trash01-DQdKEeaC.js → Trash01-BKDtPzTP.js} +1 -1
- package/dist/client/assets/{TrendUp01-D41mNmLx.js → TrendUp01-Blj4JI-e.js} +1 -1
- package/dist/client/assets/{Upload01-BBuFzVEX.js → Upload01-DfXMh7m7.js} +1 -1
- package/dist/client/assets/{User01-BksLzVP2.js → User01-BUfmnH4r.js} +1 -1
- package/dist/client/assets/{UserSquare-DRcM6_FM.js → UserSquare-rhqwE2Ol.js} +1 -1
- package/dist/client/assets/{Users01-BlGNimz_.js → Users01-Cavw3M_7.js} +1 -1
- package/dist/client/assets/{Users03-f1qylWgy.js → Users03-CMiKV-au.js} +1 -1
- package/dist/client/assets/{XCircle-BfK--89T.js → XCircle-CBa7oU0T.js} +1 -1
- package/dist/client/assets/{XClose-BhF1i_5s.js → XClose-BWCEWVtY.js} +1 -1
- package/dist/client/assets/{Zap-DUr48rn3.js → Zap-DNLi-aw-.js} +1 -1
- package/dist/client/assets/{ZoomOut-Ck4Rj54b.js → ZoomOut--LB8-MJ0.js} +1 -1
- package/dist/client/assets/{access-gate-BtGc3-5-.js → access-gate-BKCBd5up.js} +1 -1
- package/dist/client/assets/{agent-icon-Boyp1yXd.js → agent-icon-D9yOgdsj.js} +1 -1
- package/dist/client/assets/{agents-list-DJC_Hmq2.js → agents-list-CzIwDnAs.js} +1 -1
- package/dist/client/assets/{ai-providers-Bo-9h-tO.js → ai-providers-TVBeQed9.js} +1 -1
- package/dist/client/assets/{alert-dialog-Dk6xUZRW.js → alert-dialog-B65KF7uo.js} +1 -1
- package/dist/client/assets/{alert-DheOygTs.js → alert-uwNUIliw.js} +1 -1
- package/dist/client/assets/{analytics-tab-D7-913iy.js → analytics-tab-BGOTFEol.js} +1 -1
- package/dist/client/assets/{api-keys-gavJhF9p.js → api-keys-DWV5ABx8.js} +1 -1
- package/dist/client/assets/api-keys-DqqUCZpl.js +1 -0
- package/dist/client/assets/app-editor-DE9j7-CA.js +1 -0
- package/dist/client/assets/{auth-CHIGqkAy.js → auth-DioziTTE.js} +1 -1
- package/dist/client/assets/{auth-catchall-B-MxN1m3.js → auth-catchall-BrYWovtI.js} +1 -1
- package/dist/client/assets/{auth-entry-ER-cAf-n.js → auth-entry-DyC6TOjg.js} +1 -1
- package/dist/client/assets/{auth-split-layout-BdwhE-Zg.js → auth-split-layout-BJNsnITH.js} +1 -1
- package/dist/client/assets/{authenticate-and-persist-oauth-BO9KQ0BF.js → authenticate-and-persist-oauth-D_DYHjS1.js} +1 -1
- package/dist/client/assets/{automation-list-row-BaRoQ7fF.js → automation-list-row-Bj-YjioX.js} +1 -1
- package/dist/client/assets/{automation-runs-hffXFRkW.js → automation-runs-riNjhYq4.js} +1 -1
- package/dist/client/assets/{automations-BJ-ybyqO.js → automations-DwJ6thUy.js} +1 -1
- package/dist/client/assets/{autosend-D2fNTr-P.js → autosend-Bb_eeT5K.js} +1 -1
- package/dist/client/assets/{avatar-CjsbwZtK.js → avatar-Su9BccVA.js} +1 -1
- package/dist/client/assets/{badge-RU2M-49-.js → badge-D5opyBVG.js} +1 -1
- package/dist/client/assets/{block-document-B4KLtaB8.js → block-document-0FZzNRnA.js} +1 -1
- package/dist/client/assets/{breadcrumb-DzMx00ts.js → breadcrumb-D0dG4zMw.js} +1 -1
- package/dist/client/assets/{buckets-DNACrJZl.js → buckets-C3Gfleiz.js} +1 -1
- package/dist/client/assets/{bulk-category-panel-Cos2UuZh.js → bulk-category-panel-UjLqwS7U.js} +1 -1
- package/dist/client/assets/{capability-load-error-BtHnwQYv.js → capability-load-error-DlaWwGcu.js} +1 -1
- package/dist/client/assets/{cards-DVw6lXPV.js → cards-BxZs3S9t.js} +1 -1
- package/dist/client/assets/{category-editor-_fuKcxiU.js → category-editor-Ciy7h3Ht.js} +1 -1
- package/dist/client/assets/{cdn-tab-C3TYPUZ_.js → cdn-tab-94TJpUWH.js} +1 -1
- package/dist/client/assets/{chart-BC7TC7I4.js → chart-BDUoTpmV.js} +1 -1
- package/dist/client/assets/{chat-context-bsCMepSR.js → chat-context-BHGFVHN3.js} +1 -1
- package/dist/client/assets/{checkbox-C-u4mNbv.js → checkbox-DaWx9dP_.js} +1 -1
- package/dist/client/assets/{choose-editor-DSLLzZyv.js → choose-editor-ByhxySDt.js} +1 -1
- package/dist/client/assets/{cli-auth-success-Bz0pWs95.js → cli-auth-success-CUrlSCTu.js} +1 -1
- package/dist/client/assets/{client-icons-SSApc4KI.js → client-icons-DmMx7Ulj.js} +1 -1
- package/dist/client/assets/{collection-detail-BImbyODP.js → collection-detail-CMn9dpyT.js} +1 -1
- package/dist/client/assets/{collection-display-button-B46ySSqO.js → collection-display-button-DsjF-ASd.js} +1 -1
- package/dist/client/assets/{collection-search-Cq6cM2JM.js → collection-search-BgvAhEP3.js} +1 -1
- package/dist/client/assets/{collection-table-wrapper-C_bLtMmm.js → collection-table-wrapper-CGWXHqwo.js} +1 -1
- package/dist/client/assets/{collection-tabs-DFuDuC4o.js → collection-tabs-CkVVLsFa.js} +1 -1
- package/dist/client/assets/{command-MxI1106i.js → command-Dfw7RW16.js} +1 -1
- package/dist/client/assets/{commerce-onboarding-0n-W5g7G.js → commerce-onboarding-C3Bv2uGv.js} +1 -1
- package/dist/client/assets/{connect-LjbyEc3X.js → connect-BLwXEJXJ.js} +1 -1
- package/dist/client/assets/{connect-layout-Dfp6px_b.js → connect-layout-ymcfw2uW.js} +1 -1
- package/dist/client/assets/{connection-lonWAKBS.js → connection-DoUDNDkd.js} +1 -1
- package/dist/client/assets/{connection-card-Cas8LHM4.js → connection-card-BHSFJnLS.js} +1 -1
- package/dist/client/assets/{connection-detail-BJlm4sGp.js → connection-detail-B8fEcGAE.js} +1 -1
- package/dist/client/assets/{connection-form-helpers-Bf7V7NnE.js → connection-form-helpers-D0Ul3Q7c.js} +1 -1
- package/dist/client/assets/{connections-8majsw9r.js → connections-DzY7XO8J.js} +1 -1
- package/dist/client/assets/{create-organization-dialog-Cg5p1Y0K.js → create-organization-dialog-CFrOi5ND.js} +1 -1
- package/dist/client/assets/{decopilot-sse-pool-BDCIZKi7.js → decopilot-sse-pool-BxKR4Ktf.js} +1 -1
- package/dist/client/assets/{dialog-Bbam-top.js → dialog-CMB-qBs8.js} +1 -1
- package/dist/client/assets/{domain-settings-b7lEDTdZ.js → domain-settings-CktWvaxO.js} +1 -1
- package/dist/client/assets/{drawer-BBpkNJCT.js → drawer-D61o3aS7.js} +1 -1
- package/dist/client/assets/{dropdown-menu-B9TrFFX8.js → dropdown-menu-AwgQpgo6.js} +1 -1
- package/dist/client/assets/{e2e-tab-CYSjAeHU.js → e2e-tab-CCYMlTxn.js} +1 -1
- package/dist/client/assets/{editor-ByEG0Dkn.js → editor-IgAxUnzG.js} +1 -1
- package/dist/client/assets/{empty-state-BG8VtHL4.js → empty-state-Cuda3xDL.js} +1 -1
- package/dist/client/assets/{empty-state-k5KO-fXu.js → empty-state-LDf6W2DE.js} +1 -1
- package/dist/client/assets/{extract-connection-data-CTqb2v_c.js → extract-connection-data-D3hXZhuz.js} +1 -1
- package/dist/client/assets/{file-explorer-DqS9vAmf.js → file-explorer-CAGW55EV.js} +1 -1
- package/dist/client/assets/{file-type-icon-BKsgtuNz.js → file-type-icon-D9_gJydp.js} +1 -1
- package/dist/client/assets/{folder-icon-Bp1wa03o.js → folder-icon-Co18vvIx.js} +1 -1
- package/dist/client/assets/{form-Bvw8wnpn.js → form-P9x_8iLW.js} +1 -1
- package/dist/client/assets/{general-Cs-cEbsz.js → general-DD2Gbn1o.js} +1 -1
- package/dist/client/assets/{github-icon-BCzLERHX.js → github-icon-D7iRPbYd.js} +1 -1
- package/dist/client/assets/{github-repo-picker-CmrThF8H.js → github-repo-picker-oki5M2Yp.js} +1 -1
- package/dist/client/assets/{gitlab-icon-BSmB-2UF.js → gitlab-icon-BUUIzzAR.js} +1 -1
- package/dist/client/assets/{hooks-CNAnvoCF.js → hooks-C7MaW46e.js} +1 -1
- package/dist/client/assets/{hosting-tab-DAYYKJ9A.js → hosting-tab-B3LdFlyo.js} +1 -1
- package/dist/client/assets/{index-Cr2r9yOQ.js → index-Bd3dLWt0.js} +1 -1
- package/dist/client/assets/{index-ucwOO9fI.js → index-BjFJi_dY.js} +6 -6
- package/dist/client/assets/{index-BDM56tKW.js → index-C-w2qLLj.js} +1 -1
- package/dist/client/assets/{index-DIXY08dy.js → index-CjwXQIsq.js} +3 -3
- package/dist/client/assets/{index-CAFjYYI-.js → index-CpnS34dS.js} +1 -1
- package/dist/client/assets/{index-BebKCIL3.js → index-DGVk_6Hc.js} +1 -1
- package/dist/client/assets/{index-BSxvRGHb.js → index-DTqoj4wk.js} +1 -1
- package/dist/client/assets/{index-DS66OOQi.js → index-QRInmqL5.js} +1 -1
- package/dist/client/assets/{index-C2jg8qvF.js → index-izgOnY_o.js} +1 -1
- package/dist/client/assets/{index-DjOW_eCt.js → index-r657k7_1.js} +1 -1
- package/dist/client/assets/{index-redirect-DH2mV3H3.js → index-redirect-CbyXgZCh.js} +1 -1
- package/dist/client/assets/{infra-billing-BRtCiS23.js → infra-billing-Csz1Zxpv.js} +1 -1
- package/dist/client/assets/{input-BaSwondt.js → input-CnBsHD1o.js} +1 -1
- package/dist/client/assets/{integration-icon-DpT1R4z0.js → integration-icon-CM-iB_lL.js} +1 -1
- package/dist/client/assets/{invite-member-dialog-B6ZS017V.js → invite-member-dialog-C2K_dSyQ.js} +1 -1
- package/dist/client/assets/{label-Dyl7cfID.js → label-CntSk49v.js} +1 -1
- package/dist/client/assets/{layout-9VjC1KKu.js → layout-DdsuP3TB.js} +1 -1
- package/dist/client/assets/{login-DEdjVuVU.js → login-tA1ITPo3.js} +1 -1
- package/dist/client/assets/{markdown-DKEce8zo.js → markdown-BNZypzOK.js} +1 -1
- package/dist/client/assets/{mcp-app-renderer-BinygmCz.js → mcp-app-renderer-m4qJtiod.js} +1 -1
- package/dist/client/assets/{mcp-oauth-CP-eF8qU.js → mcp-oauth-C-XlB80v.js} +1 -1
- package/dist/client/assets/{members-DatOEBUJ.js → members-CTttdZN-.js} +1 -1
- package/dist/client/assets/{monaco-editor-D_yoCZGO.js → monaco-editor-Bin7w4mZ.js} +1 -1
- package/dist/client/assets/{monitoring-stats-row-BPRPR5Pl.js → monitoring-stats-row-C4SfF9ul.js} +1 -1
- package/dist/client/assets/{multi-select-CCCcX5K8.js → multi-select-C-_n5jTV.js} +1 -1
- package/dist/client/assets/{oauth-callback-BMp7BkvZ.js → oauth-callback-__01eD-F.js} +1 -1
- package/dist/client/assets/{oauth-callback-ai-provider-BkLOjhSK.js → oauth-callback-ai-provider-BXhUblQr.js} +1 -1
- package/dist/client/assets/{onboarding-BpGv1x8X.js → onboarding-vNUwdiST.js} +1 -1
- package/dist/client/assets/{org-layout-BtRD8bw-.js → org-layout-Dk4aqRs3.js} +1 -1
- package/dist/client/assets/{organization-choice-C2fNpljD.js → organization-choice-BEjNku_f.js} +1 -1
- package/dist/client/assets/{orgs-CZqcppE4.js → orgs-Cdfe-MJM.js} +1 -1
- package/dist/client/assets/{page-seo-form-D98rUoV1.js → page-seo-form-BQlQTPmN.js} +1 -1
- package/dist/client/assets/{popover-DbXFofRY.js → popover-BJdYEE-0.js} +1 -1
- package/dist/client/assets/{post-calendar-DgqFye0r.js → post-calendar-PKeYqO45.js} +1 -1
- package/dist/client/assets/{post-editor-BIT8U35d.js → post-editor-Iw6l14n9.js} +1 -1
- package/dist/client/assets/{primitives-0kXBxBKm.js → primitives-BuYcUvRU.js} +1 -1
- package/dist/client/assets/{profile-BQlHsZRb.js → profile-DC2BD9UX.js} +1 -1
- package/dist/client/assets/{project-app-view-C5_LL_l6.js → project-app-view-hpAlBOj7.js} +1 -1
- package/dist/client/assets/{project-icon-D03OBqbD.js → project-icon-Dra14WkC.js} +1 -1
- package/dist/client/assets/{prompts-Ba5VAtOo.js → prompts-FPfktgB9.js} +1 -1
- package/dist/client/assets/record-editor-DDX8_Aaq.js +1 -0
- package/dist/client/assets/redirect-editor-BKiZkTha.js +1 -0
- package/dist/client/assets/registry-DU2RshNd.js +2 -0
- package/dist/client/assets/{registry-layout-01gXtwVN.js → registry-layout-kaDhlhvn.js} +1 -1
- package/dist/client/assets/{reports-C3Ponal_.js → reports-B3iBq3pk.js} +1 -1
- package/dist/client/assets/{repositories-DBV4lzFa.js → repositories-BvrWAlFC.js} +1 -1
- package/dist/client/assets/{require-capability-CH7k5KcR.js → require-capability-C9DPCJ2u.js} +1 -1
- package/dist/client/assets/{required-auth-layout-DUuGrPBq.js → required-auth-layout-BYXeRelM.js} +1 -1
- package/dist/client/assets/{reset-password-C7qZWXuc.js → reset-password-a7XKM2U5.js} +1 -1
- package/dist/client/assets/{review-settings-Bg8VINPO.js → review-settings-BmjrFOo5.js} +1 -1
- package/dist/client/assets/{roles-DCerdV-H.js → roles-Cb8DGHGk.js} +1 -1
- package/dist/client/assets/{schema-nS9X6Sm7.js → schema-DXOKrz9X.js} +1 -1
- package/dist/client/assets/{scroll-area-Br5fHJ93.js → scroll-area-Bqfc_Erd.js} +1 -1
- package/dist/client/assets/{search-input-u0HWhqRQ.js → search-input-CIDcVK1W.js} +1 -1
- package/dist/client/assets/{secrets-C-nhHXOC.js → secrets-vWIhSw2n.js} +1 -1
- package/dist/client/assets/{sections-editor-CtZPw62K.js → sections-editor-GP3j8IAp.js} +1 -1
- package/dist/client/assets/{select-DSsP7YdR.js → select-DjihVQpE.js} +1 -1
- package/dist/client/assets/{select-model-BdF8Pex7.js → select-model-DVj85GcE.js} +1 -1
- package/dist/client/assets/{self-tool-result-DIrCo3nO.js → self-tool-result-CILdhiz7.js} +1 -1
- package/dist/client/assets/{seo-editor-m7_03B4h.js → seo-editor-Cf-5ZI1C.js} +1 -1
- package/dist/client/assets/settings-layout-D-93a62O.js +1 -0
- package/dist/client/assets/{settings-sidebar-au-8jsvV.js → settings-sidebar-ub0T8wlz.js} +1 -1
- package/dist/client/assets/{shell-controls-CcGcA8m-.js → shell-controls-BHPQ69NP.js} +1 -1
- package/dist/client/assets/{shell-layout-C4JtLM6v.js → shell-layout-giov_RV6.js} +1 -1
- package/dist/client/assets/{skill-preview-C1Bh-B_T.js → skill-preview-Dc0F9K9f.js} +1 -1
- package/dist/client/assets/{skills-T2c7Ud-o.js → skills-BPPAhgo8.js} +1 -1
- package/dist/client/assets/{sso-DiH_r8v8.js → sso-D9lq9fiA.js} +1 -1
- package/dist/client/assets/{store-CGEWfwX8.js → store-BFxE9Ubd.js} +1 -1
- package/dist/client/assets/store-registry-DlwPkUXk.js +2 -0
- package/dist/client/assets/{switch-BK8kcc6k.js → switch-3uli6w8o.js} +1 -1
- package/dist/client/assets/{synced-repos-BEg1y2Fm.js → synced-repos-pIQVPkS4.js} +1 -1
- package/dist/client/assets/{table-DzP_Y9Cg.js → table-HInbTBT3.js} +1 -1
- package/dist/client/assets/{tabs-Crh8ONoY.js → tabs-CB0X0rSm.js} +1 -1
- package/dist/client/assets/{task-board-5UqUBTo-.js → task-board-Cf4HtK71.js} +1 -1
- package/dist/client/assets/{task-route-B5zkiWo8.js → task-route-CpZajaUU.js} +1 -1
- package/dist/client/assets/{tasks-nkccKIft.js → tasks-BqDpZWKM.js} +1 -1
- package/dist/client/assets/{textarea-D-b2IkT5.js → textarea-CbgllfHl.js} +1 -1
- package/dist/client/assets/{thread-intent-KcQNFBm_.js → thread-intent-CwML40cq.js} +1 -1
- package/dist/client/assets/{thread-route-BGeYECwq.js → thread-route-CfKr1K45.js} +1 -1
- package/dist/client/assets/{toggle-group-B82WyyfI.js → toggle-group-XO00wy6s.js} +1 -1
- package/dist/client/assets/{toolbar-BIZ3fGkU.js → toolbar-WtIFrGCF.js} +1 -1
- package/dist/client/assets/{toolbar-icon-button-Bh9yj5Kq.js → toolbar-icon-button-BZyQ1b8j.js} +1 -1
- package/dist/client/assets/{track-C84hLHKO.js → track-DuWwbucV.js} +1 -1
- package/dist/client/assets/{types-CB9_DcqL.js → types-Dx22xJO1.js} +1 -1
- package/dist/client/assets/{use-ai-providers-CxTOcdNU.js → use-ai-providers-C0USvI9F.js} +1 -1
- package/dist/client/assets/{use-automations-CeTccxHU.js → use-automations-Bm4c3QsR.js} +1 -1
- package/dist/client/assets/{use-autosave-DCxD2SkM.js → use-autosave-COZeuXrG.js} +1 -1
- package/dist/client/assets/{use-connection-BwxvWSHa.js → use-connection-B_f52nsX.js} +1 -1
- package/dist/client/assets/{use-copy-Ds0S7w3-.js → use-copy-C4kDu14m.js} +1 -1
- package/dist/client/assets/{use-create-virtual-mcp-gQpa4NRh.js → use-create-virtual-mcp-Bk5L3sJJ.js} +1 -1
- package/dist/client/assets/{use-debounced-autosave-DYe3EfDK.js → use-debounced-autosave-Dr2yIC01.js} +1 -1
- package/dist/client/assets/{use-debounced-value-D7K9qDiR.js → use-debounced-value-C6sbjzCo.js} +1 -1
- package/dist/client/assets/{use-decopilot-events-By26-fio.js → use-decopilot-events-Cpx-O_6L.js} +1 -1
- package/dist/client/assets/{use-delete-connection-CH-7dcsK.js → use-delete-connection-Do0rbLq6.js} +1 -1
- package/dist/client/assets/{use-deployment-admin-B3NeOHLi.js → use-deployment-admin-B1ITNZl2.js} +1 -1
- package/dist/client/assets/{use-destination-route-mqP1d37q.js → use-destination-route-DDQ78Jvv.js} +1 -1
- package/dist/client/assets/{use-file-configs-CPYulkrk.js → use-file-configs-aH4hOs-Y.js} +1 -1
- package/dist/client/assets/{use-infinite-scroll-B2wxrxaZ.js → use-infinite-scroll-BJqBipr7.js} +1 -1
- package/dist/client/assets/{use-join-requests-Ddk14rtm.js → use-join-requests-oAFbqCBk.js} +1 -1
- package/dist/client/assets/{use-mcp-auth-status-DiMTOk6i.js → use-mcp-auth-status-D9jS0E53.js} +1 -1
- package/dist/client/assets/{use-mcp-client-B4dpkjMH.js → use-mcp-client-B18ah0oT.js} +1 -1
- package/dist/client/assets/{use-mcp-prompts-D_CeaYaT.js → use-mcp-prompts-DsHnNXXI.js} +1 -1
- package/dist/client/assets/{use-mcp-tools-CtFaKlYM.js → use-mcp-tools-CCVeHBA6.js} +1 -1
- package/dist/client/assets/{use-members-C2JIqQGx.js → use-members-BhPw9btz.js} +1 -1
- package/dist/client/assets/{use-navigate-to-agent-CWFWvQdR.js → use-navigate-to-agent-CcKceYLc.js} +1 -1
- package/dist/client/assets/{use-org-auth-client-CRyzQbGV.js → use-org-auth-client-CjMTRXnm.js} +1 -1
- package/dist/client/assets/{use-org-notice-D4WV6ykW.js → use-org-notice-CdmVkOT1.js} +1 -1
- package/dist/client/assets/{use-org-sso-DudRmuzs.js → use-org-sso-B976idpX.js} +1 -1
- package/dist/client/assets/{use-organization-roles-DPmRmJNy.js → use-organization-roles-CxkBMnQe.js} +1 -1
- package/dist/client/assets/{use-organization-settings-BTbBAqzL.js → use-organization-settings-BmMnmPtW.js} +1 -1
- package/dist/client/assets/{use-panel-navigate-ah4gqAXT.js → use-panel-navigate-Duta24ra.js} +1 -1
- package/dist/client/assets/{use-registry-connections-B27D50OD.js → use-registry-connections-BAD2PYkI.js} +1 -1
- package/dist/client/assets/{use-secrets-BVe_BdYS.js → use-secrets-D1T_uOne.js} +1 -1
- package/dist/client/assets/{use-section-preview-base-juAiW8h6.js → use-section-preview-base-CIZ9iv7b.js} +1 -1
- package/dist/client/assets/{use-status-sounds-DpIWuiIb.js → use-status-sounds-InjXEoSW.js} +1 -1
- package/dist/client/assets/{use-tags-CSQr8_kD.js → use-tags-ioD3yFxX.js} +1 -1
- package/dist/client/assets/{use-view-mode-ChPEZxj4.js → use-view-mode-CB2VgC0t.js} +1 -1
- package/dist/client/assets/{use-virtual-mcp-Dp30lOtS.js → use-virtual-mcp-DiGxq30S.js} +1 -1
- package/dist/client/assets/useInfiniteQuery-Ce0KA0bU.js +1 -0
- package/dist/client/assets/useSuspenseInfiniteQuery-DMFx2SPM.js +1 -0
- package/dist/client/assets/{users-DmIg28dG.js → users-DTeVRu1z.js} +1 -1
- package/dist/client/assets/{variant-calendar-jf-qeHIw.js → variant-calendar-CKeoP_Ir.js} +1 -1
- package/dist/client/assets/{view-mode-toggle-CJSBINn7.js → view-mode-toggle-qfftb1wk.js} +1 -1
- package/dist/client/index.html +1 -1
- package/dist/server/cli.js +2 -2
- package/dist/server/server.js +2 -2
- package/package.json +1 -1
- package/dist/client/assets/api-keys-DXDJ7NU8.js +0 -1
- package/dist/client/assets/app-editor-7d1lGMc2.js +0 -1
- package/dist/client/assets/record-editor-yUcH2Ub_.js +0 -1
- package/dist/client/assets/redirect-editor-Lwv0FQlF.js +0 -1
- package/dist/client/assets/registry-BckB0d3F.js +0 -2
- package/dist/client/assets/settings-layout-CtDSjrIf.js +0 -1
- package/dist/client/assets/store-registry-DwDckrWM.js +0 -2
- package/dist/client/assets/useInfiniteQuery-D2ZXBjVk.js +0 -1
- package/dist/client/assets/useSuspenseInfiniteQuery-Cnvy6fF9.js +0 -1
package/dist/server/server.js
CHANGED
|
@@ -2712,7 +2712,7 @@ ${Y}`,$.data)}function cT0($){let Z=$;if(!Z||Z.isError!==!0||!Array.isArray(Z.co
|
|
|
2712
2712
|
${Z}`}:X)}}var Zu$=D(()=>{H9()});async function kG6($,Z,Q){if(!$)return!1;let X=await $.get("tools",Z).catch(()=>null);if(!X)return!1;for(let Y of X)if(typeof Y==="object"&&Y!==null&&Y.name===Q)return Y.annotations?.readOnlyHint===!0;return!1}function L71(){return{kind:"org"}}function vO($,Z,Q,X){let Y=new c9({name:`lazy-${$.id}`,version:"1.0.0"},{capabilities:{},jsonSchemaValidator:z5}),G=$.metadata?.isDevConnection===!0,J=null,W=!1;function K(){if(W)return Promise.reject(Error(`MCP client for connection ${$.id} is closed`));if(!J){QZ0($.id);let w=T7($,Z,Q).then((L)=>{XZ0($.id);let E=L.onclose;return L.onclose=()=>{if(J===w)J=null;E?.()},L}).catch((L)=>{throw J=null,YZ0($.id),L});J=w}return J}let H=(w,L)=>w!==void 0||L!==void 0,F=(w,L,E,j)=>{return async(z,P)=>{if($.connection_type==="VIRTUAL"||G||!X||H(z,P)){let q=await K();return L(q,z,P)}let A=await _O(w,$.id,async()=>{let q=await K(),k=await L(q);return E(k)},X,(q)=>Z.pendingRevalidations.push(q),CO);return j(A??[])}};Y.listTools=F("tools",(w,L,E)=>w.listTools(L,E),(w)=>w.tools,(w)=>({tools:w})),Y.listResources=F("resources",(w,L,E)=>w.listResources(L,E),(w)=>w.resources,(w)=>({resources:w})),Y.listPrompts=F("prompts",(w,L,E)=>w.listPrompts(L,E),(w)=>w.prompts,(w)=>({prompts:w}));let U=y70(),N=$.connection_type!=="VIRTUAL"&&!G,B=async(w,L,E)=>{let j=w?.name,z=U&&N&&typeof j==="string"&&await kG6(X,$.id,j);if(U&&z&&!L)return await U.fetch({type:"tools/call",connectionId:$.id,scope:L71(),params:{name:j,arguments:w?.arguments},fetchLive:async()=>{return(await K()).callTool(w,L,E)},shouldCache:(q)=>q?.isError!==!0,onRevalidation:(q)=>Z.pendingRevalidations.push(q)});let P=await K();if(U&&N&&!z)try{return await P.callTool(w,L,E)}finally{Eg($.id)}return P.callTool(w,L,E)};Y.callTool=async(w,L,E)=>{let j=w?.name,z=typeof j==="string"?j:null,P=w?.arguments,A=async()=>{return(await X.get("tools",$.id).catch(()=>null))?.find((f)=>typeof f==="object"&&f!==null&&f.name===z)?.inputSchema},q=async(m)=>{let f=ah$(m,P);if(!f)return null;return await B({...w,arguments:f},L,E).catch(()=>null)},k;try{k=await B(w,L,E)}catch(m){if(!z||!X||!(m instanceof w1)||m.code!==q1.InvalidParams)throw m;let f=await A(),b=await q(f);if(b&&!cT0(b))return b;throw eh$(m,z,f,P)}if(!z||!X||!cT0(k))return k;let M=await A(),C=await q(M);if(C&&!cT0(C))return C;return $u$(k,w71(z,M,P))},Y.getPrompt=async(w,L)=>{if(!U||!N)return(await K()).getPrompt(w,L);return await U.fetch({type:"prompts/get",connectionId:$.id,scope:L71(),params:w,fetchLive:async()=>{return(await K()).getPrompt(w,L)},onRevalidation:(j)=>Z.pendingRevalidations.push(j)})},Y.readResource=async(w,L)=>{if(!U||!N){if(process.env?.MCP_CACHE_DEBUG)console.log("[mcp-read-cache] BYPASS (VIRTUAL)",$.id,"resources/read");return(await K()).readResource(w,L)}return await U.fetch({type:"resources/read",connectionId:$.id,scope:L71(),params:w,fetchLive:async()=>{return(await K()).readResource(w,L)},onRevalidation:(j)=>Z.pendingRevalidations.push(j)})},Y.listResourceTemplates=async(w,L)=>{return(await K()).listResourceTemplates(w,L)};let O=Y.close.bind(Y);return Y.close=async()=>{if(W=!0,J){let w=await J.catch(()=>null);if(w)await w.close().catch(()=>{})}await O()},Y}var wn=D(()=>{TK();XQ();H9();Ec0();Dn();Cn();nX();Vn();Zu$()});function U11($){return{client:{callTool:$.callTool.bind($),listTools:$.listTools.bind($)}}}async function VG6($,Z,{superUser:Q}){if(!Q&&!Z.organization?.id)throw Error("Organization context is required");let X=typeof $==="string"?await Z.storage.connections.findById($,Z.organization?.id):$;if(!X)throw Error("Connection not found");if(Z.organization&&X.organization_id!==Z.organization.id)throw Error("Connection does not belong to the active organization");if(!Z.organization){let H=await Z.db.selectFrom("organization").select(["id","slug","name"]).where("id","=",X.organization_id).executeTakeFirst();Z.organization=H?{id:H.id,slug:H.slug,name:H.name}:{id:X.organization_id}}if(X.status!=="active")throw Error(`Connection inactive: ${X.status}`);let Y=vO(X,Z,Q,U9()??void 0),G=XE(Y,{name:"mcp-cms-proxy-client",version:"1.0.0"},{capabilities:{tools:{},resources:{},prompts:{}},toolCallTimeoutMs:cx}),{client:J,server:W}=Vh0();await G.connect(W);let K=new c9({name:"mcp-cms-proxy-client",version:"1.0.0"},{jsonSchemaValidator:z5});return await K.connect(J),K}async function Qu$($,Z){return VG6($,Z,{superUser:!1})}var N11=D(()=>{wn();nX();XQ();TK()});function E71($,Z){for(let[Q,X]of Object.entries(Z)){let Y=$[Q];if(!Y||Y.length===0){let J=$["*"];if(!J||J.length===0)return!1;if(J.includes("*"))continue;let W=new Set(J);for(let K of X)if(!W.has(K))return!1;continue}if(Y.includes("*"))continue;let G=new Set(Y);for(let J of X)if(!G.has(J))return!1}return!0}import{sql as j71}from"kysely";function dT0($){if($==null)return null;return typeof $==="string"?$:$.toISOString()}function mT0($){return`msg_async_stub_${$}`}async function z71($,Z){await $.deleteFrom("thread_messages").where("id","=",mT0(Z)).execute(),await $.deleteFrom("thread_message_parts").where("message_id","=",mT0(Z)).execute()}function SG6($){if($==null)return null;if(typeof $!=="string")return $;try{return JSON.parse($)}catch{return null}}function P71($){return{id:$.id,interactionId:$.interaction_id??null,toolCallId:$.tool_call_id,organizationId:$.organization_id,threadId:$.thread_id,messageId:$.message_id??null,provider:$.provider,modelId:$.model_id,query:$.query,status:$.status,attempts:$.attempts??0,lastPolledAt:dT0($.last_polled_at),lastError:$.last_error??null,inputTokens:$.input_tokens??null,outputTokens:$.output_tokens??null,citations:SG6($.citations),resultUri:$.result_uri??null,resultPreview:$.result_preview??null,resultContent:$.result_content??null,createdAt:dT0($.created_at)??"",updatedAt:dT0($.updated_at)??"",completedAt:dT0($.completed_at)}}class A71{inner;organizationId;constructor($,Z){this.inner=$;this.organizationId=Z}requireOrg(){if(!this.organizationId)throw Error("OrgScopedAsyncResearchJobStorage: requires an authenticated organization");return this.organizationId}setOrganizationId($){this.organizationId=$}upsertPending($){return this.inner.upsertPending({organizationId:this.requireOrg(),...$})}findByToolCall($){return this.inner.findByToolCall(this.requireOrg(),$)}markPolling($,Z,Q){return this.inner.markPolling(this.requireOrg(),$,Z,Q)}recordPoll($,Z){return this.inner.recordPoll(this.requireOrg(),$,Z)}markCompleted($,Z){return this.inner.markCompleted(this.requireOrg(),$,Z)}markFailed($,Z){return this.inner.markFailed(this.requireOrg(),$,Z)}markCancelled($,Z){return this.inner.markCancelled(this.requireOrg(),$,Z)}}class Qe{db;constructor($){this.db=$}async upsertPending($){let Z=new Date().toISOString(),Q=await this.db.insertInto("async_research_jobs").values({organization_id:$.organizationId,thread_id:$.threadId,tool_call_id:$.toolCallId,message_id:$.messageId??null,provider:$.provider,model_id:$.modelId,query:$.query,status:"pending",attempts:0,updated_at:Z}).onConflict((Y)=>Y.columns(["organization_id","tool_call_id"]).doNothing()).returningAll().executeTakeFirst();if(Q)return P71(Q);let X=await this.db.selectFrom("async_research_jobs").selectAll().where("organization_id","=",$.organizationId).where("tool_call_id","=",$.toolCallId).executeTakeFirstOrThrow();return P71(X)}async findByToolCall($,Z){let Q=await this.db.selectFrom("async_research_jobs").selectAll().where("organization_id","=",$).where("tool_call_id","=",Z).executeTakeFirst();return Q?P71(Q):null}async markPolling($,Z,Q,X){let Y=new Date().toISOString();await this.db.transaction().execute(async(G)=>{if(await G.updateTable("async_research_jobs").set({status:"polling",interaction_id:Q,last_polled_at:Y,updated_at:Y}).where("organization_id","=",$).where("tool_call_id","=",Z).execute(),(await G.selectFrom("threads").select("message_storage_version").where("id","=",X.threadId).where("organization_id","=",$).executeTakeFirst())?.message_storage_version!==2)return;let W=mT0(Z);await G.insertInto("thread_message_parts").values([{id:`${X.threadId}:${W}:0`,seq:0,org_id:$,thread_id:X.threadId,run_id:X.threadId,message_id:W,role:"assistant",kind:"tool_call",payload:JSON.stringify({type:`tool-${X.toolName}`,toolCallId:Z,state:"input-available",input:{query:X.query}}),payload_ref:null,metadata:null,created_at:Y},{id:`${X.threadId}:${W}:finish`,seq:1,org_id:$,thread_id:X.threadId,run_id:X.threadId,message_id:W,role:"assistant",kind:"finish",payload:JSON.stringify({}),payload_ref:null,metadata:null,created_at:Y}]).onConflict((K)=>K.column("id").doNothing()).execute()})}async recordPoll($,Z,Q){let X=new Date().toISOString();await this.db.updateTable("async_research_jobs").set({attempts:j71`attempts + 1`,last_polled_at:X,...Q!==void 0?{last_error:Q}:{},updated_at:X}).where("organization_id","=",$).where("tool_call_id","=",Z).execute()}async markCompleted($,Z,Q){let X=new Date().toISOString();await this.db.transaction().execute(async(Y)=>{await Y.updateTable("async_research_jobs").set({status:"completed",input_tokens:Q.inputTokens,output_tokens:Q.outputTokens,citations:JSON.stringify(Q.citations),result_uri:Q.resultUri,result_preview:Q.resultPreview,result_content:Q.resultContent,completed_at:X,updated_at:X}).where("organization_id","=",$).where("tool_call_id","=",Z).execute(),await z71(Y,Z)})}async markFailed($,Z,Q){let X=new Date().toISOString();await this.db.transaction().execute(async(Y)=>{await Y.updateTable("async_research_jobs").set({status:"failed",last_error:Q,completed_at:X,updated_at:X}).where("organization_id","=",$).where("tool_call_id","=",Z).execute(),await z71(Y,Z)})}async markCancelled($,Z,Q){let X=new Date().toISOString();await this.db.transaction().execute(async(Y)=>{await Y.updateTable("async_research_jobs").set({status:"cancelled",last_error:Q??null,completed_at:X,updated_at:X}).where("organization_id","=",$).where("tool_call_id","=",Z).execute(),await z71(Y,Z)})}async sweepAbandoned($){let Z=new Date(Date.now()-$).toISOString(),Q=new Date().toISOString();return await this.db.transaction().execute(async(X)=>{let Y=await X.updateTable("async_research_jobs").set({status:"abandoned",completed_at:Q,updated_at:Q,last_error:j71`COALESCE(last_error, '') || ' [abandoned by sweeper]'`}).where("status","in",["pending","polling"]).where(j71`COALESCE(last_polled_at, created_at) < ${Z}::timestamptz`).returning(["tool_call_id"]).execute();if(Y.length===0)return 0;let G=Y.map((J)=>mT0(J.tool_call_id));return await X.deleteFrom("thread_messages").where("id","in",G).execute(),await X.deleteFrom("thread_message_parts").where("message_id","in",G).execute(),Y.length})}}var T71=()=>{};class R71{db;vault;constructor($,Z){this.db=$;this.vault=Z}async get($){let Z=await this.db.selectFrom("subsidized_gateway_keys").select("encrypted_key").where("organization_id","=",$).executeTakeFirst();if(!Z)return null;return await this.vault.decrypt(Z.encrypted_key)}async put($,Z){let Q=await this.vault.encrypt(Z);await this.db.insertInto("subsidized_gateway_keys").values({organization_id:$,encrypted_key:Q}).onConflict((X)=>X.column("organization_id").doUpdateSet({encrypted_key:Q})).execute()}}import{sql as CG6}from"kysely";function Xu$($){return $ instanceof Date?$.toISOString():String($)}class q71{db;vault;constructor($,Z){this.db=$;this.vault=Z}rowToInfo($){return{id:$.id,organizationId:$.organization_id,name:$.name,description:$.description,bucket:$.bucket,region:$.region,endpoint:$.endpoint,forcePathStyle:$.force_path_style,prefix:$.prefix,publicUrlBase:$.public_url_base,credentialType:$.credential_type??"static",refreshUrl:$.refresh_url,siteSlug:$.site_slug,createdBy:$.created_by,createdAt:Xu$($.created_at),updatedBy:$.updated_by,updatedAt:Xu$($.updated_at)}}async create($){let Z=M8("fcfg"),Q=await this.vault.encrypt(JSON.stringify($.credentials)),X=new Date,Y=await this.db.insertInto("org_file_configs").values({id:Z,organization_id:$.organizationId,name:$.name,description:$.description??null,bucket:$.bucket,region:$.region,endpoint:$.endpoint??null,force_path_style:$.forcePathStyle??!1,prefix:$.prefix??null,public_url_base:$.publicUrlBase??null,credential_type:$.credentials.type,refresh_url:$.refreshUrl??null,site_slug:$.siteSlug??null,encrypted_credentials:Q,created_by:$.createdBy,created_at:X,updated_by:$.createdBy,updated_at:X}).returning(iT0).executeTakeFirstOrThrow();return this.rowToInfo(Y)}async update($){if(!await this.db.selectFrom("org_file_configs").where("id","=",$.id).where("organization_id","=",$.organizationId).select(["id"]).executeTakeFirst())throw new Vl($.id);let Q={updated_by:$.updatedBy,updated_at:new Date};if($.name!==void 0)Q.name=$.name;if($.description!==void 0)Q.description=$.description;if($.bucket!==void 0)Q.bucket=$.bucket;if($.region!==void 0)Q.region=$.region;if($.endpoint!==void 0)Q.endpoint=$.endpoint;if($.forcePathStyle!==void 0)Q.force_path_style=$.forcePathStyle;if($.prefix!==void 0)Q.prefix=$.prefix;if($.publicUrlBase!==void 0)Q.public_url_base=$.publicUrlBase;if($.refreshUrl!==void 0)Q.refresh_url=$.refreshUrl;if($.siteSlug!==void 0)Q.site_slug=$.siteSlug;if($.credentials!==void 0)Q.credential_type=$.credentials.type,Q.encrypted_credentials=await this.vault.encrypt(JSON.stringify($.credentials));let X=await this.db.updateTable("org_file_configs").set(Q).where("id","=",$.id).where("organization_id","=",$.organizationId).returning(iT0).executeTakeFirstOrThrow();return this.rowToInfo(X)}async delete($,Z){if(!await this.db.selectFrom("org_file_configs").where("id","=",$).where("organization_id","=",Z).select(["id"]).executeTakeFirst())throw new Vl($);await this.db.deleteFrom("org_file_configs").where("id","=",$).where("organization_id","=",Z).execute()}async list($){return(await this.db.selectFrom("org_file_configs").where("organization_id","=",$).select(iT0).orderBy("created_at","desc").execute()).map((Q)=>this.rowToInfo(Q))}async findById($,Z){let Q=await this.db.selectFrom("org_file_configs").where("id","=",$).where("organization_id","=",Z).select(iT0).executeTakeFirst();if(!Q)throw new Vl($);return this.rowToInfo(Q)}async resolveById($,Z){let Q=await this.db.selectFrom("org_file_configs").where("id","=",$).where("organization_id","=",Z).selectAll().executeTakeFirst();if(!Q)throw new Vl($);return{info:this.rowToInfo(Q),credentials:await this.decodeCredentials(Q)}}async resolveByName($){let Z=await this.db.selectFrom("org_file_configs").where("organization_id","=",$.organizationId).where(CG6`lower(name) = lower(${$.name})`).selectAll().executeTakeFirst();if(!Z)throw new Vl($.name);return{info:this.rowToInfo(Z),credentials:await this.decodeCredentials(Z)}}async decodeCredentials($){if($.credential_type==="managed")return{type:"managed"};let Z=await this.vault.decrypt($.encrypted_credentials),Q=JSON.parse(Z);if(($.credential_type??"static")==="sts-session")return{type:"sts-session",apiKey:String(Q.apiKey)};return{type:"static",accessKeyId:String(Q.accessKeyId),secretAccessKey:String(Q.secretAccessKey)}}}var iT0,Vl;var Yu$=D(()=>{YQ();iT0=["id","organization_id","name","description","bucket","region","endpoint","force_path_style","prefix","public_url_base","credential_type","refresh_url","site_slug","created_by","created_at","updated_by","updated_at"];Vl=class Vl extends Error{constructor($){super(`File config ${$} not found`);this.name="OrgFileConfigNotFoundError"}}});function Gu$($){return $ instanceof Date?$.toISOString():String($)}function Xe($){return{slug:$.slug,organizationId:$.organization_id,source:$.source,createdBy:$.created_by,createdAt:Gu$($.created_at),updatedBy:$.updated_by,updatedAt:Gu$($.updated_at)}}class Wf{db;constructor($){this.db=$}async claimSite($){if(!WX($.slug))throw Error(`Invalid site slug "${$.slug}" \u2014 must be 1-60 chars of lowercase letters, digits, or hyphens, starting with a letter or digit`);let Z=new Date,Q=await this.db.insertInto("org_sites").values({slug:$.slug,organization_id:$.organizationId,source:$.source??"deco-import",created_by:$.by,created_at:Z,updated_by:$.by,updated_at:Z}).onConflict((G)=>G.column("slug").doNothing()).returningAll().executeTakeFirst();if(Q)return Xe(Q);let X=await this.getBySlug($.slug);if(!X)throw new Ye($.slug,"unknown");if(X.organizationId!==$.organizationId)throw new Ye($.slug,X.organizationId);let Y=await this.db.updateTable("org_sites").set({source:$.source??X.source,updated_by:$.by,updated_at:Z}).where("slug","=",$.slug).where("organization_id","=",$.organizationId).returningAll().executeTakeFirstOrThrow();return Xe(Y)}async reassignSite($){if(!WX($.slug))throw Error(`Invalid site slug "${$.slug}" \u2014 must be 1-60 chars of lowercase letters, digits, or hyphens, starting with a letter or digit`);let Z=new Date,Q=await this.db.insertInto("org_sites").values({slug:$.slug,organization_id:$.organizationId,source:$.source??"manual",created_by:$.by,created_at:Z,updated_by:$.by,updated_at:Z}).onConflict((X)=>X.column("slug").doUpdateSet({organization_id:$.organizationId,source:$.source??"manual",updated_by:$.by,updated_at:Z})).returningAll().executeTakeFirstOrThrow();return Xe(Q)}async releaseSite($,Z){let Q=await this.db.deleteFrom("org_sites").where("slug","=",$).where("organization_id","=",Z).executeTakeFirst();return Number(Q.numDeletedRows??0n)>0}async getBySlug($){let Z=await this.db.selectFrom("org_sites").selectAll().where("slug","=",$).executeTakeFirst();return Z?Xe(Z):null}async listByOrg($){return(await this.db.selectFrom("org_sites").selectAll().where("organization_id","=",$).orderBy("slug","asc").execute()).map((Q)=>Xe(Q))}async isOwnedBy($,Z){return!!await this.db.selectFrom("org_sites").select("slug").where("slug","=",$).where("organization_id","=",Z).executeTakeFirst()}}var Ye;var I71=D(()=>{HU();Ye=class Ye extends Error{slug;ownerOrganizationId;constructor($,Z){super(`Site slug "${$}" is already owned by another organization`);this.slug=$;this.ownerOrganizationId=Z;this.name="OrgSiteConflictError"}}});class M71{db;constructor($){this.db=$}async create($){await this.deleteExpired($.organizationId);let Z=crypto.randomUUID();return await this.db.insertInto("git_provider_oauth_states").values({id:Z,organization_id:$.organizationId,user_id:$.userId,provider:$.provider,host:$.host,return_to:$.returnTo,expires_at:new Date(Date.now()+600000)}).execute(),Z}async consume($){let Z=await this.db.deleteFrom("git_provider_oauth_states").where("id","=",$).returningAll().executeTakeFirst();if(!Z)return null;if((Z.expires_at instanceof Date?Z.expires_at:new Date(Z.expires_at))<new Date)return null;return{organizationId:Z.organization_id,userId:Z.user_id,provider:Z.provider,host:Z.host,returnTo:Z.return_to}}async deleteExpired($){await this.db.deleteFrom("git_provider_oauth_states").where("organization_id","=",$).where("expires_at","<",new Date).execute()}}function Ju$($){return $ instanceof Date?$.toISOString():String($)}class wN{db;vault;constructor($,Z){this.db=$;this.vault=Z}async toEntity($){return{id:$.id,organizationId:$.organization_id,siteUrl:$.site_url,email:$.email,apiToken:await this.vault.decrypt($.api_token),boardId:$.board_id,boardName:$.board_name,webhookSecret:$.webhook_secret,enabled:$.enabled,createdBy:$.created_by,createdAt:Ju$($.created_at),updatedAt:Ju$($.updated_at)}}async getByOrg($){let Z=await this.db.selectFrom("org_jira_integrations").selectAll().where("organization_id","=",$).executeTakeFirst();return Z?this.toEntity(Z):null}async upsert($){let Z=await this.vault.encrypt($.apiToken),Q=await this.db.insertInto("org_jira_integrations").values({organization_id:$.organizationId,site_url:$.siteUrl,email:$.email,api_token:Z,board_id:$.boardId,board_name:$.boardName,enabled:$.enabled,created_by:$.createdBy}).onConflict((X)=>X.column("organization_id").doUpdateSet({site_url:$.siteUrl,email:$.email,api_token:Z,board_id:$.boardId,board_name:$.boardName,enabled:$.enabled,updated_at:new Date})).returningAll().executeTakeFirstOrThrow();return this.toEntity(Q)}async getByWebhookSecret($){let Z=await this.db.selectFrom("org_jira_integrations").selectAll().where("webhook_secret","=",$).executeTakeFirst();return Z?this.toEntity(Z):null}async delete($){return(await this.db.deleteFrom("org_jira_integrations").where("organization_id","=",$).executeTakeFirst()).numDeletedRows>0n}async getById($){let Z=await this.db.selectFrom("org_jira_integrations").selectAll().where("id","=",$).executeTakeFirst();return Z?this.toEntity(Z):null}async listEnabledIds(){return(await this.db.selectFrom("org_jira_integrations").select("id").where("enabled","=",!0).orderBy("created_at","asc").execute()).map((Z)=>Z.id)}async getLinkByIssueId($,Z){let Q=await this.db.selectFrom("task_board_item_jira_links").select(["item_id","jira_issue_id","jira_issue_key"]).where("organization_id","=",$).where("jira_issue_id","=",Z).executeTakeFirst();return Q?Wu$(Q):null}async getLinkByItemId($,Z){let Q=await this.db.selectFrom("task_board_item_jira_links").select(["item_id","jira_issue_id","jira_issue_key"]).where("item_id","=",$).where("organization_id","=",Z).executeTakeFirst();return Q?Wu$(Q):null}async createLink($){await this.db.insertInto("task_board_item_jira_links").values({item_id:$.itemId,organization_id:$.organizationId,jira_issue_id:$.jiraIssueId,jira_issue_key:$.jiraIssueKey}).onConflict((Z)=>Z.doNothing()).execute()}async claimTrigger($,Z,Q){return((await this.db.insertInto("jira_trigger_claims").values({organization_id:$,jira_issue_id:Z,changelog_id:Q}).onConflict((Y)=>Y.doNothing()).executeTakeFirst()).numInsertedOrUpdatedRows??0n)>0n}async listAutomations($){return(await this.db.selectFrom("org_jira_column_automations").select(["jira_status","prompt"]).where("organization_id","=",$).orderBy("jira_status","asc").execute()).map((Q)=>({jiraStatus:Q.jira_status,prompt:Q.prompt}))}async getAutomation($,Z){let Q=await this.db.selectFrom("org_jira_column_automations").select(["jira_status","prompt"]).where("organization_id","=",$).where("jira_status","=",Z).executeTakeFirst();return Q?{jiraStatus:Q.jira_status,prompt:Q.prompt}:null}async upsertAutomation($,Z,Q){return await this.db.insertInto("org_jira_column_automations").values({organization_id:$,jira_status:Z,prompt:Q}).onConflict((X)=>X.columns(["organization_id","jira_status"]).doUpdateSet({prompt:Q,updated_at:new Date})).execute(),{jiraStatus:Z,prompt:Q}}async removeAutomation($,Z){return((await this.db.deleteFrom("org_jira_column_automations").where("organization_id","=",$).where("jira_status","=",Z).executeTakeFirst()).numDeletedRows??0n)>0n}}function Wu$($){return{itemId:$.item_id,jiraIssueId:$.jira_issue_id,jiraIssueKey:$.jira_issue_key}}class k71{db;constructor($){this.db=$}async listByOrg($){return(await this.db.selectFrom("task_board_column_automations").select(["column_key","prompt"]).where("organization_id","=",$).orderBy("column_key","asc").execute()).map((Q)=>({columnKey:Q.column_key,prompt:Q.prompt}))}async get($,Z){let Q=await this.db.selectFrom("task_board_column_automations").select(["column_key","prompt"]).where("organization_id","=",$).where("column_key","=",Z).executeTakeFirst();if(!Q)return null;let X=Q;return{columnKey:X.column_key,prompt:X.prompt}}async upsert($,Z,Q){return await this.db.insertInto("task_board_column_automations").values({id:`tbca_${$}_${Z}`,organization_id:$,column_key:Z,prompt:Q}).onConflict((X)=>X.columns(["organization_id","column_key"]).doUpdateSet({prompt:Q,updated_at:new Date})).execute(),{columnKey:Z,prompt:Q}}async remove($,Z){return((await this.db.deleteFrom("task_board_column_automations").where("organization_id","=",$).where("column_key","=",Z).executeTakeFirst()).numDeletedRows??0n)>0n}}class V71{db;constructor($){this.db=$}async listByOrg($){return(await this.db.selectFrom("task_board_prompts").select(["column_key","prompt"]).where("organization_id","=",$).orderBy("column_key","asc").execute()).map((Q)=>({columnKey:Q.column_key,prompt:Q.prompt})).sort((Q,X)=>Q.columnKey===null?-1:X.columnKey===null?1:0)}async promptFor($,Z){let X=(await this.listByOrg($)).filter((Y)=>Y.columnKey===null||Y.columnKey===Z).map((Y)=>Y.prompt.trim()).filter(Boolean);return X.length>0?X.join(`
|
|
2713
2713
|
|
|
2714
2714
|
`):void 0}async upsert($,Z,Q){return await this.db.insertInto("task_board_prompts").values({id:Ku$($,Z),organization_id:$,column_key:Z,prompt:Q}).onConflict((X)=>X.column("id").doUpdateSet({prompt:Q,updated_at:new Date})).execute(),{columnKey:Z,prompt:Q}}async remove($,Z){return((await this.db.deleteFrom("task_board_prompts").where("id","=",Ku$($,Z)).where("organization_id","=",$).executeTakeFirst()).numDeletedRows??0n)>0n}}var Ku$=($,Z)=>`tbp_${$}_${Z??""}`;function S71($){let Z=new Set;for(let Q of $.matchAll(_G6))if(Z.add(Q[2]),Z.size>=50)break;return[...Z]}var _G6;var Hu$=D(()=>{_G6=/\[@([^\]]+)\]\(mention:([^)\s]+)\)/g});async function Fu$($){let{db:Z,organizationId:Q,actorId:X}=$;try{let Y=new Set(S71($.previousBody??"")),J=S71($.body).filter((H)=>!Y.has(H)).filter((H)=>H!==X);if(J.length===0)return;let K=(await Z.selectFrom("member").select("userId").where("organizationId","=",Q).where("userId","in",J).execute()).map((H)=>H.userId);if(K.length===0)return;await qh({db:Z,taskBoardItemId:$.taskBoardItemId,type:"mentioned",actorId:X,alsoSubscribe:K,recipients:K})}catch(Y){console.error("[notifications] mention fan-out failed",Y)}}var Uu$=D(()=>{Hu$();dL0()});import{sql as vG6}from"kysely";class C71{db;constructor($){this.db=$}async listUnread($,Z,Q={}){let X=Math.min(Q.limit??fG6,bG6),Y=Q.cursor?await this.anchorExists(Q.cursor):!1,G=this.db.selectFrom("notifications").select(["id","task_board_item_id","type","data","created_at"]).where("user_id","=",$).where("organization_id","=",Z).where("read_at","is",null).orderBy("created_at","desc").orderBy("id","desc").limit(X+1);if(Y)G=G.where(vG6`(created_at, id) <
|
|
2715
|
-
(SELECT created_at, id FROM notifications WHERE id = ${Q.cursor})`);let J=await G.execute(),W=J.slice(0,X),K=await this.db.selectFrom("notifications").select((F)=>F.fn.countAll().as("count")).where("user_id","=",$).where("organization_id","=",Z).where("read_at","is",null).executeTakeFirst(),H=W[W.length-1];return{nextCursor:J.length>X&&H?H.id:null,notifications:W.map((F)=>({id:F.id,taskBoardItemId:F.task_board_item_id,type:F.type,data:Rh.parse(F.data),createdAt:xG6(F.created_at)})),unreadCount:Number(K?.count??0)}}async anchorExists($){return!!await this.db.selectFrom("notifications").select("id").where("id","=",$).executeTakeFirst()}async markRead($,Z,Q){if(Q&&Q.length===0)return 0;let X=this.db.updateTable("notifications").set({read_at:new Date}).where("user_id","=",$).where("organization_id","=",Z).where("read_at","is",null);if(Q)X=X.where("id","in",Q);let Y=await X.executeTakeFirst();return Number(Y.numUpdatedRows??0n)}async setSubscribed($,Z,Q){await this.db.insertInto("notification_subscriptions").values({id:M8("nsub"),user_id:$,task_board_item_id:Z,subscribed:Q}).onConflict((X)=>X.columns(["user_id","task_board_item_id"]).doUpdateSet({subscribed:Q,updated_at:new Date})).execute()}async notify($){await qh({...$,db:this.db})}async notifyMentions($){await Fu$({...$,db:this.db})}async listSubscribers($){return(await this.db.selectFrom("notification_subscriptions").select("user_id").where("task_board_item_id","=",$).where("subscribed","=",!0).execute()).map((Q)=>Q.user_id)}}var fG6=20,bG6=50,xG6=($)=>$ instanceof Date?$.toISOString():$;var Nu$=D(()=>{YQ();cL0();dL0();Uu$()});class _71{db;constructor($){this.db=$}async create($,Z,Q){let X=crypto.randomUUID(),Y=new Date(Date.now()+600000);return await this.db.insertInto("oauth_pkce_states").values({id:X,organization_id:Z,user_id:Q,code_verifier:$,expires_at:Y,created_at:new Date}).execute(),X}async consume($,Z,Q){let X=await this.db.deleteFrom("oauth_pkce_states").where("id","=",$).where("organization_id","=",Z).where("user_id","=",Q).returningAll().executeTakeFirst();if(!X)throw Error("Invalid or expired OAuth state token");if((X.expires_at instanceof Date?X.expires_at:new Date(X.expires_at))<new Date)throw Error("OAuth state token has expired");return X.code_verifier}}class v71{db;vault;constructor($,Z){this.db=$;this.vault=Z}async upsert($){let Z=await this.vault.encrypt($.accessToken),Q=$.expiresAt??null,X=new Date;return await this.db.insertInto("claude_subscriptions").values({user_id:$.userId,encrypted_access_token:Z,expires_at:Q,created_at:X}).onConflict((Y)=>Y.column("user_id").doUpdateSet({encrypted_access_token:Z,expires_at:Q,created_at:X})).execute(),{linkedAt:X.toISOString(),expiresAt:Q?.toISOString()??null}}async find($){let Z=await this.db.selectFrom("claude_subscriptions").select(["created_at","expires_at"]).where("user_id","=",$).executeTakeFirst();if(!Z)return null;return{linkedAt:new Date(Z.created_at).toISOString(),expiresAt:Z.expires_at?new Date(Z.expires_at).toISOString():null}}async findLiveToken($){let Z=await this.db.selectFrom("claude_subscriptions").select(["encrypted_access_token","expires_at"]).where("user_id","=",$).executeTakeFirst();if(!Z)return null;if(Z.expires_at&&new Date(Z.expires_at).getTime()<=Date.now())return null;return this.vault.decrypt(Z.encrypted_access_token)}async delete($){await this.db.deleteFrom("claude_subscriptions").where("user_id","=",$).execute()}}function yG6($){return $.includes("/")?$.split("/").slice(1).join("/"):$}function gG6($){let Z=$.supported_parameters.includes("tools"),Q=$.supported_parameters.includes("reasoning");return{providerId:"openrouter",modelId:yG6($.id),title:$.name,description:$.description||null,logo:null,capabilities:[...new Set([...$.architecture.input_modalities.map((X)=>X==="image"?"vision":X),...$.architecture.output_modalities,...Z?["tools"]:[],...Q?["reasoning"]:[]])],limits:{contextWindow:$.context_length,maxOutputTokens:$.top_provider.max_completion_tokens||null},costs:{input:$.pricing.prompt,output:$.pricing.completion}}}function Ou$($){let Z=new Map;for(let Q of $){let X={description:Q.description,capabilities:Q.capabilities,limits:Q.limits,costs:Q.costs};Z.set(Q.modelId,X);let Y=Q.modelId.replace(/\./g,"-");if(Y!==Q.modelId)Z.set(Y,X)}return Z}async function hG6($){if($){let Z=await $.get(Bu$,"openrouter");if(Z)return Ou$(Z)}try{let Z=await fetch("https://openrouter.ai/api/v1/models",{signal:AbortSignal.timeout(1e4)});if(!Z.ok)return new Map;let{data:Q}=await Z.json(),X=Q.map(gG6);if($)await $.set(Bu$,"openrouter",X);return Ou$(X)}catch{return new Map}}function uG6($){let Z=$.replace(/\./g,"-"),Q=$.replace(/-\d{8}$/,""),X=Q.replace(/\./g,"-");return[...new Set([$,Z,Q,X])]}function lG6($){return $.providerId==="anthropic"||$.modelId.startsWith("anthropic/")}function wu$($,Z){if(lG6(Z)&&$.includes("vision")&&!$.includes("file"))return[...$,"file"];return $}function cG6($,Z){return $.map((Q)=>{let Y=uG6(Q.modelId).map((W)=>Z.get(W)).find(Boolean),G=Q.capabilities.length?Q.capabilities:Y?.capabilities??[],J=wu$(G,Q);if(!Y)return J===G?Q:{...Q,capabilities:J};return{...Q,description:Q.description??Y.description??null,capabilities:J,limits:Q.limits??Y.limits??null,costs:Q.costs??Y.costs??null}})}class f71{storage;cache;constructor($,Z){this.storage=$;this.cache=Z}async activate($,Z){let{keyInfo:Q,apiKey:X}=await this.storage.resolve($,Z),Y=b7()[Q.providerId];if(!Y)throw Error(`Unknown provider: ${Q.providerId}`);return Y.create(X)}async listModels($,Z){let{keyInfo:Q,apiKey:X}=await this.storage.resolve($,Z),Y=Q.providerId,G=b7()[Y];if(!G)throw Error(`Unknown provider: ${Y}`);if(this.cache){let U=await this.cache.get(Z,Y);if(U)return Du$(U,G,X)}let W=await G.create(X).listModels(),K=new Set,H=W.filter((U)=>{if(U.deprecated)return!1;if(K.has(U.modelId))return!1;return K.add(U.modelId),!0});if(Y!=="openrouter"){let U=await hG6(this.cache);H=cG6(H,U)}else H=H.map((U)=>({...U,capabilities:wu$(U.capabilities,U)}));let F=H.map((U)=>({...U,providerId:Y}));if(this.cache)await this.cache.set(Z,Y,F);return Du$(F,G,X)}}function Du$($,Z,Q){let Y=Z.create(Q).asyncResearch;if(!Y)return $;return $.map((G)=>Y.canHandle(G.modelId)?{...G,asyncResearch:!0}:G)}var Bu$="_global";var Lu$=D(()=>{ZN()});import{SpanStatusCode as Eu$}from"@opentelemetry/api";function dG6($){if(!$)return;try{let Z=JSON.parse($);if(typeof Z!=="object"||Z===null||Array.isArray(Z))return;let Q={};for(let[X,Y]of Object.entries(Z))if(typeof Y==="string")Q[X]=Y;return Object.keys(Q).length>0?Q:void 0}catch{return}}function mG6($,Z){return Z?.connectionId??$?.headers.get("x-caller-id")??void 0}function iG6($){try{let Z=new URL($.url).pathname.split("/").filter(Boolean);if(Z[0]==="api"&&Z[1])return decodeURIComponent(Z[1])}catch{}return}function x71($){let{auth:Z,headers:Q,role:X,permissions:Y,userId:G,apiKeyId:J,organizationId:W}=$,K=!!J,H=Z.api.hasPermission;return{isApiKeyPrincipal:K,hasPermission:async(F,U)=>{if(K)return E71(Y??{},F);let N=!!U?.organizationId&&!!W&&U.organizationId!==W,B=U?U.role:X;if(UZ(B))return!0;if(Y&&!N)return E71(Y,F);let O=og$(U?.role,F,rg$());if(O!=="fallback")return O==="grant";if(!H)return console.error("[Auth] hasPermission API not available"),!1;let w=U?.organizationId?{organizationId:U.organizationId}:{};try{if((await H({headers:Q,body:{permission:F,...w}}))?.success===!0)return!0;let E=pn1(F);return(await H({headers:Q,body:{permission:E,...w}}))?.success===!0}catch(L){let E=L?.statusCode;if(E!==401&&E!==403)console.error("[Auth] Permission check failed:",L instanceof Error?L.message:String(L));return!1}},organization:{create:async(F)=>{return Z.api.createOrganization({body:F})},update:async(F)=>{return Z.api.updateOrganization({headers:Q,body:F})},delete:async(F)=>{await Z.api.deleteOrganization({headers:Q,body:{organizationId:F}})},get:async(F)=>{return Z.api.getFullOrganization({headers:Q,query:F?{organizationId:F}:void 0})},list:async()=>{return(await Z.api.listOrganizations({headers:Q})).filter((U)=>!p9(U))},addMember:async(F)=>{return Z.api.addMember({body:F})},removeMember:async(F)=>{return Z.api.removeMember({headers:Q,body:F})},listMembers:async(F)=>{return Z.api.listMembers({headers:Q,query:F?{organizationId:F.organizationId,limit:F.limit,offset:F.offset,filterField:F.filterField,filterValue:F.filterValue}:void 0})},updateMemberRole:async(F)=>{return Z.api.updateMemberRole({headers:Q,body:F})}},apiKey:{create:async(F)=>{return Z.api.createApiKey({body:{...F,userId:G}})},list:async()=>{return Z.api.listApiKeys({headers:Q})},update:async(F)=>{return Z.api.updateApiKey({body:{...F,userId:G}})},delete:async(F)=>{await Z.api.deleteApiKey({headers:Q,body:{keyId:F}})}}}}async function mo($,Z,Q){if(Hx.includes(Q))return;let X=await $.selectFrom("organizationRole").select(["permission"]).where("organizationId","=",Z).where("role","=",Q).executeTakeFirst();if(!X?.permission)return;try{return JSON.parse(X.permission)}catch{console.error(`[Auth] Failed to parse permissions for role: ${Q}`);return}}async function zu$($,Z,Q,X){let Y=ju$.get(Q);if(Y&&Date.now()-Y.at<pG6)return Y.archived;let G=await Z.measure(X,()=>$.selectFrom("organization").select(["metadata"]).where("id","=",Q).executeTakeFirst()),J=p9(G);return ju$.set(Q,{archived:J,at:Date.now()}),J}async function b71($,Z,Q,X,Y){let G=Y?.get(Q,X);if(G)return G;let W=(await Z.measure("auth_query_membership",()=>$.selectFrom("member").select(["member.role"]).where("member.userId","=",Q).where("member.organizationId","=",X).executeTakeFirst()))?.role;if(W)Y?.set(Q,X,W);return W}function nG6($,Z){if(!$)return!0;return Z===$}async function tG6($,Z,Q,X,Y){let G=ZZ0($.headers,"token");if(!G)return;let J=await Q.measure("auth_verify_onbehalf_studio_jwt",()=>nx0(G));if(!J?.sub)return;let W=J.metadata?.organizationId;if(!nG6(X,W))return;let K=X?await b71(Z,Q,J.sub,X,Y):J.user?.role??void 0;return{id:J.sub,email:J.user?.email,name:J.user?.name,role:K}}async function oG6($,Z,Q,X=Au$,Y){let G=$.headers.get("Authorization");try{let J=new Headers($.headers);J.set("X-MCP-Session-Auth","true");let W=await X.measure("auth_get_mcp_session",()=>Z.api.getMcpSession({headers:J}));if(W){let K=W.userId,H=$.headers.get("x-org-id"),F=$.headers.get("x-org-slug"),U=iG6($),N=await X.measure("auth_query_membership",()=>{let L=Q.selectFrom("member").innerJoin("organization","organization.id","member.organizationId").select(["member.role","member.organizationId","organization.id as orgId","organization.slug as orgSlug","organization.name as orgName","organization.metadata as orgMetadata"]).where("member.userId","=",K);if(U)return L.where("organization.slug","=",U).executeTakeFirst();if(H)return L.where("organization.id","=",H).executeTakeFirst();if(F)return L.where("organization.slug","=",F).executeTakeFirst();return L.orderBy("member.createdAt","asc").limit(2).execute().then((E)=>E.length===1?E[0]:void 0)});if(p9({metadata:N?.orgMetadata}))throw Error("Organization is archived");let B=N?.role,O=N?{id:N.orgId,slug:N.orgSlug,name:N.orgName}:void 0;if(N&&B)Y?.set(K,N.organizationId,B);let w;if(N&&B)w=await X.measure("auth_fetch_role_permissions",()=>mo(Q,N.organizationId,B));return{user:{id:K,role:B},role:B,permissions:w,organization:O}}}catch(J){console.error("[Auth] OAuth session check failed:",J)}if(G?.startsWith("Bearer ")){let J=G.replace("Bearer ","").trim();try{let W=await X.measure("auth_verify_studio_token",()=>nx0(J));if(W){let K,H=W.metadata?.organizationId;if(W.sub&&H)K=await b71(Q,X,W.sub,H,Y);let F,U=W.metadata?.organizationId;if(U){let N=W.metadata?.organizationName,B=W.metadata?.organizationSlug;if(N||B){if(await zu$(Q,X,U,"auth_query_org_archived_for_studio_token"))return{user:void 0};F={id:U,name:N,slug:B}}else{let O=await X.measure("auth_query_org_for_studio_token",()=>Q.selectFrom("organization").select(["id","slug","name","metadata"]).where("id","=",U).executeTakeFirst());if(p9(O))return{user:void 0};F=O?{id:O.id,slug:O.slug,name:O.name}:{id:U}}}return{user:{id:W.sub,connectionId:W.metadata?.connectionId,role:K},role:K,permissions:W.permissions,tokenOrganizationId:H,organization:F}}}catch{}try{let W=await X.measure("auth_verify_api_key",()=>Z.api.verifyApiKey({body:{key:J}}));if(W?.valid&&W.key){let K=W.key.metadata?.organization;if(K?.id&&await zu$(Q,X,K.id,"auth_query_org_for_api_key"))return{user:void 0};let H=W.key.permissions,F,U=W.key.userId;if(U&&K?.id)F=await b71(Q,X,U,K.id,Y);let N=await tG6($,Q,X,K?.id,Y);return{apiKeyId:W.key.id,user:N??{id:W.key.userId,role:F},role:N?N.role:F,permissions:H,apiKey:{id:W.key.id,name:W.key.name??"",userId:W.key.userId,metadata:W.key.metadata},tokenOrganizationId:K?.id,organization:K?{id:K.id,slug:K.slug,name:K.name}:void 0}}}catch(W){let K=W;if(K.body?.code==="INVALID_API_KEY"||K.message?.includes("Invalid API key"))console.warn("[Auth] invalid API key (Bearer)",{path:new URL($.url).pathname,method:$.method,ua:$.headers.get("user-agent")??void 0,ip:$.headers.get("x-forwarded-for")??$.headers.get("x-real-ip")??void 0,tokenPrefix:J.slice(0,8)});else console.error("[Auth] API key check failed:",K)}}try{let J=new Headers($.headers);J.delete("Authorization");let W=await X.measure("auth_get_session",()=>Z.api.getSession({headers:J}));if(W){let K,H,F=$.headers.get("x-org-id"),U=$.headers.get("x-org-slug");if(!F&&!U&&$.method.toUpperCase()==="GET")try{let N=new URL($.url).searchParams;F=N.get("x-org-id"),U=N.get("x-org-slug")}catch{}if(F||U){let N=await X.measure("auth_query_membership_from_header",()=>{let B=Q.selectFrom("member").innerJoin("organization","organization.id","member.organizationId").select(["member.role","organization.id as orgId","organization.slug as orgSlug","organization.name as orgName","organization.metadata as orgMetadata"]).where("member.userId","=",W.user.id);if(F)B=B.where("organization.id","=",F);else if(U)B=B.where("organization.slug","=",U);return B.executeTakeFirst()});if(p9({metadata:N?.orgMetadata}))throw Error("Organization is archived");if(N)K={id:N.orgId,slug:N.orgSlug,name:N.orgName},H=N.role}else if(W.session.activeOrganizationId){let N=await X.measure("auth_get_full_organization",()=>Z.api.getFullOrganization({headers:J}).catch(()=>null));if(N){if(p9(N))throw Error("Organization is archived");K={id:N.id,slug:N.slug,name:N.name},H=N.members?.find((O)=>O.userId===W.user.id)?.role}else K={id:W.session.activeOrganizationId,slug:"",name:""}}return{user:{id:W.user.id,email:W.user.email,emailVerified:!!W.user.emailVerified,name:W.user.name,image:W.user.image??void 0,role:H},role:H,organization:K}}}catch(J){let W=J;console.error("[Auth] Session check failed:",JSON.stringify({message:W.message,body:W.body,stack:W.stack},null,2))}return{user:void 0}}async function Tu$($){let Z=new oQ($.encryption.key),Q=M0(),X=Q.clickhouseUrl,Y=!!X,G=!Y&&!!Q.monitoringS3Bucket,J=Y?"clickhouse":"duckdb",{resolve:W}=await import("path"),K=W(K3()),H=W(WF()),F=(A)=>`read_ndjson('${K}/${A}/**/*.ndjson', auto_detect=true)`,U=(A)=>`read_ndjson('${H}/${A}/**/*.ndjson', auto_detect=true)`,N,B,O,w,L=!1;if($.monitoringEngines)N=$.monitoringEngines.monitoringEngine,B=$.monitoringEngines.metricEngine,O=F,w=U;else if(Y){let A=Q.clickhouseMaxMemoryUsage?{maxMemoryUsage:String(Q.clickhouseMaxMemoryUsage)}:void 0;N=new Ip(X,A),B=new Ip(X,A),O=(q)=>"studio_monitoring_logs",w=(q)=>"studio_monitoring_logs"}else if(G){let A=Q.monitoringS3AccessKeyId??Q.s3AccessKeyId,q=Q.monitoringS3SecretAccessKey??Q.s3SecretAccessKey,k=Q.duckdbExtensionDirectory;if(!A||!q||!k)throw Error("MONITORING_S3_BUCKET is set but the GCS monitoring path is misconfigured: MONITORING_S3_ACCESS_KEY_ID/S3_ACCESS_KEY_ID, MONITORING_S3_SECRET_ACCESS_KEY/S3_SECRET_ACCESS_KEY, and DUCKDB_EXTENSION_DIRECTORY are all required.");let M={endpoint:Q.monitoringS3Endpoint??Q.s3Endpoint??"storage.googleapis.com",region:Q.monitoringS3Region??Q.s3Region,accessKeyId:A,secretAccessKey:q,extensionDirectory:k},C=new qp(M,{memoryLimit:Q.duckdbMemoryLimit,threads:Q.duckdbThreads});N=C,B=C;let m=Q.monitoringS3Bucket,f=Q.monitoringS3Prefix??"",b=(n,l)=>In1({bucket:m,prefix:f,range:l});O=b,w=b,L=!0}else{let{engine:A}=await al0({basePath:K3()}),{engine:q}=await al0({basePath:WF()});N=A,B=q,O=F,w=U}let E=new Ih($.db),j=new Qe($.db),z=new Sp($.db),P={connections:new Bi($.db,Z),connectionCredentialVault:new Bu0($.db),organizationSettings:new fE($.db),userModelPreferences:new $c0($.db),monitoring:new zu0(N,O,B,w,J,L),virtualMcps:new mx($.db),users:new Dc0($.db),tags:new Cp($.db),organizationBilling:new vK($.db),virtualMcpPluginConfigs:new Zc0($.db),aiProviderKeys:new Yn($.db,Z,$.providerKeyCache),subsidizedGatewayKeys:new R71($.db,Z),secrets:new cr0($.db,Z),orgFileConfigs:new q71($.db,Z),orgSites:new Wf($.db),orgRepoSyncs:new Ij($.db),gitProviderAccounts:new Rg($.db),gitProviderAccountCredentials:new rn($.db,Z),gitProviderOAuthStates:new M71($.db),repositories:new sn($.db),jiraIntegrations:new wN($.db,Z),taskBoard:new PG($.db),columnAutomations:new k71($.db),taskBoardPrompts:new V71($.db),notifications:new C71($.db),orgFsEntries:new Um($.db),oauthPkceStates:new _71($.db),claudeSubscriptions:new v71($.db,Z),automations:l90($.db),triggerCallbackTokens:new kp($.db),orgSsoConfig:new Kc0($.db,Z),orgSsoSessions:new Hc0($.db),registry:{items:new my($.db),publishRequests:new iy($.db),publishApiKeys:new py($.db),monitorRuns:new s90($.db),monitorResults:new a90($.db),monitorConnections:new e90($.db)},brandContext:new Vp($.db),organizationDomains:new ZG($.db),organizationJoinRequests:new dy($.db),kv:z,interests:new Wc0(z)};return async(A,q)=>{let k=q?.timings??Au$,M=lT0(),C=A?await $.observability.tracer.startActiveSpan("studio.auth",async(P0)=>{try{let x0=await oG6(A,$.auth,$.db,k,$.memberRoleCache);return P0.setStatus({code:Eu$.OK}),x0}catch(x0){throw P0.setStatus({code:Eu$.ERROR,message:x0.message}),P0.recordException(x0),x0}finally{P0.end()}}):{user:void 0},m=mG6(A,C.user),f=x71({auth:$.auth,headers:A?.headers??new Headers,role:C.role,permissions:C.permissions,userId:C.user?.id,apiKeyId:C.apiKeyId,organizationId:C.organization?.id}),b={user:C.user,tokenOrganizationId:C.tokenOrganizationId};if(C.apiKey)b.apiKey=C.apiKey;let n=C.organization,l=A?M0().baseUrl??`${new URL(A.url).origin}`:K9(),r=new nL(b.user?.id,void 0,f,C.role,"self",void 0,n?.id),N0={...P,virtualMcps:dc1(P.virtualMcps),threads:new ss0(E,n?.id),asyncResearchJobs:new A71(j,n?.id)},E0=new f71(N0.aiProviderKeys,$.modelListCache),e=oY(),s=!n?null:e?q3(e,n.id):new WK(n.id,l),A0=n&&s?new FK(s,N0.orgFsEntries,n.id):null;pZ1(N0,{objectStorage:s,baseUrl:l,orgSlug:n?.slug});let Y0={timings:k,auth:b,connectionId:m,organization:n,storage:N0,vault:Z,authInstance:$.auth,boundAuth:f,access:r,db:$.db,tracer:$.observability.tracer,meter:$.observability.meter,baseUrl:l,objectStorage:s,orgFs:A0,metadata:{requestId:crypto.randomUUID(),timestamp:new Date,wellKnownForwardableHeaders:Object.fromEntries(rG6.map((P0)=>[P0,A?.headers.get(P0)??null]).filter(([P0,x0])=>x0!==null)),userAgent:(A?ZZ0(A.headers,"client"):null)||A?.headers.get("User-Agent")||void 0,ipAddress:(A?.headers.get("CF-Connecting-IP")||A?.headers.get("X-Forwarded-For"))??void 0,properties:dG6(A?ZZ0(A.headers,"properties"):null)},aiProviders:E0,createMCPProxy:async(P0)=>{return await Qu$(P0,Y0)},invalidateMemberRole:$.memberRoleCache?(P0,x0)=>$.memberRoleCache.invalidate(P0,x0):void 0,getOrCreateClient:M,pendingRevalidations:[],firecrawlApiKey:M0().firecrawlApiKey};return Y0}}function gD($,Z){$.storage.threads.setOrganizationId(Z.id),$.storage.asyncResearchJobs.setOrganizationId(Z.id);let Q=oY();$.objectStorage=Q?q3(Q,Z.id):new WK(Z.id,$.baseUrl),$.orgFs=new FK($.objectStorage,$.storage.orgFsEntries,Z.id),pZ1($.storage,{objectStorage:$.objectStorage,baseUrl:$.baseUrl,orgSlug:Z.slug??void 0})}var pG6=60000,ju$,Pu$,TQ,Au$,rG6;var dU=D(()=>{LB();EB();E$();S5();Fu0();m50();Ou0();oc1();Mn1();lG();el0();kn1();Qc0();Xc0();Gc0();mn1();Oc0();$Z0();mF();Lc0();N11();rQ();sZ1();iL0();T71();O71();yd0();No();Yu$();I71();an();cU();Nu$();lx0();lL();Lu$();uL();Jm();nZ1();ju$=new Map;TQ={set:($)=>{Pu$=$},create:async($,Z)=>{return await Pu$($,Z)}},Au$={measure:async($,Z)=>{return await Z()}},rG6=["x-hub-signature-256"]});import{DBOS as pT0,SchedulerMode as sG6}from"@dbos-inc/dbos-sdk";function Ru$($){g71=$}function qu$(){if(!g71)throw Error("[org-fs] org-repo-sync runtime not initialized \u2014 setOrgRepoSyncRuntime() must run before the workflow fires");return g71}async function eG6($,Z){let Q=await $.selectFrom("organization").select(["id","slug","name"]).where("id","=",Z).executeTakeFirst();if(!Q)return null;let X=await TQ.create();return X.organization={id:Q.id,slug:Q.slug,name:Q.name},gD(X,{id:Q.id,slug:Q.slug}),X}async function $J6($){try{let{db:Z}=qu$(),Q=await eG6(Z,$.organizationId);if(!Q)return{id:$.id,volume:$.volume,error:"organization no longer exists"};let X=await MQ0(Q,$);return"error"in X?{id:X.id,volume:X.volume,error:X.error}:{id:X.id,volume:X.volume}}catch(Z){return{id:$.id,volume:$.volume,error:Z instanceof Error?Z.message:String(Z)}}}async function ZJ6($,Z){let Q=await pT0.runStep(()=>new Ij(qu$().db).listEnabled(),{name:"loadOrgRepoSyncConfigs"});for(let X of Q){let Y=await pT0.runStep(()=>$J6(X),{name:`syncOrgRepo:${X.id}`});if(Y.error)console.warn(`[org-fs] org repo sync ${Y.id} (${Y.volume}) failed: ${Y.error}`)}}function Iu$(){if(y71)return;y71=pT0.registerWorkflow(ZJ6,{name:"orgRepoSyncWorkflow"}),pT0.registerScheduled(y71,{name:"orgRepoSyncWorkflow",crontab:aG6,mode:sG6.ExactlyOncePerIntervalWhenActive})}var aG6="7-59/10 * * * *",g71=null,y71=null;var Mu$=D(()=>{dU();kQ0()});import{DBOS as nT0,SchedulerMode as QJ6}from"@dbos-inc/dbos-sdk";function ku$($){u71=$}function Vu$(){if(!u71)throw Error("[task-board-archive] runtime not initialized \u2014 setTaskBoardArchiveSweepRuntime() must run before the workflow fires");return u71}async function JJ6($,Z){try{let Q=await LH(Vu$().db,$);if(!Q)return{organizationId:$,archived:0};let{archived:X}=await eN$(Q,$,Z);return{organizationId:$,archived:X}}catch(Q){return{organizationId:$,archived:0,error:Q instanceof Error?Q.message:String(Q)}}}async function WJ6($,Z){let Q=new Date($.getTime()-YJ6),X=await nT0.runStep(()=>new PG(Vu$().db).listItemsAwaitingArchive(Q,GJ6),{name:"loadArchiveCandidates"});if(X.length===0)return;let Y=await Promise.all(tL0(X).map(({organizationId:J,itemIds:W})=>nT0.runStep(()=>JJ6(J,W),{name:`archiveMergedForOrg:${J}`})));for(let J of Y)if(J.error)console.warn(`[task-board-archive] org ${J.organizationId} failed: ${J.error}`);let G=Y.reduce((J,W)=>J+W.archived,0);if(G>0)console.log(`[task-board-archive] archived ${G} of ${X.length} candidates`)}function Su$(){if(h71)return;h71=nT0.registerWorkflow(WJ6,{name:"taskBoardArchiveSweepWorkflow"}),nT0.registerScheduled(h71,{name:"taskBoardArchiveSweepWorkflow",crontab:XJ6,mode:QJ6.ExactlyOncePerIntervalWhenActive})}var XJ6="23 * * * *",YJ6=432000000,GJ6=200,u71=null,h71=null;var Cu$=D(()=>{cU();Mh();Vh()});async function KJ6($,Z){let Q=await $.storage.tags.listOrgTags(Z),X=Q.find((G)=>G.name.toLowerCase()===tT0);if(X)return X.id;return(await $.storage.tags.createTag(Z,tT0,XQ0(Q.length))).id}async function HJ6($,Z,Q,X,Y){let G=await $.storage.taskBoard.getById(Q,Z);if(!G||!XB$(G.status))return!1;let J=await $.storage.taskBoard.listPrs(Q,Z),W=await Promise.all(J.map(async(H)=>({...H,...await Y($,Z,H)})));if(!y_(W))return!1;await $.storage.taskBoard.addItemTags(Q,[await X()],"system");let K=await $.storage.taskBoard.getById(Q,Z);if(!K)return!1;return await M6($,{taskBoardItemId:Q,action:"tags_changed",actorId:null,data:{from:G.tags,to:K.tags,reason:"merged_pr_auto_tag"}}),K8(Z,K),!0}async function _u$($,Z,Q,X=oL0){let Y=null,G=()=>Y??=KJ6($,Z),J=0;for(let W of Q)try{if(await HJ6($,Z,W,G,X))J+=1}catch(K){console.error(`[task-board-merged-tag] ${W} failed`,K)}return{tagged:J}}var tT0="merged";var vu$=D(()=>{E4();AQ();Mh();PW();rZ();s5()});import{DBOS as oT0,SchedulerMode as FJ6}from"@dbos-inc/dbos-sdk";function fu$($){c71=$}function bu$(){if(!c71)throw Error("[task-board-merged-tag] runtime not initialized \u2014 setTaskBoardMergedTagSweepRuntime() must run before the workflow fires");return c71}async function BJ6($,Z){try{let Q=await LH(bu$().db,$);if(!Q)return{organizationId:$,tagged:0};let{tagged:X}=await _u$(Q,$,Z);return{organizationId:$,tagged:X}}catch(Q){return{organizationId:$,tagged:0,error:Q instanceof Error?Q.message:String(Q)}}}async function OJ6(){let $=await oT0.runStep(()=>new PG(bu$().db).listItemsAwaitingMergedTag(tT0,NJ6),{name:"loadMergedTagCandidates"});if($.length===0)return;let Z=await Promise.all(tL0($).map(({organizationId:X,itemIds:Y})=>oT0.runStep(()=>BJ6(X,Y),{name:`tagMergedForOrg:${X}`})));for(let X of Z)if(X.error)console.warn(`[task-board-merged-tag] org ${X.organizationId} failed: ${X.error}`);let Q=Z.reduce((X,Y)=>X+Y.tagged,0);if(Q>0)console.log(`[task-board-merged-tag] tagged ${Q} of ${$.length} candidates`)}function xu$(){if(l71)return;l71=oT0.registerWorkflow(OJ6,{name:"taskBoardMergedTagSweepWorkflow"}),oT0.registerScheduled(l71,{name:"taskBoardMergedTagSweepWorkflow",crontab:UJ6,mode:FJ6.ExactlyOncePerIntervalWhenActive})}var UJ6="41 * * * *",NJ6=200,c71=null,l71=null;var yu$=D(()=>{cU();Mh();Vh();vu$()});function hu$($){if(!$)return!1;try{return new URL($).host==="api.decocms.com"&&$!=="https://studio.decocms.com/org/deco/registry/mcp"}catch{return!1}}var gu$="https://studio.decocms.com/org/deco/registry/mcp";var lu$,DJ6,uu$=($)=>{let Z=0,Q=$.length;while(Z<Q){let X=$.charCodeAt(Z);if(X!==32&&X!==9)break;Z++}while(Q>Z){let X=$.charCodeAt(Q-1);if(X!==32&&X!==9)break;Q--}return Z===0&&Q===$.length?$:$.slice(Z,Q)},d71=($,Z)=>{if(Z&&$.indexOf(Z)===-1)return{};let Q=$.split(";"),X={};for(let Y of Q){let G=Y.indexOf("=");if(G===-1)continue;let J=uu$(Y.substring(0,G));if(Z&&Z!==J||!lu$.test(J))continue;let W=uu$(Y.substring(G+1));if(W.startsWith('"')&&W.endsWith('"'))W=W.slice(1,-1);if(DJ6.test(W)){if(X[J]=W.indexOf("%")!==-1?ty(W,vp):W,Z)break}}return X},wJ6=($,Z,Q={})=>{if(!lu$.test($))throw Error("Invalid cookie name");let X=`${$}=${Z}`;if($.startsWith("__Secure-")&&!Q.secure)throw Error("__Secure- Cookie must have Secure attributes");if($.startsWith("__Host-")){if(!Q.secure)throw Error("__Host- Cookie must have Secure attributes");if(Q.path!=="/")throw Error('__Host- Cookie must have Path attributes with "/"');if(Q.domain)throw Error("__Host- Cookie must not have Domain attributes")}for(let Y of["domain","path"])if(Q[Y]&&/[;\r\n]/.test(Q[Y]))throw Error(`${Y} must not contain ";", "\\r", or "\\n"`);if(Q&&typeof Q.maxAge==="number"&&Q.maxAge>=0){if(Q.maxAge>34560000)throw Error("Cookies Max-Age SHOULD NOT be greater than 400 days (34560000 seconds) in duration.");X+=`; Max-Age=${Q.maxAge|0}`}if(Q.domain&&Q.prefix!=="host")X+=`; Domain=${Q.domain}`;if(Q.path)X+=`; Path=${Q.path}`;if(Q.expires){if(Q.expires.getTime()-Date.now()>34560000000)throw Error("Cookies Expires SHOULD NOT be greater than 400 days (34560000 seconds) in the future.");X+=`; Expires=${Q.expires.toUTCString()}`}if(Q.httpOnly)X+="; HttpOnly";if(Q.secure)X+="; Secure";if(Q.sameSite)X+=`; SameSite=${Q.sameSite.charAt(0).toUpperCase()+Q.sameSite.slice(1)}`;if(Q.priority)X+=`; Priority=${Q.priority.charAt(0).toUpperCase()+Q.priority.slice(1)}`;if(Q.partitioned){if(!Q.secure)throw Error("Partitioned Cookie must have Secure attributes");X+="; Partitioned"}return X},rT0=($,Z,Q)=>{return Z=encodeURIComponent(Z),wJ6($,Z,Q)};var cu$=D(()=>{wO();lu$=/^[\w!#$%&'*.^`|~+-]+$/,DJ6=/^[ !#-:<-[\]-~]*$/});var Sl=($,Z,Q)=>{let X=$.req.raw.headers.get("Cookie");if(typeof Z==="string"){if(!X)return;let G=Z;if(Q==="secure")G="__Secure-"+Z;else if(Q==="host")G="__Host-"+Z;return d71(X,G)[G]}if(!X)return{};return d71(X)},LJ6=($,Z,Q)=>{let X;if(Q?.prefix==="secure")X=rT0("__Secure-"+$,Z,{path:"/",...Q,secure:!0});else if(Q?.prefix==="host")X=rT0("__Host-"+$,Z,{...Q,path:"/",secure:!0,domain:void 0});else X=rT0($,Z,{path:"/",...Q});return X},Ge=($,Z,Q,X)=>{let Y=LJ6(Z,Q,X);$.header("Set-Cookie",Y,{append:!0})};var sT0=D(()=>{cu$()});var du$=($)=>{let Q={...{origin:"*",allowMethods:["GET","HEAD","PUT","POST","DELETE","PATCH"],allowHeaders:[],exposeHeaders:[]},...$},X=((G)=>{if(typeof G==="string")if(G==="*"){if(Q.credentials)return(J)=>J||null;return()=>G}else return(J)=>G===J?J:null;else if(typeof G==="function")return G;else return(J)=>G.includes(J)?J:null})(Q.origin),Y=((G)=>{if(typeof G==="function")return G;else if(Array.isArray(G))return()=>G;else return()=>[]})(Q.allowMethods);return async function(J,W){function K(F,U){J.res.headers.set(F,U)}let H=await X(J.req.header("origin")||"",J);if(H)K("Access-Control-Allow-Origin",H);if(Q.credentials)K("Access-Control-Allow-Credentials","true");if(Q.exposeHeaders?.length)K("Access-Control-Expose-Headers",Q.exposeHeaders.join(","));if(J.req.method==="OPTIONS"){if(Q.origin!=="*"||Q.credentials)K("Vary","Origin");if(Q.maxAge!=null)K("Access-Control-Max-Age",Q.maxAge.toString());let F=await Y(J.req.header("origin")||"",J);if(F.length)K("Access-Control-Allow-Methods",F.join(","));let U=Q.allowHeaders;if(!U?.length){let N=J.req.header("Access-Control-Request-Headers");if(N)U=N.split(/\s*,\s*/)}if(U?.length)K("Access-Control-Allow-Headers",U.join(",")),J.res.headers.append("Vary","Access-Control-Request-Headers");return J.res.headers.delete("Content-Length"),J.res.headers.delete("Content-Type"),new Response(null,{headers:J.res.headers,status:204,statusText:"No Content"})}if(await W(),Q.origin!=="*"||Q.credentials)J.header("Vary","Origin",{append:!0})}};var mu$=()=>{};function m71($,Z){return`${$}:${Z}`}function iu$($){let Z=$?.ttlMs??120000,Q=$?.maxSize??1e4,X=new Map;function Y(){if(X.size<=Q)return;let G=Date.now();for(let[J,W]of X)if(W.expiresAt<=G)X.delete(J);if(X.size>Q){let J=X.size-Q,W=0;for(let K of X.keys()){if(W>=J)break;X.delete(K),W++}}}return{get(G,J){let W=m71(G,J),K=X.get(W);if(!K)return;if(K.expiresAt<=Date.now()){X.delete(W);return}return K.role},set(G,J,W){let K=m71(G,J);X.set(K,{role:W,expiresAt:Date.now()+Z}),Y()},invalidate(G,J){X.delete(m71(G,J))}}}class i71{options;subscriptions=[];localEmit=null;originId=crypto.randomUUID();encoder=new TextEncoder;seenMessageIds=new Set;constructor($){this.options=$}async start($){if($)this.localEmit=$;if(this.subscriptions.length>0)return;if(!this.localEmit)return;let Z=this.options.getConnection();if(!Z)return;let Q=new TextDecoder;this.subscriptions=pu$.map((X)=>Z.subscribe(X));for(let X of this.subscriptions)(async()=>{for await(let Y of X)try{let G=JSON.parse(Q.decode(Y.data));if(typeof G?.originId!=="string"||typeof G?.organizationId!=="string"||typeof G?.event?.id!=="string"||typeof G?.event?.type!=="string")continue;if(G.originId===this.originId)continue;if(typeof G.messageId==="string"&&this.hasSeen(G.messageId))continue;this.localEmit?.(G.organizationId,G.event)}catch{}})().catch((Y)=>{console.error("[NatsSSEBroadcast] Subscription error:",Y)})}broadcast($,Z){this.localEmit?.($,Z);let Q={originId:this.originId,messageId:crypto.randomUUID(),organizationId:$,event:Z};try{let X=this.options.getConnection();if(!X)return;let Y=this.encoder.encode(JSON.stringify(Q));for(let G of pu$)X.publish(G,Y)}catch(X){console.warn("[NatsSSEBroadcast] Publish failed (non-critical):",X)}}async stop(){for(let $ of this.subscriptions)$.unsubscribe();this.subscriptions=[],this.seenMessageIds.clear(),this.localEmit=null}hasSeen($){if(this.seenMessageIds.has($))return!0;if(this.seenMessageIds.add($),this.seenMessageIds.size>1000){let Z=this.seenMessageIds.values().next().value;if(Z)this.seenMessageIds.delete(Z)}return!1}}var pu$;var nu$=D(()=>{pu$=["studio.sse.broadcast","mesh.sse.broadcast"]});async function EJ6($,Z,Q=5){try{await n4(Z,{maxAttempts:Q,minTimeout:1000,maxTimeout:1e4,jitter:0})}catch(X){console.error(`${$} Deferred start failed:`,X instanceof W7?X.cause:X)}}function tu$($){let Z=new i71({getConnection:()=>$.getConnection()});h5.start(Z).catch((Q)=>{console.error("[SSEHub] Failed to start broadcast strategy:",Q)}),$.onReady(()=>{EJ6("[NatsSSEBroadcast]",()=>Z.start())})}var p71=D(()=>{p8();nu$();ko();ko()});var ou$=()=>{};var n71=()=>{};var ru$=()=>{};var jJ6,jRZ;var su$=D(()=>{ou$();n71();wO();ru$();jJ6={br:".br",zstd:".zst",gzip:".gz"},jRZ=Object.keys(jJ6)});var au$=D(()=>{su$()});var eu$=()=>{};var $l$=D(()=>{eu$()});var Zl$=()=>{};var Ql$=D(()=>{kc0()});var t71=D(()=>{LO();Ql$()});var o71="x-hono-disable-ssg",gRZ;var r71=D(()=>{t71();gRZ=(()=>{try{return new Response("SSG is disabled",{status:404,headers:{[o71]:"true"}})}catch{return null}})()});var Xl$=D(()=>{FZ0()});var s71=D(()=>{Xl$()});var Yl$=D(()=>{$l$();Zl$();n71();r71();s71();t71()});var Gl$=D(()=>{r71();s71();Yl$()});var zqZ;var Jl$=D(()=>{Gl$();({write:zqZ}=Bun)});var AJ6=class{#$;constructor($){this.#$=$,this.raw=$.raw,this.url=$.url?new URL($.url):null,this.protocol=$.protocol??null}send($,Z){this.#$.send($,Z??{})}raw;binaryType="arraybuffer";get readyState(){return this.#$.readyState}url;protocol;close($,Z){this.#$.close($,Z)}},Wl$=($)=>{return(...Z)=>{if(typeof Z[0]==="function"){let[Q,X]=Z;return async function(G,J){let W=await Q(G),K=await $(G,W,X);if(K)return K;await J()}}else{let[Q,X,Y]=Z;return(async()=>{let G=await $(Q,X,Y);if(!G)throw Error("Failed to upgrade WebSocket");return G})()}}};var Kl$=()=>{};var Je=($)=>("server"in $.env)?$.env.server:$.env;var aT0=()=>{};var TJ6;var Hl$=D(()=>{Kl$();aT0();TJ6=Wl$(($,Z)=>{let Q=Je($);if(!Q)throw TypeError("env has to include the 2nd argument of fetch.");if(Q.upgrade($.req.raw,{data:{events:Z,url:new URL($.req.url),protocol:$.req.url}}))return new Response(null);return})});var a71=($)=>{let Z=Je($);if(!Z)throw TypeError("env has to include the 2nd argument of fetch.");if(typeof Z.requestIP!=="function")throw TypeError("server.requestIP is not a function.");let Q=Z.requestIP($.req.raw);if(!Q)return{remote:{}};return{remote:{address:Q.address,addressType:Q.family==="IPv6"||Q.family==="IPv4"?Q.family:void 0,port:Q.port}}};var Fl$=D(()=>{aT0()});var Ul$=D(()=>{au$();Jl$();Hl$();Fl$();aT0()});var Nl$;var Bl$=D(()=>{Nl$={google:{name:"Google",icon:"https://assets.decocache.com/webdraw/eb7480aa-a68b-4ce4-98ff-36aa121762a7/google.svg"},github:{name:"GitHub",icon:"https://assets.decocache.com/decocms/e02ce92e-6684-41a6-acfc-432977eb4878/github.png"},microsoft:{name:"Microsoft",icon:"https://assets.decocache.com/mcp/aa6f6e1a-6526-4bca-99cc-82e2ec38b0e4/microsoft.png"}}});function Ol$(){let $=Object.keys(e8.socialProviders??{}),Z=$.length>0,Q=$.map((Y)=>({name:Y,icon:Nl$[Y].icon})),X=M0().localMode;return{emailAndPassword:{enabled:e8.emailAndPassword?.enabled??!1},magicLink:{enabled:e8.magicLinkConfig?.enabled??!1},emailOtp:{enabled:e8.emailOtpConfig?.enabled??!1},resetPassword:{enabled:yT0},socialProviders:{enabled:Z,providers:Q},sso:e8.ssoConfig?{enabled:!0,providerId:e8.ssoConfig.providerId}:{enabled:!1},stdioEnabled:X,localMode:mU()}}async function RJ6($,Z,Q){try{if(!e8.inviteEmailProviderId||!e8.emailProviders||e8.emailProviders.length===0)return;let X=p3(e8.emailProviders,e8.inviteEmailProviderId);if(!X)return;let Y=await $.selectFrom("member").innerJoin("user","user.id","member.userId").select(["user.email as email","member.role as role"]).where("member.organizationId","=",Z.id).execute(),G=Im,J=Y.filter((H)=>(H.role??"").split(",").map((F)=>F.trim()).some((F)=>G.includes(F)));if(J.length===0)return;let W=i3(X),K=`${K9()}/${Z.slug}/settings/members`;await Promise.allSettled(J.map((H)=>W({to:H.email,subject:`New request to join ${Z.name}`,html:n3({preheader:`${Q} requested to join ${Z.name}.`,heading:"New join request",subheading:`<strong>${Q}</strong> requested to join <strong>${Z.name}</strong> on deco Studio.`,body:cE("Review request",K),footnote:"You can approve or deny this request from your members settings."})})))}catch(X){console.error("[Auth] Failed to notify admins of join request:",X)}}var LN,Dl$;var e71=D(()=>{h$();Ul$();y4();E$();WG();UJ();Q71();Ai0();fT0();Qg();rQ();S5();Gc0();Bl$();n_();Kx();LN=new Q1;LN.post("/local-session",async($)=>{if(!mU())return $.json({success:!1,error:"Local mode is not active"},403);let Z;try{Z=a71($).remote.address}catch{}if(!(Z==="127.0.0.1"||Z==="::1"||Z==="::ffff:127.0.0.1"))return $.json({success:!1,error:"Forbidden"},403);try{let{waitForSeed:X}=await Promise.resolve().then(() => (n_(),OE0));await X();let{auth:Y}=await Promise.resolve().then(() => (WG(),Dh$)),G=await xa0();if(!G)return $.json({success:!1,error:"Local admin user not found"},500);let J=await BE0();return await Y.api.signInEmail({body:{email:G.email,password:J},asResponse:!0})}catch(X){return console.error("Failed to create local session:",X),$.json({success:!1,error:X instanceof Error?X.message:"Failed to create local session"},500)}});LN.get("/my-capabilities/:slug",async($)=>{let Z=$.req.param("slug"),Q=await Q8.api.getSession({headers:$.req.raw.headers});if(!Q?.user)return $.json({error:"Authentication required"},401);let X=Z8().db,Y=await X.selectFrom("organization").select(["id"]).where("slug","=",Z).executeTakeFirst();if(!Y)return $.json({role:null,capabilities:{}});let J=(await X.selectFrom("member").select(["role"]).where("userId","=",Q.user.id).where("organizationId","=",Y.id).executeTakeFirst())?.role??null;if(!J)return $.json({role:null,capabilities:{}});if(UZ(J))return $.json({role:J,capabilities:cb1()});if(J==="user")return $.json({role:J,capabilities:ky0({self:[...U60]})});let W=await X.selectFrom("organizationRole").select(["permission"]).where("role","=",J).where("organizationId","=",Y.id).executeTakeFirst(),K={},H=W?.permission;if(typeof H==="string")try{let F=JSON.parse(H);if(F&&typeof F==="object"&&!Array.isArray(F))K=F}catch{K={}}return $.json({role:J,capabilities:ky0(K)})});LN.get("/domain-lookup",async($)=>{let Z=await Q8.api.getSession({headers:$.req.raw.headers});if(!Z?.user)return $.json({success:!1,error:"Authentication required"},401);if(!Z.user.emailVerified)return $.json({found:!1,organizations:[]});let Q=Z.user.email?.split("@")[1]?.toLowerCase();if(!Q||$W.has(Q))return $.json({found:!1,organizations:[]});try{let Y=(await new ZG(Z8().db).getAllByDomain(Q)).filter(vT0);if(Y.length===0)return $.json({found:!1,organizations:[]});let G=await Z8().db.selectFrom("organization").select(["id","name","slug","logo","metadata"]).where("id","in",Y.map((K)=>K.organizationId)).execute(),J=new Map(G.map((K)=>[K.id,K])),W=Y.map((K)=>{let H=J.get(K.organizationId);if(!H)return null;if(p9(H))return null;return{id:H.id,name:H.name,slug:H.slug,logo:H.logo,joinMode:K.joinMode}}).filter((K)=>K!==null);return $.json({found:W.length>0,organizations:W})}catch(X){return console.error("[Auth] Domain lookup failed:",X),$.json({success:!1,error:"Domain lookup failed"},500)}});LN.post("/domain-join",async($)=>{let Z=await Q8.api.getSession({headers:$.req.raw.headers});if(!Z?.user)return $.json({success:!1,error:"Authentication required"},401);if(!Z.user.emailVerified)return $.json({success:!1,error:"Email must be verified to join"},403);let Q=Z.user.email?.split("@")[1]?.toLowerCase();if(!Q||$W.has(Q))return $.json({success:!1,error:"Generic email domains cannot auto-join"},403);let X=await $.req.json().catch(()=>({})),Y=typeof X.organizationSlug==="string"&&X.organizationSlug.trim()?X.organizationSlug.trim():null;try{let G=Z8().db,K=(await new ZG(G).getAllByDomain(Q)).filter((B)=>B.verificationStatus==="verified"&&B.joinMode==="auto");if(K.length===0)return $.json({success:!1,error:"Auto-join is not available for this domain"},403);let H=await G.selectFrom("organization").select(["id","slug","metadata"]).where("id","in",K.map((B)=>B.organizationId)).execute(),F=new Map(H.filter((B)=>!p9(B)).map((B)=>[B.id,{id:B.id,slug:B.slug}])),U=K.flatMap((B)=>{let O=F.get(B.organizationId);return O?[O]:[]});if(U.length===0)return $.json({success:!1,error:"Auto-join is not available for this domain"},403);let N;if(Y){let B=U.find((O)=>O.slug===Y);if(!B)return $.json({success:!1,error:"This organization is not available for auto-join with your email domain."},403);N=B}else if(U.length===1)N=U[0];else return $.json({success:!1,error:"Multiple organizations match this domain. Please pick one.",requiresSelection:!0},409);try{await Q8.api.addMember({body:{userId:Z.user.id,role:"user",organizationId:N.id}})}catch(B){if(!dO(B))return console.error("[Auth] Domain join addMember failed:",B),$.json({success:!1,error:"Failed to join organization"},500)}return V1.capture({distinctId:Z.user.id,event:"organization_domain_joined",groups:{organization:N.id},properties:{organization_id:N.id,organization_slug:N.slug,email_domain:Q}}),$.json({success:!0,slug:N.slug})}catch(G){return V1.captureException(G,Z.user.id),console.error("[Auth] Domain join failed:",G),$.json({success:!1,error:"Failed to join organization"},500)}});LN.post("/domain-setup",async($)=>{let Z=await Q8.api.getSession({headers:$.req.raw.headers});if(!Z?.user)return $.json({success:!1,error:"Authentication required"},401);if(!Z.user.emailVerified)return $.json({success:!1,error:"Email must be verified"},403);let Q=Z.user.email?.split("@")[1]?.toLowerCase();if(!Q||$W.has(Q))return $.json({success:!1,error:"Corporate email required"},403);let X=await $.req.json().catch(()=>({})),Y=typeof X.name==="string"&&X.name.trim().length>0?X.name.trim():null,G=typeof X.logo==="string"&&X.logo.length>0?X.logo:null,J=X.claimDomain!==!1;try{let W=Z8().db,K=new ZG(W),H=await K.getAllByDomain(Q);if(H.length>0){let z=await W.selectFrom("member").innerJoin("organization","organization.id","member.organizationId").select(["organization.slug"]).where("member.userId","=",Z.user.id).where("member.organizationId","in",H.map((P)=>P.organizationId)).executeTakeFirst();if(z)return $.json({success:!0,slug:z.slug,alreadyExists:!0})}let F=Q.split(".")[0]??Q,U=Y??F.charAt(0).toUpperCase()+F.slice(1),N=(Y??F).toLowerCase().trim().replace(/[^a-z0-9\s_-]+/g,"").replace(/[\s_-]+/g,"-").replace(/^-+|-+$/g,"")||F.toLowerCase().replace(/[^a-z0-9-]/g,""),B=null;for(let P=0;P<3;P++){let A=P===0?"":`-${Math.random().toString(36).slice(2,6)}`,q=P===0?U:`${U}${A}`,k=`${N}${A}`;try{B=await Q8.api.createOrganization({body:{name:q,slug:k,userId:Z.user.id}});break}catch(M){if(!(M instanceof Error&&("body"in M)&&M.body?.code==="ORGANIZATION_ALREADY_EXISTS")||P===2)throw M}}if(!B?.id)throw Error("Failed to create organization");let O=B.id;if(J)await K.add(O,Q,{joinMode:"auto",verificationStatus:"verified",verificationMethod:"email"});let w=!1,L=null,E=null;try{let z=M0().firecrawlApiKey;if(z){let P=await a70(Q,z,U);if(P){let A=new Vp(Z8().db),q=await A.create(O,P);if(await A.setDefault(q.id,O),w=!0,P.name&&P.name!==U)L=P.name;E=P.favicon??P.logo??null}}}catch(z){console.error("[Auth] Brand extraction failed (non-fatal):",z)}let j={};if(!Y&&L)j.name=L;if(G)j.logo=G;else if(E)j.logo=E;if(Object.keys(j).length>0)try{await Q8.api.updateOrganization({headers:$.req.raw.headers,body:{organizationId:O,data:j}})}catch(z){console.error("[Auth] Org update failed (non-fatal):",z)}return V1.identify({distinctId:Z.user.id,properties:{email:Z.user.email,$set:{email:Z.user.email},$set_once:{first_organization_created_at:new Date().toISOString()}}}),V1.groupIdentify({groupType:"organization",groupKey:O,properties:{name:B.slug??N,slug:B.slug??N,email_domain:Q,brand_extracted:w,created_at:new Date().toISOString()}}),V1.capture({distinctId:Z.user.id,event:"organization_created",groups:{organization:O},properties:{organization_id:O,organization_slug:B.slug??N,email_domain:Q,brand_extracted:w}}),$.json({success:!0,slug:B.slug??N,brandExtracted:w})}catch(W){return V1.captureException(W,Z.user?.id),console.error("[Auth] Domain setup failed:",W),$.json({success:!1,error:"Failed to set up organization"},500)}});LN.get("/org-access-status/:slug",async($)=>{let Z=$.req.param("slug"),Q=await Q8.api.getSession({headers:$.req.raw.headers});if(!Q?.user)return $.json({success:!1,error:"Authentication required"},401);let X=Z8().db,Y=await X.selectFrom("organization").select(["id","name","slug","logo"]).where("slug","=",Z).executeTakeFirst();if(!Y)return $.json({status:"not-found"});let G={id:Y.id,name:Y.name,slug:Y.slug,logo:Y.logo};if(await X.selectFrom("member").select(["id"]).where("userId","=",Q.user.id).where("organizationId","=",Y.id).executeTakeFirst())return $.json({status:"member",organization:G});try{let W=await Q8.api.listUserInvitations({headers:$.req.raw.headers}),K=Date.now(),H=W.find((F)=>F.organizationId===Y.id&&F.status==="pending"&&new Date(F.expiresAt).getTime()>K);if(H)return $.json({status:"pending-invite",invitation:{id:H.id},organization:G})}catch(W){console.error("[Auth] listUserInvitations failed:",W)}if(Q.user.emailVerified){let W=Q.user.email?.split("@")[1]?.toLowerCase();if(W&&!$W.has(W)){let K=await new ZG(X).getByOrgAndDomain(Y.id,W);if(K?.verificationStatus==="verified"){if(K.joinMode==="auto")return $.json({status:"auto-domain-join",organization:{...G,domain:W}});if(K.joinMode==="request"){let H=await new dy(X).getPending(Y.id,Q.user.id);return $.json({status:H?"request-pending":"can-request",organization:{...G,domain:W}})}}}}return $.json({status:"no-access",organization:G})});LN.post("/domain-request-join",async($)=>{let Z=await Q8.api.getSession({headers:$.req.raw.headers});if(!Z?.user)return $.json({success:!1,error:"Authentication required"},401);if(!Z.user.emailVerified)return $.json({success:!1,error:"Email must be verified to request access"},403);let Q=Z.user.email?.split("@")[1]?.toLowerCase();if(!Q||$W.has(Q))return $.json({success:!1,error:"Generic email domains cannot request access"},403);let X=await $.req.json().catch(()=>({})),Y=typeof X.organizationSlug==="string"&&X.organizationSlug.trim()?X.organizationSlug.trim():null;if(!Y)return $.json({success:!1,error:"organizationSlug is required"},400);try{let G=Z8().db,J=await G.selectFrom("organization").select(["id","slug","name"]).where("slug","=",Y).executeTakeFirst();if(!J)return $.json({success:!1,error:"Organization not found"},404);let W=await new ZG(G).getByOrgAndDomain(J.id,Q);if(!W||W.verificationStatus!=="verified"||W.joinMode!=="request")return $.json({success:!1,error:"This organization is not accepting requests for your domain."},403);if(await G.selectFrom("member").select(["id"]).where("userId","=",Z.user.id).where("organizationId","=",J.id).executeTakeFirst())return $.json({success:!0,slug:J.slug,alreadyMember:!0});return await new dy(G).create(J.id,Z.user.id),await RJ6(G,J,Z.user.email),V1.capture({distinctId:Z.user.id,event:"organization_join_requested",groups:{organization:J.id},properties:{organization_id:J.id,organization_slug:J.slug,email_domain:Q}}),$.json({success:!0,status:"pending"})}catch(G){return V1.captureException(G,Z.user.id),console.error("[Auth] Domain request-join failed:",G),$.json({success:!1,error:"Failed to request access"},500)}});LN.post("/ensure-organization",async($)=>{let Z=null;try{if(Z=await Q8.api.getSession({headers:$.req.raw.headers}),!Z?.user)return $.json({success:!1,error:"Authentication required"},401);let Q=await bT0({db:Z8().db,authApi:Q8.api,user:{id:Z.user.id,email:Z.user.email,name:Z.user.name??null,emailVerified:!!Z.user.emailVerified},allowCreate:!0,createdVia:"commerce_onboarding_recovery"});if(Q.status==="ambiguous")return $.json({success:!1,status:Q.status,domain:Q.domain,organizations:Q.organizations});if(Q.status==="skipped")return $.json({success:!1,status:Q.status,reason:Q.reason,domain:Q.domain,error:"Organization creation is not available."},409);if(Q.status==="already_has_organization")return $.json({success:!0,status:Q.status,organization:Q.organization,domain:Q.domain});return $.json({success:!0,status:Q.status,organization:Q.organization,domain:Q.domain})}catch(Q){let X=Z?.user?.id;if(X)V1.captureException(Q,X);return console.error("[Auth] ensure organization failed:",Q),$.json({success:!1,error:"Failed to ensure organization"},500)}});Dl$=LN});import{createHmac as qJ6}from"crypto";function wl$($){return/^Bearer\s+(.+)$/i.exec($.get("authorization")??"")?.[1]?.trim()||null}function Ll$($){if(!$||typeof $!=="object"||!("userId"in $)||typeof $.userId!=="string")return null;return $.userId}function IJ6($){if(!$||typeof $!=="object"||!("user"in $))return null;let{user:Z}=$;if(!Z||typeof Z!=="object"||!("id"in Z)||typeof Z.id!=="string")return null;return Z.id}function MJ6($){if(!$||typeof $!=="object"||!("valid"in $)||$.valid!==!0||!("key"in $))return null;return Ll$($.key)}async function El$($){let Z=new Headers({authorization:`Bearer ${$}`,"X-MCP-Session-Auth":"true"}),Q=await Q8.api.getMcpSession({headers:Z}).catch(()=>null),X=Ll$(Q);if(X)return X;let Y=await Q8.api.verifyApiKey({body:{key:$}}).catch(()=>null);return MJ6(Y)}function kJ6($,Z){let Q=qJ6("sha256",Z).update($).digest("base64");return encodeURIComponent(`${$}.${Q}`)}var $Q1,jl$;var zl$=D(()=>{h$();WG();$Q1=new Q1;$Q1.get("/me",async($)=>{let Z=wl$($.req.raw.headers),Q;if(Z)Q=await El$(Z);else{let X=await Q8.api.getSession({headers:$.req.raw.headers}).catch(()=>null);Q=IJ6(X)}if(!Q)return $.json({error:"unauthorized"},401);return $.json({userId:Q})});$Q1.post("/session-from-oauth",async($)=>{let Z=wl$($.req.raw.headers);if(!Z)return $.json({error:"unauthorized"},401);let Q=await El$(Z);if(!Q)return $.json({error:"unauthorized"},401);try{let X=await Q8.$context,Y=await X.internalAdapter.createSession(Q,!1),G=kJ6(Y.token,X.secret);return $.json({sessionToken:G})}catch(X){return console.error("[desktop-auth] failed to mint a session from an OAuth bearer:",X instanceof Error?X.message:String(X)),$.json({error:"failed to mint a session"},500)}});jl$=$Q1});var Cl=($)=>{let Z=$.req.header("sec-fetch-dest");if(Z!==void 0)return Z==="document";let Q=$.req.header("accept")??"";return Q.includes("text/html")&&!/text\/html\s*;\s*q\s*=\s*0/.test(Q)};function VJ6($){let Z=$.req.path;return $.req.method==="GET"&&/\/fs\/[^/]+\/read$/.test(Z)||$.req.method==="POST"&&/\/fs\/[^/]+\/unlock$/.test(Z)}function ZQ1($){let Z=$.auth?.apiKey?.metadata;if(!Z||typeof Z!=="object"||Array.isArray(Z)||!("organization"in Z))return{present:!1};let Q=Z.organization;if(!Q||typeof Q!=="object"||Array.isArray(Q))return{present:!0};let X=Q.id;return{present:!0,id:typeof X==="string"?X:void 0}}function CJ6($){let Z=$.split("/").filter(Boolean);if(Z[0]!=="api")return!1;let Q=Z.slice(2);return SJ6.some((X)=>X.length===Q.length&&X.every((Y,G)=>Y==="*"||Y===Q[G]))}var SJ6,Kf=async($,Z)=>{let Q=$.req.param("org");if(!Q)return $.json({error:"org slug missing in path"},400);let X=$.get("studioContext");if(!X?.db)return $.json({error:"studioContext not initialized"},500);let Y=X.db,G=CJ6($.req.path),J=await Y.selectFrom("organization").select(["id","slug","name","metadata"]).where((F)=>G?F.or([F("slug","=",Q),F("id","=",Q)]):F("slug","=",Q)).executeTakeFirst();if(!J){if(Cl($))return $.redirect(`/${encodeURIComponent(Q)}`,302);return $.json({error:`organization "${Q}" not found`},404)}let W=ZQ1(X);if(X.auth?.apiKey?.id&&W.present&&W.id!==J.id)return $.json({error:"forbidden: API key is scoped to another organization"},403);if(X.auth?.tokenOrganizationId&&X.auth.tokenOrganizationId!==J.id)return $.json({error:"forbidden: token is scoped to another organization"},403);if(p9(J)){if(Cl($))return $.redirect(`/${encodeURIComponent(Q)}`,302);return $.json({error:`organization "${Q}" not found`},404)}let K=X.auth?.user?.id,H;if(K){let F=await Y.selectFrom("member").select(["role"]).where("userId","=",K).where("organizationId","=",J.id).executeTakeFirst();if(!F){if(!VJ6($)){if(Cl($))return $.redirect(`/${encodeURIComponent(J.slug)}`,302);return $.json({error:"forbidden: not a member of organization"},403)}}else H=F.role}return X.organization={id:J.id,slug:J.slug,name:J.name,role:H},X.access.setOrganizationId(J.id),X.access.setRole(H),gD(X,J),await Z()};var eT0=D(()=>{dU();SJ6=[["vault","connections","*","access-token"],["vault","connections","*","configuration"],["internal","task-board","import"],["internal","commerce-diagnostic","share-invite"]]});function _J6($){if(GQ($.id)!==null)return!0;if(Dc1($.id))return!0;let Z=$.metadata?.liveAgentId;return typeof Z==="string"&&Z.length>0}function vJ6($,Z){let Q=new Map,X=(Y)=>{let G=Q.get(Y);if(G)return G;let J=(async()=>{if(!(await $.storage.orgSsoConfig.getByOrgId(Y))?.enforced)return!0;return await $.storage.orgSsoSessions.isValid(Z,Y)})();return Q.set(Y,J),J};return async(Y)=>{let G=await Promise.all(Y.map((J)=>X(J.orgId)));return Y.filter((J,W)=>G[W]===!0)}}function fJ6($){let Z=$.auth?.apiKey?.id?ZQ1($):{present:!1,id:void 0};if(Z.present&&!Z.id)return $20;let Q=$.auth?.tokenOrganizationId;if(Z.id&&Q&&Z.id!==Q)return $20;let X=Z.id??Q??null;if(X===null&&$.auth?.apiKey?.id)return $20;return X}var Pl$="/api/_me",$20,bJ6=256,xJ6=20,yJ6=50,gJ6=10,hJ6=5,Al$=()=>{let $=new Q1;return $.get("/projects/search",async(Z)=>{let Q=Z.get("studioContext");Z.header("Cache-Control","private, no-store");let X=n0(Q);if(!X)return Z.json({error:"Unauthorized"},401);let Y=fJ6(Q);if(Y===$20)return Z.json({error:"forbidden: credential is scoped to another organization"},403);let G=(Z.req.query("q")??"").trim();if(!G)return Z.json({items:[]});if(G.length>bJ6)return Z.json({error:"query too long"},400);let J=Number.parseInt(Z.req.query("limit")??"",10),W=Number.isFinite(J)&&J>0?Math.min(J,yJ6):xJ6,K=vJ6(Q,X),H=W+gJ6,F=[];for(let U=0;U<hJ6&&F.length<W;U++){let N=await Q.storage.virtualMcps.searchAcrossMemberships({userId:X,term:G,limit:H,offset:U*H,organizationId:Y}),B=N.filter((O)=>!_J6(O)).filter((O)=>!p9({metadata:O.organization_metadata})).map((O)=>({id:O.id,title:O.title,icon:O.icon,orgId:O.organization_id,orgName:O.organization_name,orgSlug:O.organization_slug}));if(F.push(...await K(B)),N.length<H)break}return Z.json({items:F.slice(0,W)})}),$};var Tl$=D(()=>{h$();k8();eT0();$20=Symbol("deny")});import{z as _l}from"zod";var uJ6,lJ6,cJ6=200,dJ6=2000,mJ6=60,iJ6=2000,pJ6,Rl$;var ql$=D(()=>{uJ6=["warn","block"],lJ6=_l.enum(uJ6),pJ6=_l.string().max(iJ6).refine(($)=>{try{let Z=new URL($);return Z.protocol==="https:"||Z.protocol==="http:"}catch{return!1}},{message:"ctaUrl must be an absolute http(s) URL"}),Rl$=_l.object({severity:lJ6,title:_l.string().trim().min(1).max(cJ6),message:_l.string().trim().min(1).max(dJ6),ctaLabel:_l.string().trim().max(mJ6).nullable().optional(),ctaUrl:pJ6.nullable().optional()}).refine(($)=>!$.ctaLabel===!$.ctaUrl,{message:"ctaLabel and ctaUrl must be set together",path:["ctaUrl"]})});import{z as QQ1}from"zod";function XQ1($){let Z=$??{},Q=new Set([...Object.keys(wj.shape),...Object.keys(Z)]),X={};for(let Y of Q)X[Y]=FX(Z,Y);return{flags:Z,effective:X}}var nJ6,Il$;var Ml$=D(()=>{n9();nJ6=QQ1.string().min(1).max(64).regex(/^[a-z][a-z0-9]*(?:_[a-z0-9]+)*$/),Il$=QQ1.record(nJ6,QQ1.boolean())});function kl$($,Z,Q){let X=Q;for(;;){if(X=$.indexOf(Z,X),X===-1)return-1;let Y=$[X+Z.length];if(Y===void 0||Y===`
|
|
2715
|
+
(SELECT created_at, id FROM notifications WHERE id = ${Q.cursor})`);let J=await G.execute(),W=J.slice(0,X),K=await this.db.selectFrom("notifications").select((F)=>F.fn.countAll().as("count")).where("user_id","=",$).where("organization_id","=",Z).where("read_at","is",null).executeTakeFirst(),H=W[W.length-1];return{nextCursor:J.length>X&&H?H.id:null,notifications:W.map((F)=>({id:F.id,taskBoardItemId:F.task_board_item_id,type:F.type,data:Rh.parse(F.data),createdAt:xG6(F.created_at)})),unreadCount:Number(K?.count??0)}}async anchorExists($){return!!await this.db.selectFrom("notifications").select("id").where("id","=",$).executeTakeFirst()}async markRead($,Z,Q){if(Q&&Q.length===0)return 0;let X=this.db.updateTable("notifications").set({read_at:new Date}).where("user_id","=",$).where("organization_id","=",Z).where("read_at","is",null);if(Q)X=X.where("id","in",Q);let Y=await X.executeTakeFirst();return Number(Y.numUpdatedRows??0n)}async setSubscribed($,Z,Q){await this.db.insertInto("notification_subscriptions").values({id:M8("nsub"),user_id:$,task_board_item_id:Z,subscribed:Q}).onConflict((X)=>X.columns(["user_id","task_board_item_id"]).doUpdateSet({subscribed:Q,updated_at:new Date})).execute()}async notify($){await qh({...$,db:this.db})}async notifyMentions($){await Fu$({...$,db:this.db})}async listSubscribers($){return(await this.db.selectFrom("notification_subscriptions").select("user_id").where("task_board_item_id","=",$).where("subscribed","=",!0).execute()).map((Q)=>Q.user_id)}}var fG6=20,bG6=50,xG6=($)=>$ instanceof Date?$.toISOString():$;var Nu$=D(()=>{YQ();cL0();dL0();Uu$()});class _71{db;constructor($){this.db=$}async create($,Z,Q){await this.deleteExpired(Z);let X=crypto.randomUUID(),Y=new Date(Date.now()+600000);return await this.db.insertInto("oauth_pkce_states").values({id:X,organization_id:Z,user_id:Q,code_verifier:$,expires_at:Y,created_at:new Date}).execute(),X}async deleteExpired($){await this.db.deleteFrom("oauth_pkce_states").where("organization_id","=",$).where("expires_at","<",new Date).execute()}async consume($,Z,Q){let X=await this.db.deleteFrom("oauth_pkce_states").where("id","=",$).where("organization_id","=",Z).where("user_id","=",Q).returningAll().executeTakeFirst();if(!X)throw Error("Invalid or expired OAuth state token");if((X.expires_at instanceof Date?X.expires_at:new Date(X.expires_at))<new Date)throw Error("OAuth state token has expired");return X.code_verifier}}class v71{db;vault;constructor($,Z){this.db=$;this.vault=Z}async upsert($){let Z=await this.vault.encrypt($.accessToken),Q=$.expiresAt??null,X=new Date;return await this.db.insertInto("claude_subscriptions").values({user_id:$.userId,encrypted_access_token:Z,expires_at:Q,created_at:X}).onConflict((Y)=>Y.column("user_id").doUpdateSet({encrypted_access_token:Z,expires_at:Q,created_at:X})).execute(),{linkedAt:X.toISOString(),expiresAt:Q?.toISOString()??null}}async find($){let Z=await this.db.selectFrom("claude_subscriptions").select(["created_at","expires_at"]).where("user_id","=",$).executeTakeFirst();if(!Z)return null;return{linkedAt:new Date(Z.created_at).toISOString(),expiresAt:Z.expires_at?new Date(Z.expires_at).toISOString():null}}async findLiveToken($){let Z=await this.db.selectFrom("claude_subscriptions").select(["encrypted_access_token","expires_at"]).where("user_id","=",$).executeTakeFirst();if(!Z)return null;if(Z.expires_at&&new Date(Z.expires_at).getTime()<=Date.now())return null;return this.vault.decrypt(Z.encrypted_access_token)}async delete($){await this.db.deleteFrom("claude_subscriptions").where("user_id","=",$).execute()}}function yG6($){return $.includes("/")?$.split("/").slice(1).join("/"):$}function gG6($){let Z=$.supported_parameters.includes("tools"),Q=$.supported_parameters.includes("reasoning");return{providerId:"openrouter",modelId:yG6($.id),title:$.name,description:$.description||null,logo:null,capabilities:[...new Set([...$.architecture.input_modalities.map((X)=>X==="image"?"vision":X),...$.architecture.output_modalities,...Z?["tools"]:[],...Q?["reasoning"]:[]])],limits:{contextWindow:$.context_length,maxOutputTokens:$.top_provider.max_completion_tokens||null},costs:{input:$.pricing.prompt,output:$.pricing.completion}}}function Ou$($){let Z=new Map;for(let Q of $){let X={description:Q.description,capabilities:Q.capabilities,limits:Q.limits,costs:Q.costs};Z.set(Q.modelId,X);let Y=Q.modelId.replace(/\./g,"-");if(Y!==Q.modelId)Z.set(Y,X)}return Z}async function hG6($){if($){let Z=await $.get(Bu$,"openrouter");if(Z)return Ou$(Z)}try{let Z=await fetch("https://openrouter.ai/api/v1/models",{signal:AbortSignal.timeout(1e4)});if(!Z.ok)return new Map;let{data:Q}=await Z.json(),X=Q.map(gG6);if($)await $.set(Bu$,"openrouter",X);return Ou$(X)}catch{return new Map}}function uG6($){let Z=$.replace(/\./g,"-"),Q=$.replace(/-\d{8}$/,""),X=Q.replace(/\./g,"-");return[...new Set([$,Z,Q,X])]}function lG6($){return $.providerId==="anthropic"||$.modelId.startsWith("anthropic/")}function wu$($,Z){if(lG6(Z)&&$.includes("vision")&&!$.includes("file"))return[...$,"file"];return $}function cG6($,Z){return $.map((Q)=>{let Y=uG6(Q.modelId).map((W)=>Z.get(W)).find(Boolean),G=Q.capabilities.length?Q.capabilities:Y?.capabilities??[],J=wu$(G,Q);if(!Y)return J===G?Q:{...Q,capabilities:J};return{...Q,description:Q.description??Y.description??null,capabilities:J,limits:Q.limits??Y.limits??null,costs:Q.costs??Y.costs??null}})}class f71{storage;cache;constructor($,Z){this.storage=$;this.cache=Z}async activate($,Z){let{keyInfo:Q,apiKey:X}=await this.storage.resolve($,Z),Y=b7()[Q.providerId];if(!Y)throw Error(`Unknown provider: ${Q.providerId}`);return Y.create(X)}async listModels($,Z){let{keyInfo:Q,apiKey:X}=await this.storage.resolve($,Z),Y=Q.providerId,G=b7()[Y];if(!G)throw Error(`Unknown provider: ${Y}`);if(this.cache){let U=await this.cache.get(Z,Y);if(U)return Du$(U,G,X)}let W=await G.create(X).listModels(),K=new Set,H=W.filter((U)=>{if(U.deprecated)return!1;if(K.has(U.modelId))return!1;return K.add(U.modelId),!0});if(Y!=="openrouter"){let U=await hG6(this.cache);H=cG6(H,U)}else H=H.map((U)=>({...U,capabilities:wu$(U.capabilities,U)}));let F=H.map((U)=>({...U,providerId:Y}));if(this.cache)await this.cache.set(Z,Y,F);return Du$(F,G,X)}}function Du$($,Z,Q){let Y=Z.create(Q).asyncResearch;if(!Y)return $;return $.map((G)=>Y.canHandle(G.modelId)?{...G,asyncResearch:!0}:G)}var Bu$="_global";var Lu$=D(()=>{ZN()});import{SpanStatusCode as Eu$}from"@opentelemetry/api";function dG6($){if(!$)return;try{let Z=JSON.parse($);if(typeof Z!=="object"||Z===null||Array.isArray(Z))return;let Q={};for(let[X,Y]of Object.entries(Z))if(typeof Y==="string")Q[X]=Y;return Object.keys(Q).length>0?Q:void 0}catch{return}}function mG6($,Z){return Z?.connectionId??$?.headers.get("x-caller-id")??void 0}function iG6($){try{let Z=new URL($.url).pathname.split("/").filter(Boolean);if(Z[0]==="api"&&Z[1])return decodeURIComponent(Z[1])}catch{}return}function x71($){let{auth:Z,headers:Q,role:X,permissions:Y,userId:G,apiKeyId:J,organizationId:W}=$,K=!!J,H=Z.api.hasPermission;return{isApiKeyPrincipal:K,hasPermission:async(F,U)=>{if(K)return E71(Y??{},F);let N=!!U?.organizationId&&!!W&&U.organizationId!==W,B=U?U.role:X;if(UZ(B))return!0;if(Y&&!N)return E71(Y,F);let O=og$(U?.role,F,rg$());if(O!=="fallback")return O==="grant";if(!H)return console.error("[Auth] hasPermission API not available"),!1;let w=U?.organizationId?{organizationId:U.organizationId}:{};try{if((await H({headers:Q,body:{permission:F,...w}}))?.success===!0)return!0;let E=pn1(F);return(await H({headers:Q,body:{permission:E,...w}}))?.success===!0}catch(L){let E=L?.statusCode;if(E!==401&&E!==403)console.error("[Auth] Permission check failed:",L instanceof Error?L.message:String(L));return!1}},organization:{create:async(F)=>{return Z.api.createOrganization({body:F})},update:async(F)=>{return Z.api.updateOrganization({headers:Q,body:F})},delete:async(F)=>{await Z.api.deleteOrganization({headers:Q,body:{organizationId:F}})},get:async(F)=>{return Z.api.getFullOrganization({headers:Q,query:F?{organizationId:F}:void 0})},list:async()=>{return(await Z.api.listOrganizations({headers:Q})).filter((U)=>!p9(U))},addMember:async(F)=>{return Z.api.addMember({body:F})},removeMember:async(F)=>{return Z.api.removeMember({headers:Q,body:F})},listMembers:async(F)=>{return Z.api.listMembers({headers:Q,query:F?{organizationId:F.organizationId,limit:F.limit,offset:F.offset,filterField:F.filterField,filterValue:F.filterValue}:void 0})},updateMemberRole:async(F)=>{return Z.api.updateMemberRole({headers:Q,body:F})}},apiKey:{create:async(F)=>{return Z.api.createApiKey({body:{...F,userId:G}})},list:async()=>{return Z.api.listApiKeys({headers:Q})},update:async(F)=>{return Z.api.updateApiKey({body:{...F,userId:G}})},delete:async(F)=>{await Z.api.deleteApiKey({headers:Q,body:{keyId:F}})}}}}async function mo($,Z,Q){if(Hx.includes(Q))return;let X=await $.selectFrom("organizationRole").select(["permission"]).where("organizationId","=",Z).where("role","=",Q).executeTakeFirst();if(!X?.permission)return;try{return JSON.parse(X.permission)}catch{console.error(`[Auth] Failed to parse permissions for role: ${Q}`);return}}async function zu$($,Z,Q,X){let Y=ju$.get(Q);if(Y&&Date.now()-Y.at<pG6)return Y.archived;let G=await Z.measure(X,()=>$.selectFrom("organization").select(["metadata"]).where("id","=",Q).executeTakeFirst()),J=p9(G);return ju$.set(Q,{archived:J,at:Date.now()}),J}async function b71($,Z,Q,X,Y){let G=Y?.get(Q,X);if(G)return G;let W=(await Z.measure("auth_query_membership",()=>$.selectFrom("member").select(["member.role"]).where("member.userId","=",Q).where("member.organizationId","=",X).executeTakeFirst()))?.role;if(W)Y?.set(Q,X,W);return W}function nG6($,Z){if(!$)return!0;return Z===$}async function tG6($,Z,Q,X,Y){let G=ZZ0($.headers,"token");if(!G)return;let J=await Q.measure("auth_verify_onbehalf_studio_jwt",()=>nx0(G));if(!J?.sub)return;let W=J.metadata?.organizationId;if(!nG6(X,W))return;let K=X?await b71(Z,Q,J.sub,X,Y):J.user?.role??void 0;return{id:J.sub,email:J.user?.email,name:J.user?.name,role:K}}async function oG6($,Z,Q,X=Au$,Y){let G=$.headers.get("Authorization");try{let J=new Headers($.headers);J.set("X-MCP-Session-Auth","true");let W=await X.measure("auth_get_mcp_session",()=>Z.api.getMcpSession({headers:J}));if(W){let K=W.userId,H=$.headers.get("x-org-id"),F=$.headers.get("x-org-slug"),U=iG6($),N=await X.measure("auth_query_membership",()=>{let L=Q.selectFrom("member").innerJoin("organization","organization.id","member.organizationId").select(["member.role","member.organizationId","organization.id as orgId","organization.slug as orgSlug","organization.name as orgName","organization.metadata as orgMetadata"]).where("member.userId","=",K);if(U)return L.where("organization.slug","=",U).executeTakeFirst();if(H)return L.where("organization.id","=",H).executeTakeFirst();if(F)return L.where("organization.slug","=",F).executeTakeFirst();return L.orderBy("member.createdAt","asc").limit(2).execute().then((E)=>E.length===1?E[0]:void 0)});if(p9({metadata:N?.orgMetadata}))throw Error("Organization is archived");let B=N?.role,O=N?{id:N.orgId,slug:N.orgSlug,name:N.orgName}:void 0;if(N&&B)Y?.set(K,N.organizationId,B);let w;if(N&&B)w=await X.measure("auth_fetch_role_permissions",()=>mo(Q,N.organizationId,B));return{user:{id:K,role:B},role:B,permissions:w,organization:O}}}catch(J){console.error("[Auth] OAuth session check failed:",J)}if(G?.startsWith("Bearer ")){let J=G.replace("Bearer ","").trim();try{let W=await X.measure("auth_verify_studio_token",()=>nx0(J));if(W){let K,H=W.metadata?.organizationId;if(W.sub&&H)K=await b71(Q,X,W.sub,H,Y);let F,U=W.metadata?.organizationId;if(U){let N=W.metadata?.organizationName,B=W.metadata?.organizationSlug;if(N||B){if(await zu$(Q,X,U,"auth_query_org_archived_for_studio_token"))return{user:void 0};F={id:U,name:N,slug:B}}else{let O=await X.measure("auth_query_org_for_studio_token",()=>Q.selectFrom("organization").select(["id","slug","name","metadata"]).where("id","=",U).executeTakeFirst());if(p9(O))return{user:void 0};F=O?{id:O.id,slug:O.slug,name:O.name}:{id:U}}}return{user:{id:W.sub,connectionId:W.metadata?.connectionId,role:K},role:K,permissions:W.permissions,tokenOrganizationId:H,organization:F}}}catch{}try{let W=await X.measure("auth_verify_api_key",()=>Z.api.verifyApiKey({body:{key:J}}));if(W?.valid&&W.key){let K=W.key.metadata?.organization;if(K?.id&&await zu$(Q,X,K.id,"auth_query_org_for_api_key"))return{user:void 0};let H=W.key.permissions,F,U=W.key.userId;if(U&&K?.id)F=await b71(Q,X,U,K.id,Y);let N=await tG6($,Q,X,K?.id,Y);return{apiKeyId:W.key.id,user:N??{id:W.key.userId,role:F},role:N?N.role:F,permissions:H,apiKey:{id:W.key.id,name:W.key.name??"",userId:W.key.userId,metadata:W.key.metadata},tokenOrganizationId:K?.id,organization:K?{id:K.id,slug:K.slug,name:K.name}:void 0}}}catch(W){let K=W;if(K.body?.code==="INVALID_API_KEY"||K.message?.includes("Invalid API key"))console.warn("[Auth] invalid API key (Bearer)",{path:new URL($.url).pathname,method:$.method,ua:$.headers.get("user-agent")??void 0,ip:$.headers.get("x-forwarded-for")??$.headers.get("x-real-ip")??void 0,tokenPrefix:J.slice(0,8)});else console.error("[Auth] API key check failed:",K)}}try{let J=new Headers($.headers);J.delete("Authorization");let W=await X.measure("auth_get_session",()=>Z.api.getSession({headers:J}));if(W){let K,H,F=$.headers.get("x-org-id"),U=$.headers.get("x-org-slug");if(!F&&!U&&$.method.toUpperCase()==="GET")try{let N=new URL($.url).searchParams;F=N.get("x-org-id"),U=N.get("x-org-slug")}catch{}if(F||U){let N=await X.measure("auth_query_membership_from_header",()=>{let B=Q.selectFrom("member").innerJoin("organization","organization.id","member.organizationId").select(["member.role","organization.id as orgId","organization.slug as orgSlug","organization.name as orgName","organization.metadata as orgMetadata"]).where("member.userId","=",W.user.id);if(F)B=B.where("organization.id","=",F);else if(U)B=B.where("organization.slug","=",U);return B.executeTakeFirst()});if(p9({metadata:N?.orgMetadata}))throw Error("Organization is archived");if(N)K={id:N.orgId,slug:N.orgSlug,name:N.orgName},H=N.role}else if(W.session.activeOrganizationId){let N=await X.measure("auth_get_full_organization",()=>Z.api.getFullOrganization({headers:J}).catch(()=>null));if(N){if(p9(N))throw Error("Organization is archived");K={id:N.id,slug:N.slug,name:N.name},H=N.members?.find((O)=>O.userId===W.user.id)?.role}else K={id:W.session.activeOrganizationId,slug:"",name:""}}return{user:{id:W.user.id,email:W.user.email,emailVerified:!!W.user.emailVerified,name:W.user.name,image:W.user.image??void 0,role:H},role:H,organization:K}}}catch(J){let W=J;console.error("[Auth] Session check failed:",JSON.stringify({message:W.message,body:W.body,stack:W.stack},null,2))}return{user:void 0}}async function Tu$($){let Z=new oQ($.encryption.key),Q=M0(),X=Q.clickhouseUrl,Y=!!X,G=!Y&&!!Q.monitoringS3Bucket,J=Y?"clickhouse":"duckdb",{resolve:W}=await import("path"),K=W(K3()),H=W(WF()),F=(A)=>`read_ndjson('${K}/${A}/**/*.ndjson', auto_detect=true)`,U=(A)=>`read_ndjson('${H}/${A}/**/*.ndjson', auto_detect=true)`,N,B,O,w,L=!1;if($.monitoringEngines)N=$.monitoringEngines.monitoringEngine,B=$.monitoringEngines.metricEngine,O=F,w=U;else if(Y){let A=Q.clickhouseMaxMemoryUsage?{maxMemoryUsage:String(Q.clickhouseMaxMemoryUsage)}:void 0;N=new Ip(X,A),B=new Ip(X,A),O=(q)=>"studio_monitoring_logs",w=(q)=>"studio_monitoring_logs"}else if(G){let A=Q.monitoringS3AccessKeyId??Q.s3AccessKeyId,q=Q.monitoringS3SecretAccessKey??Q.s3SecretAccessKey,k=Q.duckdbExtensionDirectory;if(!A||!q||!k)throw Error("MONITORING_S3_BUCKET is set but the GCS monitoring path is misconfigured: MONITORING_S3_ACCESS_KEY_ID/S3_ACCESS_KEY_ID, MONITORING_S3_SECRET_ACCESS_KEY/S3_SECRET_ACCESS_KEY, and DUCKDB_EXTENSION_DIRECTORY are all required.");let M={endpoint:Q.monitoringS3Endpoint??Q.s3Endpoint??"storage.googleapis.com",region:Q.monitoringS3Region??Q.s3Region,accessKeyId:A,secretAccessKey:q,extensionDirectory:k},C=new qp(M,{memoryLimit:Q.duckdbMemoryLimit,threads:Q.duckdbThreads});N=C,B=C;let m=Q.monitoringS3Bucket,f=Q.monitoringS3Prefix??"",b=(n,l)=>In1({bucket:m,prefix:f,range:l});O=b,w=b,L=!0}else{let{engine:A}=await al0({basePath:K3()}),{engine:q}=await al0({basePath:WF()});N=A,B=q,O=F,w=U}let E=new Ih($.db),j=new Qe($.db),z=new Sp($.db),P={connections:new Bi($.db,Z),connectionCredentialVault:new Bu0($.db),organizationSettings:new fE($.db),userModelPreferences:new $c0($.db),monitoring:new zu0(N,O,B,w,J,L),virtualMcps:new mx($.db),users:new Dc0($.db),tags:new Cp($.db),organizationBilling:new vK($.db),virtualMcpPluginConfigs:new Zc0($.db),aiProviderKeys:new Yn($.db,Z,$.providerKeyCache),subsidizedGatewayKeys:new R71($.db,Z),secrets:new cr0($.db,Z),orgFileConfigs:new q71($.db,Z),orgSites:new Wf($.db),orgRepoSyncs:new Ij($.db),gitProviderAccounts:new Rg($.db),gitProviderAccountCredentials:new rn($.db,Z),gitProviderOAuthStates:new M71($.db),repositories:new sn($.db),jiraIntegrations:new wN($.db,Z),taskBoard:new PG($.db),columnAutomations:new k71($.db),taskBoardPrompts:new V71($.db),notifications:new C71($.db),orgFsEntries:new Um($.db),oauthPkceStates:new _71($.db),claudeSubscriptions:new v71($.db,Z),automations:l90($.db),triggerCallbackTokens:new kp($.db),orgSsoConfig:new Kc0($.db,Z),orgSsoSessions:new Hc0($.db),registry:{items:new my($.db),publishRequests:new iy($.db),publishApiKeys:new py($.db),monitorRuns:new s90($.db),monitorResults:new a90($.db),monitorConnections:new e90($.db)},brandContext:new Vp($.db),organizationDomains:new ZG($.db),organizationJoinRequests:new dy($.db),kv:z,interests:new Wc0(z)};return async(A,q)=>{let k=q?.timings??Au$,M=lT0(),C=A?await $.observability.tracer.startActiveSpan("studio.auth",async(P0)=>{try{let x0=await oG6(A,$.auth,$.db,k,$.memberRoleCache);return P0.setStatus({code:Eu$.OK}),x0}catch(x0){throw P0.setStatus({code:Eu$.ERROR,message:x0.message}),P0.recordException(x0),x0}finally{P0.end()}}):{user:void 0},m=mG6(A,C.user),f=x71({auth:$.auth,headers:A?.headers??new Headers,role:C.role,permissions:C.permissions,userId:C.user?.id,apiKeyId:C.apiKeyId,organizationId:C.organization?.id}),b={user:C.user,tokenOrganizationId:C.tokenOrganizationId};if(C.apiKey)b.apiKey=C.apiKey;let n=C.organization,l=A?M0().baseUrl??`${new URL(A.url).origin}`:K9(),r=new nL(b.user?.id,void 0,f,C.role,"self",void 0,n?.id),N0={...P,virtualMcps:dc1(P.virtualMcps),threads:new ss0(E,n?.id),asyncResearchJobs:new A71(j,n?.id)},E0=new f71(N0.aiProviderKeys,$.modelListCache),e=oY(),s=!n?null:e?q3(e,n.id):new WK(n.id,l),A0=n&&s?new FK(s,N0.orgFsEntries,n.id):null;pZ1(N0,{objectStorage:s,baseUrl:l,orgSlug:n?.slug});let Y0={timings:k,auth:b,connectionId:m,organization:n,storage:N0,vault:Z,authInstance:$.auth,boundAuth:f,access:r,db:$.db,tracer:$.observability.tracer,meter:$.observability.meter,baseUrl:l,objectStorage:s,orgFs:A0,metadata:{requestId:crypto.randomUUID(),timestamp:new Date,wellKnownForwardableHeaders:Object.fromEntries(rG6.map((P0)=>[P0,A?.headers.get(P0)??null]).filter(([P0,x0])=>x0!==null)),userAgent:(A?ZZ0(A.headers,"client"):null)||A?.headers.get("User-Agent")||void 0,ipAddress:(A?.headers.get("CF-Connecting-IP")||A?.headers.get("X-Forwarded-For"))??void 0,properties:dG6(A?ZZ0(A.headers,"properties"):null)},aiProviders:E0,createMCPProxy:async(P0)=>{return await Qu$(P0,Y0)},invalidateMemberRole:$.memberRoleCache?(P0,x0)=>$.memberRoleCache.invalidate(P0,x0):void 0,getOrCreateClient:M,pendingRevalidations:[],firecrawlApiKey:M0().firecrawlApiKey};return Y0}}function gD($,Z){$.storage.threads.setOrganizationId(Z.id),$.storage.asyncResearchJobs.setOrganizationId(Z.id);let Q=oY();$.objectStorage=Q?q3(Q,Z.id):new WK(Z.id,$.baseUrl),$.orgFs=new FK($.objectStorage,$.storage.orgFsEntries,Z.id),pZ1($.storage,{objectStorage:$.objectStorage,baseUrl:$.baseUrl,orgSlug:Z.slug??void 0})}var pG6=60000,ju$,Pu$,TQ,Au$,rG6;var dU=D(()=>{LB();EB();E$();S5();Fu0();m50();Ou0();oc1();Mn1();lG();el0();kn1();Qc0();Xc0();Gc0();mn1();Oc0();$Z0();mF();Lc0();N11();rQ();sZ1();iL0();T71();O71();yd0();No();Yu$();I71();an();cU();Nu$();lx0();lL();Lu$();uL();Jm();nZ1();ju$=new Map;TQ={set:($)=>{Pu$=$},create:async($,Z)=>{return await Pu$($,Z)}},Au$={measure:async($,Z)=>{return await Z()}},rG6=["x-hub-signature-256"]});import{DBOS as pT0,SchedulerMode as sG6}from"@dbos-inc/dbos-sdk";function Ru$($){g71=$}function qu$(){if(!g71)throw Error("[org-fs] org-repo-sync runtime not initialized \u2014 setOrgRepoSyncRuntime() must run before the workflow fires");return g71}async function eG6($,Z){let Q=await $.selectFrom("organization").select(["id","slug","name"]).where("id","=",Z).executeTakeFirst();if(!Q)return null;let X=await TQ.create();return X.organization={id:Q.id,slug:Q.slug,name:Q.name},gD(X,{id:Q.id,slug:Q.slug}),X}async function $J6($){try{let{db:Z}=qu$(),Q=await eG6(Z,$.organizationId);if(!Q)return{id:$.id,volume:$.volume,error:"organization no longer exists"};let X=await MQ0(Q,$);return"error"in X?{id:X.id,volume:X.volume,error:X.error}:{id:X.id,volume:X.volume}}catch(Z){return{id:$.id,volume:$.volume,error:Z instanceof Error?Z.message:String(Z)}}}async function ZJ6($,Z){let Q=await pT0.runStep(()=>new Ij(qu$().db).listEnabled(),{name:"loadOrgRepoSyncConfigs"});for(let X of Q){let Y=await pT0.runStep(()=>$J6(X),{name:`syncOrgRepo:${X.id}`});if(Y.error)console.warn(`[org-fs] org repo sync ${Y.id} (${Y.volume}) failed: ${Y.error}`)}}function Iu$(){if(y71)return;y71=pT0.registerWorkflow(ZJ6,{name:"orgRepoSyncWorkflow"}),pT0.registerScheduled(y71,{name:"orgRepoSyncWorkflow",crontab:aG6,mode:sG6.ExactlyOncePerIntervalWhenActive})}var aG6="7-59/10 * * * *",g71=null,y71=null;var Mu$=D(()=>{dU();kQ0()});import{DBOS as nT0,SchedulerMode as QJ6}from"@dbos-inc/dbos-sdk";function ku$($){u71=$}function Vu$(){if(!u71)throw Error("[task-board-archive] runtime not initialized \u2014 setTaskBoardArchiveSweepRuntime() must run before the workflow fires");return u71}async function JJ6($,Z){try{let Q=await LH(Vu$().db,$);if(!Q)return{organizationId:$,archived:0};let{archived:X}=await eN$(Q,$,Z);return{organizationId:$,archived:X}}catch(Q){return{organizationId:$,archived:0,error:Q instanceof Error?Q.message:String(Q)}}}async function WJ6($,Z){let Q=new Date($.getTime()-YJ6),X=await nT0.runStep(()=>new PG(Vu$().db).listItemsAwaitingArchive(Q,GJ6),{name:"loadArchiveCandidates"});if(X.length===0)return;let Y=await Promise.all(tL0(X).map(({organizationId:J,itemIds:W})=>nT0.runStep(()=>JJ6(J,W),{name:`archiveMergedForOrg:${J}`})));for(let J of Y)if(J.error)console.warn(`[task-board-archive] org ${J.organizationId} failed: ${J.error}`);let G=Y.reduce((J,W)=>J+W.archived,0);if(G>0)console.log(`[task-board-archive] archived ${G} of ${X.length} candidates`)}function Su$(){if(h71)return;h71=nT0.registerWorkflow(WJ6,{name:"taskBoardArchiveSweepWorkflow"}),nT0.registerScheduled(h71,{name:"taskBoardArchiveSweepWorkflow",crontab:XJ6,mode:QJ6.ExactlyOncePerIntervalWhenActive})}var XJ6="23 * * * *",YJ6=432000000,GJ6=200,u71=null,h71=null;var Cu$=D(()=>{cU();Mh();Vh()});async function KJ6($,Z){let Q=await $.storage.tags.listOrgTags(Z),X=Q.find((G)=>G.name.toLowerCase()===tT0);if(X)return X.id;return(await $.storage.tags.createTag(Z,tT0,XQ0(Q.length))).id}async function HJ6($,Z,Q,X,Y){let G=await $.storage.taskBoard.getById(Q,Z);if(!G||!XB$(G.status))return!1;let J=await $.storage.taskBoard.listPrs(Q,Z),W=await Promise.all(J.map(async(H)=>({...H,...await Y($,Z,H)})));if(!y_(W))return!1;await $.storage.taskBoard.addItemTags(Q,[await X()],"system");let K=await $.storage.taskBoard.getById(Q,Z);if(!K)return!1;return await M6($,{taskBoardItemId:Q,action:"tags_changed",actorId:null,data:{from:G.tags,to:K.tags,reason:"merged_pr_auto_tag"}}),K8(Z,K),!0}async function _u$($,Z,Q,X=oL0){let Y=null,G=()=>Y??=KJ6($,Z),J=0;for(let W of Q)try{if(await HJ6($,Z,W,G,X))J+=1}catch(K){console.error(`[task-board-merged-tag] ${W} failed`,K)}return{tagged:J}}var tT0="merged";var vu$=D(()=>{E4();AQ();Mh();PW();rZ();s5()});import{DBOS as oT0,SchedulerMode as FJ6}from"@dbos-inc/dbos-sdk";function fu$($){c71=$}function bu$(){if(!c71)throw Error("[task-board-merged-tag] runtime not initialized \u2014 setTaskBoardMergedTagSweepRuntime() must run before the workflow fires");return c71}async function BJ6($,Z){try{let Q=await LH(bu$().db,$);if(!Q)return{organizationId:$,tagged:0};let{tagged:X}=await _u$(Q,$,Z);return{organizationId:$,tagged:X}}catch(Q){return{organizationId:$,tagged:0,error:Q instanceof Error?Q.message:String(Q)}}}async function OJ6(){let $=await oT0.runStep(()=>new PG(bu$().db).listItemsAwaitingMergedTag(tT0,NJ6),{name:"loadMergedTagCandidates"});if($.length===0)return;let Z=await Promise.all(tL0($).map(({organizationId:X,itemIds:Y})=>oT0.runStep(()=>BJ6(X,Y),{name:`tagMergedForOrg:${X}`})));for(let X of Z)if(X.error)console.warn(`[task-board-merged-tag] org ${X.organizationId} failed: ${X.error}`);let Q=Z.reduce((X,Y)=>X+Y.tagged,0);if(Q>0)console.log(`[task-board-merged-tag] tagged ${Q} of ${$.length} candidates`)}function xu$(){if(l71)return;l71=oT0.registerWorkflow(OJ6,{name:"taskBoardMergedTagSweepWorkflow"}),oT0.registerScheduled(l71,{name:"taskBoardMergedTagSweepWorkflow",crontab:UJ6,mode:FJ6.ExactlyOncePerIntervalWhenActive})}var UJ6="41 * * * *",NJ6=200,c71=null,l71=null;var yu$=D(()=>{cU();Mh();Vh();vu$()});function hu$($){if(!$)return!1;try{return new URL($).host==="api.decocms.com"&&$!=="https://studio.decocms.com/org/deco/registry/mcp"}catch{return!1}}var gu$="https://studio.decocms.com/org/deco/registry/mcp";var lu$,DJ6,uu$=($)=>{let Z=0,Q=$.length;while(Z<Q){let X=$.charCodeAt(Z);if(X!==32&&X!==9)break;Z++}while(Q>Z){let X=$.charCodeAt(Q-1);if(X!==32&&X!==9)break;Q--}return Z===0&&Q===$.length?$:$.slice(Z,Q)},d71=($,Z)=>{if(Z&&$.indexOf(Z)===-1)return{};let Q=$.split(";"),X={};for(let Y of Q){let G=Y.indexOf("=");if(G===-1)continue;let J=uu$(Y.substring(0,G));if(Z&&Z!==J||!lu$.test(J))continue;let W=uu$(Y.substring(G+1));if(W.startsWith('"')&&W.endsWith('"'))W=W.slice(1,-1);if(DJ6.test(W)){if(X[J]=W.indexOf("%")!==-1?ty(W,vp):W,Z)break}}return X},wJ6=($,Z,Q={})=>{if(!lu$.test($))throw Error("Invalid cookie name");let X=`${$}=${Z}`;if($.startsWith("__Secure-")&&!Q.secure)throw Error("__Secure- Cookie must have Secure attributes");if($.startsWith("__Host-")){if(!Q.secure)throw Error("__Host- Cookie must have Secure attributes");if(Q.path!=="/")throw Error('__Host- Cookie must have Path attributes with "/"');if(Q.domain)throw Error("__Host- Cookie must not have Domain attributes")}for(let Y of["domain","path"])if(Q[Y]&&/[;\r\n]/.test(Q[Y]))throw Error(`${Y} must not contain ";", "\\r", or "\\n"`);if(Q&&typeof Q.maxAge==="number"&&Q.maxAge>=0){if(Q.maxAge>34560000)throw Error("Cookies Max-Age SHOULD NOT be greater than 400 days (34560000 seconds) in duration.");X+=`; Max-Age=${Q.maxAge|0}`}if(Q.domain&&Q.prefix!=="host")X+=`; Domain=${Q.domain}`;if(Q.path)X+=`; Path=${Q.path}`;if(Q.expires){if(Q.expires.getTime()-Date.now()>34560000000)throw Error("Cookies Expires SHOULD NOT be greater than 400 days (34560000 seconds) in the future.");X+=`; Expires=${Q.expires.toUTCString()}`}if(Q.httpOnly)X+="; HttpOnly";if(Q.secure)X+="; Secure";if(Q.sameSite)X+=`; SameSite=${Q.sameSite.charAt(0).toUpperCase()+Q.sameSite.slice(1)}`;if(Q.priority)X+=`; Priority=${Q.priority.charAt(0).toUpperCase()+Q.priority.slice(1)}`;if(Q.partitioned){if(!Q.secure)throw Error("Partitioned Cookie must have Secure attributes");X+="; Partitioned"}return X},rT0=($,Z,Q)=>{return Z=encodeURIComponent(Z),wJ6($,Z,Q)};var cu$=D(()=>{wO();lu$=/^[\w!#$%&'*.^`|~+-]+$/,DJ6=/^[ !#-:<-[\]-~]*$/});var Sl=($,Z,Q)=>{let X=$.req.raw.headers.get("Cookie");if(typeof Z==="string"){if(!X)return;let G=Z;if(Q==="secure")G="__Secure-"+Z;else if(Q==="host")G="__Host-"+Z;return d71(X,G)[G]}if(!X)return{};return d71(X)},LJ6=($,Z,Q)=>{let X;if(Q?.prefix==="secure")X=rT0("__Secure-"+$,Z,{path:"/",...Q,secure:!0});else if(Q?.prefix==="host")X=rT0("__Host-"+$,Z,{...Q,path:"/",secure:!0,domain:void 0});else X=rT0($,Z,{path:"/",...Q});return X},Ge=($,Z,Q,X)=>{let Y=LJ6(Z,Q,X);$.header("Set-Cookie",Y,{append:!0})};var sT0=D(()=>{cu$()});var du$=($)=>{let Q={...{origin:"*",allowMethods:["GET","HEAD","PUT","POST","DELETE","PATCH"],allowHeaders:[],exposeHeaders:[]},...$},X=((G)=>{if(typeof G==="string")if(G==="*"){if(Q.credentials)return(J)=>J||null;return()=>G}else return(J)=>G===J?J:null;else if(typeof G==="function")return G;else return(J)=>G.includes(J)?J:null})(Q.origin),Y=((G)=>{if(typeof G==="function")return G;else if(Array.isArray(G))return()=>G;else return()=>[]})(Q.allowMethods);return async function(J,W){function K(F,U){J.res.headers.set(F,U)}let H=await X(J.req.header("origin")||"",J);if(H)K("Access-Control-Allow-Origin",H);if(Q.credentials)K("Access-Control-Allow-Credentials","true");if(Q.exposeHeaders?.length)K("Access-Control-Expose-Headers",Q.exposeHeaders.join(","));if(J.req.method==="OPTIONS"){if(Q.origin!=="*"||Q.credentials)K("Vary","Origin");if(Q.maxAge!=null)K("Access-Control-Max-Age",Q.maxAge.toString());let F=await Y(J.req.header("origin")||"",J);if(F.length)K("Access-Control-Allow-Methods",F.join(","));let U=Q.allowHeaders;if(!U?.length){let N=J.req.header("Access-Control-Request-Headers");if(N)U=N.split(/\s*,\s*/)}if(U?.length)K("Access-Control-Allow-Headers",U.join(",")),J.res.headers.append("Vary","Access-Control-Request-Headers");return J.res.headers.delete("Content-Length"),J.res.headers.delete("Content-Type"),new Response(null,{headers:J.res.headers,status:204,statusText:"No Content"})}if(await W(),Q.origin!=="*"||Q.credentials)J.header("Vary","Origin",{append:!0})}};var mu$=()=>{};function m71($,Z){return`${$}:${Z}`}function iu$($){let Z=$?.ttlMs??120000,Q=$?.maxSize??1e4,X=new Map;function Y(){if(X.size<=Q)return;let G=Date.now();for(let[J,W]of X)if(W.expiresAt<=G)X.delete(J);if(X.size>Q){let J=X.size-Q,W=0;for(let K of X.keys()){if(W>=J)break;X.delete(K),W++}}}return{get(G,J){let W=m71(G,J),K=X.get(W);if(!K)return;if(K.expiresAt<=Date.now()){X.delete(W);return}return K.role},set(G,J,W){let K=m71(G,J);X.set(K,{role:W,expiresAt:Date.now()+Z}),Y()},invalidate(G,J){X.delete(m71(G,J))}}}class i71{options;subscriptions=[];localEmit=null;originId=crypto.randomUUID();encoder=new TextEncoder;seenMessageIds=new Set;constructor($){this.options=$}async start($){if($)this.localEmit=$;if(this.subscriptions.length>0)return;if(!this.localEmit)return;let Z=this.options.getConnection();if(!Z)return;let Q=new TextDecoder;this.subscriptions=pu$.map((X)=>Z.subscribe(X));for(let X of this.subscriptions)(async()=>{for await(let Y of X)try{let G=JSON.parse(Q.decode(Y.data));if(typeof G?.originId!=="string"||typeof G?.organizationId!=="string"||typeof G?.event?.id!=="string"||typeof G?.event?.type!=="string")continue;if(G.originId===this.originId)continue;if(typeof G.messageId==="string"&&this.hasSeen(G.messageId))continue;this.localEmit?.(G.organizationId,G.event)}catch{}})().catch((Y)=>{console.error("[NatsSSEBroadcast] Subscription error:",Y)})}broadcast($,Z){this.localEmit?.($,Z);let Q={originId:this.originId,messageId:crypto.randomUUID(),organizationId:$,event:Z};try{let X=this.options.getConnection();if(!X)return;let Y=this.encoder.encode(JSON.stringify(Q));for(let G of pu$)X.publish(G,Y)}catch(X){console.warn("[NatsSSEBroadcast] Publish failed (non-critical):",X)}}async stop(){for(let $ of this.subscriptions)$.unsubscribe();this.subscriptions=[],this.seenMessageIds.clear(),this.localEmit=null}hasSeen($){if(this.seenMessageIds.has($))return!0;if(this.seenMessageIds.add($),this.seenMessageIds.size>1000){let Z=this.seenMessageIds.values().next().value;if(Z)this.seenMessageIds.delete(Z)}return!1}}var pu$;var nu$=D(()=>{pu$=["studio.sse.broadcast","mesh.sse.broadcast"]});async function EJ6($,Z,Q=5){try{await n4(Z,{maxAttempts:Q,minTimeout:1000,maxTimeout:1e4,jitter:0})}catch(X){console.error(`${$} Deferred start failed:`,X instanceof W7?X.cause:X)}}function tu$($){let Z=new i71({getConnection:()=>$.getConnection()});h5.start(Z).catch((Q)=>{console.error("[SSEHub] Failed to start broadcast strategy:",Q)}),$.onReady(()=>{EJ6("[NatsSSEBroadcast]",()=>Z.start())})}var p71=D(()=>{p8();nu$();ko();ko()});var ou$=()=>{};var n71=()=>{};var ru$=()=>{};var jJ6,jRZ;var su$=D(()=>{ou$();n71();wO();ru$();jJ6={br:".br",zstd:".zst",gzip:".gz"},jRZ=Object.keys(jJ6)});var au$=D(()=>{su$()});var eu$=()=>{};var $l$=D(()=>{eu$()});var Zl$=()=>{};var Ql$=D(()=>{kc0()});var t71=D(()=>{LO();Ql$()});var o71="x-hono-disable-ssg",gRZ;var r71=D(()=>{t71();gRZ=(()=>{try{return new Response("SSG is disabled",{status:404,headers:{[o71]:"true"}})}catch{return null}})()});var Xl$=D(()=>{FZ0()});var s71=D(()=>{Xl$()});var Yl$=D(()=>{$l$();Zl$();n71();r71();s71();t71()});var Gl$=D(()=>{r71();s71();Yl$()});var zqZ;var Jl$=D(()=>{Gl$();({write:zqZ}=Bun)});var AJ6=class{#$;constructor($){this.#$=$,this.raw=$.raw,this.url=$.url?new URL($.url):null,this.protocol=$.protocol??null}send($,Z){this.#$.send($,Z??{})}raw;binaryType="arraybuffer";get readyState(){return this.#$.readyState}url;protocol;close($,Z){this.#$.close($,Z)}},Wl$=($)=>{return(...Z)=>{if(typeof Z[0]==="function"){let[Q,X]=Z;return async function(G,J){let W=await Q(G),K=await $(G,W,X);if(K)return K;await J()}}else{let[Q,X,Y]=Z;return(async()=>{let G=await $(Q,X,Y);if(!G)throw Error("Failed to upgrade WebSocket");return G})()}}};var Kl$=()=>{};var Je=($)=>("server"in $.env)?$.env.server:$.env;var aT0=()=>{};var TJ6;var Hl$=D(()=>{Kl$();aT0();TJ6=Wl$(($,Z)=>{let Q=Je($);if(!Q)throw TypeError("env has to include the 2nd argument of fetch.");if(Q.upgrade($.req.raw,{data:{events:Z,url:new URL($.req.url),protocol:$.req.url}}))return new Response(null);return})});var a71=($)=>{let Z=Je($);if(!Z)throw TypeError("env has to include the 2nd argument of fetch.");if(typeof Z.requestIP!=="function")throw TypeError("server.requestIP is not a function.");let Q=Z.requestIP($.req.raw);if(!Q)return{remote:{}};return{remote:{address:Q.address,addressType:Q.family==="IPv6"||Q.family==="IPv4"?Q.family:void 0,port:Q.port}}};var Fl$=D(()=>{aT0()});var Ul$=D(()=>{au$();Jl$();Hl$();Fl$();aT0()});var Nl$;var Bl$=D(()=>{Nl$={google:{name:"Google",icon:"https://assets.decocache.com/webdraw/eb7480aa-a68b-4ce4-98ff-36aa121762a7/google.svg"},github:{name:"GitHub",icon:"https://assets.decocache.com/decocms/e02ce92e-6684-41a6-acfc-432977eb4878/github.png"},microsoft:{name:"Microsoft",icon:"https://assets.decocache.com/mcp/aa6f6e1a-6526-4bca-99cc-82e2ec38b0e4/microsoft.png"}}});function Ol$(){let $=Object.keys(e8.socialProviders??{}),Z=$.length>0,Q=$.map((Y)=>({name:Y,icon:Nl$[Y].icon})),X=M0().localMode;return{emailAndPassword:{enabled:e8.emailAndPassword?.enabled??!1},magicLink:{enabled:e8.magicLinkConfig?.enabled??!1},emailOtp:{enabled:e8.emailOtpConfig?.enabled??!1},resetPassword:{enabled:yT0},socialProviders:{enabled:Z,providers:Q},sso:e8.ssoConfig?{enabled:!0,providerId:e8.ssoConfig.providerId}:{enabled:!1},stdioEnabled:X,localMode:mU()}}async function RJ6($,Z,Q){try{if(!e8.inviteEmailProviderId||!e8.emailProviders||e8.emailProviders.length===0)return;let X=p3(e8.emailProviders,e8.inviteEmailProviderId);if(!X)return;let Y=await $.selectFrom("member").innerJoin("user","user.id","member.userId").select(["user.email as email","member.role as role"]).where("member.organizationId","=",Z.id).execute(),G=Im,J=Y.filter((H)=>(H.role??"").split(",").map((F)=>F.trim()).some((F)=>G.includes(F)));if(J.length===0)return;let W=i3(X),K=`${K9()}/${Z.slug}/settings/members`;await Promise.allSettled(J.map((H)=>W({to:H.email,subject:`New request to join ${Z.name}`,html:n3({preheader:`${Q} requested to join ${Z.name}.`,heading:"New join request",subheading:`<strong>${Q}</strong> requested to join <strong>${Z.name}</strong> on deco Studio.`,body:cE("Review request",K),footnote:"You can approve or deny this request from your members settings."})})))}catch(X){console.error("[Auth] Failed to notify admins of join request:",X)}}var LN,Dl$;var e71=D(()=>{h$();Ul$();y4();E$();WG();UJ();Q71();Ai0();fT0();Qg();rQ();S5();Gc0();Bl$();n_();Kx();LN=new Q1;LN.post("/local-session",async($)=>{if(!mU())return $.json({success:!1,error:"Local mode is not active"},403);let Z;try{Z=a71($).remote.address}catch{}if(!(Z==="127.0.0.1"||Z==="::1"||Z==="::ffff:127.0.0.1"))return $.json({success:!1,error:"Forbidden"},403);try{let{waitForSeed:X}=await Promise.resolve().then(() => (n_(),OE0));await X();let{auth:Y}=await Promise.resolve().then(() => (WG(),Dh$)),G=await xa0();if(!G)return $.json({success:!1,error:"Local admin user not found"},500);let J=await BE0();return await Y.api.signInEmail({body:{email:G.email,password:J},asResponse:!0})}catch(X){return console.error("Failed to create local session:",X),$.json({success:!1,error:X instanceof Error?X.message:"Failed to create local session"},500)}});LN.get("/my-capabilities/:slug",async($)=>{let Z=$.req.param("slug"),Q=await Q8.api.getSession({headers:$.req.raw.headers});if(!Q?.user)return $.json({error:"Authentication required"},401);let X=Z8().db,Y=await X.selectFrom("organization").select(["id"]).where("slug","=",Z).executeTakeFirst();if(!Y)return $.json({role:null,capabilities:{}});let J=(await X.selectFrom("member").select(["role"]).where("userId","=",Q.user.id).where("organizationId","=",Y.id).executeTakeFirst())?.role??null;if(!J)return $.json({role:null,capabilities:{}});if(UZ(J))return $.json({role:J,capabilities:cb1()});if(J==="user")return $.json({role:J,capabilities:ky0({self:[...U60]})});let W=await X.selectFrom("organizationRole").select(["permission"]).where("role","=",J).where("organizationId","=",Y.id).executeTakeFirst(),K={},H=W?.permission;if(typeof H==="string")try{let F=JSON.parse(H);if(F&&typeof F==="object"&&!Array.isArray(F))K=F}catch{K={}}return $.json({role:J,capabilities:ky0(K)})});LN.get("/domain-lookup",async($)=>{let Z=await Q8.api.getSession({headers:$.req.raw.headers});if(!Z?.user)return $.json({success:!1,error:"Authentication required"},401);if(!Z.user.emailVerified)return $.json({found:!1,organizations:[]});let Q=Z.user.email?.split("@")[1]?.toLowerCase();if(!Q||$W.has(Q))return $.json({found:!1,organizations:[]});try{let Y=(await new ZG(Z8().db).getAllByDomain(Q)).filter(vT0);if(Y.length===0)return $.json({found:!1,organizations:[]});let G=await Z8().db.selectFrom("organization").select(["id","name","slug","logo","metadata"]).where("id","in",Y.map((K)=>K.organizationId)).execute(),J=new Map(G.map((K)=>[K.id,K])),W=Y.map((K)=>{let H=J.get(K.organizationId);if(!H)return null;if(p9(H))return null;return{id:H.id,name:H.name,slug:H.slug,logo:H.logo,joinMode:K.joinMode}}).filter((K)=>K!==null);return $.json({found:W.length>0,organizations:W})}catch(X){return console.error("[Auth] Domain lookup failed:",X),$.json({success:!1,error:"Domain lookup failed"},500)}});LN.post("/domain-join",async($)=>{let Z=await Q8.api.getSession({headers:$.req.raw.headers});if(!Z?.user)return $.json({success:!1,error:"Authentication required"},401);if(!Z.user.emailVerified)return $.json({success:!1,error:"Email must be verified to join"},403);let Q=Z.user.email?.split("@")[1]?.toLowerCase();if(!Q||$W.has(Q))return $.json({success:!1,error:"Generic email domains cannot auto-join"},403);let X=await $.req.json().catch(()=>({})),Y=typeof X.organizationSlug==="string"&&X.organizationSlug.trim()?X.organizationSlug.trim():null;try{let G=Z8().db,K=(await new ZG(G).getAllByDomain(Q)).filter((B)=>B.verificationStatus==="verified"&&B.joinMode==="auto");if(K.length===0)return $.json({success:!1,error:"Auto-join is not available for this domain"},403);let H=await G.selectFrom("organization").select(["id","slug","metadata"]).where("id","in",K.map((B)=>B.organizationId)).execute(),F=new Map(H.filter((B)=>!p9(B)).map((B)=>[B.id,{id:B.id,slug:B.slug}])),U=K.flatMap((B)=>{let O=F.get(B.organizationId);return O?[O]:[]});if(U.length===0)return $.json({success:!1,error:"Auto-join is not available for this domain"},403);let N;if(Y){let B=U.find((O)=>O.slug===Y);if(!B)return $.json({success:!1,error:"This organization is not available for auto-join with your email domain."},403);N=B}else if(U.length===1)N=U[0];else return $.json({success:!1,error:"Multiple organizations match this domain. Please pick one.",requiresSelection:!0},409);try{await Q8.api.addMember({body:{userId:Z.user.id,role:"user",organizationId:N.id}})}catch(B){if(!dO(B))return console.error("[Auth] Domain join addMember failed:",B),$.json({success:!1,error:"Failed to join organization"},500)}return V1.capture({distinctId:Z.user.id,event:"organization_domain_joined",groups:{organization:N.id},properties:{organization_id:N.id,organization_slug:N.slug,email_domain:Q}}),$.json({success:!0,slug:N.slug})}catch(G){return V1.captureException(G,Z.user.id),console.error("[Auth] Domain join failed:",G),$.json({success:!1,error:"Failed to join organization"},500)}});LN.post("/domain-setup",async($)=>{let Z=await Q8.api.getSession({headers:$.req.raw.headers});if(!Z?.user)return $.json({success:!1,error:"Authentication required"},401);if(!Z.user.emailVerified)return $.json({success:!1,error:"Email must be verified"},403);let Q=Z.user.email?.split("@")[1]?.toLowerCase();if(!Q||$W.has(Q))return $.json({success:!1,error:"Corporate email required"},403);let X=await $.req.json().catch(()=>({})),Y=typeof X.name==="string"&&X.name.trim().length>0?X.name.trim():null,G=typeof X.logo==="string"&&X.logo.length>0?X.logo:null,J=X.claimDomain!==!1;try{let W=Z8().db,K=new ZG(W),H=await K.getAllByDomain(Q);if(H.length>0){let z=await W.selectFrom("member").innerJoin("organization","organization.id","member.organizationId").select(["organization.slug"]).where("member.userId","=",Z.user.id).where("member.organizationId","in",H.map((P)=>P.organizationId)).executeTakeFirst();if(z)return $.json({success:!0,slug:z.slug,alreadyExists:!0})}let F=Q.split(".")[0]??Q,U=Y??F.charAt(0).toUpperCase()+F.slice(1),N=(Y??F).toLowerCase().trim().replace(/[^a-z0-9\s_-]+/g,"").replace(/[\s_-]+/g,"-").replace(/^-+|-+$/g,"")||F.toLowerCase().replace(/[^a-z0-9-]/g,""),B=null;for(let P=0;P<3;P++){let A=P===0?"":`-${Math.random().toString(36).slice(2,6)}`,q=P===0?U:`${U}${A}`,k=`${N}${A}`;try{B=await Q8.api.createOrganization({body:{name:q,slug:k,userId:Z.user.id}});break}catch(M){if(!(M instanceof Error&&("body"in M)&&M.body?.code==="ORGANIZATION_ALREADY_EXISTS")||P===2)throw M}}if(!B?.id)throw Error("Failed to create organization");let O=B.id;if(J)await K.add(O,Q,{joinMode:"auto",verificationStatus:"verified",verificationMethod:"email"});let w=!1,L=null,E=null;try{let z=M0().firecrawlApiKey;if(z){let P=await a70(Q,z,U);if(P){let A=new Vp(Z8().db),q=await A.create(O,P);if(await A.setDefault(q.id,O),w=!0,P.name&&P.name!==U)L=P.name;E=P.favicon??P.logo??null}}}catch(z){console.error("[Auth] Brand extraction failed (non-fatal):",z)}let j={};if(!Y&&L)j.name=L;if(G)j.logo=G;else if(E)j.logo=E;if(Object.keys(j).length>0)try{await Q8.api.updateOrganization({headers:$.req.raw.headers,body:{organizationId:O,data:j}})}catch(z){console.error("[Auth] Org update failed (non-fatal):",z)}return V1.identify({distinctId:Z.user.id,properties:{email:Z.user.email,$set:{email:Z.user.email},$set_once:{first_organization_created_at:new Date().toISOString()}}}),V1.groupIdentify({groupType:"organization",groupKey:O,properties:{name:B.slug??N,slug:B.slug??N,email_domain:Q,brand_extracted:w,created_at:new Date().toISOString()}}),V1.capture({distinctId:Z.user.id,event:"organization_created",groups:{organization:O},properties:{organization_id:O,organization_slug:B.slug??N,email_domain:Q,brand_extracted:w}}),$.json({success:!0,slug:B.slug??N,brandExtracted:w})}catch(W){return V1.captureException(W,Z.user?.id),console.error("[Auth] Domain setup failed:",W),$.json({success:!1,error:"Failed to set up organization"},500)}});LN.get("/org-access-status/:slug",async($)=>{let Z=$.req.param("slug"),Q=await Q8.api.getSession({headers:$.req.raw.headers});if(!Q?.user)return $.json({success:!1,error:"Authentication required"},401);let X=Z8().db,Y=await X.selectFrom("organization").select(["id","name","slug","logo"]).where("slug","=",Z).executeTakeFirst();if(!Y)return $.json({status:"not-found"});let G={id:Y.id,name:Y.name,slug:Y.slug,logo:Y.logo};if(await X.selectFrom("member").select(["id"]).where("userId","=",Q.user.id).where("organizationId","=",Y.id).executeTakeFirst())return $.json({status:"member",organization:G});try{let W=await Q8.api.listUserInvitations({headers:$.req.raw.headers}),K=Date.now(),H=W.find((F)=>F.organizationId===Y.id&&F.status==="pending"&&new Date(F.expiresAt).getTime()>K);if(H)return $.json({status:"pending-invite",invitation:{id:H.id},organization:G})}catch(W){console.error("[Auth] listUserInvitations failed:",W)}if(Q.user.emailVerified){let W=Q.user.email?.split("@")[1]?.toLowerCase();if(W&&!$W.has(W)){let K=await new ZG(X).getByOrgAndDomain(Y.id,W);if(K?.verificationStatus==="verified"){if(K.joinMode==="auto")return $.json({status:"auto-domain-join",organization:{...G,domain:W}});if(K.joinMode==="request"){let H=await new dy(X).getPending(Y.id,Q.user.id);return $.json({status:H?"request-pending":"can-request",organization:{...G,domain:W}})}}}}return $.json({status:"no-access",organization:G})});LN.post("/domain-request-join",async($)=>{let Z=await Q8.api.getSession({headers:$.req.raw.headers});if(!Z?.user)return $.json({success:!1,error:"Authentication required"},401);if(!Z.user.emailVerified)return $.json({success:!1,error:"Email must be verified to request access"},403);let Q=Z.user.email?.split("@")[1]?.toLowerCase();if(!Q||$W.has(Q))return $.json({success:!1,error:"Generic email domains cannot request access"},403);let X=await $.req.json().catch(()=>({})),Y=typeof X.organizationSlug==="string"&&X.organizationSlug.trim()?X.organizationSlug.trim():null;if(!Y)return $.json({success:!1,error:"organizationSlug is required"},400);try{let G=Z8().db,J=await G.selectFrom("organization").select(["id","slug","name"]).where("slug","=",Y).executeTakeFirst();if(!J)return $.json({success:!1,error:"Organization not found"},404);let W=await new ZG(G).getByOrgAndDomain(J.id,Q);if(!W||W.verificationStatus!=="verified"||W.joinMode!=="request")return $.json({success:!1,error:"This organization is not accepting requests for your domain."},403);if(await G.selectFrom("member").select(["id"]).where("userId","=",Z.user.id).where("organizationId","=",J.id).executeTakeFirst())return $.json({success:!0,slug:J.slug,alreadyMember:!0});return await new dy(G).create(J.id,Z.user.id),await RJ6(G,J,Z.user.email),V1.capture({distinctId:Z.user.id,event:"organization_join_requested",groups:{organization:J.id},properties:{organization_id:J.id,organization_slug:J.slug,email_domain:Q}}),$.json({success:!0,status:"pending"})}catch(G){return V1.captureException(G,Z.user.id),console.error("[Auth] Domain request-join failed:",G),$.json({success:!1,error:"Failed to request access"},500)}});LN.post("/ensure-organization",async($)=>{let Z=null;try{if(Z=await Q8.api.getSession({headers:$.req.raw.headers}),!Z?.user)return $.json({success:!1,error:"Authentication required"},401);let Q=await bT0({db:Z8().db,authApi:Q8.api,user:{id:Z.user.id,email:Z.user.email,name:Z.user.name??null,emailVerified:!!Z.user.emailVerified},allowCreate:!0,createdVia:"commerce_onboarding_recovery"});if(Q.status==="ambiguous")return $.json({success:!1,status:Q.status,domain:Q.domain,organizations:Q.organizations});if(Q.status==="skipped")return $.json({success:!1,status:Q.status,reason:Q.reason,domain:Q.domain,error:"Organization creation is not available."},409);if(Q.status==="already_has_organization")return $.json({success:!0,status:Q.status,organization:Q.organization,domain:Q.domain});return $.json({success:!0,status:Q.status,organization:Q.organization,domain:Q.domain})}catch(Q){let X=Z?.user?.id;if(X)V1.captureException(Q,X);return console.error("[Auth] ensure organization failed:",Q),$.json({success:!1,error:"Failed to ensure organization"},500)}});Dl$=LN});import{createHmac as qJ6}from"crypto";function wl$($){return/^Bearer\s+(.+)$/i.exec($.get("authorization")??"")?.[1]?.trim()||null}function Ll$($){if(!$||typeof $!=="object"||!("userId"in $)||typeof $.userId!=="string")return null;return $.userId}function IJ6($){if(!$||typeof $!=="object"||!("user"in $))return null;let{user:Z}=$;if(!Z||typeof Z!=="object"||!("id"in Z)||typeof Z.id!=="string")return null;return Z.id}function MJ6($){if(!$||typeof $!=="object"||!("valid"in $)||$.valid!==!0||!("key"in $))return null;return Ll$($.key)}async function El$($){let Z=new Headers({authorization:`Bearer ${$}`,"X-MCP-Session-Auth":"true"}),Q=await Q8.api.getMcpSession({headers:Z}).catch(()=>null),X=Ll$(Q);if(X)return X;let Y=await Q8.api.verifyApiKey({body:{key:$}}).catch(()=>null);return MJ6(Y)}function kJ6($,Z){let Q=qJ6("sha256",Z).update($).digest("base64");return encodeURIComponent(`${$}.${Q}`)}var $Q1,jl$;var zl$=D(()=>{h$();WG();$Q1=new Q1;$Q1.get("/me",async($)=>{let Z=wl$($.req.raw.headers),Q;if(Z)Q=await El$(Z);else{let X=await Q8.api.getSession({headers:$.req.raw.headers}).catch(()=>null);Q=IJ6(X)}if(!Q)return $.json({error:"unauthorized"},401);return $.json({userId:Q})});$Q1.post("/session-from-oauth",async($)=>{let Z=wl$($.req.raw.headers);if(!Z)return $.json({error:"unauthorized"},401);let Q=await El$(Z);if(!Q)return $.json({error:"unauthorized"},401);try{let X=await Q8.$context,Y=await X.internalAdapter.createSession(Q,!1),G=kJ6(Y.token,X.secret);return $.json({sessionToken:G})}catch(X){return console.error("[desktop-auth] failed to mint a session from an OAuth bearer:",X instanceof Error?X.message:String(X)),$.json({error:"failed to mint a session"},500)}});jl$=$Q1});var Cl=($)=>{let Z=$.req.header("sec-fetch-dest");if(Z!==void 0)return Z==="document";let Q=$.req.header("accept")??"";return Q.includes("text/html")&&!/text\/html\s*;\s*q\s*=\s*0/.test(Q)};function VJ6($){let Z=$.req.path;return $.req.method==="GET"&&/\/fs\/[^/]+\/read$/.test(Z)||$.req.method==="POST"&&/\/fs\/[^/]+\/unlock$/.test(Z)}function ZQ1($){let Z=$.auth?.apiKey?.metadata;if(!Z||typeof Z!=="object"||Array.isArray(Z)||!("organization"in Z))return{present:!1};let Q=Z.organization;if(!Q||typeof Q!=="object"||Array.isArray(Q))return{present:!0};let X=Q.id;return{present:!0,id:typeof X==="string"?X:void 0}}function CJ6($){let Z=$.split("/").filter(Boolean);if(Z[0]!=="api")return!1;let Q=Z.slice(2);return SJ6.some((X)=>X.length===Q.length&&X.every((Y,G)=>Y==="*"||Y===Q[G]))}var SJ6,Kf=async($,Z)=>{let Q=$.req.param("org");if(!Q)return $.json({error:"org slug missing in path"},400);let X=$.get("studioContext");if(!X?.db)return $.json({error:"studioContext not initialized"},500);let Y=X.db,G=CJ6($.req.path),J=await Y.selectFrom("organization").select(["id","slug","name","metadata"]).where((F)=>G?F.or([F("slug","=",Q),F("id","=",Q)]):F("slug","=",Q)).executeTakeFirst();if(!J){if(Cl($))return $.redirect(`/${encodeURIComponent(Q)}`,302);return $.json({error:`organization "${Q}" not found`},404)}let W=ZQ1(X);if(X.auth?.apiKey?.id&&W.present&&W.id!==J.id)return $.json({error:"forbidden: API key is scoped to another organization"},403);if(X.auth?.tokenOrganizationId&&X.auth.tokenOrganizationId!==J.id)return $.json({error:"forbidden: token is scoped to another organization"},403);if(p9(J)){if(Cl($))return $.redirect(`/${encodeURIComponent(Q)}`,302);return $.json({error:`organization "${Q}" not found`},404)}let K=X.auth?.user?.id,H;if(K){let F=await Y.selectFrom("member").select(["role"]).where("userId","=",K).where("organizationId","=",J.id).executeTakeFirst();if(!F){if(!VJ6($)){if(Cl($))return $.redirect(`/${encodeURIComponent(J.slug)}`,302);return $.json({error:"forbidden: not a member of organization"},403)}}else H=F.role}return X.organization={id:J.id,slug:J.slug,name:J.name,role:H},X.access.setOrganizationId(J.id),X.access.setRole(H),gD(X,J),await Z()};var eT0=D(()=>{dU();SJ6=[["vault","connections","*","access-token"],["vault","connections","*","configuration"],["internal","task-board","import"],["internal","commerce-diagnostic","share-invite"]]});function _J6($){if(GQ($.id)!==null)return!0;if(Dc1($.id))return!0;let Z=$.metadata?.liveAgentId;return typeof Z==="string"&&Z.length>0}function vJ6($,Z){let Q=new Map,X=(Y)=>{let G=Q.get(Y);if(G)return G;let J=(async()=>{if(!(await $.storage.orgSsoConfig.getByOrgId(Y))?.enforced)return!0;return await $.storage.orgSsoSessions.isValid(Z,Y)})();return Q.set(Y,J),J};return async(Y)=>{let G=await Promise.all(Y.map((J)=>X(J.orgId)));return Y.filter((J,W)=>G[W]===!0)}}function fJ6($){let Z=$.auth?.apiKey?.id?ZQ1($):{present:!1,id:void 0};if(Z.present&&!Z.id)return $20;let Q=$.auth?.tokenOrganizationId;if(Z.id&&Q&&Z.id!==Q)return $20;let X=Z.id??Q??null;if(X===null&&$.auth?.apiKey?.id)return $20;return X}var Pl$="/api/_me",$20,bJ6=256,xJ6=20,yJ6=50,gJ6=10,hJ6=5,Al$=()=>{let $=new Q1;return $.get("/projects/search",async(Z)=>{let Q=Z.get("studioContext");Z.header("Cache-Control","private, no-store");let X=n0(Q);if(!X)return Z.json({error:"Unauthorized"},401);let Y=fJ6(Q);if(Y===$20)return Z.json({error:"forbidden: credential is scoped to another organization"},403);let G=(Z.req.query("q")??"").trim();if(!G)return Z.json({items:[]});if(G.length>bJ6)return Z.json({error:"query too long"},400);let J=Number.parseInt(Z.req.query("limit")??"",10),W=Number.isFinite(J)&&J>0?Math.min(J,yJ6):xJ6,K=vJ6(Q,X),H=W+gJ6,F=[];for(let U=0;U<hJ6&&F.length<W;U++){let N=await Q.storage.virtualMcps.searchAcrossMemberships({userId:X,term:G,limit:H,offset:U*H,organizationId:Y}),B=N.filter((O)=>!_J6(O)).filter((O)=>!p9({metadata:O.organization_metadata})).map((O)=>({id:O.id,title:O.title,icon:O.icon,orgId:O.organization_id,orgName:O.organization_name,orgSlug:O.organization_slug}));if(F.push(...await K(B)),N.length<H)break}return Z.json({items:F.slice(0,W)})}),$};var Tl$=D(()=>{h$();k8();eT0();$20=Symbol("deny")});import{z as _l}from"zod";var uJ6,lJ6,cJ6=200,dJ6=2000,mJ6=60,iJ6=2000,pJ6,Rl$;var ql$=D(()=>{uJ6=["warn","block"],lJ6=_l.enum(uJ6),pJ6=_l.string().max(iJ6).refine(($)=>{try{let Z=new URL($);return Z.protocol==="https:"||Z.protocol==="http:"}catch{return!1}},{message:"ctaUrl must be an absolute http(s) URL"}),Rl$=_l.object({severity:lJ6,title:_l.string().trim().min(1).max(cJ6),message:_l.string().trim().min(1).max(dJ6),ctaLabel:_l.string().trim().max(mJ6).nullable().optional(),ctaUrl:pJ6.nullable().optional()}).refine(($)=>!$.ctaLabel===!$.ctaUrl,{message:"ctaLabel and ctaUrl must be set together",path:["ctaUrl"]})});import{z as QQ1}from"zod";function XQ1($){let Z=$??{},Q=new Set([...Object.keys(wj.shape),...Object.keys(Z)]),X={};for(let Y of Q)X[Y]=FX(Z,Y);return{flags:Z,effective:X}}var nJ6,Il$;var Ml$=D(()=>{n9();nJ6=QQ1.string().min(1).max(64).regex(/^[a-z][a-z0-9]*(?:_[a-z0-9]+)*$/),Il$=QQ1.record(nJ6,QQ1.boolean())});function kl$($,Z,Q){let X=Q;for(;;){if(X=$.indexOf(Z,X),X===-1)return-1;let Y=$[X+Z.length];if(Y===void 0||Y===`
|
|
2716
2716
|
`||Y==="\r")return X;X+=Z.length}}function Vl$($,Z){let Q=kl$($,tJ6(Z),0);if(Q===-1)return null;let X=$.indexOf(`
|
|
2717
2717
|
`,Q);if(X===-1)return null;let Y=kl$($,oJ6(Z),X);if(Y===-1)return null;let G=$.lastIndexOf(`
|
|
2718
2718
|
`,Y);return{from:X+1,to:G+1}}function Sl$($,Z){let Q=Vl$($,Z);return Q?$.slice(Q.from,Q.to):null}function Cl$($,Z,Q){let X=Vl$($,Z);if(!X)throw Error(`prompt region "${Z}" not found in source`);let Y=Q.endsWith(`
|
|
@@ -2925,7 +2925,7 @@ Respond with ONLY a JSON object of this shape, and nothing else:
|
|
|
2925
2925
|
${G.join(`
|
|
2926
2926
|
`)}`:Y}function bE6($){let Z=new Set;for(let Q of $)for(let X of Q.split(`
|
|
2927
2927
|
`)){let Y=X.trim();if(/^Co-authored-by:\s/i.test(Y))Z.add(Y)}return[...Z]}var op$=200,qE6=12,ME6,VE6=300,KR0=3;var jY1=D(()=>{iZ();WR0();ME6={aheadBy:0,behindBy:0,files:[]}});function yE6($){if(!$||$.includes(".."))return!1;return xE6.test($)}function sp$($){let Z=typeof $.__resolveType==="string"?$.__resolveType:null;if(!Z||!yE6(Z))return null;let{__resolveType:Q,...X}=$;return{resolveType:Z,payload:X}}function ap$($,Z){return`${$.replace(/\/+$/,"")}/deco/invoke/${Z}`}var xE6;var ep$=D(()=>{xE6=/^[\w./@-]+$/});function me($,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 Zn$($,Z,Q,X){let Y=$.organization?.id;if(!Y)throw new bw(DZ);let G=await ZD($.storage,Y,X);if(G&&await PJ($.storage,G)){let H=await oK($,G,{forceRefresh:!0}).catch((F)=>{throw new bw(F instanceof Error?F.message:DZ)});await $n$($,Z,Q,H);return}if(!X.connectionId)throw new bw("Push requires a connected git account. Connect the repository's provider for this project and restart the sandbox.");await QD({ctx:$,connectionId:X.connectionId,organizationId:Y,forceRefresh:!0,onLegacyMintError:(H)=>{let F=H instanceof Error?H.message:DZ;throw new bw(F)}});let{cloneUrl:J,gitUserName:W,gitUserEmail:K}=await rK(X.connectionId,X.owner,X.name,$.db,$.vault).catch((H)=>{let{code:F,message:U}=_4$(H instanceof Error?H.message:String(H));throw F?new bw(U):H});await $n$($,Z,Q,{cloneUrl:J,gitUserName:W,gitUserEmail:K})}async function $n$($,Z,Q,X){let{cloneUrl:Y,gitUserName:G,gitUserEmail:J}=X,W=$c($),K=await Z.proxyDaemonRequest(Q,"/_sandbox/config",{method:"PUT",headers:new Headers({"content-type":"application/json"}),body:JSON.stringify({git:{repository:{cloneUrl:Y},identity:{userName:G,userEmail:J}},...W?{operator:W}:{}})});if(!K.ok){let H=await CD(K,gE6).catch(()=>K.statusText);throw Error(`Failed to refresh sandbox git credentials (${K.status}): ${H}`)}}var gE6=10485760,bw;var zY1=D(()=>{AJ();s20();Bo();RQ0();fg();iZ();bw=class bw extends Error{constructor($){super($);this.name="GitPushAuthError"}}});function uE6($){let Z=$.startsWith("thread:")?$.slice(7):$;if(!Z||Z.length>255||Z.includes("..")||Z.startsWith("/")||Z.endsWith("/")||Z.endsWith(".lock")||!hE6.test(Z))throw Error(`Invalid branch name: ${$}`)}function Tf($){return AbortSignal.any([$.req.raw.signal,AbortSignal.timeout(cE6)])}async function mE6($,Z){let Q=$.var.studioContext,X=qJ(Z.branch),Y=$.req.query("thread")??X,G=Y&&Y===X?Z.branchThread:Y?await Q.storage.threads.get(Y).catch(()=>null):null,J=G?.virtual_mcp_id===Z.virtualMcpId?G:null,W=P_(J?.metadata?.runtime);if(W)return W;let K=BL0(Z.virtualMcpMetadata),H=K==="cms"?await $Y1(Q,{claimName:Z.claimName}):"alive",F=K==="cms"&&H!=="alive"?"cms":"sandbox",U=!!J&&(H==="gone"||H==="alive"&&K==="cms");if(U&&J)Oo(Q,J.id,F);if(K==="cms")console.log("sandbox proxy: no runtime stamp",{route:$.req.path,method:$.req.method,reason:J?"unstamped":"threadless",liveness:H,resolved:F,stamped:U});return F}async function iE6($){let Z=$.get("vmClaim");if(Z.runner)return Z.runner;try{return await jX($.var.studioContext)}catch{return null}}function Rf($){let{runner:Z}=$.get("vmClaim");if(!Z)return $.json({error:"No sandbox runner configured"},503);return Z}async function Gc($){let{virtualMcpMetadata:Z,connectionIds:Q}=$.get("vmClaim"),X=$.var.studioContext,Y=me(Z,Q);if(!Y)throw new T1({provider:"github",status:404,message:"Project has no GitHub repository"});let G=p(X);return Cg(X,G.id,Y)}function PY1($,Z){let Q=Z instanceof Error?Z.message:String(Z),X=P8$(Z);if(X!==void 0)return $.json({error:Q},429,{...B5,...X===null?{}:{"Retry-After":String(Math.ceil(X/1000))}});if(Z instanceof b5)return $.json({error:Q},409,B5);let Y=jJ(Z);if(Y!==null){let G=Y===404?404:Y===409||Y===422?409:502;return $.json({error:Q},G,B5)}return $.json({error:Q},502,B5)}async function Yn$($,Z,Q){let X;try{X=await fetch(Z,Q)}catch{return $.json({error:"Preview unreachable"},502)}let Y;try{Y=await X.text()}catch{return $.json({error:"Preview unreachable"},502)}return new Response(Y,{status:X.status,headers:{"content-type":X.headers.get("content-type")??"application/json"}})}async function Gn$($){try{let Z=await Gc($),Q=await HR0(Z,$.get("vmClaim").branch);return $.json(Q,200,B5)}catch(Z){return PY1($,Z)}}function ie($,Z){let X=(NR0.get($)??Promise.resolve()).catch(()=>{}).then(Z),Y=X.catch(()=>{});return NR0.set($,Y),Y.finally(()=>{if(NR0.get($)===Y)NR0.delete($)}),X}async function X7($,Z,Q){if(!Q?.runner&&$.get("vmClaim").runtime==="cms")return $.json({error:"sandbox not found: this session is sandbox-less"},404,B5);let X=Q?.runner??Rf($);if(X instanceof Response)return X;let{claimName:Y,userId:G,projectRef:J}=$.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 X.proxyDaemonRequest(Y,Z,U);if(Q?.map404to410&&B.status===404){try{await B.body?.cancel()}catch{}if(await X.adoptLiveClaim({userId:G,projectRef:J},Y))B=await X.proxyDaemonRequest(Y,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",...B5}})}}let O=await B.text(),w=Q?.redactRepoDir?pE6(O):O,L=B.headers.get("content-type")??"application/json";return new Response(w,{status:B.status,headers:{"content-type":L,...B5}})};try{if(F){let B=N();return B.catch(()=>{}),await Promise.race([B,new Promise((w,L)=>{if(F.aborted)return L(F.reason);F.addEventListener("abort",()=>L(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 pE6($){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 BR0($,Z,Q,X="GET",Y){let G=await $.proxyDaemonRequest(Z,Q,{method:X,headers:new Headers,body:null});if(G.status===404&&Y){try{await G.body?.cancel()}catch{}if(await $.adoptLiveClaim(Y,Z))G=await $.proxyDaemonRequest(Z,Q,{method:X,headers:new Headers,body:null})}if(G.status===404){try{await G.body?.cancel()}catch{}throw Error("SANDBOX_GONE")}let J=await G.text();if(!G.ok){let W=`Daemon error (${G.status})`;try{W=JSON.parse(J).error??W}catch{}throw Error(W)}return JSON.parse(J)}function nE6($){return Jn$.includes($)}var hE6,Qn$=524288,lE6=65536,cE6=1e4,Xn$=2000,dE6,NR0,B5,Jn$,Wn$=()=>{let $=new Q1;$.use("/:virtualMcpId/:branch/*",dE6),$.post("/:virtualMcpId/:branch/write",(Q)=>X7(Q,"/_sandbox/write",{forwardJsonBody:!0,signal:Tf(Q)})),$.post("/:virtualMcpId/:branch/unlink",(Q)=>X7(Q,"/_sandbox/unlink",{forwardJsonBody:!0,signal:Tf(Q)})),$.post("/:virtualMcpId/:branch/mkdir",(Q)=>X7(Q,"/_sandbox/mkdir",{forwardJsonBody:!0,signal:Tf(Q)})),$.post("/:virtualMcpId/:branch/rename",(Q)=>X7(Q,"/_sandbox/rename",{forwardJsonBody:!0,signal:Tf(Q)})),$.post("/:virtualMcpId/:branch/read",(Q)=>X7(Q,"/_sandbox/read",{forwardJsonBody:!0,signal:Tf(Q)})),$.post("/:virtualMcpId/:branch/glob",(Q)=>X7(Q,"/_sandbox/glob",{forwardJsonBody:!0,signal:Tf(Q)})),$.post("/:virtualMcpId/:branch/grep",(Q)=>X7(Q,"/_sandbox/grep",{forwardJsonBody:!0,signal:Tf(Q)})),$.post("/:virtualMcpId/:branch/exec/:script",async(Q)=>{let X=Q.req.param("script");if(!X)return Q.json({error:"missing script name"},400);return X7(Q,`/_sandbox/exec/${encodeURIComponent(X)}`)}),$.post("/:virtualMcpId/:branch/exec/:script/kill",async(Q)=>{let X=Q.req.param("script");if(!X)return Q.json({error:"missing script name"},400);return X7(Q,`/_sandbox/exec/${encodeURIComponent(X)}/kill`)}),$.get("/:virtualMcpId/:branch/config",(Q)=>X7(Q,"/_sandbox/config",{method:"GET",map404to410:!0,redactRepoDir:!0})),$.put("/:virtualMcpId/:branch/config",(Q)=>X7(Q,"/_sandbox/config",{method:"PUT",forwardJsonBody:!0,map404to410:!0})),$.post("/:virtualMcpId/:branch/setup/:step",async(Q)=>{let X=Q.req.param("step");if(!X||!nE6(X))return Q.json({error:`step must be one of: ${Jn$.join(", ")}`},400);let Y=Q.get("vmClaim"),G=await $Y1(Q.var.studioContext,{claimName:Y.claimName})==="gone"?null:await iE6(Q);if(!G)return Q.json({error:"sandbox not found: nothing is running at this ref"},404,B5);if(X==="start"){let J=p(Q.var.studioContext),W=wh(Y.virtualMcpMetadata);try{await HL0({ctx:Q.var.studioContext,runner:G,handle:Y.claimName,orgId:J.id,userId:Y.callerUserId,entries:W})}catch(K){let H=K instanceof Error?K.message:String(K);return Q.json({error:`Failed to push env to daemon: ${H}`},502)}}return X7(Q,`/_sandbox/setup/${X}`,{signal:Q.req.raw.signal,map404to410:!0,runner:G})}),$.get("/:virtualMcpId/:branch/events",(Q)=>{let X=Q.get("vmClaim");if(!X.runner)return qN(Q,async(Y)=>{await Y.writeSSE({event:"phase",data:JSON.stringify({kind:"failed",reason:"unknown",message:"No sandbox runner configured on this studio instance."})})});return Gp$(Q,{ctx:Q.var.studioContext,claimName:X.claimName,runner:X.runner,virtualMcpId:X.virtualMcpId,branch:X.branch,userId:X.userId,projectRef:X.projectRef,virtualMcpMetadata:X.virtualMcpMetadata})}),$.get("/:virtualMcpId/:branch/git/status",(Q)=>{if(Q.get("vmClaim").runtime==="cms")return Gn$(Q);return Z(Q)});let Z=(Q)=>X7(Q,"/_sandbox/git/status",{method:"GET",map404to410:!0,signal:AbortSignal.any([Q.req.raw.signal,AbortSignal.timeout(Xn$)])});return $.post("/:virtualMcpId/:branch/git/status",(Q)=>{if(Q.get("vmClaim").runtime==="cms")return Gn$(Q);return X7(Q,"/_sandbox/git/status",{map404to410:!0,signal:AbortSignal.any([Q.req.raw.signal,AbortSignal.timeout(Xn$)])})}),$.post("/:virtualMcpId/:branch/git/diff",async(Q)=>{let X=Q.get("vmClaim");if(X.runtime==="cms")try{let Y=await Q.req.json().catch(()=>({})),G=await Gc(Q),J=await FR0(G,X.branch,Y.base);return Q.json(J,200,B5)}catch(Y){return PY1(Q,Y)}return X7(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,B5);let X=Rf(Q);if(X instanceof Response)return X;let{claimName:Y,virtualMcpMetadata:G,connectionIds:J}=Q.get("vmClaim"),W=Q.var.studioContext;return ie(Y,async()=>{try{await ZY1(W,X,Y);let K=me(G,J);if(K)await Zn$(W,X,Y,K)}catch(K){if(K instanceof bw)return Q.json({error:K.message},403,B5);let H=K instanceof Error?K.message:String(K);return Q.json({error:H},502,B5)}return X7(Q,"/_sandbox/git/publish",{forwardJsonBody:!0,map404to410:!0})})}),$.post("/:virtualMcpId/:branch/git/discard",async(Q)=>{let X=Q.get("vmClaim");if(X.runtime==="cms")return ie(X.claimName,async()=>{let Y=await Q.req.json().catch(()=>({})),G=Array.isArray(Y.filepaths)?Y.filepaths.filter((J)=>typeof J==="string"):[];if(G.length===0)return Q.json({error:"filepaths is required"},400,B5);try{let J=await Gc(Q);return await rp$(J,X.branch,G),Q.json({ok:!0},200,B5)}catch(J){let W=jJ(J)===409||J instanceof b5?409:502,K=J instanceof Error?J.message:String(J);return Q.json({error:K},W,B5)}});return ie(X.claimName,()=>X7(Q,"/_sandbox/git/discard",{forwardJsonBody:!0,map404to410:!0}))}),$.post("/:virtualMcpId/:branch/git/rebase",async(Q)=>{let X=Q.get("vmClaim");if(X.runtime==="cms")return ie(X.claimName,async()=>{try{let W=await Q.req.json().catch(()=>({})),K=await Gc(Q),H=W.base??await K.getDefaultBranch();return await UR0(K,X.branch,H),Q.json({ok:!0},200,B5)}catch(W){return PY1(Q,W)}});let Y=Rf(Q);if(Y instanceof Response)return Y;let{claimName:G}=Q.get("vmClaim"),J=Q.var.studioContext;return ie(G,async()=>{try{await ZY1(J,Y,G)}catch(W){let K=W instanceof Error?W.message:String(W);return Q.json({error:K},502,B5)}return X7(Q,"/_sandbox/git/rebase",{forwardJsonBody:!0,map404to410:!0})})}),$.post("/:virtualMcpId/:branch/git/suggest-commit",Z9({maxSize:Qn$,onError:(Q)=>Q.json({error:"Payload too large"},413,B5)}),async(Q)=>{let X=Q.get("vmClaim"),Y=null;if(X.runtime!=="cms"){let H=Rf(Q);if(H instanceof Response)return H;Y=H}let{claimName:G,userId:J,projectRef:W}=X,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]=YY1(F)&&N?[F,U]:Y?await Promise.all([BR0(Y,G,"/_sandbox/git/status","GET",{userId:J,projectRef:W}),BR0(Y,G,"/_sandbox/git/diff","GET",{userId:J,projectRef:W})]):await(async()=>{let L=await Gc(Q);return Promise.all([HR0(L,X.branch),FR0(L,X.branch)])})(),w=await Fp$(K,B,O);return Q.json(w,200,B5)}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,B5);return Q.json({error:F},502,B5)}}),$.post("/:virtualMcpId/:branch/git/judge-review",Z9({maxSize:Qn$,onError:(Q)=>Q.json({error:"Payload too large"},413,B5)}),async(Q)=>{let X=Q.get("vmClaim"),Y=null;if(X.runtime!=="cms"){let H=Rf(Q);if(H instanceof Response)return H;Y=H}let{claimName:G,userId:J,projectRef:W}=X,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]=YY1(F)&&N?[F,U]:Y?await Promise.all([BR0(Y,G,"/_sandbox/git/status","GET",{userId:J,projectRef:W}),BR0(Y,G,"/_sandbox/git/diff","GET",{userId:J,projectRef:W})]):await(async()=>{let L=await Gc(Q);return Promise.all([HR0(L,X.branch),FR0(L,X.branch)])})(),w=await Np$(K,B,O,typeof H.language==="string"?H.language:void 0);return Q.json(w,200,B5)}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,B5);return Q.json({error:F},502,B5)}}),$.get("/:virtualMcpId/:branch/preview-fetch",async(Q)=>{let X=Rf(Q);if(X instanceof Response)return X;let{claimName:Y}=Q.get("vmClaim"),G=Q.req.query("path");if(!G||!G.startsWith("/")||G.startsWith("//")||G.includes("..")||G.includes("\\"))return Q.json({error:"Path not allowed"},403);let J;try{J=await X.getPreviewUrl(Y)}catch{return Q.json({error:"Preview not available"},502)}if(!J)return Q.json({error:"Preview not available"},502);let W=J.replace(/\/+$/,"");return Yn$(Q,`${W}${G}`)}),$.post("/:virtualMcpId/:branch/preview-invoke",Z9({maxSize:lE6,onError:(Q)=>Q.json({error:"Payload too large"},413)}),async(Q)=>{let X=Rf(Q);if(X instanceof Response)return X;let{claimName:Y}=Q.get("vmClaim"),G;try{G=await X.getPreviewUrl(Y)}catch{return Q.json({error:"Preview not available"},502)}if(!G)return Q.json({error:"Preview not available"},502);let J;try{J=await Q.req.json()}catch{return Q.json({error:"Invalid JSON body"},400)}if(!J||typeof J!=="object"||Array.isArray(J))return Q.json({error:"Invalid JSON body"},400);let W=sp$(J);if(!W)return Q.json({error:"Invalid or missing __resolveType"},400);let K=ap$(G,W.resolveType);return Yn$(Q,K,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(W.payload),signal:AbortSignal.timeout(30000)})}),$};var Kn$=D(()=>{h$();rH();el();eX1();Ho();Qp$();IJ();Lh();Xp$();HW();Yp$();Jp$();dr0();Uo();WY1();Bp$();iZ();q7();jY1();ep$();zY1();hE6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;dE6=r20(async($,Z)=>{let Q=$.var.studioContext;try{t(Q)}catch{return $.json({error:"Unauthorized"},401)}let X=n0(Q);if(!X)return $.json({error:"Unauthorized"},401);let Y;try{Y=p(Q)}catch{return $.json({error:"Organization scope required"},403)}let G=$.req.param("virtualMcpId"),J=$.req.param("branch");if(!G||!J)return $.json({error:"virtualMcpId and branch are required"},400);try{uE6(J)}catch(w){let L=w instanceof Error?w.message:String(w);return $.json({error:L},400)}let W=await Q.storage.virtualMcps.findById(G);if(!W||W.organization_id!==Y.id)return $.json({error:"Virtual MCP not found"},404);let K=_t({orgId:Y.id,virtualMcpId:G,branch:J}),H=await Yo0(Q,J),F=Go0(H,X),U=Zp$({userId:F,projectRef:K}),N=W.metadata??null,B=await mE6($,{claimName:U,branch:J,virtualMcpId:G,sandboxUserId:F,virtualMcpMetadata:N,branchThread:H});if(B==="cms")return $.set("vmClaim",{claimName:U,callerUserId:X,runner:null,virtualMcpId:G,branch:J,userId:F,projectRef:K,virtualMcpMetadata:N,connectionIds:W.connections?.map((w)=>w.connection_id)??[],runtime:B}),Z();let O;try{O=await jX(Q)}catch{O=null}if(!O)return $.json({error:"No sandbox runner found"},404);return $.set("vmClaim",{claimName:U,callerUserId:X,runner:O,virtualMcpId:G,branch:J,userId:F,projectRef:K,virtualMcpMetadata:N,connectionIds:W.connections?.map((w)=>w.connection_id)??[],runtime:B}),Z()});NR0=new Map;B5={"Cache-Control":"no-store, no-cache, must-revalidate",Pragma:"no-cache"};Jn$=["clone","install","start"]});function Hn$($,Z,Q){let X=AY1.get($);if(!X)X={pending:null,running:!1},AY1.set($,X);if(!X.pending)X.pending={set:new Map,del:new Set,deps:Z,resolvers:[],rejecters:[]};let Y=X.pending;Y.deps=Z;for(let[J,W]of Object.entries(Q.set??{}))Y.set.set(J,W),Y.del.delete(J);for(let J of Q.delete??[])Y.del.add(J),Y.set.delete(J);let G=new Promise((J,W)=>{Y.resolvers.push(J),Y.rejecters.push(W)});if(!X.running)oE6($,X);return G}async function oE6($,Z){Z.running=!0;try{while(Z.pending){let Q=Z.pending;Z.pending=null;try{let X=await rE6(Q);for(let Y of Q.resolvers)Y(X)}catch(X){for(let Y of Q.rejecters)Y(X)}}}finally{if(Z.running=!1,!Z.pending)AY1.delete($)}}async function rE6($){let{client:Z,branch:Q,packagePath:X}=$.deps;for(let Y=0;;Y++){let G=await Yc(Z,Q),J=await Z.listDecofileEntries(G,X),W=wY1(J,X),K=[],H=new Map(W.map((U)=>[U.path,{stem:U.stem,sha:U.sha}]));for(let[U,N]of $.set){let B=LY1(W,U),O=`${JSON.stringify(N,null,2)}
|
|
2928
|
-
`;await pp$(Z.repo,O);let w=B[0]??`${JR0(X)}/${FY1(U)}.json`;K.push({path:w,content:O});let L=w.slice(w.lastIndexOf("/")+1,-5);H.set(w,{stem:L,content:O});for(let E of B.slice(1))K.push({path:E,deleted:!0}),H.delete(E)}for(let U of $.del)for(let N of LY1(W,U))K.push({path:N,deleted:!0}),H.delete(N);if(K.length===0)return G;let F=X?`${X}/.deco/blocks.gen.json`:".deco/blocks.gen.json";if(J.some((U)=>U.type==="blob"&&U.path===F)){let U=await Promise.all([...H.values()].map(async(O)=>({stem:O.stem,content:"content"in O?O.content:await Z.readBlob(O.sha)}))),{decofile:N,skipped:B}=ue(U);if(B.length>0)console.warn("decofile gen: dropped blocks that were not valid JSON",{repo:XW(Z.repo),branch:Q,packagePath:X,blocks:B.map((O)=>O.key)});K.push({path:F,content:N})}try{let{sha:U}=await Z.commitFiles({branch:Q,message:sE6($),expectedHead:G,changes:K});return U}catch(U){if(!(U instanceof b5)||Y>=tE6-1)throw U;await z$(J7(2000,200,Y,2,0.5))}}}function sE6($){let Z=(Y)=>{let G=Y.slice(0,3).join(", ");return Y.length>3?`${G} (+${Y.length-3} more)`:G},Q=[];if($.set.size>0)Q.push(`update ${Z([...$.set.keys()])}`);if($.del.size>0)Q.push(`delete ${Z([...$.del])}`);let X=`chore(decofile): ${Q.join("; ")}`;return Ct0(X,$.deps.coAuthor)}var tE6=3,AY1;var Fn$=D(()=>{sD0();e20();x5();p8();iZ();WR0();AY1=new Map});import{createHmac as Un$,randomBytes as aE6,timingSafeEqual as eE6}from"crypto";function Nn$(){if(OR0)return OR0;let $;try{let Z=M0();$=Z.studioJwtSecret??Z.betterAuthSecret}catch{$=void 0}return OR0=$?Buffer.from($):aE6(32),OR0}function TY1($){let Z=$.nowMs??Date.now(),Q={o:$.organizationId,m:$.virtualMcpId,b:$.branch,e:Math.floor((Z+$j6)/1000)},X=Buffer.from(JSON.stringify(Q)).toString("base64url"),Y=Un$("sha256",Nn$()).update(X).digest("base64url");return`${X}.${Y}`}function Bn$($,Z){let Q=$.indexOf(".");if(Q<0)return!1;let X=$.slice(0,Q),Y=Buffer.from($.slice(Q+1)),G=Buffer.from(Un$("sha256",Nn$()).update(X).digest("base64url"));if(Y.length!==G.length||!eE6(Y,G))return!1;let J;try{J=JSON.parse(Buffer.from(X,"base64url").toString())}catch{return!1}let W=Math.floor((Z.nowMs??Date.now())/1000);return J.o===Z.organizationId&&J.m===Z.virtualMcpId&&J.b===Z.branch&&typeof J.e==="number"&&J.e>=W}var $j6=21600000,OR0=null;var On$=D(()=>{E$()});import{z as Jc}from"zod";function Qj6($){return $.length>0&&$.length<=255&&!$.includes("..")&&!$.endsWith("/")&&!$.endsWith(".lock")&&Zj6.test($)}function jn$($){return $.req.header("x-forwarded-host")??new URL($.req.url).host}async function pe($){let Z=$.get("decofileScope");return Cg($.var.studioContext,Z.organizationId,Z.githubRepo)}function ne($,Z){let Q=Z instanceof Error?Z.message:String(Z);if(Z instanceof b5)return $.json({error:Q},409);let X=jJ(Z);if(X!==null){let Y=X===404?404:X===409||X===422?409:502;return $.json({error:Q},Y)}return $.json({error:Q},500)}function zn$(){let $=new Q1;return $.use("/:virtualMcpId/:branch",En$),$.use("/:virtualMcpId/:branch/*",En$),$.get("/:virtualMcpId/:branch",async(Z)=>{let Q=Z.get("decofileScope");try{let X=await pe(Z),Y=await np$(X,Q.branch,Q.packagePath,{createBranchIfMissing:!!Q.userId}),G={ETag:`"${Y.sha}"`,"Cache-Control":"no-store","Access-Control-Allow-Origin":"*"};if(Z.req.header("if-none-match")===`"${Y.sha}"`)return Z.body(null,304,G);if(!Q.userId)return Z.body(Y.decofile,200,{...G,"content-type":"application/json"});let J=TY1({organizationId:Q.organizationId,virtualMcpId:Q.virtualMcpId,branch:Q.branch});return Z.body(`{"version":${JSON.stringify(Y.sha)},"token":${JSON.stringify(J)},"apiHost":${JSON.stringify(jn$(Z))},"decofile":${Y.decofile}}`,200,{...G,"content-type":"application/json"})}catch(X){return ne(Z,X)}}),$.get("/:virtualMcpId/:branch/meta",async(Z)=>{let Q=Z.get("decofileScope"),X=Q.packagePath?`${Q.packagePath}/.deco/meta.gen.json`:".deco/meta.gen.json";try{let Y=await pe(Z),G=await Y.readFileAtRef(Q.branch,X);if(G===null){let J=await Y.getDefaultBranch();if(J!==Q.branch)G=await Y.readFileAtRef(J,X)}if(G===null)return Z.json({error:"meta.gen.json not committed"},404);return Z.body(G,200,{"content-type":"application/json","Cache-Control":"no-store","Access-Control-Allow-Origin":"*"})}catch(Y){return ne(Z,Y)}}),$.patch("/:virtualMcpId/:branch",Yj6,async(Z)=>{let Q=Z.get("decofileScope"),X=Z.var.studioContext,Y=Gj6.safeParse(await Z.req.json().catch(()=>null));if(!Y.success)return Z.json({error:"Invalid body",details:Y.error.issues},400);let G=Y.data;for(let J of[...Object.keys(G.set??{}),...G.delete??[]])try{a20(J)}catch(W){let K=W instanceof Error?W.message:String(W);return Z.json({error:K},400)}for(let[J,W]of Object.entries(G.set??{})){if(typeof W!=="object"||W===null||Array.isArray(W))return Z.json({error:`Block "${J}" must be a JSON object`},400);if(HY1(J))return Z.json({error:`Block key "${J}" collides with a framework resolver module and cannot be written`},400)}try{let J=await pe(Z),W=await Hn$(`${Q.organizationId}/${Q.virtualMcpId}/${Q.branch}`,{client:J,branch:Q.branch,packagePath:Q.packagePath,coAuthor:$c(X)},G),K=TY1({organizationId:Q.organizationId,virtualMcpId:Q.virtualMcpId,branch:Q.branch});return Z.json({version:W,token:K,apiHost:jn$(Z)})}catch(J){return ne(Z,J)}}),$.post("/:virtualMcpId/:branch/publish",async(Z)=>{let Q=Z.get("decofileScope");try{let X=await pe(Z),Y=await X.getDefaultBranch();if(Y===Q.branch)return Z.json({error:"Branch is already the default branch"},400);let G=`chore(decofile): publish ${Q.branch}`;try{let J;try{J=await X.mergeBranches(Y,Q.branch,G)}catch(W){if(jJ(W)!==409)throw W;await UR0(X,Q.branch,Y),J=await X.mergeBranches(Y,Q.branch,G)}return J?Z.json({result:"merged",sha:J}):Z.json({result:"up-to-date"})}catch(J){if(jJ(J)===409)return Z.json({error:"merge-conflict"},409);if(jJ(J)===405){let K=await X.findOpenChangeRequest(Y,Q.branch)??await X.createChangeRequest({base:Y,head:Q.branch,title:`Publish ${Q.branch}`});return Z.json({result:"pull-request",number:K.number,url:K.url})}throw J}}catch(X){return ne(Z,X)}}),$.get("/:virtualMcpId/:branch/status",async(Z)=>{let Q=Z.get("decofileScope");try{let X=await pe(Z),Y=await X.getDefaultBranch();if(Y===Q.branch)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0,lastCommitAt:null});try{let[{aheadBy:G,behindBy:J},W]=await Promise.all([X.compare(Y,Q.branch),X.getBranch(Q.branch)]);return Z.json({baseBranch:Y,aheadBy:G,behindBy:J,lastCommitAt:W?.committedAt??null})}catch(G){if(jJ(G)===404)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0,lastCommitAt:null});throw G}}catch(X){return ne(Z,X)}}),$}var Zj6,Dn$=500,wn$=1048576,Ln$=1024,Xj6=8388608,Yj6,Gj6,En$;var Pn$=D(()=>{mr0();e20();h$();rH();eX1();s20();zY1();iZ();Fn$();On$();jY1();WR0();Zj6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;Yj6=Z9({maxSize:Xj6,onError:($)=>$.json({error:"Payload too large"},413)}),Gj6=Jc.object({set:Jc.record(Jc.string(),Jc.unknown()).optional(),delete:Jc.array(Jc.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)<=Dn$,{message:`Patch cannot touch more than ${Dn$} blocks`}).refine(($)=>Object.values($.set??{}).every((Z)=>JSON.stringify(Z).length<=wn$),{message:`Each block must be at most ${wn$} bytes`}).refine(($)=>[...Object.keys($.set??{}),...$.delete??[]].every((Z)=>Z.length<=Ln$),{message:`Each block key must be at most ${Ln$} characters`}),En$=r20(async($,Z)=>{let Q=$.var.studioContext,X=Q.organization;if(!X)return $.json({error:"Organization scope required"},500);let Y=$.req.param("virtualMcpId"),G=$.req.param("branch");if(!Y||!G)return $.json({error:"virtualMcpId and branch are required"},400);if(!Qj6(G))return $.json({error:`Invalid branch name: ${G}`},400);let J=Q.auth?.user?.id??null;if(!J){let B=$.req.query("token");if(!($.req.method==="GET"&&!$.req.path.match(/\/(publish|status)$/)))return $.json({error:"Unauthorized"},401);if(!B||!Bn$(B,{organizationId:X.id,virtualMcpId:Y,branch:G}))return $.json({error:"Unauthorized"},401)}let W=await Q.storage.virtualMcps.findById(Y);if(!W||W.organization_id!==X.id)return $.json({error:"Virtual MCP not found"},404);let K=W.metadata??null;if(!NL0(K))return $.json({error:"Project has no preview server configured"},404);let F=W.connections?.map((B)=>B.connection_id)??[],U=me(K,F);if(!U)return $.json({error:"Project has no GitHub repository"},404);let N=K?.runtime;return $.set("decofileScope",{organizationId:X.id,virtualMcpId:Y,branch:G,packagePath:N?.path?.replace(/^\/+|\/+$/g,"")||null,githubRepo:U,userId:J}),Z()})});var An$=($)=>{let Z=new Q1;if(Z.use("*",Kf),Z.use("*",Xc$),Z.route("/",H20()),Z.route("/",yc$()),Z.route("/",Mc$()),Z.route("/",ci$()),Z.route("/",hi$()),Z.route("/",n20()),Z.route("/tools",oi$()),Z.route("/",pi$()),Z.route("/",wi$({kvStorage:$.kvStorage})),Z.route("/",Oi$()),Z.route("/fs",Si$({getConnection:$.getNatsConnection})),Z.route("/sandbox",Wn$()),Z.route("/decofile",zn$()),Z.route("/",xi$()),Z.route("/",_i$()),Z.route("/deco-sites",U20()),Z.route("/hosting",wc$()),Z.route("/monitor",Tc$()),Z.route("/sso",X20()),Z.route("/",t20({tokenStorage:$.tokenStorage,automationEventDispatcher:$.automationEventDispatcher})),Z.route("/webhooks",Uc$()),$.mountDevAssets)Z.route("/dev-assets",D20({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("/",_h$()),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",fi$()),Z.route("/mcp",Oj0()),Z.route("/mcp/self",p20()),Z.route("/mcp",Lj0()),Z.all("/oauth-proxy/:connectionId/*",$.oauthProxyHandler),Z.get("/watch",$.watchHandler),Z};var Tn$=D(()=>{h$();Yc$();eT0();Nc$();jQ1();Lc$();Rc$();w20();Fe();OQ1();MQ1();Di$();Li$();Ci$();vi$();Dr();KQ1();Ej0();pX1();bi$();yi$();ui$();di$();ni$();tX1();ri$();oX1();Dj0();Kn$();Pn$()});function Jj6($){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 Wj6=async($,Z)=>{if(!$.get("studioContext").auth.user?.id)return $.json({error:"Unauthorized"},401);return Z()},Rn$=()=>{let $=new Q1;return $.use("*",Wj6),$.get("/",async(Z)=>{let Q=M0(),X=Q.decoSupabaseUrl,Y=Q.decoSupabaseServiceKey;if(!X||!Y)return Z.json({apps:[]});try{let G=await vY(X,Y,"apps?select=name,title,description,logo,category,vendors(alias,url)");return Z.json({apps:Jj6(G)})}catch(G){return console.error("[deco-apps] GET error:",G),Z.json({error:"Failed to fetch apps"},502)}}),$};var qn$=D(()=>{h$();E$();KT0()});import{z as M1}from"zod";function QF($,Z="invalid_request_error",Q=null,X=null){return{error:{message:$,type:Z,param:Q,code:X}}}function Lj6($){if(!$)return null;let Z=$.indexOf(":");if(Z===-1)return{credentialId:null,modelId:$};let Q=$.substring(0,Z),X=$.substring(Z+1);if(!Q||!X)return null;return{credentialId:Q,modelId:X}}function Ej6($,Z,Q){try{return JSON.parse($)}catch{throw new kn$(`Invalid JSON in tool call arguments for function '${Q}' (tool_call_id: ${Z}): ${$}`)}}function jj6($){let Z={};for(let Q of $)if(Q.role==="assistant"&&Q.tool_calls)for(let X of Q.tool_calls)Z[X.id]=X.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((Y)=>{if(Y.type==="text")return{type:"text",text:Y.text};return{type:"image",image:Y.image_url.url}})};case"assistant":if(Q.tool_calls&&Q.tool_calls.length>0)return{role:"assistant",content:Q.tool_calls.map((Y)=>({type:"tool-call",toolCallId:Y.id,toolName:Y.function.name,input:Ej6(Y.function.arguments,Y.id,Y.function.name)}))};return{role:"assistant",content:Q.content??""};case"tool":let X=Z[Q.tool_call_id]??"unknown";return{role:"tool",content:[{type:"tool-result",toolCallId:Q.tool_call_id,toolName:X,output:{type:"text",value:Q.content}}]}}})}function zj6($){let Z=$.map((Q)=>{let X=Q.function.parameters?LG(Q.function.parameters):LG({type:"object",properties:{}});return[Q.function.name,W$({description:Q.function.description,inputSchema:X})]});return Object.fromEntries(Z)}function Pj6($){if(!$)return;return{openai:{response_format:$}}}function Aj6(){return`chatcmpl-${crypto.randomUUID().replace(/-/g,"").substring(0,29)}`}function In$($,Z,Q,X,Y,G){let J={model:$,messages:Z,tools:Q,temperature:X.temperature,maxTokens:X.max_tokens,topP:X.top_p,frequencyPenalty:X.frequency_penalty,presencePenalty:X.presence_penalty,stopSequences:X.stop?Array.isArray(X.stop)?X.stop:[X.stop]:void 0,abortSignal:G};return Y?{...J,providerOptions:Y}:J}function Mn$($){if($==="tool-calls")return"tool_calls";if($==="length")return"length";return"stop"}var Kj6=256,Hj6,Fj6,Uj6,Nj6,Bj6,Oj6,Dj6,wj6,kn$,Vn$,Sn$;var Cn$=D(()=>{V4();h$();el();XN();Hj6=M1.object({type:M1.literal("function"),function:M1.object({name:M1.string(),description:M1.string().optional(),parameters:M1.record(M1.string(),M1.unknown()).optional()})}),Fj6=M1.object({id:M1.string(),type:M1.literal("function"),function:M1.object({name:M1.string(),arguments:M1.string()})}),Uj6=M1.discriminatedUnion("role",[M1.object({role:M1.literal("system"),content:M1.string(),name:M1.string().optional()}),M1.object({role:M1.literal("user"),content:M1.union([M1.string(),M1.array(M1.union([M1.object({type:M1.literal("text"),text:M1.string()}),M1.object({type:M1.literal("image_url"),image_url:M1.object({url:M1.string(),detail:M1.string().optional()})})]))]),name:M1.string().optional()}),M1.object({role:M1.literal("assistant"),content:M1.string().nullable().optional(),name:M1.string().optional(),tool_calls:M1.array(Fj6).optional()}),M1.object({role:M1.literal("tool"),content:M1.string(),tool_call_id:M1.string()})]),Nj6=M1.object({type:M1.literal("text")}),Bj6=M1.object({type:M1.literal("json_object")}),Oj6=M1.object({type:M1.literal("json_schema"),json_schema:M1.object({name:M1.string(),description:M1.string().optional(),schema:M1.record(M1.string(),M1.unknown()),strict:M1.boolean().optional()})}),Dj6=M1.union([Nj6,Bj6,Oj6]),wj6=M1.object({model:M1.string().describe("Format: 'model_id' or 'credential_id:model_id'"),messages:M1.array(Uj6),stream:M1.boolean().optional().default(!1),temperature:M1.number().min(0).max(2).optional(),max_tokens:M1.number().positive().optional(),top_p:M1.number().min(0).max(1).optional(),frequency_penalty:M1.number().min(-2).max(2).optional(),presence_penalty:M1.number().min(-2).max(2).optional(),stop:M1.union([M1.string(),M1.array(M1.string())]).optional(),tools:M1.array(Hj6).optional(),tool_choice:M1.union([M1.literal("auto"),M1.literal("none"),M1.literal("required"),M1.object({type:M1.literal("function"),function:M1.object({name:M1.string()})})]).optional(),response_format:Dj6.optional(),user:M1.string().optional()});kn$=class kn$ extends Error{constructor($){super($);this.name="MessageConversionError"}};Vn$=new Q1;Vn$.post("/:org/v1/chat/completions",async($)=>{let Z=$.get("studioContext"),Q=$.req.param("org");try{if(!Z.auth.apiKey?.id)return $.json(QF("API key authentication required. Provide a valid API key via Authorization header.","authentication_error"),401);if(!Z.organization)return $.json(QF("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(QF("Organization mismatch. The API key's organization does not match the requested organization.","invalid_request_error","organization"),403);let X=await $.req.json(),Y=wj6.safeParse(X);if(!Y.success){let L=Y.error.issues[0]??{message:"Invalid request",path:[]};return $.json(QF(`Invalid request: ${L.message}`,"invalid_request_error",L.path.length>0?L.path.join("."):null),400)}let G=Y.data,J=Lj6(G.model);if(!J)return $.json(QF("Invalid model format. Expected 'model_id' or 'credential_id:model_id' (e.g., 'claude-sonnet-4-6' or 'key_abc123:claude-sonnet-4-6')","invalid_request_error","model"),400);let{credentialId:W}=J,{modelId:K}=J;if(!W){let E=(await Z.storage.aiProviderKeys.list({organizationId:Z.organization.id})).find((j)=>iL(j.providerId));if(!E)return $.json(QF("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(QF(`AI provider credential not found or inaccessible: ${W}`,"invalid_request_error","model"),404)}let F=H.aiSdk.languageModel(K),U=jj6(G.messages),N=G.tools?zj6(G.tools):void 0,B=Pj6(G.response_format),O=Aj6(),w=Math.floor(Date.now()/1000);if(G.stream)return qN($,async(L)=>{let E=In$(F,U,N,G,B,$.req.raw.signal);try{let j=ID(E),z=!1,P=0,A="",q=async()=>{if(A.length===0)return;let k=A;A="",await L.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:w,model:G.model,choices:[{index:0,delta:{content:k},finish_reason:null}]})})};for await(let k of j.fullStream){if(!z&&(k.type==="text-delta"||k.type==="tool-call"))await L.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:w,model:G.model,choices:[{index:0,delta:{role:"assistant",content:""},finish_reason:null}]})}),z=!0;if(k.type==="text-delta"){if(A+=k.text,A.length>=Kj6)await q()}else if(k.type==="tool-call"){await q();let M=P++;await L.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:w,model:G.model,choices:[{index:0,delta:{tool_calls:[{index:M,id:k.toolCallId,type:"function",function:{name:k.toolName,arguments:JSON.stringify(k.input)}}]},finish_reason:null}]})})}else if(k.type==="finish")await q(),await L.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:w,model:G.model,choices:[{index:0,delta:{},finish_reason:Mn$(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 L.writeSSE({data:"[DONE]"})}catch(j){let z=j;console.error("[openai-compat:stream] Error:",z.message),await L.writeSSE({data:JSON.stringify({error:{message:z.message,type:"server_error"}})})}});else{let L=In$(F,U,N,G,B,$.req.raw.signal),E=await RD(L),j={role:"assistant",content:E.text||null};if(E.toolCalls&&E.toolCalls.length>0)j.tool_calls=E.toolCalls.map((z)=>({id:z.toolCallId,type:"function",function:{name:z.toolName,arguments:JSON.stringify("input"in z?z.input:{})}})),j.content=null;return $.json({id:O,object:"chat.completion",created:w,model:G.model,choices:[{index:0,message:j,finish_reason:Mn$(E.finishReason)}],usage:{prompt_tokens:E.usage?.inputTokens??0,completion_tokens:E.usage?.outputTokens??0,total_tokens:E.usage?.totalTokens??0}})}}catch(X){let Y=X;if(Y.name==="AbortError")return $.json(QF("Request aborted","invalid_request_error"),400);if(Y.name==="MessageConversionError")return $.json(QF(Y.message,"invalid_request_error","messages"),400);return console.error("[openai-compat] Error:",Y.message,Y.stack),$.json(QF(Y.message,"server_error"),500)}});Sn$=Vn$});function Tj6($){if(typeof $!=="object"||$===null)return!1;let Q=$.githubRepo?.url;return typeof Q==="string"&&Q.length>0}function _n$(){let $=new Q1;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"),X=n0(Q);if(!X)return Z.json({error:"Authentication required"},401);let G=(Z.req.query("site")??"").trim().toLowerCase();if(!WX(G))return Z.json({error:"Invalid site slug"},400);let J=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","=",X).execute(),W=[];for(let H of J){if(!H.slug||p9(H))continue;let F=await Q.storage.virtualMcps.list(H.id);for(let U of F){if(U$$(U)!==G)continue;if(!Tj6(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 vn$=D(()=>{h$();HU()});var bn$;var fn$=D(()=>{bn$={name:"decocms",version:"4.340.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 Ij6(){let $=process.env.POSTHOG_KEY;if(!$)return null;return{key:$,host:process.env.POSTHOG_HOST??qj6}}var xn$,qj6="https://ph.studio.decocms.com",yn$;var gn$=D(()=>{h$();EZ0();n_();S5();E$();e71();fn$();xn$=new Q1;xn$.get("/",($)=>{let Z={version:bn$.version,theme:bt1(),...XU().logo&&{logo:XU().logo},...mU()&&{internalUrl:Xb1()},...M0().enableDecoImport&&{enableDecoImport:!0},brandExtractEnabled:!!M0().firecrawlApiKey,hostingEnabled:!!M0().controlplaneRestUrl&&!!M0().controlplaneServiceToken,hostingControlPlaneGa:M0().hostingControlPlaneGa,monitorEnabled:!!M0().clickhouseAnalyticsUrl&&!!M0().clickhouseAnalyticsPassword,monitorGa:M0().monitorGa,auth:Ol$(),posthog:Ij6(),googleMapsApiKey:process.env.GOOGLE_MAPS_API_KEY?.trim()||null,runtime:{agentSandbox:Z00()}};return $.header("Cache-Control","no-store"),$.json({success:!0,config:Z})});yn$=xn$});function Wc($){let Z=($??"").trim().toLowerCase();return Z=Z.replace(/^https?:\/\//,""),Z=Z.replace(/^www\./,""),Z=Z.split(/[/?#]/)[0]??"",Z.replace(/\/+$/,"")}function RY1($){return(Wc($).split(".")[0]||$).replace(/[-_]/g," ").split(" ").filter(Boolean).map((Q)=>Q.charAt(0).toUpperCase()+Q.slice(1)).join(" ")}function un$($,Z=64){return`https://www.google.com/s2/favicons?domain=${encodeURIComponent(Wc($))}&sz=${Z}`}function hn$($,Z){let Q=$.trim();if(Q.length<=Z)return Q;let X=Q.slice(0,Z-1),Y=X.lastIndexOf(" ");return`${(Y>Z*0.6?X.slice(0,Y):X).trimEnd()}\u2026`}function ln$($){let{brand:Z,domain:Q,score:X,verdict:Y}=$,G=typeof X==="number"?`${Z} commerce report \u2014 ${Math.round(X)}/100 \xB7 decocms`:`${Z} commerce report \xB7 decocms`,J=`See the full ${Z} scorecard \u2014 SEO, performance, conversion & AEO signals scored by decocms.`,W=Y?.trim()?hn$(`${Y.trim().replace(/\s+/g," ")} \u2014 ${J}`,200):hn$(`How does ${Q} really perform? ${J}`,200);return{title:G,description:W}}import{z as c0}from"zod";var qf,Mj6,kj6,Vj6,Sj6,cn$;var dn$=D(()=>{qf=c0.enum(["good","bad","neutral"]),Mj6=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:qf.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 $})),kj6=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(Mj6)),Vj6={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()},Sj6=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:qf.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:qf.optional()}),c0.object({template:c0.literal("stats"),stats:c0.array(c0.object({value:c0.coerce.string(),label:c0.coerce.string(),tone:qf.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:qf.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(kj6).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:qf.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:qf.optional()})).min(1)})]),cn$=c0.object({...Vj6,template:Sj6})});function DR0($){let Z=[],Q=[...$.sections].sort((Y,G)=>Y.position-G.position).map((Y)=>{let G=cn$.safeParse(Y.props);if(G.success)return G.data;let J=G.error.issues[0];return Z.push({section_type:Y.section_type,position:Y.position,reason:J?`${J.path.join(".")||"(root)"}: ${J.message}`:"contract violation"}),null}).filter((Y)=>Y!==null),X=Q.filter((Y)=>Y.template.template!=="cover"&&Y.template.template!=="cta").map((Y)=>({key:Y.key,title:Y.title}));return{deck:{meta:{...$.meta,scores:$.summary?.scores,scannedAt:$.scanned_at,toc:X},slides:Q},drops:Z}}var qY1=D(()=>{dn$()});import{join as mn$}from"path";async function _j6($){try{let Z=await fetch(`${yK({})}/api/v2/public/diagnostics/${encodeURIComponent($)}`,{headers:{Accept:"application/json"},signal:AbortSignal.timeout(Cj6)});if(!Z.ok)return null;let Q=await Z.json(),{deck:X}=DR0(Q);if(!X.slides.length)return null;let Y=X.slides.find((W)=>W.template.template==="cover"),G=Y?.template,J=G&&G.template==="cover"?G:void 0;return{brand:X.meta.brand?.trim()||RY1($),score:X.meta.scores?.cover??J?.score?.value,verdict:Y?.annotation?.trim()||Y?.headline?.trim()||void 0}}catch{return null}}function xG($){return $.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function vj6($,Z){let Q=Wc($),X=Z?.brand?.trim()||RY1(Q),Y=un$(Q,128),J=`${(M0().baseUrl??"https://studio.decocms.com").replace(/\/+$/,"")}/report/${encodeURIComponent(Q)}`,{title:W,description:K}=ln$({brand:X,domain:Q,score:Z?.score,verdict:Z?.verdict}),H=`${J}/og.png`,F=`${X} commerce report by decocms`;return[`<title>${xG(W)}</title>`,`<meta name="description" content="${xG(K)}" />`,'<meta name="robots" content="noindex, follow" />','<meta property="og:type" content="website" />','<meta property="og:site_name" content="decocms" />',`<meta property="og:title" content="${xG(W)}" />`,`<meta property="og:description" content="${xG(K)}" />`,`<meta property="og:url" content="${xG(J)}" />`,`<meta property="og:image" content="${xG(H)}" />`,'<meta property="og:image:width" content="1200" />','<meta property="og:image:height" content="630" />',`<meta property="og:image:alt" content="${xG(F)}" />`,'<meta name="twitter:card" content="summary_large_image" />',`<meta name="twitter:title" content="${xG(W)}" />`,`<meta name="twitter:description" content="${xG(K)}" />`,`<meta name="twitter:image" content="${xG(H)}" />`,`<meta name="twitter:image:alt" content="${xG(F)}" />`,`<link rel="canonical" href="${xG(J)}" />`,`<link rel="icon" href="${xG(Y)}" sizes="any" />`].join(`
|
|
2928
|
+
`;await pp$(Z.repo,O);let w=B[0]??`${JR0(X)}/${FY1(U)}.json`;K.push({path:w,content:O});let L=w.slice(w.lastIndexOf("/")+1,-5);H.set(w,{stem:L,content:O});for(let E of B.slice(1))K.push({path:E,deleted:!0}),H.delete(E)}for(let U of $.del)for(let N of LY1(W,U))K.push({path:N,deleted:!0}),H.delete(N);if(K.length===0)return G;let F=X?`${X}/.deco/blocks.gen.json`:".deco/blocks.gen.json";if(J.some((U)=>U.type==="blob"&&U.path===F)){let U=await Promise.all([...H.values()].map(async(O)=>({stem:O.stem,content:"content"in O?O.content:await Z.readBlob(O.sha)}))),{decofile:N,skipped:B}=ue(U);if(B.length>0)console.warn("decofile gen: dropped blocks that were not valid JSON",{repo:XW(Z.repo),branch:Q,packagePath:X,blocks:B.map((O)=>O.key)});K.push({path:F,content:N})}try{let{sha:U}=await Z.commitFiles({branch:Q,message:sE6($),expectedHead:G,changes:K});return U}catch(U){if(!(U instanceof b5)||Y>=tE6-1)throw U;await z$(J7(2000,200,Y,2,0.5))}}}function sE6($){let Z=(Y)=>{let G=Y.slice(0,3).join(", ");return Y.length>3?`${G} (+${Y.length-3} more)`:G},Q=[];if($.set.size>0)Q.push(`update ${Z([...$.set.keys()])}`);if($.del.size>0)Q.push(`delete ${Z([...$.del])}`);let X=`chore(decofile): ${Q.join("; ")}`;return Ct0(X,$.deps.coAuthor)}var tE6=3,AY1;var Fn$=D(()=>{sD0();e20();x5();p8();iZ();WR0();AY1=new Map});import{createHmac as Un$,randomBytes as aE6,timingSafeEqual as eE6}from"crypto";function Nn$(){if(OR0)return OR0;let $;try{let Z=M0();$=Z.studioJwtSecret??Z.betterAuthSecret}catch{$=void 0}return OR0=$?Buffer.from($):aE6(32),OR0}function TY1($){let Z=$.nowMs??Date.now(),Q={o:$.organizationId,m:$.virtualMcpId,b:$.branch,e:Math.floor((Z+$j6)/1000)},X=Buffer.from(JSON.stringify(Q)).toString("base64url"),Y=Un$("sha256",Nn$()).update(X).digest("base64url");return`${X}.${Y}`}function Bn$($,Z){let Q=$.indexOf(".");if(Q<0)return!1;let X=$.slice(0,Q),Y=Buffer.from($.slice(Q+1)),G=Buffer.from(Un$("sha256",Nn$()).update(X).digest("base64url"));if(Y.length!==G.length||!eE6(Y,G))return!1;let J;try{J=JSON.parse(Buffer.from(X,"base64url").toString())}catch{return!1}let W=Math.floor((Z.nowMs??Date.now())/1000);return J.o===Z.organizationId&&J.m===Z.virtualMcpId&&J.b===Z.branch&&typeof J.e==="number"&&J.e>=W}var $j6=21600000,OR0=null;var On$=D(()=>{E$()});import{z as Jc}from"zod";function Qj6($){return $.length>0&&$.length<=255&&!$.includes("..")&&!$.endsWith("/")&&!$.endsWith(".lock")&&Zj6.test($)}function jn$($){return $.req.header("x-forwarded-host")??new URL($.req.url).host}async function pe($){let Z=$.get("decofileScope");return Cg($.var.studioContext,Z.organizationId,Z.githubRepo)}function ne($,Z){let Q=Z instanceof Error?Z.message:String(Z);if(Z instanceof b5)return $.json({error:Q},409);let X=jJ(Z);if(X!==null){let Y=X===404?404:X===409||X===422?409:502;return $.json({error:Q},Y)}return $.json({error:Q},500)}function zn$(){let $=new Q1;return $.use("/:virtualMcpId/:branch",En$),$.use("/:virtualMcpId/:branch/*",En$),$.get("/:virtualMcpId/:branch",async(Z)=>{let Q=Z.get("decofileScope");try{let X=await pe(Z),Y=await np$(X,Q.branch,Q.packagePath,{createBranchIfMissing:!!Q.userId}),G={ETag:`"${Y.sha}"`,"Cache-Control":"no-store","Access-Control-Allow-Origin":"*"};if(Z.req.header("if-none-match")===`"${Y.sha}"`)return Z.body(null,304,G);if(!Q.userId)return Z.body(Y.decofile,200,{...G,"content-type":"application/json"});let J=TY1({organizationId:Q.organizationId,virtualMcpId:Q.virtualMcpId,branch:Q.branch});return Z.body(`{"version":${JSON.stringify(Y.sha)},"token":${JSON.stringify(J)},"apiHost":${JSON.stringify(jn$(Z))},"decofile":${Y.decofile}}`,200,{...G,"content-type":"application/json"})}catch(X){return ne(Z,X)}}),$.get("/:virtualMcpId/:branch/meta",async(Z)=>{let Q=Z.get("decofileScope"),X=Q.packagePath?`${Q.packagePath}/.deco/meta.gen.json`:".deco/meta.gen.json";try{let Y=await pe(Z),G=await Y.readFileAtRef(Q.branch,X);if(G===null){let J=await Y.getDefaultBranch();if(J!==Q.branch)G=await Y.readFileAtRef(J,X)}if(G===null)return Z.json({error:"meta.gen.json not committed"},404);return Z.body(G,200,{"content-type":"application/json","Cache-Control":"no-store","Access-Control-Allow-Origin":"*"})}catch(Y){return ne(Z,Y)}}),$.patch("/:virtualMcpId/:branch",Yj6,async(Z)=>{let Q=Z.get("decofileScope"),X=Z.var.studioContext,Y=Gj6.safeParse(await Z.req.json().catch(()=>null));if(!Y.success)return Z.json({error:"Invalid body",details:Y.error.issues},400);let G=Y.data;for(let J of[...Object.keys(G.set??{}),...G.delete??[]])try{a20(J)}catch(W){let K=W instanceof Error?W.message:String(W);return Z.json({error:K},400)}for(let[J,W]of Object.entries(G.set??{})){if(typeof W!=="object"||W===null||Array.isArray(W))return Z.json({error:`Block "${J}" must be a JSON object`},400);if(HY1(J))return Z.json({error:`Block key "${J}" collides with a framework resolver module and cannot be written`},400)}try{let J=await pe(Z),W=await Hn$(`${Q.organizationId}/${Q.virtualMcpId}/${Q.branch}`,{client:J,branch:Q.branch,packagePath:Q.packagePath,coAuthor:$c(X)},G),K=TY1({organizationId:Q.organizationId,virtualMcpId:Q.virtualMcpId,branch:Q.branch});return Z.json({version:W,token:K,apiHost:jn$(Z)})}catch(J){return ne(Z,J)}}),$.post("/:virtualMcpId/:branch/publish",async(Z)=>{let Q=Z.get("decofileScope");try{let X=await pe(Z),Y=await X.getDefaultBranch();if(Y===Q.branch)return Z.json({error:"Branch is already the default branch"},400);let G=`chore(decofile): publish ${Q.branch}`;try{let J;try{J=await X.mergeBranches(Y,Q.branch,G)}catch(W){if(jJ(W)!==409)throw W;await UR0(X,Q.branch,Y),J=await X.mergeBranches(Y,Q.branch,G)}return J?Z.json({result:"merged",sha:J}):Z.json({result:"up-to-date"})}catch(J){if(jJ(J)===409)return Z.json({error:"merge-conflict"},409);if(jJ(J)===405){let K=await X.findOpenChangeRequest(Y,Q.branch)??await X.createChangeRequest({base:Y,head:Q.branch,title:`Publish ${Q.branch}`});return Z.json({result:"pull-request",number:K.number,url:K.url})}throw J}}catch(X){return ne(Z,X)}}),$.get("/:virtualMcpId/:branch/status",async(Z)=>{let Q=Z.get("decofileScope");try{let X=await pe(Z),Y=await X.getDefaultBranch();if(Y===Q.branch)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0,lastCommitAt:null});try{let[{aheadBy:G,behindBy:J},W]=await Promise.all([X.compare(Y,Q.branch),X.getBranch(Q.branch)]);return Z.json({baseBranch:Y,aheadBy:G,behindBy:J,lastCommitAt:W?.committedAt??null})}catch(G){if(jJ(G)===404)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0,lastCommitAt:null});throw G}}catch(X){return ne(Z,X)}}),$}var Zj6,Dn$=500,wn$=1048576,Ln$=1024,Xj6=8388608,Yj6,Gj6,En$;var Pn$=D(()=>{mr0();e20();h$();rH();eX1();s20();zY1();iZ();Fn$();On$();jY1();WR0();Zj6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;Yj6=Z9({maxSize:Xj6,onError:($)=>$.json({error:"Payload too large"},413)}),Gj6=Jc.object({set:Jc.record(Jc.string(),Jc.unknown()).optional(),delete:Jc.array(Jc.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)<=Dn$,{message:`Patch cannot touch more than ${Dn$} blocks`}).refine(($)=>Object.values($.set??{}).every((Z)=>JSON.stringify(Z).length<=wn$),{message:`Each block must be at most ${wn$} bytes`}).refine(($)=>[...Object.keys($.set??{}),...$.delete??[]].every((Z)=>Z.length<=Ln$),{message:`Each block key must be at most ${Ln$} characters`}),En$=r20(async($,Z)=>{let Q=$.var.studioContext,X=Q.organization;if(!X)return $.json({error:"Organization scope required"},500);let Y=$.req.param("virtualMcpId"),G=$.req.param("branch");if(!Y||!G)return $.json({error:"virtualMcpId and branch are required"},400);if(!Qj6(G))return $.json({error:`Invalid branch name: ${G}`},400);let J=Q.auth?.user?.id??null;if(!J){let B=$.req.query("token");if(!($.req.method==="GET"&&!$.req.path.match(/\/(publish|status)$/)))return $.json({error:"Unauthorized"},401);if(!B||!Bn$(B,{organizationId:X.id,virtualMcpId:Y,branch:G}))return $.json({error:"Unauthorized"},401)}let W=await Q.storage.virtualMcps.findById(Y);if(!W||W.organization_id!==X.id)return $.json({error:"Virtual MCP not found"},404);let K=W.metadata??null;if(!NL0(K))return $.json({error:"Project has no preview server configured"},404);let F=W.connections?.map((B)=>B.connection_id)??[],U=me(K,F);if(!U)return $.json({error:"Project has no GitHub repository"},404);let N=K?.runtime;return $.set("decofileScope",{organizationId:X.id,virtualMcpId:Y,branch:G,packagePath:N?.path?.replace(/^\/+|\/+$/g,"")||null,githubRepo:U,userId:J}),Z()})});var An$=($)=>{let Z=new Q1;if(Z.use("*",Kf),Z.use("*",Xc$),Z.route("/",H20()),Z.route("/",yc$()),Z.route("/",Mc$()),Z.route("/",ci$()),Z.route("/",hi$()),Z.route("/",n20()),Z.route("/tools",oi$()),Z.route("/",pi$()),Z.route("/",wi$({kvStorage:$.kvStorage})),Z.route("/",Oi$()),Z.route("/fs",Si$({getConnection:$.getNatsConnection})),Z.route("/sandbox",Wn$()),Z.route("/decofile",zn$()),Z.route("/",xi$()),Z.route("/",_i$()),Z.route("/deco-sites",U20()),Z.route("/hosting",wc$()),Z.route("/monitor",Tc$()),Z.route("/sso",X20()),Z.route("/",t20({tokenStorage:$.tokenStorage,automationEventDispatcher:$.automationEventDispatcher})),Z.route("/webhooks",Uc$()),$.mountDevAssets)Z.route("/dev-assets",D20({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("/",_h$()),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",fi$()),Z.route("/mcp",Oj0()),Z.route("/mcp/self",p20()),Z.route("/mcp",Lj0()),Z.all("/oauth-proxy/:connectionId/*",$.oauthProxyHandler),Z.get("/watch",$.watchHandler),Z};var Tn$=D(()=>{h$();Yc$();eT0();Nc$();jQ1();Lc$();Rc$();w20();Fe();OQ1();MQ1();Di$();Li$();Ci$();vi$();Dr();KQ1();Ej0();pX1();bi$();yi$();ui$();di$();ni$();tX1();ri$();oX1();Dj0();Kn$();Pn$()});function Jj6($){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 Wj6=async($,Z)=>{if(!$.get("studioContext").auth.user?.id)return $.json({error:"Unauthorized"},401);return Z()},Rn$=()=>{let $=new Q1;return $.use("*",Wj6),$.get("/",async(Z)=>{let Q=M0(),X=Q.decoSupabaseUrl,Y=Q.decoSupabaseServiceKey;if(!X||!Y)return Z.json({apps:[]});try{let G=await vY(X,Y,"apps?select=name,title,description,logo,category,vendors(alias,url)");return Z.json({apps:Jj6(G)})}catch(G){return console.error("[deco-apps] GET error:",G),Z.json({error:"Failed to fetch apps"},502)}}),$};var qn$=D(()=>{h$();E$();KT0()});import{z as M1}from"zod";function QF($,Z="invalid_request_error",Q=null,X=null){return{error:{message:$,type:Z,param:Q,code:X}}}function Lj6($){if(!$)return null;let Z=$.indexOf(":");if(Z===-1)return{credentialId:null,modelId:$};let Q=$.substring(0,Z),X=$.substring(Z+1);if(!Q||!X)return null;return{credentialId:Q,modelId:X}}function Ej6($,Z,Q){try{return JSON.parse($)}catch{throw new kn$(`Invalid JSON in tool call arguments for function '${Q}' (tool_call_id: ${Z}): ${$}`)}}function jj6($){let Z={};for(let Q of $)if(Q.role==="assistant"&&Q.tool_calls)for(let X of Q.tool_calls)Z[X.id]=X.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((Y)=>{if(Y.type==="text")return{type:"text",text:Y.text};return{type:"image",image:Y.image_url.url}})};case"assistant":if(Q.tool_calls&&Q.tool_calls.length>0)return{role:"assistant",content:Q.tool_calls.map((Y)=>({type:"tool-call",toolCallId:Y.id,toolName:Y.function.name,input:Ej6(Y.function.arguments,Y.id,Y.function.name)}))};return{role:"assistant",content:Q.content??""};case"tool":let X=Z[Q.tool_call_id]??"unknown";return{role:"tool",content:[{type:"tool-result",toolCallId:Q.tool_call_id,toolName:X,output:{type:"text",value:Q.content}}]}}})}function zj6($){let Z=$.map((Q)=>{let X=Q.function.parameters?LG(Q.function.parameters):LG({type:"object",properties:{}});return[Q.function.name,W$({description:Q.function.description,inputSchema:X})]});return Object.fromEntries(Z)}function Pj6($){if(!$)return;return{openai:{response_format:$}}}function Aj6(){return`chatcmpl-${crypto.randomUUID().replace(/-/g,"").substring(0,29)}`}function In$($,Z,Q,X,Y,G){let J={model:$,messages:Z,tools:Q,temperature:X.temperature,maxTokens:X.max_tokens,topP:X.top_p,frequencyPenalty:X.frequency_penalty,presencePenalty:X.presence_penalty,stopSequences:X.stop?Array.isArray(X.stop)?X.stop:[X.stop]:void 0,abortSignal:G};return Y?{...J,providerOptions:Y}:J}function Mn$($){if($==="tool-calls")return"tool_calls";if($==="length")return"length";return"stop"}var Kj6=256,Hj6,Fj6,Uj6,Nj6,Bj6,Oj6,Dj6,wj6,kn$,Vn$,Sn$;var Cn$=D(()=>{V4();h$();el();XN();Hj6=M1.object({type:M1.literal("function"),function:M1.object({name:M1.string(),description:M1.string().optional(),parameters:M1.record(M1.string(),M1.unknown()).optional()})}),Fj6=M1.object({id:M1.string(),type:M1.literal("function"),function:M1.object({name:M1.string(),arguments:M1.string()})}),Uj6=M1.discriminatedUnion("role",[M1.object({role:M1.literal("system"),content:M1.string(),name:M1.string().optional()}),M1.object({role:M1.literal("user"),content:M1.union([M1.string(),M1.array(M1.union([M1.object({type:M1.literal("text"),text:M1.string()}),M1.object({type:M1.literal("image_url"),image_url:M1.object({url:M1.string(),detail:M1.string().optional()})})]))]),name:M1.string().optional()}),M1.object({role:M1.literal("assistant"),content:M1.string().nullable().optional(),name:M1.string().optional(),tool_calls:M1.array(Fj6).optional()}),M1.object({role:M1.literal("tool"),content:M1.string(),tool_call_id:M1.string()})]),Nj6=M1.object({type:M1.literal("text")}),Bj6=M1.object({type:M1.literal("json_object")}),Oj6=M1.object({type:M1.literal("json_schema"),json_schema:M1.object({name:M1.string(),description:M1.string().optional(),schema:M1.record(M1.string(),M1.unknown()),strict:M1.boolean().optional()})}),Dj6=M1.union([Nj6,Bj6,Oj6]),wj6=M1.object({model:M1.string().describe("Format: 'model_id' or 'credential_id:model_id'"),messages:M1.array(Uj6),stream:M1.boolean().optional().default(!1),temperature:M1.number().min(0).max(2).optional(),max_tokens:M1.number().positive().optional(),top_p:M1.number().min(0).max(1).optional(),frequency_penalty:M1.number().min(-2).max(2).optional(),presence_penalty:M1.number().min(-2).max(2).optional(),stop:M1.union([M1.string(),M1.array(M1.string())]).optional(),tools:M1.array(Hj6).optional(),tool_choice:M1.union([M1.literal("auto"),M1.literal("none"),M1.literal("required"),M1.object({type:M1.literal("function"),function:M1.object({name:M1.string()})})]).optional(),response_format:Dj6.optional(),user:M1.string().optional()});kn$=class kn$ extends Error{constructor($){super($);this.name="MessageConversionError"}};Vn$=new Q1;Vn$.post("/:org/v1/chat/completions",async($)=>{let Z=$.get("studioContext"),Q=$.req.param("org");try{if(!Z.auth.apiKey?.id)return $.json(QF("API key authentication required. Provide a valid API key via Authorization header.","authentication_error"),401);if(!Z.organization)return $.json(QF("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(QF("Organization mismatch. The API key's organization does not match the requested organization.","invalid_request_error","organization"),403);let X=await $.req.json(),Y=wj6.safeParse(X);if(!Y.success){let L=Y.error.issues[0]??{message:"Invalid request",path:[]};return $.json(QF(`Invalid request: ${L.message}`,"invalid_request_error",L.path.length>0?L.path.join("."):null),400)}let G=Y.data,J=Lj6(G.model);if(!J)return $.json(QF("Invalid model format. Expected 'model_id' or 'credential_id:model_id' (e.g., 'claude-sonnet-4-6' or 'key_abc123:claude-sonnet-4-6')","invalid_request_error","model"),400);let{credentialId:W}=J,{modelId:K}=J;if(!W){let E=(await Z.storage.aiProviderKeys.list({organizationId:Z.organization.id})).find((j)=>iL(j.providerId));if(!E)return $.json(QF("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(QF(`AI provider credential not found or inaccessible: ${W}`,"invalid_request_error","model"),404)}let F=H.aiSdk.languageModel(K),U=jj6(G.messages),N=G.tools?zj6(G.tools):void 0,B=Pj6(G.response_format),O=Aj6(),w=Math.floor(Date.now()/1000);if(G.stream)return qN($,async(L)=>{let E=In$(F,U,N,G,B,$.req.raw.signal);try{let j=ID(E),z=!1,P=0,A="",q=async()=>{if(A.length===0)return;let k=A;A="",await L.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:w,model:G.model,choices:[{index:0,delta:{content:k},finish_reason:null}]})})};for await(let k of j.fullStream){if(!z&&(k.type==="text-delta"||k.type==="tool-call"))await L.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:w,model:G.model,choices:[{index:0,delta:{role:"assistant",content:""},finish_reason:null}]})}),z=!0;if(k.type==="text-delta"){if(A+=k.text,A.length>=Kj6)await q()}else if(k.type==="tool-call"){await q();let M=P++;await L.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:w,model:G.model,choices:[{index:0,delta:{tool_calls:[{index:M,id:k.toolCallId,type:"function",function:{name:k.toolName,arguments:JSON.stringify(k.input)}}]},finish_reason:null}]})})}else if(k.type==="finish")await q(),await L.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:w,model:G.model,choices:[{index:0,delta:{},finish_reason:Mn$(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 L.writeSSE({data:"[DONE]"})}catch(j){let z=j;console.error("[openai-compat:stream] Error:",z.message),await L.writeSSE({data:JSON.stringify({error:{message:z.message,type:"server_error"}})})}});else{let L=In$(F,U,N,G,B,$.req.raw.signal),E=await RD(L),j={role:"assistant",content:E.text||null};if(E.toolCalls&&E.toolCalls.length>0)j.tool_calls=E.toolCalls.map((z)=>({id:z.toolCallId,type:"function",function:{name:z.toolName,arguments:JSON.stringify("input"in z?z.input:{})}})),j.content=null;return $.json({id:O,object:"chat.completion",created:w,model:G.model,choices:[{index:0,message:j,finish_reason:Mn$(E.finishReason)}],usage:{prompt_tokens:E.usage?.inputTokens??0,completion_tokens:E.usage?.outputTokens??0,total_tokens:E.usage?.totalTokens??0}})}}catch(X){let Y=X;if(Y.name==="AbortError")return $.json(QF("Request aborted","invalid_request_error"),400);if(Y.name==="MessageConversionError")return $.json(QF(Y.message,"invalid_request_error","messages"),400);return console.error("[openai-compat] Error:",Y.message,Y.stack),$.json(QF(Y.message,"server_error"),500)}});Sn$=Vn$});function Tj6($){if(typeof $!=="object"||$===null)return!1;let Q=$.githubRepo?.url;return typeof Q==="string"&&Q.length>0}function _n$(){let $=new Q1;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"),X=n0(Q);if(!X)return Z.json({error:"Authentication required"},401);let G=(Z.req.query("site")??"").trim().toLowerCase();if(!WX(G))return Z.json({error:"Invalid site slug"},400);let J=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","=",X).execute(),W=[];for(let H of J){if(!H.slug||p9(H))continue;let F=await Q.storage.virtualMcps.list(H.id);for(let U of F){if(U$$(U)!==G)continue;if(!Tj6(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 vn$=D(()=>{h$();HU()});var bn$;var fn$=D(()=>{bn$={name:"decocms",version:"4.340.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 Ij6(){let $=process.env.POSTHOG_KEY;if(!$)return null;return{key:$,host:process.env.POSTHOG_HOST??qj6}}var xn$,qj6="https://ph.studio.decocms.com",yn$;var gn$=D(()=>{h$();EZ0();n_();S5();E$();e71();fn$();xn$=new Q1;xn$.get("/",($)=>{let Z={version:bn$.version,theme:bt1(),...XU().logo&&{logo:XU().logo},...mU()&&{internalUrl:Xb1()},...M0().enableDecoImport&&{enableDecoImport:!0},brandExtractEnabled:!!M0().firecrawlApiKey,hostingEnabled:!!M0().controlplaneRestUrl&&!!M0().controlplaneServiceToken,hostingControlPlaneGa:M0().hostingControlPlaneGa,monitorEnabled:!!M0().clickhouseAnalyticsUrl&&!!M0().clickhouseAnalyticsPassword,monitorGa:M0().monitorGa,auth:Ol$(),posthog:Ij6(),googleMapsApiKey:process.env.GOOGLE_MAPS_API_KEY?.trim()||null,runtime:{agentSandbox:Z00()}};return $.header("Cache-Control","no-store"),$.json({success:!0,config:Z})});yn$=xn$});function Wc($){let Z=($??"").trim().toLowerCase();return Z=Z.replace(/^https?:\/\//,""),Z=Z.replace(/^www\./,""),Z=Z.split(/[/?#]/)[0]??"",Z.replace(/\/+$/,"")}function RY1($){return(Wc($).split(".")[0]||$).replace(/[-_]/g," ").split(" ").filter(Boolean).map((Q)=>Q.charAt(0).toUpperCase()+Q.slice(1)).join(" ")}function un$($,Z=64){return`https://www.google.com/s2/favicons?domain=${encodeURIComponent(Wc($))}&sz=${Z}`}function hn$($,Z){let Q=$.trim();if(Q.length<=Z)return Q;let X=Q.slice(0,Z-1),Y=X.lastIndexOf(" ");return`${(Y>Z*0.6?X.slice(0,Y):X).trimEnd()}\u2026`}function ln$($){let{brand:Z,domain:Q,score:X,verdict:Y}=$,G=typeof X==="number"?`${Z} commerce report \u2014 ${Math.round(X)}/100 \xB7 decocms`:`${Z} commerce report \xB7 decocms`,J=`See the full ${Z} scorecard \u2014 SEO, performance, conversion & AEO signals scored by decocms.`,W=Y?.trim()?hn$(`${Y.trim().replace(/\s+/g," ")} \u2014 ${J}`,200):hn$(`How does ${Q} really perform? ${J}`,200);return{title:G,description:W}}import{z as c0}from"zod";var qf,Mj6,kj6,Vj6,Sj6,cn$;var dn$=D(()=>{qf=c0.enum(["good","bad","neutral"]),Mj6=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:qf.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 $})),kj6=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(Mj6)),Vj6={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()},Sj6=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:qf.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:qf.optional()}),c0.object({template:c0.literal("stats"),stats:c0.array(c0.object({value:c0.coerce.string(),label:c0.coerce.string(),tone:qf.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:qf.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(kj6).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:qf.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:qf.optional()})).min(1)})]),cn$=c0.object({...Vj6,template:Sj6})});function DR0($){let Z=[],Q=[...$.sections].sort((Y,G)=>Y.position-G.position).map((Y)=>{let G=cn$.safeParse(Y.props);if(G.success)return G.data;let J=G.error.issues[0];return Z.push({section_type:Y.section_type,position:Y.position,reason:J?`${J.path.join(".")||"(root)"}: ${J.message}`:"contract violation"}),null}).filter((Y)=>Y!==null),X=Q.filter((Y)=>Y.template.template!=="cover"&&Y.template.template!=="cta").map((Y)=>({key:Y.key,title:Y.title}));return{deck:{meta:{...$.meta,scores:$.summary?.scores,scannedAt:$.scanned_at,toc:X},slides:Q},drops:Z}}var qY1=D(()=>{dn$()});import{join as mn$}from"path";async function _j6($){try{let Z=await fetch(`${yK({})}/api/v2/public/diagnostics/${encodeURIComponent($)}`,{headers:{Accept:"application/json"},signal:AbortSignal.timeout(Cj6)});if(!Z.ok)return null;let Q=await Z.json(),{deck:X}=DR0(Q);if(!X.slides.length)return null;let Y=X.slides.find((W)=>W.template.template==="cover"),G=Y?.template,J=G&&G.template==="cover"?G:void 0;return{brand:X.meta.brand?.trim()||RY1($),score:X.meta.scores?.cover??J?.score?.value,verdict:Y?.annotation?.trim()||Y?.headline?.trim()||void 0}}catch{return null}}function xG($){return $.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function vj6($,Z){let Q=Wc($),X=Z?.brand?.trim()||RY1(Q),Y=un$(Q,128),J=`${(M0().baseUrl??"https://studio.decocms.com").replace(/\/+$/,"")}/report/${encodeURIComponent(Q)}`,{title:W,description:K}=ln$({brand:X,domain:Q,score:Z?.score,verdict:Z?.verdict}),H=`${J}/og.png`,F=`${X} commerce report by decocms`;return[`<title>${xG(W)}</title>`,`<meta name="description" content="${xG(K)}" />`,'<meta name="robots" content="noindex, follow" />','<meta property="og:type" content="website" />','<meta property="og:site_name" content="decocms" />',`<meta property="og:title" content="${xG(W)}" />`,`<meta property="og:description" content="${xG(K)}" />`,`<meta property="og:url" content="${xG(J)}" />`,`<meta property="og:image" content="${xG(H)}" />`,'<meta property="og:image:width" content="1200" />','<meta property="og:image:height" content="630" />',`<meta property="og:image:alt" content="${xG(F)}" />`,'<meta name="twitter:card" content="summary_large_image" />',`<meta name="twitter:title" content="${xG(W)}" />`,`<meta name="twitter:description" content="${xG(K)}" />`,`<meta name="twitter:image" content="${xG(H)}" />`,`<meta name="twitter:image:alt" content="${xG(F)}" />`,`<link rel="canonical" href="${xG(J)}" />`,`<link rel="icon" href="${xG(Y)}" sizes="any" />`].join(`
|
|
2929
2929
|
`)}function fj6($,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}
|
|
2930
2930
|
</head>`)}function in$($){let Z=new Q1;return Z.get("/:domain/og.png",async(Q)=>{let X=Wc(Q.req.param("domain")),Y=async()=>{let G=$?Bun.file(mn$($,"report-og-fallback.png")):null;if(!G||!await G.exists())return Q.notFound();return Q.body(new Uint8Array(await G.arrayBuffer()),200,{"Content-Type":"image/png","Cache-Control":"public, max-age=0, s-maxage=3600"})};try{let G=await fetch(`${yK({})}/api/v2/public/diagnostics/${encodeURIComponent(X)}/og.png`,{signal:AbortSignal.timeout(bj6)}),J=G.headers.get("content-type")??"";if(!G.ok||!J.startsWith("image/")||!G.body)return Y();return Q.body(G.body,200,{"Content-Type":J,"Cache-Control":"public, max-age=0, s-maxage=604800"})}catch{return Y()}}),Z.get("/:domain",async(Q)=>{let X=Q.req.param("domain"),Y=$?mn$($,"index.html"):null,G=Y?Bun.file(Y):null;if(!G||!await G.exists())return Q.notFound();let J=await G.text();try{let W=await _j6(Wc(X)),K=vj6(X,W);return Q.html(fj6(J,K),200,{"Cache-Control":"public, max-age=0, s-maxage=300"})}catch{return Q.html(J)}}),Z}var Cj6=2500,bj6=1e4;var pn$=D(()=>{h$();qY1();rE();E$()});function te($,Z){return fetch(`${yK({})}${$}`,Z)}async function xj6($,Z,Q){let X=new URLSearchParams;if(Z)X.set("pw",Z);if(Q)X.set("lang",Q);let Y=X.toString()?`?${X.toString()}`:"",G=await te(`/api/v2/public/diagnostics/${encodeURIComponent($)}${Y}`,{headers:{Accept:"application/json"}});if(G.status===404)return{status:"not_found",deck:null,scanned_at:null,drops:[]};if(!G.ok)throw Error(`report read HTTP ${G.status}`);let J=await G.json(),{deck:W,drops:K}=DR0(J);return{status:W.slides.length?"ready":"empty",deck:W,scanned_at:J.scanned_at,drops:K}}var yj6,MN,nn$=async($,Z)=>{if(!$.get("reportUser"))return $.json({error:"Authentication required"},401);await Z();return},tn$;var on$=D(()=>{h$();WG();rE();qY1();yj6=new Set(["complete","errored","terminated","unknown"]),MN=new Q1;MN.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});MN.use("/link-token/*",nn$);MN.use("/suggest",nn$);MN.get("/site/:domain",async($)=>{let Z=$.req.param("domain").trim();if(!Z)return $.json({error:"domain is required"},400);let Q=$.get("reportUser"),X=$.req.query("key")?.trim()||void 0,Y=$.req.query("lang")?.trim()||void 0;try{let G=await xj6(Z,X,Y);if($.header("Cache-Control","private, no-store"),Q||!G.deck)return $.json(G);return $.json({...G,deck:{...G.deck,slides:G.deck.slides.slice(0,1)},truncated:G.status==="ready"})}catch{return $.json({error:"report read failed"},502)}});MN.post("/run",async($)=>{let Z=$.get("reportUser"),Q;try{Q=await $.req.json()}catch{return $.json({error:"invalid JSON"},400)}let X=typeof Q.domain==="string"?Q.domain.trim():"";if(!X)return $.json({error:"domain is required"},400);let Y=Z?.email,G=typeof Q.distinctId==="string"&&Q.distinctId.trim()&&Q.distinctId.length<=200?Q.distinctId.trim():void 0;try{let J=await te("/api/v2/diagnostics/run",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${oE({})}`},body:JSON.stringify({url:X,...Y?{email:Y}:{},distinct_id:G})});if(!J.ok)return $.json({error:`run HTTP ${J.status}`},502);let W=await J.json(),K=W.blocked?{state:"blocked"}:W.status==="fresh"?{state:"fresh"}:W.mode==="sync"?{state:"sync"}:{state:"running",id:W.id??null};return $.json(K)}catch{return $.json({error:"run failed"},502)}});MN.get("/status",async($)=>{let Z=$.req.query("id");if(!Z)return $.json({error:"id is required"},400);try{let Q=await te(`/api/v2/diagnostics/status?id=${encodeURIComponent(Z)}`,{headers:{Authorization:`Bearer ${oE({})}`}});if(!Q.ok)return $.json({error:`status HTTP ${Q.status}`},502);let Y=(await Q.json()).status??"unknown",G={done:yj6.has(Y),status:Y};return $.json(G)}catch{return $.json({error:"status failed"},502)}});MN.get("/link-token/:id",async($)=>{let Z=$.req.param("id");try{let Q=await te(`/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)}});MN.get("/suggest",async($)=>{let Z=($.req.query("q")??"").trim().slice(0,64);if(Z.length<2)return $.json({suggestions:[]});try{let Q=await te(`/api/v2/public/suggest?q=${encodeURIComponent(Z)}`,{headers:{Accept:"application/json"}});if(!Q.ok)return $.json({suggestions:[]});let X=await Q.json();return $.json({suggestions:Array.isArray(X.suggestions)?X.suggestions:[]})}catch{return $.json({suggestions:[]})}});tn$=MN});import{createHmac as gj6,timingSafeEqual as hj6}from"crypto";function sn$($,Z,Q,X=Date.now()){if(!Z||!Q)return!1;let Y,G=[];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")Y=N;else if(U==="v1")G.push(N)}if(!Y||G.length===0)return!1;let J=Number(Y);if(!Number.isFinite(J)||Math.abs(X/1000-J)>uj6)return!1;let W=gj6("sha256",Q).update(`${Y}.${$}`).digest("hex"),K=Buffer.from(W,"hex");return G.some((H)=>{let F=Buffer.from(H,"hex");return K.length===F.length&&hj6(K,F)})}function an$($){let Z;try{Z=JSON.parse($)}catch{return null}let Q=J3(Z),X=J3(J3(Q?.data)?.object);if(!Q||typeof Q.type!=="string"||!X)return null;return{id:XF(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:X}}}function en$($){switch($){case"active":case"trialing":return"active";case"past_due":return"past_due";default:return"canceled"}}function XF($){return typeof $==="string"?$:void 0}function J3($){return typeof $==="object"&&$!==null?$:void 0}function wR0($){return typeof $==="number"?new Date($*1000):null}function kY1($){return XF($)??XF(J3($)?.id)}function lj6($){return kY1($.subscription)??XF(J3(J3($.parent)?.subscription_details)?.subscription)}function cj6($){let Z=wR0($.current_period_end);if(Z)return Z;let Q=J3($.items)?.data;if(!Array.isArray(Q))return null;let X=0;for(let Y of Q){let G=J3(Y)?.current_period_end;if(typeof G==="number"&&G>X)X=G}return X>0?new Date(X*1000):null}function IY1($,Z){let Q=wR0($.created);return!!Q&&!!Z.lastStripeEventAt&&Q<Z.lastStripeEventAt}function MY1($,Z){let Q=wR0($.created);if(!Q)return;return Z.lastStripeEventAt&&Z.lastStripeEventAt>Q?void 0:Q}async function dj6($,Z){let Q=Z.data.object;switch(Z.type){case"checkout.session.completed":case"checkout.session.async_payment_succeeded":{let X=XF(J3(Q.metadata)?.orgId);if(!X)return{handled:!1,reason:"no orgId"};if(XF(J3(Q.metadata)?.kind)==="topup"){if(Q.mode!=="payment")return{handled:!1,reason:"topup with wrong mode"};if(XF(Q.payment_status)!=="paid")return{handled:!1,reason:"payment not confirmed"};let J=XF(Q.id);if(!J)return console.error("stripe webhook: topup session without id",{eventId:Z.id,organizationId:X}),{handled:!1,reason:"topup session without id"};let W=Number(J3(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:X,creditCents:J3(Q.metadata)?.creditCents}),{handled:!1,reason:"bad topup metadata"};return{handled:!0,organizationId:X,topUp:{creditCents:W,referenceId:`stripe-topup:${J}`}}}if(Q.mode!=="subscription")return{handled:!1,reason:"not a subscription checkout"};if(XF(Q.payment_status)!=="paid")return{handled:!1,reason:"payment not confirmed"};let Y=await $.getBilling(X);if(!Y)return{handled:!1,reason:"unknown org"};let G=kY1(Q.subscription);if(Y.stripeSubscriptionId&&G&&Y.stripeSubscriptionId!==G)return console.error("stripe webhook: refused checkout rebind",{organizationId:X,eventId:Z.id}),{handled:!1,reason:"org already bound to another subscription",orphanSubscriptionId:G};if(IY1(Z,Y))return{handled:!1,reason:"stale event"};return await $.updateStripeState(X,{stripeCustomerId:kY1(Q.customer),stripeSubscriptionId:G,status:"active",lastStripeEventAt:MY1(Z,Y)}),{handled:!0,organizationId:X}}case"customer.subscription.updated":case"customer.subscription.deleted":{let X=XF(Q.id);if(!X)return{handled:!1,reason:"no sub id"};let Y=await $.getBillingByStripeSubscriptionId(X);if(!Y)return{handled:!1,reason:"unknown subscription"};let G=Z.type==="customer.subscription.deleted";if(!G&&IY1(Z,Y))return{handled:!1,reason:"stale event"};let J=G?"canceled":en$(Q.status);return await $.updateStripeState(Y.organizationId,{status:J,currentPeriodEnd:cj6(Q),...G&&{stripeSubscriptionId:null},lastStripeEventAt:MY1(Z,Y)}),{handled:!0,organizationId:Y.organizationId}}case"invoice.paid":{let X=lj6(Q);if(!X)return{handled:!1,reason:"no sub id"};let Y=await $.getBillingByStripeSubscriptionId(X);if(!Y)return{handled:!1,reason:"unknown subscription"};if(IY1(Z,Y))return{handled:!1,reason:"stale event"};return await $.updateStripeState(Y.organizationId,{status:"active",currentPeriodEnd:wR0(Q.period_end),lastStripeEventAt:MY1(Z,Y)}),{handled:!0,organizationId:Y.organizationId}}default:return{handled:!1,reason:`unhandled event ${Z.type}`}}}function mj6($,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:en$(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 rn$($,Z){let Q=mj6($,Z);if(!Q)return;QG({event:Q.name,organizationId:Q.organizationId,...$.id?{uuid:dr1(`stripe:${$.id}:${Q.name}`)}:{},...$.created?{timestamp:new Date($.created*1000)}:{},properties:Q.properties})}async function $t$($){let Z=new vK(Z8().db),Q=await dj6(Z,$);if(!(Q.handled&&Q.topUp))rn$($,Q);if(Q.handled&&Q.topUp)await mA$({organizationId:Q.organizationId,amountCents:Q.topUp.creditCents,referenceId:Q.topUp.referenceId}),rn$($,Q);if(!Q.handled&&Q.orphanSubscriptionId)try{await G8$(Q.orphanSubscriptionId),console.error("stripe webhook: canceled orphan subscription",{subscriptionId:Q.orphanSubscriptionId,eventId:$.id})}catch(X){if(!(X instanceof KG&&(X.status===400||X.status===404)))throw X}return Q}var uj6=300;var Zt$=D(()=>{UJ();y4();$Z0();Ej();v81()});var ij6=1048576,VY1;var Qt$=D(()=>{h$();rH();E$();Zt$();VY1=new Q1;VY1.post("/webhook",Z9({maxSize:ij6,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(!sn$(Q,$.req.header("stripe-signature"),Z))return $.json({error:"invalid signature"},400);let Y=an$(Q);if(!Y)return $.json({error:"invalid payload"},400);let G=await $t$(Y);return console.log("stripe webhook",{eventId:Y.id,type:Y.type,livemode:Y.livemode,...G}),$.json({received:!0})})});import{timingSafeEqual as pj6}from"crypto";function tj6($,Z,Q){if(!Z?.startsWith("sha256="))return!1;let X=new Bun.CryptoHasher("sha256",Q).update($).digest("hex"),Y=Z.slice(7);if(Y.length!==X.length)return!1;return pj6(Buffer.from(Y),Buffer.from(X))}var nj6=5242880,SY1;var Xt$=D(()=>{h$();rH();HW();SY1=new Q1;SY1.post("/webhook",Z9({maxSize:nj6,onError:($)=>$.json({error:"payload too large"},413)}),async($)=>{let Z=process.env.GITHUB_WEBHOOK_SECRET;if(!Z)return $.json({error:"github webhook not configured"},503);let Q=await $.req.text();if(!tj6(Q,$.req.header("x-hub-signature-256"),Z))return $.json({error:"invalid signature"},400);if($.req.header("x-github-event")!=="push")return $.json({ok:!0,ignored:"event"});let X;try{X=JSON.parse(Q)}catch{return $.json({error:"invalid payload"},400)}let Y=X.ref,G=X.repository?.full_name;if(!Y||!G)return $.json({ok:!0,ignored:"shape"});let W=(await Zo0())?.markTenantPoolsDirty(G,Y)??[];return $.json({ok:!0,pools:W})})});function Yt$($){let Z=new wN($.db,new oQ($.encryptionKey)),Q=new Q1;return Q.get("/attachments/:token",async(X)=>{let Y=rU$(X.req.param("token"));if(!Y)return X.json({error:"Invalid or expired link"},404);let G=await Z.getByOrg(Y.organizationId);if(!G)return X.json({error:"Jira is not connected"},404);let W=await new zG(G.siteUrl,G.email,G.apiToken).downloadAttachment(Y.attachmentId);if(!W.ok||!W.body)return X.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 Gt$=D(()=>{h$();EB();Ls0();S_()});function Jt$($){if(typeof $!=="object"||$===null)return null;let Z=$;if(Z.webhookEvent!=="jira:issue_updated")return null;let Q=Z.issue?.id,X=Z.issue?.key,Y=Z.changelog?.id;if(typeof Q!=="string"&&typeof Q!=="number"||typeof X!=="string"||typeof Y!=="string"&&typeof Y!=="number")return null;let G=Z.changelog?.items?.find((J)=>J.field==="status");if(!G||typeof G.toString!=="string")return null;return{issueId:String(Q),issueKey:X,toStatus:G.toString,changelogId:String(Y)}}function Wt$($,Z,Q){let X=[];for(let Y of Z){if(new Date(Y.created).getTime()<Q.getTime())continue;let G=Y.items.find((J)=>J.field==="status");if(!G||typeof G.toString!=="string")continue;X.push({issueId:$.id,issueKey:$.key,toStatus:G.toString,changelogId:Y.id})}return X.sort((Y,G)=>Number(Y.changelogId)-Number(G.changelogId))}function sj6($){return`Jira ${$.key}: ${$.summary}`}async function LR0($,Z,Q){if(!Z.enabled)return"disabled";let X=Z.organizationId,Y=await $.storage.jiraIntegrations.getAutomation(X,Q.toStatus);if(!Y)return"no_rule";let G=new zG(Z.siteUrl,Z.email,Z.apiToken),J=await fL0(G,Z.siteUrl,Q.issueId),W=await aj6($,Z,Q,J);if(!await $.storage.jiraIntegrations.claimTrigger(X,Q.issueId,Q.changelogId))return"duplicate";let H=await $.storage.taskBoard.update(W.id,X,{assigneeId:n$,assignedBy:Z.createdBy},Z.createdBy);try{await AW($,H,{instruction:Y.prompt??oj6,source:{kind:"jira",issueKey:J.key,title:sj6(J),body:`${bL0(J)}
|
|
2931
2931
|
|