decocms 4.495.0 → 4.496.0
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/{ActiveShapeUtils-DCHlcSOh.js → ActiveShapeUtils-BVT17h1W.js} +1 -1
- package/dist/client/assets/{AlertCircle-9YsZUjmj.js → AlertCircle-DY8bqCha.js} +1 -1
- package/dist/client/assets/{AreaChart-CeW2QCC3.js → AreaChart-C85WUbhU.js} +1 -1
- package/dist/client/assets/{ArrowLeft-ZHARsvy9.js → ArrowLeft--XLYCrc5.js} +1 -1
- package/dist/client/assets/{ArrowUp-D1danNae.js → ArrowUp-YDXnrJ7G.js} +1 -1
- package/dist/client/assets/{BarChart-DdrNiWaE.js → BarChart-CJTCxyya.js} +1 -1
- package/dist/client/assets/{Building02-ssxWkdBl.js → Building02-NwIw90j5.js} +1 -1
- package/dist/client/assets/{CategoricalChart-ClYHeQF6.js → CategoricalChart-DgAbcYNa.js} +1 -1
- package/dist/client/assets/{CheckCircle-DiKVJkkJ.js → CheckCircle-nhmFTvE6.js} +1 -1
- package/dist/client/assets/{ChevronSelectorVertical-Dkzqp5pp.js → ChevronSelectorVertical-DTio1rjg.js} +1 -1
- package/dist/client/assets/{ChevronUp-wLOc_NTT.js → ChevronUp-CqUEILrt.js} +1 -1
- package/dist/client/assets/{Copy01-Cr5x9Tlu.js → Copy01-CvPIDjuG.js} +1 -1
- package/dist/client/assets/{CreditCard01-DCL7xzU2.js → CreditCard01-DCfqvozy.js} +1 -1
- package/dist/client/assets/{DotsVertical-DZE2ktIm.js → DotsVertical-CSCmFu8Q.js} +1 -1
- package/dist/client/assets/{ErrorBarContext-D4j8kFWO.js → ErrorBarContext-9--7esXK.js} +1 -1
- package/dist/client/assets/{Globe04-DLL93yaf.js → Globe04-DG7jBKGP.js} +1 -1
- package/dist/client/assets/{Image01-Doh_epPd.js → Image01-cbCHFYmk.js} +1 -1
- package/dist/client/assets/{Key01-rqwReuZQ.js → Key01-04C5Cb93.js} +1 -1
- package/dist/client/assets/{Link01-DiFWbMaR.js → Link01-Cq7ZQK57.js} +1 -1
- package/dist/client/assets/{LinkBroken01-DGQh_3WZ.js → LinkBroken01-ydPCJGh6.js} +1 -1
- package/dist/client/assets/{Monitor01-Cp7iEwN0.js → Monitor01-BosmGMIH.js} +1 -1
- package/dist/client/assets/{Play-C2hvYOyw.js → Play-BGed4f8X.js} +1 -1
- package/dist/client/assets/{Plus-v0YpByfM.js → Plus-CS-imxjk.js} +1 -1
- package/dist/client/assets/{SearchMd-Bendi2p8.js → SearchMd-DpDuLpr9.js} +1 -1
- package/dist/client/assets/{Sector-Clpc9eH-.js → Sector-DmYQYvNe.js} +1 -1
- package/dist/client/assets/{ShoppingBag01-BG-1Jwuh.js → ShoppingBag01-CAuMgtYk.js} +1 -1
- package/dist/client/assets/{Sun-CJr96mBh.js → Sun-DNYaWg-8.js} +1 -1
- package/dist/client/assets/{SwitchHorizontal01-Dv53_XOE.js → SwitchHorizontal01-TWyW2jhZ.js} +1 -1
- package/dist/client/assets/{Tool01-B-kpMrMZ.js → Tool01-PXS7oM2l.js} +1 -1
- package/dist/client/assets/{Trash01-3M9m1iIs.js → Trash01-DD84camw.js} +1 -1
- package/dist/client/assets/{Upload01-DBgIGKf8.js → Upload01-B7IJQr07.js} +1 -1
- package/dist/client/assets/{User01-CT2R-iHD.js → User01-eOIeHV7h.js} +1 -1
- package/dist/client/assets/{UserSquare-BuJqx7Ns.js → UserSquare-D5P__qW1.js} +1 -1
- package/dist/client/assets/{Users01-gQNjKybb.js → Users01-UUMGKcsN.js} +1 -1
- package/dist/client/assets/{XAxis-DBRxAeUY.js → XAxis-D93kHNyl.js} +1 -1
- package/dist/client/assets/{XClose-Bpws6cjk.js → XClose-TrpNsToi.js} +1 -1
- package/dist/client/assets/{ZoomOut-CVwCO-_8.js → ZoomOut-DmuBfqXK.js} +1 -1
- package/dist/client/assets/{access-gate-DlhD9I9N.js → access-gate-CzXMCDQe.js} +1 -1
- package/dist/client/assets/{add-connection-dialog-CQiSl-Qe.js → add-connection-dialog-Co74MHAY.js} +1 -1
- package/dist/client/assets/{agent-analytics-Dlpy_544.js → agent-analytics-D8I2BkKH.js} +1 -1
- package/dist/client/assets/agent-app-CwZ2kAfk.js +1 -0
- package/dist/client/assets/{agent-assets-Ba_4hhfI.js → agent-assets-DeODDcT0.js} +1 -1
- package/dist/client/assets/{agent-automation-DuF9ZiWS.js → agent-automation-Dkp6V5Sj.js} +1 -1
- package/dist/client/assets/{agent-automations-BV2eTHQr.js → agent-automations-BV-Io4eo.js} +1 -1
- package/dist/client/assets/{agent-connect-sources-C_fgxaTV.js → agent-connect-sources-DEzxvIm0.js} +1 -1
- package/dist/client/assets/agent-deck-XD5-oNlw.js +1 -0
- package/dist/client/assets/{agent-e2e-CgGLFkHe.js → agent-e2e-BfCWUHGd.js} +1 -1
- package/dist/client/assets/{agent-experiments-CpXLJckI.js → agent-experiments---UoWIs9.js} +1 -1
- package/dist/client/assets/{agent-file-Cak5KHUl.js → agent-file-VG03O57l.js} +1 -1
- package/dist/client/assets/{agent-hosting-2pI_IIlr.js → agent-hosting-DSyte2d6.js} +1 -1
- package/dist/client/assets/{agent-icon-BTsTGfvr.js → agent-icon-qroW1Utf.js} +1 -1
- package/dist/client/assets/agent-library-CF-9ULgs.js +1 -0
- package/dist/client/assets/agent-library-file-C-qUhWdr.js +1 -0
- package/dist/client/assets/{agent-monitor-BRq8qrkU.js → agent-monitor-Csn8HW-o.js} +1 -1
- package/dist/client/assets/{agent-overview-UU6Y44eX.js → agent-overview-DEew4Ktb.js} +1 -1
- package/dist/client/assets/agent-settings-BSWQd9s-.js +1 -0
- package/dist/client/assets/agent-site-editor-code-BEv9_ttW.js +2 -0
- package/dist/client/assets/{agent-site-editor-content-DXvV_eiy.js → agent-site-editor-content-B2KIymmj.js} +3 -3
- package/dist/client/assets/{agent-site-editor-preview-5ii-TR0s.js → agent-site-editor-preview-CBMBSUB9.js} +3 -3
- package/dist/client/assets/{agent-site-editor-LLur_-_o.js → agent-site-editor-uBf1cOid.js} +1 -1
- package/dist/client/assets/agent-view-BVhy8qXU.js +1 -0
- package/dist/client/assets/{agent-view-guard-CyNRuQw7.js → agent-view-guard-D7znUA8E.js} +1 -1
- package/dist/client/assets/{agents-list-BVqV3SYd.js → agents-list-C-Vfe442.js} +1 -1
- package/dist/client/assets/{ai-providers-jNZBkRl5.js → ai-providers-DYkLkRTi.js} +1 -1
- package/dist/client/assets/{alert-B2FW115A.js → alert-CknKmC4I.js} +1 -1
- package/dist/client/assets/{alert-dialog-Dr31Gqkz.js → alert-dialog-BEcI3FD3.js} +1 -1
- package/dist/client/assets/{analytics-sections-DOFncpfM.js → analytics-sections-DkIfraxE.js} +1 -1
- package/dist/client/assets/{api-keys-DPKcfTUa.js → api-keys-RdHH5-HO.js} +1 -1
- package/dist/client/assets/api-keys-ZMfH16wP.js +1 -0
- package/dist/client/assets/app-editor-Bexwu6y3.js +1 -0
- package/dist/client/assets/{asset-utils-CX1te1rQ.js → asset-utils-D1WmQlcr.js} +1 -1
- package/dist/client/assets/{auth-CM-DdMTE.js → auth-DQ7KFfQG.js} +1 -1
- package/dist/client/assets/{auth-catchall-D9Jl5rTX.js → auth-catchall-Bj80qHUZ.js} +1 -1
- package/dist/client/assets/{auth-entry-Cn0jyyw6.js → auth-entry-CVAWLxXS.js} +1 -1
- package/dist/client/assets/{auth-split-layout-DiVs6WJ3.js → auth-split-layout-DO_EbQUI.js} +1 -1
- package/dist/client/assets/{authenticate-and-persist-oauth-DEaKhdcs.js → authenticate-and-persist-oauth-BPoB61oq.js} +1 -1
- package/dist/client/assets/{automation-list-row-CG7kU51M.js → automation-list-row-DwzUqOw8.js} +1 -1
- package/dist/client/assets/{automation-runs-CGQu-nIx.js → automation-runs-Bp65TXd7.js} +1 -1
- package/dist/client/assets/{automations-D9LXua4J.js → automations-CqVssJOq.js} +1 -1
- package/dist/client/assets/{autosend-B7QA12Tw.js → autosend-CcQyaIGA.js} +1 -1
- package/dist/client/assets/{avatar-ByGDtOvp.js → avatar-Cv41gISF.js} +1 -1
- package/dist/client/assets/{badge-XA4dRNYq.js → badge-Ba3u97Pl.js} +1 -1
- package/dist/client/assets/{block-document-B0n4B4IP.js → block-document-CTLqTC_r.js} +1 -1
- package/dist/client/assets/{blocks-preview-workspace-context-C7bCK2dG.js → blocks-preview-workspace-context-DjdV5Qlt.js} +1 -1
- package/dist/client/assets/{blog-schema-D2K9lxFN.js → blog-schema-B-FGyljD.js} +1 -1
- package/dist/client/assets/{board-analytics-B5mmzmBe.js → board-analytics-CAsp769l.js} +1 -1
- package/dist/client/assets/{buckets-Qu8B15tT.js → buckets-CdAJQdCr.js} +1 -1
- package/dist/client/assets/{build-improve-prompt-doc-on-tpDMo.js → build-improve-prompt-doc-DrohBDE-.js} +1 -1
- package/dist/client/assets/{calendar-CRpUCA4p.js → calendar-CgbisEND.js} +1 -1
- package/dist/client/assets/{capability-load-error-Cwp75ry8.js → capability-load-error-BXZ3jboY.js} +1 -1
- package/dist/client/assets/category-editor-CT5MZmjt.js +1 -0
- package/dist/client/assets/{chart-CvxQFl1V.js → chart-DwidbVF_.js} +1 -1
- package/dist/client/assets/{chat-context-Cwuqjrlx.js → chat-context-22ccNySK.js} +1 -1
- package/dist/client/assets/{chat-draft-D0btcSjz.js → chat-draft-N3NbVf44.js} +1 -1
- package/dist/client/assets/{checkbox-DSNt2gzr.js → checkbox-C0LvF7-W.js} +1 -1
- package/dist/client/assets/{choose-editor-BKZj3uPE.js → choose-editor-qFu7w2K7.js} +1 -1
- package/dist/client/assets/{claim-phase-copy-DWZtPw6h.js → claim-phase-copy-BFltSmg_.js} +1 -1
- package/dist/client/assets/{cli-auth-success-C6o7zJ2p.js → cli-auth-success-DXxpngeJ.js} +1 -1
- package/dist/client/assets/{client-icons-BpKVWun3.js → client-icons-CnVFxZ_i.js} +1 -1
- package/dist/client/assets/{collapsible-DOY0YL_H.js → collapsible-Cu-qIf8C.js} +1 -1
- package/dist/client/assets/{collection-detail--7z4uSdQ.js → collection-detail-BVSz_Cdh.js} +1 -1
- package/dist/client/assets/{collection-display-button-Dtu1j77F.js → collection-display-button-Pi1sZkcY.js} +1 -1
- package/dist/client/assets/{collection-search-DdqYzjim.js → collection-search-Bo0RkeZA.js} +1 -1
- package/dist/client/assets/{collection-table-wrapper-8VyRclLN.js → collection-table-wrapper-5r6oHUdW.js} +1 -1
- package/dist/client/assets/{collection-tabs-CWwn3uMq.js → collection-tabs-BA6WZZHi.js} +1 -1
- package/dist/client/assets/{column-rules-_Ma8ZWf4.js → column-rules-DTQgaEq6.js} +1 -1
- package/dist/client/assets/{combobox-D7N8SC25.js → combobox-DvC3aUQL.js} +1 -1
- package/dist/client/assets/{command-Crl7raeC.js → command-Z9XxdQ7J.js} +1 -1
- package/dist/client/assets/{companion-mcps-section-DkjOETuc.js → companion-mcps-section-UDqr78P2.js} +1 -1
- package/dist/client/assets/{config-YLu1LJhW.js → config-DMRqiLdR.js} +1 -1
- package/dist/client/assets/{connect-BbV6U_hr.js → connect-CZP0LsuB.js} +1 -1
- package/dist/client/assets/{connect-layout-CQuvObDD.js → connect-layout-vkDPzLhT.js} +1 -1
- package/dist/client/assets/{connection-BVvM5npe.js → connection-CTQgZPtk.js} +1 -1
- package/dist/client/assets/{connection-card-sWgF9uUo.js → connection-card-uIuWBJMs.js} +1 -1
- package/dist/client/assets/{connection-detail-AG67uG4I.js → connection-detail-CuXCNQCD.js} +1 -1
- package/dist/client/assets/{connection-form-helpers-Je0bq7c_.js → connection-form-helpers-CLLIaKV6.js} +1 -1
- package/dist/client/assets/{connections-Dc6s7_rq.js → connections-DXNCmB8T.js} +1 -1
- package/dist/client/assets/context-BWyGxyVQ.js +1 -0
- package/dist/client/assets/{context-menu-JVsCdcDt.js → context-menu-D9MgVZQW.js} +1 -1
- package/dist/client/assets/{core.esm-CIWIcR9H.js → core.esm-BI45RQ70.js} +1 -1
- package/dist/client/assets/{create-organization-dialog-Ddjs5dmA.js → create-organization-dialog-C91DEkEa.js} +1 -1
- package/dist/client/assets/{daily-pulse-Dpe4FA_b.js → daily-pulse-B38J6G9s.js} +1 -1
- package/dist/client/assets/{device-hint-D9SLM9ag.js → device-hint-7yMCN-Os.js} +1 -1
- package/dist/client/assets/{discover-DlwaiXCQ.js → discover-lgSKE5DK.js} +1 -1
- package/dist/client/assets/{domain-settings-CwEiepSy.js → domain-settings-c_5HmpJ-.js} +1 -1
- package/dist/client/assets/{drawer-3zPC7EI9.js → drawer-D2dqAMx2.js} +1 -1
- package/dist/client/assets/{editor-BMb1eAhF.js → editor-jgAlbT28.js} +1 -1
- package/dist/client/assets/{empty-state-DUChmUAz.js → empty-state-DR-VrfEb.js} +1 -1
- package/dist/client/assets/{empty-state-DuauqtRJ.js → empty-state-lGlHfKio.js} +1 -1
- package/dist/client/assets/{extract-connection-data-DQ0ThsQw.js → extract-connection-data-rmLW_gvu.js} +1 -1
- package/dist/client/assets/{feature-gate-DGH8G4ta.js → feature-gate-C3ALU4KU.js} +1 -1
- package/dist/client/assets/{feature-paywall-Cdd2Shxl.js → feature-paywall-AtCK-SZi.js} +1 -1
- package/dist/client/assets/{file-explorer-DPT-Gdf2.js → file-explorer-CXoqHKQi.js} +1 -1
- package/dist/client/assets/{file-preview-wTY5J2MC.js → file-preview-D3qj3-ZX.js} +1 -1
- package/dist/client/assets/{file-share-button-D4Hp3Pwr.js → file-share-button-v1acUQhc.js} +1 -1
- package/dist/client/assets/{file-type-icon-7-3yF331.js → file-type-icon-Cw2ugH1T.js} +1 -1
- package/dist/client/assets/flat-project-C-qoLMQo.js +1 -0
- package/dist/client/assets/{folder-icon-H82laJL_.js → folder-icon-BRkty9N7.js} +1 -1
- package/dist/client/assets/{form-BUOiUceD.js → form-Ce4lrl07.js} +1 -1
- package/dist/client/assets/{general-BHuT0FSK.js → general-BoFQ5PDD.js} +1 -1
- package/dist/client/assets/{home-BZZrU9O7.js → home-DBwVydAm.js} +1 -1
- package/dist/client/assets/{icon-button-DMzM4KWP.js → icon-button-BzCBL3cR.js} +1 -1
- package/dist/client/assets/{index-eP3gZugt.js → index-2xZGo1OZ.js} +1 -1
- package/dist/client/assets/{index-V8pRA7Xy.js → index-AwfdJWsb.js} +5 -5
- package/dist/client/assets/{index-CvkEcM9-.js → index-BJTeBjsQ.js} +1 -1
- package/dist/client/assets/{index-CerQwuGf.js → index-BjUlsUMg.js} +1 -1
- package/dist/client/assets/{index-PaA2bHVT.js → index-BzVl4964.js} +1 -1
- package/dist/client/assets/{index-gHDeYn5U.js → index-C7aH47aJ.js} +1 -1
- package/dist/client/assets/{index-D5kx2mq6.js → index-COZCf2PU.js} +1 -1
- package/dist/client/assets/{index-D_C9gk4l.js → index-CwyPrlmP.js} +1 -1
- package/dist/client/assets/{index-DIbARVXx.js → index-D7Q80Ibd.js} +3 -3
- package/dist/client/assets/{index-x-BjYR-J.js → index-DEPeya4x.js} +1 -1
- package/dist/client/assets/{index-BmBVOCXW.js → index-DI6dvB42.js} +1 -1
- package/dist/client/assets/{index-BVCIU8Mk.js → index-DkUf25py.js} +1 -1
- package/dist/client/assets/{index-redirect-6gCqz6Y5.js → index-redirect-3-u4Q02Y.js} +1 -1
- package/dist/client/assets/{index-D_aXURjc.js → index-xJHUGJmd.js} +1 -1
- package/dist/client/assets/{infiniteQueryObserver-Bni-1Rrc.js → infiniteQueryObserver-BoYQIhRm.js} +1 -1
- package/dist/client/assets/{infra-billing-hHO33Bt1.js → infra-billing-DRk7Hgam.js} +1 -1
- package/dist/client/assets/{input-ynU6Ij5H.js → input-BJm-bJdI.js} +3 -3
- package/dist/client/assets/{input-C7fKNsaf.js → input-C-7hE1b2.js} +1 -1
- package/dist/client/assets/{integration-icon-D-qpZQt8.js → integration-icon-WQ1MJmJE.js} +1 -1
- package/dist/client/assets/{jira-icon-B4wDBFAC.js → jira-icon-w0P2pjzT.js} +1 -1
- package/dist/client/assets/{label-3hwvsVXP.js → label-BEIrQZc-.js} +1 -1
- package/dist/client/assets/{layout-DHC2Bj1E.js → layout-pNLUGjKH.js} +1 -1
- package/dist/client/assets/{legacy-agents-deep-BSzJqFgZ.js → legacy-agents-deep-DQLIe0rx.js} +1 -1
- package/dist/client/assets/{legacy-main-redirect-R36lgGCg.js → legacy-main-redirect-DDC0imIe.js} +1 -1
- package/dist/client/assets/library-C6afhHWm.js +1 -0
- package/dist/client/assets/{library-tab-DiWbCdAf.js → library-tab-DIJB0pOD.js} +1 -1
- package/dist/client/assets/{login-BPcnReJQ.js → login-Blmg5PpX.js} +1 -1
- package/dist/client/assets/{markdown-C_bpsjlQ.js → markdown-C_1El3UD.js} +1 -1
- package/dist/client/assets/{mcp-app-renderer-DSXHJ5Wt.js → mcp-app-renderer-B9dOa3ev.js} +1 -1
- package/dist/client/assets/{mcp-oauth-7pqu8EiB.js → mcp-oauth-D1ywKFbc.js} +1 -1
- package/dist/client/assets/{mcp-oauth-DLnUq2f9.js → mcp-oauth-IPmD_N5m.js} +1 -1
- package/dist/client/assets/{members-Bunz7e6B.js → members-DkW4wjLL.js} +1 -1
- package/dist/client/assets/{memory-BLa9O78J.js → memory-pQ7XA0lM.js} +1 -1
- package/dist/client/assets/{mini-report-page-BVO6pALW.js → mini-report-page-B6fFtRpy.js} +1 -1
- package/dist/client/assets/{mock-board-B5k1LNJu.js → mock-board-wk6TYt7w.js} +1 -1
- package/dist/client/assets/{monaco-editor-DMfRj7kt.js → monaco-editor-D3D0ilFy.js} +1 -1
- package/dist/client/assets/{monitoring-stats-row-Bkq-86wh.js → monitoring-stats-row-CG8CcLbD.js} +1 -1
- package/dist/client/assets/{multi-select-BwXBmTlI.js → multi-select-zXW_B1rE.js} +1 -1
- package/dist/client/assets/{mustache-CEXj2Yiz.js → mustache-Fgl0g-Er.js} +1 -1
- package/dist/client/assets/{new-project-dialog-BZdoOBOz.js → new-project-dialog-CDF0Rsm8.js} +1 -1
- package/dist/client/assets/{oauth-callback-z1ZK2Q1I.js → oauth-callback-Dfc-046A.js} +1 -1
- package/dist/client/assets/{oauth-callback-ai-provider-CbuzeLlJ.js → oauth-callback-ai-provider-CR3Sx1WR.js} +1 -1
- package/dist/client/assets/{onboarding-BGszMdtv.js → onboarding-Fj_h1pZF.js} +1 -1
- package/dist/client/assets/{openai-conversation-B5OySV1i.js → openai-conversation-ZCiR-nel.js} +1 -1
- package/dist/client/assets/{optimistic-project-sidebar-views-C2x-Aaxu.js → optimistic-project-sidebar-views-gdyjY474.js} +1 -1
- package/dist/client/assets/{organization-choice-xhN7Yznf.js → organization-choice-C6SRJ7u5.js} +1 -1
- package/dist/client/assets/{orgs-CEeF7hFm.js → orgs-COfkZLkX.js} +1 -1
- package/dist/client/assets/{page-seo-form-J-VUwESz.js → page-seo-form-COwmjwMF.js} +1 -1
- package/dist/client/assets/{pair-Dha2uqa_.js → pair-DH8DyC8q.js} +1 -1
- package/dist/client/assets/{plan-ladder-BNRju_Rr.js → plan-ladder-BiocTbbz.js} +1 -1
- package/dist/client/assets/{popover-CZB8RxoJ.js → popover-qqnMuKN1.js} +1 -1
- package/dist/client/assets/post-calendar-BkJyfSYh.js +1 -0
- package/dist/client/assets/{post-editor-BBmmo40q.js → post-editor-CYX-gw_e.js} +2 -2
- package/dist/client/assets/{preview-content-DCZG-NtD.js → preview-content-wDBnyIay.js} +1 -1
- package/dist/client/assets/{preview-dialog-DZmQ4_OU.js → preview-dialog-CZ8zzX0u.js} +1 -1
- package/dist/client/assets/{preview-panel-BOJOfHU6.js → preview-panel-Ck3MEGJq.js} +1 -1
- package/dist/client/assets/{product-picker-dialog-BRcRXNTc.js → product-picker-dialog-DdC0pd1-.js} +1 -1
- package/dist/client/assets/{profile-CtDXcfuO.js → profile-D0Plzjli.js} +1 -1
- package/dist/client/assets/{project-app-view-Cnchb-Ig.js → project-app-view-BGndj_I_.js} +1 -1
- package/dist/client/assets/{project-feed-Ctubs6D8.js → project-feed-DaaaTGHC.js} +1 -1
- package/dist/client/assets/{project-icon-DXev8VIW.js → project-icon-B-WU0_0D.js} +1 -1
- package/dist/client/assets/project-reports-We-E3RnV.js +1 -0
- package/dist/client/assets/project-tasks-DEpXI9YC.js +1 -0
- package/dist/client/assets/{projects-empty-state-Bkvn9wBz.js → projects-empty-state-DW2UrEaZ.js} +1 -1
- package/dist/client/assets/{projects-DfF5wpqY.js → projects-ok5J9tL9.js} +1 -1
- package/dist/client/assets/{prompts-JCRZXZfZ.js → prompts-CNAdfpQM.js} +1 -1
- package/dist/client/assets/record-editor-p5Q3f0yi.js +1 -0
- package/dist/client/assets/redirect-editor-CtcJbNoE.js +1 -0
- package/dist/client/assets/reports-CNpDrbV0.js +1 -0
- package/dist/client/assets/{reports-BiB14-w5.js → reports-CzOE1tR3.js} +1 -1
- package/dist/client/assets/{reports-onboarding-Ci2eFzgb.js → reports-onboarding-BmEr1mIf.js} +1 -1
- package/dist/client/assets/{reports-tab-CfLfXENf.js → reports-tab-DKCT0JIU.js} +2 -2
- package/dist/client/assets/{repositories-Ddu7D_dm.js → repositories-CQq6WnJq.js} +1 -1
- package/dist/client/assets/{repository-binding-CGM8Ow1W.js → repository-binding-BNg5TQOZ.js} +1 -1
- package/dist/client/assets/{repository-import-picker-DpjUG5YI.js → repository-import-picker-CcMvghJ5.js} +1 -1
- package/dist/client/assets/{repository-picker-XHsJQrRg.js → repository-picker-SvnnQoi6.js} +1 -1
- package/dist/client/assets/{require-capability-D5tJwX6A.js → require-capability-DlJRrlRZ.js} +1 -1
- package/dist/client/assets/{required-auth-layout-BKYCK4WE.js → required-auth-layout-CDNeII8u.js} +1 -1
- package/dist/client/assets/{reset-password-BDIEd0mg.js → reset-password-Dbn4jIkW.js} +1 -1
- package/dist/client/assets/{resizable-DBUNvXp7.js → resizable-CZ4aTSlX.js} +1 -1
- package/dist/client/assets/{resolve-tab-icon-C3-zJZHp.js → resolve-tab-icon-CXK_bXUY.js} +1 -1
- package/dist/client/assets/{review-settings-iKeIZIxh.js → review-settings-BDPAXKXb.js} +1 -1
- package/dist/client/assets/{rich-text-link-control-B-mX9xD1.js → rich-text-link-control-ClVdMqVI.js} +1 -1
- package/dist/client/assets/{roles-B4ZkD532.js → roles-DOI1mfYR.js} +1 -1
- package/dist/client/assets/{route-Dbrk4VYq.js → route-CKk6J4lQ.js} +1 -1
- package/dist/client/assets/{route-lCR_XMKF.js → route-C_x1XS5V.js} +1 -1
- package/dist/client/assets/route-D9aStTQZ.js +1 -0
- package/dist/client/assets/runnable-block-editor-DxlrjseU.js +17 -0
- package/dist/client/assets/{sandbox-lifecycle-context-BrrAiqEe.js → sandbox-lifecycle-context-CDjLFL25.js} +1 -1
- package/dist/client/assets/{schema-DstuA0HH.js → schema-C3CtA8cz.js} +1 -1
- package/dist/client/assets/{scroll-area-NCHj5pvE.js → scroll-area-BJzbQI7x.js} +1 -1
- package/dist/client/assets/{search-input-CdXxg7YI.js → search-input-CWqVQgLT.js} +1 -1
- package/dist/client/assets/{search-toggle-BepIBc_s.js → search-toggle-CZJ34jiu.js} +1 -1
- package/dist/client/assets/{secret-picker-C6OYpb8W.js → secret-picker-fggAfKvz.js} +1 -1
- package/dist/client/assets/{secrets-CZl02iRQ.js → secrets-aGD7EHkw.js} +1 -1
- package/dist/client/assets/sections-editor-d3ZH3NnB.js +1 -0
- package/dist/client/assets/{select-XceA90ql.js → select-6ljk5DPS.js} +1 -1
- package/dist/client/assets/{select-model-Cn7hOiT6.js → select-model-BKzRZEfy.js} +1 -1
- package/dist/client/assets/seo-editor-cv3-M4dT.js +1 -0
- package/dist/client/assets/{separator-BTLDrzUc.js → separator-BJL1NbSA.js} +1 -1
- package/dist/client/assets/{settings-tab-BqJQ3uPx.js → settings-tab-BAGW7JQB.js} +1 -1
- package/dist/client/assets/{sheet-wemU-aZ9.js → sheet-CiBJ72wj.js} +1 -1
- package/dist/client/assets/{shell-layout-C7bQvu8M.js → shell-layout-CGcdMFur.js} +1 -1
- package/dist/client/assets/{skills-BqpJ6duC.js → skills-DRGboJI3.js} +1 -1
- package/dist/client/assets/{slider-INBQ4Ci_.js → slider-Dx78M_Dr.js} +1 -1
- package/dist/client/assets/{sortable.esm-jUEYWtPl.js → sortable.esm--kYjBfXA.js} +1 -1
- package/dist/client/assets/{sso-D804RM9B.js → sso-BbuCPd_C.js} +1 -1
- package/dist/client/assets/{suggestion-DIwPOBWx.js → suggestion-53Llg-e1.js} +1 -1
- package/dist/client/assets/{switch-J8K3vNdb.js → switch-nJdDORbC.js} +1 -1
- package/dist/client/assets/{symbol-lUKWgdXD.js → symbol-DPWCgLFf.js} +1 -1
- package/dist/client/assets/{synced-repos-gT4FkxhN.js → synced-repos-63wThZ7a.js} +1 -1
- package/dist/client/assets/{tab-icon-glyph-DF33b7XO.js → tab-icon-glyph-C1TUieB9.js} +1 -1
- package/dist/client/assets/{table-Bgls4vq9.js → table-DRoBPaFJ.js} +1 -1
- package/dist/client/assets/{tabs-Duy7ODee.js → tabs-DDxLPvSM.js} +1 -1
- package/dist/client/assets/{task-board-DPQxW0jP.js → task-board-BWigQAz0.js} +1 -1
- package/dist/client/assets/{task-route-BQDNl_5C.js → task-route-BAXJnQiB.js} +1 -1
- package/dist/client/assets/{task-status-BGLLtgDf.js → task-status-HT2A-rBc.js} +1 -1
- package/dist/client/assets/taskboard-analytics-D34967tP.js +1 -0
- package/dist/client/assets/tasks-C199SCss.js +1 -0
- package/dist/client/assets/{tasks-IL-LS75-.js → tasks-qzLf1kZw.js} +1 -1
- package/dist/client/assets/{textarea-NyzjT40N.js → textarea-BemV8MtB.js} +1 -1
- package/dist/client/assets/{thread-analytics-CtoXhN32.js → thread-analytics-xCoRSlkG.js} +1 -1
- package/dist/client/assets/{thread-button-BdG_noMn.js → thread-button-D7_O34uV.js} +1 -1
- package/dist/client/assets/{thread-intent-k2Km9Dmr.js → thread-intent-DWaXIzM6.js} +1 -1
- package/dist/client/assets/{thread-route-Cx-o2xCf.js → thread-route-BrqTE6Me.js} +1 -1
- package/dist/client/assets/{thread-route-DbJLUn3d.js → thread-route-kfygoR33.js} +1 -1
- package/dist/client/assets/{thread-sheet-body-_3hMbQ_o.js → thread-sheet-body-CN1lXMVz.js} +1 -1
- package/dist/client/assets/{time-range-picker-CH7-gioV.js → time-range-picker-C761CjtW.js} +1 -1
- package/dist/client/assets/{toggle-group-m6bc6yjp.js → toggle-group-NJ6o2Ub6.js} +1 -1
- package/dist/client/assets/{tool-namespace-CPm912_s.js → tool-namespace-D4Qkj0Hw.js} +1 -1
- package/dist/client/assets/{toolbar-icon-button-BxO5B0Sy.js → toolbar-icon-button-zP-xIu_D.js} +1 -1
- package/dist/client/assets/{tooltip-C2m8ePE-.js → tooltip-a0H1qyBK.js} +1 -1
- package/dist/client/assets/{tooltipContext-CxUJkkTI.js → tooltipContext-B3CTU34j.js} +1 -1
- package/dist/client/assets/{track-C5Z44Ul6.js → track-CS4z8T1x.js} +1 -1
- package/dist/client/assets/{types-ZqGSA7tu.js → types-Bx_rltIM.js} +1 -1
- package/dist/client/assets/{url-slug-DEN8nCcZ.js → url-slug-CDmaNVX6.js} +1 -1
- package/dist/client/assets/{usage-stats-Dn2OeFoS.js → usage-stats-AcDv8Dsz.js} +1 -1
- package/dist/client/assets/{use-ai-providers-jw2MMLa5.js → use-ai-providers-zmp15jyt.js} +1 -1
- package/dist/client/assets/{use-automations-D20-ruPj.js → use-automations-BZM3cLj4.js} +1 -1
- package/dist/client/assets/{use-autosave-BYt2BXBs.js → use-autosave-B0YK0x6h.js} +1 -1
- package/dist/client/assets/{use-chat-layout-state-WRaaYm0y.js → use-chat-layout-state-Bcmu5rP3.js} +1 -1
- package/dist/client/assets/{use-chat-navigation-FGqN2bea.js → use-chat-navigation-Cc_f0d0S.js} +1 -1
- package/dist/client/assets/{use-clock-tick-DWBHoA2Q.js → use-clock-tick-AzE8VO15.js} +1 -1
- package/dist/client/assets/{use-connect-companion-m9MlzSIA.js → use-connect-companion-8hS3GtOc.js} +1 -1
- package/dist/client/assets/{use-connection-B2P9vQF_.js → use-connection-CI8uhNVS.js} +1 -1
- package/dist/client/assets/{use-copy-Cu3Byc8S.js → use-copy-CQYz3fr0.js} +1 -1
- package/dist/client/assets/{use-create-virtual-mcp-C8rAImjt.js → use-create-virtual-mcp-DHX0--iP.js} +1 -1
- package/dist/client/assets/{use-date-fns-locale-Beq3354R.js → use-date-fns-locale-9fXcEdhO.js} +1 -1
- package/dist/client/assets/{use-debounced-autosave-DrUzoxBu.js → use-debounced-autosave-DHqky-9Q.js} +1 -1
- package/dist/client/assets/{use-debounced-value-SDDhu8Id.js → use-debounced-value-CeEbKwrV.js} +1 -1
- package/dist/client/assets/{use-deco-credits-sdJPRntH.js → use-deco-credits-BC6kbiHd.js} +1 -1
- package/dist/client/assets/{use-decopilot-events-CvdvLxq8.js → use-decopilot-events-Dd86Tcia.js} +1 -1
- package/dist/client/assets/{use-delete-connection-BOHbZqa4.js → use-delete-connection-DVwUwOIY.js} +1 -1
- package/dist/client/assets/{use-deployment-admin-C-HUVf8B.js → use-deployment-admin-DAj-k6S1.js} +1 -1
- package/dist/client/assets/{use-ensure-project-folder-BS99-Vhk.js → use-ensure-project-folder-DmmxnF8g.js} +1 -1
- package/dist/client/assets/{use-fast-preview-draft-url-C5x2lifG.js → use-fast-preview-draft-url-BiKkW-Ju.js} +1 -1
- package/dist/client/assets/{use-file-configs-CfW92ECv.js → use-file-configs-CyNbQHOb.js} +1 -1
- package/dist/client/assets/{use-infinite-scroll-lPN0NCUm.js → use-infinite-scroll-DvyXq-Gj.js} +1 -1
- package/dist/client/assets/{use-join-requests-ChCzkc7_.js → use-join-requests-Dt-0BSi5.js} +1 -1
- package/dist/client/assets/{use-main-panel-tabs-Dsv5nepq.js → use-main-panel-tabs-B_s-ZlV6.js} +1 -1
- package/dist/client/assets/{use-mcp-auth-status-DRKL-P8f.js → use-mcp-auth-status-D873xSfO.js} +1 -1
- package/dist/client/assets/{use-mcp-client-CqsBL7uD.js → use-mcp-client-G9kTaeLN.js} +1 -1
- package/dist/client/assets/{use-mcp-prompts-1ZUYIWAu.js → use-mcp-prompts-TIlwVbKk.js} +1 -1
- package/dist/client/assets/{use-mcp-tools-D_yHtzDx.js → use-mcp-tools-Y4CsChTF.js} +1 -1
- package/dist/client/assets/{use-members-BTcdjICA.js → use-members-G69DqUHv.js} +1 -1
- package/dist/client/assets/{use-mobile-D2A_YY4A.js → use-mobile-lU_VA-Wz.js} +1 -1
- package/dist/client/assets/{use-navigate-to-agent-RUWGGNCj.js → use-navigate-to-agent-C6i1wdll.js} +1 -1
- package/dist/client/assets/use-new-blocks-editor-CI1Vo0BF.js +1 -0
- package/dist/client/assets/{use-open-billing-url-tDUbFoyb.js → use-open-billing-url-D2RlzIda.js} +1 -1
- package/dist/client/assets/{use-org-auth-client-qz-rdd-6.js → use-org-auth-client-qcwb5Xwg.js} +1 -1
- package/dist/client/assets/{use-org-fs-Bpw1hkjS.js → use-org-fs-r_UASbiH.js} +1 -1
- package/dist/client/assets/{use-org-repo-syncs-Dgz3AX_E.js → use-org-repo-syncs-CXCL1qVI.js} +1 -1
- package/dist/client/assets/{use-org-sso-FN6Hp6_O.js → use-org-sso-CMW8M6X6.js} +1 -1
- package/dist/client/assets/{use-organization-roles-lOM-6Cks.js → use-organization-roles-BrmyYVth.js} +1 -1
- package/dist/client/assets/{use-organization-settings-CvwbmZME.js → use-organization-settings-X0pPEcR2.js} +1 -1
- package/dist/client/assets/{use-panel-navigate-BcP-4Jk4.js → use-panel-navigate-CoagQzmq.js} +1 -1
- package/dist/client/assets/{use-project-scope-Ds7ag806.js → use-project-scope-DfhWNvXs.js} +1 -1
- package/dist/client/assets/{use-releases-DedSt3np.js → use-releases-NV2VbJG3.js} +1 -1
- package/dist/client/assets/{use-reports-diagnostic-CO2atgBG.js → use-reports-diagnostic-6rpu_ggR.js} +1 -1
- package/dist/client/assets/{use-sandbox-events-Cqb_Ym4F.js → use-sandbox-events-BMDgKkRX.js} +1 -1
- package/dist/client/assets/{use-secrets-BjvGVY7t.js → use-secrets-DHJQDVTM.js} +1 -1
- package/dist/client/assets/{use-section-preview-base-CoG0-wMI.js → use-section-preview-base-BV9hqpLn.js} +1 -1
- package/dist/client/assets/{use-tags-ja0CaL2g.js → use-tags-BJ2Hh6BN.js} +1 -1
- package/dist/client/assets/{use-task-board-analytics-Dx24ixKr.js → use-task-board-analytics-BCuCs7sP.js} +1 -1
- package/dist/client/assets/{use-task-board-events-CZieAk2g.js → use-task-board-events-UhXVQ3a7.js} +1 -1
- package/dist/client/assets/{use-task-board-item-prs-C_5W7zcg.js → use-task-board-item-prs-DFJZfuP4.js} +1 -1
- package/dist/client/assets/{use-task-board-items-CkoW6-bn.js → use-task-board-items-jZeevl5p.js} +1 -1
- package/dist/client/assets/{use-task-metadata-C-eJemLF.js → use-task-metadata-CU_uNdjx.js} +1 -1
- package/dist/client/assets/{use-thread-analytics-B8zFfdhr.js → use-thread-analytics-8O_JAIrn.js} +1 -1
- package/dist/client/assets/{use-thread-outputs-CHIrdXyI.js → use-thread-outputs-CLewPMZ8.js} +1 -1
- package/dist/client/assets/useInfiniteQuery-K_CnrRFE.js +1 -0
- package/dist/client/assets/{useQueries-Dpxh6EqM.js → useQueries-BZgifabX.js} +1 -1
- package/dist/client/assets/useSuspenseInfiniteQuery-CstC5ADZ.js +1 -0
- package/dist/client/assets/{users-xDH1jmUT.js → users-rimZAqXM.js} +1 -1
- package/dist/client/assets/{utils-BBHV2kqf.js → utils-C3P6RRqb.js} +1 -1
- package/dist/client/assets/{variant-calendar-BJGksOpn.js → variant-calendar-1RNKsmjA.js} +1 -1
- package/dist/client/assets/{variant-matcher-override-3KgTJsm9.js → variant-matcher-override-BybutIRM.js} +1 -1
- package/dist/client/assets/{view-mode-toggle-5lUXeBq8.js → view-mode-toggle-C5yHwVoW.js} +1 -1
- package/dist/client/assets/{virtual-mcp-CKveTc8W.js → virtual-mcp-B1D6GXag.js} +1 -1
- package/dist/client/assets/{watch-sse-pool-SMEeDp6D.js → watch-sse-pool-Binkw30f.js} +1 -1
- package/dist/client/index.html +1 -1
- package/dist/server/server.js +3 -3
- package/package.json +1 -1
- package/dist/client/assets/agent-app-DtmEOrmX.js +0 -1
- package/dist/client/assets/agent-deck--kR-tnhH.js +0 -1
- package/dist/client/assets/agent-library-CGtmUhYD.js +0 -1
- package/dist/client/assets/agent-library-file-CZlCJsi6.js +0 -1
- package/dist/client/assets/agent-settings-_tzBjLDX.js +0 -1
- package/dist/client/assets/agent-site-editor-code-DA20Pk7L.js +0 -2
- package/dist/client/assets/agent-view-CgtvUhvS.js +0 -1
- package/dist/client/assets/api-keys-DXlZlPNT.js +0 -1
- package/dist/client/assets/app-editor-BlHRP4Rp.js +0 -1
- package/dist/client/assets/category-editor-B9myg9lh.js +0 -1
- package/dist/client/assets/context-DgLSgDvh.js +0 -1
- package/dist/client/assets/flat-project-CNnQaq5E.js +0 -1
- package/dist/client/assets/library-BfEEZWGX.js +0 -1
- package/dist/client/assets/post-calendar-CfLX9e_7.js +0 -1
- package/dist/client/assets/project-reports-Ci_iYRrd.js +0 -1
- package/dist/client/assets/project-tasks-CzZdSRDI.js +0 -1
- package/dist/client/assets/record-editor-BmUK9heP.js +0 -1
- package/dist/client/assets/redirect-editor-DARWO6oY.js +0 -1
- package/dist/client/assets/reports-CJkqLIIg.js +0 -1
- package/dist/client/assets/route-DmXxzobK.js +0 -1
- package/dist/client/assets/runnable-block-editor-aENhZJE9.js +0 -17
- package/dist/client/assets/sections-editor-C91NghHX.js +0 -1
- package/dist/client/assets/seo-editor-BFWV0Cx1.js +0 -1
- package/dist/client/assets/taskboard-analytics-2fBMPAxC.js +0 -1
- package/dist/client/assets/tasks-CqyFd60l.js +0 -1
- package/dist/client/assets/use-new-blocks-editor-APcQuu-Z.js +0 -1
- package/dist/client/assets/useInfiniteQuery-Cyz1DFAa.js +0 -1
- package/dist/client/assets/useSuspenseInfiniteQuery-B0qRbG8m.js +0 -1
package/dist/server/server.js
CHANGED
|
@@ -947,7 +947,7 @@ ${j$}`,...K$[B9].promptCacheBreakpoint!=null&&{prompt_cache_breakpoint:K$[B9].pr
|
|
|
947
947
|
${H.description??""}`,D=J.get(B);if(D){D.connections.push(G),D.score=Math.max(D.score,N);continue}J.set(B,{name:H.name,description:(H.description??"").slice(0,Gf4),...Y?{inputSchema:H.inputSchema}:{},connections:[G],score:N})}}return[...J.values()].sort((G,W)=>W.score-G.score).slice(0,Q)}var Jf4=8,Gf4=400,Gj$=262144,i61,p61;var Hj$=L(()=>{q0();IT();FJ();i61=h({name:"CONNECTION_TOOLS_SEARCH",description:"Search the tools of every connection you can use (GitHub, Slack, VTEX, Linear, ...) by keywords. Returns tool names, descriptions and the connections that offer them. Set withSchema to get the input schema before calling one with CONNECTION_TOOL_CALL.",annotations:{title:"Search Connection Tools",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:T9.object({query:T9.string().min(1).describe("Keywords, e.g. 'github pull request search'"),limit:T9.number().int().min(1).max(25).default(8),withSchema:T9.boolean().default(!1).describe("Include each tool's input schema")}),outputSchema:T9.object({tools:T9.array(T9.object({name:T9.string(),description:T9.string(),inputSchema:T9.unknown().optional(),connections:T9.array(T9.object({id:T9.string(),title:T9.string()}))}))}),handler:async($,Z)=>{let Q=Y0(Z);await Z.access.check();let Y=await Kj$(Z,Q.id),X=[];return await gj(Y,Jf4,async(G)=>{X.push({connection:{id:G.id,title:G.title},tools:await Wf4(Z,G)})}),{tools:Kf4($.query,X,$.limit,$.withSchema).map(({score:G,...W})=>W)}}}),p61=h({name:"CONNECTION_TOOL_CALL",description:"Call a tool on one of your connections. Find the tool, its connection id and its input schema with CONNECTION_TOOLS_SEARCH first.",annotations:{title:"Call Connection Tool",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!1,openWorldHint:!0},inputSchema:T9.object({connectionId:T9.string(),toolName:T9.string(),arguments:T9.record(T9.string(),T9.unknown()).default({}).refine(($)=>new TextEncoder().encode(JSON.stringify($)).byteLength<=Gj$,{message:`arguments exceeds ${Gj$} bytes`})}),outputSchema:T9.object({content:T9.array(T9.unknown()),structuredContent:T9.unknown().optional(),isError:T9.boolean().optional()}),handler:async($,Z)=>{let Q=Y0(Z);await Z.access.check();let Y=(await Kj$(Z,Q.id)).find((G)=>G.id===$.connectionId);if(!Y)throw Error(`Connection not found: ${$.connectionId}`);let J=await(await HJ(Y,Z,!1)).callTool({name:$.toolName,arguments:$.arguments});return{content:Array.isArray(J.content)?J.content:[],...J.structuredContent!==void 0?{structuredContent:J.structuredContent}:{},...typeof J.isError==="boolean"?{isError:J.isError}:{}}}})});var Fj$=L(()=>{rO$();k61();S61();Qj$();Yj$();Jj$();Hj$()});import{sql as R6}from"kysely";import{z as DN}from"zod";function Uj$($){if($===null||$===void 0)return"NULL";if(typeof $==="number")return String($);if(typeof $==="boolean")return $?"TRUE":"FALSE";if(typeof $==="string")return`'${$.replace(/'/g,"''")}'`;if($ instanceof Date)return`'${$.toISOString()}'`;return`'${JSON.stringify($).replace(/'/g,"''")}'`}function Uf4($,Z){let Q="",Y=0,X=!1,J=!1,G=!1,W=null;for(let K=0;K<$.length;K++){let H=$[K];if(!X&&!J&&W===null){if($.startsWith("--",K)){let F=$.indexOf(`
|
|
948
948
|
`,K),U=F===-1?$.slice(K):$.slice(K,F);Q+=U,K+=U.length-1;continue}if($.startsWith("/*",K)){let F=1,U=K+2;while(F>0&&U<$.length)if($.startsWith("/*",U))F++,U+=2;else if($.startsWith("*/",U))F--,U+=2;else U++;let N=$.slice(K,U);Q+=N,K+=N.length-1;continue}}if(W!==null){let F=`$${W}$`;if($.startsWith(F,K))Q+=F,K+=F.length-1,W=null;else Q+=H;continue}if(X&&G&&H==="\\"&&K+1<$.length){Q+=H+$[K+1],K+=1;continue}if(!J&&H==="'"){if(!X){let F=$[K-1],U=$[K-2]??"";G=(F==="e"||F==="E")&&!/[A-Za-z0-9_]/.test(U)}X=!X,Q+=H;continue}if(!X&&H==='"'){J=!J,Q+=H;continue}if(!X&&!J&&H==="$"){let F=/^\$(\d+)/.exec($.slice(K)),U=F?Number(F[1])-1:-1;if(F&&U>=0&&U<Z.length){Q+=Uj$(Z[U]),K+=F[0].length-1;continue}let N=/^\$([A-Za-z_][A-Za-z0-9_]*)?\$/.exec($.slice(K));if(N){W=N[1]??"",Q+=N[0],K+=N[0].length-1;continue}}else if(!X&&!J&&H==="?"&&Y<Z.length){Q+=Uj$(Z[Y]),Y++;continue}Q+=H}return Q}function Nj$($){return $.replace(/-/g,"_")}function Bf4($){return`app_${Nj$($)}`}function Df4($){return`app_role_${Nj$($)}`}function Lf4($){if($ instanceof Error){let Z=$.message.toLowerCase(),Q=$.code;return Q==="3F000"||Q==="42704"||Q==="22023"||Z.includes("schema")&&Z.includes("does not exist")||Z.includes("role")&&Z.includes("does not exist")}return!1}async function Of4($,Z,Q){if(await R6`CREATE SCHEMA IF NOT EXISTS ${R6.id(Z)}`.execute($),!(await R6`
|
|
949
949
|
SELECT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = ${Q}) as exists
|
|
950
|
-
`.execute($)).rows[0]?.exists)await R6`CREATE ROLE ${R6.id(Q)} NOLOGIN`.execute($);await R6`GRANT ${R6.id(Q)} TO CURRENT_USER`.execute($),await R6`GRANT USAGE, CREATE ON SCHEMA ${R6.id(Z)} TO ${R6.id(Q)}`.execute($),await R6`GRANT ALL ON ALL TABLES IN SCHEMA ${R6.id(Z)} TO ${R6.id(Q)}`.execute($),await R6`GRANT ALL ON ALL SEQUENCES IN SCHEMA ${R6.id(Z)} TO ${R6.id(Q)}`.execute($),await R6`ALTER DEFAULT PRIVILEGES IN SCHEMA ${R6.id(Z)} GRANT ALL ON TABLES TO ${R6.id(Q)}`.execute($),await R6`ALTER DEFAULT PRIVILEGES IN SCHEMA ${R6.id(Z)} GRANT ALL ON SEQUENCES TO ${R6.id(Q)}`.execute($),await R6`REVOKE ALL ON SCHEMA public FROM ${R6.id(Q)}`.execute($)}async function wf4($,Z,Q,Y){try{return await $.transaction().execute(async(X)=>{return await R6`SET LOCAL ROLE ${R6.id(Q)}`.execute(X),await R6`SET LOCAL search_path TO ${R6.id(Z)}`.execute(X),await R6.raw(Y).execute(X)})}catch(X){if(Lf4(X))return await Of4($,Z,Q),await $.transaction().execute(async(J)=>{return await R6`SET LOCAL ROLE ${R6.id(Q)}`.execute(J),await R6`SET LOCAL search_path TO ${R6.id(Z)}`.execute(J),await R6.raw(Y).execute(J)});throw X}}var Ff4,Nf4,Bj$;var Dj$=L(()=>{q0();Ff4=DN.object({results:DN.array(DN.unknown()).optional(),success:DN.boolean().optional()});Nf4=DN.object({sql:DN.string().describe("The SQL query to run"),params:DN.array(DN.unknown()).describe("The parameters to pass to the SQL query").optional()});Bj$=h({name:"DATABASES_RUN_SQL",description:"Run a SQL query in a connection-scoped isolated schema. Supports SELECT, DDL, and DML.",annotations:{title:"Run SQL Query",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!1,openWorldHint:!1},inputSchema:Nf4,outputSchema:DN.object({result:DN.array(Ff4)}),handler:async($,Z)=>{p(Z),await Z.access.check();let Q=Uf4($.sql,$.params||[]);if(!Z.connectionId)throw Error("Connection context required for database access");console.warn("DATABASES_RUN_SQL invoked",{"tool.deprecation_probe":"DATABASES_RUN_SQL","connection.id":Z.connectionId,"organization.id":Z.organization?.id??null,"user.id":Z.auth.user?.id??null});let Y=Bf4(Z.connectionId),X=Df4(Z.connectionId);return{result:[{results:(await wf4(Z.db,Y,X,Q)).rows,success:!0}]}}})});function $U0($){let Z=$.access.getRole();if(!TZ(Z))throw new B5("Only organization owners and admins can change org-wide pin status")}var n61=L(()=>{lY();nX()});async function ZU0($,Z,Q){let Y=[...new Set(Q)],X=await Promise.all(Y.map((G)=>$.storage.connections.findById(G,Z))),J=Y.filter((G,W)=>!X[W]);if(J.length>0)throw Error(`Connection not found: ${J.join(", ")}`)}function ZL($){return $.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")}function QU0($){let Z=2166136261;for(let Q=0;Q<$.length;Q++)Z=Math.imul(Z^$.charCodeAt(Q),16777619);return`a${(Z>>>0).toString(36).padStart(6,"0").slice(-6)}`}function YU0($){if($&&typeof $==="object"&&"gatewayClientId"in $&&typeof $.gatewayClientId==="string")return $.gatewayClientId;return}function XU0($,Z){if(!Z)return $;let Q=`${QU0(Z)}_`;return $.startsWith(Q)?$.slice(Q.length):$}function Ef4($){return $.split(/[-_]/).map((Z)=>Z?Z.charAt(0).toUpperCase()+Z.slice(1):Z).join(" ")}function Pf4($,Z,Q){let Y,X=new Promise((J,G)=>{Y=setTimeout(()=>G(Error(Q)),Z)});return Promise.race([$,X]).finally(()=>clearTimeout(Y))}var xT;var Lj$=L(()=>{IU();xT=class xT extends N7{static MAX_PAGES_PER_CLIENT=1000;static DEFAULT_LIST_TIMEOUT_MS=30000;clients;slugToKey=new Map;resolvedClients=new Map;toolsCache=null;resourcesCache=null;resourceTemplatesCache=null;promptsCache=null;resourceRouteMap=new Map;listTimeoutMs;constructor($,Z){super(Z?.clientInfo??{name:"gateway-client",version:"1.0.0"},{capabilities:Z?.capabilities});this.clients=$,this.listTimeoutMs=Z?.listTimeoutMs??xT.DEFAULT_LIST_TIMEOUT_MS;for(let Q of Object.keys($)){let Y=QU0(Q);if(this.slugToKey.has(Y))throw Error(`GatewayClient: duplicate namespace code "${Y}" from keys "${this.slugToKey.get(Y)}" and "${Q}"`);this.slugToKey.set(Y,Q)}}namespace($,Z){return`${QU0($)}_${Z}`}async resolveNamespacedTarget($,Z,Q){let Y=$.indexOf("_");if(Y!==-1){let X=$.slice(0,Y),J=this.slugToKey.get(X);if(J)return[J,$.slice(Y+1)]}for(let X of await Q()){let J=YU0(X._meta);if(!J)continue;if(XU0(X.name,J)===$)return[J,$]}if(Y===-1)throw Error(`GatewayClient: could not resolve ${Z} "${$}" \u2014 no namespace prefix and not found in any client`);throw Error(`GatewayClient: unknown namespace "${$.slice(0,Y)}" in "${$}" and not found by original name in any client`)}resolveToolTarget($){return this.resolveNamespacedTarget($,"tool",async()=>(await this.listTools()).tools)}resolvePromptTarget($){return this.resolveNamespacedTarget($,"prompt",async()=>(await this.listPrompts()).prompts)}resolveClient($){let Z=this.resolvedClients.get($);if(Z)return Z;let Q=this.clients[$];if(!Q)return Promise.reject(Error(`GatewayClient: unknown client key "${$}"`));let Y=Q.client,X;try{X=typeof Y==="function"?Promise.resolve(Y()):Promise.resolve(Y)}catch(G){return Promise.reject(G)}let J=X.catch((G)=>{throw this.resolvedClients.delete($),G});return this.resolvedClients.set($,J),J}getResolvedClient($){return this.resolveClient($)}async listFromClient($,Z,Q){try{return await Pf4((async()=>{let Y=await this.resolveClient($);return await Z(Y)})(),this.listTimeoutMs,`timed out after ${this.listTimeoutMs}ms`)}catch(Y){return console.warn(`GatewayClient: skipping ${Q} from client "${$}" \u2014 ${Y?.message??Y}`),[]}}listFromAllClients($,Z){return Promise.all(Object.entries(this.clients).map(async([Q,Y])=>[Q,Y,await this.listFromClient(Q,(X)=>$(X,Q),Z)]))}async paginate($,Z,Q){let Y=[],X,J=0;do{let G=await Q(X);Y.push(...G.items),X=G.nextCursor,J++}while(X&&J<xT.MAX_PAGES_PER_CLIENT);if(X)console.warn(`GatewayClient: client "${$}" exceeded ${xT.MAX_PAGES_PER_CLIENT} pages listing ${Z} \u2014 truncating`);return Y}fetchAllTools($,Z){return this.paginate(Z,"tools",async(Q)=>{let Y=await $.listTools(Q?{cursor:Q}:void 0);return{items:Y.tools,nextCursor:Y.nextCursor}})}fetchAllResources($,Z){return this.paginate(Z,"resources",async(Q)=>{let Y=await $.listResources(Q?{cursor:Q}:void 0);return{items:Y.resources,nextCursor:Y.nextCursor}})}fetchAllResourceTemplates($,Z){return this.paginate(Z,"resource templates",async(Q)=>{let Y=await $.listResourceTemplates(Q?{cursor:Q}:void 0);return{items:Y.resourceTemplates,nextCursor:Y.nextCursor}})}fetchAllPrompts($,Z){return this.paginate(Z,"prompts",async(Q)=>{let Y=await $.listPrompts(Q?{cursor:Q}:void 0);return{items:Y.prompts,nextCursor:Y.nextCursor}})}listTools($,Z){if(!this.toolsCache)this.toolsCache=this.aggregateTools();return this.toolsCache}async aggregateTools(){let $=[],Z=await this.listFromAllClients((Q,Y)=>this.fetchAllTools(Q,Y),"tools");for(let[Q,Y,X]of Z){let J=Y.tools,G=J?new Set(J):null;for(let W of X){if(G&&!G.has(W.name))continue;$.push({...W,name:this.namespace(Q,W.name),_meta:{...W._meta??{},gatewayClientId:Q}})}}return{tools:$}}listResources($,Z){if(!this.resourcesCache)this.resourcesCache=this.aggregateResources();return this.resourcesCache}async aggregateResources(){let $=new Set,Z=[],Q=new Map,Y=await this.listFromAllClients((X,J)=>this.fetchAllResources(X,J),"resources");for(let[X,J,G]of Y){let W=J.resources,K=W?new Set(W):null;for(let H of G){if(K&&!K.has(H.uri)&&!(H.name&&K.has(H.name)))continue;if($.has(H.uri)){console.warn(`GatewayClient: duplicate resource "${H.uri}" from client "${X}" \u2014 skipping`);continue}$.add(H.uri),Q.set(H.uri,X),Z.push({...H,_meta:{...H._meta??{},gatewayClientId:X}})}}return this.resourceRouteMap=Q,{resources:Z}}listResourceTemplates($,Z){if(!this.resourceTemplatesCache)this.resourceTemplatesCache=this.aggregateResourceTemplates();return this.resourceTemplatesCache}async aggregateResourceTemplates(){let $=new Set,Z=[],Q=await this.listFromAllClients((Y,X)=>this.fetchAllResourceTemplates(Y,X),"resource templates");for(let[Y,X,J]of Q)for(let G of J){if($.has(G.uriTemplate)){console.warn(`GatewayClient: duplicate resource template "${G.uriTemplate}" from client "${Y}" \u2014 skipping`);continue}$.add(G.uriTemplate),Z.push({...G,_meta:{...G._meta??{},gatewayClientId:Y}})}return{resourceTemplates:Z}}listPrompts($,Z){if(!this.promptsCache)this.promptsCache=this.aggregatePrompts();return this.promptsCache}async aggregatePrompts(){let $=[],Z=await this.listFromAllClients((Q,Y)=>this.fetchAllPrompts(Q,Y),"prompts");for(let[Q,Y,X]of Z){let J=Y.prompts,G=J?new Set(J):null;for(let W of X){if(G&&!G.has(W.name))continue;$.push({...W,name:this.namespace(Q,W.name),title:W.title??Ef4(W.name),_meta:{...W._meta??{},gatewayClientId:Q}})}}return{prompts:$}}async callTool($,Z,Q){let[Y,X]=await this.resolveToolTarget($.name);return(await this.resolveClient(Y)).callTool({...$,name:X},Z,Q)}async readResource($,Z){let Q=await this.resolveResourceRoute($.uri);return(await this.resolveClient(Q)).readResource($)}async getPrompt($,Z){let[Q,Y]=await this.resolvePromptTarget($.name);return(await this.resolveClient(Q)).getPrompt({...$,name:Y})}async resolveResourceRoute($){let Z=this.resourceRouteMap.get($);if(Z)return Z;if(this.resourcesCache=null,await this.listResources(),Z=this.resourceRouteMap.get($),Z)return Z;throw Error(`GatewayClient: resource "${$}" not found in any upstream client`)}getServerCapabilities(){return{tools:{},resources:{},prompts:{}}}getInstructions(){return}refresh(){this.toolsCache=null,this.resourcesCache=null,this.resourceTemplatesCache=null,this.promptsCache=null}async close(){let $=[...this.resolvedClients.values()].map((Z)=>Z.then((Q)=>Q.close()).catch(()=>{}));await Promise.allSettled($),await super.close()}}});var JU0=L(()=>{Lj$()});function o61($){return ZL($)}function Af4($,Z){let Q=ZL(Z)||"prompt";return`${String($).padStart(zf4,"0")}-${Q}`}async function s61($,Z,Q){try{await $.delete(GU0,o61(Z),{actor:Q})}catch(Y){console.error("[agent-prompts] failed to delete prompts",{agentId:Z,err:Y})}}async function WU0($,Z,Q,Y){let X=o61(Z);await s61($,Z,Q),await Promise.all(Y.slice(0,t61).map(async(J,G)=>{let W=Af4(G,J.title),K={name:W,title:J.title,description:J.description,text:J.text};try{await $.write(GU0,`${X}/${W}.json`,JSON.stringify(K),{actor:Q,contentType:"application/json"})}catch(H){console.error("[agent-prompts] failed to seed prompt",{agentId:Z,name:W,err:H})}}))}async function Oj$($,Z){let Q=o61(Z),Y;try{Y=await $.listDir(GU0,Q)}catch{return[]}let X=Y.filter((G)=>G.kind==="file"&&G.path.endsWith(".json")).slice(0,t61),J=[];for(let G of X)try{let W=await $.read(GU0,G.path),K=JSON.parse(new TextDecoder().decode(W));if(K&&typeof K.name==="string"&&typeof K.title==="string"&&typeof K.text==="string")J.push(K)}catch{}return J}var GU0="agent-prompts",t61=20,zf4;var G$0=L(()=>{JU0();zf4=String(t61-1).length});function KU0($){return`!${$}`}function a61($){return $.startsWith("!")?$.slice(1):null}function bd($,Z){if(!$)return!1;return $.includes(KU0("*"))||$.includes(KU0(Z))}function W$0($,Z){if(!$)return!1;return $.includes("*")||$.includes(Z)}function xd($,Z){if($.some((Q)=>bd(Q,Z)))return!1;return $.some((Q)=>W$0(Q,Z))}function HU0($){if($.includes(KU0("*")))return{kind:"only",names:[]};let Z=new Set,Q=new Set;for(let Y of $){let X=a61(Y);if(X!==null)Z.add(X);else if(Y!=="*")Q.add(Y)}if($.includes("*"))return Z.size===0?{kind:"all"}:{kind:"except",names:[...Z]};return{kind:"only",names:[...Q].filter((Y)=>!Z.has(Y))}}function FU0($){let Z=null,Q=new Set;for(let X of $){if(X.kind==="all")return X;if(X.kind==="only"){for(let J of X.names)Q.add(J);continue}Z=Z?new Set(X.names.filter((J)=>Z?.has(J))):new Set(X.names)}if(Z===null)return{kind:"only",names:[...Q]};let Y=[...Z].filter((X)=>!Q.has(X));return Y.length===0?{kind:"all"}:{kind:"except",names:Y}}function UU0($){if($.kind==="all")return["*"];if($.kind==="except")return["*",...$.names.map(KU0)];return[...$.names]}var r61="*";function e61($){if(!$)return null;let Z=$[Tf4];return Array.isArray(Z)?Z:null}function $X($,Z){if($===null)return!0;return xd([$],Z)}function $51($){return $===null?{kind:"all"}:HU0($)}function wj$($){if($.some((Z)=>Z===null))return null;return UU0(FU0($.map($51)))}var Tf4="projects";var LN=()=>{};function jj$($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function qf4($){return $.normalize("NFD").replace(/[\u0300-\u036f]/g,"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function Ej$($){return $!=="."&&$!==".."&&!/[/\\%]/.test($)}function Pj$($){return jj$($.metadata)?$.metadata:{}}function Mf4($){let Z=Pj$($),Q=jj$(Z.project)?Z.project:{};if(typeof Q.folder!=="string")return null;let Y=Q.folder.split("/").map((X)=>X.trim()).filter(Boolean);if(Y.length===0||!Y.every(Ej$))return null;return Y.join("/")}function fd($){let Z=Pj$($).projectFolderName;if(typeof Z!=="string")return null;let Q=Z.trim();return Q&&Ej$(Q)?Q:null}function Z51($){return fd($)??(qf4($.title??"")||$.id)}function EE($){let Z=Mf4($);return[Rf4,Z,Z51($)].filter((Q)=>!!Q).join("/")}var Rf4="projects",zj$,Aj$="memory.md";var Q51=L(()=>{zj$=["Documents","Notes","Work","Delivered"]});async function KY($){if($.auth.apiKey)return null;let Z=$.organization?.id;if(!Z)return null;let Q=$.access.getRole()??$.organization?.role??$.auth.user?.role;if(!Q||TZ(Q))return null;if($.auth.permissions&&$.auth.permissionsOrganizationId===Z)return e61($.auth.permissions);let Y=await Promise.all(Kj(Q).map(async(X)=>e61(await PE($.db,Z,X))));return wj$(Y)}async function Rj$($){let Z=$51(await KY($));if(Z.kind==="all")return Tj$;if(Z.kind==="except")return new Set(Z.names);let Q=$.organization?.id;if(!Q)return Tj$;let Y=new Set(Z.names),X=await $.storage.virtualMcps.list(Q);return new Set(X.filter((J)=>gJ0(J)).map((J)=>J.id).filter((J)=>!Y.has(J)))}function qj$($,Z){return!Z||!$.has(Z)}var Tj$;var ON=L(()=>{LN();R8();lY();wN();Tj$=new Set});class Y51{options;kv=null;codec=DE();constructor($){this.options=$}async init(){let $=this.options.getJetStream();if(!$)return;this.kv=await new Ij$.Kvm($).create(If4,{storage:Mj$.StorageType.Memory,ttl:Vf4,maxValueSize:kf4})}async get($){if(!this.kv)return{catalog:null};try{let Z=await this.kv.get($);if(!Z)return{catalog:null};if(Z.operation==="DEL"||Z.operation==="PURGE"||!Z.value?.length)return{catalog:null,revision:Z.revision};let Q=this.codec.decode(Z.value);if(Q===null)return{catalog:null,revision:Z.revision};return Vj$.add(1,{outcome:"hit"}),{catalog:Q,revision:Z.revision}}catch{return{catalog:null}}}async set($,Z,Q){if(!this.kv)return;try{let Y=this.codec.encode(Z);if(Q===void 0)await this.kv.create($,Y);else await this.kv.update($,Y,Q)}catch{}}async invalidate($){if(!this.kv)return;try{await this.kv.put($,Sf4)}catch{}}teardown(){this.kv=null}}function kj$(){Vj$.add(1,{outcome:"miss"})}function J51($){X51=$}function Sj$(){return X51}async function Cj$($){await X51?.invalidate($)}var Mj$,Ij$,Vj$,If4="DECOCMS_SKILL_CATALOGS",Vf4=60000,kf4=1048576,Sf4,X51=null;var NU0=L(()=>{v6();Mj$=C(KH(),1),Ij$=C(MT(),1),Vj$=J$.createCounter("skill_catalog_cache.fetches",{description:"Skill catalog cache fetch outcomes (hit, miss)",unit:"{fetches}"}),Sf4=new TextEncoder().encode("null")});function G51($,Z){if(/[.*>\s]/.test($)||/[.*>\s]/.test(Z))return[];return Cf4.map((Q)=>`${Q}.${$}.${Z}`)}async function fT($,Z,Q){if($)try{for(let Y of G51(Z,Q))$.publish(Y)}catch{}await Cj$(Z)}function W51($){_j$=$}async function K$0($,Z){await fT(_j$?.()??null,$,Z)}var Cf4,_j$=null;var H$0=L(()=>{NU0();Cf4=["studio.org-fs.changes","mesh.org-fs.changes"]});function _f4($){return`# ${$}
|
|
950
|
+
`.execute($)).rows[0]?.exists)await R6`CREATE ROLE ${R6.id(Q)} NOLOGIN`.execute($);await R6`GRANT ${R6.id(Q)} TO CURRENT_USER`.execute($),await R6`GRANT USAGE, CREATE ON SCHEMA ${R6.id(Z)} TO ${R6.id(Q)}`.execute($),await R6`GRANT ALL ON ALL TABLES IN SCHEMA ${R6.id(Z)} TO ${R6.id(Q)}`.execute($),await R6`GRANT ALL ON ALL SEQUENCES IN SCHEMA ${R6.id(Z)} TO ${R6.id(Q)}`.execute($),await R6`ALTER DEFAULT PRIVILEGES IN SCHEMA ${R6.id(Z)} GRANT ALL ON TABLES TO ${R6.id(Q)}`.execute($),await R6`ALTER DEFAULT PRIVILEGES IN SCHEMA ${R6.id(Z)} GRANT ALL ON SEQUENCES TO ${R6.id(Q)}`.execute($),await R6`REVOKE ALL ON SCHEMA public FROM ${R6.id(Q)}`.execute($)}async function wf4($,Z,Q,Y){try{return await $.transaction().execute(async(X)=>{return await R6`SET LOCAL ROLE ${R6.id(Q)}`.execute(X),await R6`SET LOCAL search_path TO ${R6.id(Z)}`.execute(X),await R6.raw(Y).execute(X)})}catch(X){if(Lf4(X))return await Of4($,Z,Q),await $.transaction().execute(async(J)=>{return await R6`SET LOCAL ROLE ${R6.id(Q)}`.execute(J),await R6`SET LOCAL search_path TO ${R6.id(Z)}`.execute(J),await R6.raw(Y).execute(J)});throw X}}var Ff4,Nf4,Bj$;var Dj$=L(()=>{q0();Ff4=DN.object({results:DN.array(DN.unknown()).optional(),success:DN.boolean().optional()});Nf4=DN.object({sql:DN.string().describe("The SQL query to run"),params:DN.array(DN.unknown()).describe("The parameters to pass to the SQL query").optional()});Bj$=h({name:"DATABASES_RUN_SQL",description:"Run a SQL query in a connection-scoped isolated schema. Supports SELECT, DDL, and DML.",annotations:{title:"Run SQL Query",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!1,openWorldHint:!1},inputSchema:Nf4,outputSchema:DN.object({result:DN.array(Ff4)}),handler:async($,Z)=>{p(Z),await Z.access.check();let Q=Uf4($.sql,$.params||[]);if(!Z.connectionId)throw Error("Connection context required for database access");console.warn("DATABASES_RUN_SQL invoked",{"tool.deprecation_probe":"DATABASES_RUN_SQL","connection.id":Z.connectionId,"organization.id":Z.organization?.id??null,"user.id":Z.auth.user?.id??null});let Y=Bf4(Z.connectionId),X=Df4(Z.connectionId);return{result:[{results:(await wf4(Z.db,Y,X,Q)).rows,success:!0}]}}})});function $U0($){let Z=$.access.getRole();if(!TZ(Z))throw new B5("Only organization owners and admins can change org-wide pin status")}var n61=L(()=>{lY();nX()});async function ZU0($,Z,Q){let Y=[...new Set(Q)],X=await Promise.all(Y.map((G)=>$.storage.connections.findById(G,Z))),J=Y.filter((G,W)=>!X[W]);if(J.length>0)throw Error(`Connection not found: ${J.join(", ")}`)}function ZL($){return $.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")}function QU0($){let Z=2166136261;for(let Q=0;Q<$.length;Q++)Z=Math.imul(Z^$.charCodeAt(Q),16777619);return`a${(Z>>>0).toString(36).padStart(6,"0").slice(-6)}`}function YU0($){if($&&typeof $==="object"&&"gatewayClientId"in $&&typeof $.gatewayClientId==="string")return $.gatewayClientId;return}function XU0($,Z){if(!Z)return $;let Q=`${QU0(Z)}_`;return $.startsWith(Q)?$.slice(Q.length):$}function Ef4($){return $.split(/[-_]/).map((Z)=>Z?Z.charAt(0).toUpperCase()+Z.slice(1):Z).join(" ")}function Pf4($,Z,Q){let Y,X=new Promise((J,G)=>{Y=setTimeout(()=>G(Error(Q)),Z)});return Promise.race([$,X]).finally(()=>clearTimeout(Y))}var xT;var Lj$=L(()=>{IU();xT=class xT extends N7{static MAX_PAGES_PER_CLIENT=1000;static DEFAULT_LIST_TIMEOUT_MS=30000;clients;slugToKey=new Map;resolvedClients=new Map;toolsCache=null;resourcesCache=null;resourceTemplatesCache=null;promptsCache=null;resourceRouteMap=new Map;listTimeoutMs;constructor($,Z){super(Z?.clientInfo??{name:"gateway-client",version:"1.0.0"},{capabilities:Z?.capabilities});this.clients=$,this.listTimeoutMs=Z?.listTimeoutMs??xT.DEFAULT_LIST_TIMEOUT_MS;for(let Q of Object.keys($)){let Y=QU0(Q);if(this.slugToKey.has(Y))throw Error(`GatewayClient: duplicate namespace code "${Y}" from keys "${this.slugToKey.get(Y)}" and "${Q}"`);this.slugToKey.set(Y,Q)}}namespace($,Z){return`${QU0($)}_${Z}`}async resolveNamespacedTarget($,Z,Q){let Y=$.indexOf("_");if(Y!==-1){let X=$.slice(0,Y),J=this.slugToKey.get(X);if(J)return[J,$.slice(Y+1)]}for(let X of await Q()){let J=YU0(X._meta);if(!J)continue;if(XU0(X.name,J)===$)return[J,$]}if(Y===-1)throw Error(`GatewayClient: could not resolve ${Z} "${$}" \u2014 no namespace prefix and not found in any client`);throw Error(`GatewayClient: unknown namespace "${$.slice(0,Y)}" in "${$}" and not found by original name in any client`)}resolveToolTarget($){return this.resolveNamespacedTarget($,"tool",async()=>(await this.listTools()).tools)}resolvePromptTarget($){return this.resolveNamespacedTarget($,"prompt",async()=>(await this.listPrompts()).prompts)}resolveClient($){let Z=this.resolvedClients.get($);if(Z)return Z;let Q=this.clients[$];if(!Q)return Promise.reject(Error(`GatewayClient: unknown client key "${$}"`));let Y=Q.client,X;try{X=typeof Y==="function"?Promise.resolve(Y()):Promise.resolve(Y)}catch(G){return Promise.reject(G)}let J=X.catch((G)=>{throw this.resolvedClients.delete($),G});return this.resolvedClients.set($,J),J}getResolvedClient($){return this.resolveClient($)}async listFromClient($,Z,Q){try{return await Pf4((async()=>{let Y=await this.resolveClient($);return await Z(Y)})(),this.listTimeoutMs,`timed out after ${this.listTimeoutMs}ms`)}catch(Y){return console.warn(`GatewayClient: skipping ${Q} from client "${$}" \u2014 ${Y?.message??Y}`),[]}}listFromAllClients($,Z){return Promise.all(Object.entries(this.clients).map(async([Q,Y])=>[Q,Y,await this.listFromClient(Q,(X)=>$(X,Q),Z)]))}async paginate($,Z,Q){let Y=[],X,J=0;do{let G=await Q(X);Y.push(...G.items),X=G.nextCursor,J++}while(X&&J<xT.MAX_PAGES_PER_CLIENT);if(X)console.warn(`GatewayClient: client "${$}" exceeded ${xT.MAX_PAGES_PER_CLIENT} pages listing ${Z} \u2014 truncating`);return Y}fetchAllTools($,Z){return this.paginate(Z,"tools",async(Q)=>{let Y=await $.listTools(Q?{cursor:Q}:void 0);return{items:Y.tools,nextCursor:Y.nextCursor}})}fetchAllResources($,Z){return this.paginate(Z,"resources",async(Q)=>{let Y=await $.listResources(Q?{cursor:Q}:void 0);return{items:Y.resources,nextCursor:Y.nextCursor}})}fetchAllResourceTemplates($,Z){return this.paginate(Z,"resource templates",async(Q)=>{let Y=await $.listResourceTemplates(Q?{cursor:Q}:void 0);return{items:Y.resourceTemplates,nextCursor:Y.nextCursor}})}fetchAllPrompts($,Z){return this.paginate(Z,"prompts",async(Q)=>{let Y=await $.listPrompts(Q?{cursor:Q}:void 0);return{items:Y.prompts,nextCursor:Y.nextCursor}})}listTools($,Z){if(!this.toolsCache)this.toolsCache=this.aggregateTools();return this.toolsCache}async aggregateTools(){let $=[],Z=await this.listFromAllClients((Q,Y)=>this.fetchAllTools(Q,Y),"tools");for(let[Q,Y,X]of Z){let J=Y.tools,G=J?new Set(J):null;for(let W of X){if(G&&!G.has(W.name))continue;$.push({...W,name:this.namespace(Q,W.name),_meta:{...W._meta??{},gatewayClientId:Q}})}}return{tools:$}}listResources($,Z){if(!this.resourcesCache)this.resourcesCache=this.aggregateResources();return this.resourcesCache}async aggregateResources(){let $=new Set,Z=[],Q=new Map,Y=await this.listFromAllClients((X,J)=>this.fetchAllResources(X,J),"resources");for(let[X,J,G]of Y){let W=J.resources,K=W?new Set(W):null;for(let H of G){if(K&&!K.has(H.uri)&&!(H.name&&K.has(H.name)))continue;if($.has(H.uri)){console.warn(`GatewayClient: duplicate resource "${H.uri}" from client "${X}" \u2014 skipping`);continue}$.add(H.uri),Q.set(H.uri,X),Z.push({...H,_meta:{...H._meta??{},gatewayClientId:X}})}}return this.resourceRouteMap=Q,{resources:Z}}listResourceTemplates($,Z){if(!this.resourceTemplatesCache)this.resourceTemplatesCache=this.aggregateResourceTemplates();return this.resourceTemplatesCache}async aggregateResourceTemplates(){let $=new Set,Z=[],Q=await this.listFromAllClients((Y,X)=>this.fetchAllResourceTemplates(Y,X),"resource templates");for(let[Y,X,J]of Q)for(let G of J){if($.has(G.uriTemplate)){console.warn(`GatewayClient: duplicate resource template "${G.uriTemplate}" from client "${Y}" \u2014 skipping`);continue}$.add(G.uriTemplate),Z.push({...G,_meta:{...G._meta??{},gatewayClientId:Y}})}return{resourceTemplates:Z}}listPrompts($,Z){if(!this.promptsCache)this.promptsCache=this.aggregatePrompts();return this.promptsCache}async aggregatePrompts(){let $=[],Z=await this.listFromAllClients((Q,Y)=>this.fetchAllPrompts(Q,Y),"prompts");for(let[Q,Y,X]of Z){let J=Y.prompts,G=J?new Set(J):null;for(let W of X){if(G&&!G.has(W.name))continue;$.push({...W,name:this.namespace(Q,W.name),title:W.title??Ef4(W.name),_meta:{...W._meta??{},gatewayClientId:Q}})}}return{prompts:$}}async callTool($,Z,Q){let[Y,X]=await this.resolveToolTarget($.name);return(await this.resolveClient(Y)).callTool({...$,name:X},Z,Q)}async readResource($,Z){let Q=await this.resolveResourceRoute($.uri);return(await this.resolveClient(Q)).readResource($)}async getPrompt($,Z){let[Q,Y]=await this.resolvePromptTarget($.name);return(await this.resolveClient(Q)).getPrompt({...$,name:Y})}async resolveResourceRoute($){let Z=this.resourceRouteMap.get($);if(Z)return Z;if(this.resourcesCache=null,await this.listResources(),Z=this.resourceRouteMap.get($),Z)return Z;throw Error(`GatewayClient: resource "${$}" not found in any upstream client`)}getServerCapabilities(){return{tools:{},resources:{},prompts:{}}}getInstructions(){return}refresh(){this.toolsCache=null,this.resourcesCache=null,this.resourceTemplatesCache=null,this.promptsCache=null}async close(){let $=[...this.resolvedClients.values()].map((Z)=>Z.then((Q)=>Q.close()).catch(()=>{}));await Promise.allSettled($),await super.close()}}});var JU0=L(()=>{Lj$()});function o61($){return ZL($)}function Af4($,Z){let Q=ZL(Z)||"prompt";return`${String($).padStart(zf4,"0")}-${Q}`}async function s61($,Z,Q){try{await $.delete(GU0,o61(Z),{actor:Q})}catch(Y){console.error("[agent-prompts] failed to delete prompts",{agentId:Z,err:Y})}}async function WU0($,Z,Q,Y){let X=o61(Z);await s61($,Z,Q),await Promise.all(Y.slice(0,t61).map(async(J,G)=>{let W=Af4(G,J.title),K={name:W,title:J.title,description:J.description,text:J.text};try{await $.write(GU0,`${X}/${W}.json`,JSON.stringify(K),{actor:Q,contentType:"application/json"})}catch(H){console.error("[agent-prompts] failed to seed prompt",{agentId:Z,name:W,err:H})}}))}async function Oj$($,Z){let Q=o61(Z),Y;try{Y=await $.listDir(GU0,Q)}catch{return[]}let X=Y.filter((G)=>G.kind==="file"&&G.path.endsWith(".json")).slice(0,t61),J=[];for(let G of X)try{let W=await $.read(GU0,G.path),K=JSON.parse(new TextDecoder().decode(W));if(K&&typeof K.name==="string"&&typeof K.title==="string"&&typeof K.text==="string")J.push(K)}catch{}return J}var GU0="agent-prompts",t61=20,zf4;var G$0=L(()=>{JU0();zf4=String(t61-1).length});function KU0($){return`!${$}`}function a61($){return $.startsWith("!")?$.slice(1):null}function bd($,Z){if(!$)return!1;return $.includes(KU0("*"))||$.includes(KU0(Z))}function W$0($,Z){if(!$)return!1;return $.includes("*")||$.includes(Z)}function xd($,Z){if($.some((Q)=>bd(Q,Z)))return!1;return $.some((Q)=>W$0(Q,Z))}function HU0($){if($.includes(KU0("*")))return{kind:"only",names:[]};let Z=new Set,Q=new Set;for(let Y of $){let X=a61(Y);if(X!==null)Z.add(X);else if(Y!=="*")Q.add(Y)}if($.includes("*"))return Z.size===0?{kind:"all"}:{kind:"except",names:[...Z]};return{kind:"only",names:[...Q].filter((Y)=>!Z.has(Y))}}function FU0($){let Z=null,Q=new Set;for(let X of $){if(X.kind==="all")return X;if(X.kind==="only"){for(let J of X.names)Q.add(J);continue}Z=Z?new Set(X.names.filter((J)=>Z?.has(J))):new Set(X.names)}if(Z===null)return{kind:"only",names:[...Q]};let Y=[...Z].filter((X)=>!Q.has(X));return Y.length===0?{kind:"all"}:{kind:"except",names:Y}}function UU0($){if($.kind==="all")return["*"];if($.kind==="except")return["*",...$.names.map(KU0)];return[...$.names]}var r61="*";function e61($){if(!$)return null;let Z=$[Tf4];return Array.isArray(Z)?Z:null}function $X($,Z){if($===null)return!0;return xd([$],Z)}function $51($){return $===null?{kind:"all"}:HU0($)}function wj$($){if($.some((Z)=>Z===null))return null;return UU0(FU0($.map($51)))}var Tf4="projects";var LN=()=>{};function jj$($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function qf4($){return $.normalize("NFD").replace(/[\u0300-\u036f]/g,"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function Ej$($){return $!=="."&&$!==".."&&!/[/\\%]/.test($)}function Pj$($){return jj$($.metadata)?$.metadata:{}}function Mf4($){let Z=Pj$($),Q=jj$(Z.project)?Z.project:{};if(typeof Q.folder!=="string")return null;let Y=Q.folder.split("/").map((X)=>X.trim()).filter(Boolean);if(Y.length===0||!Y.every(Ej$))return null;return Y.join("/")}function fd($){let Z=Pj$($).projectFolderName;if(typeof Z!=="string")return null;let Q=Z.trim();return Q&&Ej$(Q)?Q:null}function Z51($){return fd($)??(qf4($.title??"")||$.id)}function EE($){let Z=Mf4($);return[Rf4,Z,Z51($)].filter((Q)=>!!Q).join("/")}var Rf4="projects",zj$,Aj$="memory.md";var Q51=L(()=>{zj$=["Documents","Notes","Work","Delivered"]});async function KY($){if($.auth.apiKey)return null;let Z=$.organization?.id;if(!Z)return null;let Q=$.access.getRole()??$.organization?.role??$.auth.user?.role;if(!Q||TZ(Q))return null;if($.auth.permissions&&$.auth.permissionsOrganizationId===Z)return e61($.auth.permissions);let Y=await Promise.all(Kj(Q).map(async(X)=>e61(await PE($.db,Z,X))));return wj$(Y)}async function Rj$($){let Z=$51(await KY($));if(Z.kind==="all")return Tj$;if(Z.kind==="except")return new Set(Z.names);let Q=$.organization?.id;if(!Q)return Tj$;let Y=new Set(Z.names),X=await $.storage.virtualMcps.list(Q);return new Set(X.filter((J)=>gJ0(J)).map((J)=>J.id).filter((J)=>!Y.has(J)))}function qj$($,Z){if($.size===0)return!0;return![Z.virtualMcpId,Z.repo?.trim(),...Z.threads.map((Y)=>Y.virtualMcpId)].some((Y)=>Y&&$.has(Y))}var Tj$;var ON=L(()=>{LN();R8();lY();wN();Tj$=new Set});class Y51{options;kv=null;codec=DE();constructor($){this.options=$}async init(){let $=this.options.getJetStream();if(!$)return;this.kv=await new Ij$.Kvm($).create(If4,{storage:Mj$.StorageType.Memory,ttl:Vf4,maxValueSize:kf4})}async get($){if(!this.kv)return{catalog:null};try{let Z=await this.kv.get($);if(!Z)return{catalog:null};if(Z.operation==="DEL"||Z.operation==="PURGE"||!Z.value?.length)return{catalog:null,revision:Z.revision};let Q=this.codec.decode(Z.value);if(Q===null)return{catalog:null,revision:Z.revision};return Vj$.add(1,{outcome:"hit"}),{catalog:Q,revision:Z.revision}}catch{return{catalog:null}}}async set($,Z,Q){if(!this.kv)return;try{let Y=this.codec.encode(Z);if(Q===void 0)await this.kv.create($,Y);else await this.kv.update($,Y,Q)}catch{}}async invalidate($){if(!this.kv)return;try{await this.kv.put($,Sf4)}catch{}}teardown(){this.kv=null}}function kj$(){Vj$.add(1,{outcome:"miss"})}function J51($){X51=$}function Sj$(){return X51}async function Cj$($){await X51?.invalidate($)}var Mj$,Ij$,Vj$,If4="DECOCMS_SKILL_CATALOGS",Vf4=60000,kf4=1048576,Sf4,X51=null;var NU0=L(()=>{v6();Mj$=C(KH(),1),Ij$=C(MT(),1),Vj$=J$.createCounter("skill_catalog_cache.fetches",{description:"Skill catalog cache fetch outcomes (hit, miss)",unit:"{fetches}"}),Sf4=new TextEncoder().encode("null")});function G51($,Z){if(/[.*>\s]/.test($)||/[.*>\s]/.test(Z))return[];return Cf4.map((Q)=>`${Q}.${$}.${Z}`)}async function fT($,Z,Q){if($)try{for(let Y of G51(Z,Q))$.publish(Y)}catch{}await Cj$(Z)}function W51($){_j$=$}async function K$0($,Z){await fT(_j$?.()??null,$,Z)}var Cf4,_j$=null;var H$0=L(()=>{NU0();Cf4=["studio.org-fs.changes","mesh.org-fs.changes"]});function _f4($){return`# ${$}
|
|
951
951
|
|
|
952
952
|
Notes worth keeping about this project: goals, decisions, people and context.
|
|
953
953
|
`}function vj$($,Z){let Q=typeof $.metadata==="object"&&$.metadata!==null?$.metadata:{};return{...$,metadata:{...Q,projectFolderName:Z}}}function vf4($,Z){let Q=new Set(Z.map(EE)),Y=Z51($);for(let X=1;;X++){let J=X===1?Y:`${Y}-${X}`;if(!Q.has(EE(vj$($,J))))return J}}async function bf4($,Z,Q,Y){let X=new Set((await $.listDir(yY,Z)).map((W)=>W.path)),J=zj$.map((W)=>`${Z}/${W}`).filter((W)=>!X.has(W)),G=`${Z}/${Aj$}`;await Promise.all([...J.map((W)=>$.mkdir(yY,W,{actor:Y})),X.has(G)?null:$.write(yY,G,_f4(Q),{actor:Y,contentType:"text/markdown",expect:{absent:!0}}).catch((W)=>{if(!(W instanceof Ul))throw W})])}async function bj$($){let{orgFs:Z,organizationId:Q,project:Y,actor:X}=$;if(fd(Y))return null;let J=vf4(Y,$.projects.filter((G)=>G.id!==Y.id));if(!$.homeIsSynced){let G=U5(EE(vj$(Y,J)));await bf4(Z,G,Y.title?.trim()||"Memory",X),await K$0(Q,yY)}return J}async function xj$($,Z,Q,Y){if(!fd(Q))return;await $.delete(yY,EE(Q),{actor:Y}),await K$0(Z,yY)}var K51=L(()=>{iJ();Q51();XU();H$0();iQ()});import{z as F$0}from"zod";async function U$0($,Z,Q,Y){if(!$.orgFs||fd(Q))return null;let[X,J]=await Promise.all([$.storage.virtualMcps.list(Z),$.storage.orgRepoSyncs.isSyncVolume(Z,yY)]);return bj$({orgFs:$.orgFs,organizationId:Z,project:Q,projects:X,homeIsSynced:J,actor:Y})}async function H51($,Z,Q,Y,X){await $.storage.virtualMcps.patchMetadata({id:Q,organizationId:Z,set:{projectFolderName:Y},unset:[],by:X})}var F51;var BU0=L(()=>{LN();iJ();Q51();q0();ON();K51();F51=h({name:"PROJECT_FOLDER_ENSURE",description:"Give a project's folder in the org's home volume its subfolders and memory.md, once. A project whose folder was already given its shape is left as it is.",annotations:{title:"Ensure Project Folder",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:F$0.object({id:F$0.string().min(1)}),outputSchema:F$0.object({path:F$0.string().describe("The folder's path inside the home volume"),created:F$0.boolean().describe("Whether this call gave the folder its shape")}),handler:async($,Z)=>{p(Z);let Q=Y0(Z);await Z.access.check();let Y=await Z.storage.virtualMcps.findById($.id,Q.id),X=await KY(Z);if(!Y||Y.organization_id!==Q.id||!$X(X,Y.id))throw Error(`Project not found: ${$.id}`);if(!Z.orgFs)throw Error("Organization filesystem is not configured");let J=_0(Z)??"system",G=await U$0(Z,Q.id,Y,J);if(G===null)return{path:EE(Y),created:!1};return await H51(Z,Q.id,Y.id,G,J),{path:EE({...Y,metadata:{...Y.metadata,projectFolderName:G}}),created:!0}}})});function yd($){if(!$)return $;let Z={...$};return delete Z.sandboxMap,Z}import{z as gj$}from"zod";function ff4(){let $=fj$[Math.floor(Math.random()*fj$.length)];return`icon://${yj$[Math.floor(Math.random()*yj$.length)]}?color=${$}`}var xf4=($)=>typeof $==="string"?$.trim().toLowerCase():"",fj$,yj$,yf4,gf4,yT;var U51=L(()=>{q0();wE();n61();G$0();BU0();iX();Cl();fj$=["red","orange","amber","yellow","lime","green","emerald","cyan","sky","blue","indigo","violet","purple","fuchsia","pink","rose"],yj$=["Star01","Zap","Heart","Globe01","Compass03","Lightbulb02","Rocket01","Flag01","BookOpen01","Shield01","Key01","Diamond01","Cube01","Target04","Award01","Briefcase01","Coffee","Feather","Hexagon01","Layers3_01","Map01","Palette","Package","Terminal"];yf4=gj$.object({data:NJ0.describe("Data for the new virtual MCP")}),gf4=gj$.object({item:bY.describe("The created virtual MCP entity")}),yT=h({name:"COLLECTION_VIRTUAL_MCP_CREATE",description:"Create a Virtual MCP (agent) that aggregates tools from multiple connections into one endpoint. Pass `prompts` to seed the agent with kickstart prompts (conversation starters shown as icebreakers). Author them from the agent's role/instructions and the descriptions of the tools it will have, so the starters are coherent and immediately useful.",annotations:{title:"Create Virtual MCP",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!1,openWorldHint:!1},inputSchema:yf4,outputSchema:gf4,handler:async($,Z)=>{p(Z);let Q=Y0(Z);await Z.access.check();let Y=_0(Z);if(!Y)throw Error("User ID required to create virtual MCP");if($.data.pinned===!0)$U0(Z);let{prompts:X,metadata:J,...G}=$.data,W=yd(J);if(G.connections.length>0)await ZU0(Z,Q.id,G.connections.map((N)=>N.connection_id));let K={...G,metadata:W,icon:G.icon??ff4()},H=await Z.storage.virtualMcps.create(Q.id,Y,K),F=xf4(W?.siteSlug);if(F&&G9(F)&&H.id)try{await Z.storage.orgSites.link({slug:F,organizationId:Q.id,projectId:H.id,by:Y})}catch(N){if(!(N instanceof zZ))throw N;console.warn(`[virtual-mcp] project ${H.id} keeps site "${F}" unlinked: ${N.code}`)}if(X?.length&&Z.orgFs&&H.id)await WU0(Z.orgFs,H.id,Y,X);let U=H;if(H.id)try{let N=await U$0(Z,Q.id,H,Y);if(N)await H51(Z,Q.id,H.id,N,Y),U={...H,metadata:{...H.metadata,projectFolderName:N}}}catch(N){console.error("[project-folder] scaffold failed",{projectId:H.id,err:N})}return{item:U}}})});function zE($){return typeof $==="string"||typeof $==="number"}function N51($,Z){let Q=Z.split("."),Y=$;for(let X of Q){if(Y==null||typeof Y!=="object")return;Y=Y[X]}return Y}function hf4($,Z){return $.connections.some((Q)=>Q.connection_id===Z)}function DU0($,Z){if("conditions"in Z){let{operator:W,conditions:K}=Z;if(K.length===0)return!0;switch(W){case"and":return K.every((H)=>DU0($,H));case"or":return K.some((H)=>DU0($,H));case"not":return!K.every((H)=>DU0($,H));default:return!0}}let{field:Q,operator:Y,value:X}=Z,J=Q.join(".");if(J==="connection_id"){if(Y!=="eq"||typeof X!=="string")return!1;return hf4($,X)}let G=N51($,J);switch(Y){case"eq":return G===X;case"gt":return zE(G)&&zE(X)&&G>X;case"gte":return zE(G)&&zE(X)&&G>=X;case"lt":return zE(G)&&zE(X)&&G<X;case"lte":return zE(G)&&zE(X)&&G<=X;case"in":return Array.isArray(X)&&X.includes(G);case"like":if(typeof G!=="string"||typeof X!=="string")return!1;if(X.length>100)return!1;return Vd(X).test(G);case"contains":if(typeof G!=="string"||typeof X!=="string")return!1;return G.toLowerCase().includes(X.toLowerCase());default:return!0}}function uf4($,Z){return[...$].sort((Q,Y)=>{for(let X of Z){let J=X.field.join("."),G=N51(Q,J),W=N51(Y,J),K=0;if(G==null&&W==null)continue;if(G==null)K=X.nulls==="first"?-1:1;else if(W==null)K=X.nulls==="first"?1:-1;else if(typeof G==="string"&&typeof W==="string")K=G.localeCompare(W);else if(typeof G==="number"&&typeof W==="number")K=G-W;else K=String(G).localeCompare(String(W));if(K!==0)return X.direction==="desc"?-K:K}return 0})}var lf4,cf4,gT;var B51=L(()=>{OG();LN();q0();ON();wE();lf4=JF,cf4=aD(bY),gT=h({name:"COLLECTION_VIRTUAL_MCP_LIST",description:"List all MCP virtual MCPs in the organization",annotations:{title:"List Virtual MCPs",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:lf4,outputSchema:cf4,handler:async($,Z)=>{await Z.access.check();let Q=Y0(Z),Y=$.where&&!("conditions"in $.where)&&$.where.field.join(".")==="connection_id"&&$.where.operator==="eq"&&typeof $.where.value==="string"?$.where.value:void 0,X=$.where&&!("conditions"in $.where)&&$.where.field.join(".")==="pinned"&&$.where.operator==="eq"&&typeof $.where.value==="boolean"?$.where.value:void 0,G=Y?await Z.storage.virtualMcps.listByConnectionId(Q.id,Y):await Z.storage.virtualMcps.list(Q.id,X!==void 0?{pinnedOnly:X}:void 0);if($.where)G=G.filter((B)=>DU0(B,$.where));let W=await KY(Z);if(W!==null)G=G.filter((B)=>$X(W,B.id));if($.orderBy&&$.orderBy.length>0)G=uf4(G,$.orderBy);let K=G.length,H=$.offset??0,F=$.limit??100,U=G.slice(H,H+F),N=H+F<K;return{items:U,totalCount:K,hasMore:N}}})});async function hj$($,Z,Q){let Y=await $.storage.virtualMcps.findById(Q);if(Y||!is(Q))return Y;let X=await $.storage.connections.resolveUrlSlug(Z,Q,"project");return X?$.storage.virtualMcps.findById(X.id):null}var uj$=L(()=>{Pw()});import{z as D51}from"zod";var mf4,df4,hT;var L51=L(()=>{LN();q0();ON();wE();uj$();mf4=D51.object({id:D51.string().describe("ID or URL slug of the virtual MCP to retrieve. A slug the project used to have also resolves.")}),df4=D51.object({item:bY.nullable().describe("The retrieved virtual MCP, or null if not found")}),hT=h({name:"COLLECTION_VIRTUAL_MCP_GET",description:"Get a Virtual MCP's configuration, connections, and virtual tools by ID or URL slug.",annotations:{title:"Get Virtual MCP",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:mf4,outputSchema:df4,handler:async($,Z)=>{p(Z);let Q=Y0(Z);await Z.access.check();let Y=await hj$(Z,Q.id,$.id);if(Y&&Y.organization_id!==Q.id)return{item:null};if(!Y)return{item:null};let X=await KY(Z);if(!$X(X,Y.id))return{item:null};return{item:Y}}})});import{z as O51}from"zod";var if4,pf4,uT;var w51=L(()=>{LN();q0();ON();G$0();wE();n61();u61();h61();BU0();if4=O51.object({id:O51.string().describe("ID of the virtual MCP to update"),data:BJ0.describe("Partial virtual MCP data to update")}),pf4=O51.object({item:bY.describe("The updated virtual MCP entity")}),uT=h({name:"COLLECTION_VIRTUAL_MCP_UPDATE",description:"Update a Virtual MCP's name, slug, connection list, or kickstart prompts. Pass `prompts` to replace the agent's conversation starters (full set; empty array clears them).",annotations:{title:"Update Virtual MCP",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:if4,outputSchema:pf4,handler:async($,Z)=>{p(Z);let Q=Y0(Z);await Z.access.check();let Y=_0(Z);if(!Y)throw Error("User ID required to update virtual MCP");let X=await Z.storage.virtualMcps.findById($.id);if(!X)throw Error(`Virtual MCP not found: ${$.id}`);if(X.organization_id!==Q.id)throw Error(`Virtual MCP not found: ${$.id}`);let J=await KY(Z);if(!$X(J,X.id))throw Error(`Virtual MCP not found: ${$.id}`);let{prompts:G,metadata:W,...K}=$.data;aF0(X,W);let H=yd(W);if(H&&X.metadata)H={...X.metadata,...H};else if(H===null&&(X.metadata?.sandboxMap||X.metadata?.siteSlug))H={...X.metadata.sandboxMap?{sandboxMap:X.metadata.sandboxMap}:{},...X.metadata.siteSlug?{siteSlug:X.metadata.siteSlug}:{}};let F={...K,...W!==void 0?{metadata:H}:{}},U=eF0({nextTitle:F.title,currentTitle:X.title,currentSiteSlug:X.metadata?.siteSlug});if(U)F.metadata={...X.metadata,...F.metadata,siteSlug:U};if(F.title!==void 0&&F.title!==X.title){let B=await U$0(Z,Q.id,X,Y).catch((D)=>{return console.error("[project-folder] claim on rename failed",{projectId:X.id,err:D}),null});if(B)F.metadata={...X.metadata,...F.metadata,projectFolderName:B}}if(F.pinned!==void 0&&F.pinned!==X.pinned)$U0(Z);if(F.connections?.length)await ZU0(Z,Q.id,F.connections.map((B)=>B.connection_id));let N=await Z.storage.virtualMcps.update($.id,Y,F);if(G!==void 0&&Z.orgFs)await WU0(Z.orgFs,$.id,Y,G);return{item:N}}})});function E51($){if(!$)return!1;let Z=N$0.join("|");return new RegExp(`permission\\s+"?(?:${Z})"?\\s+is not allowed`,"i").test($)||/permissions exceed what the github app/i.test($)}function lj$($){let Z={...$};for(let Q of N$0)Z[Q]="read";return Z}async function cj$($,Z){let Q={...Z};for(;;){let Y=await $(Q);if(!Y.isError)return{result:Y,grantedPermissions:Q};let X=Y.content?.find((K)=>K.type==="text")?.text,J=N$0.find((K)=>(K in Q));if(!J||!E51(X))return{result:Y,grantedPermissions:Q};let{[J]:G,...W}=Q;Q=W}}function nf4($){if(!$||typeof $!=="object"||Array.isArray($))return LU0;let Z=$;if(Object.values(Z).some((Q)=>typeof Q!=="string"))return LU0;return Z}function tf4($){if(typeof $!=="number"||!Number.isFinite($)||!Number.isInteger($)||$<=0)return;return $}function XZ($){let Z=$.metadata?.repoScope;if(!Z||typeof Z.installationId!=="number"||!Number.isFinite(Z.installationId)||!Number.isInteger(Z.installationId)||Z.installationId<=0||typeof Z.owner!=="string"||typeof Z.repo!=="string"||Z.owner.length===0||Z.repo.length===0)return null;let Q=tf4(Z.repositoryId);return{sourceConnectionId:typeof Z.sourceConnectionId==="string"?Z.sourceConnectionId:void 0,installationId:Z.installationId,repositoryId:Q,owner:Z.owner,repo:Z.repo,permissions:nf4(Z.permissions),grantProvider:Z.grantProvider==="github-mcp"?"github-mcp":void 0}}function AE($){return $.metadata?.orgShared===!0}function mj$($){let Z=new Set,Q=[];for(let Y of $??[]){if(Y.status!=="active")continue;let X=XZ(Y);if(X===null)continue;let J=j51(X.owner,X.repo);if(Z.has(J))continue;Z.add(J),Q.push(`${X.owner}/${X.repo}`)}return Q}function OU0($,Z,Q){let Y=j51(Z,Q),X=($??[]).filter((J)=>{if(J.status&&J.status!=="active")return!1;let G=XZ(J);return G!==null&&j51(G.owner,G.repo)===Y});return X.find(AE)??X[0]??null}var LU0,N$0,j51=($,Z)=>`${$}/${Z}`.toLowerCase();var wG=L(()=>{LU0={contents:"write",metadata:"read",pull_requests:"write",issues:"write",checks:"read",deployments:"read",statuses:"read"},N$0=["statuses","deployments","checks"]});function dj$($){return KQ($)!==null}var ij$=L(()=>{R8()});import{z as P51}from"zod";var of4,sf4,lT;var z51=L(()=>{LN();wG();HK();q0();ON();G$0();K51();wE();ij$();of4=P51.object({id:P51.string().describe("ID of the virtual MCP to delete")}),sf4=P51.object({item:bY.describe("The deleted virtual MCP entity")}),lT=h({name:"COLLECTION_VIRTUAL_MCP_DELETE",description:"Permanently delete a Virtual MCP and its virtual tools.",annotations:{title:"Delete Virtual MCP",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:of4,outputSchema:sf4,handler:async($,Z)=>{p(Z);let Q=Y0(Z);if(await Z.access.check(),dj$($.id))throw Error(`Virtual MCP not found: ${$.id}`);let Y=await Z.storage.virtualMcps.findById($.id);if(!Y)throw Error(`Virtual MCP not found: ${$.id}`);if(Y.organization_id!==Q.id)throw Error(`Virtual MCP not found: ${$.id}`);let X=await KY(Z);if(!$X(X,Y.id))throw Error(`Virtual MCP not found: ${$.id}`);if(await Z.storage.virtualMcps.delete($.id),Z.orgFs){let G=_0(Z)??"system";await s61(Z.orgFs,$.id,G),await xj$(Z.orgFs,Q.id,Y,G).catch((W)=>console.error("[project-folder] delete failed",{projectId:$.id,err:W}))}let J=Y.metadata?.repository?.connectionId;if(J)try{let G=await Z.storage.connections.findById(J,Q.id),W=G&&(AE(G)||(await Z.storage.virtualMcps.listByConnectionId(Q.id,J)).length>0||await Z.storage.connections.isReferencedByThread(J));if(G&&XZ(G)&&!W){let H=await new o5(Z.db,Z.vault).get(J);if(H?.accessToken)try{await fetch("https://api.github.com/installation/token",{method:"DELETE",headers:{Authorization:`Bearer ${H.accessToken}`,Accept:"application/vnd.github+json","X-GitHub-Api-Version":"2022-11-28"},signal:AbortSignal.timeout(5000)})}catch{}await Z.storage.connections.delete(J)}}catch(G){console.error("[VIRTUAL_MCP_DELETE] failed to tear down repo-scoped connection",{childConnectionId:J,error:G.message})}return{item:Y}}})});function pj$($,Z){let Q=$!==null&&typeof $==="object"&&!Array.isArray($)?$:null;if(Z===void 0)return Q;return{...Q??{},...Z}}import{z as UJ}from"zod";var rf4,cT;var A51=L(()=>{LN();q0();ON();wE();rf4=UJ.object({connectionId:UJ.string(),toolName:UJ.string(),label:UJ.string(),icon:UJ.string().nullable().optional()}),cT=h({name:"VIRTUAL_MCP_PINNED_VIEWS_UPDATE",description:"Update the pinned sidebar views for a virtual MCP. Replaces all current pins.",annotations:{title:"Update Pinned Views",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:UJ.object({virtualMcpId:UJ.string().describe("Virtual MCP ID"),pinnedViews:UJ.array(rf4).describe("Pinned views to set for the virtual MCP sidebar"),layout:UJ.object({defaultMainView:UJ.object({type:UJ.string(),id:UJ.string().optional(),toolName:UJ.string().optional()}).nullable().optional(),chatDefaultOpen:UJ.boolean().nullable().optional()}).optional()}),outputSchema:UJ.object({item:bY.nullable()}),handler:async($,Z)=>{p(Z);let Q=Y0(Z);await Z.access.check();let{virtualMcpId:Y,pinnedViews:X,layout:J}=$,G=_0(Z),W=await Z.storage.virtualMcps.findById(Y);if(!W)throw Error(`Virtual MCP not found: ${Y}`);if(W.organization_id!==Q.id)throw Error(`Virtual MCP not found: ${Y}`);let K=await KY(Z);if(!$X(K,W.id))throw Error(`Virtual MCP not found: ${Y}`);let H=W.metadata?.ui??{},F={...H,pinnedViews:X.length>0?X:null,layout:pj$(H.layout,J)};return{item:await Z.storage.virtualMcps.update(Y,G??"system",{metadata:{...W.metadata,ui:F}})}}})});import{z as QL}from"zod";var af4,ef4,T51;var nj$=L(()=>{q0();af4=QL.object({ids:QL.array(QL.string()).max(1000).describe("Virtual MCP ids to look up")}),ef4=QL.object({items:QL.array(QL.object({id:QL.string(),last_used_at:QL.string().optional(),last_used_by:QL.string().optional()}))}),T51=h({name:"VIRTUAL_MCP_LAST_USED_LIST",description:"Get last-used info (timestamp + user) for one or more virtual MCPs, derived from the most recent thread per agent.",annotations:{title:"List Virtual MCP Last Used",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:af4,outputSchema:ef4,handler:async($,Z)=>{p(Z),Y0(Z),await Z.access.check();let Q=await Z.storage.threads.findLastUsedByVirtualMcpIds($.ids);return{items:$.ids.map((Y)=>({id:Y,last_used_at:Q.get(Y)?.last_used_at,last_used_by:Q.get(Y)?.last_used_by}))}}})});var tj$=L(()=>{U51();B51();L51();w51();z51();A51();nj$();BU0()});import{z as ZX}from"zod";var R51;var oj$=L(()=>{v6();q0();R51=h({name:"MONITORING_HEATMAP",description:"Get tool-call volume broken down by agent and tool name, for spotting heavily-used tools per agent.",annotations:{title:"Get Tool-Call Heatmap",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:ZX.object({startDate:ZX.string().datetime().optional().describe("Filter by start date (ISO 8601 datetime string)"),endDate:ZX.string().datetime().optional().describe("Filter by end date (ISO 8601 datetime string)"),virtualMcpIds:ZX.array(ZX.string()).max(100).optional().describe("Filter by specific agent (Virtual MCP) IDs"),excludeConnectionIds:ZX.array(ZX.string()).max(100).optional().describe("Exclude tool calls from these connection IDs"),limit:ZX.number().int().min(1).max(1000).optional().describe("Max number of (agent, tool) cells to return")}),outputSchema:ZX.object({cells:ZX.array(ZX.object({virtualMcpId:ZX.string().nullable(),toolName:ZX.string(),calls:ZX.number(),errors:ZX.number(),outputSize:ZX.number().describe("Sum of tool-output character length \u2014 a proxy for context weight, not LLM token count")}))}),handler:async($,Z)=>{let Q=Y0(Z);return await Z.access.check(),await xJ(),Z.storage.monitoring.queryToolCallHeatmap({organizationId:Q.id,startDate:$.startDate?new Date($.startDate):void 0,endDate:$.endDate?new Date($.endDate):void 0,filters:{virtualMcpIds:$.virtualMcpIds,excludeConnectionIds:$.excludeConnectionIds},limit:$.limit})}})});import{z as R9}from"zod";var q51;var sj$=L(()=>{v6();q0();q51=h({name:"MONITORING_LOG_GET",description:"Get a single monitoring log by ID with full input and output data.",annotations:{title:"Get Monitoring Log",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:R9.object({id:R9.string().describe("Log ID to fetch")}),outputSchema:R9.object({log:R9.object({id:R9.string().optional(),organizationId:R9.string(),connectionId:R9.string(),toolName:R9.string(),input:R9.record(R9.string(),R9.unknown()),output:R9.record(R9.string(),R9.unknown()),isError:R9.boolean(),errorMessage:R9.string().nullish(),durationMs:R9.number(),timestamp:R9.string(),userId:R9.string().nullish(),requestId:R9.string(),userAgent:R9.string().nullish(),virtualMcpId:R9.string().nullish(),properties:R9.record(R9.string(),R9.string()).nullish()}).nullable().describe("The monitoring log, or null if not found")}),handler:async($,Z)=>{await Z.access.check(),await xJ();let Q=Y0(Z),Y=await Z.storage.monitoring.getById(Q.id,$.id);if(!Y)return{log:null};return{log:{...Y,timestamp:Y.timestamp instanceof Date?Y.timestamp.toISOString():Y.timestamp}}}})});import{z as a8}from"zod";var Zy4,M51;var rj$=L(()=>{v6();q0();Zy4=a8.object({id:a8.string().optional().describe("Unique log identifier"),organizationId:a8.string().describe("Organization ID"),connectionId:a8.string().describe("Connection ID"),toolName:a8.string().describe("Name of the tool that was called"),isError:a8.boolean().describe("Whether the call resulted in an error"),errorMessage:a8.string().nullish().describe("Error message if applicable"),durationMs:a8.number().describe("Call duration in milliseconds"),timestamp:a8.string().describe("ISO 8601 timestamp of the call"),userId:a8.string().nullish().describe("User who triggered the call"),requestId:a8.string().describe("Unique request identifier"),userAgent:a8.string().nullish().describe("Client identifier (x-studio-client header)"),virtualMcpId:a8.string().nullish().describe("Virtual MCP (Agent) ID if routed through an agent"),properties:a8.record(a8.string(),a8.string()).nullish().describe("Custom key-value metadata attached to the log")}),M51=h({name:"MONITORING_LOGS_LIST",description:"List monitoring logs for tool calls with filtering and pagination.",annotations:{title:"List Monitoring Logs",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:a8.object({connectionId:a8.string().optional().describe("Filter by connection ID"),excludeConnectionIds:a8.array(a8.string()).optional().describe("Exclude logs from these connection IDs (e.g. system connections)"),virtualMcpId:a8.string().optional().describe("Filter by Virtual MCP (Agent) ID"),toolName:a8.string().optional().describe("Filter by tool name"),isError:a8.boolean().optional().describe("Filter by error status"),startDate:a8.string().datetime().optional().describe("Filter by start date (ISO 8601 datetime string)"),endDate:a8.string().datetime().optional().describe("Filter by end date (ISO 8601 datetime string)"),limit:a8.number().default(20).describe("Maximum number of results"),offset:a8.number().default(0).describe("Offset for pagination"),properties:a8.record(a8.string(),a8.string()).optional().describe("Filter by exact property key=value matches"),propertyKeys:a8.array(a8.string()).optional().describe("Filter by logs that have these property keys"),propertyPatterns:a8.record(a8.string(),a8.string()).optional().describe("Filter by property value patterns (SQL LIKE, use % as wildcard)"),propertyInValues:a8.record(a8.string(),a8.string()).optional().describe("Filter by exact match within comma-separated values (e.g., user_tags in 'Engineering')")}),outputSchema:a8.object({logs:a8.array(Zy4).describe("Array of monitoring logs"),total:a8.number().describe("Total number of logs matching filters"),offset:a8.number().describe("Current offset for pagination"),limit:a8.number().describe("Current limit for pagination")}),handler:async($,Z)=>{await Z.access.check(),await xJ();let Q=Y0(Z),X=$.properties||$.propertyKeys||$.propertyPatterns||$.propertyInValues?{properties:$.properties,propertyKeys:$.propertyKeys,propertyPatterns:$.propertyPatterns,propertyInValues:$.propertyInValues}:void 0,J={organizationId:Q.id,connectionId:$.connectionId,excludeConnectionIds:$.excludeConnectionIds,virtualMcpId:$.virtualMcpId,toolName:$.toolName,isError:$.isError,startDate:$.startDate?new Date($.startDate):void 0,endDate:$.endDate?new Date($.endDate):void 0,limit:$.limit,offset:$.offset,propertyFilters:X},G=await Z.storage.monitoring.query(J);return{logs:G.logs.map(({input:W,output:K,...H})=>({...H,timestamp:H.timestamp instanceof Date?H.timestamp.toISOString():H.timestamp})),total:G.total,offset:$.offset,limit:$.limit}}})});import{z as f$}from"zod";var I51;var aj$=L(()=>{v6();q0();I51=h({name:"MONITORING_STATS",description:"Get aggregated statistics (counts, latency, error rates) for tool call monitoring.",annotations:{title:"Get Monitoring Stats",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:f$.object({startDate:f$.string().datetime().optional().describe("Filter by start date (ISO 8601 datetime string)"),endDate:f$.string().datetime().optional().describe("Filter by end date (ISO 8601 datetime string)"),interval:f$.string().regex(/^\d+[mhd]$/).optional().describe("Bucket interval for timeseries data (e.g. 1m, 5m, 2h, 1d). When provided, returns timeseries array."),connectionIds:f$.array(f$.string()).max(100).optional().describe("Filter by specific connection IDs (max 100)"),excludeConnectionIds:f$.array(f$.string()).max(100).optional().describe("Exclude specific connection IDs (max 100)"),toolNames:f$.array(f$.string()).max(100).optional().describe("Filter by specific tool names (max 100)"),status:f$.enum(["success","error"]).optional().describe("Filter metrics by execution status"),topN:f$.number().int().min(1).max(20).optional().describe("When provided with interval, also return top tools and their timeseries"),userIds:f$.array(f$.string()).max(100).optional().describe("Filter LLM usage by user IDs (only applied when llmUsage is true)"),llmUsage:f$.boolean().optional().describe("Aggregate LLM-call usage (tokens + USD cost) from raw log rows for the given connection. Returns token/cost totals and timeseries. Requires interval.")}),outputSchema:f$.object({totalCalls:f$.number().describe("Total number of tool calls"),errorRate:f$.number().optional().describe("Error rate as a decimal (0 to 1)"),avgDurationMs:f$.number().describe("Average call duration in milliseconds"),errorRatePercent:f$.string().optional().describe("Error rate as a percentage string"),totalErrors:f$.number().optional().describe("Total number of errors"),p50DurationMs:f$.number().optional().describe("50th percentile duration in milliseconds"),p95DurationMs:f$.number().optional().describe("95th percentile duration in milliseconds"),connectionBreakdown:f$.array(f$.object({connectionId:f$.string(),calls:f$.number(),errors:f$.number(),errorRate:f$.number(),avgDurationMs:f$.number()})).optional().describe("Per-connection metric breakdown"),totalInputTokens:f$.number().optional().describe("Total input tokens (LLM usage mode)"),totalOutputTokens:f$.number().optional().describe("Total output tokens (LLM usage mode)"),totalTokens:f$.number().optional().describe("Total tokens (LLM usage mode)"),totalCostUsd:f$.number().optional().describe("Total USD cost (LLM usage mode; only non-zero for providers that report cost)"),topTools:f$.array(f$.object({toolName:f$.string(),connectionId:f$.string().nullable(),calls:f$.number(),inputTokens:f$.number().optional(),outputTokens:f$.number().optional(),costUsd:f$.number().optional()})).optional().describe("Top tools ranked by calls"),topToolsTimeseries:f$.array(f$.object({timestamp:f$.string(),toolName:f$.string(),calls:f$.number(),errors:f$.number(),avg:f$.number(),p95:f$.number()})).optional().describe("Per-tool metric timeseries for the top tools"),timeseries:f$.array(f$.object({timestamp:f$.string(),calls:f$.number(),errors:f$.number(),errorRate:f$.number(),avg:f$.number(),p50:f$.number(),p95:f$.number(),inputTokens:f$.number().optional(),outputTokens:f$.number().optional(),totalTokens:f$.number().optional(),costUsd:f$.number().optional()})).optional().describe("Timeseries data points bucketed by interval")}),handler:async($,Z)=>{let Q=Y0(Z);if(await Z.access.check(),await xJ(),$.interval&&$.llmUsage)return Z.storage.monitoring.queryLlmUsageStats({organizationId:Q.id,interval:$.interval,connectionId:$.connectionIds?.[0]??"decopilot",startDate:$.startDate?new Date($.startDate):void 0,endDate:$.endDate?new Date($.endDate):void 0,userIds:$.userIds,topN:$.topN});if($.interval){let X=await Z.storage.monitoring.queryMetricTimeseries({organizationId:Q.id,interval:$.interval,startDate:$.startDate?new Date($.startDate):void 0,endDate:$.endDate?new Date($.endDate):void 0,filters:{connectionIds:$.connectionIds,excludeConnectionIds:$.excludeConnectionIds,toolNames:$.toolNames,status:$.status}});if(!$.topN)return X;let J=await Z.storage.monitoring.queryMetricTopToolsTimeseries({organizationId:Q.id,interval:$.interval,startDate:$.startDate?new Date($.startDate):void 0,endDate:$.endDate?new Date($.endDate):void 0,topN:$.topN,filters:{connectionIds:$.connectionIds,excludeConnectionIds:$.excludeConnectionIds,toolNames:$.toolNames,status:$.status}});return{...X,topTools:J.topTools,topToolsTimeseries:J.timeseries}}let Y=await Z.storage.monitoring.getStats({organizationId:Q.id,startDate:$.startDate?new Date($.startDate):void 0,endDate:$.endDate?new Date($.endDate):void 0});return{...Y,errorRatePercent:(Y.errorRate*100).toFixed(2)}}})});import{z as NJ}from"zod";var V51;var ej$=L(()=>{v6();q0();V51=h({name:"MONITORING_THREAD_USAGE",description:"Aggregate LLM token usage and USD cost per thread for the given thread IDs.",annotations:{title:"Get Thread Usage",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:NJ.object({threadIds:NJ.array(NJ.string()).min(1).max(500).describe("Thread IDs to aggregate usage for (max 500)"),connectionId:NJ.string().optional().describe("LLM connection ID (defaults to 'decopilot')"),startDate:NJ.string().datetime().optional().describe("Filter by start date (ISO 8601 datetime string)"),endDate:NJ.string().datetime().optional().describe("Filter by end date (ISO 8601 datetime string)")}),outputSchema:NJ.object({items:NJ.array(NJ.object({threadId:NJ.string(),calls:NJ.number(),inputTokens:NJ.number(),outputTokens:NJ.number(),totalTokens:NJ.number(),costUsd:NJ.number()}))}),handler:async($,Z)=>{let Q=Y0(Z);return await Z.access.check(),await xJ(),{items:await Z.storage.monitoring.queryThreadUsage({organizationId:Q.id,connectionId:$.connectionId??"decopilot",threadIds:$.threadIds,startDate:$.startDate?new Date($.startDate):void 0,endDate:$.endDate?new Date($.endDate):void 0})}}})});var $E$=L(()=>{oj$();sj$();rj$();aj$();ej$()});function wU0($){return typeof $==="string"&&Yy4.has($.trim().toLowerCase())}var Yy4;var k51=L(()=>{Yy4=new Set([".well-known","_admin","_users","api","auth","choose-editor","cli","commerce-onboarding","dbos-queue-depth","health","hosted-run-pending","login","mcp","metrics","oauth","oauth-proxy","onboarding","org","report","reports-onboarding","reset-password"])});import{z as v3}from"zod";var S51;var ZE$=L(()=>{q0();k51();S51=h({name:"ORGANIZATION_CREATE",description:"Create a new organization. The caller becomes the owner automatically.",annotations:{title:"Create Organization",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!1,openWorldHint:!1},inputSchema:v3.object({slug:v3.string().min(1).max(50).regex(/^[a-z0-9-]+$/,"Slug must be lowercase alphanumeric with hyphens").refine(($)=>!wU0($),"Slug is reserved by Studio"),name:v3.string().min(1).max(255),description:v3.string().max(500).optional()}),outputSchema:v3.object({id:v3.string(),name:v3.string(),slug:v3.string(),logo:v3.string().nullable().optional(),metadata:v3.any().optional(),createdAt:v3.string().datetime().describe("ISO 8601 timestamp"),members:v3.array(v3.any()).optional()}),handler:async($,Z)=>{p(Z),await Z.access.check();let Q=_0(Z);if(!Q)throw Error("User ID required to create organization");let Y=await Z.boundAuth.organization.create({name:$.name,slug:$.slug,metadata:$.description?{description:$.description}:void 0,userId:Q});if(!Y)throw Error("Failed to create organization");return{...Y,createdAt:Y.createdAt instanceof Date?Y.createdAt.toISOString():Y.createdAt}}})});import{z as jN}from"zod";var C51;var QE$=L(()=>{q0();C51=h({name:"ORGANIZATION_LIST",description:"List organizations the current user belongs to.",annotations:{title:"List Organizations",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},_meta:{ui:{visibility:"app"}},inputSchema:jN.object({}),outputSchema:jN.object({organizations:jN.array(jN.object({id:jN.string(),name:jN.string(),slug:jN.string(),logo:jN.string().nullable().optional(),metadata:jN.any().optional(),createdAt:jN.string().datetime().describe("ISO 8601 timestamp")}))}),handler:async($,Z)=>{if(p(Z),await Z.access.check(),!_0(Z))throw Error("User ID required to list organizations");return{organizations:(await Z.boundAuth.organization.list()).map((Y)=>({...Y,createdAt:Y.createdAt instanceof Date?Y.createdAt.toISOString():Y.createdAt}))}}})});import{z as UK}from"zod";var _51;var YE$=L(()=>{q0();_51=h({name:"ORGANIZATION_GET",description:"Get an organization's details, members, and settings by slug or ID.",annotations:{title:"Get Organization",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:UK.object({}),outputSchema:UK.object({id:UK.string(),name:UK.string(),slug:UK.string(),logo:UK.string().nullable().optional(),metadata:UK.any().optional(),createdAt:UK.string().datetime().describe("ISO 8601 timestamp"),members:UK.array(UK.any()).optional(),invitations:UK.array(UK.any()).optional()}),handler:async($,Z)=>{p(Z),await Z.access.check();let Q=Z.organization?.id;if(!Q)throw Error("Organization ID required (no active organization in context)");let Y=await Z.boundAuth.organization.get(Q);if(!Y)throw Error("No active organization found");let X=new Date,J=Y.invitations?.filter((G)=>new Date(G.expiresAt)>X);return{...Y,invitations:J,createdAt:Y.createdAt instanceof Date?Y.createdAt.toISOString():Y.createdAt}}})});import{z as GF}from"zod";var v51;var XE$=L(()=>{q0();v51=h({name:"ORGANIZATION_UPDATE",description:"Update an organization's name or description.",annotations:{title:"Update Organization",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:GF.object({id:GF.string(),name:GF.string().min(1).max(255).optional(),description:GF.string().max(500).optional()}),outputSchema:GF.object({id:GF.string(),name:GF.string(),slug:GF.string(),logo:GF.string().nullable().optional(),metadata:GF.any().optional(),createdAt:GF.string().datetime().describe("ISO 8601 timestamp")}),handler:async($,Z)=>{if(p(Z),await Z.access.check(),$.id!==Z.organization?.id)throw Error("Organization ID does not match authenticated organization");let Q={};if($.name)Q.name=$.name;if($.description!==void 0){let X=await Z.boundAuth.organization.get($.id);Q.metadata={...va(X?.metadata),description:$.description}}let Y=await Z.boundAuth.organization.update({organizationId:$.id,data:Q});if(!Y)throw Error("Failed to update organization");return{...Y,createdAt:Y.createdAt instanceof Date?Y.createdAt.toISOString():Y.createdAt}}})});import{sql as Xy4}from"kysely";import{z as B$0}from"zod";var b51;var JE$=L(()=>{R8();q0();fF0();b51=h({name:"ORGANIZATION_DELETE",description:"Archive an organization (soft delete).",annotations:{title:"Delete Organization",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:B$0.object({id:B$0.string()}),outputSchema:B$0.object({success:B$0.boolean(),id:B$0.string()}),handler:async($,Z)=>{if(p(Z),await Z.access.check(),$.id!==Z.organization?.id)throw Error("Organization ID does not match authenticated organization");let Q=await Z.boundAuth.organization.get($.id),Y=va(Q?.metadata);if(Y.archived===!0)return{success:!0,id:$.id};let X=await Z.storage.connections.findById(s8.REPORTS($.id),$.id);await Z.boundAuth.organization.update({organizationId:$.id,data:{metadata:{...Y,archived:!0,archivedAt:new Date().toISOString()}}}),await Xy4`
|
|
@@ -1571,7 +1571,7 @@ ${X}`:X}case"media":return"";case"mediaSingle":case"mediaGroup":return Hp(lN(Q),
|
|
|
1571
1571
|
`),j=h40(Z.id,Q,Y,X),E=bG1(j),{isNew:P}=await rI0($,Z,{runClass:"reviewer",triggerId:G,title:`${CU[Q]}: ${Z.title}`,rulesColumn:D1.review,prompt:O,system:w,temperature:0.3,modelClass:J,agent:{instructions:B},...F?{repo:F}:{},fence:{threadId:E,workflowID:j}}).catch(async(z)=>{throw await $.storage.threads.delete(E).catch((A)=>console.error(`[task-board] ${Q} fence thread cleanup failed`,A)),z});if(!P)return!1;await r5($,{taskBoardItemId:Z.id,action:"review_requested",actorId:null,data:{reviewer:Q}});let T=await $.storage.taskBoard.getById(Z.id,W);if(T)w8(W,T);return!0}var dQ6;var xG1=L(()=>{m8();jX();CG1();oI0();fG1();vG1();a5();dQ6={reviewer:`You are the Reviewer, the LAST automated run on this task: you judge the pull request another run opened for it, and record the verdict. An approval sends the task to QA, where a person checks it.
|
|
1572
1572
|
`+"Before deciding, RECORD your pass as a task comment \u2014 REQUIRED: a "+'verdict with no comment is an incomplete run and you will be asked for one. The record is internal: written for the agents on this task, so be as technical as needed.\nThen TELL THE PERSON who reviews the task, in one comment with `audience: "human"`. They do not read code: write in the language the task is written in, with no file names, code or engineering jargon. Approving a visual change: say it is approved and embed the before/after screenshots there '+"\u2014 screenshots only in the internal record reach no one, and the machine "+`check does not count them. Approving a change with no visual surface: skip this comment, and write the exact words \`${me}\` `+"in the record and name why (backend-only, config, test-only) \u2014 that "+"literal is what a machine check looks for, so no paraphrase of it "+"counts. Requesting changes: this comment is REQUIRED \u2014 say what they "+"have to decide or do, and why, in terms of the product.\nThen DECIDE. `request_changes` hands the card to a human; it does not start another agent round. NEVER end your run without having called `TASK_BOARD_REVIEW_DECISION`: a run that stops to wait on a background task, or that runs low on room, must decide on what it knows first. An unrecorded verdict strands the card and is the one failure this run cannot leave behind."}});function u40($,Z){if($.status===null||th$.has($.status))return!1;return!V40({updated_at:$.lastActiveAt,last_progress_at:null},Z)}function yG1($,Z){return $.threads.some((Q)=>!O3.some((Y)=>uH(Q.title,Y))&&u40(Q,Z))}function tQ6($,Z){return Z-$>=nQ6}function oQ6($,Z,Q,Y){if($||Z!==!1)return!1;return tQ6(Q,Y)}async function jp($,Z,Q){let Y=await $.storage.organizationSettings.get(Z.organizationId),X=Q?.kinds??gA(Y?.flags);if(X.length===0)return[];if(yG1(Z,Date.now()))return[];let J=o9(Y?.flags,"cheap_reviewer_model")?"reviewer":"default",G=await $.storage.taskBoard.listActivity(Z.id,Z.organizationId),W=Z.reviewCycleStartedAt,K=kD(G,W),H=new Date(K),F=kj(G,{cycleStartedAt:W}),U=[];return await Promise.all(X.map(async(N)=>{let B=F.has(N);if(!B){let w=$Y6(G,K),j=eQ6(Z,N,K,w);if(j){await XY6($,Z,N,j).catch((E)=>console.error(`[task-board] ${N} verdict nudge failed`,E));return}if(QY6(w,Date.now()))return}if(rQ6(Z,N,K,Date.now(),B)){await TF($,Z,`${CU[N]} failed ${gG1} times on `+"this review \u2014 it will not be retried");return}if(Q?.previewMatchesHead===!1){if(oQ6(B,Q.previewMatchesHead,K,Date.now()))await TF($,Z,"the pull request's deploy preview is not showing its latest commit (its checks never went green), so the Reviewer cannot verify this change against what the PR actually does");return}if(aQ6(Z,N,K,Date.now(),B))return;let D=sQ6(Z,N,K,Date.now(),B);if(await JY6($,Z,{kind:N,cycleAt:H,attempt:D,modelClass:J}).catch((w)=>{return console.error(`[task-board] ${N} reviewer enqueue failed`,w),!1}))U.push(N)})),U}function sQ6($,Z,Q,Y=Date.now(),X=!0){return $.threads.filter((J)=>uH(J.title,Z)&&hG1(J,Y,X)&&new Date(J.createdAt).getTime()>=Q).length}function hG1($,Z,Q=!0){if($.status==="failed")return!0;if($.status!==null&&th$.has($.status))return!Q;return $.status!==null&&!u40($,Z)}function oh$($,Z,Q,Y=Date.now()){return $.threads.filter((X)=>{if(!uH(X.title,Z))return!1;return u40(X,Y)||new Date(X.createdAt).getTime()>=Q})}function rQ6($,Z,Q,Y=Date.now(),X=!0){let J=oh$($,Z,Q,Y);return J.length>0&&J.every((G)=>hG1(G,Y,X))&&J.length>=gG1}function aQ6($,Z,Q,Y=Date.now(),X=!0){let J=oh$($,Z,Q,Y);if(J.length===0)return!1;if(J.some((W)=>u40(W,Y)))return!0;let G=J.filter((W)=>hG1(W,Y,X));if(G.length>=gG1)return!0;return G.length!==J.length}function eQ6($,Z,Q,Y,X=Date.now()){return $.threads.find((J)=>uH(J.title,Z)&&J.status==="completed"&&!u40(J,X)&&new Date(J.createdAt).getTime()>=Q&&!Y.has(J.threadId))??null}function $Y6($,Z){let Q=new Map;for(let Y of $){if(Y.action!=="review_verdict_requested")continue;let X=new Date(Y.occurredAt).getTime();if(X<Z)continue;let J=Y.data?.threadId;if(typeof J==="string")Q.set(J,X)}return Q}function QY6($,Z){for(let Q of $.values())if(Z-Q<ZY6)return!0;return!1}function YY6($){return[`Your ${CU[$]} run ended without recording a decision, so the task is stuck: nothing ships and nobody is told why. A review that reaches no verdict is not a review.`,"","Do exactly ONE thing in this run and then stop:","- Call `TASK_BOARD_REVIEW_DECISION` now, with the verdict your review already reached and notes that say what you checked.","- Approve ONLY if you actually exercised the change and it holds. If you could not finish \u2014 a check never came back, a preview never rendered, you ran out of room \u2014 `request_changes` and say exactly what is unresolved. That hands the card to a person, which is the correct outcome for an unfinished review.","- Do NOT re-run the review, do NOT change any code, and do NOT wait on any background task: whatever you know right now is the verdict."].join(`
|
|
1573
1573
|
`)}async function XY6($,Z,Q,Y){let X=await $.storage.threads.get(Y.threadId);if(!X||X.message_storage_version!==2)return;await $.storage.taskBoard.recordActivity({taskBoardItemId:Z.id,action:"review_verdict_requested",actorId:null,data:{reviewer:Q,threadId:Y.threadId}}),console.warn(`[task-board] ${Q} reviewer on ${Z.id} completed with no verdict \u2014 `+"asking for one"),await Fp($,Z,X,{messageId:`review-verdict-${Y.threadId}`,prompt:YY6(Q),workflowID:`review-verdict:${Y.threadId}`,runClass:"reviewer"})}async function JY6($,Z,Q){let Y=await $.storage.automations.findBuiltinTrigger(Z.organizationId,zm);if(!Y)return console.warn(`[task-board] org ${Z.organizationId} has no built-in Reviewer yet; review of ${Z.id} waits`),!1;let X=h40(Z.id,Q.kind,Q.cycleAt,Q.attempt);return await MK({automationId:Y.automationId,organizationId:Z.organizationId,triggerId:Y.triggerId,target:{kind:"card",itemId:Z.id,columnKey:D1.review,eventKey:X,movedBy:null,review:{kind:Q.kind,cycleAt:Q.cycleAt.toISOString(),attempt:Q.attempt,modelClass:Q.modelClass}}},{idempotencyKey:`${X}:${Math.floor(Date.now()/60000)}`}),!0}var th$,nQ6=1800000,gG1=2,ZY6=600000;var aI0=L(()=>{m8();a5();xI0();iZ();RF();_U();xG1();th$=new Set(["completed","failed","expired"])});function GY6($,Z){return $.status===D1.release&&$.assigneeId===F8&&Z===!0}function uG1($){return $.filter((Q)=>Q.action==="merge_conflict_resolution").length>=sh$}async function eI0($,Z,Q,Y){if(!GY6(Q,Y.conflict))return!1;let J=(await $.storage.organizationSettings.get(Z))?.flags??{};if(!hJ$(J))return!1;let G=gA(J),W=await $.storage.taskBoard.listActivity(Q.id,Z);if(!Pm(W,G,{cycleStartedAt:Q.reviewCycleStartedAt,verifiedOnly:!0}))return!1;if(uG1(W))return console.warn(`[task-board] conflict auto-resolve cap (${sh$}) reached on task ${Q.id} \u2014 leaving the PR for a human`),!1;let K=Y.pr,H=await $.storage.taskBoard.claimConflictResolution(Q.id,Z,Q.updatedBy);if(!H)return!1;w8(Z,H);try{await xL($,H,{pr:{number:K.number,url:K.url},resolveConflict:!0})}catch(F){throw await rh$($,H,F).catch(()=>!1),await $.storage.taskBoard.update(H.id,Z,{status:D1.release},"system").then((U)=>w8(Z,U)).catch((U)=>console.error("[task-board] conflict-resolution status revert failed",U)),F}return await r5($,{taskBoardItemId:Q.id,action:"merge_conflict_resolution",actorId:null,data:{prNumber:K.number}}),!0}var sh$=3;var $V0=L(()=>{m8();iZ();jX();a5();fL()});import{DBOS as mG1}from"@dbos-inc/dbos-sdk";function eh$($){lG1=$}async function FY6($,Z){if(!lG1)throw Error("[task-board-github-read] runtime not initialized \u2014 setTaskBoardGithubReadRuntime() must run before the workflow fires");let Q=await n3(lG1.db,$);if(!Q)return cG1;return await Zu$(Q,$,Z)}async function UY6($,Z){return await mG1.runStep(()=>FY6($,Z),{name:"readPrState"})}function $u$(){if(ZV0)return;ZV0=mG1.registerWorkflow(UY6,{name:"taskBoardGithubReadWorkflow"})}async function Ep($,Z){if(!ZV0)return cG1;try{return await(await mG1.startWorkflow(ZV0,{queueName:Mz,timeoutMS:HY6})($,Z)).getResult()}catch(Q){return console.error("[task-board-github-read] throttled PR read failed",Q),cG1}}var WY6=20,KY6=4,HY6=60000,ah$,lG1=null,cG1,ZV0=null;var l40=L(()=>{Hg();MQ();ah$={concurrency:KY6,rateLimit:{limitPerPeriod:WY6,periodSec:60}};cG1={state:null,merged:null,checksStatus:null,conflict:null}});import{createHash as NY6}from"crypto";class Ug{config;options;now;kv=null;codec=DE();revalidating=new Set;fallback;placeholderFallback=new Map;static MAX_PLACEHOLDER_FALLBACK_ENTRIES=1000;constructor($,Z,Q=()=>Date.now()){this.config=$;this.options=Z;this.now=Q;let Y={revalidateAfterMs:$.revalidateAfterMs,maxStaleMs:$.maxStaleMs,maxValueBytes:Qu$};this.fallback=new sF0({"tools/call":Y,"resources/read":Y,"prompts/get":Y})}async init($){if($){this.kv=$;return}let Z=this.options.getJetStream();if(!Z)return;this.kv=await new Xu$.Kvm(Z).create(this.config.bucket,{storage:Yu$.StorageType.Memory,ttl:this.config.maxStaleMs,maxValueSize:Qu$})}storageKey($,Z){let Q=NY6("sha256").update(Z).digest("hex").slice(0,32);return`${$}.${Q}`}async fetch($){let{namespace:Z,key:Q,fetchLive:Y,onRevalidation:X}=$,{cache:J,maxStaleMs:G,revalidateAfterMs:W}=this.config;if(!this.kv)return this.fallback.fetch({type:"tools/call",connectionId:Z,scope:{kind:"org"},params:{key:Q},fetchLive:Y,onRevalidation:X});let K=this.storageKey(Z,Q),H=$.fresh?null:await this.read(K),F=H?this.now()-H.storedAt:Number.POSITIVE_INFINITY;if(!H||F>G){yL.add(1,{cache:J,outcome:"miss"});let U=await Y();return await this.write(K,U,J),U}if(F>W&&!this.revalidating.has(K))yL.add(1,{cache:J,outcome:"stale"}),this.revalidating.add(K),X(Y().then((U)=>this.write(K,U,J)).catch(()=>{yL.add(1,{cache:J,outcome:"error"})}).finally(()=>this.revalidating.delete(K)));else yL.add(1,{cache:J,outcome:"hit"});return H.value}async fetchOrPlaceholder($){let{namespace:Z,key:Q,fetchLive:Y,placeholder:X}=$,{cache:J,maxStaleMs:G}=this.config,W=this.storageKey(Z,Q),K=await this.read(W),H=K?this.now()-K.storedAt:Number.POSITIVE_INFINITY,F=K!=null&&H<=G,U=K&&$.revalidateAfterMs?$.revalidateAfterMs(K.value):this.config.revalidateAfterMs;if(F&&H<=U)return yL.add(1,{cache:J,outcome:"hit"}),{value:K.value,live:!0};if(yL.add(1,{cache:J,outcome:F?"stale":"placeholder"}),!this.revalidating.has(W))this.revalidating.add(W),Y().then((N)=>this.write(W,N,J)).catch(()=>{yL.add(1,{cache:J,outcome:"error"})}).finally(()=>this.revalidating.delete(W));return F?{value:K.value,live:!0}:{value:X,live:!1}}async refresh($){let Z=await $.fetchLive();return await this.write(this.storageKey($.namespace,$.key),Z,this.config.cache),yL.add(1,{cache:this.config.cache,outcome:"refresh"}),Z}async read($){if(!this.kv)return this.placeholderFallback.get($)??null;try{let Z=await this.kv?.get($);if(!Z?.value?.length)return null;if(Z.operation==="DEL"||Z.operation==="PURGE")return null;return this.codec.decode(Z.value)}catch{return null}}async write($,Z,Q){if(!this.kv){if(this.placeholderFallback.size>=Ug.MAX_PLACEHOLDER_FALLBACK_ENTRIES){let Y=this.placeholderFallback.keys().next().value;if(Y!==void 0)this.placeholderFallback.delete(Y)}this.placeholderFallback.set($,{storedAt:this.now(),value:Z});return}try{await this.kv?.put($,this.codec.encode({storedAt:this.now(),value:Z}))}catch{yL.add(1,{cache:Q,outcome:"store_rejected"})}}async invalidate($){if(this.fallback.invalidate($),!this.kv)return;try{let Z=await this.kv.keys(`${$}.*`);for await(let Q of Z)await this.kv.delete(Q).catch(()=>{})}catch{}}teardown(){this.kv=null}}function iG1($){Ju$=$?.reads??null,Gu$=$?.cards??null}function pG1(){return Ju$??BY6}function QV0(){return Gu$??DY6}var Yu$,Xu$,yL,Qu$=524288,dG1,c40,Ju$=null,Gu$=null,BY6,DY6;var nG1=L(()=>{Y$0();v6();Yu$=C(KH(),1),Xu$=C(MT(),1),yL=J$.createCounter("pr_read_cache.fetches",{description:"Task board PR cache outcomes (hit, stale, miss, placeholder, refresh, error, store_rejected)",unit:"{fetches}"}),dG1={bucket:"DECOCMS_PR_READS",revalidateAfterMs:55000,maxStaleMs:1800000,cache:"reads"},c40={bucket:"DECOCMS_PR_CARDS",revalidateAfterMs:30000,maxStaleMs:86400000,cache:"cards"};BY6=new Ug(dG1,{getJetStream:()=>null}),DY6=new Ug(c40,{getJetStream:()=>null})});import{z as YV0}from"zod";function LY6($){if($ instanceof y0&&$.isRateLimited)return!0;let Q=($ instanceof Error?$.message:String($)).replace(/https?:\/\/\S+/gi," ");return/too many requests|rate limit|\b429\b/i.test(Q)}function Wu$($){return pG1().invalidate($)}function t3($){return QV0().invalidate($)}async function m40($,Z,Q,Y,X=!1){try{return await pG1().fetch({namespace:$,key:Z,fresh:X,fetchLive:()=>D8(Y,{maxAttempts:3,minTimeout:300,maxTimeout:3000,jitter:1,isRetriable:(G)=>!LY6(G)}),onRevalidation:()=>{}})??null}catch(J){let G=J instanceof r6?J.cause:J;return console.error(`[task-board] ${Z} failed for ${Q}:`,G),null}}function tG1($,Z,Q){return ed($,Z,y40(Q)).catch((Y)=>{return console.error(`[task-board] no client for ${Pp(Q)}:`,Y),null})}function Ng($){let Z;try{Z=new URL($).hostname.toLowerCase()}catch{return!1}return Z==="deco.site"||Z.endsWith(".decocdn.com")||Z.endsWith(".deco-cx.workers.dev")||Z.endsWith(".deco.site")||Z.endsWith(".vercel.app")||Z.endsWith(".vtex.app")}function jY6($){for(let Q of $){let Y=/^Workers Builds:\s*([a-z0-9][a-z0-9-]*)\s*$/i.exec(Q.name)?.[1],X=Q.summary?/Version ID:\s*([0-9a-f]{8})/i.exec(Q.summary)?.[1]:null;if(!Y||!X)continue;let J=`https://${X}-${Y}.${wY6}.workers.dev`;if(Ng(J))return J}let Z=(Q)=>Q.conclusion==="success";for(let Q of[...$.filter(Z),...$.filter((Y)=>!Z(Y))]){let Y=(Q.url&&Ng(Q.url)?Q.url:null)??Ku$(Q.summary);if(Y)return Y}return null}function Ku$($){if(typeof $!=="string")return null;return($.match(/https?:\/\/[^\s"'<>)\]]+/g)??[]).find(Ng)??null}function EY6($){let Z=(Y)=>Date.parse(Y.updatedAt??"")||Date.parse(Y.createdAt??""),Q=$.map((Y,X)=>({c:Y,index:X})).sort((Y,X)=>{let J=Z(Y.c),G=Z(X.c);if(Number.isNaN(J)||Number.isNaN(G))return Y.index-X.index;return G-J}).map(({c:Y})=>Y);for(let Y of Q){let X=Y.body;if(!X)continue;let J=X.match(/href=['"]([^'"]+)['"][^>]*>\s*Branch Preview/i);if(J?.[1]&&Ng(J[1]))return J[1];let G=Ku$(X);if(G)return G}return null}function PY6($){return typeof $==="string"&&/^[0-9a-fA-F]{7,40}$/.test($)?$:null}function oG1($){if($==="merged")return{state:"closed",merged:!0};return{state:$,merged:!1}}async function zY6($,Z,Q,Y){let X=(J)=>J.state==="completed"&&J.conclusion!==null&&J.conclusion!=="success"&&J.conclusion!=="skipped"&&J.conclusion!=="neutral";return await Promise.all(Y.map(async(J)=>({name:J.name,status:J.state,conclusion:J.conclusion,detailsUrl:J.url,summary:J.summary??(X(J)&&J.id!==null?await m40(Z,`check-log:${J.id}`,`${Pp(Q)} check ${J.id}`,()=>$.readCheckLog(J.id)):null)})))}async function AY6($,Z,Q,Y=!1){let X=await tG1($,Z,Q);if(!X)return XV0;let J=d40(Q),G=await m40(J,`detail:${Q.number}`,Pp(Q),()=>X.readDetailed({number:Q.number}),Y);if(!G)return XV0;let{state:W,merged:K}=oG1(G.state);if(W!=="open")return{...XV0,title:G.title,body:G.body,updatedAt:G.updatedAt,state:W,draft:G.draft,merged:K};let F=jY6(G.checkRuns)??EY6(G.comments);if(!F){let U=PY6(G.headSha),N=U?await m40(J,`deployed:${U}`,`${Pp(Q)} (deployment preview)`,()=>X.readDeployedUrl(U)):null;F=N&&Ng(N)?N:null}return{title:G.title,body:G.body,updatedAt:G.updatedAt,state:W,draft:G.draft,merged:K,mergeable:G.conflicting===null?null:!G.conflicting,checksStatus:G.checks,checks:await zY6(X,J,Q,G.checkRuns),previewUrl:F}}async function JV0($,Z,Q,Y){let X=await tG1($,Z,Q);if(!X)return null;return m40(d40(Q),`read:${Q.number}`,`${Pp(Q)} (${Y})`,()=>X.read(Q.number))}async function Hu$($,Z,Q){let Y=await tG1($,Z,Q);if(!Y)return null;return(await m40(d40(Q),`detail:${Q.number}`,Pp(Q),()=>Y.readDetailed({number:Q.number})))?.checks??null}async function GV0($,Z,Q){return(await JV0($,Z,Q,"conflict"))?.conflicting??null}async function pI0($,Z,Q){let Y=await JV0($,Z,Q,"landing");if(!Y)return{state:null,merged:null};return oG1(Y.state)}async function Zu$($,Z,Q){let Y=await JV0($,Z,Q,"candidate");if(!Y)return{state:null,merged:null,checksStatus:null,conflict:null};return{...oG1(Y.state),checksStatus:Y.checks,conflict:Y.conflicting}}async function Fu$($,Z,Q){let Y=await JV0($,Z,Q,"head ref");if(!Y||Y.state!=="open")return null;return Y.head.length>0?Y.head:null}function rG1($){return Uu$($).every((Z)=>Z.checksStatus!=="failing"&&Z.checksStatus!=="pending")}function TY6($){let Z=$.findIndex((Q)=>Q!=="closed");return Z===-1?0:Z}async function i40($,Z,Q){if(Q.length<=1)return Q[0];let Y=[];for(let X of Q){let{state:J}=await Ep(Z,X);if(Y.push(J),J!=="closed")break}return Q[TY6(Y)]}function Nu$($,Z,Q,Y=!1){return Promise.all(Q.map(async(X)=>{let J=await AY6($,Z,X,Y);return{url:X.url,number:X.number,repoOwner:X.repoOwner,repoName:X.repoName,createdAt:X.createdAt,...J}}))}async function Bu$($,Z,Q){try{let Y=await $.storage.taskBoard.listPrs(Q,Z);if(Y.length===0)return null;let X=await QV0().refresh({namespace:Z,key:Q,fetchLive:()=>Nu$($,Z,Y,!0)});return Du$(Z,Q,X),X}catch(Y){return console.error(`[task-board] pr card refresh failed for ${Q}:`,Y),null}}var Pp=($)=>`${$.repoOwner}/${$.repoName}#${$.number}`,d40=($)=>YF(y40($).repo),OY6=0,wY6="deco-cx",XV0,sG1=($)=>Uu$($).length>0,Uu$=($)=>$.filter((Z)=>Z.state!=="closed"&&Z.merged!==!0),RY6,p40;var MQ=L(()=>{q0();O7();m8();t4();r$();d3();Op();jX();Kg();AF();a5();aI0();$V0();l40();nG1();cI0();XV0={title:null,body:null,updatedAt:null,state:null,draft:null,merged:null,mergeable:null,checksStatus:null,checks:[],previewUrl:null};RY6=h({name:"TASK_BOARD_ITEM_PRS_GET",description:"Get the change requests (GitHub and Bitbucket pull requests, GitLab merge requests) linked to a task board item, each enriched with live state (title, open/closed, draft, merged) fetched from its provider.",annotations:{title:"Get Task Board Item Pull Requests",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},inputSchema:YV0.object({taskBoardItemId:YV0.string()}),outputSchema:YV0.object({prs:YV0.array(SS$)}),handler:async({taskBoardItemId:$},Z)=>{p(Z),await Z.access.check();let Q=Z.organization?.id;if(!Q)throw Error("Organization ID required (no active organization in context)");let Y=await Z.storage.taskBoard.getById($,Q),X=await Z.storage.taskBoard.listPrs($,Q),J=()=>Nu$(Z,Q,X),{value:G,live:W}=await QV0().fetchOrPlaceholder({namespace:Q,key:$,fetchLive:J,revalidateAfterMs:(H)=>H.some((F)=>rJ$(F))?OY6:c40.revalidateAfterMs,placeholder:X.map((H)=>({url:H.url,number:H.number,repoOwner:H.repoOwner,repoName:H.repoName,createdAt:H.createdAt,...XV0}))});if(!W)return{prs:G};let K=G.find((H)=>H.state==="open"&&!H.merged);if(Y&&IJ(Y)&&Y.assigneeId===F8&&sG1(G))await jp(Z,Y,{previewMatchesHead:rG1(G)}).catch((H)=>{console.error("[task-board] reviewer auto-handoff failed",H)});if(Y&&Y.status===D1.release&&Y.assigneeId===F8&&K&&K.mergeable===!1)await eI0(Z,Q,Y,{pr:{number:K.number,url:K.url},conflict:!0}).catch((H)=>{console.error("[task-board] conflict auto-resolve failed",H)});if(Fg(G))try{let H=D1.shipped;if(Y&&xh$(Y.status,H)&&!await Z.storage.taskBoard.hasHumanRejectedDone($,Q)){let F=await Z.storage.taskBoard.update($,Q,{status:H},Y.updatedBy);await r5(Z,{taskBoardItemId:$,action:"status_changed",actorId:null,data:{from:Y.status,to:H}}),w8(Q,F)}}catch(H){console.error("[task-board] merged-PR reconcile failed",H)}return{prs:G}}}),p40=Lp(RY6)});function Ou$($){if(Lu$.has($.kind??""))return 0;return kY6($)?IY6:VY6}function kY6($){let Z=$.kind??"";if(Lu$.has(Z))return!1;if(qY6.has(Z))return!0;let Q=$.errorText??"";if(!Q)return!1;if(Q.includes(EM0))return!0;let Y=Q.replace(/https?:\/\/\S+/gi," ");return MY6.some((X)=>X.test(Y))}var qY6,Lu$,MY6,IY6=3,VY6=1;var wu$=L(()=>{jI0();qY6=new Set(["stall","liveness","projection","abandoned"]),Lu$=new Set(["cancelled",...k40]),MY6=[/sandbox did not become ready/i,/sandbox (?:provisioning|claim) failed/i,/mcp is unusable/i,/harness_crashed: unexpected eof/i,/too many clients already|timeout exceeded when trying to connect/i,/\b(?:429|503)\b|too many requests|service unavailable/i]});function aG1($,Z,Q,Y){h7({event:$,organizationId:Z,properties:{task_id:Q.id,reports_task:u7(Q),...Y}})}function w8($,Z){g6.emit($,{id:crypto.randomUUID(),type:iJ$,source:"task-board",subject:Z.id,data:Z,time:new Date().toISOString()})}function Du$($,Z,Q){g6.emit($,{id:crypto.randomUUID(),type:oJ$,source:"task-board",subject:Z,data:{id:Z,prs:Q},time:new Date().toISOString()})}function ju$($,Z){g6.emit($,{id:crypto.randomUUID(),type:tJ$,source:"task-board",subject:Z,data:{id:Z},time:new Date().toISOString()})}function SY6($,Z){return $?[$]:Z}async function eG1($,Z,Q){let Y=$.metadata?.runMetadata?.taskBoardItemId,X=!Y&&Q?await $.storage.taskBoard.linkedTaskIds(Q,Z):[];return SY6(Y,X)}async function Eu$($,Z,Q){return $.storage.taskBoard.boardManagedIds(await eG1($,Z,Q),Z)}async function WV0($,Z){let Q=$.organization?.id;if(!Q)return;try{for(let Y of await Eu$($,Q,Z)){let X=await $.storage.taskBoard.openReviewCycleIfInProgress(Y,Q);if(!X)continue;w8(Q,X),aG1("task_run_completed",Q,X,{from:"in_progress",via:"pr_open"})}}catch(Y){console.error("[task-board] review-cycle open failed",Y)}}async function KV0($,Z,Q,Y){let X=$.organization?.id;if(!X)return;try{let J=zP(Z);if(!J)return;let G=await Eu$($,X,Y);for(let W of G)await $.storage.taskBoard.linkPr({taskBoardItemId:W,organizationId:X,url:J.url,prNumber:J.number,repo:J.repo,connectionId:Q??null});if(G.length>0)await t3(X)}catch(J){console.error("[task-board] PR capture failed",J)}}async function zp($,Z,Q,Y){try{let X=await $.advanceLinkedTasksToReviewOnThreadFinish(Z,Q);for(let J of X)w8(Q,J),aG1("task_run_completed",Q,J,{from:"in_progress",via:"thread_finish"});for(let J of X)await $.clearRunRetry(J.id,Q).catch(()=>{})}catch(X){console.error("[task-board] thread-finish transition failed",X)}await $31($,Z,Q),await Z31($,Y,Z,Q)}function Pu$($){return(qK($.status)??-1)>=wp.in_review||Boolean($.reviewCycleStartedAt)}async function $31($,Z,Q){try{let Y=await $.failedRunInfo(Z,Q);if(!Y)return;let X=Ou$(Y);for(let J of await $.linkedTaskIds(Z,Q)){let G=await $.getById(J,Q);if(!G)continue;if(G.source)continue;if(Pu$(G))await $.relabelDeliveredFailure(Z,Q,vY6).catch(()=>{});if(G.status!==D1.progress)continue;if(G.reviewCycleStartedAt)continue;if(G.threads.some((H)=>H.hasMessages&&H.status==="in_progress"))continue;let W=G.retryAttempts;if(W<X){let H=I7(_Y6,CY6,W,2,0.5);if(!await $.scheduleRunRetry(J,Q,W+1,new Date(Date.now()+H)))continue;await $.recordActivity({taskBoardItemId:J,action:"status_changed",actorId:null,data:{from:D1.progress,to:D1.progress,retry:W+1,of:X,reason:Y.errorText??Y.kind}}).catch(()=>{});continue}let K=await $.returnToBacklogAfterFailure(J,Q,G.updatedBy);if(!K)continue;await $.recordActivity({taskBoardItemId:J,action:"status_changed",actorId:null,data:{from:D1.progress,to:D1.intake,reason:Y.errorText??Y.kind,retriesSpent:W}}).catch(()=>{}),w8(Q,K),aG1("task_run_failed",Q,G,{reason:Y.kind??"error",retries_spent:W})}}catch(Y){console.error("[task-board] failed-run reaction failed",Y)}}async function Z31($,Z,Q,Y){try{for(let X of await $.linkedTaskIds(Q,Y)){let J=await $.getById(X,Y);if(!J)continue;if(J.source)continue;if(Pu$(J))continue;if(J.threads.some((W)=>W.hasMessages&&(W.status===null||!f40.has(W.status))))continue;if((await $.listPrs(X,Y)).length>0)continue;await gE$(Z,Y,X)}}catch(X){console.error("[task-board] quota refund pass failed",X)}}async function HV0($,Z){if(!IJ(Z))return null;try{let Q=await $.storage.taskBoard.update(Z.id,Z.organizationId,{status:D1.qa},Z.updatedBy);return await $.storage.taskBoard.recordActivity({taskBoardItemId:Z.id,action:"status_changed",actorId:null,data:{from:Z.status,to:D1.qa}}).catch(()=>{}),w8(Z.organizationId,Q),await _h$($,Q),Q}catch(Q){return console.error(`[task-board] moving ${Z.id} to QA failed`,Q),null}}async function TF($,Z,Q){let Y=Z.organizationId;if(Z.assigneeId!==F8)return!1;try{if(Z.status===D1.progress)await bY6($,Z).catch((J)=>console.warn(`[task-board] parking ${Z.id} before hand-off failed`,J));let X=await $.storage.taskBoard.unassignSuperAgent(Z.id,Y,Z.updatedBy);if(!X)return!1;return await r5($,{taskBoardItemId:Z.id,action:"assignee_changed",actorId:null,data:{from:Z.assigneeId,to:null,reason:Q}}),console.warn(`[task-board] ${Z.id} handed to a human: ${Q}`),w8(Y,X),!0}catch(X){return console.error(`[task-board] handing ${Z.id} to a human failed`,X),!1}}async function bY6($,Z){let Q=await $.storage.taskBoard.advanceFromProgress(Z.id,Z.organizationId,D1.review,Z.updatedBy);if(!Q)return;await $.storage.taskBoard.recordActivity({taskBoardItemId:Z.id,action:"status_changed",actorId:null,data:{from:Z.status,to:D1.review}}).catch(()=>{}),w8(Z.organizationId,Q)}async function rh$($,Z,Q){if(!(Q instanceof XX))return!1;if(Q.reason!=="runs_exhausted")return!1;return await TF($,Z,"per-task run limit reached \u2014 the Super Agent can no longer re-dispatch "+"itself on this task. Re-run it manually to continue."),!0}async function zu$($,Z){let Q=$.organization?.id;if(!Q)return;try{let Y=await $.storage.taskBoard.reopenLinkedTasksOnThreadRun(Z,Q);for(let X of Y)w8(Q,X)}catch(Y){console.error("[task-board] thread-run reopen failed",Y)}}function Au$($){return $.includes("create_pull_request")||$.includes("createPullRequest")||$.includes("create_merge_request")||$.includes("createMergeRequest")}function Tu$($){if(xY6.test($))return!0;return fY6.test($)&&yY6.test($)}var CY6=30000,_Y6=120000,vY6="Run ended after it had already delivered \u2014 the task moved on without it",xY6,fY6,yY6;var a5=L(()=>{b3();Q6();vL();Kg();vh$();MQ();wu$();r$();PP();m8();jX();AF();xY6=/\b(?:gh\s+pr|glab\s+mr)\s+create\b/,fY6=/\/(?:repos\/[^\s"']+\/pulls|projects\/[^\s"']+\/merge_requests|repositories\/[^\s"']+\/pullrequests)\b/,yY6=/(?:-X|--request)\s+POST/});function gY6($){if($.status==="completed")return"advance";if($.status==="failed"&&$.messageStorageVersion===2&&($.harnessId==="decopilot"||$.harnessId==="claude-code"))return"nudge";return"none"}function hY6($){return["This task is still In Progress on the board and your last run ended without finishing it.","","Look at what you already did (`git log`, `git status`, and the messages above), then either:","- finish the remaining work (and open the PR, if it needed code changes),","- or, if it's actually done, say so in one line \u2014 the board moves the card for you,",$==="decopilot"?"- or, if you're blocked on something only a human knows, call the `user_ask` tool.":"- or, if you're blocked on something only a human knows, say what you need and stop.","","Don't start over and don't redo work you already committed or pushed. You are on the same branch as before \u2014 push to it and update your existing pull request rather than opening a second one."].join(`
|
|
1574
|
-
`)}async function uY6($,Z,Q){await Fp($,Z,Q,{messageId:`stall-nudge-${Z.id}-${Q.id}`,prompt:hY6(Q.harness_id),workflowID:`stall-nudge:${Z.id}:${Q.id}`})}async function lY6($,Z){let Q=await $.storage.threads.get(Z);if(!Q)return{action:"none",thread:null};return{action:gY6({status:Q.status,messageStorageVersion:Q.message_storage_version,harnessId:Q.harness_id}),thread:Q}}function cY6($,Z=Date.now()){if($.status!=="in_progress")return!1;if($.run_started_at)return!1;return V40($,Z)}async function mY6($,Z){let Q=[];for(let Y of Z.threads){if(Y.status!=="in_progress")continue;let X=await $.storage.threads.get(Y.threadId);if(!X||!cY6(X))continue;if(await $.storage.threads.markRunFailed(Y.threadId,Q31,"abandoned"))Q.push(Y.threadId),console.warn(`[task-board] failed never-started thread ${Y.threadId} on ${Z.id}`)}return Q}async function Ru$($,Z){let Q=$.organization?.id;if(!Q)return;for(let Y of Z){if(Y.status==="in_progress")try{if((await mY6($,Y)).length>0)continue}catch(G){console.error(`[task-board] reaping threads for ${Y.id} failed`,G)}let X;try{X=MG1(Y)&&(await $.storage.taskBoard.listPrs(Y.id,Q)).length>0}catch(G){console.error(`[task-board] listPrs for ${Y.id} failed`,G);continue}if(!IG1(Y,X))continue;let J=Y.threads.find((G)=>G.hasMessages);if(!J)continue;try{let{action:G,thread:W}=await lY6($,J.threadId);if(G==="none"||!W)continue;if(G==="advance")await zp($.storage.taskBoard,J.threadId,Q,$.storage.organizationBilling);else await uY6($,Y,W)}catch(G){console.error(`[task-board] stall recovery failed for ${Y.id}`,G)}}}var Q31="Run never started \u2014 no pod picked it up before the idle window elapsed";var Y31=L(()=>{xI0();vL();a5()});import{z as iN}from"zod";var dY6,iY6,n40;var X31=L(()=>{m8();q0();ON();wG();d3();Y31();cI0();dY6=iN.object({key:iN.string(),title:iN.string(),position:iN.number()}),iY6=h({name:"TASK_BOARD_ITEM_LIST",description:"List all task board items for the organization, plus the `owner/name` repos this organization has imported (the valid values for a task's `repo` field).",annotations:{title:"List Task Board Items",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:iN.object({}),outputSchema:iN.object({items:iN.array(mi),repos:iN.array(iN.string()),columns:iN.array(dY6)}),handler:async($,Z)=>{p(Z),await Z.access.check();let Q=Z.organization?.id;if(!Q)throw Error("Organization ID required (no active organization in context)");let[Y,{items:X},J,G]=await Promise.all([Z.storage.taskBoard.list(Q),Z.storage.connections.list(Q,{slug:"mcp-github"}),Z.storage.repositories.listByOrg(Q),Rj$(Z)]),W=Y.filter((H)=>qj$(G,H.virtualMcpId)),K=[...new Set([...J.map((H)=>H.path),...mj$(X)])];return Ru$(Z,Y),{items:W,repos:K,columns:lJ$}}}),n40=Lp(iY6)});import{z as m9}from"zod";function Ap($){let Z=$.organization?.id;if(!Z)throw Error("Organization ID required (no active organization in context)");return Z}function Mu$($,Z){if($!==null&&Z!==null&&Z<$)throw Error("endDate must be on or after startDate")}function t40($,Z){g6.emit($,{id:crypto.randomUUID(),type:nJ$,source:"task-board",subject:Z,data:{sprintId:Z},time:new Date().toISOString()})}async function UV0($,Z,Q){let Y=await $.storage.sprints.get(Z,Q);if(!Y)throw Error(`Sprint not found: ${Q}`);if(Y.state==="closed")throw Error(`Sprint "${Y.name}" is closed \u2014 plan the card into a running or planned sprint`)}function J31($,Z,Q){let Y=(X)=>{if(X===null)return null;let J=$.find((G)=>G.id===X);return{id:X,name:J?.name??null}};return{action:"sprint_changed",data:{from:Y(Z),to:Y(Q)}}}async function Iu$($,Z,Q,Y,X){let J=J31(Z,Y,X);await dI0($,Q.map((G)=>({taskBoardItemId:G,actorId:_0($),...J})))}var qu$,FV0,G31,W31,K31,H31,F31,U31;var NV0=L(()=>{q0();PP();rG0();m8();jX();d3();qu$=m9.string().trim().min(1).max(W4$),FV0=m9.string().refine(H4$,"Expected a calendar day as YYYY-MM-DD");G31=h({name:"TASK_BOARD_SPRINT_LIST",description:"List the board's sprints: running first, then planned (soonest first), then closed (most recent first). A card's `sprintId` is one of these ids.",annotations:{title:"List Sprints",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:m9.object({}),outputSchema:m9.object({sprints:m9.array(ci)}),handler:async($,Z)=>{return p(Z),await Z.access.check(),{sprints:await Z.storage.sprints.listByOrg(Ap(Z))}}}),W31=h({name:"TASK_BOARD_SPRINT_CREATE",description:"Plan a new sprint. It starts as planned (`future`); start it with TASK_BOARD_SPRINT_START.",annotations:{title:"Create Sprint",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1,openWorldHint:!1},inputSchema:m9.object({name:qu$,startDate:FV0.nullable().optional(),endDate:FV0.nullable().optional()}),outputSchema:m9.object({sprint:ci}),handler:async($,Z)=>{p(Z),await Z.access.check();let Q=Ap(Z),Y=$.startDate??null,X=$.endDate??null;Mu$(Y,X);let J=await Z.storage.sprints.create({organizationId:Q,name:$.name,startDate:Y,endDate:X,by:_0(Z)});return t40(Q,J.id),{sprint:J}}}),K31=h({name:"TASK_BOARD_SPRINT_UPDATE",description:"Rename a sprint or change its dates. Pass null to clear a date.",annotations:{title:"Update Sprint",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:m9.object({id:m9.string(),name:qu$.optional(),startDate:FV0.nullable().optional(),endDate:FV0.nullable().optional()}),outputSchema:m9.object({sprint:ci}),handler:async($,Z)=>{p(Z),await Z.access.check();let Q=Ap(Z),Y=await Z.storage.sprints.get(Q,$.id);if(!Y)throw Error(`Sprint not found: ${$.id}`);Mu$($.startDate===void 0?Y.startDate:$.startDate,$.endDate===void 0?Y.endDate:$.endDate);let X=await Z.storage.sprints.update(Q,$.id,{name:$.name,startDate:$.startDate,endDate:$.endDate});if(!X)throw Error(`Sprint not found: ${$.id}`);return t40(Q,X.id),{sprint:X}}}),H31=h({name:"TASK_BOARD_SPRINT_START",description:"Start a planned sprint. The board opens on the running sprint by default.",annotations:{title:"Start Sprint",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1,openWorldHint:!1},inputSchema:m9.object({id:m9.string()}),outputSchema:m9.object({sprint:ci}),handler:async($,Z)=>{p(Z),await Z.access.check();let Q=Ap(Z),Y=await Z.storage.sprints.start(Q,$.id);if(!Y){let X=await Z.storage.sprints.get(Q,$.id);throw Error(X?`Sprint "${X.name}" is ${X.state==="active"?"already running":"closed"}`:`Sprint not found: ${$.id}`)}return t40(Q,Y.id),{sprint:Y}}}),F31=h({name:"TASK_BOARD_SPRINT_COMPLETE",description:"Complete a running sprint. Cards that are not Done or Archived move on: by default to the next planned sprint (the soonest), or to the backlog when none is planned. Done and Archived cards stay as the sprint's record.",annotations:{title:"Complete Sprint",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1,openWorldHint:!1},inputSchema:m9.object({id:m9.string(),moveOpenTo:m9.string().nullable().optional().describe("Where unfinished cards go: a planned or running sprint's id, or null for the backlog. Omit for the next planned sprint.")}),outputSchema:m9.object({sprint:ci,movedTo:m9.string().nullable(),movedCount:m9.number()}),handler:async($,Z)=>{p(Z),await Z.access.check();let Q=Ap(Z),Y=await Z.storage.sprints.listByOrg(Q),X=Y.find((W)=>W.id===$.id);if(!X)throw Error(`Sprint not found: ${$.id}`);if($.moveOpenTo===$.id)throw Error("moveOpenTo must be a different sprint");let J=$.moveOpenTo===void 0?F4$(Y,$.id):$.moveOpenTo,G=await Z.storage.sprints.complete({organizationId:Q,id:$.id,moveTo:J,by:_0(Z)});if(!G)throw Error(`Sprint "${X.name}" is ${X.state==="future"?"not started":"already completed"}`);return await Iu$(Z,Y,G.movedItemIds,$.id,G.movedTo),t40(Q,$.id),{sprint:G.sprint,movedTo:G.movedTo,movedCount:G.movedItemIds.length}}}),U31=h({name:"TASK_BOARD_SPRINT_DELETE",description:"Delete a sprint. Every card in it, finished or not, goes to the backlog; no card is deleted.",annotations:{title:"Delete Sprint",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:m9.object({id:m9.string()}),outputSchema:m9.object({deleted:m9.boolean(),movedCount:m9.number()}),handler:async($,Z)=>{p(Z),await Z.access.check();let Q=Ap(Z),Y=await Z.storage.sprints.listByOrg(Q),X=await Z.storage.sprints.delete(Q,$.id);if(!X)return{deleted:!1,movedCount:0};return await Iu$(Z,Y,X.movedItemIds,$.id,null),t40(Q,$.id),{deleted:!0,movedCount:X.movedItemIds.length}}})});function nY6($,Z={}){if($==="failing")return!0;if($==="pending")return!Z.allowPendingChecks;return!1}async function tY6($,Z,Q,Y,X){if(pY6.has(Y))return;let G=(await $.storage.taskBoard.listActivity(Q,Z).catch(()=>[])).at(-1);if(G?.action==="merge_failed"&&G.data?.reason===Y)return;await r5($,{taskBoardItemId:Q,action:"merge_failed",actorId:null,data:{reason:Y,...X?{detail:X}:{}}})}async function oY6($,Z,Q,Y={}){let X=async(N,B)=>{return await tY6($,Z,Q,N,B),{merged:!1,reason:N,...B?{detail:B}:{}}},J=await $.storage.taskBoard.listPrs(Q,Z),G=await i40($,Z,J);if(!G)return console.warn(`[task-board] merge skipped \u2014 no linked PR on ${Q}`),X("no_pr");let W=await Hu$($,Z,G);if(nY6(W,Y))return console.warn(`[task-board] merge blocked \u2014 checks ${W} on PR #${G.number}`),X(W==="failing"?"checks_failing":"checks_pending");let K=y40(G),H=K.repo.path,F=await ed($,Z,K).catch((N)=>{return console.error(`[task-board] merge blocked \u2014 ${H}:`,N),null});if(!F)return console.warn(`[task-board] merge blocked \u2014 no credential for ${H} (#${G.number})`),X("no_connection",H);let U=await F.merge(G.number);if(U.merged)return await Promise.all([Wu$(d40(G)),t3(Z)]),{merged:!0};if(U.reason==="rate_limited")console.warn(`[task-board] merge rate-limited on #${G.number} \u2014 sweep retries`);else console.error(`[task-board] merge refused (${U.reason}) on ${H}#${G.number}:`,U.detail);return X(sY6(U),U.detail.slice(0,500))}function sY6($){switch($.reason){case"conflict":return"conflict";case"rate_limited":return"rate_limited";case"not_found":return"no_pr";case"blocked":return"refused";default:return"error"}}async function o40($,Z,Q){let Y=await $.storage.organizationSettings.get(Z),X=gA(Y?.flags),J=await $.storage.taskBoard.listActivity(Q,Z),G=await $.storage.taskBoard.getById(Q,Z);return Pm(J,X,{cycleStartedAt:G?.reviewCycleStartedAt??null,verifiedOnly:!0})}async function rY6($,Z){let Q=await $.storage.organizationSettings.get(Z.organizationId),Y=gA(Q?.flags),X=await $.storage.taskBoard.listActivity(Z.id,Z.organizationId);if(!mJ$(X,Y,{cycleStartedAt:Z.reviewCycleStartedAt}))return;await TF($,Z,"every reviewer approved, but an approval could not be verified \u2014 "+"the card cannot move to QA on its own and no reviewer can be re-dispatched this cycle")}function aY6($){if($===null||$.merged)return null;return $.reason==="conflict"?!0:null}async function eY6($,Z,Q){let Y=aY6(Q);if(Y!==!0)return;let X=Z.organizationId,J=await $.storage.taskBoard.listPrs(Z.id,X),G=await i40($,X,J);if(!G)return;await eI0($,X,Z,{pr:{number:G.number,url:G.url},conflict:Y}).catch((W)=>{console.error("[task-board] conflict auto-resolve failed",W)})}async function N31($,Z,Q={}){let Y=Z.organizationId;if(Z.status!==D1.release)return{item:Z,merged:!1};let X=await oY6($,Y,Z.id,{allowPendingChecks:Q.allowPendingChecks});if(!X.merged){await eY6($,Z,X);let G=await $.storage.taskBoard.getById(Z.id,Y)??Z;return w8(Y,G),{item:G,merged:!1}}let J=await $.storage.taskBoard.update(Z.id,Y,{status:D1.shipped},Z.updatedBy);return await r5($,{taskBoardItemId:Z.id,action:"status_changed",actorId:Q.shippedBy??null,data:{from:Z.status,to:D1.shipped}}),w8(Y,J),{item:J,merged:!0}}async function Vu$($,Z){if(Z.status!==D1.release)return Z;if((await $.storage.organizationSettings.get(Z.organizationId))?.flags?.auto_merge!==!0)return Z;return(await N31($,Z)).item}async function ku$($,Z){if(!IJ(Z))return!1;if(!await o40($,Z.organizationId,Z.id))return await rY6($,Z),!1;return await HV0($,Z)!==null}var pY6;var Tp=L(()=>{O7();m8();jX();$V0();Kg();MQ();AF();a5();pY6=new Set(["checks_pending"])});function Su$($){if($===void 0)return;let Z=[];for(let Q of $){let Y=Q.trim().replace(/[\t\r\n]/g,"").replace(/\\/g,"/");if(!Y.startsWith("/")||Y.startsWith("//"))continue;if(!Z.includes(Y))Z.push(Y);if(Z.length===20)break}return Z}import{z as BY}from"zod";function QX6($){return ZX6.some((Z)=>$[Z]!==void 0)}function YX6($,Z){let Q=[];for(let{field:J,action:G}of $X6){if(Z[J]===$[J])continue;Q.push({action:G,data:{from:$[J],to:Z[J]}})}if(Z.description!==$.description)Q.push({action:"description_changed"});let Y=new Set($.tags.map((J)=>J.id));if(Z.tags.length!==$.tags.length||Z.tags.some((J)=>!Y.has(J.id)))Q.push({action:"tags_changed",data:{from:$.tags,to:Z.tags}});return Q}function XX6($,Z){if($!==F8)return!1;if(!Z)return!1;return Z.assigneeId!==F8?!0:Z.status===D1.intake}function JX6($){return qK($)>wp.in_review}function Cu$($,Z,Q){let Y=$!==void 0&&JX6($),X=Z!==void 0&&IJ(Z);return Q&&Y&&X}var $X6,ZX6,s40;var B31=L(()=>{m8();q0();d3();AF();cY1();mY1();fL();jX();NV0();AK();a5();Tp();Kg();MQ();b3();$X6=[{field:"status",action:"status_changed"},{field:"assigneeId",action:"assignee_changed"},{field:"priority",action:"priority_changed"},{field:"type",action:"type_changed"},{field:"dueDate",action:"due_date_changed"},{field:"title",action:"title_changed"}],ZX6=["title","description","status","priority","type","assigneeId","repo","virtualMcpId","dueDate","sortOrder","previewRoutes","tagIds","sprintId"];s40=h({name:"TASK_BOARD_ITEM_UPDATE",description:"Update a task board item's fields (title, description, status, priority, assignee), and/or link a chat thread to it.",annotations:{title:"Update Task Board Item",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:BY.object({id:BY.string(),title:BY.string().min(1).max(li).optional(),description:BY.string().max(ui).nullable().optional(),status:RL.optional(),priority:uy.optional(),type:t80.optional(),assigneeId:BY.string().nullable().optional(),repo:BY.string().max(UM0).nullable().optional(),virtualMcpId:BY.string().nullable().optional().describe("Move the card to this project (`vir_\u2026` id), or null to clear it. "+"When `repo` is omitted the card takes the new project's repository."),dueDate:BY.string().datetime().nullable().optional(),sortOrder:BY.number().optional(),previewRoutes:BY.array(BY.string().max(500)).max(20).optional().describe("Paths this task's work created or edited, e.g. "+'["/cliente-vip", "/cliente-vip/faq"]. Paths only \u2014 no host: the '+"card joins each onto the pull request's deploy-preview origin so a reviewer can open the pages directly. Replaces the previous set; pass [] to clear."),tagIds:BY.array(BY.string()).max(1000).optional(),sprintId:BY.string().nullable().optional().describe("Plan the card into this sprint (an id from TASK_BOARD_SPRINT_LIST), or null to move it to the backlog. A closed sprint takes no new cards."),linkThreadId:BY.string().optional(),prUrl:BY.string().nullable().optional().describe("GitHub pull request URL to link to this task, e.g. https://github.com/owner/repo/pull/123. Pass it after opening a PR for an existing card; linking one is what starts its review.")}),outputSchema:BY.object({item:mi}),handler:async($,Z)=>{p(Z),await Z.access.check();let Q=Z.organization?.id;if(!Q)throw Error("Organization ID required (no active organization in context)");let Y=$.prUrl?zP($.prUrl):null;if($.prUrl&&!Y)throw Error(`Not a change request URL: ${$.prUrl} (expected https://github.com/<owner>/<repo>/pull/<number>, https://gitlab.com/<namespace>/<project>/-/merge_requests/<iid> or https://bitbucket.org/<workspace>/<repo>/pull-requests/<id>)`);if($.assigneeId)await NM0(Z,Q,$.assigneeId);if($.linkThreadId){if(!await Z.storage.taskBoard.getById($.id,Q))throw Error(`Task board item not found: ${$.id}`);if(!await Z.storage.threads.get($.linkThreadId))throw Error(`Thread not found: ${$.linkThreadId}`);await Z.storage.taskBoard.linkThread($.id,$.linkThreadId,Q)}let X=QX6($),J=X?await Z.storage.taskBoard.getById($.id,Q):null;if(X&&!J)throw Error(`Task board item not found: ${$.id}`);if($.sprintId&&$.sprintId!==J?.sprintId)await UV0(Z,Q,$.sprintId);let G=$.virtualMcpId&&$.virtualMcpId!==J?.virtualMcpId?await DM0(Z,Q,$.virtualMcpId):void 0,W=LM0({project:G,repo:$.repo,previousRepo:J?.repo}),K=X7.getStore()?.threadId,H=K!==void 0&&Cu$($.status,J??void 0,!0)&&zS$(await Z.storage.threads.get(K));if(Cu$($.status,J??void 0,H))throw Error("This task is under review \u2014 the run working on it can't move it "+"past In Review. Leave it for the reviewer; only a person, or TASK_BOARD_REVIEW_DECISION on a reviewer's own run, moves on a task under review.");let F=$.assigneeId!==void 0&&$.assigneeId!==(J?.assigneeId??null),U=XX6($.assigneeId,J),B=(U?D1.progress:void 0)??$.status;if(J&&u7(J)){if($.title!==void 0||$.description!==void 0||$.priority!==void 0)throw Error("This task was generated from your report and can't be edited \u2014 create your own task instead.");if(U)await hd(Z,J,IE())}if($.tagIds!==void 0){if($.tagIds.length>0)await BM0(Z,Q,$.tagIds);await Z.storage.taskBoard.setItemTags($.id,$.tagIds,_0(Z))}let D;if(X)D=await Z.storage.taskBoard.update($.id,Q,{title:$.title,description:$.description,status:B,priority:$.priority,type:$.type,assigneeId:$.assigneeId,assignedBy:F?$.assigneeId?_0(Z):null:void 0,...W,virtualMcpId:$.virtualMcpId,dueDate:$.dueDate,sortOrder:$.sortOrder,previewRoutes:Su$($.previewRoutes),sprintId:$.sprintId},_0(Z));else{let O=await Z.storage.taskBoard.getById($.id,Q);if(!O)throw Error(`Task board item not found: ${$.id}`);D=O}if(Y)await Z.storage.taskBoard.linkPr({taskBoardItemId:D.id,organizationId:Q,url:Y.url,prNumber:Y.number,repo:Y.repo,connectionId:null}),await t3(Q).catch((O)=>{console.error("[task-board] PR card cache invalidation failed",O)});if(J){let O=_0(Z),w=YX6(J,D);if(D.sprintId!==J.sprintId)w.push(J31(await Z.storage.sprints.listByOrg(Q),J.sprintId,D.sprintId));if(w.length>0)await dI0(Z,w.map((j)=>({taskBoardItemId:D.id,actorId:O,...j,alsoSubscribe:j.action==="assignee_changed"&&D.assigneeId!==F8?[D.assigneeId]:void 0})))}if(J&&D.description!==J.description)await Z.storage.notifications.notifyMentions({taskBoardItemId:D.id,organizationId:Q,actorId:_0(Z),body:D.description??"",previousBody:J.description});if(X||$.linkThreadId||Y)w8(Q,D);if(U)return await TP(Z,D,{userInitiated:!0}),{item:D};if($.status!==void 0&&J!==null&&J.status!==D.status)D=await Vu$(Z,D);return{item:D}}})});import{z as BV0}from"zod";var r40;var D31=L(()=>{q0();a5();r40=h({name:"TASK_BOARD_ITEM_DELETE",description:"Delete a task board item. A Deco Score task also dismisses its finding, so the next Deco Score import won't re-create the card.",annotations:{title:"Delete Task Board Item",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:BV0.object({id:BV0.string()}),outputSchema:BV0.object({success:BV0.boolean()}),handler:async($,Z)=>{p(Z),await Z.access.check();let Q=Z.organization?.id;if(!Q)throw Error("Organization ID required (no active organization in context)");if(!await Z.storage.taskBoard.delete($.id,Q,_0(Z)??"system"))throw Error(`Task board item not found: ${$.id}`);return ju$(Q,$.id),{success:!0}}})});import{z as IQ}from"zod";function vu$($,Z){g6.emit($,{id:crypto.randomUUID(),type:pJ$,source:"task-board",subject:Z??"board",data:{columnKey:Z},time:new Date().toISOString()})}function L31($){let Z=$.organization?.id;if(!Z)throw Error("Organization ID required (no active organization in context)");return Z}var _u$,GX6=20,a40,e40,$60;var O31=L(()=>{q0();m8();m8();AM0();PP();m8();_u$=IQ.object({columnKey:IQ.string().nullable().describe("null for the org-wide prompt; a column key to scope it."),prompt:IQ.string(),skills:IQ.array(IQ.string())});a40=h({name:"TASK_BOARD_PROMPT_LIST",description:"List the instructions appended to the system prompt of every agent run started from a card on this board. The org-wide prompt comes first; a prompt with a columnKey applies only to cards in that column.",inputSchema:IQ.object({}),outputSchema:IQ.object({prompts:IQ.array(_u$)}),handler:async($,Z)=>{return p(Z),await Z.access.check(),{prompts:await Z.storage.taskBoardPrompts.listByOrg(L31(Z))}}}),e40=h({name:"TASK_BOARD_PROMPT_UPSERT",description:"Set the instructions and skills appended to the system prompt of agent "+"runs started from this board's cards \u2014 house rules for the work "+"(conventions, tools to prefer, what never to touch), not what to do with one card. Replaces the prompt on that scope; omitted `skills` keeps the ones already there. Omit columnKey for the whole board. To clear a scope, use TASK_BOARD_PROMPT_DELETE.",annotations:{readOnlyHint:!1,idempotentHint:!0},inputSchema:IQ.object({columnKey:IQ.string().min(1).nullable().optional().describe("A column of this board (see TASK_BOARD_ITEM_LIST) to scope the prompt to. Omit or null for every card on the board."),prompt:IQ.string().max(sJ$),skills:IQ.array(IQ.string().min(1).max(512)).max(GX6).optional().describe("Skill ids from the org's skill catalog (the `id` the skill tool takes) that runs on this scope should load.")}),outputSchema:IQ.object({prompt:_u$}),handler:async($,Z)=>{p(Z),await Z.access.check();let Q=L31(Z),Y=$.columnKey??null;if(Y!==null){if(!QG.some((H)=>H===Y))throw Error(`This board has no column "${Y}" \u2014 it has ${QG.join(", ")}`)}let X=$.prompt.trim(),J=$.skills?[...new Set($.skills)]:void 0,G=(await Z.storage.taskBoardPrompts.listByOrg(Q)).find((H)=>H.columnKey===Y),W=J?.filter((H)=>!G?.skills.includes(H))??[];if(W.length>0){let H=new Map((await di(Z,Q)).map((N)=>[N.id,N])),F=W.filter((N)=>!H.has(N));if(F.length>0)throw Error(`Unknown skill(s): ${F.join(", ")}`);let U=W.filter((N)=>H.get(N)?.disableModelInvocation);if(U.length>0)throw Error(`Manual-only skill(s) a run can't load: ${U.join(", ")}`)}if(!X){if((J??G?.skills??[]).length===0)throw Error("Nothing to set \u2014 give a prompt or skills, or use TASK_BOARD_PROMPT_DELETE")}let K=await Z.storage.taskBoardPrompts.upsert(Q,Y,{prompt:X,skills:J});return vu$(Q,Y),{prompt:K}}}),$60=h({name:"TASK_BOARD_PROMPT_DELETE",description:"Clear a board prompt. Deleting IS the off switch, so a prompt cannot be set-but-inactive. Omit columnKey to clear the org-wide one.",annotations:{readOnlyHint:!1,idempotentHint:!0},inputSchema:IQ.object({columnKey:IQ.string().min(1).nullable().optional()}),outputSchema:IQ.object({removed:IQ.boolean()}),handler:async($,Z)=>{p(Z),await Z.access.check();let Q=L31(Z),Y=$.columnKey??null,X=await Z.storage.taskBoardPrompts.remove(Q,Y);if(X)vu$(Q,Y);return{removed:X}}})});import{sql as J1}from"kysely";function P31($){let Z=[];for(let Q of $.split("&")){if(BX6(Q)){Z.push({cohort:Q});continue}if(Q==="planned"){Z.push({scope:"planned"});continue}let Y=Q.indexOf(":"),X=DX6.find((G)=>G===Q.slice(0,Y)),J=Q.slice(Y+1);if(Y<0||!X||!J)return null;Z.push({field:X,value:J})}return Z.length>0?Z:null}function LX6($){if("cohort"in $)return J1.raw(EV0[$.cohort]);if("scope"in $)return J1`true`;let{field:Z,value:Q}=$,Y=Q==="none";switch(Z){case"touch":return J1`exists (select 1 from t where t.item_id = f.item_id and t.kind = ${Q})`;case"class":return J1`exists (select 1 from t where t.item_id = f.item_id and t.class = ${Q})`;case"source":return J1`exists (select 1 from task_board_activity a
|
|
1574
|
+
`)}async function uY6($,Z,Q){await Fp($,Z,Q,{messageId:`stall-nudge-${Z.id}-${Q.id}`,prompt:hY6(Q.harness_id),workflowID:`stall-nudge:${Z.id}:${Q.id}`})}async function lY6($,Z){let Q=await $.storage.threads.get(Z);if(!Q)return{action:"none",thread:null};return{action:gY6({status:Q.status,messageStorageVersion:Q.message_storage_version,harnessId:Q.harness_id}),thread:Q}}function cY6($,Z=Date.now()){if($.status!=="in_progress")return!1;if($.run_started_at)return!1;return V40($,Z)}async function mY6($,Z){let Q=[];for(let Y of Z.threads){if(Y.status!=="in_progress")continue;let X=await $.storage.threads.get(Y.threadId);if(!X||!cY6(X))continue;if(await $.storage.threads.markRunFailed(Y.threadId,Q31,"abandoned"))Q.push(Y.threadId),console.warn(`[task-board] failed never-started thread ${Y.threadId} on ${Z.id}`)}return Q}async function Ru$($,Z){let Q=$.organization?.id;if(!Q)return;for(let Y of Z){if(Y.status==="in_progress")try{if((await mY6($,Y)).length>0)continue}catch(G){console.error(`[task-board] reaping threads for ${Y.id} failed`,G)}let X;try{X=MG1(Y)&&(await $.storage.taskBoard.listPrs(Y.id,Q)).length>0}catch(G){console.error(`[task-board] listPrs for ${Y.id} failed`,G);continue}if(!IG1(Y,X))continue;let J=Y.threads.find((G)=>G.hasMessages);if(!J)continue;try{let{action:G,thread:W}=await lY6($,J.threadId);if(G==="none"||!W)continue;if(G==="advance")await zp($.storage.taskBoard,J.threadId,Q,$.storage.organizationBilling);else await uY6($,Y,W)}catch(G){console.error(`[task-board] stall recovery failed for ${Y.id}`,G)}}}var Q31="Run never started \u2014 no pod picked it up before the idle window elapsed";var Y31=L(()=>{xI0();vL();a5()});import{z as iN}from"zod";var dY6,iY6,n40;var X31=L(()=>{m8();q0();ON();wG();d3();Y31();cI0();dY6=iN.object({key:iN.string(),title:iN.string(),position:iN.number()}),iY6=h({name:"TASK_BOARD_ITEM_LIST",description:"List all task board items for the organization, plus the `owner/name` repos this organization has imported (the valid values for a task's `repo` field).",annotations:{title:"List Task Board Items",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:iN.object({}),outputSchema:iN.object({items:iN.array(mi),repos:iN.array(iN.string()),columns:iN.array(dY6)}),handler:async($,Z)=>{p(Z),await Z.access.check();let Q=Z.organization?.id;if(!Q)throw Error("Organization ID required (no active organization in context)");let[Y,{items:X},J,G]=await Promise.all([Z.storage.taskBoard.list(Q),Z.storage.connections.list(Q,{slug:"mcp-github"}),Z.storage.repositories.listByOrg(Q),Rj$(Z)]),W=Y.filter((H)=>qj$(G,H)),K=[...new Set([...J.map((H)=>H.path),...mj$(X)])];return Ru$(Z,Y),{items:W,repos:K,columns:lJ$}}}),n40=Lp(iY6)});import{z as m9}from"zod";function Ap($){let Z=$.organization?.id;if(!Z)throw Error("Organization ID required (no active organization in context)");return Z}function Mu$($,Z){if($!==null&&Z!==null&&Z<$)throw Error("endDate must be on or after startDate")}function t40($,Z){g6.emit($,{id:crypto.randomUUID(),type:nJ$,source:"task-board",subject:Z,data:{sprintId:Z},time:new Date().toISOString()})}async function UV0($,Z,Q){let Y=await $.storage.sprints.get(Z,Q);if(!Y)throw Error(`Sprint not found: ${Q}`);if(Y.state==="closed")throw Error(`Sprint "${Y.name}" is closed \u2014 plan the card into a running or planned sprint`)}function J31($,Z,Q){let Y=(X)=>{if(X===null)return null;let J=$.find((G)=>G.id===X);return{id:X,name:J?.name??null}};return{action:"sprint_changed",data:{from:Y(Z),to:Y(Q)}}}async function Iu$($,Z,Q,Y,X){let J=J31(Z,Y,X);await dI0($,Q.map((G)=>({taskBoardItemId:G,actorId:_0($),...J})))}var qu$,FV0,G31,W31,K31,H31,F31,U31;var NV0=L(()=>{q0();PP();rG0();m8();jX();d3();qu$=m9.string().trim().min(1).max(W4$),FV0=m9.string().refine(H4$,"Expected a calendar day as YYYY-MM-DD");G31=h({name:"TASK_BOARD_SPRINT_LIST",description:"List the board's sprints: running first, then planned (soonest first), then closed (most recent first). A card's `sprintId` is one of these ids.",annotations:{title:"List Sprints",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:m9.object({}),outputSchema:m9.object({sprints:m9.array(ci)}),handler:async($,Z)=>{return p(Z),await Z.access.check(),{sprints:await Z.storage.sprints.listByOrg(Ap(Z))}}}),W31=h({name:"TASK_BOARD_SPRINT_CREATE",description:"Plan a new sprint. It starts as planned (`future`); start it with TASK_BOARD_SPRINT_START.",annotations:{title:"Create Sprint",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1,openWorldHint:!1},inputSchema:m9.object({name:qu$,startDate:FV0.nullable().optional(),endDate:FV0.nullable().optional()}),outputSchema:m9.object({sprint:ci}),handler:async($,Z)=>{p(Z),await Z.access.check();let Q=Ap(Z),Y=$.startDate??null,X=$.endDate??null;Mu$(Y,X);let J=await Z.storage.sprints.create({organizationId:Q,name:$.name,startDate:Y,endDate:X,by:_0(Z)});return t40(Q,J.id),{sprint:J}}}),K31=h({name:"TASK_BOARD_SPRINT_UPDATE",description:"Rename a sprint or change its dates. Pass null to clear a date.",annotations:{title:"Update Sprint",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:m9.object({id:m9.string(),name:qu$.optional(),startDate:FV0.nullable().optional(),endDate:FV0.nullable().optional()}),outputSchema:m9.object({sprint:ci}),handler:async($,Z)=>{p(Z),await Z.access.check();let Q=Ap(Z),Y=await Z.storage.sprints.get(Q,$.id);if(!Y)throw Error(`Sprint not found: ${$.id}`);Mu$($.startDate===void 0?Y.startDate:$.startDate,$.endDate===void 0?Y.endDate:$.endDate);let X=await Z.storage.sprints.update(Q,$.id,{name:$.name,startDate:$.startDate,endDate:$.endDate});if(!X)throw Error(`Sprint not found: ${$.id}`);return t40(Q,X.id),{sprint:X}}}),H31=h({name:"TASK_BOARD_SPRINT_START",description:"Start a planned sprint. The board opens on the running sprint by default.",annotations:{title:"Start Sprint",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1,openWorldHint:!1},inputSchema:m9.object({id:m9.string()}),outputSchema:m9.object({sprint:ci}),handler:async($,Z)=>{p(Z),await Z.access.check();let Q=Ap(Z),Y=await Z.storage.sprints.start(Q,$.id);if(!Y){let X=await Z.storage.sprints.get(Q,$.id);throw Error(X?`Sprint "${X.name}" is ${X.state==="active"?"already running":"closed"}`:`Sprint not found: ${$.id}`)}return t40(Q,Y.id),{sprint:Y}}}),F31=h({name:"TASK_BOARD_SPRINT_COMPLETE",description:"Complete a running sprint. Cards that are not Done or Archived move on: by default to the next planned sprint (the soonest), or to the backlog when none is planned. Done and Archived cards stay as the sprint's record.",annotations:{title:"Complete Sprint",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1,openWorldHint:!1},inputSchema:m9.object({id:m9.string(),moveOpenTo:m9.string().nullable().optional().describe("Where unfinished cards go: a planned or running sprint's id, or null for the backlog. Omit for the next planned sprint.")}),outputSchema:m9.object({sprint:ci,movedTo:m9.string().nullable(),movedCount:m9.number()}),handler:async($,Z)=>{p(Z),await Z.access.check();let Q=Ap(Z),Y=await Z.storage.sprints.listByOrg(Q),X=Y.find((W)=>W.id===$.id);if(!X)throw Error(`Sprint not found: ${$.id}`);if($.moveOpenTo===$.id)throw Error("moveOpenTo must be a different sprint");let J=$.moveOpenTo===void 0?F4$(Y,$.id):$.moveOpenTo,G=await Z.storage.sprints.complete({organizationId:Q,id:$.id,moveTo:J,by:_0(Z)});if(!G)throw Error(`Sprint "${X.name}" is ${X.state==="future"?"not started":"already completed"}`);return await Iu$(Z,Y,G.movedItemIds,$.id,G.movedTo),t40(Q,$.id),{sprint:G.sprint,movedTo:G.movedTo,movedCount:G.movedItemIds.length}}}),U31=h({name:"TASK_BOARD_SPRINT_DELETE",description:"Delete a sprint. Every card in it, finished or not, goes to the backlog; no card is deleted.",annotations:{title:"Delete Sprint",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:m9.object({id:m9.string()}),outputSchema:m9.object({deleted:m9.boolean(),movedCount:m9.number()}),handler:async($,Z)=>{p(Z),await Z.access.check();let Q=Ap(Z),Y=await Z.storage.sprints.listByOrg(Q),X=await Z.storage.sprints.delete(Q,$.id);if(!X)return{deleted:!1,movedCount:0};return await Iu$(Z,Y,X.movedItemIds,$.id,null),t40(Q,$.id),{deleted:!0,movedCount:X.movedItemIds.length}}})});function nY6($,Z={}){if($==="failing")return!0;if($==="pending")return!Z.allowPendingChecks;return!1}async function tY6($,Z,Q,Y,X){if(pY6.has(Y))return;let G=(await $.storage.taskBoard.listActivity(Q,Z).catch(()=>[])).at(-1);if(G?.action==="merge_failed"&&G.data?.reason===Y)return;await r5($,{taskBoardItemId:Q,action:"merge_failed",actorId:null,data:{reason:Y,...X?{detail:X}:{}}})}async function oY6($,Z,Q,Y={}){let X=async(N,B)=>{return await tY6($,Z,Q,N,B),{merged:!1,reason:N,...B?{detail:B}:{}}},J=await $.storage.taskBoard.listPrs(Q,Z),G=await i40($,Z,J);if(!G)return console.warn(`[task-board] merge skipped \u2014 no linked PR on ${Q}`),X("no_pr");let W=await Hu$($,Z,G);if(nY6(W,Y))return console.warn(`[task-board] merge blocked \u2014 checks ${W} on PR #${G.number}`),X(W==="failing"?"checks_failing":"checks_pending");let K=y40(G),H=K.repo.path,F=await ed($,Z,K).catch((N)=>{return console.error(`[task-board] merge blocked \u2014 ${H}:`,N),null});if(!F)return console.warn(`[task-board] merge blocked \u2014 no credential for ${H} (#${G.number})`),X("no_connection",H);let U=await F.merge(G.number);if(U.merged)return await Promise.all([Wu$(d40(G)),t3(Z)]),{merged:!0};if(U.reason==="rate_limited")console.warn(`[task-board] merge rate-limited on #${G.number} \u2014 sweep retries`);else console.error(`[task-board] merge refused (${U.reason}) on ${H}#${G.number}:`,U.detail);return X(sY6(U),U.detail.slice(0,500))}function sY6($){switch($.reason){case"conflict":return"conflict";case"rate_limited":return"rate_limited";case"not_found":return"no_pr";case"blocked":return"refused";default:return"error"}}async function o40($,Z,Q){let Y=await $.storage.organizationSettings.get(Z),X=gA(Y?.flags),J=await $.storage.taskBoard.listActivity(Q,Z),G=await $.storage.taskBoard.getById(Q,Z);return Pm(J,X,{cycleStartedAt:G?.reviewCycleStartedAt??null,verifiedOnly:!0})}async function rY6($,Z){let Q=await $.storage.organizationSettings.get(Z.organizationId),Y=gA(Q?.flags),X=await $.storage.taskBoard.listActivity(Z.id,Z.organizationId);if(!mJ$(X,Y,{cycleStartedAt:Z.reviewCycleStartedAt}))return;await TF($,Z,"every reviewer approved, but an approval could not be verified \u2014 "+"the card cannot move to QA on its own and no reviewer can be re-dispatched this cycle")}function aY6($){if($===null||$.merged)return null;return $.reason==="conflict"?!0:null}async function eY6($,Z,Q){let Y=aY6(Q);if(Y!==!0)return;let X=Z.organizationId,J=await $.storage.taskBoard.listPrs(Z.id,X),G=await i40($,X,J);if(!G)return;await eI0($,X,Z,{pr:{number:G.number,url:G.url},conflict:Y}).catch((W)=>{console.error("[task-board] conflict auto-resolve failed",W)})}async function N31($,Z,Q={}){let Y=Z.organizationId;if(Z.status!==D1.release)return{item:Z,merged:!1};let X=await oY6($,Y,Z.id,{allowPendingChecks:Q.allowPendingChecks});if(!X.merged){await eY6($,Z,X);let G=await $.storage.taskBoard.getById(Z.id,Y)??Z;return w8(Y,G),{item:G,merged:!1}}let J=await $.storage.taskBoard.update(Z.id,Y,{status:D1.shipped},Z.updatedBy);return await r5($,{taskBoardItemId:Z.id,action:"status_changed",actorId:Q.shippedBy??null,data:{from:Z.status,to:D1.shipped}}),w8(Y,J),{item:J,merged:!0}}async function Vu$($,Z){if(Z.status!==D1.release)return Z;if((await $.storage.organizationSettings.get(Z.organizationId))?.flags?.auto_merge!==!0)return Z;return(await N31($,Z)).item}async function ku$($,Z){if(!IJ(Z))return!1;if(!await o40($,Z.organizationId,Z.id))return await rY6($,Z),!1;return await HV0($,Z)!==null}var pY6;var Tp=L(()=>{O7();m8();jX();$V0();Kg();MQ();AF();a5();pY6=new Set(["checks_pending"])});function Su$($){if($===void 0)return;let Z=[];for(let Q of $){let Y=Q.trim().replace(/[\t\r\n]/g,"").replace(/\\/g,"/");if(!Y.startsWith("/")||Y.startsWith("//"))continue;if(!Z.includes(Y))Z.push(Y);if(Z.length===20)break}return Z}import{z as BY}from"zod";function QX6($){return ZX6.some((Z)=>$[Z]!==void 0)}function YX6($,Z){let Q=[];for(let{field:J,action:G}of $X6){if(Z[J]===$[J])continue;Q.push({action:G,data:{from:$[J],to:Z[J]}})}if(Z.description!==$.description)Q.push({action:"description_changed"});let Y=new Set($.tags.map((J)=>J.id));if(Z.tags.length!==$.tags.length||Z.tags.some((J)=>!Y.has(J.id)))Q.push({action:"tags_changed",data:{from:$.tags,to:Z.tags}});return Q}function XX6($,Z){if($!==F8)return!1;if(!Z)return!1;return Z.assigneeId!==F8?!0:Z.status===D1.intake}function JX6($){return qK($)>wp.in_review}function Cu$($,Z,Q){let Y=$!==void 0&&JX6($),X=Z!==void 0&&IJ(Z);return Q&&Y&&X}var $X6,ZX6,s40;var B31=L(()=>{m8();q0();d3();AF();cY1();mY1();fL();jX();NV0();AK();a5();Tp();Kg();MQ();b3();$X6=[{field:"status",action:"status_changed"},{field:"assigneeId",action:"assignee_changed"},{field:"priority",action:"priority_changed"},{field:"type",action:"type_changed"},{field:"dueDate",action:"due_date_changed"},{field:"title",action:"title_changed"}],ZX6=["title","description","status","priority","type","assigneeId","repo","virtualMcpId","dueDate","sortOrder","previewRoutes","tagIds","sprintId"];s40=h({name:"TASK_BOARD_ITEM_UPDATE",description:"Update a task board item's fields (title, description, status, priority, assignee), and/or link a chat thread to it.",annotations:{title:"Update Task Board Item",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:BY.object({id:BY.string(),title:BY.string().min(1).max(li).optional(),description:BY.string().max(ui).nullable().optional(),status:RL.optional(),priority:uy.optional(),type:t80.optional(),assigneeId:BY.string().nullable().optional(),repo:BY.string().max(UM0).nullable().optional(),virtualMcpId:BY.string().nullable().optional().describe("Move the card to this project (`vir_\u2026` id), or null to clear it. "+"When `repo` is omitted the card takes the new project's repository."),dueDate:BY.string().datetime().nullable().optional(),sortOrder:BY.number().optional(),previewRoutes:BY.array(BY.string().max(500)).max(20).optional().describe("Paths this task's work created or edited, e.g. "+'["/cliente-vip", "/cliente-vip/faq"]. Paths only \u2014 no host: the '+"card joins each onto the pull request's deploy-preview origin so a reviewer can open the pages directly. Replaces the previous set; pass [] to clear."),tagIds:BY.array(BY.string()).max(1000).optional(),sprintId:BY.string().nullable().optional().describe("Plan the card into this sprint (an id from TASK_BOARD_SPRINT_LIST), or null to move it to the backlog. A closed sprint takes no new cards."),linkThreadId:BY.string().optional(),prUrl:BY.string().nullable().optional().describe("GitHub pull request URL to link to this task, e.g. https://github.com/owner/repo/pull/123. Pass it after opening a PR for an existing card; linking one is what starts its review.")}),outputSchema:BY.object({item:mi}),handler:async($,Z)=>{p(Z),await Z.access.check();let Q=Z.organization?.id;if(!Q)throw Error("Organization ID required (no active organization in context)");let Y=$.prUrl?zP($.prUrl):null;if($.prUrl&&!Y)throw Error(`Not a change request URL: ${$.prUrl} (expected https://github.com/<owner>/<repo>/pull/<number>, https://gitlab.com/<namespace>/<project>/-/merge_requests/<iid> or https://bitbucket.org/<workspace>/<repo>/pull-requests/<id>)`);if($.assigneeId)await NM0(Z,Q,$.assigneeId);if($.linkThreadId){if(!await Z.storage.taskBoard.getById($.id,Q))throw Error(`Task board item not found: ${$.id}`);if(!await Z.storage.threads.get($.linkThreadId))throw Error(`Thread not found: ${$.linkThreadId}`);await Z.storage.taskBoard.linkThread($.id,$.linkThreadId,Q)}let X=QX6($),J=X?await Z.storage.taskBoard.getById($.id,Q):null;if(X&&!J)throw Error(`Task board item not found: ${$.id}`);if($.sprintId&&$.sprintId!==J?.sprintId)await UV0(Z,Q,$.sprintId);let G=$.virtualMcpId&&$.virtualMcpId!==J?.virtualMcpId?await DM0(Z,Q,$.virtualMcpId):void 0,W=LM0({project:G,repo:$.repo,previousRepo:J?.repo}),K=X7.getStore()?.threadId,H=K!==void 0&&Cu$($.status,J??void 0,!0)&&zS$(await Z.storage.threads.get(K));if(Cu$($.status,J??void 0,H))throw Error("This task is under review \u2014 the run working on it can't move it "+"past In Review. Leave it for the reviewer; only a person, or TASK_BOARD_REVIEW_DECISION on a reviewer's own run, moves on a task under review.");let F=$.assigneeId!==void 0&&$.assigneeId!==(J?.assigneeId??null),U=XX6($.assigneeId,J),B=(U?D1.progress:void 0)??$.status;if(J&&u7(J)){if($.title!==void 0||$.description!==void 0||$.priority!==void 0)throw Error("This task was generated from your report and can't be edited \u2014 create your own task instead.");if(U)await hd(Z,J,IE())}if($.tagIds!==void 0){if($.tagIds.length>0)await BM0(Z,Q,$.tagIds);await Z.storage.taskBoard.setItemTags($.id,$.tagIds,_0(Z))}let D;if(X)D=await Z.storage.taskBoard.update($.id,Q,{title:$.title,description:$.description,status:B,priority:$.priority,type:$.type,assigneeId:$.assigneeId,assignedBy:F?$.assigneeId?_0(Z):null:void 0,...W,virtualMcpId:$.virtualMcpId,dueDate:$.dueDate,sortOrder:$.sortOrder,previewRoutes:Su$($.previewRoutes),sprintId:$.sprintId},_0(Z));else{let O=await Z.storage.taskBoard.getById($.id,Q);if(!O)throw Error(`Task board item not found: ${$.id}`);D=O}if(Y)await Z.storage.taskBoard.linkPr({taskBoardItemId:D.id,organizationId:Q,url:Y.url,prNumber:Y.number,repo:Y.repo,connectionId:null}),await t3(Q).catch((O)=>{console.error("[task-board] PR card cache invalidation failed",O)});if(J){let O=_0(Z),w=YX6(J,D);if(D.sprintId!==J.sprintId)w.push(J31(await Z.storage.sprints.listByOrg(Q),J.sprintId,D.sprintId));if(w.length>0)await dI0(Z,w.map((j)=>({taskBoardItemId:D.id,actorId:O,...j,alsoSubscribe:j.action==="assignee_changed"&&D.assigneeId!==F8?[D.assigneeId]:void 0})))}if(J&&D.description!==J.description)await Z.storage.notifications.notifyMentions({taskBoardItemId:D.id,organizationId:Q,actorId:_0(Z),body:D.description??"",previousBody:J.description});if(X||$.linkThreadId||Y)w8(Q,D);if(U)return await TP(Z,D,{userInitiated:!0}),{item:D};if($.status!==void 0&&J!==null&&J.status!==D.status)D=await Vu$(Z,D);return{item:D}}})});import{z as BV0}from"zod";var r40;var D31=L(()=>{q0();a5();r40=h({name:"TASK_BOARD_ITEM_DELETE",description:"Delete a task board item. A Deco Score task also dismisses its finding, so the next Deco Score import won't re-create the card.",annotations:{title:"Delete Task Board Item",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:BV0.object({id:BV0.string()}),outputSchema:BV0.object({success:BV0.boolean()}),handler:async($,Z)=>{p(Z),await Z.access.check();let Q=Z.organization?.id;if(!Q)throw Error("Organization ID required (no active organization in context)");if(!await Z.storage.taskBoard.delete($.id,Q,_0(Z)??"system"))throw Error(`Task board item not found: ${$.id}`);return ju$(Q,$.id),{success:!0}}})});import{z as IQ}from"zod";function vu$($,Z){g6.emit($,{id:crypto.randomUUID(),type:pJ$,source:"task-board",subject:Z??"board",data:{columnKey:Z},time:new Date().toISOString()})}function L31($){let Z=$.organization?.id;if(!Z)throw Error("Organization ID required (no active organization in context)");return Z}var _u$,GX6=20,a40,e40,$60;var O31=L(()=>{q0();m8();m8();AM0();PP();m8();_u$=IQ.object({columnKey:IQ.string().nullable().describe("null for the org-wide prompt; a column key to scope it."),prompt:IQ.string(),skills:IQ.array(IQ.string())});a40=h({name:"TASK_BOARD_PROMPT_LIST",description:"List the instructions appended to the system prompt of every agent run started from a card on this board. The org-wide prompt comes first; a prompt with a columnKey applies only to cards in that column.",inputSchema:IQ.object({}),outputSchema:IQ.object({prompts:IQ.array(_u$)}),handler:async($,Z)=>{return p(Z),await Z.access.check(),{prompts:await Z.storage.taskBoardPrompts.listByOrg(L31(Z))}}}),e40=h({name:"TASK_BOARD_PROMPT_UPSERT",description:"Set the instructions and skills appended to the system prompt of agent "+"runs started from this board's cards \u2014 house rules for the work "+"(conventions, tools to prefer, what never to touch), not what to do with one card. Replaces the prompt on that scope; omitted `skills` keeps the ones already there. Omit columnKey for the whole board. To clear a scope, use TASK_BOARD_PROMPT_DELETE.",annotations:{readOnlyHint:!1,idempotentHint:!0},inputSchema:IQ.object({columnKey:IQ.string().min(1).nullable().optional().describe("A column of this board (see TASK_BOARD_ITEM_LIST) to scope the prompt to. Omit or null for every card on the board."),prompt:IQ.string().max(sJ$),skills:IQ.array(IQ.string().min(1).max(512)).max(GX6).optional().describe("Skill ids from the org's skill catalog (the `id` the skill tool takes) that runs on this scope should load.")}),outputSchema:IQ.object({prompt:_u$}),handler:async($,Z)=>{p(Z),await Z.access.check();let Q=L31(Z),Y=$.columnKey??null;if(Y!==null){if(!QG.some((H)=>H===Y))throw Error(`This board has no column "${Y}" \u2014 it has ${QG.join(", ")}`)}let X=$.prompt.trim(),J=$.skills?[...new Set($.skills)]:void 0,G=(await Z.storage.taskBoardPrompts.listByOrg(Q)).find((H)=>H.columnKey===Y),W=J?.filter((H)=>!G?.skills.includes(H))??[];if(W.length>0){let H=new Map((await di(Z,Q)).map((N)=>[N.id,N])),F=W.filter((N)=>!H.has(N));if(F.length>0)throw Error(`Unknown skill(s): ${F.join(", ")}`);let U=W.filter((N)=>H.get(N)?.disableModelInvocation);if(U.length>0)throw Error(`Manual-only skill(s) a run can't load: ${U.join(", ")}`)}if(!X){if((J??G?.skills??[]).length===0)throw Error("Nothing to set \u2014 give a prompt or skills, or use TASK_BOARD_PROMPT_DELETE")}let K=await Z.storage.taskBoardPrompts.upsert(Q,Y,{prompt:X,skills:J});return vu$(Q,Y),{prompt:K}}}),$60=h({name:"TASK_BOARD_PROMPT_DELETE",description:"Clear a board prompt. Deleting IS the off switch, so a prompt cannot be set-but-inactive. Omit columnKey to clear the org-wide one.",annotations:{readOnlyHint:!1,idempotentHint:!0},inputSchema:IQ.object({columnKey:IQ.string().min(1).nullable().optional()}),outputSchema:IQ.object({removed:IQ.boolean()}),handler:async($,Z)=>{p(Z),await Z.access.check();let Q=L31(Z),Y=$.columnKey??null,X=await Z.storage.taskBoardPrompts.remove(Q,Y);if(X)vu$(Q,Y);return{removed:X}}})});import{sql as J1}from"kysely";function P31($){let Z=[];for(let Q of $.split("&")){if(BX6(Q)){Z.push({cohort:Q});continue}if(Q==="planned"){Z.push({scope:"planned"});continue}let Y=Q.indexOf(":"),X=DX6.find((G)=>G===Q.slice(0,Y)),J=Q.slice(Y+1);if(Y<0||!X||!J)return null;Z.push({field:X,value:J})}return Z.length>0?Z:null}function LX6($){if("cohort"in $)return J1.raw(EV0[$.cohort]);if("scope"in $)return J1`true`;let{field:Z,value:Q}=$,Y=Q==="none";switch(Z){case"touch":return J1`exists (select 1 from t where t.item_id = f.item_id and t.kind = ${Q})`;case"class":return J1`exists (select 1 from t where t.item_id = f.item_id and t.class = ${Q})`;case"source":return J1`exists (select 1 from task_board_activity a
|
|
1575
1575
|
where a.task_board_item_id = f.item_id and a.occurred_at > f.first_run_at
|
|
1576
1576
|
and ${Q60} and ${jV0} = ${Q})`;case"type":return J1`f.type = ${Q}`;case"priority":return J1`f.priority = ${Q}`;case"tag":return Y?J1`not exists (select 1 from task_board_item_tags g where g.task_board_item_id = f.item_id)`:J1`exists (select 1 from task_board_item_tags g where g.task_board_item_id = f.item_id and g.id = ${Q})`;case"sprint":return Y?J1`f.sprint_id is null`:J1`f.sprint_id = ${Q}`;case"author":return J1`f.created_by = ${Q}`;default:return Z}}class z31{db;constructor($){this.db=$}async rows($){return(await $.execute(this.db)).rows}withFacts($,Z){return this.db.transaction().execute(async(Q)=>{return await J1`create temp table operation_facts on commit drop as ${Z60($)}`.execute(Q),Z({rows:async(Y)=>(await Y.execute(Q)).rows,f:J1`select * from operation_facts`})})}async delivery($){let Z=DV0($),[Q]=await this.rows(J1`
|
|
1577
1577
|
with moves as (${Z}), shipped as (${LV0})
|
|
@@ -4323,7 +4323,7 @@ ${J.join(`
|
|
|
4323
4323
|
`)}`:X}function Y55($){let Z=new Set;for(let Q of $)for(let Y of Q.split(`
|
|
4324
4324
|
`)){let X=Y.trim();if(/^Co-authored-by:\s/i.test(X))Z.add(X)}return[...Z]}var RH8=200,i65=12,p65,t65,o65=6,r65=300,Hx0=3;var xE1=L(()=>{O7();GZ0();r$();Kx0();p65={aheadBy:0,behindBy:0,files:[]};t65=/(?:^|\/)\.deco\/blocks\/[^/]+\.json$/i});function J55($){if(!$||$.includes(".."))return!1;return X55.test($)}function IH8($){return G55.includes($)}function fE1($){let Z=typeof $.__resolveType==="string"?$.__resolveType:null;if(!Z||!J55(Z))return null;let{__resolveType:Q,...Y}=$;return{resolveType:Z,payload:Y}}function yE1($,Z){return`${$.replace(/\/+$/,"")}/deco/invoke/${Z}`}var X55,G55;var VH8=L(()=>{X55=/^[\w./@-]+$/;G55=["vtex/loaders/intelligentSearch/productList.ts","vtex/loaders/categories/tree.ts"]});function UZ0($,Z){let Q=$?.repository;if(!Q?.owner||!Q?.name)return null;if(!Q.connectionId)return Q;if(!Z.includes(Q.connectionId))return null;return Q}async function SH8($,Z,Q,Y){let X=$.organization?.id;if(!X)throw new jz(t7);let J=await TN($.storage,X,Y);if(J&&await NL($.storage,J)){let F=await AN($,J,{forceRefresh:!0}).catch((U)=>{throw new jz(U instanceof Error?U.message:t7)});await kH8($,Z,Q,F);return}let G=Y.connectionId??J?.legacyConnectionId;if(!G)throw new jz("Push requires a connected git account. Connect the repository's provider for this project and restart the sandbox.");await Zi({ctx:$,connectionId:G,organizationId:X,forceRefresh:!0,onLegacyMintError:(F)=>{let U=F instanceof Error?F.message:t7;throw new jz(U)}});let{cloneUrl:W,gitUserName:K,gitUserEmail:H}=await qN(G,Y.owner,Y.name,$.db,$.vault).catch((F)=>{let{code:U,message:N}=Iz$(F instanceof Error?F.message:String(F));throw U?new jz(N):F});await kH8($,Z,Q,{cloneUrl:W,gitUserName:K,gitUserEmail:H})}async function kH8($,Z,Q,Y){let{cloneUrl:X,gitUserName:J,gitUserEmail:G}=Y,W=Rt($),K=await Z.proxyDaemonRequest(Q,"/_sandbox/config",{method:"PUT",headers:new Headers({"content-type":"application/json"}),body:JSON.stringify({git:{repository:{cloneUrl:X},identity:{userName:J,userEmail:G}},...W?{operator:W}:{}})});if(!K.ok){let H=await XP(K,W55).catch(()=>K.statusText);throw Error(`Failed to refresh sandbox git credentials (${K.status}): ${H}`)}}var W55=10485760,jz;var gE1=L(()=>{_3();ab0();m80();eU0();p$0();O7();jz=class jz extends Error{constructor($){super($);this.name="GitPushAuthError"}}});function H55($){let Z=$.startsWith("thread:")?$.slice(7):$;if(!Z||Z.length>255||Z.includes("..")||Z.startsWith("/")||Z.endsWith("/")||Z.endsWith(".lock")||!K55.test(Z))throw Error(`Invalid branch name: ${$}`)}function kh($){return AbortSignal.any([$.req.raw.signal,AbortSignal.timeout(U55)])}async function B55($,Z){let Q=$.var.studioContext,Y=DX(Z.branch),X=$.req.query("thread")??Y,J=X&&X===Y?Z.branchThread:X?await Q.storage.threads.get(X).catch(()=>null):null,G=J?.virtual_mcp_id===Z.virtualMcpId?J:null,W=fy(G?.metadata?.runtime);if(W)return W;let K=JM0(Z.virtualMcpMetadata),H=K==="cms"?await BE1(Q,{claimName:Z.claimName}):"alive",F=K==="cms"&&H!=="alive"?"cms":"sandbox",U=!!G&&(H==="gone"||H==="alive"&&K==="cms");if(U&&G)d80(Q,G.id,F);if(K==="cms")console.log("sandbox proxy: no runtime stamp",{route:$.req.path,method:$.req.method,reason:G?"unstamped":"threadless",liveness:H,resolved:F,stamped:U});return F}async function D55($){let Z=$.get("vmClaim");if(Z.runner)return Z.runner;try{return await Y7($.var.studioContext)}catch{return null}}function St($){let{runner:Z}=$.get("vmClaim");if(!Z)return $.json({error:"No sandbox runner configured"},503);return Z}async function BZ0($){let{virtualMcpMetadata:Z,connectionIds:Q}=$.get("vmClaim"),Y=$.var.studioContext,X=UZ0(Z,Q);if(!X)throw new y0({provider:"github",status:404,message:"Project has no repository"});let J=Y0(Y);return ad(Y,J.id,X)}function uE1($,Z){let Q=Z instanceof Error?Z.message:String(Z),Y=lE$(Z);if(Y!==void 0)return $.json({error:Q},429,{...gZ,...Y===null?{}:{"Retry-After":String(Math.ceil(Y/1000))}});if(Z instanceof Z5)return $.json({error:Q},409,gZ);let X=BK(Z);if(X!==null){let J=X===404?404:X===409||X===422?409:502;return $.json({error:Q},J,gZ)}return $.json({error:Q},502,gZ)}async function hE1($,Z,Q){let Y;try{Y=await fetch(Z,Q)}catch{return $.json({error:"Preview unreachable"},502)}let X;try{X=await Y.text()}catch{return $.json({error:"Preview unreachable"},502)}return new Response(X,{status:Y.status,headers:{"content-type":Y.headers.get("content-type")??"application/json"}})}async function vH8($){try{let Z=await BZ0($),Q=await vE1(Z,$.get("vmClaim").branch);return $.json(Q,200,gZ)}catch(Z){return uE1($,Z)}}function NZ0($,Z){let Y=(Ux0.get($)??Promise.resolve()).catch(()=>{}).then(Z),X=Y.catch(()=>{});return Ux0.set($,X),X.finally(()=>{if(Ux0.get($)===X)Ux0.delete($)}),Y}async function bQ($,Z,Q){if(!Q?.runner&&$.get("vmClaim").runtime==="cms")return $.json({error:"sandbox not found: this session is sandbox-less"},404,gZ);let Y=Q?.runner??St($);if(Y instanceof Response)return Y;let{claimName:X,userId:J,projectRef:G}=$.get("vmClaim"),W=Q?.method??"POST",K=null,H=new Headers;if(Q?.jsonBody!==void 0)K=Q.jsonBody,H.set("content-type","application/json");else if(Q?.forwardJsonBody)K=await $.req.text(),H.set("content-type","application/json");let F=Q?.signal,U={method:W,headers:H,body:K,...F?{signal:F}:{}},N=async()=>{let B=await Y.proxyDaemonRequest(X,Z,U);if(Q?.map404to410&&B.status===404){try{await B.body?.cancel()}catch{}if(await Y.adoptLiveClaim({userId:J,projectRef:G},X))B=await Y.proxyDaemonRequest(X,Z,U);if(B.status===404){try{await B.body?.cancel()}catch{}return new Response(JSON.stringify({error:"Sandbox handle is gone. The sandbox needs to be re-provisioned."}),{status:410,headers:{"content-type":"application/json",...gZ}})}}let D=await B.text(),O=Q?.redactRepoDir?L55(D):D,w=B.headers.get("content-type")??"application/json";return new Response(O,{status:B.status,headers:{"content-type":w,...gZ}})};try{if(F){let B=N();return B.catch(()=>{}),await Promise.race([B,new Promise((O,w)=>{if(F.aborted)return w(F.reason);F.addEventListener("abort",()=>w(F.reason),{once:!0})})])}return await N()}catch(B){let D=B instanceof Error?B.message:String(B);return $.json({error:`Daemon unreachable: ${D}`},502)}}function L55($){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 bH8($,Z,Q,Y="GET",X){let J=await $.proxyDaemonRequest(Z,Q,{method:Y,headers:new Headers,body:null});if(J.status===404&&X){try{await J.body?.cancel()}catch{}if(await $.adoptLiveClaim(X,Z))J=await $.proxyDaemonRequest(Z,Q,{method:Y,headers:new Headers,body:null})}if(J.status===404){try{await J.body?.cancel()}catch{}throw Error("SANDBOX_GONE")}let G=await J.text();if(!J.ok){let W=`Daemon error (${J.status})`;try{W=JSON.parse(G).error??W}catch{}throw Error(W)}return JSON.parse(G)}function O55($){return xH8.includes($)}var K55,F55=524288,CH8=65536,U55=1e4,_H8=2000,N55,Ux0,gZ,xH8,fH8=()=>{let $=new Q1;$.use("/:virtualMcpId/:branch/*",N55),$.post("/:virtualMcpId/:branch/write",(Q)=>bQ(Q,"/_sandbox/write",{forwardJsonBody:!0,signal:kh(Q)})),$.post("/:virtualMcpId/:branch/unlink",(Q)=>bQ(Q,"/_sandbox/unlink",{forwardJsonBody:!0,signal:kh(Q)})),$.post("/:virtualMcpId/:branch/mkdir",(Q)=>bQ(Q,"/_sandbox/mkdir",{forwardJsonBody:!0,signal:kh(Q)})),$.post("/:virtualMcpId/:branch/rename",(Q)=>bQ(Q,"/_sandbox/rename",{forwardJsonBody:!0,signal:kh(Q)})),$.post("/:virtualMcpId/:branch/read",(Q)=>bQ(Q,"/_sandbox/read",{forwardJsonBody:!0,signal:kh(Q)})),$.post("/:virtualMcpId/:branch/glob",(Q)=>bQ(Q,"/_sandbox/glob",{forwardJsonBody:!0,signal:kh(Q)})),$.post("/:virtualMcpId/:branch/grep",(Q)=>bQ(Q,"/_sandbox/grep",{forwardJsonBody:!0,signal:kh(Q)})),$.post("/:virtualMcpId/:branch/exec/:script",async(Q)=>{let Y=Q.req.param("script");if(!Y)return Q.json({error:"missing script name"},400);return bQ(Q,`/_sandbox/exec/${encodeURIComponent(Y)}`)}),$.post("/:virtualMcpId/:branch/exec/:script/kill",async(Q)=>{let Y=Q.req.param("script");if(!Y)return Q.json({error:"missing script name"},400);return bQ(Q,`/_sandbox/exec/${encodeURIComponent(Y)}/kill`)}),$.get("/:virtualMcpId/:branch/config",(Q)=>bQ(Q,"/_sandbox/config",{method:"GET",map404to410:!0,redactRepoDir:!0})),$.put("/:virtualMcpId/:branch/config",(Q)=>bQ(Q,"/_sandbox/config",{method:"PUT",forwardJsonBody:!0,map404to410:!0})),$.post("/:virtualMcpId/:branch/setup/:step",async(Q)=>{let Y=Q.req.param("step");if(!Y||!O55(Y))return Q.json({error:`step must be one of: ${xH8.join(", ")}`},400);let X=Q.get("vmClaim"),J=await BE1(Q.var.studioContext,{claimName:X.claimName})==="gone"?null:await D55(Q);if(!J)return Q.json({error:"sandbox not found: nothing is running at this ref"},404,gZ);if(Y==="start"){let G=Y0(Q.var.studioContext),W=xi(X.virtualMcpMetadata);try{await ZM0({ctx:Q.var.studioContext,runner:J,handle:X.claimName,orgId:G.id,userId:X.callerUserId,entries:W})}catch(K){let H=K instanceof Error?K.message:String(K);return Q.json({error:`Failed to push env to daemon: ${H}`},502)}}return bQ(Q,`/_sandbox/setup/${Y}`,{signal:Q.req.raw.signal,map404to410:!0,runner:J})}),$.get("/:virtualMcpId/:branch/events",(Q)=>{let Y=Q.get("vmClaim");if(!Y.runner)return jO(Q,async(X)=>{await X.writeSSE({event:"phase",data:JSON.stringify({kind:"failed",reason:"unknown",message:"No sandbox runner configured on this studio instance."})})});return _K8(Q,{ctx:Q.var.studioContext,claimName:Y.claimName,runner:Y.runner,virtualMcpId:Y.virtualMcpId,branch:Y.branch,userId:Y.userId,projectRef:Y.projectRef,virtualMcpMetadata:Y.virtualMcpMetadata})}),$.get("/:virtualMcpId/:branch/git/status",(Q)=>{if(Q.get("vmClaim").runtime==="cms")return vH8(Q);return Z(Q)});let Z=(Q)=>bQ(Q,"/_sandbox/git/status",{method:"GET",map404to410:!0,signal:AbortSignal.any([Q.req.raw.signal,AbortSignal.timeout(_H8)])});return $.post("/:virtualMcpId/:branch/git/status",(Q)=>{if(Q.get("vmClaim").runtime==="cms")return vH8(Q);return bQ(Q,"/_sandbox/git/status",{map404to410:!0,signal:AbortSignal.any([Q.req.raw.signal,AbortSignal.timeout(_H8)])})}),$.post("/:virtualMcpId/:branch/git/diff",async(Q)=>{let Y=Q.get("vmClaim");if(Y.runtime==="cms")try{let X=await Q.req.json().catch(()=>({})),J=await BZ0(Q),G=await bE1(J,Y.branch,X.base);return Q.json(G,200,gZ)}catch(X){return uE1(Q,X)}return bQ(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,gZ);let Y=St(Q);if(Y instanceof Response)return Y;let{claimName:X,virtualMcpMetadata:J,connectionIds:G}=Q.get("vmClaim"),W=Q.var.studioContext;return NZ0(X,async()=>{try{await DE1(W,Y,X);let K=UZ0(J,G);if(K)await SH8(W,Y,X,K)}catch(K){if(K instanceof jz)return Q.json({error:K.message},403,gZ);let H=K instanceof Error?K.message:String(K);return Q.json({error:H},502,gZ)}return bQ(Q,"/_sandbox/git/publish",{forwardJsonBody:!0,map404to410:!0})})}),$.post("/:virtualMcpId/:branch/git/discard",async(Q)=>{let Y=Q.get("vmClaim");if(Y.runtime==="cms")return NZ0(Y.claimName,async()=>{let X=await Q.req.json().catch(()=>({})),J=Array.isArray(X.filepaths)?X.filepaths.filter((G)=>typeof G==="string"):[];if(J.length===0)return Q.json({error:"filepaths is required"},400,gZ);try{let G=await BZ0(Q);return await MH8(G,Y.branch,J),Q.json({ok:!0},200,gZ)}catch(G){let W=BK(G)===409||G instanceof Z5?409:502,K=G instanceof Error?G.message:String(G);return Q.json({error:K},W,gZ)}});return NZ0(Y.claimName,()=>bQ(Q,"/_sandbox/git/discard",{forwardJsonBody:!0,map404to410:!0}))}),$.post("/:virtualMcpId/:branch/git/rebase",async(Q)=>{let Y=Q.get("vmClaim");if(Y.runtime==="cms")return NZ0(Y.claimName,async()=>{try{let W=await Q.req.json().catch(()=>({})),K=await BZ0(Q),H=W.base??await K.getDefaultBranch();return await Fx0(K,Y.branch,H),Q.json({ok:!0},200,gZ)}catch(W){return uE1(Q,W)}});let X=St(Q);if(X instanceof Response)return X;let{claimName:J}=Q.get("vmClaim"),G=Q.var.studioContext;return NZ0(J,async()=>{try{await DE1(G,X,J)}catch(W){let K=W instanceof Error?W.message:String(W);return Q.json({error:K},502,gZ)}return bQ(Q,"/_sandbox/git/rebase",{forwardJsonBody:!0,map404to410:!0})})}),$.post("/:virtualMcpId/:branch/git/judge-review",g5({maxSize:F55,onError:(Q)=>Q.json({error:"Payload too large"},413,gZ)}),async(Q)=>{let Y=Q.get("vmClaim"),X=null;if(Y.runtime!=="cms"){let H=St(Q);if(H instanceof Response)return H;X=H}let{claimName:J,userId:G,projectRef:W}=Y,K=Q.var.studioContext;try{let H=await Q.req.json().catch(()=>({})),F=H.status,U=H.diff,N=U!=null&&typeof U.diffs==="object"&&U.diffs!==null,[B,D]=xK8(F)&&N?[F,U]:X?await Promise.all([bH8(X,J,"/_sandbox/git/status","GET",{userId:G,projectRef:W}),bH8(X,J,"/_sandbox/git/diff","GET",{userId:G,projectRef:W})]):await(async()=>{let w=await BZ0(Q);return Promise.all([vE1(w,Y.branch),bE1(w,Y.branch)])})();await XK(K,Y0(K).id,"judging whether a change needs review");let O=await gK8(K,B,D,typeof H.language==="string"?H.language:void 0);return Q.json(O,200,gZ)}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,gZ);return Q.json({error:F},502,gZ)}}),$.get("/:virtualMcpId/:branch/preview-fetch",async(Q)=>{let Y=St(Q);if(Y instanceof Response)return Y;let{claimName:X}=Q.get("vmClaim"),J=Q.req.query("path");if(!J||!J.startsWith("/")||J.startsWith("//")||J.includes("..")||J.includes("\\"))return Q.json({error:"Path not allowed"},403);let G;try{G=await Y.getPreviewUrl(X)}catch{return Q.json({error:"Preview not available"},502)}if(!G)return Q.json({error:"Preview not available"},502);let W=G.replace(/\/+$/,"");return hE1(Q,`${W}${J}`)}),$.post("/:virtualMcpId/:branch/preview-invoke",g5({maxSize:CH8,onError:(Q)=>Q.json({error:"Payload too large"},413)}),async(Q)=>{let Y=St(Q);if(Y instanceof Response)return Y;let{claimName:X}=Q.get("vmClaim"),J;try{J=await Y.getPreviewUrl(X)}catch{return Q.json({error:"Preview not available"},502)}if(!J)return Q.json({error:"Preview not available"},502);let G;try{G=await Q.req.json()}catch{return Q.json({error:"Invalid JSON body"},400)}if(!G||typeof G!=="object"||Array.isArray(G))return Q.json({error:"Invalid JSON body"},400);let W=fE1(G);if(!W)return Q.json({error:"Invalid or missing __resolveType"},400);let K=yE1(J,W.resolveType);return hE1(Q,K,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(W.payload),signal:AbortSignal.timeout(30000)})}),$.post("/:virtualMcpId/:branch/catalog-invoke",g5({maxSize:CH8,onError:(Q)=>Q.json({error:"Payload too large"},413)}),async(Q)=>{let{runner:Y,claimName:X,virtualMcpMetadata:J}=Q.get("vmClaim"),G;try{G=Y?await Y.getPreviewUrl(X):fi(J)}catch{return Q.json({error:"Preview not available"},502)}if(!G)return Q.json({error:"Preview not available"},502);let W;try{W=await Q.req.json()}catch{return Q.json({error:"Invalid JSON body"},400)}if(!W||typeof W!=="object"||Array.isArray(W))return Q.json({error:"Invalid JSON body"},400);let K=fE1(W);if(!K)return Q.json({error:"Invalid or missing __resolveType"},400);if(!IH8(K.resolveType))return Q.json({error:"resolveType not allowed"},403);let H=yE1(G,K.resolveType);return hE1(Q,H,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(K.payload),signal:AbortSignal.timeout(30000)})}),$};var yH8=L(()=>{W8();oK();Tt();NE1();bi();kK8();BX();yi();SK8();RJ();QF();CK8();vK8();kY1();c80();hK8();O7();k5();xE1();VH8();i80();gE1();K55=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;N55=rb0(async($,Z)=>{let Q=$.var.studioContext;try{p(Q)}catch{return $.json({error:"Unauthorized"},401)}let Y=_0(Q);if(!Y)return $.json({error:"Unauthorized"},401);let X;try{X=Y0(Q)}catch{return $.json({error:"Organization scope required"},403)}let J=$.req.param("virtualMcpId"),G=$.req.param("branch");if(!J||!G)return $.json({error:"virtualMcpId and branch are required"},400);try{H55(G)}catch(O){let w=O instanceof Error?O.message:String(O);return $.json({error:w},400)}let W=await Q.storage.virtualMcps.findById(J);if(!W||W.organization_id!==X.id)return $.json({error:"Virtual MCP not found"},404);let K=z80({orgId:X.id,virtualMcpId:J,branch:G}),H=await xY1(Q,G),F=fY1(H,Y),U=VK8({userId:F,projectRef:K}),N=W.metadata??null,B=await B55($,{claimName:U,branch:G,virtualMcpId:J,sandboxUserId:F,virtualMcpMetadata:N,branchThread:H});if(B==="cms")return $.set("vmClaim",{claimName:U,callerUserId:Y,runner:null,virtualMcpId:J,branch:G,userId:F,projectRef:K,virtualMcpMetadata:N,connectionIds:W.connections?.map((O)=>O.connection_id)??[],runtime:B}),Z();let D;try{D=await Y7(Q)}catch{D=null}if(!D)return $.json({error:"No sandbox runner found"},404);return $.set("vmClaim",{claimName:U,callerUserId:Y,runner:D,virtualMcpId:J,branch:G,userId:F,projectRef:K,virtualMcpMetadata:N,connectionIds:W.connections?.map((O)=>O.connection_id)??[],runtime:B}),Z()});Ux0=new Map;gZ={"Cache-Control":"no-store, no-cache, must-revalidate",Pragma:"no-cache"};xH8=["clone","install","start"]});function gH8($,Z,Q){let Y=lE1.get($);if(!Y)Y={pending:null,running:!1},lE1.set($,Y);if(!Y.pending)Y.pending={patches:[],deps:Z};let X=Y.pending;X.deps=Z;let J=new Promise((G,W)=>{X.patches.push({patch:Q,resolve:G,reject:W})});if(!Y.running)j55($,Y);return J}async function j55($,Z){Z.running=!0;try{while(Z.pending){let Q=Z.pending;Z.pending=null;try{let{sha:Y,accepted:X,conflicts:J}=await z55(Q);for(let G of X)G.resolve(Y);for(let{queued:G,blocks:W}of J)G.reject(new Nx0(W))}catch(Y){for(let X of Q.patches)X.reject(Y)}}}finally{if(Z.running=!1,!Z.pending)lE1.delete($)}}async function E55($,Z,Q,Y){let X=new Map,J=[];for(let W of Q){let K=Wx0(Z,W)[0],H=K?Z.find((F)=>F.path===K):void 0;if(!H)X.set(W,null);else J.push({key:W,stem:H.stem,sha:H.sha})}let G=await CE1($,J,Y);for(let[W,{content:K}]of G.entries()){let H=J[W].key;try{X.set(H,await $x0(JSON.parse(K)))}catch{X.set(H,hH8)}}return X}async function P55($,Z){let Q=new Map(Z),Y=[],X=[];for(let J of $){let{patch:G}=J,W=Object.entries(G.expect??{}).filter(([K,H])=>{let F=Q.get(K);return F!==hH8&&F!==H}).map(([K])=>K);if(W.length>0){X.push({queued:J,blocks:W});continue}Y.push(J);for(let[K,H]of Object.entries(G.set??{}))if(Q.has(K))Q.set(K,await $x0(H));for(let K of G.delete??[])if(Q.has(K))Q.set(K,null)}return{accepted:Y,conflicts:X}}async function z55($){let{client:Z,branch:Q,packagePath:Y}=$.deps,X=new Map;for(let J=0;;J++){let G=await kt(Z,Q),W=await Z.listDecofileEntries(G,Y),K=SE1(W,Y),H=new Set($.patches.flatMap(({patch:j})=>Object.keys(j.expect??{}))),{accepted:F,conflicts:U}=await P55($.patches,H.size>0?await E55(Z,K,H,X):new Map),N=new Map,B=new Set;for(let{patch:j}of F){for(let[E,P]of Object.entries(j.set??{}))N.set(E,P),B.delete(E);for(let E of j.delete??[])B.add(E),N.delete(E)}let D=[],O=new Map(K.map((j)=>[j.path,{stem:j.stem,sha:j.sha}]));for(let[j,E]of N){let P=Wx0(K,j),T=`${JSON.stringify(E,null,2)}
|
|
4325
4325
|
`;await zH8(Z.repo,T);let z=P[0]??`${Gx0(Y)}/${EE1(j)}.json`;D.push({path:z,content:T});let A=z.slice(z.lastIndexOf("/")+1,-5);O.set(z,{stem:A,content:T});for(let q of P.slice(1))D.push({path:q,deleted:!0}),O.delete(q)}for(let j of B)for(let E of Wx0(K,j))D.push({path:E,deleted:!0}),O.delete(E);if(D.length===0)return{sha:G,accepted:F,conflicts:U};let w=Y?`${Y}/.deco/blocks.gen.json`:".deco/blocks.gen.json";if(W.some((j)=>j.type==="blob"&&j.path===w)){let j=await CE1(Z,O.values(),X),{decofile:E,skipped:P}=YZ0(j);if(P.length>0)console.warn("decofile gen: dropped blocks that were not valid JSON",{repo:YF(Z.repo),branch:Q,packagePath:Y,blocks:P.map((T)=>T.key)});D.push({path:w,content:E})}try{let{sha:j}=await Z.commitFiles({branch:Q,message:A55(N,B,$.deps.coAuthor),expectedHead:G,changes:D});return{sha:j,accepted:F,conflicts:U}}catch(j){if(!(j instanceof Z5)||J>=w55-1)throw j;await D$(I7(2000,200,J,2,0.5))}}}function A55($,Z,Q){let Y=(G)=>{let W=G.slice(0,3).join(", ");return G.length>3?`${W} (+${G.length-3} more)`:W},X=[];if($.size>0)X.push(`update ${Y([...$.keys()])}`);if(Z.size>0)X.push(`delete ${Y([...Z])}`);let J=`chore(decofile): ${X.join("; ")}`;return ZQ1(J,Q)}var w55=3,Nx0,lE1,hH8;var uH8=L(()=>{Pq0();GZ0();t4();r$();O7();Kx0();Nx0=class Nx0 extends Error{blocks;constructor($){super(`Blocks changed since they were loaded: ${$.join(", ")}`);this.blocks=$;this.name="BlockConflictError"}};lE1=new Map;hH8=Symbol("unreadable")});import{createHmac as lH8,randomBytes as T55,timingSafeEqual as R55}from"crypto";function cH8(){if(Bx0)return Bx0;let $;try{let Z=L0();$=Z.studioJwtSecret??Z.betterAuthSecret}catch{$=void 0}return Bx0=$?Buffer.from($):T55(32),Bx0}function cE1($){let Z=$.nowMs??Date.now(),Q={o:$.organizationId,m:$.virtualMcpId,b:$.branch,e:Math.floor((Z+q55)/1000)},Y=Buffer.from(JSON.stringify(Q)).toString("base64url"),X=lH8("sha256",cH8()).update(Y).digest("base64url");return`${Y}.${X}`}function mH8($,Z){let Q=$.indexOf(".");if(Q<0)return!1;let Y=$.slice(0,Q),X=Buffer.from($.slice(Q+1)),J=Buffer.from(lH8("sha256",cH8()).update(Y).digest("base64url"));if(X.length!==J.length||!R55(X,J))return!1;let G;try{G=JSON.parse(Buffer.from(Y,"base64url").toString())}catch{return!1}let W=Math.floor((Z.nowMs??Date.now())/1000);return G.o===Z.organizationId&&G.m===Z.virtualMcpId&&G.b===Z.branch&&typeof G.e==="number"&&G.e>=W}var q55=21600000,Bx0=null;var dH8=L(()=>{r1()});function Dx0($){return $&&typeof $==="object"&&!Array.isArray($)?$:null}function M55($){for(let[Z,Q]of Object.entries($)){if(!Z.startsWith("collections/blog/posts/"))continue;let Y=Dx0(Q)?.__resolveType;if(typeof Y==="string"&&Y)return Y}return"blog/loaders/Blogpost.ts"}function iH8($){let Z;try{Z=Dx0(JSON.parse($))}catch{return $}if(!Z)return $;let Q=M55(Z),Y={...Z},X=0;for(let[J,G]of Object.entries(Z)){if(!J.startsWith("blog-manager/posts/"))continue;let W=Dx0(G),K=W&&Dx0(W.post);if(!K)continue;if(K.status==="archived")continue;if(typeof K.slug!=="string"||!K.slug)continue;let F=`collections/blog/posts/${J.slice(19)}`;if(Object.hasOwn(Y,F))continue;Y[F]={name:F,__resolveType:Q,["post"]:{...K,status:"published"}},X++}return X>0?JSON.stringify(Y):$}import{z as PO}from"zod";function V55($){return $.length>0&&$.length<=255&&!$.includes("..")&&!$.endsWith("/")&&!$.endsWith(".lock")&&I55.test($)}function sH8($){return $.req.header("x-forwarded-host")??new URL($.req.url).host}async function DZ0($){let Z=$.get("decofileScope");return ad($.var.studioContext,Z.organizationId,Z.repository)}function LZ0($,Z){let Q=Z instanceof Error?Z.message:String(Z);if(Z instanceof Nx0)return $.json({error:Q,code:"block-conflict",blocks:Z.blocks},409);if(Z instanceof Z5)return $.json({error:Q},409);let Y=BK(Z);if(Y!==null){let X=Y===404?404:Y===409||Y===422?409:502;return $.json({error:Q},X)}return $.json({error:Q},500)}function rH8(){let $=new Q1;return $.use("/:virtualMcpId/:branch",oH8),$.use("/:virtualMcpId/:branch/*",oH8),$.get("/:virtualMcpId/:branch",async(Z)=>{let Q=Z.get("decofileScope");try{let Y=await DZ0(Z),X=await AH8(Y,Q.branch,Q.packagePath,{createBranchIfMissing:!!Q.userId}),J={ETag:`"${X.sha}"`,"Cache-Control":"no-store","Access-Control-Allow-Origin":"*"};if(Z.req.header("if-none-match")===`"${X.sha}"`)return Z.body(null,304,J);if(!Q.userId)return Z.body(iH8(X.decofile),200,{...J,"content-type":"application/json"});let G=cE1({organizationId:Q.organizationId,virtualMcpId:Q.virtualMcpId,branch:Q.branch});return Z.body(`{"version":${JSON.stringify(X.sha)},"token":${JSON.stringify(G)},"apiHost":${JSON.stringify(sH8(Z))},"decofile":${X.decofile}}`,200,{...J,"content-type":"application/json"})}catch(Y){return LZ0(Z,Y)}}),$.get("/:virtualMcpId/:branch/meta",async(Z)=>{let Q=Z.get("decofileScope"),Y=Q.packagePath?`${Q.packagePath}/.deco/meta.gen.json`:".deco/meta.gen.json";try{let X=await DZ0(Z),J=await X.readFileAtRef(Q.branch,Y);if(J===null){let G=await X.getDefaultBranch();if(G!==Q.branch)J=await X.readFileAtRef(G,Y)}if(J===null)return Z.json({error:"meta.gen.json not committed"},404);return Z.body(J,200,{"content-type":"application/json","Cache-Control":"no-store","Access-Control-Allow-Origin":"*"})}catch(X){return LZ0(Z,X)}}),$.patch("/:virtualMcpId/:branch",S55,async(Z)=>{let Q=Z.get("decofileScope"),Y=Z.var.studioContext,X=C55.safeParse(await Z.req.json().catch(()=>null));if(!X.success)return Z.json({error:"Invalid body",details:X.error.issues},400);let J;try{J=Ih(X.data)}catch(G){if(G instanceof XZ0)return Z.json({error:G.message},400);throw G}for(let G of[...Object.keys(J.set??{}),...J.delete??[]])try{eb0(G)}catch(W){let K=W instanceof Error?W.message:String(W);return Z.json({error:K},400)}for(let[G,W]of Object.entries(J.set??{})){if(typeof W!=="object"||W===null||Array.isArray(W))return Z.json({error:`Block "${G}" must be a JSON object`},400);if(jE1(G))return Z.json({error:`Block key "${G}" collides with a framework resolver module and cannot be written`},400)}try{let G=await DZ0(Z),W=await gH8(`${Q.organizationId}/${Q.virtualMcpId}/${Q.branch}`,{client:G,branch:Q.branch,packagePath:Q.packagePath,coAuthor:Rt(Y)},J),K=cE1({organizationId:Q.organizationId,virtualMcpId:Q.virtualMcpId,branch:Q.branch});return Z.json({version:W,token:K,apiHost:sH8(Z)})}catch(G){return LZ0(Z,G)}}),$.post("/:virtualMcpId/:branch/publish",async(Z)=>{let Q=Z.get("decofileScope");try{let Y=await DZ0(Z),X=await Y.getDefaultBranch();if(X===Q.branch)return Z.json({error:"Branch is already the default branch"},400);let J=`chore(decofile): publish ${Q.branch}`;try{let G;try{G=await Y.mergeBranches(X,Q.branch,J)}catch(W){if(BK(W)!==409)throw W;await Fx0(Y,Q.branch,X),G=await Y.mergeBranches(X,Q.branch,J)}return G?Z.json({result:"merged",sha:G}):Z.json({result:"up-to-date"})}catch(G){if(BK(G)===409)return Z.json({error:"merge-conflict"},409);if(BK(G)===405){let K=await Y.findOpenChangeRequest(X,Q.branch)??await Y.createChangeRequest({base:X,head:Q.branch,title:`Publish ${Q.branch}`});return Z.json({result:"pull-request",number:K.number,url:K.url})}throw G}}catch(Y){return LZ0(Z,Y)}}),$.get("/:virtualMcpId/:branch/status",async(Z)=>{let Q=Z.get("decofileScope");try{let Y=await DZ0(Z),X=await Y.getDefaultBranch();if(X===Q.branch)return Z.json({baseBranch:X,aheadBy:0,behindBy:0});try{let{aheadBy:J,behindBy:G}=await Y.compare(X,Q.branch);return Z.json({baseBranch:X,aheadBy:J,behindBy:G})}catch(J){if(BK(J)===404)return Z.json({baseBranch:X,aheadBy:0,behindBy:0});throw J}}catch(Y){return LZ0(Z,Y)}}),$}var I55,pH8=500,nH8=1048576,tH8=1024,k55=8388608,S55,C55,oH8;var aH8=L(()=>{i80();GZ0();W8();oK();NE1();ab0();gE1();O7();uH8();dH8();xE1();Kx0();QF();I55=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;S55=g5({maxSize:k55,onError:($)=>$.json({error:"Payload too large"},413)}),C55=PO.object({set:PO.record(PO.string(),PO.unknown()).optional(),delete:PO.array(PO.string()).optional(),expect:PO.record(PO.string(),PO.string().regex(/^[0-9a-f]{64}$/).nullable()).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)<=pH8,{message:`Patch cannot touch more than ${pH8} blocks`}).refine(($)=>Object.values($.set??{}).every((Z)=>JSON.stringify(Z).length<=nH8),{message:`Each block must be at most ${nH8} bytes`}).refine(($)=>[...Object.keys($.set??{}),...$.delete??[]].every((Z)=>Z.length<=tH8),{message:`Each block key must be at most ${tH8} characters`}).refine(($)=>Object.keys($.expect??{}).every((Z)=>(Z in($.set??{}))||($.delete??[]).includes(Z)),{message:"Each expected block must be one the patch sets or deletes"}).refine(($)=>Object.keys($.set??{}).every((Z)=>!($.delete??[]).includes(Z)),{message:"A block cannot be both set and deleted in the same patch"}),oH8=rb0(async($,Z)=>{let Q=$.var.studioContext,Y=Q.organization;if(!Y)return $.json({error:"Organization scope required"},500);let X=$.req.param("virtualMcpId"),J=$.req.param("branch");if(!X||!J)return $.json({error:"virtualMcpId and branch are required"},400);if(!V55(J))return $.json({error:`Invalid branch name: ${J}`},400);let G=Q.auth?.user?.id??null;if(!G){let B=$.req.query("token");if(!($.req.method==="GET"&&!$.req.path.match(/\/(publish|status)$/)))return $.json({error:"Unauthorized"},401);if(!B||!mH8(B,{organizationId:Y.id,virtualMcpId:X,branch:J}))return $.json({error:"Unauthorized"},401)}if(!await BG(Q,Y.id,"cms"))return $.json({error:"This organization's plan does not include the CMS",code:"feature_not_in_plan"},403);let W=await Q.storage.virtualMcps.findById(X);if(!W||W.organization_id!==Y.id)return $.json({error:"Virtual MCP not found"},404);let K=W.metadata??null;if(!fi(K))return $.json({error:"Project has no preview server configured"},404);let F=W.connections?.map((B)=>B.connection_id)??[],U=UZ0(K,F);if(!U)return $.json({error:"Project has no repository"},404);let N=K?.runtime;return $.set("decofileScope",{organizationId:Y.id,virtualMcpId:X,branch:J,packagePath:N?.path?.replace(/^\/+|\/+$/g,"")||null,repository:U,userId:G}),Z()})});var eH8=($)=>{let Z=new Q1;if(Z.use("*",$t),Z.use("*",RJ8),Z.route("/",AJ8($.voiceSessions)),Z.route("/",Gb0()),Z.route("/",rJ8()),Z.route("/",HG8()),Z.route("/",pJ8()),Z.route("/",BK8()),Z.route("/",LK8()),Z.route("/",JK8()),Z.route("/",UK8()),Z.route("/",WK8()),Z.route("/",tb0()),Z.route("/tools",AK8()),Z.route("/",EK8()),Z.route("/",hW8({kvStorage:$.kvStorage})),Z.route("/",yW8()),Z.route("/fs",sW8({getConnection:$.getNatsConnection})),Z.route("/sandbox",fH8()),Z.route("/decofile",rH8()),Z.route("/",QK8()),Z.route("/",aW8()),Z.route("/deco-sites",Kb0()),Z.route("/hosting",xJ8()),Z.route("/monitor",cJ8()),Z.route("/sso",$b0()),Z.route("/",ob0({tokenStorage:$.tokenStorage,automationEventDispatcher:$.automationEventDispatcher})),Z.route("/webhooks",SJ8()),$.mountDevAssets)Z.route("/dev-assets",Nb0({orgFromPath:!0}));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);for(let Q of YE1)Z.use(`${Q}/:threadId`,$.mcpAuth);Z.route("/",EQ8()),Z.get("/mcp/:gateway?/:connectionId/.well-known/oauth-protected-resource/*",$.betterAuthProtectedResourceHandler),Z.get("/mcp/.well-known/oauth-protected-resource",$.betterAuthProtectedResourceHandler);for(let Q of YE1)Z.route(Q,$K8());return Z.route("/mcp",yk0()),Z.route("/mcp/self",db0()),Z.route("/mcp",uk0()),Z.all("/oauth-proxy/:connectionId/*",$.oauthProxyHandler),Z.get("/watch",$.watchHandler),Z};var $F8=L(()=>{W8();TJ8();qJ8();mv0();CJ8();Cw1();fJ8();mJ8();Bb0();Nz();Mw1();aJ8();fw1();gW8();uW8();rW8();eW8();m60();ww1();lk0();QE1();ZK8();YK8();GK8();KK8();GE1();DK8();OK8();PK8();WE1();TK8();KE1();gk0();yH8();aH8()});import{z as Sh}from"zod";class mE1{adapter;getConnection;kvPromise;constructor($,Z){this.adapter=$;this.getConnection=Z}kv(){let $=this.getConnection();if(!$||$.isClosed())throw new k1(503,{message:"Voice transport is unavailable"});return this.kvPromise??=new YF8.Kvm(Lx0.jetstream($)).create("STUDIO_VOICE_SESSIONS",{storage:Lx0.StorageType.Memory,ttl:XF8.nanos(qL),max_bytes:10485760}).catch((Z)=>{throw this.kvPromise=void 0,Z}),this.kvPromise}async conversationAgent($){let Z=await this.kv(),Q=`agent.${$.conversationKey}`,Y=Date.now()+45000;while(Date.now()<Y){let X=await Z.get(Q),J=X?.operation==="PUT"?QF8.parse(X.json()):null;if(J?.state==="ready")return J.agentId;if(J?.state==="creating"&&J.expiresAt>Date.now()){await D$(200);continue}let G=ZF8.encode(JSON.stringify({state:"creating",expiresAt:Date.now()+40000})),W;try{W=X&&J?await Z.update(Q,G,X.revision):await Z.create(Q,G)}catch{await D$(200);continue}try{let K=await $.ensureConversationAgent();return await Z.update(Q,ZF8.encode(JSON.stringify({state:"ready",agentId:K})),W),K}catch(K){throw await Z.delete(Q,{previousSeq:W}).catch(()=>{}),K}}throw new k1(503,{message:"Voice conversation is starting; try again"})}async createSession($){let Z=this.adapter.forConversationModel($.model),Q=await this.conversationAgent(Z);try{return{provider:"elevenlabs",conversationToken:await Z.createConversationToken(Q)}}catch(Y){let X=await this.kv(),J=`agent.${Z.conversationKey}`,G=await X.get(J),W=G?.operation==="PUT"?QF8.parse(G.json()):null;if(G&&W?.state==="ready"&&W.agentId===Q)await X.delete(J,{previousSeq:G.revision}).catch(()=>{});throw Y}}}var Lx0,YF8,XF8,ZF8,QF8;var JF8=L(()=>{$G();yN();r$();Lx0=C(KH(),1),YF8=C(MT(),1),XF8=C(uz(),1),ZF8=new TextEncoder,QF8=Sh.discriminatedUnion("state",[Sh.object({state:Sh.literal("ready"),agentId:Sh.string()}),Sh.object({state:Sh.literal("creating"),expiresAt:Sh.number()})])});import{z as Ct}from"zod";function _55($){return{model:$.model,instructions:`${tS$}
|
|
4326
|
-
Start in ${$.language==="pt"?"Brazilian Portuguese":"English"}, and follow the user's language.`,delegation:{type:"client"},audio:{output:{voice:$.voice}},store:!1}}class dE1{config;constructor($){this.config=$}async createSession(){return{provider:"openai",transport:"webrtc"}}async negotiate($){let Z=await fetch("https://api.openai.com/v1/live/sessions",{method:"POST",headers:{Authorization:`Bearer ${this.config.apiKey}`,"Content-Type":"application/json","OpenAI-Safety-Identifier":$.safetyIdentifier},body:JSON.stringify({session:_55({...this.config,language:$.language,model:$.model}),transport:{type:"webrtc",sdp:$.sdp}}),signal:AbortSignal.timeout(15000)});if(!Z.ok)throw await Z.body?.cancel(),Error(`OpenAI Live request failed (${Z.status})`);return{sdp:Ct.object({session:Ct.object({id:Ct.string().min(1)}),transport:Ct.object({type:Ct.literal("webrtc"),sdp:Ct.string().min(1).max(1e5)})}).parse(await Z.json()).transport.sdp}}}var GF8=L(()=>{yN()});var WF8;var KF8=L(()=>{WF8=[{name:"delegate_to_agent",description:"Submit a complete request to the selected Studio agent. Returns after acceptance while work continues in the background. Results arrive later.",parameters:{type:"object",properties:{request:{type:"string",description:"The complete user request, with relevant conversational details. Preserve intent and constraints."}},required:["request"]}},{name:"get_agent_status",description:"Read the current chat's work status and known results. This does not track independent organization tasks; delegate fresh task-status queries to the Studio agent. Use when asked, never poll.",parameters:{type:"object",properties:{}}},{name:"stop_agent_work",description:"Request cancellation in the current chat ONLY when the user explicitly asks. Speaking over the companion is not cancellation. To stop independent tasks, delegate that request to the Studio agent.",parameters:{type:"object",properties:{}}}]});function iE1($){return{conversation_config:{agent:{first_message:"",language:"en",prompt:{prompt:pS$,llm:$.conversationModel,thinking_budget:0,max_tokens:512,tools:WF8.map((Z)=>({...Z,type:"client",expects_response:!0,response_timeout_secs:Z.name==="delegate_to_agent"?20:5,...Z.name==="delegate_to_agent"?{execution_mode:"async",interruption_mode:"allow",pre_tool_speech:"off"}:{}}))}},asr:{provider:"scribe_realtime",quality:"high"},turn:{turn_eagerness:"normal",turn_timeout:-1,silence_end_call_timeout:-1},tts:{voice_id:$.voiceId,model_id:$.model},conversation:{max_duration_seconds:qL/1000,client_events:["audio","interruption","user_transcript","agent_response","client_tool_call","vad_score"]}},platform_settings:{auth:{enable_auth:!0},privacy:{record_voice:!1,retention_days:1,delete_audio:!0,delete_transcript_and_pii:!0},overrides:{conversation_config_override:{agent:{language:!0}}}}}}var HF8=L(()=>{yN();KF8()});import{z as vJ}from"zod";import{createHash as v55,createHmac as b55}from"crypto";class Ox0{config;conversationKey;configurationKey;constructor($){this.config=$;this.configurationKey=v55("sha256").update(JSON.stringify(iE1($))).digest("hex"),this.conversationKey=b55("sha256",$.apiKey).update(this.configurationKey).digest("hex")}forConversationModel($){return $===this.config.conversationModel?this:new Ox0({...this.config,conversationModel:$})}async request($,Z,Q){let Y=await fetch(`https://api.elevenlabs.io/v1${$}`,{method:Z===void 0?"GET":"POST",headers:{"xi-api-key":this.config.apiKey,"Content-Type":"application/json"},body:JSON.stringify(Z),signal:Q});if(!Y.ok)throw await Y.body?.cancel(),Error(`ElevenLabs request failed (${Y.status})`);return Y}async ensureConversationAgent(){let $=`Studio voice ${this.configurationKey.slice(0,24)}`,Z=await this.request(`/convai/agents?search=${encodeURIComponent($)}&page_size=100`,void 0,AbortSignal.timeout(15000)),{agents:Q}=vJ.object({agents:vJ.array(vJ.object({agent_id:vJ.string(),name:vJ.string()}))}).parse(await Z.json()),Y=Q.find((J)=>J.name===$);if(Y){let J=await this.request(`/convai/agents/${encodeURIComponent(Y.agent_id)}`,void 0,AbortSignal.timeout(15000));return vJ.object({platform_settings:vJ.object({auth:vJ.object({enable_auth:vJ.literal(!0)})})}).parse(await J.json()),Y.agent_id}let X=await this.request("/convai/agents/create",{name:$,...iE1(this.config)},AbortSignal.timeout(15000));return vJ.object({agent_id:vJ.string().min(1)}).parse(await X.json()).agent_id}async createConversationToken($){let Z=await this.request(`/convai/conversation/token?agent_id=${encodeURIComponent($)}`,void 0,AbortSignal.timeout(15000));return vJ.object({token:vJ.string().min(1)}).parse(await Z.json()).token}async createTranscriptionToken(){let $=await this.request("/single-use-token/realtime_scribe",{},AbortSignal.timeout(15000));return vJ.object({token:vJ.string().min(1)}).parse(await $.json()).token}synthesize($,Z){return this.request(`/text-to-speech/${encodeURIComponent(this.config.voiceId)}/stream?output_format=mp3_44100_128`,{text:$,model_id:this.config.model},AbortSignal.any([Z,AbortSignal.timeout(60000)]))}}var FF8=L(()=>{HF8()});import{createHmac as x55,timingSafeEqual as f55}from"crypto";import{z as _t}from"zod";function NF8($,Z){if(!Z)throw Error("Voice requires a shared authentication secret");return x55("sha256",Z).update(`studio-voice-session:v1:${$}`).digest("base64url")}function BF8($,Z){let Q=Buffer.from(JSON.stringify(UF8.parse($))).toString("base64url");return`${Q}.${NF8(Q,Z)}`}function DF8($,Z,Q=Date.now()){if(!Z||$.length>4096)return null;let Y=$.split(".");if(Y.length!==2)return null;let[X,J]=Y;if(!X||!J)return null;let G=Buffer.from(NF8(X,Z)),W=Buffer.from(J);if(W.length!==G.length||!f55(W,G))return null;try{let K=UF8.safeParse(JSON.parse(Buffer.from(X,"base64url").toString()));if(!K.success||K.data.expiresAt<=Q||K.data.expiresAt>Q+qL)return null;return K.data}catch{return null}}var UF8;var LF8=L(()=>{yN();UF8=_t.object({sessionId:_t.string().uuid(),organizationId:_t.string().min(1).max(256),userId:_t.string().min(1).max(256),threadId:_t.string().min(1).max(256),expiresAt:_t.number().int().positive()})});import{z as pE1}from"zod";function OF8($,Z){if(Z?.voice_model!=null&&Z.voice_provider==null)throw Error("A voice model override requires a provider");let Q=Z?.voice_provider??$.voiceConversationProvider;return nE1.parse({provider:Q,model:Z?.voice_model??(Q==="openai"?$.openaiLiveModel:$.elevenlabsConversationModel)})}var nE1;var wF8=L(()=>{nE1=pE1.object({provider:pE1.enum(["elevenlabs","openai"]),model:pE1.string().trim().min(1).max(128)})});import{createHash as y55}from"crypto";import{z as vt}from"zod";function bt($){return`user.${y55("sha256").update(JSON.stringify([$.organizationId,$.userId])).digest("hex")}`}class oE1{deps;kvPromise;constructor($){this.deps=$}kv(){let $=this.deps.getConnection();if(!$||$.isClosed())throw new k1(503,{message:"Voice transport is unavailable"});return this.kvPromise??=new jF8.Kvm(jx0.jetstream($)).create("STUDIO_VOICE_SESSIONS",{storage:jx0.StorageType.Memory,ttl:EF8.nanos(qL),max_bytes:10485760}).catch((Z)=>{throw this.kvPromise=void 0,Z}),this.kvPromise}adapter(){if(!this.deps.adapter)throw new k1(503,{message:"Voice is not configured on this deployment"});return this.deps.adapter}async create($,Z=!1,Q="en",Y){let X;if(Z)try{X=OF8(this.deps.defaults,Y)}catch{throw new k1(503,{message:"Voice configuration is invalid"})}let J=X?this.deps.conversationAdapters[X.provider]:this.adapter();if(!J)throw new k1(503,{message:"Voice is not configured on this deployment"});let G={...$,sessionId:crypto.randomUUID(),expiresAt:Date.now()+qL},W=BF8(G,this.deps.secret),K=await this.kv(),H=bt(G),F=await K.get(H),U=F?.operation==="PUT"?wx0.parse(F.json()):null,N=tE1.encode(JSON.stringify({sessionId:G.sessionId,expiresAt:G.expiresAt,conversation:X,characters:0,requests:0}));try{if(F&&U&&U.expiresAt<=Date.now())await K.update(H,N,F.revision);else await K.create(H,N)}catch{throw new k1(409,{message:"Close your other voice session before starting a new one"})}try{if(X&&"createSession"in J){let D=await J.createSession({language:Q,model:X.model,safetyIdentifier:bt($)});return{token:W,...D,expiresAt:G.expiresAt}}let B=await this.adapter().createTranscriptionToken();return{token:W,transcriptionToken:B,expiresAt:G.expiresAt}}catch(B){throw await this.release(G),B}}authorize($,Z){let Q=DF8(Z,this.deps.secret);if(!Q||Q.organizationId!==$.organizationId||Q.userId!==$.userId||Q.threadId!==$.threadId)throw new k1(403,{message:"Invalid voice session"});return Q}async connect($,Z){let Q=this.authorize($,Z.token),Y=await this.kv(),X=bt(Q),J=await Y.get(X),G=J?.operation==="PUT"?wx0.parse(J.json()):null;if(!J||!G||G.sessionId!==Q.sessionId||G.expiresAt<=Date.now())throw new k1(403,{message:"Voice session expired"});let W=G.conversation?this.deps.conversationAdapters[G.conversation.provider]:null;if(!W?.negotiate||!G.conversation)throw new k1(409,{message:"Voice session does not support SDP negotiation"});if(G.connected)throw new k1(409,{message:"Voice session already connected"});try{await Y.update(X,tE1.encode(JSON.stringify({...G,connected:!0})),J.revision)}catch{throw new k1(409,{message:"Voice session is busy"})}return W.negotiate({sdp:Z.sdp,language:Z.language,model:G.conversation.model,safetyIdentifier:X})}async speak($,Z,Q,Y){let X=this.authorize($,Z),J=await this.kv(),G=bt(X);for(let W=0;;W++){let K=await J.get(G),H=K?.operation==="PUT"?wx0.parse(K.json()):null;if(!K||!H||H.sessionId!==X.sessionId||H.expiresAt<=Date.now())throw new k1(403,{message:"Voice session expired"});if(H.characters+Q.length>24000||H.requests>=120)throw new k1(429,{message:"Voice session speech limit reached"});try{await J.update(G,tE1.encode(JSON.stringify({...H,characters:H.characters+Q.length,requests:H.requests+1})),K.revision);break}catch{if(W>=2)throw new k1(409,{message:"Voice session is busy"})}}return this.adapter().synthesize(Q,Y)}async release($){let Z=await this.kv(),Q=await Z.get(bt($));if(Q?.operation==="PUT"&&wx0.parse(Q.json()).sessionId===$.sessionId)await Z.delete(bt($),{previousSeq:Q.revision})}async revoke($,Z){await this.release(this.authorize($,Z))}}var jx0,jF8,EF8,wx0,tE1;var PF8=L(()=>{$G();yN();LF8();wF8();jx0=C(KH(),1),jF8=C(MT(),1),EF8=C(uz(),1),wx0=vt.object({sessionId:vt.string().uuid(),expiresAt:vt.number(),connected:vt.boolean().optional(),conversation:nE1.optional(),characters:vt.number().int().nonnegative(),requests:vt.number().int().nonnegative()}),tE1=new TextEncoder});function g55($){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 h55=async($,Z)=>{if(!$.get("studioContext").auth.user?.id)return $.json({error:"Unauthorized"},401);return Z()},zF8=()=>{let $=new Q1;return $.use("*",h55),$.get("/",async(Z)=>{let Q=L0(),Y=Q.decoSupabaseUrl,X=Q.decoSupabaseServiceKey;if(!Y||!X)return Z.json({apps:[]});try{let J=await yG(Y,X,"apps?select=name,title,description,logo,category,vendors(alias,url)");return Z.json({apps:g55(J)})}catch(J){return console.error("[deco-apps] GET error:",J),Z.json({error:"Failed to fetch apps"},502)}}),$};var AF8=L(()=>{W8();r1();k_0()});import{z as c1}from"zod";function jB($,Z="invalid_request_error",Q=null,Y=null){return{error:{message:$,type:Z,param:Q,code:Y}}}function o55($){if(!$)return null;let Z=$.indexOf(":");if(Z===-1)return{credentialId:null,modelId:$};let Q=$.substring(0,Z),Y=$.substring(Z+1);if(!Q||!Y)return null;return{credentialId:Q,modelId:Y}}function s55($,Z,Q){try{return JSON.parse($)}catch{throw new qF8(`Invalid JSON in tool call arguments for function '${Q}' (tool_call_id: ${Z}): ${$}`)}}function r55($){let Z={};for(let Q of $)if(Q.role==="assistant"&&Q.tool_calls)for(let Y of Q.tool_calls)Z[Y.id]=Y.function.name;return $.map((Q)=>{switch(Q.role){case"system":return{role:"system",content:Q.content};case"user":if(typeof Q.content==="string")return{role:"user",content:Q.content};return{role:"user",content:Q.content.map((X)=>{if(X.type==="text")return{type:"text",text:X.text};return{type:"image",image:X.image_url.url}})};case"assistant":if(Q.tool_calls&&Q.tool_calls.length>0)return{role:"assistant",content:Q.tool_calls.map((X)=>({type:"tool-call",toolCallId:X.id,toolName:X.function.name,input:s55(X.function.arguments,X.id,X.function.name)}))};return{role:"assistant",content:Q.content??""};case"tool":let Y=Z[Q.tool_call_id]??"unknown";return{role:"tool",content:[{type:"tool-result",toolCallId:Q.tool_call_id,toolName:Y,output:{type:"text",value:Q.content}}]}}})}function a55($){let Z=$.map((Q)=>{let Y=Q.function.parameters?iU(Q.function.parameters):iU({type:"object",properties:{}});return[Q.function.name,t$({description:Q.function.description,inputSchema:Y})]});return Object.fromEntries(Z)}function e55($){if(!$)return;return{openai:{response_format:$}}}function $95(){return`chatcmpl-${crypto.randomUUID().replace(/-/g,"").substring(0,29)}`}function TF8($,Z,Q,Y,X,J){let G={model:$,instructions:Z.filter((W)=>W.role==="system"),messages:Z.filter((W)=>W.role!=="system"),tools:Q,temperature:Y.temperature,maxOutputTokens:Y.max_tokens,topP:Y.top_p,frequencyPenalty:Y.frequency_penalty,presencePenalty:Y.presence_penalty,stopSequences:Y.stop?Array.isArray(Y.stop)?Y.stop:[Y.stop]:void 0,abortSignal:J};return X?{...G,providerOptions:X}:G}function RF8($){if($==="tool-calls")return"tool_calls";if($==="length")return"length";return"stop"}var u55=256,l55,c55,m55,d55,i55,p55,n55,t55,qF8,MF8,IF8;var VF8=L(()=>{u4();W8();Tt();MF();l55=c1.object({type:c1.literal("function"),function:c1.object({name:c1.string(),description:c1.string().optional(),parameters:c1.record(c1.string(),c1.unknown()).optional()})}),c55=c1.object({id:c1.string(),type:c1.literal("function"),function:c1.object({name:c1.string(),arguments:c1.string()})}),m55=c1.discriminatedUnion("role",[c1.object({role:c1.literal("system"),content:c1.string(),name:c1.string().optional()}),c1.object({role:c1.literal("user"),content:c1.union([c1.string(),c1.array(c1.union([c1.object({type:c1.literal("text"),text:c1.string()}),c1.object({type:c1.literal("image_url"),image_url:c1.object({url:c1.string(),detail:c1.string().optional()})})]))]),name:c1.string().optional()}),c1.object({role:c1.literal("assistant"),content:c1.string().nullable().optional(),name:c1.string().optional(),tool_calls:c1.array(c55).optional()}),c1.object({role:c1.literal("tool"),content:c1.string(),tool_call_id:c1.string()})]),d55=c1.object({type:c1.literal("text")}),i55=c1.object({type:c1.literal("json_object")}),p55=c1.object({type:c1.literal("json_schema"),json_schema:c1.object({name:c1.string(),description:c1.string().optional(),schema:c1.record(c1.string(),c1.unknown()),strict:c1.boolean().optional()})}),n55=c1.union([d55,i55,p55]),t55=c1.object({model:c1.string().describe("Format: 'model_id' or 'credential_id:model_id'"),messages:c1.array(m55),stream:c1.boolean().optional().default(!1),temperature:c1.number().min(0).max(2).optional(),max_tokens:c1.number().positive().optional(),top_p:c1.number().min(0).max(1).optional(),frequency_penalty:c1.number().min(-2).max(2).optional(),presence_penalty:c1.number().min(-2).max(2).optional(),stop:c1.union([c1.string(),c1.array(c1.string())]).optional(),tools:c1.array(l55).optional(),tool_choice:c1.union([c1.literal("auto"),c1.literal("none"),c1.literal("required"),c1.object({type:c1.literal("function"),function:c1.object({name:c1.string()})})]).optional(),response_format:n55.optional(),user:c1.string().optional()});qF8=class qF8 extends Error{constructor($){super($);this.name="MessageConversionError"}};MF8=new Q1;MF8.post("/:org/v1/chat/completions",async($)=>{let Z=$.get("studioContext"),Q=$.req.param("org");try{if(!Z.auth.apiKey?.id)return $.json(jB("API key authentication required. Provide a valid API key via Authorization header.","authentication_error"),401);if(!Z.organization)return $.json(jB("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(jB("Organization mismatch. The API key's organization does not match the requested organization.","invalid_request_error","organization"),403);let Y=await $.req.json(),X=t55.safeParse(Y);if(!X.success){let w=X.error.issues[0]??{message:"Invalid request",path:[]};return $.json(jB(`Invalid request: ${w.message}`,"invalid_request_error",w.path.length>0?w.path.join("."):null),400)}let J=X.data,G=o55(J.model);if(!G)return $.json(jB("Invalid model format. Expected 'model_id' or 'credential_id:model_id' (e.g., 'claude-sonnet-4-6' or 'key_abc123:claude-sonnet-4-6')","invalid_request_error","model"),400);let{credentialId:W}=G,{modelId:K}=G;if(!W){let j=(await Z.storage.aiProviderKeys.list({organizationId:Z.organization.id})).find((E)=>b2(E.providerId));if(!j)return $.json(jB("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=j.id}let H;try{H=await Z.aiProviders.activate(W,Z.organization.id)}catch{return $.json(jB(`AI provider credential not found or inaccessible: ${W}`,"invalid_request_error","model"),404)}let F=H.aiSdk.languageModel(K),U=r55(J.messages),N=J.tools?a55(J.tools):void 0,B=e55(J.response_format),D=$95(),O=Math.floor(Date.now()/1000);if(J.stream)return jO($,async(w)=>{let j=TF8(F,U,N,J,B,$.req.raw.signal);try{let E=$p(j),P=!1,T=0,z="",A=async()=>{if(z.length===0)return;let q=z;z="",await w.writeSSE({data:JSON.stringify({id:D,object:"chat.completion.chunk",created:O,model:J.model,choices:[{index:0,delta:{content:q},finish_reason:null}]})})};for await(let q of E.stream){if(!P&&(q.type==="text-delta"||q.type==="tool-call"))await w.writeSSE({data:JSON.stringify({id:D,object:"chat.completion.chunk",created:O,model:J.model,choices:[{index:0,delta:{role:"assistant",content:""},finish_reason:null}]})}),P=!0;if(q.type==="text-delta"){if(z+=q.text,z.length>=u55)await A()}else if(q.type==="tool-call"){await A();let x=T++;await w.writeSSE({data:JSON.stringify({id:D,object:"chat.completion.chunk",created:O,model:J.model,choices:[{index:0,delta:{tool_calls:[{index:x,id:q.toolCallId,type:"function",function:{name:q.toolName,arguments:JSON.stringify(q.input)}}]},finish_reason:null}]})})}else if(q.type==="finish")await A(),await w.writeSSE({data:JSON.stringify({id:D,object:"chat.completion.chunk",created:O,model:J.model,choices:[{index:0,delta:{},finish_reason:RF8(q.finishReason)}],usage:q.totalUsage?{prompt_tokens:q.totalUsage.inputTokens??0,completion_tokens:q.totalUsage.outputTokens??0,total_tokens:q.totalUsage.totalTokens??0}:void 0})})}await A(),await w.writeSSE({data:"[DONE]"})}catch(E){let P=E;console.error("[openai-compat:stream] Error:",P.message),await w.writeSSE({data:JSON.stringify({error:{message:P.message,type:"server_error"}})})}});else{let w=TF8(F,U,N,J,B,$.req.raw.signal),j=await kL(w),E={role:"assistant",content:j.text||null};if(j.toolCalls&&j.toolCalls.length>0)E.tool_calls=j.toolCalls.map((P)=>({id:P.toolCallId,type:"function",function:{name:P.toolName,arguments:JSON.stringify("input"in P?P.input:{})}})),E.content=null;return $.json({id:D,object:"chat.completion",created:O,model:J.model,choices:[{index:0,message:E,finish_reason:RF8(j.finishReason)}],usage:{prompt_tokens:j.usage?.inputTokens??0,completion_tokens:j.usage?.outputTokens??0,total_tokens:j.usage?.totalTokens??0}})}}catch(Y){let X=Y;if(X.name==="AbortError")return $.json(jB("Request aborted","invalid_request_error"),400);if(X.name==="MessageConversionError")return $.json(jB(X.message,"invalid_request_error","messages"),400);return console.error("[openai-compat] Error:",X.message,X.stack),$.json(jB(X.message,"server_error"),500)}});IF8=MF8});function Z95($){if(typeof $!=="object"||$===null)return!1;let Q=$.repository?.url;return typeof Q==="string"&&Q.length>0}function kF8(){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"),Y=_0(Q);if(!Y)return Z.json({error:"Authentication required"},401);let J=(Z.req.query("site")??"").trim().toLowerCase();if(!G9(J))return Z.json({error:"Invalid site slug"},400);let G=await Q.db.selectFrom("member").innerJoin("organization","organization.id","member.organizationId").select(["organization.id as id","organization.slug as slug","organization.name as name","organization.metadata as metadata"]).where("member.userId","=",Y).execute(),W=[];for(let H of G){if(!H.slug||f9(H))continue;let F=await Q.storage.virtualMcps.list(H.id);for(let U of F){if(h2(U)!==J)continue;if(!Z95(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 SF8=L(()=>{W8();iX()});var Ex0;var sE1=L(()=>{Ex0={name:"decocms",version:"4.495.0",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 dev:server","dev:server":"NODE_ENV=development bun --env-file=.env --watch 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":"^4.0.58","@ai-sdk/google":"^4.0.76","@ai-sdk/openai":"^4.0.71","@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","@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":"^3.1.0","@opentelemetry/core":"^2.6.0",kysely:"^0.28.12","posthog-node":"^5.0.0"},devDependencies:{"@ai-sdk/provider":"^4.0.17","@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:"^7.0.107","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 X95(){let $=process.env.POSTHOG_KEY;if(!$)return null;return{key:$,host:process.env.POSTHOG_HOST??Y95}}var CF8,Y95="https://ph.studio.decocms.com",_F8;var vF8=L(()=>{W8();Te();Bg();w9();r1();Yw1();sE1();CF8=new Q1;CF8.get("/",($)=>{let Z={version:Ex0.version,theme:LY$(),...hH().logo&&{logo:hH().logo},...hL()&&{internalUrl:fr1()},...L0().enableDecoImport&&{enableDecoImport:!0},hostingEnabled:!!L0().controlplaneRestUrl&&!!L0().controlplaneServiceToken,hostingControlPlaneGa:L0().hostingControlPlaneGa,monitorEnabled:!!L0().clickhouseAnalyticsUrl&&!!L0().clickhouseAnalyticsPassword,monitorGa:L0().monitorGa,plansEnabled:L0().plansEnabled,auth:DX8(),posthog:X95(),googleMapsApiKey:process.env.GOOGLE_MAPS_API_KEY?.trim()||null,runtime:{agentSandbox:iF()}};return $.header("Cache-Control","no-store"),$.json({success:!0,config:Z})});_F8=CF8});import{z as q$}from"zod";var J95,bF8;var xF8=L(()=>{J95=q$.object({check_id:q$.string(),title:q$.string(),description:q$.string().optional(),impact:q$.string().optional(),why:q$.string().optional(),category:q$.string(),severity:q$.string(),value_band:q$.string().optional(),value_driver:q$.string().optional(),controllability:q$.string().optional(),pages:q$.array(q$.string()),tasks:q$.array(q$.string()),evidence:q$.string(),sample_scope:q$.string().optional(),sources:q$.array(q$.string())}),bF8=q$.object({domain:q$.string(),brand:q$.string(),favicon:q$.string().optional(),scanned_at:q$.string().nullable(),lang:q$.string(),score:q$.number().nullable(),band:q$.string().nullable(),totals:q$.object({measured:q$.number(),registry_total:q$.number(),passed:q$.number(),failed:q$.number(),blocked:q$.number()}),buckets:q$.array(q$.object({id:q$.enum(["critical","important","worth"]),label:q$.string(),items:q$.array(J95)})),passing:q$.object({count:q$.number(),items:q$.array(q$.object({check_id:q$.string(),title:q$.string()}))}),not_measured:q$.object({count:q$.number(),groups:q$.array(q$.object({reason:q$.string(),label:q$.string(),count:q$.number(),checks:q$.array(q$.string())}))}),categories:q$.array(q$.object({key:q$.string(),label:q$.string(),score:q$.number().nullable(),band:q$.string().nullable(),pass:q$.number(),fail:q$.number()})),screenshots:q$.array(q$.object({url:q$.string(),page_type:q$.string().optional(),viewport:q$.enum(["desktop","mobile"]),image_url:q$.string()}))})});function fF8($,Z,Q){let Y=Q?`?${new URLSearchParams({lang:Q}).toString()}`:"";return`${JK({})}/api/v2/public/diagnostics/${encodeURIComponent($)}/onepager${Z}${Y}`}async function Px0($,Z={}){let Q=await fetch(fF8($,"",Z.lang),{headers:{Accept:"application/json"},signal:Z.signal});if(Q.status===404)return null;if(!Q.ok)throw Error(`onepager read HTTP ${Q.status}`);return bF8.parse(await Q.json())}async function yF8($,Z={}){let Q=await fetch(fF8($,".md",Z.lang),{headers:{Accept:"text/markdown"},signal:Z.signal});if(Q.status===404)return null;if(!Q.ok)throw Error(`onepager markdown HTTP ${Q.status}`);return Q.text()}var rE1=L(()=>{xF8();sD()});import{join as gF8}from"path";async function W95($){try{let Z=await Px0($,{signal:AbortSignal.timeout(G95)});if(!Z?.scanned_at)return null;return{brand:Z.brand.trim()||aD1($),...Z.score!==null?{score:Z.score}:{}}}catch{return null}}function lG($){return $.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function K95($,Z){let Q=Uh($),Y=Z?.brand?.trim()||aD1(Q),X=BZ8(Q,128),G=`${(L0().baseUrl??"https://studio.decocms.com").replace(/\/+$/,"")}/report/${encodeURIComponent(Q)}`,{title:W,description:K}=DZ8({brand:Y,domain:Q,score:Z?.score}),H=`${G}/og.png`,F=`${Y} Deco Score by decocms`;return[`<title>${lG(W)}</title>`,`<meta name="description" content="${lG(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="${lG(W)}" />`,`<meta property="og:description" content="${lG(K)}" />`,`<meta property="og:url" content="${lG(G)}" />`,`<meta property="og:image" content="${lG(H)}" />`,'<meta property="og:image:width" content="1200" />','<meta property="og:image:height" content="630" />',`<meta property="og:image:alt" content="${lG(F)}" />`,'<meta name="twitter:card" content="summary_large_image" />',`<meta name="twitter:title" content="${lG(W)}" />`,`<meta name="twitter:description" content="${lG(K)}" />`,`<meta name="twitter:image" content="${lG(H)}" />`,`<meta name="twitter:image:alt" content="${lG(F)}" />`,`<link rel="canonical" href="${lG(G)}" />`,`<link rel="alternate" type="text/markdown" href="${lG(G)}.md" />`,`<link rel="icon" href="${lG(X)}" sizes="any" />`].join(`
|
|
4326
|
+
Start in ${$.language==="pt"?"Brazilian Portuguese":"English"}, and follow the user's language.`,delegation:{type:"client"},audio:{output:{voice:$.voice}},store:!1}}class dE1{config;constructor($){this.config=$}async createSession(){return{provider:"openai",transport:"webrtc"}}async negotiate($){let Z=await fetch("https://api.openai.com/v1/live/sessions",{method:"POST",headers:{Authorization:`Bearer ${this.config.apiKey}`,"Content-Type":"application/json","OpenAI-Safety-Identifier":$.safetyIdentifier},body:JSON.stringify({session:_55({...this.config,language:$.language,model:$.model}),transport:{type:"webrtc",sdp:$.sdp}}),signal:AbortSignal.timeout(15000)});if(!Z.ok)throw await Z.body?.cancel(),Error(`OpenAI Live request failed (${Z.status})`);return{sdp:Ct.object({session:Ct.object({id:Ct.string().min(1)}),transport:Ct.object({type:Ct.literal("webrtc"),sdp:Ct.string().min(1).max(1e5)})}).parse(await Z.json()).transport.sdp}}}var GF8=L(()=>{yN()});var WF8;var KF8=L(()=>{WF8=[{name:"delegate_to_agent",description:"Submit a complete request to the selected Studio agent. Returns after acceptance while work continues in the background. Results arrive later.",parameters:{type:"object",properties:{request:{type:"string",description:"The complete user request, with relevant conversational details. Preserve intent and constraints."}},required:["request"]}},{name:"get_agent_status",description:"Read the current chat's work status and known results. This does not track independent organization tasks; delegate fresh task-status queries to the Studio agent. Use when asked, never poll.",parameters:{type:"object",properties:{}}},{name:"stop_agent_work",description:"Request cancellation in the current chat ONLY when the user explicitly asks. Speaking over the companion is not cancellation. To stop independent tasks, delegate that request to the Studio agent.",parameters:{type:"object",properties:{}}}]});function iE1($){return{conversation_config:{agent:{first_message:"",language:"en",prompt:{prompt:pS$,llm:$.conversationModel,thinking_budget:0,max_tokens:512,tools:WF8.map((Z)=>({...Z,type:"client",expects_response:!0,response_timeout_secs:Z.name==="delegate_to_agent"?20:5,...Z.name==="delegate_to_agent"?{execution_mode:"async",interruption_mode:"allow",pre_tool_speech:"off"}:{}}))}},asr:{provider:"scribe_realtime",quality:"high"},turn:{turn_eagerness:"normal",turn_timeout:-1,silence_end_call_timeout:-1},tts:{voice_id:$.voiceId,model_id:$.model},conversation:{max_duration_seconds:qL/1000,client_events:["audio","interruption","user_transcript","agent_response","client_tool_call","vad_score"]}},platform_settings:{auth:{enable_auth:!0},privacy:{record_voice:!1,retention_days:1,delete_audio:!0,delete_transcript_and_pii:!0},overrides:{conversation_config_override:{agent:{language:!0}}}}}}var HF8=L(()=>{yN();KF8()});import{z as vJ}from"zod";import{createHash as v55,createHmac as b55}from"crypto";class Ox0{config;conversationKey;configurationKey;constructor($){this.config=$;this.configurationKey=v55("sha256").update(JSON.stringify(iE1($))).digest("hex"),this.conversationKey=b55("sha256",$.apiKey).update(this.configurationKey).digest("hex")}forConversationModel($){return $===this.config.conversationModel?this:new Ox0({...this.config,conversationModel:$})}async request($,Z,Q){let Y=await fetch(`https://api.elevenlabs.io/v1${$}`,{method:Z===void 0?"GET":"POST",headers:{"xi-api-key":this.config.apiKey,"Content-Type":"application/json"},body:JSON.stringify(Z),signal:Q});if(!Y.ok)throw await Y.body?.cancel(),Error(`ElevenLabs request failed (${Y.status})`);return Y}async ensureConversationAgent(){let $=`Studio voice ${this.configurationKey.slice(0,24)}`,Z=await this.request(`/convai/agents?search=${encodeURIComponent($)}&page_size=100`,void 0,AbortSignal.timeout(15000)),{agents:Q}=vJ.object({agents:vJ.array(vJ.object({agent_id:vJ.string(),name:vJ.string()}))}).parse(await Z.json()),Y=Q.find((J)=>J.name===$);if(Y){let J=await this.request(`/convai/agents/${encodeURIComponent(Y.agent_id)}`,void 0,AbortSignal.timeout(15000));return vJ.object({platform_settings:vJ.object({auth:vJ.object({enable_auth:vJ.literal(!0)})})}).parse(await J.json()),Y.agent_id}let X=await this.request("/convai/agents/create",{name:$,...iE1(this.config)},AbortSignal.timeout(15000));return vJ.object({agent_id:vJ.string().min(1)}).parse(await X.json()).agent_id}async createConversationToken($){let Z=await this.request(`/convai/conversation/token?agent_id=${encodeURIComponent($)}`,void 0,AbortSignal.timeout(15000));return vJ.object({token:vJ.string().min(1)}).parse(await Z.json()).token}async createTranscriptionToken(){let $=await this.request("/single-use-token/realtime_scribe",{},AbortSignal.timeout(15000));return vJ.object({token:vJ.string().min(1)}).parse(await $.json()).token}synthesize($,Z){return this.request(`/text-to-speech/${encodeURIComponent(this.config.voiceId)}/stream?output_format=mp3_44100_128`,{text:$,model_id:this.config.model},AbortSignal.any([Z,AbortSignal.timeout(60000)]))}}var FF8=L(()=>{HF8()});import{createHmac as x55,timingSafeEqual as f55}from"crypto";import{z as _t}from"zod";function NF8($,Z){if(!Z)throw Error("Voice requires a shared authentication secret");return x55("sha256",Z).update(`studio-voice-session:v1:${$}`).digest("base64url")}function BF8($,Z){let Q=Buffer.from(JSON.stringify(UF8.parse($))).toString("base64url");return`${Q}.${NF8(Q,Z)}`}function DF8($,Z,Q=Date.now()){if(!Z||$.length>4096)return null;let Y=$.split(".");if(Y.length!==2)return null;let[X,J]=Y;if(!X||!J)return null;let G=Buffer.from(NF8(X,Z)),W=Buffer.from(J);if(W.length!==G.length||!f55(W,G))return null;try{let K=UF8.safeParse(JSON.parse(Buffer.from(X,"base64url").toString()));if(!K.success||K.data.expiresAt<=Q||K.data.expiresAt>Q+qL)return null;return K.data}catch{return null}}var UF8;var LF8=L(()=>{yN();UF8=_t.object({sessionId:_t.string().uuid(),organizationId:_t.string().min(1).max(256),userId:_t.string().min(1).max(256),threadId:_t.string().min(1).max(256),expiresAt:_t.number().int().positive()})});import{z as pE1}from"zod";function OF8($,Z){if(Z?.voice_model!=null&&Z.voice_provider==null)throw Error("A voice model override requires a provider");let Q=Z?.voice_provider??$.voiceConversationProvider;return nE1.parse({provider:Q,model:Z?.voice_model??(Q==="openai"?$.openaiLiveModel:$.elevenlabsConversationModel)})}var nE1;var wF8=L(()=>{nE1=pE1.object({provider:pE1.enum(["elevenlabs","openai"]),model:pE1.string().trim().min(1).max(128)})});import{createHash as y55}from"crypto";import{z as vt}from"zod";function bt($){return`user.${y55("sha256").update(JSON.stringify([$.organizationId,$.userId])).digest("hex")}`}class oE1{deps;kvPromise;constructor($){this.deps=$}kv(){let $=this.deps.getConnection();if(!$||$.isClosed())throw new k1(503,{message:"Voice transport is unavailable"});return this.kvPromise??=new jF8.Kvm(jx0.jetstream($)).create("STUDIO_VOICE_SESSIONS",{storage:jx0.StorageType.Memory,ttl:EF8.nanos(qL),max_bytes:10485760}).catch((Z)=>{throw this.kvPromise=void 0,Z}),this.kvPromise}adapter(){if(!this.deps.adapter)throw new k1(503,{message:"Voice is not configured on this deployment"});return this.deps.adapter}async create($,Z=!1,Q="en",Y){let X;if(Z)try{X=OF8(this.deps.defaults,Y)}catch{throw new k1(503,{message:"Voice configuration is invalid"})}let J=X?this.deps.conversationAdapters[X.provider]:this.adapter();if(!J)throw new k1(503,{message:"Voice is not configured on this deployment"});let G={...$,sessionId:crypto.randomUUID(),expiresAt:Date.now()+qL},W=BF8(G,this.deps.secret),K=await this.kv(),H=bt(G),F=await K.get(H),U=F?.operation==="PUT"?wx0.parse(F.json()):null,N=tE1.encode(JSON.stringify({sessionId:G.sessionId,expiresAt:G.expiresAt,conversation:X,characters:0,requests:0}));try{if(F&&U&&U.expiresAt<=Date.now())await K.update(H,N,F.revision);else await K.create(H,N)}catch{throw new k1(409,{message:"Close your other voice session before starting a new one"})}try{if(X&&"createSession"in J){let D=await J.createSession({language:Q,model:X.model,safetyIdentifier:bt($)});return{token:W,...D,expiresAt:G.expiresAt}}let B=await this.adapter().createTranscriptionToken();return{token:W,transcriptionToken:B,expiresAt:G.expiresAt}}catch(B){throw await this.release(G),B}}authorize($,Z){let Q=DF8(Z,this.deps.secret);if(!Q||Q.organizationId!==$.organizationId||Q.userId!==$.userId||Q.threadId!==$.threadId)throw new k1(403,{message:"Invalid voice session"});return Q}async connect($,Z){let Q=this.authorize($,Z.token),Y=await this.kv(),X=bt(Q),J=await Y.get(X),G=J?.operation==="PUT"?wx0.parse(J.json()):null;if(!J||!G||G.sessionId!==Q.sessionId||G.expiresAt<=Date.now())throw new k1(403,{message:"Voice session expired"});let W=G.conversation?this.deps.conversationAdapters[G.conversation.provider]:null;if(!W?.negotiate||!G.conversation)throw new k1(409,{message:"Voice session does not support SDP negotiation"});if(G.connected)throw new k1(409,{message:"Voice session already connected"});try{await Y.update(X,tE1.encode(JSON.stringify({...G,connected:!0})),J.revision)}catch{throw new k1(409,{message:"Voice session is busy"})}return W.negotiate({sdp:Z.sdp,language:Z.language,model:G.conversation.model,safetyIdentifier:X})}async speak($,Z,Q,Y){let X=this.authorize($,Z),J=await this.kv(),G=bt(X);for(let W=0;;W++){let K=await J.get(G),H=K?.operation==="PUT"?wx0.parse(K.json()):null;if(!K||!H||H.sessionId!==X.sessionId||H.expiresAt<=Date.now())throw new k1(403,{message:"Voice session expired"});if(H.characters+Q.length>24000||H.requests>=120)throw new k1(429,{message:"Voice session speech limit reached"});try{await J.update(G,tE1.encode(JSON.stringify({...H,characters:H.characters+Q.length,requests:H.requests+1})),K.revision);break}catch{if(W>=2)throw new k1(409,{message:"Voice session is busy"})}}return this.adapter().synthesize(Q,Y)}async release($){let Z=await this.kv(),Q=await Z.get(bt($));if(Q?.operation==="PUT"&&wx0.parse(Q.json()).sessionId===$.sessionId)await Z.delete(bt($),{previousSeq:Q.revision})}async revoke($,Z){await this.release(this.authorize($,Z))}}var jx0,jF8,EF8,wx0,tE1;var PF8=L(()=>{$G();yN();LF8();wF8();jx0=C(KH(),1),jF8=C(MT(),1),EF8=C(uz(),1),wx0=vt.object({sessionId:vt.string().uuid(),expiresAt:vt.number(),connected:vt.boolean().optional(),conversation:nE1.optional(),characters:vt.number().int().nonnegative(),requests:vt.number().int().nonnegative()}),tE1=new TextEncoder});function g55($){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 h55=async($,Z)=>{if(!$.get("studioContext").auth.user?.id)return $.json({error:"Unauthorized"},401);return Z()},zF8=()=>{let $=new Q1;return $.use("*",h55),$.get("/",async(Z)=>{let Q=L0(),Y=Q.decoSupabaseUrl,X=Q.decoSupabaseServiceKey;if(!Y||!X)return Z.json({apps:[]});try{let J=await yG(Y,X,"apps?select=name,title,description,logo,category,vendors(alias,url)");return Z.json({apps:g55(J)})}catch(J){return console.error("[deco-apps] GET error:",J),Z.json({error:"Failed to fetch apps"},502)}}),$};var AF8=L(()=>{W8();r1();k_0()});import{z as c1}from"zod";function jB($,Z="invalid_request_error",Q=null,Y=null){return{error:{message:$,type:Z,param:Q,code:Y}}}function o55($){if(!$)return null;let Z=$.indexOf(":");if(Z===-1)return{credentialId:null,modelId:$};let Q=$.substring(0,Z),Y=$.substring(Z+1);if(!Q||!Y)return null;return{credentialId:Q,modelId:Y}}function s55($,Z,Q){try{return JSON.parse($)}catch{throw new qF8(`Invalid JSON in tool call arguments for function '${Q}' (tool_call_id: ${Z}): ${$}`)}}function r55($){let Z={};for(let Q of $)if(Q.role==="assistant"&&Q.tool_calls)for(let Y of Q.tool_calls)Z[Y.id]=Y.function.name;return $.map((Q)=>{switch(Q.role){case"system":return{role:"system",content:Q.content};case"user":if(typeof Q.content==="string")return{role:"user",content:Q.content};return{role:"user",content:Q.content.map((X)=>{if(X.type==="text")return{type:"text",text:X.text};return{type:"image",image:X.image_url.url}})};case"assistant":if(Q.tool_calls&&Q.tool_calls.length>0)return{role:"assistant",content:Q.tool_calls.map((X)=>({type:"tool-call",toolCallId:X.id,toolName:X.function.name,input:s55(X.function.arguments,X.id,X.function.name)}))};return{role:"assistant",content:Q.content??""};case"tool":let Y=Z[Q.tool_call_id]??"unknown";return{role:"tool",content:[{type:"tool-result",toolCallId:Q.tool_call_id,toolName:Y,output:{type:"text",value:Q.content}}]}}})}function a55($){let Z=$.map((Q)=>{let Y=Q.function.parameters?iU(Q.function.parameters):iU({type:"object",properties:{}});return[Q.function.name,t$({description:Q.function.description,inputSchema:Y})]});return Object.fromEntries(Z)}function e55($){if(!$)return;return{openai:{response_format:$}}}function $95(){return`chatcmpl-${crypto.randomUUID().replace(/-/g,"").substring(0,29)}`}function TF8($,Z,Q,Y,X,J){let G={model:$,instructions:Z.filter((W)=>W.role==="system"),messages:Z.filter((W)=>W.role!=="system"),tools:Q,temperature:Y.temperature,maxOutputTokens:Y.max_tokens,topP:Y.top_p,frequencyPenalty:Y.frequency_penalty,presencePenalty:Y.presence_penalty,stopSequences:Y.stop?Array.isArray(Y.stop)?Y.stop:[Y.stop]:void 0,abortSignal:J};return X?{...G,providerOptions:X}:G}function RF8($){if($==="tool-calls")return"tool_calls";if($==="length")return"length";return"stop"}var u55=256,l55,c55,m55,d55,i55,p55,n55,t55,qF8,MF8,IF8;var VF8=L(()=>{u4();W8();Tt();MF();l55=c1.object({type:c1.literal("function"),function:c1.object({name:c1.string(),description:c1.string().optional(),parameters:c1.record(c1.string(),c1.unknown()).optional()})}),c55=c1.object({id:c1.string(),type:c1.literal("function"),function:c1.object({name:c1.string(),arguments:c1.string()})}),m55=c1.discriminatedUnion("role",[c1.object({role:c1.literal("system"),content:c1.string(),name:c1.string().optional()}),c1.object({role:c1.literal("user"),content:c1.union([c1.string(),c1.array(c1.union([c1.object({type:c1.literal("text"),text:c1.string()}),c1.object({type:c1.literal("image_url"),image_url:c1.object({url:c1.string(),detail:c1.string().optional()})})]))]),name:c1.string().optional()}),c1.object({role:c1.literal("assistant"),content:c1.string().nullable().optional(),name:c1.string().optional(),tool_calls:c1.array(c55).optional()}),c1.object({role:c1.literal("tool"),content:c1.string(),tool_call_id:c1.string()})]),d55=c1.object({type:c1.literal("text")}),i55=c1.object({type:c1.literal("json_object")}),p55=c1.object({type:c1.literal("json_schema"),json_schema:c1.object({name:c1.string(),description:c1.string().optional(),schema:c1.record(c1.string(),c1.unknown()),strict:c1.boolean().optional()})}),n55=c1.union([d55,i55,p55]),t55=c1.object({model:c1.string().describe("Format: 'model_id' or 'credential_id:model_id'"),messages:c1.array(m55),stream:c1.boolean().optional().default(!1),temperature:c1.number().min(0).max(2).optional(),max_tokens:c1.number().positive().optional(),top_p:c1.number().min(0).max(1).optional(),frequency_penalty:c1.number().min(-2).max(2).optional(),presence_penalty:c1.number().min(-2).max(2).optional(),stop:c1.union([c1.string(),c1.array(c1.string())]).optional(),tools:c1.array(l55).optional(),tool_choice:c1.union([c1.literal("auto"),c1.literal("none"),c1.literal("required"),c1.object({type:c1.literal("function"),function:c1.object({name:c1.string()})})]).optional(),response_format:n55.optional(),user:c1.string().optional()});qF8=class qF8 extends Error{constructor($){super($);this.name="MessageConversionError"}};MF8=new Q1;MF8.post("/:org/v1/chat/completions",async($)=>{let Z=$.get("studioContext"),Q=$.req.param("org");try{if(!Z.auth.apiKey?.id)return $.json(jB("API key authentication required. Provide a valid API key via Authorization header.","authentication_error"),401);if(!Z.organization)return $.json(jB("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(jB("Organization mismatch. The API key's organization does not match the requested organization.","invalid_request_error","organization"),403);let Y=await $.req.json(),X=t55.safeParse(Y);if(!X.success){let w=X.error.issues[0]??{message:"Invalid request",path:[]};return $.json(jB(`Invalid request: ${w.message}`,"invalid_request_error",w.path.length>0?w.path.join("."):null),400)}let J=X.data,G=o55(J.model);if(!G)return $.json(jB("Invalid model format. Expected 'model_id' or 'credential_id:model_id' (e.g., 'claude-sonnet-4-6' or 'key_abc123:claude-sonnet-4-6')","invalid_request_error","model"),400);let{credentialId:W}=G,{modelId:K}=G;if(!W){let j=(await Z.storage.aiProviderKeys.list({organizationId:Z.organization.id})).find((E)=>b2(E.providerId));if(!j)return $.json(jB("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=j.id}let H;try{H=await Z.aiProviders.activate(W,Z.organization.id)}catch{return $.json(jB(`AI provider credential not found or inaccessible: ${W}`,"invalid_request_error","model"),404)}let F=H.aiSdk.languageModel(K),U=r55(J.messages),N=J.tools?a55(J.tools):void 0,B=e55(J.response_format),D=$95(),O=Math.floor(Date.now()/1000);if(J.stream)return jO($,async(w)=>{let j=TF8(F,U,N,J,B,$.req.raw.signal);try{let E=$p(j),P=!1,T=0,z="",A=async()=>{if(z.length===0)return;let q=z;z="",await w.writeSSE({data:JSON.stringify({id:D,object:"chat.completion.chunk",created:O,model:J.model,choices:[{index:0,delta:{content:q},finish_reason:null}]})})};for await(let q of E.stream){if(!P&&(q.type==="text-delta"||q.type==="tool-call"))await w.writeSSE({data:JSON.stringify({id:D,object:"chat.completion.chunk",created:O,model:J.model,choices:[{index:0,delta:{role:"assistant",content:""},finish_reason:null}]})}),P=!0;if(q.type==="text-delta"){if(z+=q.text,z.length>=u55)await A()}else if(q.type==="tool-call"){await A();let x=T++;await w.writeSSE({data:JSON.stringify({id:D,object:"chat.completion.chunk",created:O,model:J.model,choices:[{index:0,delta:{tool_calls:[{index:x,id:q.toolCallId,type:"function",function:{name:q.toolName,arguments:JSON.stringify(q.input)}}]},finish_reason:null}]})})}else if(q.type==="finish")await A(),await w.writeSSE({data:JSON.stringify({id:D,object:"chat.completion.chunk",created:O,model:J.model,choices:[{index:0,delta:{},finish_reason:RF8(q.finishReason)}],usage:q.totalUsage?{prompt_tokens:q.totalUsage.inputTokens??0,completion_tokens:q.totalUsage.outputTokens??0,total_tokens:q.totalUsage.totalTokens??0}:void 0})})}await A(),await w.writeSSE({data:"[DONE]"})}catch(E){let P=E;console.error("[openai-compat:stream] Error:",P.message),await w.writeSSE({data:JSON.stringify({error:{message:P.message,type:"server_error"}})})}});else{let w=TF8(F,U,N,J,B,$.req.raw.signal),j=await kL(w),E={role:"assistant",content:j.text||null};if(j.toolCalls&&j.toolCalls.length>0)E.tool_calls=j.toolCalls.map((P)=>({id:P.toolCallId,type:"function",function:{name:P.toolName,arguments:JSON.stringify("input"in P?P.input:{})}})),E.content=null;return $.json({id:D,object:"chat.completion",created:O,model:J.model,choices:[{index:0,message:E,finish_reason:RF8(j.finishReason)}],usage:{prompt_tokens:j.usage?.inputTokens??0,completion_tokens:j.usage?.outputTokens??0,total_tokens:j.usage?.totalTokens??0}})}}catch(Y){let X=Y;if(X.name==="AbortError")return $.json(jB("Request aborted","invalid_request_error"),400);if(X.name==="MessageConversionError")return $.json(jB(X.message,"invalid_request_error","messages"),400);return console.error("[openai-compat] Error:",X.message,X.stack),$.json(jB(X.message,"server_error"),500)}});IF8=MF8});function Z95($){if(typeof $!=="object"||$===null)return!1;let Q=$.repository?.url;return typeof Q==="string"&&Q.length>0}function kF8(){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"),Y=_0(Q);if(!Y)return Z.json({error:"Authentication required"},401);let J=(Z.req.query("site")??"").trim().toLowerCase();if(!G9(J))return Z.json({error:"Invalid site slug"},400);let G=await Q.db.selectFrom("member").innerJoin("organization","organization.id","member.organizationId").select(["organization.id as id","organization.slug as slug","organization.name as name","organization.metadata as metadata"]).where("member.userId","=",Y).execute(),W=[];for(let H of G){if(!H.slug||f9(H))continue;let F=await Q.storage.virtualMcps.list(H.id);for(let U of F){if(h2(U)!==J)continue;if(!Z95(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 SF8=L(()=>{W8();iX()});var Ex0;var sE1=L(()=>{Ex0={name:"decocms",version:"4.496.0",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 dev:server","dev:server":"NODE_ENV=development bun --env-file=.env --watch 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":"^4.0.58","@ai-sdk/google":"^4.0.76","@ai-sdk/openai":"^4.0.71","@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","@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":"^3.1.0","@opentelemetry/core":"^2.6.0",kysely:"^0.28.12","posthog-node":"^5.0.0"},devDependencies:{"@ai-sdk/provider":"^4.0.17","@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:"^7.0.107","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 X95(){let $=process.env.POSTHOG_KEY;if(!$)return null;return{key:$,host:process.env.POSTHOG_HOST??Y95}}var CF8,Y95="https://ph.studio.decocms.com",_F8;var vF8=L(()=>{W8();Te();Bg();w9();r1();Yw1();sE1();CF8=new Q1;CF8.get("/",($)=>{let Z={version:Ex0.version,theme:LY$(),...hH().logo&&{logo:hH().logo},...hL()&&{internalUrl:fr1()},...L0().enableDecoImport&&{enableDecoImport:!0},hostingEnabled:!!L0().controlplaneRestUrl&&!!L0().controlplaneServiceToken,hostingControlPlaneGa:L0().hostingControlPlaneGa,monitorEnabled:!!L0().clickhouseAnalyticsUrl&&!!L0().clickhouseAnalyticsPassword,monitorGa:L0().monitorGa,plansEnabled:L0().plansEnabled,auth:DX8(),posthog:X95(),googleMapsApiKey:process.env.GOOGLE_MAPS_API_KEY?.trim()||null,runtime:{agentSandbox:iF()}};return $.header("Cache-Control","no-store"),$.json({success:!0,config:Z})});_F8=CF8});import{z as q$}from"zod";var J95,bF8;var xF8=L(()=>{J95=q$.object({check_id:q$.string(),title:q$.string(),description:q$.string().optional(),impact:q$.string().optional(),why:q$.string().optional(),category:q$.string(),severity:q$.string(),value_band:q$.string().optional(),value_driver:q$.string().optional(),controllability:q$.string().optional(),pages:q$.array(q$.string()),tasks:q$.array(q$.string()),evidence:q$.string(),sample_scope:q$.string().optional(),sources:q$.array(q$.string())}),bF8=q$.object({domain:q$.string(),brand:q$.string(),favicon:q$.string().optional(),scanned_at:q$.string().nullable(),lang:q$.string(),score:q$.number().nullable(),band:q$.string().nullable(),totals:q$.object({measured:q$.number(),registry_total:q$.number(),passed:q$.number(),failed:q$.number(),blocked:q$.number()}),buckets:q$.array(q$.object({id:q$.enum(["critical","important","worth"]),label:q$.string(),items:q$.array(J95)})),passing:q$.object({count:q$.number(),items:q$.array(q$.object({check_id:q$.string(),title:q$.string()}))}),not_measured:q$.object({count:q$.number(),groups:q$.array(q$.object({reason:q$.string(),label:q$.string(),count:q$.number(),checks:q$.array(q$.string())}))}),categories:q$.array(q$.object({key:q$.string(),label:q$.string(),score:q$.number().nullable(),band:q$.string().nullable(),pass:q$.number(),fail:q$.number()})),screenshots:q$.array(q$.object({url:q$.string(),page_type:q$.string().optional(),viewport:q$.enum(["desktop","mobile"]),image_url:q$.string()}))})});function fF8($,Z,Q){let Y=Q?`?${new URLSearchParams({lang:Q}).toString()}`:"";return`${JK({})}/api/v2/public/diagnostics/${encodeURIComponent($)}/onepager${Z}${Y}`}async function Px0($,Z={}){let Q=await fetch(fF8($,"",Z.lang),{headers:{Accept:"application/json"},signal:Z.signal});if(Q.status===404)return null;if(!Q.ok)throw Error(`onepager read HTTP ${Q.status}`);return bF8.parse(await Q.json())}async function yF8($,Z={}){let Q=await fetch(fF8($,".md",Z.lang),{headers:{Accept:"text/markdown"},signal:Z.signal});if(Q.status===404)return null;if(!Q.ok)throw Error(`onepager markdown HTTP ${Q.status}`);return Q.text()}var rE1=L(()=>{xF8();sD()});import{join as gF8}from"path";async function W95($){try{let Z=await Px0($,{signal:AbortSignal.timeout(G95)});if(!Z?.scanned_at)return null;return{brand:Z.brand.trim()||aD1($),...Z.score!==null?{score:Z.score}:{}}}catch{return null}}function lG($){return $.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function K95($,Z){let Q=Uh($),Y=Z?.brand?.trim()||aD1(Q),X=BZ8(Q,128),G=`${(L0().baseUrl??"https://studio.decocms.com").replace(/\/+$/,"")}/report/${encodeURIComponent(Q)}`,{title:W,description:K}=DZ8({brand:Y,domain:Q,score:Z?.score}),H=`${G}/og.png`,F=`${Y} Deco Score by decocms`;return[`<title>${lG(W)}</title>`,`<meta name="description" content="${lG(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="${lG(W)}" />`,`<meta property="og:description" content="${lG(K)}" />`,`<meta property="og:url" content="${lG(G)}" />`,`<meta property="og:image" content="${lG(H)}" />`,'<meta property="og:image:width" content="1200" />','<meta property="og:image:height" content="630" />',`<meta property="og:image:alt" content="${lG(F)}" />`,'<meta name="twitter:card" content="summary_large_image" />',`<meta name="twitter:title" content="${lG(W)}" />`,`<meta name="twitter:description" content="${lG(K)}" />`,`<meta name="twitter:image" content="${lG(H)}" />`,`<meta name="twitter:image:alt" content="${lG(F)}" />`,`<link rel="canonical" href="${lG(G)}" />`,`<link rel="alternate" type="text/markdown" href="${lG(G)}.md" />`,`<link rel="icon" href="${lG(X)}" sizes="any" />`].join(`
|
|
4327
4327
|
`)}function H95($,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}
|
|
4328
4328
|
</head>`)}function hF8($){let Z=new Q1;return Z.get("/:domain/og.png",async(Q)=>{let Y=Uh(Q.req.param("domain")),X=async()=>{let J=$?Bun.file(gF8($,"report-og-fallback.png")):null;if(!J||!await J.exists())return Q.notFound();return Q.body(new Uint8Array(await J.arrayBuffer()),200,{"Content-Type":"image/png","Cache-Control":"public, max-age=0, s-maxage=3600"})};try{let J=await fetch(`${JK({})}/api/v2/public/diagnostics/${encodeURIComponent(Y)}/og.png`,{signal:AbortSignal.timeout(F95)}),G=J.headers.get("content-type")??"";if(!J.ok||!G.startsWith("image/")||!J.body)return X();return Q.body(J.body,200,{"Content-Type":G,"Cache-Control":"public, max-age=0, s-maxage=604800"})}catch{return X()}}),Z.get("/:file{.+\\.md}",async(Q)=>{let Y=Uh(Q.req.param("file").replace(/\.md$/,""));try{let X=await yF8(Y,{lang:Q.req.query("lang")?.trim()||void 0,signal:AbortSignal.timeout(U95)});if(X===null)return Q.text("Deco Score not found",404);return Q.body(X,200,{"Content-Type":"text/markdown; charset=utf-8","Cache-Control":"public, max-age=600, stale-while-revalidate=3600","Access-Control-Allow-Origin":"*"})}catch{return Q.text("Deco Score unavailable",502)}}),Z.get("/:domain",async(Q)=>{let Y=Q.req.param("domain"),X=$?gF8($,"index.html"):null,J=X?Bun.file(X):null;if(!J||!await J.exists())return Q.notFound();let G=await J.text();try{let W=await W95(Uh(Y)),K=K95(Y,W);return Q.html(H95(G,K),200,{"Cache-Control":"public, max-age=0, s-maxage=300"})}catch{return Q.html(G)}}),Z}var G95=2500,F95=1e4,U95=1e4;var uF8=L(()=>{W8();sD();rE1();r1()});function zx0($,Z){return fetch(`${JK({})}${$}`,Z)}async function N95($,Z){let Q=await Px0($,{lang:Z});if(!Q)return{status:"not_found",report:null};return Q.scanned_at?{status:"ready",report:Q}:{status:"empty",report:null}}function D95($){let Z=typeof $==="object"&&$!==null?$:{},Q=typeof Z.domain==="string"?Z.domain.trim():"",Y=typeof Z.distinctId==="string"&&Z.distinctId.trim()&&Z.distinctId.length<=200?Z.distinctId.trim():void 0;return{domain:Q,distinctId:Y}}var B95,zO,lF8=async($,Z)=>{if(!$.get("reportUser"))return $.json({error:"Authentication required"},401);await Z();return},cF8;var mF8=L(()=>{W8();NK();sD();rE1();B95=new Set(["complete","errored","terminated","unknown"]);zO=new Q1;zO.use("*",async($,Z)=>{let Q=await B4.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});zO.use("/link-token/*",lF8);zO.use("/suggest",lF8);zO.get("/site/:domain",async($)=>{let Z=$.req.param("domain").trim();if(!Z)return $.json({error:"domain is required"},400);let Q=$.req.query("lang")?.trim()||void 0;try{return $.json(await N95(Z,Q))}catch{return $.json({error:"report read failed"},502)}});zO.post("/run",async($)=>{let Z=$.get("reportUser"),Q;try{Q=await $.req.json()}catch{return $.json({error:"invalid JSON"},400)}let{domain:Y,distinctId:X}=D95(Q);if(!Y)return $.json({error:"domain is required"},400);let J=Z?.email;try{let G=await zx0("/api/v2/diagnostics/run",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${UE({})}`},body:JSON.stringify({url:Y,...J?{email:J}:{},distinct_id:X})});if(!G.ok)return $.json({error:`run HTTP ${G.status}`},502);let W=await G.json(),K=W.blocked?{state:"blocked"}:W.status==="fresh"?{state:"fresh"}:W.mode==="sync"?{state:"sync"}:{state:"running",id:W.id??null};return $.json(K)}catch{return $.json({error:"run failed"},502)}});zO.get("/status",async($)=>{let Z=$.req.query("id");if(!Z)return $.json({error:"id is required"},400);try{let Q=await zx0(`/api/v2/diagnostics/status?id=${encodeURIComponent(Z)}`,{headers:{Authorization:`Bearer ${UE({})}`}});if(!Q.ok)return $.json({error:`status HTTP ${Q.status}`},502);let X=(await Q.json()).status??"unknown",J={done:B95.has(X),status:X};return $.json(J)}catch{return $.json({error:"status failed"},502)}});zO.get("/link-token/:id",async($)=>{let Z=$.req.param("id");try{let Q=await zx0(`/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)}});zO.get("/suggest",async($)=>{let Z=($.req.query("q")??"").trim().slice(0,64);if(Z.length<2)return $.json({suggestions:[]});try{let Q=await zx0(`/api/v2/public/suggest?q=${encodeURIComponent(Z)}`,{headers:{Accept:"application/json"}});if(!Q.ok)return $.json({suggestions:[]});let Y=await Q.json();return $.json({suggestions:Array.isArray(Y.suggestions)?Y.suggestions:[]})}catch{return $.json({suggestions:[]})}});cF8=zO});var L95=1048576,aE1;var dF8=L(()=>{W8();oK();r1();cO1();aE1=new Q1;aE1.post("/webhook",g5({maxSize:L95,onError:($)=>$.json({error:"payload too large"},413)}),async($)=>{let Z=L0().stripeWebhookSecret;if(!Z)return $.json({error:"stripe billing not configured"},503);let Q=await $.req.text();if(!IY8(Q,$.req.header("stripe-signature"),Z))return $.json({error:"invalid signature"},400);let X=VY8(Q);if(!X)return $.json({error:"invalid payload"},400);let J=await kY8(X);return console.log("stripe webhook",{eventId:X.id,type:X.type,livemode:X.livemode,...J}),$.json({received:!0})})});import{timingSafeEqual as O95}from"crypto";function E95($,Z,Q){if(!Z?.startsWith("sha256="))return!1;let Y=new Bun.CryptoHasher("sha256",Q).update($).digest("hex"),X=Z.slice(7);if(X.length!==Y.length)return!1;return O95(Buffer.from(X),Buffer.from(Y))}function P95($,Z){let Q=Z,Y=Q?.repository?.name,X=Q?.repository?.owner?.login;if(typeof Y!=="string"||typeof X!=="string")return[];let J=[];if($==="check_suite"){if(Q.action!=="completed")return[];let G=Q.check_suite?.pull_requests;for(let W of Array.isArray(G)?G:[]){let K=W?.number;if(typeof K==="number")J.push(K)}}else if($==="issue_comment"&&Q.issue?.pull_request){let G=Q.issue.number;if(typeof G==="number")J.push(G)}return[...new Set(J)].map((G)=>({repoOwner:X,repoName:Y,number:G}))}function iF8($){let Z=new Q1;return Z.post("/webhook",g5({maxSize:w95,onError:(Q)=>Q.json({error:"payload too large"},413)}),async(Q)=>{let Y=process.env.GITHUB_WEBHOOK_SECRET;if(!Y)return Q.json({error:"github webhook not configured"},503);let X=await Q.req.text();if(!E95(X,Q.req.header("x-hub-signature-256"),Y))return Q.json({error:"invalid signature"},400);let J=Q.req.header("x-github-event");if(J!=="push"&&!j95.has(J??""))return Q.json({ok:!0,ignored:"event"});let G;try{G=JSON.parse(X)}catch{return Q.json({error:"invalid payload"},400)}if(J==="push"){let H=G.ref,F=G.repository?.full_name;if(!H||!F)return Q.json({ok:!0,ignored:"shape"});return f80().then((U)=>U?.markTenantPoolsDirty(`https://github.com/${F}`,H)).catch((U)=>console.warn(`[github-webhook] tenant pool refresh for ${F}@${H} failed: ${U instanceof Error?U.message:String(U)}`)),Q.json({ok:!0})}let W=P95(J??"",G);if(W.length===0)return Q.json({ok:!0,ignored:"no-pr"});let K=await z95($,W);return Q.json({ok:!0,refreshed:K})}),Z}async function z95($,Z){let Q=0;for(let Y of Z){let X=$.taskBoard(),J;try{J=await X.findPrLinks(Y)}catch(G){console.error("[github-webhook] pr link lookup failed:",G);continue}for(let G of J)try{let W=await X.getById(G.taskBoardItemId,G.organizationId),K=W?await $.contextFactory()(G.organizationId,W.assignedBy??W.createdBy):null;if(!K)continue;if(await Bu$(K,G.organizationId,G.taskBoardItemId)!==null)Q++}catch(W){console.error(`[github-webhook] pr card refresh failed for ${G.taskBoardItemId}:`,W)}}return Q}var w95=5242880,j95;var pF8=L(()=>{W8();oK();RJ();MQ();j95=new Set(["check_suite","issue_comment"])});import{DBOS as $P1,SchedulerMode as A95}from"@dbos-inc/dbos-sdk";async function R95(){try{return await q95()}catch($){return console.warn(`[sandbox-credential-push] push failed: ${$ instanceof Error?$.message:String($)}`),null}}async function q95(){if(!x80())return null;let[{RemoteSandboxProvider:$},{SandboxProviderRouter:Z}]=await Promise.all([Promise.resolve().then(() => (DY1(),BY1)),Promise.resolve().then(() => (NY1(),UY1))]),Q=await f80(),Y=Q instanceof Z?Q.providers.kubernetes:Q;if(!(Y instanceof $))return null;let{db:X}=z8(),{sandboxes:J,pools:G}=await Y.list(),W=Date.now(),K=VV$({sandboxes:J,pools:G,records:await kV$(X,J,G),legacyPools:vq0(process.env.STUDIO_SANDBOX_TENANT_POOLS),now:W}),{batches:H,failed:F}=await SV$(K,$N0(X,new dX(L0().encryptionKey)),{now:W,orgFsLifetimeMs:fq0}),U=0,N=0,B=0;for(let D of H)try{let O=await Y.pushCredentials(D);U+=O.stored,N+=O.kept}catch(O){B++,console.warn(`[sandbox-credential-push] a push batch failed: ${O instanceof Error?O.message:String(O)}`)}return{sandboxes:J.length,pushed:U,kept:N,refused:K.refused,failed:F+B}}async function M95($,Z){let Q=await $P1.runStep(R95,{name:"pushSandboxCredentials"});if(Q&&(Q.refused>0||Q.failed>0))console.warn(`[sandbox-credential-push] ${Q.sandboxes} sandboxes: pushed ${Q.pushed}, kept ${Q.kept}, refused ${Q.refused}, failed ${Q.failed}`)}function nF8(){if(eE1)return;if(!L0().agentSandboxEnabled||!x80())return;eE1=$P1.registerWorkflow(M95,{name:"sandboxCredentialPushWorkflow"}),$P1.registerScheduled(eE1,{name:"sandboxCredentialPushWorkflow",crontab:T95,mode:A95.ExactlyOncePerIntervalWhenActive})}var T95="1-59/10 * * * *",eE1=null;var tF8=L(()=>{N3();Ew();$Z1();yq0();bq0();RJ();r1()});function oF8($){let Z=new WO($.db,new dX($.encryptionKey)),Q=new Q1;return Q.get("/attachments/:token",async(Y)=>{let X=Eg$(Y.req.param("token"));if(!X)return Y.json({error:"Invalid or expired link"},404);let J=await Z.getByOrg(X.organizationId);if(!J)return Y.json({error:"Jira is not connected"},404);let W=await new s7(J.siteUrl,J.email,J.apiToken).downloadAttachment(X.attachmentId);if(!W.ok||!W.body)return Y.json({error:"Jira refused the download"},502);let K=new Headers;for(let H of["content-type","content-length","content-disposition"]){let F=W.headers.get(H);if(F)K.set(H,F)}return K.set("cache-control","no-store"),new Response(W.body,{status:200,headers:K})}),Q}var sF8=L(()=>{W8();Ew();yJ1();SL()});function Ax0(){try{return L0().jiraSettleSeconds*1000}catch{return VP}}function rF8($,Z){let Q=Z.windowMs??VP,Y=$.at(-1);if(!Y)return null;if(Z.changeId!==void 0&&Y.id!==Z.changeId)return{kind:"superseded"};if(Z.now!==void 0&&Z.now-Y.at<Q)return{kind:"moving"};let X=I95($,Q);if((X.id&&Y.toId?X.id===Y.toId:!1)||!X.id&&X.name===Y.to)return{kind:"returned",change:Y};return{kind:"moved",change:Y,from:X}}function I95($,Z){for(let Y=$.length-2;Y>=0;Y--){let X=$[Y],J=$[Y+1];if(X&&J&&J.at-X.at>=Z)return{id:X.toId,name:X.to}}let Q=$[0];return{id:Q?.fromId??null,name:Q?.from??null}}var ZP1=L(()=>{uL();r1()});function aF8($){if(typeof $!=="object"||$===null)return null;let Z=$;if(Z.webhookEvent!=="jira:issue_updated")return null;let Q=Z.issue?.id,Y=Z.issue?.key,X=Z.changelog?.id;if(typeof Q!=="string"&&typeof Q!=="number"||typeof Y!=="string"||typeof X!=="string"&&typeof X!=="number")return null;let J=Z.changelog?.items?.find((G)=>G.field==="status");if(!J||typeof J.toString!=="string")return null;return{issueId:String(Q),issueKey:Y,toStatus:J.toString,changelogId:String(X)}}async function QP1($,Z,Q){if(!Z.enabled)return"disabled";let Y=Z.organizationId,X=new s7(Z.siteUrl,Z.email,Z.apiToken),J=rF8(await X.listStatusChanges(Q.issueId),{changeId:Q.changelogId,now:Q.now,windowMs:Ax0()});if(!J)return"no_rule";if(J.kind!=="moved")return J.kind;let{change:G,from:W}=J,K=(await $.storage.automations.listJiraTransitionTriggers(Y,{jiraStatus:G.to,activeOnly:!0})).map((N)=>({...N,from:IP(N)})),H=Xd$(K)&&Z.boardId?Yd$(await X.getBoardColumnStatusIds(Z.boardId),W.id,G.toId):null,F=Qd$(K,W.name,H);if(!F)return"no_rule";if(!await $.storage.jiraIntegrations.claimTrigger(Y,Q.issueId,G.id))return"duplicate";return await MK({automationId:F.automation_id,organizationId:Y,triggerId:F.id,target:{kind:"jira",issues:[Q.issueId],move:{toStatus:G.to,fromStatus:W.name,movedBy:G.by,movedAt:new Date(G.at).toISOString()},eventKey:G.id}},{idempotencyKey:`jira:${F.id}:${G.id}`}),"fired"}var YP1=L(()=>{RF();SL();xp();ZP1()});import{DBOS as Ez,SchedulerMode as V95}from"@dbos-inc/dbos-sdk";function eF8($){JP1=$}function WP1(){if(!JP1)throw Error("[jira-trigger] runtime not initialized \u2014 setJiraTriggerSweepRuntime() must run before the workflow fires");return JP1}function KP1(){let $=WP1();return new WO($.db,new dX($.encryptionKey))}async function v95($){try{let Z=await KP1().getById($);if(!Z?.enabled||!Z.boardId)return{integrationId:$,fired:0};let Q=await n3(WP1().db,Z.organizationId);if(!Q)return{integrationId:$,fired:0};if((await Q.storage.automations.listJiraTransitionTriggers(Z.organizationId,{activeOnly:!0})).length===0)return{integrationId:$,fired:0};let X=new s7(Z.siteUrl,Z.email,Z.apiToken),G=`(${await X.getBoardScopeJql(Z.boardId)}) AND status CHANGED AFTER "-${S95}m"`,W=0,K;for(let H=0;H<C95;H++){let F=await X.searchIssues({jql:G,nextPageToken:K});for(let U of F.issues)if(await QP1(Q,Z,{issueId:U.id,now:Date.now()})==="fired")W++;if(K=F.nextPageToken??void 0,!K)break}return{integrationId:$,fired:W}}catch(Z){return{integrationId:$,fired:0,error:Z instanceof Error?Z.message:String(Z)}}}async function b95($,Z){let Q=await Ez.runStep(()=>KP1().listEnabledIds(),{name:"loadJiraIntegrations"});if(Q.length===0)return;let Y=await Promise.all(Q.map((X)=>Ez.runStep(()=>v95(X),{name:`sweepJira:${X}`})));for(let X of Y)if(X.error)console.warn(`[jira-trigger] integration ${X.integrationId} failed: ${X.error}`);else if(X.fired>0)console.log(`[jira-trigger] integration ${X.integrationId} fired ${X.fired} automation(s) the webhook missed`)}async function x95($,Z){try{let Q=await KP1().getById($);if(!Q?.enabled)return"disabled";let Y=await n3(WP1().db,Q.organizationId);if(!Y)return"disabled";let X=await QP1(Y,Q,{issueId:Z.issueId,changelogId:Z.changelogId});if(X==="fired")console.log(`[jira-trigger] fired an automation for ${Z.issueKey} after it settled`);else if(X==="returned")console.log(`[jira-trigger] ${Z.issueKey} went back where it was before settling in "${Z.toStatus}"; no fire`);return X}catch(Q){return console.error(`[jira-trigger] settling ${Z.issueKey} failed`,Q instanceof Error?Q.message:Q),"error"}}async function f95($,Z){await Ez.sleep(Ax0()+_95),await Ez.runStep(()=>x95($,Z),{name:"settleJiraMove"})}async function $U8($,Z){if(!GP1)throw Error("[jira-trigger] settle workflow is not registered");await Ez.startWorkflow(GP1,{workflowID:`jira-settle:${$}:${Z.changelogId}`})($,Z)}function ZU8(){if(XP1)return;GP1=Ez.registerWorkflow(f95,{name:"jiraSettleWorkflow"}),XP1=Ez.registerWorkflow(b95,{name:"jiraTriggerSweepWorkflow"}),Ez.registerScheduled(XP1,{name:"jiraTriggerSweepWorkflow",crontab:k95,mode:V95.ExactlyOncePerIntervalWhenActive})}var k95="*/5 * * * *",S95=20,C95=5,_95=5000,JP1=null,GP1=null,XP1=null;var HP1=L(()=>{Ew();Hg();SL();ZP1();YP1()});function QU8($){let Z=new WO($.db,new dX($.encryptionKey)),Q=kc($.db);async function Y(J,G){let W=aF8(G);if(!W)return;let K=await Z.getByWebhookSecret(J);if(!K?.enabled)return;if((await Q.listJiraTransitionTriggers(K.organizationId,{activeOnly:!0})).length===0)return;await $U8(K.id,W)}let X=new Q1;return X.post("/webhook/:secret",g5({maxSize:y95}),async(J)=>{let G=J.req.param("secret");if(!await Z.getByWebhookSecret(G))return J.json({error:"Unknown webhook"},404);let K;try{K=await J.req.json()}catch{return J.json({error:"Body must be JSON"},400)}return Y(G,K).catch((H)=>{console.error("[jira-webhook] trigger failed",H)}),J.body(null,202)}),X}var y95=1048576;var YU8=L(()=>{W8();oK();Ew();HP1();YP1();oG0()});function XU8($,Z){if(Z.startsWith("text/html")||Z.startsWith("image/svg"))$.set("Content-Security-Policy","sandbox allow-scripts allow-modals allow-same-origin")}var JU8,g95,h95,GU8;var WU8=L(()=>{W8();$G();Rp();Sd();JU8=new Q1,g95=["range","if-none-match","if-modified-since"],h95=["content-type","content-length","content-range","accept-ranges","etag","last-modified"];JU8.get("/:org/files/*",async($)=>{let Z=$.get("studioContext"),Q=Z.organization?.id;if(!Z.auth?.user?.id){if(en($))return $.redirect(`/login?next=${encodeURIComponent($.req.path)}`,302);throw new k1(401,{message:"Authentication required"})}if(!Q)throw new k1(401,{message:"Organization context required"});let Y=$.req.path.replace(/^.*\/files\//,"");if(!Y)throw new k1(400,{message:"Missing file key"});let X=await O60(Y,Z);if(!X)throw new k1(503,{message:"Object storage not configured"});if(X.startsWith("data:")&&KK()){let K=X.match(/^data:([^;]+);base64,(.+)$/s);if(!K)throw new k1(500,{message:"Invalid data URL from storage"});let[,H,F]=K,U=Buffer.from(F,"base64"),N=new Headers({"Content-Type":H,"Cache-Control":"private, max-age=86400"});return XU8(N,H),new Response(U,{status:200,headers:N})}let J=new Headers;for(let K of g95){let H=$.req.header(K);if(H)J.set(K,H)}let G=await fetch(X,{headers:J});if(G.status===403||G.status===404)throw new k1(404,{message:"File not found"});if(!G.ok&&G.status!==304&&G.status!==416)throw console.error(`[files] upstream storage error ${G.status} for key:`,Y),new k1(502,{message:"Upstream storage error"});let W=new Headers;for(let K of h95){let H=G.headers.get(K);if(H)W.set(K,H)}return W.set("Cache-Control","private, max-age=86400"),XU8(W,W.get("content-type")??""),new Response(G.body,{status:G.status,headers:W})});GU8=JU8});var OZ0=b((Ch)=>{var u95=Ch&&Ch.__createBinding||(Object.create?function($,Z,Q,Y){if(Y===void 0)Y=Q;var X=Object.getOwnPropertyDescriptor(Z,Q);if(!X||("get"in X?!Z.__esModule:X.writable||X.configurable))X={enumerable:!0,get:function(){return Z[Q]}};Object.defineProperty($,Y,X)}:function($,Z,Q,Y){if(Y===void 0)Y=Q;$[Y]=Z[Q]}),l95=Ch&&Ch.__exportStar||function($,Z){for(var Q in $)if(Q!=="default"&&!Object.prototype.hasOwnProperty.call(Z,Q))u95(Z,$,Q)};Object.defineProperty(Ch,"__esModule",{value:!0});l95(oG(),Ch)});var FU8=b((KU8)=>{Object.defineProperty(KU8,"__esModule",{value:!0});KU8.version=void 0;KU8.version="3.4.0"});var BU8=b((EB)=>{var c95=EB&&EB.__importDefault||function($){return $&&$.__esModule?$:{default:$}};Object.defineProperty(EB,"__esModule",{value:!0});EB.NodeTransport=EB.VERSION=void 0;EB.nodeResolveHost=t95;var Q9=OZ0(),m95=I0("net"),FP1=I0("tls"),d95=I0("path"),UU8=I0("fs"),i95=c95(I0("dns")),p95=FU8();EB.VERSION=p95.version;var n95="nats.js";class NU8{socket;version;lang;yields=[];signal=(0,Q9.deferred)();closedNotification=(0,Q9.deferred)();options;connected=!1;tlsName="";done=!1;closeError;constructor(){this.lang=n95,this.version=EB.VERSION}async connect($,Z){this.tlsName=$.tlsName,this.options=Z;let{tls:Q}=this.options,{handshakeFirst:Y}=Q||{};try{if(Y===!0)this.socket=await this.tlsFirst($);else this.socket=await this.dial($);if(this.done)this.socket?.destroy();let X=await this.peekInfo();(0,Q9.checkOptions)(X,Z);let{tls_required:J,tls_available:G}=X,W=G===!0&&Z.tls!==null;if(!Y&&(J||W))this.socket=await this.startTLS();if(this.done)this.socket?.destroy();if(J&&this.socket.encrypted!==!0)throw Q9.errors.InvalidArgumentError.format("tls","is not available on this server");return this.connected=!0,this.setupHandlers(),this.signal.resolve(),Promise.resolve()}catch(X){let J=X;if(!J)J=new Q9.errors.ConnectionError("error connecting - node provided an undefined error");let{code:G}=J,W=G==="ECONNREFUSED"?new Q9.errors.ConnectionError("connection refused",{cause:J}):J;throw this.socket?.destroy(),W}}dial($){let Z=(0,Q9.deferred)(),Q,Y=(0,m95.createConnection)($.port,$.hostname,()=>{Z.resolve(Y),Y.removeAllListeners()});return Y.on("error",(X)=>{Q=X}),Y.on("close",()=>{Y.removeAllListeners(),Z.reject(Q)}),Y.setNoDelay(!0),Z}get isClosed(){return this.done}close($){return this._closed($,!1)}peekInfo(){let $=(0,Q9.deferred)(),Z;return this.socket.on("data",(Q)=>{this.yields.push(Q);let Y=Q9.DataBuffer.concat(...this.yields),X=(0,Q9.extractProtocolMessage)(Y);if(X!=="")try{let J=Q9.INFO.exec(X);if(!J)throw Error("unexpected response from server");let G=JSON.parse(J[1]);$.resolve(G)}catch(J){$.reject(J)}finally{this.socket.removeAllListeners()}}),this.socket.on("error",(Q)=>{Z=Q}),this.socket.on("close",()=>{this.socket.removeAllListeners(),$.reject(Z)}),$}loadFile($){if(!$)return Promise.resolve();let Z=(0,Q9.deferred)();try{if($=(0,d95.resolve)($),!(0,UU8.existsSync)($))Z.reject(Error(`${$} doesn't exist`));(0,UU8.readFile)($,(Q,Y)=>{if(Q)return Z.reject(Q);Z.resolve(Y)})}catch(Q){Z.reject(Q)}return Z}async loadClientCerts(){let $={},{certFile:Z,cert:Q,caFile:Y,ca:X,keyFile:J,key:G}=this.options.tls;try{if(Z){let W=await this.loadFile(Z);if(W)$.cert=W}else if(Q)$.cert=Q;if(J){let W=await this.loadFile(J);if(W)$.key=W}else if(G)$.key=G;if(Y){let W=await this.loadFile(Y);if(W)$.ca=[W]}else if(X)$.ca=X;return Promise.resolve($)}catch(W){return Promise.reject(W)}}async tlsFirst($){let Z,Q={servername:this.tlsName,rejectUnauthorized:!0};if(this.socket)Q.socket=this.socket;if(typeof this.options.tls==="object")try{let X=await this.loadClientCerts()||{};Q=(0,Q9.extend)(Q,this.options.tls,X)}catch(X){return Promise.reject(new Q9.errors.ConnectionError(X.message,{cause:X}))}let Y=(0,Q9.deferred)();try{let X=(0,FP1.connect)($.port,$.hostname,Q,()=>{X.removeAllListeners(),Y.resolve(X)});X.on("error",(J)=>{Z=J}),X.on("secureConnect",()=>{if(Q.rejectUnauthorized===!1)return;if(!X.authorized)throw X.authorizationError}),X.on("close",()=>{Y.reject(Z),X.removeAllListeners()}),X.setNoDelay(!0)}catch(X){Y.reject(new Q9.errors.ConnectionError(X.message,{cause:X}))}return Y}async startTLS(){let $,Z={socket:this.socket,servername:this.tlsName,rejectUnauthorized:!0};if(typeof this.options.tls==="object")try{let Y=await this.loadClientCerts()||{};Z=(0,Q9.extend)(Z,this.options.tls,Y)}catch(Y){return Promise.reject(new Q9.errors.ConnectionError(Y.message,{cause:Y}))}let Q=(0,Q9.deferred)();try{let Y=(0,FP1.connect)(Z,()=>{Y.removeAllListeners(),Q.resolve(Y)});Y.on("error",(X)=>{$=X}),Y.on("secureConnect",()=>{if(Z.rejectUnauthorized===!1)return;if(!Y.authorized)throw Y.authorizationError}),Y.on("close",()=>{Q.reject($),Y.removeAllListeners()})}catch(Y){Q.reject(new Q9.errors.ConnectionError(Y.message,{cause:Y}))}return Q}setupHandlers(){let $;this.socket.on("data",(Z)=>{return this.yields.push(Z),this.signal.resolve()}),this.socket.on("error",(Z)=>{$=Z}),this.socket.on("end",()=>{if(this.socket?.destroyed)return;this.socket?.write(new Uint8Array(0),()=>{this.socket?.end()})}),this.socket.on("close",()=>{this._closed($,!1)})}[Symbol.asyncIterator](){return this.iterate()}async*iterate(){while(!0){if(this.yields.length===0)await this.signal;let $=this.yields;this.yields=[];for(let Z=0;Z<$.length;Z++){if(this.options.debug)console.info(`> ${(0,Q9.render)($[Z])}`);yield $[Z]}if(this.done)break;else if(this.yields.length===0)$.length=0,this.yields=$,this.signal=(0,Q9.deferred)()}}discard(){if(this.done=!0,this.socket)try{this.socket.removeAllListeners(),this.socket.destroy()}catch{}}disconnect(){this._closed(void 0,!0).then().catch()}isEncrypted(){return this.socket instanceof FP1.TLSSocket}_send($){if(this.isClosed||this.socket===void 0)return Promise.resolve();if(this.options.debug)console.info(`< ${(0,Q9.render)($)}`);let Z=(0,Q9.deferred)();try{this.socket.write($,(Q)=>{if(Q){if(this.options.debug)console.error(`!!! ${(0,Q9.render)($)}: ${Q}`);return Z.reject(Q)}return Z.resolve()})}catch(Q){if(this.options.debug)console.error(`!!! ${(0,Q9.render)($)}: ${Q}`);Z.reject(Q)}return Z}send($){this._send($).catch((Q)=>{})}async _closed($,Z=!0){if(!this.connected)return;if(this.done){this.socket?.destroy();return}if(this.closeError=$,!$&&this.socket&&Z)try{await this._send(new TextEncoder().encode(""))}catch(Q){if(this.options.debug)console.log("transport close terminated with an error",Q)}try{if(this.socket)this.socket.removeAllListeners(),this.socket?.destroy(),this.socket=void 0}catch(Q){console.log(Q)}this.done=!0,this.closedNotification.resolve(this.closeError)}closed(){return this.closedNotification}}EB.NodeTransport=NU8;function t95($){let Z=(0,Q9.deferred)();return i95.default.lookup($,{all:!0},(Q,Y)=>{if(Q){Z.reject(Q);return}let X=[];for(let J of Y)X.push(J.address);if(X.length===0)X.push($);Z.resolve(X)}),Z}});var jU8=b((wU8)=>{Object.defineProperty(wU8,"__esModule",{value:!0});wU8.connect=o95;var DU8=BU8(),LU8=OZ0(),OU8=OZ0();function o95($={}){if((0,OU8.hasWsProtocol)($))return Promise.reject(OU8.errors.InvalidArgumentError.format("servers","node client doesn't support websockets, use the 'wsconnect' function instead"));return(0,LU8.setTransportFactory)({factory:()=>{return new DU8.NodeTransport},dnsResolveFn:DU8.nodeResolveHost}),LU8.NatsConnectionImpl.connect($)}});var EU8=b((AO)=>{var r95=AO&&AO.__createBinding||(Object.create?function($,Z,Q,Y){if(Y===void 0)Y=Q;var X=Object.getOwnPropertyDescriptor(Z,Q);if(!X||("get"in X?!Z.__esModule:X.writable||X.configurable))X={enumerable:!0,get:function(){return Z[Q]}};Object.defineProperty($,Y,X)}:function($,Z,Q,Y){if(Y===void 0)Y=Q;$[Y]=Z[Q]}),a95=AO&&AO.__exportStar||function($,Z){for(var Q in $)if(Q!=="default"&&!Object.prototype.hasOwnProperty.call(Z,Q))r95(Z,$,Q)};Object.defineProperty(AO,"__esModule",{value:!0});AO.connect=void 0;var e95=jU8();Object.defineProperty(AO,"connect",{enumerable:!0,get:function(){return e95.connect}});a95(OZ0(),AO)});function AU8($){let Z=$?.connectFn??YZ5,Q=null,Y=null,X=!1,J=!1,G=!1,W=[];function K(){return Q!==null&&!Q.isClosed()&&!Q.isDraining()&&!G}function H(){console.log(`[NatsProvider] fireReady: ${W.length} callbacks`);for(let N of W)try{N()}catch{}}function F(N){(async()=>{for await(let B of N.status())if(B.type==="disconnect")console.log("[NatsProvider] Disconnected"),G=!0;else if(B.type==="reconnect")console.log("[NatsProvider] Reconnected, re-firing ready callbacks"),G=!1,Y=null,H()})().catch(()=>{})}async function U(N,B){let D=0;while(!J)try{Q=await Z({servers:N,timeout:QZ5,reconnect:!0,maxReconnectAttempts:-1,...B?{authenticator:B}:{}}),console.log(`[NatsProvider] Connected to ${Q.getServer()} after ${D} attempt(s)`),Y=null,G=!1,F(Q),H();return}catch{D++;let O=I7(ZZ5,$Z5,D-1,2,0.5);await D$(O)}}return{init(N,B){if(X)return;X=!0,J=!1;let D=B?.creds?Tx0.credsAuthenticator(new TextEncoder().encode(B.creds)):B?.user?Tx0.usernamePasswordAuthenticator(B.user,B.password):void 0;U(N,D).catch(()=>{})},isConnected(){return K()},getConnection(){return K()?Q:null},getJetStream(){if(!K())return null;if(!Y)Y=zU8.jetstream(Q);return Y},onReady(N){if(W.push(N),K())try{N()}catch{}},async drain(){if(J=!0,X=!1,Y=null,G=!1,Q){let N=Q;Q=null,await N.drain().catch(()=>{})}}}}function YZ5($){return PU8.connect($)}var Tx0,PU8,zU8,$Z5=100,ZZ5=3000,QZ5=3000;var TU8=L(()=>{r$();Tx0=C(uz(),1),PU8=C(EU8(),1),zU8=C(KH(),1)});function Rx0($){let Z=$?.ttlMs??60000,Q=$?.maxSize??1e4,Y=$?.updateRecencyOnGet??!1,X=new Map;function J(){if(X.size<=Q)return;let G=Date.now();for(let[W,K]of X)if(K.expiresAt<=G)X.delete(W);while(X.size>Q){let W=X.keys().next().value;if(W===void 0)break;X.delete(W)}}return{get(G){let W=X.get(G);if(!W)return;if(W.expiresAt<=Date.now()){X.delete(G);return}if(Y)X.delete(G),X.set(G,W);return W.value},set(G,W){X.delete(G),X.set(G,{value:W,expiresAt:Date.now()+Z}),J()},delete(G){X.delete(G)},clear(){X.clear()},size(){return X.size}}}function qx0($,Z){return`${$}.${Z}`}class UP1{cache;constructor($){this.cache=Rx0({ttlMs:$?.ttlMs??XZ5,maxSize:$?.maxSize??JZ5})}async get($,Z){return this.cache.get(qx0($,Z))??null}async set($,Z,Q){this.cache.set(qx0($,Z),Q)}async invalidate($,Z){this.cache.delete(qx0($,Z)),this.cache.delete(qx0($,`${Z}:decisions`))}teardown(){this.cache.clear()}}var XZ5=600000,JZ5=5000;var RU8=()=>{};function Mx0($,Z){return`${$}:${Z}`}function NP1($){let Z=Rx0({ttlMs:$?.ttlMs??GZ5,maxSize:$?.maxSize??WZ5}),Q=$?.getConnection,Y=crypto.randomUUID(),X=new TextEncoder,J=new TextDecoder,G=null;function W(K,H){let F=Q?.();if(!F)return;try{F.publish(qU8,X.encode(JSON.stringify({organizationId:K,keyId:H,originId:Y})))}catch(U){console.warn("[ProviderKeyCache] Publish failed (non-critical):",U)}}return{get(K,H){return Z.get(Mx0(K,H))},set(K,H,F){Z.set(Mx0(K,H),F)},invalidate(K,H){Z.delete(Mx0(K,H)),W(K,H)},start(){if(G)return;let K=Q?.();if(!K)return;G=K.subscribe(qU8),(async()=>{for await(let H of G)try{let F=JSON.parse(J.decode(H.data));if(F.originId===Y)continue;Z.delete(Mx0(F.organizationId,F.keyId))}catch{}})().catch(console.error)},teardown(){G?.unsubscribe(),G=null,Z.clear()}}}var qU8="studio.ai-provider-keys.invalidate",GZ5=30000,WZ5=5000;var MU8=()=>{};class BP1{options;subscription=null;onCancel=null;encoder=new TextEncoder;originId=crypto.randomUUID();constructor($){this.options=$}async start($){if($)this.onCancel=$;if(this.subscription)return;if(!this.onCancel)return;let Z=this.options.getConnection();if(!Z)return;let Q=new TextDecoder,Y=Z.subscribe("studio.decopilot.cancel");this.subscription=Y,(async()=>{for await(let X of Y)try{let J=JSON.parse(Q.decode(X.data));if(J.originId===this.originId)continue;this.onCancel?.(J.taskId)}catch{}})().catch(console.error)}broadcast($){if(/[.*>\s]/.test($)){console.warn("[NatsCancelBroadcast] Invalid threadId, skipping broadcast");return}this.onCancel?.($);try{let Z=this.options.getConnection();if(!Z)return;let Q=this.encoder.encode(JSON.stringify({taskId:$,originId:this.originId}));Z.publish("studio.decopilot.cancel",Q)}catch(Z){console.warn("[NatsCancelBroadcast] Publish failed (non-critical):",Z)}}async stop(){this.subscription?.unsubscribe(),this.subscription=null,this.onCancel=null}}var IU8=($)=>{let Z;return()=>Z??=$()},DP1,LP1;var VU8=L(()=>{v6();DP1=IU8(()=>J$.createHistogram("decopilot.stream.encode_ms",{description:"Per-chunk JSON.stringify+encode time for decopilot stream",unit:"ms"})),LP1=IU8(()=>J$.createCounter("decopilot.stream.published_chunks",{description:"Logical decopilot stream chunks published to JetStream",unit:"{chunks}"}))});function DZ5($=CU8){return{name:nN,subjects:[`${TW1}.>`],storage:cF.StorageType.File,max_age:FZ5,max_bytes:NZ5,max_msgs_per_subject:BZ5,discard:cF.DiscardPolicy.Old,retention:cF.RetentionPolicy.Limits,duplicate_window:UZ5,num_replicas:$}}class _U8{chunks=0;encodeMs=0;maxMs=0;bytes=0;windowStart=performance.now();constructor(){setInterval(()=>this.flush(),1e4).unref?.()}record($,Z){if(this.chunks++,this.encodeMs+=$,$>this.maxMs)this.maxMs=$;this.bytes+=Z}flush(){let $=performance.now(),Z=$-this.windowStart;if(this.chunks>0&&Z>0)console.warn(JSON.stringify({msg:"stream-encode-trace",windowMs:Math.round(Z),chunks:this.chunks,encodeMs:Math.round(this.encodeMs),pctOfLoop:+(this.encodeMs/Z*100).toFixed(1),maxChunkMs:+this.maxMs.toFixed(2),mbEncoded:+(this.bytes/1048576).toFixed(2)}));this.chunks=0,this.encodeMs=0,this.maxMs=0,this.bytes=0,this.windowStart=$}}function kU8($){let Z=SU8.headers();for(let[Q,Y]of Object.entries($))Z.set(Q,Y);return Z}function jZ5($,Z){let Q=0;return{publish(Y,X,J,G){Y.publish(X,J,G?{headers:G}:void 0).catch((W)=>{if(Q++,HZ5().add(1,{"org.id":Z??"unknown"}),Q===1||Q%100===0)console.warn(`[Decopilot] JetStream publish failed for thread ${$} (${Q} total):`,W)})},get errorCount(){return Q}}}function EZ5($,Z){return $.info?.cluster?Z:1}function PZ5($){if(!($ instanceof Error))return!1;if(/non-clustered/i.test($.message))return!0;return/replicas?\b/i.test($.message)&&/not supported|can ?not|exceed|insufficient|greater than/i.test($.message)}class OP1{options;js=null;jsm=null;constructor($){this.options=$}async init(){let $=this.options.getConnection();if(!$){console.log("[Decopilot] StreamBuffer.init skipped: NATS not connected yet");return}let Z=async(Y,X)=>{let J=DZ5(X);try{await Y.streams.info(nN),await Y.streams.update(nN,J)}catch(G){if(G instanceof Error&&G.message.includes("stream not found"))await Y.streams.add(J),await Y.streams.update(nN,J);else if(G instanceof Error&&/can ?not change.*storage|storage type/i.test(G.message))await Y.streams.delete(nN),await Y.streams.add(J);else throw G}},Q=await D8(async()=>{let Y=this.options.getJetStreamManager?await this.options.getJetStreamManager():await cF.jetstreamManager($),X=EZ5($,CU8);try{await Z(Y,X)}catch(J){if(X<=1||!PZ5(J))throw J;console.warn(`[Decopilot] StreamBuffer: NATS rejected num_replicas=${X} (${J.message}); falling back to an unreplicated stream`),await Z(Y,1)}return Y},{maxAttempts:5,minTimeout:250,maxTimeout:4000,jitter:0.5,isRetriable:bp});this.js=this.options.getJetStream(),this.jsm=Q,console.log(`[Decopilot] StreamBuffer.init ${this.js?"ready":"degraded (js=null)"}`)}pump($,Z,Q,Y){let X=this.js;if(!X)return console.warn(`[Decopilot] pump: JetStream client unavailable for thread ${Z}; chunks NOT published to NATS`),Promise.resolve();let J=jZ5(Z,Y),G=!1,W=()=>{if(G)return;G=!0;let H=Cm$(Z);X.publish(H.subject,H.data).catch(()=>{})};Q.addEventListener("abort",W,{once:!0});let K=(H)=>{let F=performance.now(),U=qW1(H,{runId:Z}),N=performance.now()-F;DP1().record(N),LP1().add(1,{"org.id":Y??"unknown"}),wZ5?.record(N,U.reduce((B,D)=>B+D.data.length,0));for(let B of U)J.publish(X,B.subject,B.data,B.headers?kU8(B.headers):void 0)};return(async()=>{let H=$.getReader(),F=0,U=0,N;try{while(!0){let{done:B,value:D}=await H.read();if(B)break;if(K(D),U++,++F>=64)F=0,await new Promise((O)=>setImmediate(O))}}catch(B){N=B,console.warn(`[Decopilot] stream pump error for thread ${Z}:`,B?.message??B)}finally{if(H.releaseLock(),W(),OZ5)console.warn(JSON.stringify({msg:"decopilot-stream-diag",event:"pump-done",taskId:Z,publishedChunks:U,publishErrors:J.errorCount}))}if(N!==void 0)throw N})()}async publishSerialized($,Z){try{return await D8(()=>$.publish(Z.subject,Z.data,{...Z.headers?{headers:kU8(Z.headers)}:{},...Z.msgId?{msgID:Z.msgId}:{}}),{maxAttempts:6,minTimeout:250,maxTimeout:5000,jitter:0.5,isRetriable:bp}),!0}catch(Q){return console.error(`[Decopilot] publish failed after retries subject=${Z.subject}`,Q),!1}}async publishRawChunk($,Z,Q){let Y=this.js;if(!Y)return!1;let X=performance.now(),J=qW1(Z,{runId:$,dedup:Q});DP1().record(performance.now()-X),LP1().add(1);for(let G of J)if(!await this.publishSerialized(Y,G))return!1;return!0}async publishDone($,Z,Q){let Y=this.js;if(!Y)return!1;let X=Sm$({runId:$,fenceToken:Z,finalSeq:Q});return await this.publishSerialized(Y,X)}async createTailStream($,Z,Q){let Y=this.js;if(!Y)return console.warn(`[Decopilot] createTailStream: JetStream client unavailable for thread ${$}; no live tail`),null;let X=Q?.deliverPolicy==="new"?cF.DeliverPolicy.New:cF.DeliverPolicy.All,J=Q?.closeOnDone??!1,G=MP($),W;try{W=await D8(async()=>{return(await Y.consumers.get(nN,{filter_subjects:G,deliver_policy:X})).consume()},{maxAttempts:6,minTimeout:250,maxTimeout:5000,jitter:0.5,isRetriable:bp})}catch(O){return console.warn("[Decopilot] JetStream tail unavailable (non-critical):",O?.message??O),null}let F=Qk0({messages:async function*(){try{for await(let O of W)yield{subject:O.subject,data:O.data,headers:O.headers}}finally{W.stop()}}(),onCancel:()=>W.stop()}).pipeThrough(aV0()).pipeThrough(eV0()).getReader(),U=!1,N=()=>{if(U)return;U=!0;try{F.releaseLock()}catch{}},B=!1,D=()=>{if(B)return;B=!0,W.stop(),F.cancel().catch(()=>{}),N()};return Z?.addEventListener("abort",D,{once:!0}),new ReadableStream({async pull(O){for(;;){let{done:w,value:j}=await F.read();if(w){D(),O.close();return}let E=j;if(E.kind==="done"){if(J){D(),O.close();return}continue}O.enqueue(E.chunk);return}},cancel(){D()}})}purge($){if(!this.jsm)return;this.jsm.streams.purge(nN,{filter:MP($)}).catch(()=>{})}teardown(){this.js=null,this.jsm=null}}var cF,SU8,KZ5=($)=>{let Z;return()=>Z??=$()},HZ5,FZ5=86400000000000,UZ5=120000000000,NZ5=4294967296,CU8,BZ5=500000,LZ5,OZ5,wZ5;var vU8=L(()=>{r$();MW1();Yk0();$k0();v6();VU8();cF=C(KH(),1),SU8=C(uz(),1),HZ5=KZ5(()=>J$.createCounter("decopilot.stream.publish_errors",{description:"Number of JetStream publish failures for decopilot stream chunks",unit:"{errors}"})),CU8=Math.max(1,Number(process.env.DECOPILOT_STREAM_REPLICAS??3)||3);LZ5=process.env.STREAM_ENCODE_TRACE==="1",OZ5=process.env.DECOPILOT_STREAM_TRACE==="1";wZ5=LZ5?new _U8:null});function Ix0($,Z,Q,Y){if(!Y)return!1;return $.emit(Z,FU(Q,Y.status,{title:Y.title??void 0,virtualMcpId:Y.virtual_mcp_id??void 0,createdBy:Y.created_by??void 0,triggerId:Y.trigger_id??null,branch:Y.branch??null,harnessId:Y.harness_id??void 0,createdAt:Y.created_at,updatedAt:Y.updated_at})),!0}var bU8=L(()=>{R8()});class wP1{storage;options;timer=null;constructor($,Z={}){this.storage=$;this.options=Z}start(){if(this.timer)return;let $=this.options.intervalMs??300000;this.timer=setInterval(()=>{this.runOnce()},$)}async runOnce(){let $=this.options.staleAfterMs??3600000;try{let Z=await this.storage.sweepAbandoned($);if(Z>0)console.log(`[async-research-sweeper] marked ${Z} stale jobs as abandoned`);return Z}catch(Z){return console.error("[async-research-sweeper] sweep failed",Z),0}}dispose(){if(this.timer)clearInterval(this.timer),this.timer=null}}function zZ5($,Z,Q={}){let Y=$.startsWith("thread:")?LF($,Q):$;return[...new Set([Z,Y].filter((X)=>!!X))]}async function jP1($,Z){let Q=Z.organizationId;try{let Y=await $.storage.taskBoard.linkedThreadIds(Z.id,Q);for(let X of Y){let J=await fN($,X);if(!J?.owner||!J?.name)continue;let G=await $.storage.threads.get(X),W=await JP($,{threadId:X,runBranch:G?.branch}),K=await c$0($,Q,o91(J)).catch(()=>null);if(!K){console.warn(`[task-board] no credential for ${J.owner}/${J.name} \u2014 `+`cannot look up ${Z.id}'s change request by branch`);continue}let H=zZ5(W,await GM0($,X),{flat:gy(K.repo.provider)});for(let F of H){let U=await K.readForBranch(F).catch(()=>null);if(!U)continue;return await $.storage.taskBoard.linkPr({taskBoardItemId:Z.id,organizationId:Q,url:U.url,prNumber:U.number,repo:K.repo}),await $.storage.taskBoard.openReviewCycleIfInProgress(Z.id,Q),await t3(Q).catch(()=>{}),console.log(`[task-board] ${Z.id}: linked ${U.url} found on branch ${F}`),!0}}}catch(Y){console.error("[task-board] PR lookup by branch failed",Y)}return!1}var xU8=L(()=>{O7();BX();MQ()});async function fU8($,Z,Q){let Y=Z.organizationId;if(!IJ(Z))return!1;if(!Fg(Q))return!1;if(await $.storage.taskBoard.hasHumanRejectedDone(Z.id,Y))return!1;let X=D1.shipped,J=await $.storage.taskBoard.update(Z.id,Y,{status:X},Z.updatedBy);return await r5($,{taskBoardItemId:Z.id,action:"status_changed",actorId:null,data:{from:Z.status,to:X,reason:"pr_merged"}}),w8(Y,J),console.log(`[task-board-review-sweeper] ${Z.id}: linked PR already merged \u2014 moved to ${X}`),!0}var yU8=L(()=>{m8();jX();Op();AF();a5()});function VZ5($){return $ instanceof XX}function gU8($,Z){return Z-$>=MZ5}class EP1{taskBoard;contextFactory;billing;options;timer=null;running=!1;cursor=null;constructor($,Z,Q,Y={}){this.taskBoard=$;this.contextFactory=Z;this.billing=Q;this.options=Y}start(){if(this.timer)return;let $=this.options.intervalMs??AZ5;this.timer=setInterval(()=>{this.runOnce()},$),this.timer.unref()}async runOnce(){if(this.running)return 0;this.running=!0;let $=0;try{let Z=this.options.batchSize??RZ5,Q=this.options.itemIntervalMs??TZ5,Y=new Date(Date.now()-Q),X=await this.taskBoard.listItemsPendingReview(Z,this.cursor,Y),J=X.at(-1);this.cursor=X.length===Z&&J?{updatedAt:J.updatedAt,id:J.id}:null;for(let{id:G,organizationId:W}of X)try{if(await this.reconcileItem(G,W,Y))$++}catch(K){console.error(`[task-board-review-sweeper] ${G} failed`,K)}await this.reapNeverStartedThreads(Z),$+=await this.dispatchDueRetries(Z),await this.reactToUnhandledFailures(Z),$+=await this.settleFinishedRunsWithoutPr(Z,Y)}catch(Z){console.error("[task-board-review-sweeper] sweep failed",Z)}finally{this.running=!1}return $}async reapNeverStartedThreads($){try{let Z=await this.taskBoard.failNeverStartedLinkedThreads($,new Date(Date.now()-SJ1),Q31);for(let Q of Z)console.warn(`[task-board-review-sweeper] failed never-started thread ${Q.threadId} on ${Q.itemId}`)}catch(Z){console.error("[task-board-review-sweeper] reaping failed",Z)}}async reactToUnhandledFailures($){let Z=await this.taskBoard.listItemsStuckAfterFailure($,new Date(Date.now()-IZ5));for(let{id:Q,organizationId:Y,threadId:X}of Z)try{console.warn(`[task-board-review-sweeper] reacting to an unhandled failure on ${Q}`),await $31(this.taskBoard,X,Y),await Z31(this.taskBoard,this.billing,X,Y)}catch(J){console.error(`[task-board-review-sweeper] unhandled-failure reaction for ${Q} failed`,J)}}async settleFinishedRunsWithoutPr($,Z){let Q=0,Y=await this.taskBoard.listItemsFinishedWithoutPr($,Z);for(let{id:X,organizationId:J,finishedAt:G}of Y)try{if(!await this.taskBoard.claimSweep(X,J,Z))continue;let W=await this.taskBoard.getById(X,J);if(!W||W.status!==D1.progress||IJ(W)||W.assigneeId!==F8)continue;let K=await this.contextFactory(J,W.assignedBy??W.createdBy);if(!K)continue;if(await jP1(K,W)){if(await this.taskBoard.clearSweepBudget(X,J),await this.reconcileItem(X,J,Z))Q++;continue}if(!gU8(G.getTime(),Date.now()))continue;let H="the run finished without opening a pull request \u2014 there is "+"nothing for a reviewer to review",F=await this.taskBoard.advanceFromProgress(X,J,D1.review,W.updatedBy);if(!F)continue;await this.taskBoard.recordActivity({taskBoardItemId:X,action:"status_changed",actorId:null,data:{from:D1.progress,to:D1.review,reason:H}}).catch(()=>{}),w8(J,F),await TF(K,F,H)}catch(W){console.error(`[task-board-review-sweeper] settling finished run on ${X} failed`,W)}return Q}async dispatchDueRetries($){let Z=0,Q=await this.taskBoard.listItemsDueForRetry($,new Date);for(let{id:Y,organizationId:X,attempts:J}of Q)try{if(!await this.taskBoard.claimDueRetry(Y,X,new Date))continue;let G=await this.taskBoard.getById(Y,X);if(!G||G.status!==D1.progress||G.assigneeId!==F8)continue;let W=await this.contextFactory(X,G.assignedBy??G.createdBy);if(!W)continue;await xL(W,G,{runClass:"retry"}),Z++,console.warn(`[task-board-review-sweeper] re-dispatched ${Y} after a failure (attempt ${J})`)}catch(G){if(console.error(`[task-board-review-sweeper] retry dispatch for ${Y} failed`,G),VZ5(G)){await this.returnToBacklog(Y,X,G instanceof Error?G.message:String(G));continue}await this.taskBoard.scheduleRunRetry(Y,X,J,new Date(Date.now()+qZ5)).catch((W)=>console.error(`[task-board-review-sweeper] re-arming ${Y} failed`,W))}return Z}async returnToBacklog($,Z,Q){try{let Y=await this.taskBoard.getById($,Z);if(!Y||Y.status!==D1.progress)return;let X=await this.taskBoard.returnToBacklogAfterFailure($,Z,Y.updatedBy);if(!X)return;await this.taskBoard.recordActivity({taskBoardItemId:$,action:"status_changed",actorId:null,data:{from:D1.progress,to:D1.intake,reason:Q,retriesSpent:Y.retryAttempts}}).catch(()=>{}),w8(Z,X)}catch(Y){console.error(`[task-board-review-sweeper] returning ${$} to backlog failed`,Y)}}async handOffReviewWithoutPr($,Z){let Q=await this.taskBoard.listActivity(Z.id,Z.organizationId);if(!gU8(kD(Q,Z.reviewCycleStartedAt),Date.now()))return;await TF($,Z,"no pull request is linked to this task \u2014 there is nothing for a "+"reviewer to review")}async reconcileItem($,Z,Q){if(!await this.taskBoard.claimSweep($,Z,Q))return!1;let Y=await this.taskBoard.getById($,Z);if(!Y)return!1;if(!IJ(Y))return!1;let X=Y.assigneeId===F8,J=await this.taskBoard.listPrs($,Z),G=await this.contextFactory(Z,Y.assignedBy??Y.createdBy);if(!G)return!1;if(J.length===0){if(await jP1(G,Y))J=await this.taskBoard.listPrs($,Z);if(J.length===0){if(X)await this.handOffReviewWithoutPr(G,Y);return!1}}let W=await Promise.all(J.map(async(K)=>({...K,...await Ep(Z,K)})));if(W.every((K)=>K.state===null))console.warn(`[task-board-review-sweeper] ${$}: no live PR state from GitHub (${W.length} PR(s)) \u2014 proceeding on unknown`);if(await fU8(G,Y,W))return!0;if(!X)return!1;if(await ku$(G,Y))return!0;if(!sG1(W))return!1;return await jp(G,Y,{previewMatchesHead:rG1(W)}),!0}dispose(){if(this.timer)clearInterval(this.timer),this.timer=null}}var AZ5=60000,TZ5=300000,RZ5=50,qZ5=60000,MZ5=900000,IZ5=120000;var hU8=L(()=>{m8();aI0();xU8();fL();Tp();AF();yU8();a5();b3();Y31();MQ();l40()});async function uU8($,Z,Q=VP){return await cU8($,Z,Q,{})}async function lU8($,Z,Q,Y=VP){return await cU8($,Q,Y,{activityId:Z})}async function cU8($,Z,Q,Y){let X=await $.automations.findActiveBoardColumnTriggers();if(X.length===0)return 0;let J=new Map;for(let K of X){let H=K.automation.organization_id;J.set(H,[...J.get(H)??[],K])}let G=await $.taskBoard.listSettledTransitions({organizationIds:[...J.keys()],since:new Date(Z-kZ5),settledBefore:new Date(Z-Q),limit:SZ5,...Y}),W=0;for(let K of G)try{let H=(J.get(K.organizationId)??[]).filter((U)=>U.column_key===K.to&&Date.parse(U.created_at)<Date.parse(K.occurredAt));if(H.length===0)continue;let F=await CZ5($.taskBoard,K,Q);for(let U of H){if(!Gd$(U,{from:F,to:K.to}))continue;if(!await $.automations.claimTriggerFire(U.id,K.activityId))continue;await $.fire({automationId:U.automation_id,organizationId:K.organizationId,triggerId:U.id,target:{kind:"card",itemId:K.itemId,columnKey:K.to,eventKey:K.activityId,movedBy:K.actorId}},{idempotencyKey:`board:${U.id}:${K.activityId}`}),W++}}catch(H){console.error(`[automations] board transition ${K.activityId} failed`,H)}return W}async function CZ5($,Z,Q){let X=(await $.listActivity(Z.itemId,Z.organizationId)).flatMap((J)=>{let G=J.data;if(J.action!=="status_changed"||typeof G?.to!=="string")return[];let W=typeof G.from==="string"?G.from:null;return W===G.to?[]:[{from:W,to:G.to,occurredAt:J.occurredAt}]});return X.length>0?Wd$(X,Q):Z.from}var kZ5=1800000,SZ5=200;var mU8=L(()=>{uL()});import{DBOS as Pz,DBOSClient as _Z5,SchedulerMode as vZ5}from"@dbos-inc/dbos-sdk";function dU8($){TO=$}async function fZ5($){if(!TO)return 0;try{return await lU8(TO,$,Date.now(),TO.settleMs)}catch(Z){return console.error(`[automations] settling board move ${$} failed`,Z),0}}async function yZ5(){if(!TO)return 0;try{return await uU8(TO,Date.now(),TO.settleMs)}catch($){return console.error("[automations] board transition sweep failed",$),0}}async function gZ5($){await Pz.sleep((TO?.settleMs??VP)+xZ5),await Pz.runStep(()=>fZ5($),{name:"settleBoardMove"})}async function hZ5($,Z){let Q=await Pz.runStep(()=>yZ5(),{name:"sweepBoardMoves"});if(Q>0)console.log(`[automations] board transition sweep fired ${Q} trigger(s) the settle wait missed`)}async function pU8($){let Z=TO;if(!Z||!zP1)return;if(!await Z.automations.hasActiveBoardColumnTrigger($.taskBoardItemId,$.to))return;let Q=`board-settle:${$.activityId}`;if(!Pz.isWithinWorkflow()){await Pz.startWorkflow(zP1,{workflowID:Q,queueName:Iz})($.activityId);return}let Y=await _Z5.create({systemDatabaseUrl:Z.systemDatabaseUrl,systemDatabaseSchemaName:"dbos",systemDatabasePoolSize:1});try{await Y.enqueue({workflowName:iU8,queueName:Iz,workflowID:Q},$.activityId)}finally{await Y.destroy()}}function nU8(){if(PP1)return;zP1=Pz.registerWorkflow(gZ5,{name:iU8}),PP1=Pz.registerWorkflow(hZ5,{name:"boardTransitionSweepWorkflow"}),Pz.registerScheduled(PP1,{name:"boardTransitionSweepWorkflow",crontab:bZ5,mode:vZ5.ExactlyOncePerIntervalWhenActive})}var bZ5="*/5 * * * *",xZ5=2000,TO=null,iU8="boardTransitionSettleWorkflow",zP1=null,PP1=null;var tU8=L(()=>{uL();mU8()});import{readdir as uZ5,rm as Vx0}from"fs/promises";import{join as kx0}from"path";async function Sx0($){let Z=new Date;Z.setUTCDate(Z.getUTCDate()-lZ5),Z.setUTCHours(0,0,0,0);let Q=0;try{let Y=await _h($);for(let X of Y)if(/^\d{4}$/.test(X))Q+=await oU8($,X,Z);else if(!X.startsWith(".")){let J=kx0($,X),G=await _h(J);for(let K of G){if(!/^\d{4}$/.test(K))continue;Q+=await oU8(J,K,Z)}if((await _h(J)).length===0)await Vx0(J,{recursive:!0,force:!0})}}catch(Y){console.warn("monitoring retention cleanup failed:",Y)}return Q}async function oU8($,Z,Q){let Y=0,X=kx0($,Z),J=await _h(X);for(let W of J){if(!/^\d{2}$/.test(W))continue;let K=kx0(X,W),H=await _h(K);for(let U of H){if(!/^\d{2}$/.test(U))continue;let N=new Date(`${Z}-${W}-${U}T00:00:00Z`);if(isNaN(N.getTime()))continue;if(N<Q){let B=kx0(K,U);await Vx0(B,{recursive:!0,force:!0}),Y++}}if((await _h(K)).length===0)await Vx0(K,{recursive:!0,force:!0})}if((await _h(X)).length===0)await Vx0(X,{recursive:!0,force:!0});return Y}async function _h($){try{return(await uZ5($)).filter((Q)=>!Q.startsWith("."))}catch{return[]}}var lZ5=30;var AP1=()=>{};import{DBOS as TP1,SchedulerMode as cZ5}from"@dbos-inc/dbos-sdk";async function dZ5(){let $=[$H(),lh(),IB()],Z=0;for(let Q of $)try{Z+=await Sx0(Q)}catch(Y){console.error("[monitoring-retention] cleanup failed:",Y)}return console.log(`[monitoring-retention] deleted ${Z} day-dir(s) across ${$.length} signal dir(s)`),{deleted:Z,dirs:$.length}}async function iZ5($,Z){await TP1.runStep(()=>dZ5(),{name:"monitoringRetention"})}function rU8(){if(sU8)return;sU8=!0;let $=TP1.registerWorkflow(iZ5,{name:"monitoringRetentionWorkflow"});TP1.registerScheduled($,{name:"monitoringRetentionWorkflow",crontab:mZ5,mode:cZ5.ExactlyOncePerIntervalWhenActive})}var mZ5="23 4 * * *",sU8=!1;var aU8=L(()=>{jW();AP1()});function eU8($){return async(Z,Q)=>{let Y=await $.db.selectFrom("member").innerJoin("organization","organization.id","member.organizationId").select(["member.role","organization.id as orgId","organization.slug as orgSlug","organization.name as orgName"]).where("member.userId","=",Q).where("member.organizationId","=",Z).executeTakeFirst();if(!Y)return console.warn(`[automationContextFactory] User ${Q} not found in org ${Z} \u2014 returning null`),null;let X=await NY.create();X.auth.user={id:Q,role:Y.role},X.organization={id:Y.orgId,slug:Y.orgSlug,name:Y.orgName};let J=await PE($.db,Z,Y.role);return X.boundAuth=bO1({auth:X.authInstance,headers:new Headers,role:Y.role,permissions:J,userId:Q}),X.access=new OA(Q,void 0,X.boundAuth,Y.role,"self"),AP(X,{id:Y.orgId,slug:Y.orgSlug}),X}}var $N8=L(()=>{nX();wN()});function ZN8(){return async($,Z)=>{let Q=Date.now(),Y=$.req.method,X=$.req.path;if(X==="/api/auth/get-session"||X.includes("favicon")){await Z();return}let J="",G=!1;if(X.startsWith("/mcp")&&Y==="POST"){G=!0;try{if($.req.header("Content-Type")?.includes("application/json")){let N=await $.req.raw.clone().json();if(N.method==="tools/call"&&N.params?.name){let B=wZ0(N.params.name),D=N.params.arguments||{},O=Object.keys(D).map((j)=>wZ0(j)),w=O.length>0?O.slice(0,3).join(",")+(O.length>3?"\u2026":""):"";J=`${N9.tool}${B}${N9.dim}(${w})${N9.reset}`}else if(N.method)J=`${N9.dim}${wZ0(N.method)}${N9.reset}`}}catch{}}let W=wZ0(X);if(X.startsWith("/mcp/conn_")){let F=X.split("/")[2]??"";W=`/mcp/${N9.mcp}${wZ0(F.slice(0,12))}\u2026${N9.reset}`}else if(X==="/mcp")W=`${N9.mcp}/mcp${N9.reset}`;else if(X==="/mcp/registry")W=`${N9.mcp}/mcp/registry${N9.reset}`;let K=nZ5(Y),H=G?"\u25C0":"\u2190";console.log(`${N9.dim}${H}${N9.reset} ${K}${Y}${N9.reset} ${W}${J?` ${J}`:""}`);try{await Z()}finally{let F=Date.now()-Q,U=$.res.status,N=pZ5(U),B=F<1000?`${F}ms`:`${(F/1000).toFixed(1)}s`,D=G?"\u25B6":"\u2192";console.log(`${N9.dim}${D}${N9.reset} ${K}${Y}${N9.reset} ${W}${J?` ${J}`:""} ${N}${U}${N9.reset} ${N9.duration}${B}${N9.reset}`)}}}var N9,pZ5=($)=>{if($>=500)return N9.serverError;if($>=400)return N9.clientError;if($>=300)return N9.redirect;return N9.ok},nZ5=($)=>{return N9[$]||N9.reset},wZ0=($)=>{return $.replace(/\r/g,"").replace(/\n/g,"").replace(/\x1b\[[0-9;]*m/g,"").replace(/[\x00-\x1f\x7f-\x9f]/g,"")};var QN8=L(()=>{N9={reset:"\x1B[0m",dim:"\x1B[2m",bold:"\x1B[1m",GET:"\x1B[36m",POST:"\x1B[33m",PUT:"\x1B[35m",DELETE:"\x1B[31m",ok:"\x1B[32m",redirect:"\x1B[36m",clientError:"\x1B[33m",serverError:"\x1B[31m",mcp:"\x1B[35m",tool:"\x1B[96m",duration:"\x1B[90m"}});import{createHmac as GN8}from"crypto";import{mkdir as tZ5,readdir as oZ5,rm as YN8,stat as WN8}from"fs/promises";import{join as qP1,relative as sZ5}from"path";import{z as Y8}from"zod";function HN8($){let Z=$.replace(/[^a-zA-Z0-9_-]/g,"_");return qP1(rZ5,Z)}function FN8($){return $.replace(/^\/+/,"").replace(/\.\./g,"")}function RP1($,Z){let Q=HN8($),Y=FN8(Z);return qP1(Q,Y)}function aZ5($,Z,Q,Y){let X=L0().encryptionKey||"dev-secret",J=`${$}:${Z}:${Q}:${Y}`;return GN8("sha256",X).update(J).digest("hex")}function JN8($,Z,Q,Y,X){let J=Math.floor(Date.now()/1000)+Y,G=aZ5(Z,Q,J,X),W=new URL(`/api/dev-assets/${Z}/${FN8(Q)}`,$);return W.searchParams.set("expires",J.toString()),W.searchParams.set("signature",G),W.searchParams.set("method",X),W.toString()}function UN8($,Z,Q){let Y=`${$}:${Z.getTime()}:${Q}`;return`"${GN8("md5","etag").update(Y).digest("hex")}"`}async function NN8($,Z,Q,Y,X){try{let J=await oZ5($,{withFileTypes:!0});for(let G of J){let W=qP1($,G.name),H=sZ5(Z,W).replace(/\\/g,"/");if(Q&&!H.startsWith(Q))continue;if(G.isDirectory())if(Y){let F=H+"/";if(!Q||F.startsWith(Q)){if(!(Q?H.slice(Q.length):H).includes("/"))X.commonPrefixes.add(F)}}else await NN8(W,Z,Q,Y,X);else if(G.isFile()){if(Y&&Q){let F=H.slice(Q.length);if(F.includes(Y)){let U=F.indexOf(Y),N=Q+F.slice(0,U+1);X.commonPrefixes.add(N);continue}}try{let F=await WN8(W);X.objects.push({key:H,size:F.size,lastModified:F.mtime.toISOString(),etag:UN8(W,F.mtime,F.size)})}catch{}}}}catch{}}function BN8($,Z){let Y=Y0($).id;return[{name:"LIST_OBJECTS",description:"List objects in the local assets directory with pagination support",inputSchema:Y8.object({prefix:Y8.string().optional(),maxKeys:Y8.number().optional().default(1000),continuationToken:Y8.string().optional(),delimiter:Y8.string().optional()}),outputSchema:Y8.object({objects:Y8.array(Y8.object({key:Y8.string(),size:Y8.number(),lastModified:Y8.string(),etag:Y8.string()})),nextContinuationToken:Y8.string().optional(),isTruncated:Y8.boolean(),commonPrefixes:Y8.array(Y8.string()).optional()}),handler:async(X)=>{let J=X,G=J.prefix||"",W=J.maxKeys??1000,K=J.delimiter,H=J.continuationToken,F=HN8(Y);await tZ5(F,{recursive:!0});let U={objects:[],commonPrefixes:new Set};await NN8(F,F,G,K,U),U.objects.sort((w,j)=>w.key.localeCompare(j.key));let N=0;if(H){if(N=U.objects.findIndex((w)=>w.key>H),N===-1)N=U.objects.length}let B=U.objects.slice(N,N+W),D=N+W<U.objects.length,O=D?B[B.length-1]?.key:void 0;return{objects:B,isTruncated:D,nextContinuationToken:O,commonPrefixes:Array.from(U.commonPrefixes).sort()}}},{name:"GET_OBJECT_METADATA",description:"Get metadata for a file in the local assets directory",inputSchema:Y8.object({key:Y8.string()}),outputSchema:Y8.object({contentType:Y8.string().optional(),contentLength:Y8.number(),lastModified:Y8.string(),etag:Y8.string(),metadata:Y8.record(Y8.string(),Y8.string()).optional()}),handler:async(X)=>{let J=X,G=RP1(Y,J.key),W=await WN8(G);return{contentType:bw1(J.key),contentLength:W.size,lastModified:W.mtime.toISOString(),etag:UN8(G,W.mtime,W.size)}}},{name:"GET_PRESIGNED_URL",description:"Generate a presigned URL for downloading a file from local storage",inputSchema:Y8.object({key:Y8.string(),expiresIn:Y8.number().optional()}),outputSchema:Y8.object({url:Y8.string(),expiresIn:Y8.number()}),handler:async(X)=>{let J=X,G=$O(J.expiresIn,XN8);return{url:JN8(Z,Y,J.key,G,"GET"),expiresIn:G}}},{name:"PUT_PRESIGNED_URL",description:"Generate a presigned URL for uploading a file to local storage",inputSchema:Y8.object({key:Y8.string(),expiresIn:Y8.number().optional(),contentType:Y8.string().optional()}),outputSchema:Y8.object({url:Y8.string(),expiresIn:Y8.number()}),handler:async(X)=>{let J=X,G=$O(J.expiresIn,XN8);return{url:JN8(Z,Y,J.key,G,"PUT"),expiresIn:G}}},{name:"DELETE_OBJECT",description:"Delete a single file from local storage",inputSchema:Y8.object({key:Y8.string()}),outputSchema:Y8.object({success:Y8.boolean(),key:Y8.string()}),handler:async(X)=>{let J=X,G=RP1(Y,J.key);try{return await YN8(G),{success:!0,key:J.key}}catch{return{success:!1,key:J.key}}}},{name:"DELETE_OBJECTS",description:"Delete multiple files from local storage",inputSchema:Y8.object({keys:Y8.array(Y8.string()).max(1000)}),outputSchema:Y8.object({deleted:Y8.array(Y8.string()),errors:Y8.array(Y8.object({key:Y8.string(),message:Y8.string()}))}),handler:async(X)=>{let J=X,G=[],W=[];return await Promise.all(J.keys.map(async(K)=>{let H=RP1(Y,K);try{await YN8(H),G.push(K)}catch(F){W.push({key:K,message:F instanceof Error?F.message:"Unknown error"})}})),{deleted:G,errors:W}}}]}async function MP1($,Z,Q){let Y=BN8(Z,Q),X=new Ej({name:"dev-assets-mcp",version:"1.0.0"},{capabilities:{tools:{}},jsonSchemaValidator:t9});for(let G of Y){let W="shape"in G.inputSchema?G.inputSchema.shape:Y8.object({}).shape,K=G.outputSchema&&"shape"in G.outputSchema?G.outputSchema.shape:Y8.object({}).shape;X.registerTool(G.name,{description:G.description??"",inputSchema:W,outputSchema:K,annotations:G.annotations,_meta:G._meta},async(H)=>{try{let F=await G.handler(H);return{content:[{type:"text",text:JSON.stringify(F)}],structuredContent:F}}catch(F){return{content:[{type:"text",text:`Error: ${F.message}`}],isError:!0}}})}let J=new $W({enableJsonResponse:$.headers.get("Accept")?.includes("application/json")??!1});return await X.connect(J),xK(X,J,$,"mcp:dev-assets")}async function DN8($,Z,Q,Y){let J=BN8(Q,Y).find((G)=>G.name===$);if(!J)return{content:[{type:"text",text:`Tool not found: ${$}`}],isError:!0};try{let G=await J.handler(Z);return{content:[{type:"text",text:JSON.stringify(G)}]}}catch(G){return{content:[{type:"text",text:G instanceof Error?G.message:String(G)}],isError:!0}}}var rZ5="./data/assets",XN8=3600,KN8,LN8;var ON8=L(()=>{r1();ip();W8();GW0();dp();aX();ZO();Bb0();KN8=new Q1;KN8.all("/",async($)=>{let Z=$.get("studioContext"),Q=new URL($.req.url),Y=`${Q.protocol}//${Q.host}`;return MP1($.req.raw,Z,Y)});LN8=KN8});var wN8={};O6(wN8,{mountDevRoutes:()=>eZ5});function eZ5($,Z){$.all("/mcp/:connectionId{.*_dev-assets$}",Z,async(Y)=>{let X=Y.get("studioContext"),J=new URL(Y.req.url),G=`${J.protocol}//${J.host}`;return MP1(Y.req.raw,X,G)}),$.all("/mcp/:connectionId{.*_dev-assets$}/call-tool/:toolName",Z,async(Y)=>{let X=Y.get("studioContext"),J=new URL(Y.req.url),G=`${J.protocol}//${J.host}`,W=Y.req.param("toolName");if(!W)return Y.json({error:"Missing tool name"},400);let K=await Y.req.json(),H=await DN8(W,K,X,G);if(H.isError)return Y.json(H.content,500);return Y.json(H.content)}),$.use("/mcp/dev-assets",Z),$.route("/mcp/dev-assets",LN8);let Q=new Q1;Q.use("*",uF({mountPath:"/api/dev-assets"})),Q.route("/",Nb0({orgFromPath:!1})),$.route("/api/dev-assets",Q)}var jN8=L(()=>{W8();Iw1();Bb0();ON8()});var VN8={};O6(VN8,{watchHandler:()=>IN8,resolveVoiceSigningSecret:()=>RN8,resolveCorsOrigin:()=>qN8,isSsoExemptPath:()=>TN8,isAllowedOAuthRedirectUri:()=>MN8,createApp:()=>F75});import{readFileSync as $75}from"fs";import{randomBytes as Z75}from"crypto";import{PrometheusSerializer as Q75}from"@opentelemetry/exporter-prometheus";import{DBOS as PB}from"@dbos-inc/dbos-sdk";import{oAuthDiscoveryMetadata as J75,oAuthProtectedResourceMetadata as G75}from"better-auth/plugins";async function Y75($){let Z=$.connect(),Q;try{Q=await Promise.race([Z,PN8(EN8)])}catch{return Z.then((Y)=>Y.release(!0)).catch(()=>{}),!1}try{return await Promise.race([Q.query("SELECT 1"),PN8(EN8)]),Q.release(),!0}catch{return Q.release(!0),!1}}function PN8($){return new Promise((Z,Q)=>setTimeout(()=>Q(Error("pg health-check timeout")),$))}function TN8($){return $.startsWith("/api/org-sso/")||/^\/api\/[^/]+\/sso\//.test($)||$.startsWith("/api/auth/")||$.startsWith("/api/tools/management")||$.startsWith("/oauth-proxy/")||/^\/api\/[^/]+\/oauth-proxy\//.test($)||$.startsWith(`${rv0}/`)||$.startsWith(`${iv0}/`)}function RN8($){let Z=$.studioJwtSecret||$.betterAuthSecret;if(Z)return Z;return console.warn("STUDIO_JWT_SECRET/BETTER_AUTH_SECRET not set - generating a random secret for voice sessions (not persistent across restarts)"),Z75(32).toString("base64")}function qN8($,{baseUrl:Z,requestOrigin:Q}){let Y;try{Y=new URL($).hostname}catch{return null}if(Y==="localhost"||Y==="127.0.0.1")return $;let X=Z??Q;try{if(new URL(X).origin===$)return $}catch{}return null}function MN8($,Z){return $.origin===new URL(Z).origin||$.hostname==="localhost"}async function F75($={}){let Z=$.database??z8(),Q=!1;g6.stop().catch((H0)=>{console.error("[SSEHub] Error stopping previous broadcast (HMR cleanup):",H0)});let Y,X,J,G,W=new UP1,K,H,F,U=null;if($.disableNats)K=NP1(),Y={get:async()=>null,set:async()=>{},invalidate:async()=>{},teardown:()=>{}},X=null,J=null,G=new c60,H={start:async()=>{},broadcast:()=>{},stop:async()=>{}},F={init:async()=>{},pump:(H0)=>{return(async()=>{let J0=H0.getReader();try{while(!0){let{done:P0}=await J0.read();if(P0)break}}catch{}finally{J0.releaseLock()}})()},publishRawChunk:async()=>!1,publishDone:async()=>!1,createTailStream:async()=>null,purge:()=>{},teardown:()=>{}};else{U=AU8();let H0=L0().natsCredsPath,J0;if(H0)try{J0=$75(H0,"utf8")}catch(U8){console.error(`[app] failed to read NATS_CREDS at ${H0}; connecting anonymously`,U8)}U.init(L0().natsUrls,{creds:J0,user:L0().natsUser,password:L0().natsPassword});let P0=v61()?new w61({getJetStream:()=>U.getJetStream(),selfListVersion:Ex0.version}):null;P0?.init().catch(()=>{}),Y=P0;let z0=new Y51({getJetStream:()=>U.getJetStream()});z0.init().catch(()=>{}),X=z0;let w1=new Ug(dG1,{getJetStream:()=>U.getJetStream()}),b$=new Ug(c40,{getJetStream:()=>U.getJetStream()});w1.init().catch(()=>{}),b$.init().catch(()=>{}),J={reads:w1,cards:b$};let o$=new FH1({getJetStream:()=>U.getJetStream()});o$.init().catch(()=>{}),G=o$,K=NP1({getConnection:()=>U.getConnection()}),H=new BP1({getConnection:()=>U.getConnection()}),F=new OP1({getConnection:()=>U.getConnection(),getJetStream:()=>U.getJetStream()}),oY8(U),U.onReady(()=>{P0?.init().catch((U8)=>{console.error("[McpListCache] Deferred init failed:",U8)}),z0.init().catch((U8)=>{console.error("[SkillCatalogCache] Deferred init failed:",U8)}),w1.init().catch((U8)=>{console.error("[PrReadCache] Deferred init failed:",U8)}),b$.init().catch((U8)=>{console.error("[PrCardCache] Deferred init failed:",U8)}),o$.init().catch((U8)=>{console.error("[ConnectionCircuitStore] Deferred init failed:",U8)}),K.start(),$j$(()=>U.getConnection()),F.init().catch((U8)=>{console.warn("[Decopilot] StreamBuffer init failed (late-join disabled):",U8)})})}if(zz)await zz();j61(Y),J51(X),W51(()=>U?.getConnection()??null),iG1(J),UH1(G);let B={storage:new Sl(Z.db),sseHub:g6,onThreadFinished:async(H0,J0)=>zp(new p3(Z.db),H0,J0,new U3(Z.db))},D=new i31(B),O=new O90(Z.db),w=new wP1(O);w.start(),Dd$(H),H.start((H0)=>{cV0(H0),D.execute({type:"CANCEL",taskId:H0}).catch((J0)=>{console.error("[Decopilot] CancelBroadcast execute failed:",J0)})}).catch((H0)=>{console.error("[Decopilot] CancelBroadcast start failed:",H0)}),U?.onReady(()=>{H.start().catch((H0)=>{console.error("[CancelBroadcast] Deferred start failed:",H0)})});let j=()=>U?.getConnection()??null;zw1(j),U?.onReady(()=>zw1(j)),iH1(j),U?.onReady(()=>iH1(j)),F.init().catch((H0)=>{console.warn("[Decopilot] StreamBuffer init failed, attach/late-join disabled:",H0)}),zz=async()=>{await D.stopAll(),D.dispose(),w.dispose(),H.stop().catch(()=>{}),NJ8(),F.teardown(),Y?.teardown(),X?.teardown(),J?.reads.teardown(),J?.cards.teardown(),W.teardown(),K.teardown(),Zj$(),G.teardown(),j61(null),J51(null),W51(null),iG1(null),UH1(null)};let E=new Q1;if(E.use("*",WH1({enabled:(H0)=>an(H0,"debug")==="1"})),E.use("*",ax0),E.use("/*",dY8({origin:(H0,J0)=>qN8(H0,{baseUrl:L0().baseUrl,requestOrigin:new URL(J0.req.url).origin}),credentials:!0,allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization","mcp-protocol-version"],exposeHeaders:["WWW-Authenticate"]})),E.use("*",async(H0,J0)=>{if(await J0(),H0.req.path.includes("/files/"))return;if(H0.req.path.includes("/fs/")&&H0.req.path.endsWith("/read"))return;H0.header("X-Frame-Options","DENY"),H0.header("Content-Security-Policy","frame-ancestors 'none'")}),L0().nodeEnv==="development")E.use("*",ZN8());E.use("*",async(H0,J0)=>{if(await J0(),dt(H0.req.path))return;if(H0.res.status>=500){let z0=await H0.res.clone().text();console.error(`[5xx Response] ${H0.req.method} ${H0.req.path} - ${H0.res.status}:`,z0)}}),E.get(CX.HEALTH,(H0)=>{if(Q)return H0.json({status:"shutting_down"},503);return H0.json({status:"ok"})}),E.get(CX.HEALTH_LIVE,(H0)=>{return H0.json({status:"ok"})}),E.get(CX.HEALTH_READY,async(H0)=>{if(Q)return H0.json({status:"shutting_down"},503);let J0={};if(J0.postgres={status:await Y75(Z.pool)?"up":"down"},U)J0.nats=U.isConnected()?{status:"up"}:{status:"down"};else J0.nats={status:"down"};let P0=J0.postgres.status==="up",z0=P0?200:503;return H0.json({status:P0?"ready":"not_ready",services:J0},z0)}),E.get(CX.METRICS,async(H0)=>{try{let J0=await Qf0.collect(),P0=X75.serialize(J0.resourceMetrics);return H0.text(P0,200,{"Content-Type":"text/plain; version=0.0.4; charset=utf-8"})}catch(J0){return console.error("Failed to collect metrics:",J0),H0.text("# Error collecting metrics",500)}});let P=1800000;E.get(`${CX.DBOS_QUEUE_DEPTH_PREFIX}:queueName`,async(H0)=>{let J0=H0.req.param("queueName");if(!W75.has(J0))return H0.json({error:`Unknown queue: ${J0}`},404);let[P0,z0]=await Promise.all([PB.listQueuedWorkflows({queueName:J0,status:"ENQUEUED",loadInput:!1,loadOutput:!1}),PB.listQueuedWorkflows({queueName:J0,status:"PENDING",loadInput:!1,loadOutput:!1,dequeuedAfter:new Date(Date.now()-P).toISOString()})]);return H0.json({queue_length:P0.length,in_flight:z0.length})}),E.route("/api/config",_F8),E.route("/api/_reports",cF8),E.route("/api/_stripe",aE1),E.route("/api/_github",iF8({taskBoard:()=>i,contextFactory:()=>y})),E.route("/api/_git",Gt);let T={db:Z.db,encryptionKey:L0().encryptionKey};E.route("/api/_jira",QU8(T)),E.route("/api/_jira",oF8(T)),E.route("/report",hF8($.clientDir)),E.route("/api/auth/custom",LX8),E.all("/api/auth/admin/*",eX8),E.all("/api/auth/*",async(H0)=>{return await B4.handler(H0.req.raw)});let z=jQ8();z.use("/.well-known/oauth-protected-resource/mcp/:connectionId",I90),z.use("/mcp/:connectionId/.well-known/oauth-protected-resource",I90),E.route("/",z),E.get("/.well-known/oauth-protected-resource/api/:org/mcp/:connectionId",B90),E.route("/",TQ8()),E.use("/oauth-proxy/:connectionId/*",I90),E.all("/oauth-proxy/:connectionId/*",zN8);let A=async(H0)=>{let P0=await K75()(H0.req.raw),z0=await P0.json();return Response.json(z0,P0)};E.use("/mcp/:gateway?/:connectionId/.well-known/oauth-protected-resource/*",I90),E.get("/mcp/:gateway?/:connectionId/.well-known/oauth-protected-resource/*",A);let q=async(H0)=>{let P0=await H75()(H0.req.raw),z0=await P0.json();return Response.json(z0,P0)};E.get("/.well-known/oauth-authorization-server/*/:gateway?/:connectionId?",q);let x=pY8({ttlMs:120000}),_=await wY8({db:Z.db,auth:B4,encryption:{key:L0().encryptionKey},observability:{tracer:CO,meter:J$},modelListCache:W,providerKeyCache:K,memberRoleCache:x});NY.set(_),qr1({db:Z.db,baseUrl:N5()}),jY8({db:Z.db}),AY8({db:Z.db}),SY8({db:Z.db}),eF8({db:Z.db,encryptionKey:L0().encryptionKey}),Ah$({db:Z.db}),fY8({db:Z.db}),eh$({db:Z.db});let V=kc(Z.db),g=new Ma(Z.db),y=eU8({db:Z.db});QK1({storage:V,studioContextFactory:y,orgContextFactory:(H0)=>n3(Z.db,H0),systemDatabaseUrl:fe(L0().databaseUrl,L0().databasePgSsl)}),hW1({systemDatabaseUrl:fe(L0().databaseUrl,L0().databasePgSsl),studioContextFactory:y,deps:{runRegistry:D,cancelBroadcast:H,streamBuffer:F,sseHub:g6}}),_W1({dispatchRunFn:Tm$,studioContextFactory:y,deps:{runRegistry:D,cancelBroadcast:H,streamBuffer:F,sseHub:g6}});let u=new Sl(Z.db),i=new p3(Z.db),n=new U3(Z.db),U0=new EP1(i,y,n);if(L0().taskBoardReviewSweeperEnabled){U0.start();let H0=zz;zz=async()=>{await H0?.(),U0.dispose()}}dU8({automations:V,taskBoard:i,fire:MK,systemDatabaseUrl:fe(L0().databaseUrl,L0().databasePgSsl),settleMs:L0().boardTransitionSettleSeconds*1000}),Ch$(pU8),dm$({getJetStream:()=>U?.getJetStream()??null,getJetStreamManager:async()=>{let H0=U?.getConnection();return H0?await AN8.jetstreamManager(H0):null},messageParts:u.messageParts(),resolveRun:async(H0)=>{let J0=await Z.db.selectFrom("threads").select(["organization_id","created_by","message_storage_version","status","run_fence_token","title"]).where("id","=",H0).executeTakeFirst();return J0?{orgId:J0.organization_id,createdBy:J0.created_by,version:J0.message_storage_version??1,status:J0.status,runFenceToken:J0.run_fence_token,title:J0.title??null}:null},completeRunIfNotCompleted:async(H0,J0)=>{let P0=await u.completeRunIfNotCompleted(H0,J0);if(Ix0(g6,J0,H0,P0),P0)await zp(i,H0,J0,n);return P0},markRunRequiresAction:async(H0,J0)=>{let P0=await u.requiresActionIfInProgress(H0,J0);return Ix0(g6,J0,H0,P0),P0},markRunFailed:async(H0,J0,P0,z0)=>{let w1=await u.markRunFailed(H0,J0,P0,z0);if(Ix0(g6,J0,H0,w1),w1)await zp(i,H0,J0,n);return w1},clearSynthesizedError:async(H0,J0)=>{await u.messageParts().replaceMessageParts(H0,qP(H0,J0),[])},persistTitle:(H0,J0,P0)=>u.update(H0,J0,{title:P0}),onTitleUpdated:async({runId:H0,orgId:J0,title:P0})=>{let z0=await u.get(H0,J0).catch(()=>null);g6.emit(J0,FU(H0,z0?.status??"in_progress",{title:P0,virtualMcpId:z0?.virtual_mcp_id??void 0,createdBy:z0?.created_by,triggerId:z0?.trigger_id,branch:z0?.branch??null,harnessId:z0?.harness_id??void 0,createdAt:z0?.created_at,updatedAt:z0?.updated_at}))},bumpProgress:async({runId:H0,orgId:J0})=>{await u.bumpProgress(H0,J0)},recordCompleted:async({runId:H0,orgId:J0,distinctId:P0,usage:z0})=>{l1.capture({distinctId:P0,event:"chat_message_completed",groups:{organization:J0},properties:{organization_id:J0,thread_id:H0,transport:"projector",input_tokens:z0.inputTokens,output_tokens:z0.outputTokens,total_tokens:z0.totalTokens}})},recordFailed:async({runId:H0,orgId:J0,distinctId:P0,reason:z0,kind:w1})=>{l1.capture({distinctId:P0,event:"chat_message_failed",groups:{organization:J0},properties:{organization_id:J0,thread_id:H0,transport:"projector",error_category:w1,error_message:z0}})},purgeRun:async(H0)=>{F.purge(H0)}}),ic$({studioContextFactory:y,systemDatabaseUrl:fe(L0().databaseUrl,L0().databasePgSsl),streamBuffer:F}),rU8(),Mr1(),PY8(),RY8(),_Y8(),ZU8(),nU8(),Ih$(),gY8(),$u$(),nF8();let b0=async(H0,J0,P0)=>{let z0=await V.findById(H0,J0);if(!z0)throw Error("Automation not found");return WK1({automationId:z0.id,organizationId:z0.organization_id,triggerId:null})},G0=new Xt(V,({automation:H0,trigger:J0,contextMessages:P0,idempotencyKey:z0})=>MK({automationId:H0.id,organizationId:H0.organization_id,triggerId:J0.id,contextMessages:P0},{idempotencyKey:z0})),N0=[$H(),lh(),IB()];for(let H0 of N0)Sx0(H0).then(()=>{}).catch((J0)=>console.error("[monitoring] Retention cleanup failed:",J0));let o=()=>B4.api.deleteAllExpiredApiKeys().catch((H0)=>console.error("[auth] Expired API key cleanup failed:",H0));o(),setInterval(o,86400000).unref(),E.use("*",async(H0,J0)=>{if(sx0(H0.req.path))return J0();let P0={measure:async(w1,b$)=>{bK(H0,w1);try{return await b$()}finally{ZW(H0,w1)}}},z0=await NY.create(H0.req.raw,{timings:P0});z0.automationRunner=b0,H0.set("studioContext",z0);try{await J0()}finally{let w1=z0.pendingRevalidations;if(w1.length>0)Promise.race([Promise.allSettled(w1),D$(30000)]).catch((o$)=>console.error("[studio] revalidation cleanup error:",o$))}}),E.use("/api/:org/decopilot/*",$t),E.use("/api/:org/v1/*",$t),E.use("/api/:org/files/*",$t),E.use("*",async(H0,J0)=>{if(TN8(H0.req.path))return J0();let P0=H0.get("studioContext");if(!P0?.organization?.id||!P0?.auth?.user?.id)return J0();if(!(await P0.storage.orgSsoConfig.getByOrgId(P0.organization.id))?.enforced)return J0();if(!await P0.storage.orgSsoSessions.isValid(P0.auth.user.id,P0.organization.id))return H0.json({error:"SSO authentication required for this organization"},403);return J0()});let e=new Q1;e.use("*",uF({mountPath:"/api/org-sso"})),e.route("/",$b0()),E.route("/api/org-sso",e),E.get("/api/tools/management",(H0)=>{return H0.json({tools:Ca,grouped:DA()})}),E.use("/mcp/*",async(H0,J0)=>{bK(H0,"mcp");try{return await J0()}finally{ZW(H0,"mcp")}});let Q0=async(H0,J0)=>{let P0=H0.var.studioContext;if(!P0.auth.user?.id&&!P0.auth.apiKey?.id){let z0=new URL(H0.req.url),w1=H0.req.header("x-forwarded-proto")?.split(",")[0]?.trim(),b$=w1?`${w1}://${z0.host}`:z0.origin;return H0.res=new Response(null,{status:401,headers:{"WWW-Authenticate":`Bearer realm="mcp",resource_metadata="${b$}${z0.pathname}/.well-known/oauth-protected-resource"`}})}return await J0()};if(E.use("/mcp/:connectionId?",Q0),E.use("/mcp/gateway/:virtualMcpId?",Q0),E.use("/mcp/virtual-mcp/:virtualMcpId?",Q0),E.use("/mcp/self",Q0),KK()){let{mountDevRoutes:H0}=(jN8(),gx0(wN8));H0(E,Q0)}let $0=new Q1;$0.use("*",uF({mountPath:"/mcp"})),$0.route("/",yk0()),E.route("/mcp",$0);let X0=new Q1;X0.use("*",uF({mountPath:"/mcp/self"})),X0.route("/",db0()),E.route("/mcp/self",X0);let h0=new Q1;h0.use("*",uF({mountPath:"/mcp"})),h0.route("/",uk0()),E.route("/mcp",h0),E.use("/api/:org/models/*",async(H0,J0)=>{bK(H0,"llm_models");try{return await J0()}finally{ZW(H0,"llm_models")}});let k0=jJ8({cancelBroadcast:H,streamBuffer:F,runRegistry:D});E.route("/api",k0),E.route("/api",GU8);let K1=new Q1;K1.use("*",uF({mountPath:"/api"})),K1.route("/",tb0()),E.route("/api",K1),E.route("/api",IF8);let c0=new Q1;c0.use("*",uF({mountPath:"/api"})),c0.route("/",ob0({tokenStorage:g,automationEventDispatcher:G0})),E.route("/api",c0);let w0=new Ia(Z.db),E0=new Q1;E0.use("*",uF({mountPath:"/api"})),E0.route("/",Gb0()),E.route("/api",E0),E.route("/api/deco-sites",vJ8()),E.route("/api/deco-apps",zF8());let n0=new Q1;n0.use("*",uF({mountPath:"/api/deco-sites"})),n0.route("/",Kb0()),E.route("/api/deco-sites",n0),E.route(rv0,$J8()),E.route(HK8,NK8()),E.route("/api/_editor-resolve",kF8()),E.route(jX8,EX8()),E.route(iv0,bX8());let O1=L0(),o0=O1.elevenlabsApiKey?new Ox0({apiKey:O1.elevenlabsApiKey,model:O1.elevenlabsVoiceModel,conversationModel:O1.elevenlabsConversationModel,voiceId:O1.elevenlabsVoiceId}):null,v0={openai:O1.openaiLiveApiKey?new dE1({apiKey:O1.openaiLiveApiKey,voice:O1.openaiLiveVoice}):null,elevenlabs:o0?new mE1(o0,()=>U?.getConnection()??null):null},d0=new oE1({adapter:o0,conversationAdapters:v0,defaults:O1,secret:RN8(O1),getConnection:()=>U?.getConnection()??null}),i0=eH8({voiceSessions:d0,kvStorage:w0,runRegistry:D,streamBuffer:F,sseHub:g6,cancelBroadcast:H,tokenStorage:g,automationEventDispatcher:G0,mountDevAssets:KK(),mcpAuth:Q0,oauthProxyHandler:zN8,watchHandler:IN8,betterAuthProtectedResourceHandler:A,getNatsConnection:()=>U?.getConnection()??null});return E.route("/api/:org",i0),E.notFound((H0)=>{return H0.json({error:"Not Found",path:H0.req.path},404)}),E.onError(PJ8),Object.assign(E,{markShuttingDown:()=>{Q=!0},shutdown:async()=>{if(console.log("[shutdown] Stopping workers..."),await Promise.allSettled([g6.stop(),zz?Promise.resolve(zz()).finally(()=>{zz=null}):Promise.resolve()]),U)await U.drain().catch((H0)=>console.error("[shutdown] NATS drain error:",H0));console.log("[shutdown] Flushing telemetry..."),await xJ().catch((H0)=>console.error("[shutdown] Telemetry flush error:",H0)),console.log("[shutdown] Closing database..."),await CJ$(Z).catch((H0)=>console.error("[shutdown] Database close error:",H0)),console.log("[shutdown] Cleanup complete.")},initDbos:async()=>{await PB.registerQueue(iG,{partitionQueue:!0,concurrency:eW1,minPollingIntervalMs:$K1}),await PB.registerQueue(OW,{partitionQueue:!0,concurrency:yW1,priorityEnabled:!0}),await PB.registerQueue(qB,{workerConcurrency:L0().decopilotMaxConcurrentHostedRuns,priorityEnabled:!0}),await PB.registerQueue(MB,{workerConcurrency:L0().sandboxMaxConcurrentHostedRuns,priorityEnabled:!0}),await PB.registerQueue(SO,{partitionQueue:!0,concurrency:dc$}),await PB.registerQueue(Mz,ah$),await PB.registerQueue(Iz),await Vw1(V),await Promise.allSettled(["automations-gate","automations-global","jira-push"].map((H0)=>PB.deleteQueue(H0))),await ZK1(Z.pool),HK$().catch((H0)=>{console.error("[studio-pack-backfill] failed:",H0)}),Am(Z.db).catch((H0)=>{console.error("[automations] built-in seed failed:",H0)}),Ir1().catch((H0)=>{console.error("[org-fs] public-sets boot sync kick failed:",H0)})}})}var AN8,EN8=5000,zz=null,zN8=async($)=>{let Z=$.req.param("connectionId");if(!Z)return $.json({error:"Missing connectionId"},400);let Q=$.req.path.split("/").filter(Boolean),Y=Q[Q.length-1],X=$.get("studioContext");if(!X)X=await NY.create($.req.raw),$.set("studioContext",X);let J=$.req.param("org")?X.organization?.id:void 0,G=await X.storage.connections.findById(Z,J);if(!G?.connection_url)return $.json({error:"Connection not found"},404);if(Y==="register"&&G.oauth_config?.clientId){let g=await $.req.json().catch(()=>({}));return $.json({...typeof g==="object"&&g!==null?g:{},client_id:G.oauth_config.clientId,...G.oauth_config.clientSecret?{client_secret:G.oauth_config.clientSecret}:{},client_secret_expires_at:0})}let W=await on(G.connection_url),K,H=new URL(G.connection_url),U=(typeof G.metadata?.oauthResource==="string"&&G.metadata.oauthResource.length>0?G.metadata.oauthResource:void 0)??G.connection_url;if(W.ok)K=YO1(await W.json());if(!K)K=H.origin;let N=await D90(K);if(!N.ok)return $.json({error:"Failed to get auth server metadata"},502);let B=await N.json(),D;if(Y==="authorize")D=B.authorization_endpoint;else if(Y==="token")D=B.token_endpoint;else if(Y==="register")D=B.registration_endpoint;if(!D)return $.json({error:`Unknown OAuth endpoint: ${Y}`},404);let O=AQ8(D);if(O)return O;let w=new URL(D),j=new URL($.req.url);if(w.search=j.search,Y==="authorize"){let g=w.searchParams.get("redirect_uri");if(g){let y=L0().baseUrl??j.origin;try{if(!MN8(new URL(g),y))return $.json({error:"invalid_request",error_description:"redirect_uri is not allowed"},400)}catch{return $.json({error:"invalid_request",error_description:"redirect_uri is malformed"},400)}w.searchParams.set("redirect_uri",g)}if(w.searchParams.has("resource"))w.searchParams.set("resource",U);if(uY8(G.connection_url))w.searchParams.set("auto_personal","true"),w.searchParams.set("force_new","true");return $.redirect(w.toString(),302)}let E={Accept:$.req.header("Accept")||"application/json"},P=$.req.header("Content-Type");if(P)E["Content-Type"]=P;let T=$.req.header("Authorization");if(T)E.Authorization=T;let z,A=null,q=null;if($.req.method!=="GET"&&$.req.method!=="HEAD")if(Y==="token"&&P?.includes("application/x-www-form-urlencoded")){if(T?.toLowerCase().startsWith("basic "))try{let n=atob(T.slice(6).trim()),U0=n.indexOf(":");if(U0!==-1){let b0=decodeURIComponent(n.slice(0,U0)),G0=decodeURIComponent(n.slice(U0+1));A=b0||null,q=G0||null}}catch{}let g=await $.req.formData();if(g.has("resource"))g.set("resource",U);let y=g.get("client_id"),u=g.get("client_secret");if(typeof y==="string"&&y)A=y;if(typeof u==="string"&&u)q=u;let i=new URLSearchParams;for(let[n,U0]of g.entries())i.append(n,U0.toString());z=i.toString()}else if(Y==="register"&&P?.toLowerCase().includes("application/json")){let g=await X.db.selectFrom("organization").select(["id","slug","name"]).where("id","=",G.organization_id).executeTakeFirst(),y=await $.req.text(),u={};try{u=y?JSON.parse(y):{}}catch{z=y}let i=typeof u==="object"&&u!==null&&!Array.isArray(u);if(z===void 0&&!i)z=y;if(z===void 0){let n=u,U0=n.metadata&&typeof n.metadata==="object"?n.metadata:{};n.metadata={...U0,organization_id:G.organization_id,...g?.slug?{organization_slug:g.slug}:{},...g?.name?{organization_name:g.name}:{}},z=JSON.stringify(n),E["Content-Type"]="application/json"}}else z=$.req.raw.body??void 0;let x=await fetch(w.toString(),{method:$.req.method,headers:E,body:z,duplex:"half",redirect:"manual"}),_=new Headers,V=["connection","keep-alive","transfer-encoding","content-encoding","content-length"];for(let[g,y]of x.headers.entries())if(!V.includes(g.toLowerCase()))_.set(g,y);if(Y==="token"&&x.ok){let g=await x.text();try{let y=JSON.parse(g);if(typeof y.access_token==="string"&&y.access_token){let u=typeof y.expires_in==="number"?new Date(Date.now()+y.expires_in*1000):null,i=null;try{i=await Kz(G.connection_url)??D}catch{i=D}let n={connectionId:Z,accessToken:y.access_token,refreshToken:typeof y.refresh_token==="string"?y.refresh_token:null,scope:typeof y.scope==="string"?y.scope:null,expiresAt:u,clientId:A,clientSecret:q,tokenEndpoint:i};await new o5(X.db,X.vault).upsert(n)}}catch(y){console.error("[oauth-proxy] failed to persist downstream token:",y)}return new Response(g,{status:x.status,statusText:x.statusText,headers:_})}return new Response(x.body,{status:x.status,statusText:x.statusText,headers:_})},IN8=async($)=>{let Z=$.var.studioContext,Q=Z.auth.user?.id??Z.auth.apiKey?.userId;if(!Q)return $.json({error:"Unauthorized"},401);let Y=Z.organization?.id;if(!Y)return $.json({error:"organization id missing"},400);let X=$.req.query("types"),J=X?X.split(",").map((H)=>H.trim()).filter(Boolean):null,G=$.req.query("scope")==="all";if(G&&(!mN(Y)||!await dN(Z)))return $.json({error:"forbidden"},403);let W=G?gI0:Y;if(G)bL({action:"watch_all_orgs",actorUserId:Q,actorOrgId:Y,targetOrgId:"all"});let K=crypto.randomUUID();return jO($,async(H)=>{if(await H.writeSSE({event:"connected",data:JSON.stringify({listenerId:K,organizationId:Y,typePatterns:J,connectedAt:new Date().toISOString()})}),!g6.add({id:K,organizationId:W,typePatterns:J?.length?J:null,push:(N,B)=>{H.writeSSE({id:N.id,event:N.type,data:JSON.stringify(G?{...N,organizationId:B}:N)}).catch(()=>{g6.remove(W,K)})}})){await H.writeSSE({event:"error",data:JSON.stringify({error:"Too many connections",message:"SSE connection limit reached. Try again later."})});return}let U=setInterval(()=>{H.writeSSE({event:"keepalive",data:""}).catch(()=>{clearInterval(U),g6.remove(W,K)})},30000);await new Promise((N)=>{H.onAbort(()=>{clearInterval(U),g6.remove(W,K),N()})})})},X75,W75,K75=()=>G75(B4),H75=()=>J75(B4);var kN8=L(()=>{r$();r1();Vr1();zY8();qY8();vY8();o60();RG1();hY8();l40();w9();Sd();R8();W8();lv0();iY8();KH1();NK();wN();sO1();N3();v6();Q6();Yw1();PX8();xX8();Kw1();ZJ8();ww1();qw1();Mw1();HK();L90();Iw1();zJ8();mv0();$F8();JF8();GF8();FF8();PF8();Cw1();AF8();gk0();m60();VF8();lk0();KE1();SF8();GE1();vF8();uF8();mF8();dF8();pF8();tF8();sF8();YU8();HP1();fw1();WU8();WE1();QE1();_Z0();TU8();sE1();FJ();NU0();H$0();nG1();Y$0();J$0();BH1();RU8();MU8();Aw1();vU8();CV0();bU8();Kr();Sa();vL();a5();jO1();hU8();tU8();_U();Hg();aU8();vK0();AP1();jW();kw1();_L();SW1();vK0();rV0();oG0();Yr0();$N8();Wj();QN8();Tt();sO1();Dp();_p();mV0();AN8=C(KH(),1);X75=new Q75,W75=new Set([iG,OW,qB,MB,SO,Mz])});var vN8={};O6(vN8,{resolveClientDir:()=>w75,resolveAssetPathWithTraversalCheck:()=>_N8,isPathWithinDirectory:()=>CN8,createAssetHandler:()=>j75});import{resolve as jZ0,dirname as U75,join as N75,extname as B75,basename as D75,sep as SN8}from"path";function L75($,Z){if($===Z||D75($)==="index.html")return{"Cache-Control":"no-cache"};if($.includes(`${SN8}assets${SN8}`))return{"Cache-Control":"public, max-age=31536000, immutable"};return{}}function CN8($,Z){let Q=jZ0(Z),Y=jZ0($);return Y===Q||Y.startsWith(Q+"/")}function _N8({requestPath:$,clientDir:Z}){let Q=$.startsWith("/")?$.slice(1):$,Y=jZ0(Z,Q);if(!CN8(Y,Z))return null;return Y}function w75($,Z="../client"){let Q=new URL($),Y=U75(Q.pathname);return jZ0(Y,Z)}function j75($={}){let{env:Z="production",clientDir:Q=O75,isServerPath:Y=()=>!1}=$;if(Z==="development")return async function(J){return null};return async function(J){if(J.method!=="GET")return null;let G=new URL(J.url),W;try{W=decodeURIComponent(G.pathname)}catch{return null}if(Y(W))return null;let K=_N8({requestPath:W,clientDir:Q});if(!K)return null;let H=N75(K,"index.html"),F=jZ0(Q,"index.html"),U=J.headers.get("accept"),B=U?.includes("text/html")||U?.includes("*/*")&&["",".html"].includes(B75(K))?[H,F]:[];for(let D of[K,...B])try{let O=Bun.file(D);if(await O.exists())return new Response(O,{headers:L75(D,F)})}catch{}if(W.includes("/assets/"))return new Response("Not Found",{status:404,headers:{"Cache-Control":"no-store"}});return null}}var O75="./dist/client";var bN8=()=>{};var xN8={};O6(xN8,{tryUpgradePreviewWs:()=>q75,tryHandlePreviewHttp:()=>R75,previewWebSocketHandler:()=>M75,parsePreviewBaseDomain:()=>T75,isPreviewWsData:()=>Cx0,extractHandleFromHost:()=>IP1});function z75($){if($.method!=="GET")return!1;return($.headers.get("accept")??"").includes("text/html")}function A75(){return new Response(P75,{status:503,headers:{"content-type":"text/html; charset=utf-8","cache-control":"no-store","retry-after":"1","access-control-allow-origin":"*"}})}function T75($){if(!$||$.trim()==="")return null;let Z=$.includes("{handle}")?$.replace("{handle}","__handle__"):$,Q;try{Q=new URL(Z)}catch{return null}let Y=Q.hostname;if($.includes("{handle}")){let X=Y.indexOf(".");if(X<=0||X===Y.length-1)return null;return Y.slice(X+1)}return Y}function IP1($,Z){if(!$||!Z)return null;let Q=$.indexOf(":"),Y=(Q>=0?$.slice(0,Q):$).toLowerCase(),J=`.${Z.toLowerCase().replace(/^\.+|\.+$/g,"")}`;if(!Y.endsWith(J))return null;let G=Y.slice(0,Y.length-J.length);if(!G||G.includes("."))return null;return G}async function R75($,Z){let Q=IP1($.headers.get("host"),Z.baseDomain);if(!Q)return null;let Y=await Z.getRunner();if(!Y)return PZ0(503,"preview proxy not configured");let X=await Y.proxyPreviewRequest(Q,$);if(X.headers.get(Ti)&&z75($))return A75();return X.headers.delete(Ti),X}function PZ0($,Z){return new Response(JSON.stringify({error:Z}),{status:$,headers:{"content-type":"application/json","access-control-allow-origin":"*"}})}function Cx0($){return typeof $==="object"&&$!==null&&$.kind==="preview"}async function q75($,Z,Q){if(($.headers.get("upgrade")??"").toLowerCase()!=="websocket")return null;let Y=IP1($.headers.get("host"),Q.baseDomain);if(!Y)return null;let X=await Q.getRunner();if(!X)return PZ0(503,"preview proxy not configured");let J=await X.resolvePreviewUpstreamUrl(Y);if(!J)return PZ0(404,"sandbox not found");let G=new URL($.url);if(G.pathname.startsWith("/_sandbox"))return PZ0(404,"not found");let W=`${J.replace(/^http/,"ws")}${G.pathname}${G.search}`,K=$.headers.get("sec-websocket-protocol"),H=K?K.split(",").map((N)=>N.trim()).filter(Boolean):[],F={kind:"preview",upstreamUrl:W,upstreamProtocols:H,pending:[],upstream:null,closed:!1};if(!Z.upgrade($,{data:F}))return PZ0(426,"upgrade failed");return}function EZ0($,Z,Q,Y){if(Z.closed)return;Z.closed=!0;try{$.close(Q,Y)}catch{}try{Z.upstream?.close()}catch{}}var E75=256,P75='<!DOCTYPE html><html><head><meta charset="utf-8"><title>Connecting\u2026</title><style>body{font-family:system-ui,sans-serif;display:flex;align-items:center;justify-content:center;min-height:100vh;margin:0;background:#fafafa;color:#555}div{text-align:center;max-width:420px;padding:24px}h3{margin:0 0 8px}p{margin:0;font-size:14px;color:#999;line-height:1.5}</style></head><body><div><h3>Connecting to sandbox\u2026</h3><p>Waiting for the sandbox to come online. This page refreshes automatically.</p></div><script>setTimeout(function(){window.location.reload()},1500)</script></body></html>',M75;var fN8=L(()=>{q80();M75={open($){let Z=$.data;if(!Cx0(Z))return;let Q;try{Q=Z.upstreamProtocols.length>0?new WebSocket(Z.upstreamUrl,Z.upstreamProtocols):new WebSocket(Z.upstreamUrl)}catch(Y){console.warn(`[preview-ws] failed to dial upstream ${Z.upstreamUrl}: ${Y instanceof Error?Y.message:String(Y)}`),EZ0($,Z,1011,"upstream connect failed");return}Q.binaryType="arraybuffer",Z.upstream=Q,Q.addEventListener("open",()=>{while(Z.pending.length>0){let Y=Z.pending.shift();if(Y!==void 0)Q.send(Y)}}),Q.addEventListener("message",(Y)=>{if(Z.closed)return;$.send(Y.data)}),Q.addEventListener("close",(Y)=>{EZ0($,Z,Y.code||1000,Y.reason||"")}),Q.addEventListener("error",()=>{EZ0($,Z,1011,"upstream error")})},message($,Z){let Q=$.data;if(!Cx0(Q))return;let Y=Q.upstream;if(Y&&Y.readyState===WebSocket.OPEN){Y.send(Z);return}if(Q.pending.length>=E75){EZ0($,Q,1011,"preview ws backlog overflow");return}Q.pending.push(Z)},close($){let Z=$.data;if(!Cx0(Z))return;EZ0($,Z,1000,"")}}});r$();var uP1="13";function lP1($){return{name:"decocms",systemDatabaseUrl:$.systemDatabaseUrl,systemDatabaseSchemaName:"dbos",systemDatabasePoolSize:$.poolSize,runAdminServer:!1,executorID:$.executorID,applicationVersion:uP1,...$.listenQueues!==void 0?{listenQueues:$.listenQueues}:{}}}r$();import $B8 from"pg";var cP1=8314027461559302n,ZB8=600000,QB8=500;async function mP1($,Z){let{databaseUrl:Q,lockTimeoutMs:Y=ZB8}=$,X=$.log??((K)=>console.log(K)),J=new $B8.Client({connectionString:Q});await J.connect();let G=Date.now(),W=!1;try{while(!W){if(W=(await J.query("SELECT pg_try_advisory_lock($1) AS locked",[cP1.toString()])).rows[0]?.locked===!0,W)break;if(Date.now()-G>=Y)throw Error(`Timed out after ${Y}ms waiting for the DBOS migration lock. Another process is still migrating the dbos schema; this pod will restart and retry.`);await D$(QB8)}let K=Date.now()-G;if(K>1000)X(`[dbos] waited ${K}ms for the migration lock; another process migrated first`);return await Z()}finally{if(W)try{await J.query("SELECT pg_advisory_unlock($1)",[cP1.toString()])}catch{}await J.end().catch(()=>{})}}r1();cx0();v6();function $D8(){let $=(process.env.BUN_OPTIONS??"").split(/\s+/).filter(Boolean);return[...process.argv.slice(1),...$]}function Jf0($,Z){for(let Q=0;Q<$.length;Q++){let Y=$[Q];if(Y===void 0)continue;if(Y===Z)return $[Q+1];if(Y.startsWith(`${Z}=`))return Y.slice(Z.length+1)}return}function qz1(){let $=$D8();if($.includes("--cpu-prof")){console.log(JSON.stringify({msg:"cpu-profiling-active",dir:Jf0($,"--cpu-prof-dir")??process.cwd(),name:Jf0($,"--cpu-prof-name"),markdown:$.includes("--cpu-prof-md"),intervalUs:Number(Jf0($,"--cpu-prof-interval")??1000),note:"profile is written on process exit"}));return}if(process.env.CPU_PROFILE)console.warn(JSON.stringify({msg:"cpu-profiling-requested-but-inactive",hint:'CPU profiling is a Bun launch flag. Set BUN_OPTIONS="--cpu-prof --cpu-prof-md --cpu-prof-dir=/tmp" before starting the process.'}))}Kf0();var xZ0;function bz1(){if(process.env.HEAP_WATCH!=="1")return()=>{};let $=Number(process.env.HEAP_WATCH_INTERVAL_MS??60000),Z=async()=>{let Q=Sz();if(!Q)return;let Y={};try{let{heapStats:X}=await import("bun:jsc"),J=X(),G=Object.entries(J.objectTypeCounts).sort((W,K)=>K[1]-W[1]).slice(0,20);Y={objectCount:J.objectCount,heapSize:J.heapSize,top:Object.fromEntries(G)}}catch{}console.log(JSON.stringify({msg:"heap-watch",ts:new Date().toISOString(),uptimeS:Math.round(process.uptime()),rss:Q.rss,heapUsed:Q.heapUsed,heapTotal:Q.heapTotal,external:Q.external,arrayBuffers:Q.arrayBuffers,...Y}))};return Z().catch(()=>{}),xZ0=setInterval(()=>void Z().catch(()=>{}),$),xZ0.unref?.(),process.on("SIGUSR2",()=>{try{let Q=Bun.generateHeapSnapshot("v8"),Y=typeof Q==="string"?Q:JSON.stringify(Q),X=`/tmp/heap-${process.pid}-${Date.now()}.heapsnapshot`;Bun.write(X,Y),console.log(JSON.stringify({msg:"heap-snapshot-written",path:X}))}catch(Q){console.error("[heap-watch] snapshot failed:",Q)}}),()=>{if(xZ0)clearInterval(xZ0)}}import*as YD8 from"bun:jsc";var{startSamplingProfiler:XD8,samplingProfilerStackTraces:JD8}=YD8;function xz1(){if(process.env.STALL_WATCHDOG!=="1")return()=>{};let $=Number(process.env.STALL_WATCHDOG_MS??100),Z=Number(process.env.STALL_WATCHDOG_TICK_MS??50);try{XD8()}catch(J){return console.error("[stall-watchdog] failed to start sampling profiler:",J),()=>{}}let Q,Y=performance.now()+Z,X=()=>{let J=performance.now(),G=J-Y;Y=J+Z;let W=[];try{W=JD8()?.traces??[]}catch{}if(G>$&&W.length>0){let K=new Map;for(let F of W){let U=F.frames.find((D)=>D.sourceURL&&!/Unknown Executable/.test(D.category??""))??F.frames[0];if(!U)continue;let N=(U.sourceURL??"?").replace(/^.*\/node_modules\//,"node_modules/"),B=`${U.name??"?"} @ ${N}:${U.line??"?"}`;K.set(B,(K.get(B)??0)+1)}let H=[...K.entries()].sort((F,U)=>U[1]-F[1]).slice(0,8).map(([F,U])=>({frame:F,count:U}));console.warn(JSON.stringify({msg:"stall-stack",ts:new Date().toISOString(),lagMs:Math.round(G),samplesInWindow:W.length,top:H}))}Q=setTimeout(X,Z),Q.unref?.()};return Q=setTimeout(X,Z),Q.unref?.(),()=>{if(Q)clearTimeout(Q)}}function fz1(){qz1();let $=[bz1(),vz1(),xz1()];return()=>{for(let Z of $)Z()}}import{existsSync as b75}from"fs";var DW=L0();Az1();var{DBOS:zZ0,DBOSClient:I75}=await import("@dbos-inc/dbos-sdk");function vP1($,Z){if(!Z)return $;let Q=new URL($);if(!Q.searchParams.has("sslmode"))Q.searchParams.set("sslmode","verify-full");return Q.toString()}var V75=[iG,OW,qB,MB,SO,Mz,Iz],k75=DW.dispatchRole==="worker"?V75:DW.dispatchRole==="api"?[]:void 0;zZ0.setConfig(lP1({systemDatabaseUrl:vP1(DW.databaseUrl,DW.databasePgSsl),poolSize:DW.dbosPoolSize,executorID:DW.podName,listenQueues:k75}));var{createApp:S75}=await Promise.resolve().then(() => (kN8(),VN8)),{isServerPath:C75}=await Promise.resolve().then(() => (_Z0(),Jz1)),{createAssetHandler:_75,resolveClientDir:lN8}=await Promise.resolve().then(() => (bN8(),vN8)),v75=DW.port,yN8=lN8(import.meta.url,"../client"),cN8=b75(yN8)?yN8:lN8(import.meta.url,"../dist/client"),x75=_75({clientDir:cN8,isServerPath:C75}),f75={"X-Frame-Options":"DENY","Content-Security-Policy":"frame-ancestors 'none'"};function y75($){let Z=new Headers($.headers);for(let[Q,Y]of Object.entries(f75))Z.set(Q,Y);return new Response($.body,{status:$.status,statusText:$.statusText,headers:Z})}var{parsePreviewBaseDomain:g75,tryHandlePreviewHttp:h75,tryUpgradePreviewWs:u75,previewWebSocketHandler:VP1,isPreviewWsData:kP1}=await Promise.resolve().then(() => (fN8(),xN8)),{getOrInitSharedRunner:mN8}=await Promise.resolve().then(() => (RJ(),ck$)),dN8=g75(process.env.STUDIO_SANDBOX_PREVIEW_URL_PATTERN),gN8={baseDomain:dN8??"",getRunner:mN8};if(process.env.STUDIO_SANDBOX_TENANT_POOLS?.trim())mN8().catch(($)=>{console.warn("[lifecycle] eager sandbox provider init for tenant pools failed:",$ instanceof Error?$.message:String($))});var _x0=await S75({clientDir:cN8}),SP1=process.env.DBOS_CONDUCTOR_KEY?.trim(),hN8=process.env.DBOS_CONDUCTOR_URL?.trim();await mP1({databaseUrl:vP1(DW.databaseUrl,DW.databasePgSsl)},()=>zZ0.launch({...SP1?{conductorKey:SP1}:{},...SP1&&hN8?{conductorURL:hN8}:{}}));console.log(`[dbos] application version: ${zZ0.applicationVersion}`);var CP1=5,_P1=0;await D8(async()=>{_P1++;try{return await _x0.initDbos()}catch($){let Z=_P1>=CP1?"giving up":"retrying";throw console.warn(`[dbos] initDbos attempt ${_P1}/${CP1} failed, ${Z}`,$),$}},{maxAttempts:CP1,minTimeout:1000,maxTimeout:1e4,jitter:0.5});var l75=Bun.serve({idleTimeout:0,port:v75,hostname:"0.0.0.0",fetch:async($,Z)=>{if(dN8){let Y=await u75($,Z,gN8);if(Y===void 0)return;if(Y)return Y;let X=await h75($,gN8);if(X)return X}let Q=await x75($);if(Q)return y75(Q);return _x0.fetch($,{server:Z})},websocket:{open($){if(kP1($.data))VP1.open($)},message($,Z){if(kP1($.data))VP1.message($,Z)},close($){if(kP1($.data))VP1.close($)}},development:!1}),c75=fz1();if(DW.localMode)Promise.resolve().then(() => (Bg(),RV0)).then(async({seedLocalMode:$,markSeedComplete:Z,healLocalJwks:Q})=>{try{let Y=await Q();if(Y>0)console.log(`[local-mode] cleared ${Y} undecryptable JWKS key(s); Better Auth will generate a fresh one`);let X=await $()}catch(Y){console.error("Failed to seed local mode:",Y)}finally{Z()}}).catch(async($)=>{console.error("Failed to load local-mode module:",$);try{let{markSeedComplete:Z}=await Promise.resolve().then(() => (Bg(),RV0));Z()}catch{}});var uN8=!1;async function m75($){let Z;try{Z=await I75.create({systemDatabaseUrl:vP1(DW.databaseUrl,DW.databasePgSsl),systemDatabaseSchemaName:"dbos"});let Q=await Z.listWorkflows({status:"PENDING",queueName:OW,executorId:$,loadInput:!1,loadOutput:!1});if(Q.length===0){console.log(`[shutdown] no in-flight thread-gate gates to hand off (executor ${$})`);return}let Y=Q.map((X)=>X.workflowID);await Z.resumeWorkflows(Y,{queueName:OW}),console.log(`[shutdown] re-enqueued ${Y.length} in-flight thread-gate gate(s) for re-adoption by a live executor (from ${$}):`,Y)}catch(Q){console.error("[shutdown] thread-gate handoff failed:",Q)}finally{await Z?.destroy().catch(()=>{})}}async function vx0($){if(uN8)return;uN8=!0,console.log(`
|
|
4329
4329
|
[shutdown] Received ${$}, shutting down gracefully...`);let Z=Number(process.env.SHUTDOWN_GRACE_SECONDS??60)*1000,Q=Math.max(Z-5000,1e4),Y=setTimeout(()=>{console.error(`[shutdown] Timed out after ${Q}ms, forcing exit.`),process.exit(1)},Q);Y.unref?.();let X=0;try{c75(),_x0.markShuttingDown();let J=dP1(DW.dispatchRole,Q,process.env.SHUTDOWN_DRAIN_MS);await D$(J),await l75.stop(!0);let G=zZ0.executorID;await zZ0.shutdown(),await m75(G),await _x0.shutdown()}catch(J){console.error("[shutdown] Error during shutdown:",J),X=1}clearTimeout(Y),process.exit(X)}process.on("SIGTERM",()=>vx0("SIGTERM"));process.on("SIGINT",()=>vx0("SIGINT"));process.on("SIGHUP",()=>vx0("SIGHUP"));process.on("unhandledRejection",($)=>{console.error("[process] Unhandled rejection:",$)});process.on("uncaughtException",($)=>{console.error("[process] Uncaught exception:",$),vx0("uncaughtException")});
|