decocms 4.301.1 → 4.302.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/{AlertCircle-ljUXZVgg.js → AlertCircle--S50lYlT.js} +1 -1
- package/dist/client/assets/{AreaChart-CfjqEiiW.js → AreaChart-2sBpbuMf.js} +1 -1
- package/dist/client/assets/{ArrowLeft-O_poTHg5.js → ArrowLeft--moIvZF1.js} +1 -1
- package/dist/client/assets/{ArrowUp-owAEYYU9.js → ArrowUp-BkX5jA0w.js} +1 -1
- package/dist/client/assets/{Check-Dspx9Fp7.js → Check-21QCyL9U.js} +1 -1
- package/dist/client/assets/{CheckCircle-Xp4EEaHw.js → CheckCircle-CPDEO5GX.js} +1 -1
- package/dist/client/assets/{ChevronDown-BIP5kqgM.js → ChevronDown-Ne8BnIfH.js} +1 -1
- package/dist/client/assets/{ChevronRight-DN8wQOqh.js → ChevronRight-BNwKXu8S.js} +1 -1
- package/dist/client/assets/{ChevronSelectorVertical-pB9PhHfJ.js → ChevronSelectorVertical-wQ_D9Y2K.js} +1 -1
- package/dist/client/assets/{ChevronUp-CziS5WaB.js → ChevronUp-BasPulcO.js} +1 -1
- package/dist/client/assets/{Copy01-vCqfQzFe.js → Copy01-t29PvqTS.js} +1 -1
- package/dist/client/assets/{CreditCard01-Do9O8xIN.js → CreditCard01-BXjnEU5v.js} +1 -1
- package/dist/client/assets/{DotsVertical-BRi7moDO.js → DotsVertical-CXv3vUpi.js} +1 -1
- package/dist/client/assets/{Download01-CfiTBBn_.js → Download01-BdQRwVjm.js} +1 -1
- package/dist/client/assets/{Eye-DeuttcGY.js → Eye-CIH0cvna.js} +1 -1
- package/dist/client/assets/{FilterLines-D7mDTV7W.js → FilterLines-TFzhd5Sv.js} +1 -1
- package/dist/client/assets/{Globe01-DjZFjLeY.js → Globe01-DgHCgXqE.js} +1 -1
- package/dist/client/assets/{Globe04-JNbM0T4S.js → Globe04-DhiCVMqK.js} +1 -1
- package/dist/client/assets/{HardDrive-BE93B0r3.js → HardDrive-CZNhB50C.js} +1 -1
- package/dist/client/assets/{Key01-BfP4FjhZ.js → Key01-CJ7IFAqA.js} +1 -1
- package/dist/client/assets/{LinkExternal01-DEeO7Yqp.js → LinkExternal01-CChSNtL1.js} +1 -1
- package/dist/client/assets/{LockUnlocked01-BV3keEk-.js → LockUnlocked01-BgNvX2VD.js} +1 -1
- package/dist/client/assets/{LogOut01--nH6fRjz.js → LogOut01-BJVeOK9b.js} +1 -1
- package/dist/client/assets/{Monitor01-n4Ml3ptB.js → Monitor01-C8QN-pqN.js} +1 -1
- package/dist/client/assets/{Palette-DUQPyERX.js → Palette-CGBCMwIz.js} +1 -1
- package/dist/client/assets/{Play-j8BtRPuR.js → Play-C4beyigm.js} +1 -1
- package/dist/client/assets/{Plus-CH75M1Z_.js → Plus-BMOgHzG5.js} +1 -1
- package/dist/client/assets/{SearchLg-BxkHIUp9.js → SearchLg-CGVDwrMb.js} +1 -1
- package/dist/client/assets/{SearchMd-gHnWrk04.js → SearchMd-DnevLcSr.js} +1 -1
- package/dist/client/assets/{Settings02-BPV8iKcU.js → Settings02-CsELO-le.js} +1 -1
- package/dist/client/assets/{Share07-BGukGo7T.js → Share07-CMg5MeSz.js} +1 -1
- package/dist/client/assets/{Shield01-BB2neh_V.js → Shield01-C50GHdrj.js} +1 -1
- package/dist/client/assets/{Stars01-COgnQQBe.js → Stars01-BUhIIfF6.js} +1 -1
- package/dist/client/assets/{Stars02-DZ3JRVne.js → Stars02-CEnwjR-Z.js} +1 -1
- package/dist/client/assets/{Sun-C6ZCInWh.js → Sun-MIE_B9F8.js} +1 -1
- package/dist/client/assets/{SwitchHorizontal01-CGTTaBt7.js → SwitchHorizontal01-Bzkb6o-L.js} +1 -1
- package/dist/client/assets/{Tool01-BjY6qOZZ.js → Tool01-BRmg7VS6.js} +1 -1
- package/dist/client/assets/{Tool02-D8r9WrY5.js → Tool02-DIytv_88.js} +1 -1
- package/dist/client/assets/{Trash01-C-Qo_xAi.js → Trash01-CVqps_Wa.js} +1 -1
- package/dist/client/assets/{TrendUp01-fwYE1fSJ.js → TrendUp01-h2owl4fz.js} +1 -1
- package/dist/client/assets/{Upload01-B8TZG867.js → Upload01-B4pquB-8.js} +1 -1
- package/dist/client/assets/{User01-BVTsNjSS.js → User01-C-2eRuUK.js} +1 -1
- package/dist/client/assets/{UserSquare-CcB7EE3-.js → UserSquare-BEIgFGFo.js} +1 -1
- package/dist/client/assets/{Users01-DFm0KLRk.js → Users01-DmLZ_8H3.js} +1 -1
- package/dist/client/assets/{Users03-CYQdFqu5.js → Users03-DFqEkeM0.js} +1 -1
- package/dist/client/assets/{XCircle-BLXZX6LN.js → XCircle-CuKagUwu.js} +1 -1
- package/dist/client/assets/{XClose-BI1HCDzp.js → XClose-Ck8HkChC.js} +1 -1
- package/dist/client/assets/{YAxis-Bagaia8x.js → YAxis-DogP2msy.js} +1 -1
- package/dist/client/assets/{Zap-CUiG_SEX.js → Zap-BMEUb6hF.js} +1 -1
- package/dist/client/assets/{ZapSquare-dsonqlnJ.js → ZapSquare-CyEVyYPm.js} +1 -1
- package/dist/client/assets/{access-gate-D98V2vC9.js → access-gate-DgNMsLL8.js} +1 -1
- package/dist/client/assets/{agent-icon-D080UAkK.js → agent-icon-BTu0aLL6.js} +1 -1
- package/dist/client/assets/{agents-list-BHWoc2Ab.js → agents-list-CHI4iWCs.js} +1 -1
- package/dist/client/assets/{ai-providers-B_zbvZms.js → ai-providers-B50WGqBN.js} +1 -1
- package/dist/client/assets/{alert-BZ-z_uGm.js → alert-DoV-uPtw.js} +1 -1
- package/dist/client/assets/{alert-dialog-D80JF1FN.js → alert-dialog-B3-qCKYp.js} +1 -1
- package/dist/client/assets/{api-keys-Dxx7a6SP.js → api-keys-DKXE1ELu.js} +1 -1
- package/dist/client/assets/{app-editor-C_wNkqv4.js → app-editor-BQ72-EOL.js} +1 -1
- package/dist/client/assets/{auth-CAzZwnob.js → auth-5AK60ATv.js} +1 -1
- package/dist/client/assets/{auth-catchall-E-LlAM-S.js → auth-catchall-DW-VvqJj.js} +1 -1
- package/dist/client/assets/{auth-entry-JuGGJf92.js → auth-entry-BRtox9Oq.js} +1 -1
- package/dist/client/assets/{auth-split-layout-Bx_mmH-l.js → auth-split-layout-3E2Xv55N.js} +1 -1
- package/dist/client/assets/{authenticate-and-persist-oauth-Bl5SLBwb.js → authenticate-and-persist-oauth-m5l9IIdb.js} +1 -1
- package/dist/client/assets/{automation-list-row-B8DIsrsz.js → automation-list-row-CiOBbaJm.js} +1 -1
- package/dist/client/assets/{automation-runs-8pT6UcJX.js → automation-runs-C1o0atK6.js} +1 -1
- package/dist/client/assets/{automations-BblT7_xF.js → automations-D3HoiLUU.js} +1 -1
- package/dist/client/assets/{avatar-C-wDTrqY.js → avatar-AMLPXGy0.js} +1 -1
- package/dist/client/assets/{badge-C3zovwOz.js → badge-De3utlxn.js} +1 -1
- package/dist/client/assets/{block-document-B_n2-NvH.js → block-document-BY8f6kr3.js} +1 -1
- package/dist/client/assets/{breadcrumb-BGVJe9sP.js → breadcrumb-D_8xwetH.js} +1 -1
- package/dist/client/assets/{buckets-D5WT0cf3.js → buckets--zWQZdkU.js} +1 -1
- package/dist/client/assets/{bulk-category-panel-HA3DYXop.js → bulk-category-panel-DEM09iDR.js} +1 -1
- package/dist/client/assets/{capability-load-error-DZd0TZqr.js → capability-load-error-9u9UnRYj.js} +1 -1
- package/dist/client/assets/{cards-hEkcdw4x.js → cards-B0CKLrvb.js} +1 -1
- package/dist/client/assets/{category-editor-BYTL98zO.js → category-editor-CnUuaDs1.js} +1 -1
- package/dist/client/assets/{chart-BEjRfmhR.js → chart-Ct9Q-YeQ.js} +1 -1
- package/dist/client/assets/{chat-context-D8aIMWdd.js → chat-context-DK-zqgAd.js} +1 -1
- package/dist/client/assets/{checkbox-D9umlVBm.js → checkbox-jrhgij5O.js} +1 -1
- package/dist/client/assets/{choose-editor-zKSRgiY-.js → choose-editor-C3ywTQCb.js} +1 -1
- package/dist/client/assets/{cli-auth-success-Pbjl8ie0.js → cli-auth-success-CuFHRifS.js} +1 -1
- package/dist/client/assets/{collection-detail-KAQcK23P.js → collection-detail-B1UlrCPL.js} +1 -1
- package/dist/client/assets/{collection-display-button-DElS1JkI.js → collection-display-button-BHpCXAXi.js} +1 -1
- package/dist/client/assets/{collection-search-DwpjDZgj.js → collection-search-Cs_0NeQV.js} +1 -1
- package/dist/client/assets/{collection-table-wrapper-BMfdmOc5.js → collection-table-wrapper-CVr9gD1-.js} +1 -1
- package/dist/client/assets/{collection-tabs-MkxigJjY.js → collection-tabs-DYOU5hvW.js} +1 -1
- package/dist/client/assets/{command-DUGT4YuA.js → command-B0DuZOel.js} +1 -1
- package/dist/client/assets/{commerce-onboarding-BmuUaTay.js → commerce-onboarding-CRmKi-nH.js} +1 -1
- package/dist/client/assets/{config-KtrfZ-Vw.js → config-CzeSm6M1.js} +1 -1
- package/dist/client/assets/{connect-B-nmHPbw.js → connect-BHHvcgmH.js} +1 -1
- package/dist/client/assets/{connection-LGpb7l5N.js → connection-BsvgSKJK.js} +1 -1
- package/dist/client/assets/{connection-card-DG_wFSNi.js → connection-card-Cnwns280.js} +1 -1
- package/dist/client/assets/{connection-detail-aGo-Qvt-.js → connection-detail-D64vtP2R.js} +1 -1
- package/dist/client/assets/{connection-form-helpers-BzuUoL8A.js → connection-form-helpers-xgaaR9Wu.js} +1 -1
- package/dist/client/assets/{connections-CHRTDzbE.js → connections-C0aRbBn5.js} +1 -1
- package/dist/client/assets/{decopilot-sse-pool-BmPOv_9w.js → decopilot-sse-pool-CsEOd3x_.js} +1 -1
- package/dist/client/assets/{dialog-C2z64945.js → dialog-D9UcxaOZ.js} +1 -1
- package/dist/client/assets/{domain-settings-CgGh3z2i.js → domain-settings-BEFW_I49.js} +1 -1
- package/dist/client/assets/{drawer-CUiOyXL0.js → drawer-BUtvQSmI.js} +1 -1
- package/dist/client/assets/{dropdown-menu-ayJVblos.js → dropdown-menu-OAMtkHDy.js} +1 -1
- package/dist/client/assets/{empty-state-CJTsA7ZQ.js → empty-state-hLmmNxyW.js} +1 -1
- package/dist/client/assets/{extract-connection-data-BcHTU76U.js → extract-connection-data-BoWrhrV4.js} +1 -1
- package/dist/client/assets/{file-explorer-CV9-oV-Q.js → file-explorer-qVVGg7ie.js} +1 -1
- package/dist/client/assets/{file-type-icon-BfUDQtPj.js → file-type-icon-CzjrnCIA.js} +1 -1
- package/dist/client/assets/{form-DA40jxLy.js → form-D6M_LTG-.js} +1 -1
- package/dist/client/assets/{general-MDpTV4Dk.js → general-B-ixVJA-.js} +1 -1
- package/dist/client/assets/{github-repo-picker-CtQhVMRJ.js → github-repo-picker-CoxG8E9z.js} +1 -1
- package/dist/client/assets/{hooks-hTPN622N.js → hooks-DI5QN-lf.js} +1 -1
- package/dist/client/assets/{index-Cd78eLLb.js → index-BE3OLc8Y.js} +6 -6
- package/dist/client/assets/{index-BOx0KUFh.js → index-BUAHodE-.js} +1 -1
- package/dist/client/assets/{index-D8eVz1G2.js → index-BkdlYSI5.js} +1 -1
- package/dist/client/assets/{index-TJ7wGA3E.js → index-C5Fhci5U.js} +1 -1
- package/dist/client/assets/{index-DJEkiQUC.js → index-CC8H9260.js} +1 -1
- package/dist/client/assets/{index-BC3OycCV.js → index-DL6QWGZt.js} +3 -3
- package/dist/client/assets/{index-m7UZKvUt.js → index-DXRLhnEd.js} +1 -1
- package/dist/client/assets/{index-DatPw8uA.js → index-IpiB65ys.js} +1 -1
- package/dist/client/assets/{index-DFMhMZ-D.js → index-YSt4WJyU.js} +1 -1
- package/dist/client/assets/{index-redirect-CwBQV1Xk.js → index-redirect-nXWXEovG.js} +1 -1
- package/dist/client/assets/{infra-billing-v-600drN.js → infra-billing-DzIwX7K7.js} +1 -1
- package/dist/client/assets/{input-CJmiU1C-.js → input-31wlueT2.js} +1 -1
- package/dist/client/assets/{integration-icon-Bmo3oT9s.js → integration-icon-BXi1kT1t.js} +1 -1
- package/dist/client/assets/{invite-member-dialog-D8eWOjYF.js → invite-member-dialog-CNyLiJzv.js} +1 -1
- package/dist/client/assets/{label-BtUaN40E.js → label-l3A9nx8i.js} +1 -1
- package/dist/client/assets/{layout-zFndLcYt.js → layout-7AlJaXD_.js} +1 -1
- package/dist/client/assets/{login-S0L8GE65.js → login-GnNrJeXV.js} +1 -1
- package/dist/client/assets/{mcp-oauth-BOTsCCNI.js → mcp-oauth-RpES_cHs.js} +1 -1
- package/dist/client/assets/{members-Bt5J0gS4.js → members-CTTne1x8.js} +1 -1
- package/dist/client/assets/{monaco-editor-BMLMMPa-.js → monaco-editor-iCttGN_M.js} +1 -1
- package/dist/client/assets/{monitoring-stats-row-UZRMU8x5.js → monitoring-stats-row-Dyjw9oG-.js} +1 -1
- package/dist/client/assets/{multi-select-YRgR9zRZ.js → multi-select-nFUjFIuk.js} +1 -1
- package/dist/client/assets/{oauth-callback-BnhdUk1_.js → oauth-callback-Bp9IScdO.js} +1 -1
- package/dist/client/assets/{oauth-callback-ai-provider-CI4OjqiI.js → oauth-callback-ai-provider-BZZIEDwx.js} +1 -1
- package/dist/client/assets/{onboarding-gvZqKi2d.js → onboarding-D7p-yBR8.js} +1 -1
- package/dist/client/assets/{org-layout-COOCTYlT.js → org-layout-eMgHxF26.js} +1 -1
- package/dist/client/assets/{organization-choice-BxQa72Tz.js → organization-choice-7iqgBQqb.js} +1 -1
- package/dist/client/assets/{orgs-D297Vmq3.js → orgs-Ccgln9xg.js} +1 -1
- package/dist/client/assets/{page-seo-form-CdZBFD3f.js → page-seo-form-CV107o5v.js} +1 -1
- package/dist/client/assets/{popover-If2D04hv.js → popover-C6zGwQIl.js} +1 -1
- package/dist/client/assets/{post-calendar-_2sAU49Y.js → post-calendar-D0ast4Yl.js} +1 -1
- package/dist/client/assets/{post-editor-Zk0Tm9uH.js → post-editor-sazq06Cc.js} +1 -1
- package/dist/client/assets/{primitives-Bbg6u6XW.js → primitives-Ci0hYkDg.js} +1 -1
- package/dist/client/assets/{profile-D0yNqtWs.js → profile-D8ohw0dP.js} +1 -1
- package/dist/client/assets/{project-app-view-DYhcKdZW.js → project-app-view-DYAgVh91.js} +1 -1
- package/dist/client/assets/{prompts-BWkGzrDr.js → prompts-CRAuTosb.js} +1 -1
- package/dist/client/assets/record-editor-BDTH9951.js +1 -0
- package/dist/client/assets/redirect-editor-XWCtvnKo.js +1 -0
- package/dist/client/assets/registry--75cD7Q4.js +2 -0
- package/dist/client/assets/{registry-layout-CLEVdutL.js → registry-layout-C2MVvqQh.js} +1 -1
- package/dist/client/assets/{reports-Crw9j2hu.js → reports-CSH1XgNu.js} +1 -1
- package/dist/client/assets/{require-capability-DfH6z05e.js → require-capability-DcgyJ0ed.js} +1 -1
- package/dist/client/assets/{required-auth-layout-DqEnT119.js → required-auth-layout-CZ_xeEey.js} +1 -1
- package/dist/client/assets/{reset-password-kid4OXSX.js → reset-password-CznFc3eP.js} +1 -1
- package/dist/client/assets/{review-settings-BT83EPcr.js → review-settings-BINYZIDC.js} +1 -1
- package/dist/client/assets/{roles-BqBiL4PM.js → roles-CU_Ur6R_.js} +1 -1
- package/dist/client/assets/{scroll-area-DU8Ibx6i.js → scroll-area-CGoUlzN9.js} +1 -1
- package/dist/client/assets/{search-input-By6KJCAU.js → search-input-oO7W7Jkx.js} +1 -1
- package/dist/client/assets/{secrets-FlYLmGbS.js → secrets-rVOSzo2y.js} +1 -1
- package/dist/client/assets/{sections-editor-BbYrmZD7.js → sections-editor-VuVu21P3.js} +1 -1
- package/dist/client/assets/{select-CFw9zVOp.js → select-BZD-FGQ3.js} +1 -1
- package/dist/client/assets/{select-model-CithTGMh.js → select-model-DUAwpbYO.js} +1 -1
- package/dist/client/assets/{self-tool-result-DM6h1PYI.js → self-tool-result-03d56M7n.js} +1 -1
- package/dist/client/assets/{seo-editor-BGJcK_dD.js → seo-editor-B_Twjp5e.js} +1 -1
- package/dist/client/assets/{settings-layout-B1BGgP9o.js → settings-layout-nt_bPixc.js} +1 -1
- package/dist/client/assets/{shell-controls-CgADbB3e.js → shell-controls-XLrHyMGG.js} +1 -1
- package/dist/client/assets/{shell-layout-CoGSaRZv.js → shell-layout-CyN9QvUt.js} +1 -1
- package/dist/client/assets/{spinner-BV8DqFIs.js → spinner-CqN_c-Vo.js} +1 -1
- package/dist/client/assets/{sso-D-ZrE89R.js → sso-CDrh8q1z.js} +1 -1
- package/dist/client/assets/{store-Bc_bBUc7.js → store-PS7WVh4w.js} +1 -1
- package/dist/client/assets/store-registry-BkP3L7H0.js +2 -0
- package/dist/client/assets/{super-agent-icon-DU04sOQc.js → super-agent-icon-DiYNyBiT.js} +1 -1
- package/dist/client/assets/{switch--xQ7kaDU.js → switch-Byl_sVul.js} +1 -1
- package/dist/client/assets/{synced-repos-Biy9etbn.js → synced-repos-BOBZW6zS.js} +1 -1
- package/dist/client/assets/{table-4fFr5X3V.js → table-Cmea17jX.js} +1 -1
- package/dist/client/assets/{tabs-DE8Uy3qS.js → tabs-Bo1G84wt.js} +1 -1
- package/dist/client/assets/{task-board-BiByHFh1.js → task-board-DKAS4RPu.js} +1 -1
- package/dist/client/assets/{tasks-Dv5scTC4.js → tasks-DdhSDrvE.js} +1 -1
- package/dist/client/assets/{textarea-BIyCQMXE.js → textarea-CQcDR8SL.js} +1 -1
- package/dist/client/assets/{toggle-group-Ban17rBs.js → toggle-group-PJVwuw0h.js} +1 -1
- package/dist/client/assets/{toolbar-BszG6pRV.js → toolbar-CJ7NGWqp.js} +1 -1
- package/dist/client/assets/{track-CRc7DoaF.js → track-FwRHeudJ.js} +1 -1
- package/dist/client/assets/{types-CP0iwckl.js → types-TVldurdZ.js} +1 -1
- package/dist/client/assets/{use-ai-providers-C6DxxrIw.js → use-ai-providers-67XyD-I5.js} +1 -1
- package/dist/client/assets/{use-api-keys-C22ovyI6.js → use-api-keys-C5eeVdYE.js} +1 -1
- package/dist/client/assets/{use-automations-Dv4L_mqz.js → use-automations-Bb-zRfpJ.js} +1 -1
- package/dist/client/assets/{use-autosave-B3Ol1QtM.js → use-autosave-Db__O11V.js} +1 -1
- package/dist/client/assets/{use-connection-BC-1N3cQ.js → use-connection-Bnw3RKv0.js} +1 -1
- package/dist/client/assets/{use-copy-hIsI1Npw.js → use-copy-ClF83VjI.js} +1 -1
- package/dist/client/assets/{use-create-virtual-mcp-DpPqjETZ.js → use-create-virtual-mcp-B7p1hpdE.js} +1 -1
- package/dist/client/assets/{use-debounced-autosave-Bc2vPK15.js → use-debounced-autosave-CERfWGwu.js} +1 -1
- package/dist/client/assets/{use-debounced-value-CDyQcr4h.js → use-debounced-value-CwZ5rH7B.js} +1 -1
- package/dist/client/assets/{use-decopilot-events-D1jhrYA5.js → use-decopilot-events-N4KoRwf0.js} +1 -1
- package/dist/client/assets/{use-delete-connection-Cw-nlqJU.js → use-delete-connection-BkjhNnHe.js} +1 -1
- package/dist/client/assets/{use-deployment-admin-CMGRAd7Z.js → use-deployment-admin-UOvix-CA.js} +1 -1
- package/dist/client/assets/{use-destination-route-ryxqobAF.js → use-destination-route-5DAVdaA6.js} +1 -1
- package/dist/client/assets/{use-file-configs-Wie4CKvq.js → use-file-configs-BMREGWDR.js} +1 -1
- package/dist/client/assets/{use-infinite-scroll-CitCgVws.js → use-infinite-scroll-Cad3tFqO.js} +1 -1
- package/dist/client/assets/{use-join-requests-BWcZjMaY.js → use-join-requests-D-qnEwKd.js} +1 -1
- package/dist/client/assets/{use-mcp-auth-status-BIoyHUqD.js → use-mcp-auth-status-Dmz2PGDh.js} +1 -1
- package/dist/client/assets/{use-mcp-client-BCLniVpi.js → use-mcp-client-_-q8gSpV.js} +1 -1
- package/dist/client/assets/{use-mcp-tools-BZwaAMhe.js → use-mcp-tools-H87UCyWm.js} +1 -1
- package/dist/client/assets/{use-members-DkgeBVL-.js → use-members-CQGYX3Pj.js} +1 -1
- package/dist/client/assets/{use-navigate-to-agent-DSUm9cYC.js → use-navigate-to-agent-Ckze4qM4.js} +1 -1
- package/dist/client/assets/{use-org-auth-client-BTYz4Get.js → use-org-auth-client-ClV-gFXb.js} +1 -1
- package/dist/client/assets/{use-org-repo-syncs-5qnhLJ1m.js → use-org-repo-syncs-DnMIWIVg.js} +1 -1
- package/dist/client/assets/{use-org-sso-ILC2SFH4.js → use-org-sso-BL7qkIX4.js} +1 -1
- package/dist/client/assets/{use-organization-roles-Bw-nhwHu.js → use-organization-roles-O3DPyr37.js} +1 -1
- package/dist/client/assets/{use-organization-settings-CS8eH9p-.js → use-organization-settings-DxE-DUNT.js} +1 -1
- package/dist/client/assets/{use-panel-navigate-D8J7h7Ug.js → use-panel-navigate-DgQaZ-S3.js} +1 -1
- package/dist/client/assets/{use-registry-connections-CkL-7k1R.js → use-registry-connections-DPTuPbtF.js} +1 -1
- package/dist/client/assets/{use-secrets-ykqA76r4.js → use-secrets-CkE-4DTo.js} +1 -1
- package/dist/client/assets/{use-section-preview-base-vTLGJTTw.js → use-section-preview-base-T9bUeko1.js} +1 -1
- package/dist/client/assets/{use-status-sounds-DkcUZrtO.js → use-status-sounds-DTPXBUkI.js} +1 -1
- package/dist/client/assets/{use-tags-TFH74lb0.js → use-tags-C-Dd9DWL.js} +1 -1
- package/dist/client/assets/{use-view-mode-DvqUeq37.js → use-view-mode-WGVCULVH.js} +1 -1
- package/dist/client/assets/{use-virtual-mcp-CTSK4a1q.js → use-virtual-mcp-q_2WTD-b.js} +1 -1
- package/dist/client/assets/useInfiniteQuery-Y1sGoq7f.js +1 -0
- package/dist/client/assets/useSuspenseInfiniteQuery-BaIecKZH.js +1 -0
- package/dist/client/assets/{users-BYS0Fc9_.js → users-If831PYj.js} +1 -1
- package/dist/client/assets/{variant-calendar-D77tQewW.js → variant-calendar-Jc5dZB3L.js} +1 -1
- package/dist/client/assets/{view-mode-toggle-DWyJ7Fpd.js → view-mode-toggle-BaI0In0z.js} +1 -1
- package/dist/client/index.html +1 -1
- package/dist/server/cli.js +4 -4
- package/dist/server/server.js +4 -4
- package/package.json +1 -1
- package/dist/client/assets/record-editor-B4QVewxw.js +0 -1
- package/dist/client/assets/redirect-editor-CzUqckYJ.js +0 -1
- package/dist/client/assets/registry-C5pJ9d_K.js +0 -2
- package/dist/client/assets/store-registry-B68MUNUv.js +0 -2
- package/dist/client/assets/useInfiniteQuery-CI3XHdhq.js +0 -1
- package/dist/client/assets/useSuspenseInfiniteQuery-VLjgFDWa.js +0 -1
package/dist/server/server.js
CHANGED
|
@@ -1307,7 +1307,7 @@ Guidelines:
|
|
|
1307
1307
|
- Include file paths, function names, and specific code locations discovered during exploration.
|
|
1308
1308
|
- List concrete implementation steps in order.
|
|
1309
1309
|
- Note any risks, dependencies, or trade-offs.`,TD0=h$({description:UN4,inputSchema:Z0(HN4),outputSchema:Z0(NN4)})});function XN($){return`studio-storage://${$}`}function cn($){if($.startsWith("studio-storage://"))return $.slice(17);if($.startsWith("mesh-storage://"))return $.slice(15);return null}function Ft0(){return/(?:studio|mesh)-storage:\/\/([^\s"'<>[\]]+)/g}var RD0=()=>{};import{lookup as BN4}from"dns/promises";import{z as EC}from"zod";function ID0($){if($>BW$){let Z=($/1048576).toFixed(1),X=BW$/1048576;throw Error(`Reference image too large: ${Z} MB (max ${X} MB). Use a smaller image.`)}}function LN4($,Z){let X;try{X=new URL($)}catch{throw Error("Invalid image URL")}if(X.protocol!=="https:"&&!(Z&&X.protocol==="http:"))throw Error("Image URL must use HTTPS");for(let Q of DN4)if(Q.test(X.hostname))throw Error("Image URL must not point to a private network address")}function wN4($){let Z=$.match(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/);if(Z){let Q=Number(Z[1]),Y=Number(Z[2]);if(Q===127||Q===10||Q===0)return!0;if(Q===172&&Y>=16&&Y<=31)return!0;if(Q===192&&Y===168)return!0;if(Q===169&&Y===254)return!0;return!1}let X=$.toLowerCase();return X==="::1"||X.startsWith("::ffff:")||X.startsWith("fc")||X.startsWith("fd")||X.startsWith("fe80")}async function EN4($,Z=async(X)=>(await BN4(X,{all:!0})).map((Q)=>Q.address)){let X=new URL($).hostname;if(/^\d+\.\d+\.\d+\.\d+$/.test(X)||X.startsWith("[")&&X.endsWith("]"))return;let Y;try{Y=await Z(X)}catch{throw Error("Image URL must not point to a private network address")}if(Y.length===0||Y.some(wN4))throw Error("Image URL must not point to a private network address")}async function LW$($,Z){if(!Z?.getBytes)throw Error("Object storage read is not available");if(Z.head){let{size:Q}=await Z.head($);ID0(Q)}let X=await Z.getBytes($);return ID0(X.byteLength),X}async function jN4($,Z){let X=cn($);if(X!==null)return LW$(X,Z.objectStorage);let Q=$.match(ON4);if(Q)return LW$(Q[1],Z.objectStorage);if($.startsWith("data:")){let K=$.match(/^data:[^;]+;base64,(.+)$/s);if(!K)throw Error("Invalid data: URI");let F=Buffer.from(K[1],"base64");return ID0(F.byteLength),F}LN4($,Z.allowHttpExternalUrls===!0),await EN4($);let Y=AbortSignal.timeout(OW$),G=Z.abortSignal?AbortSignal.any([Z.abortSignal,Y]):Y,J;try{J=await fetch($,{signal:G})}catch(K){if(K instanceof Error&&K.name==="TimeoutError")throw Error(`Fetching image from ${$} timed out after ${OW$}ms`);throw K}if(!J.ok)throw Error(`Failed to fetch image from ${$}: ${J.status}`);let W=new Uint8Array(await J.arrayBuffer());return ID0(W.byteLength),W}async function Ht0($,Z){let{provider:X,imageModelInfo:Q,objectStorage:Y}=Z,G=X.aiSdk.imageModel(Q.id),J=$.referenceImages&&$.referenceImages.length>0,W=J?await Promise.all($.referenceImages.map((L)=>{let w=L.uri??L.url;if(!w)throw Error("Reference image missing uri");return jN4(w,Z)})):[],K=J?{text:$.prompt,images:W}:$.prompt,F=AbortSignal.timeout(DW$),H=Z.abortSignal?AbortSignal.any([Z.abortSignal,F]):F,N;try{N=await rZ0({model:G,prompt:K,n:$.n??1,...$.aspectRatio?{aspectRatio:$.aspectRatio}:{},abortSignal:H})}catch(L){if(F.aborted&&!Z.abortSignal?.aborted)throw Error(`Image generation timed out after ${DW$}ms`);throw L}if(!Y)throw Error("Object storage is unavailable; cannot persist the generated image.");let U=$.n??1,B=N.images.length>U?N.images.slice(-U):N.images;return{success:!0,images:await Promise.all(B.map(async(L)=>{let w=L.mediaType??"image/png",E=w.split("/")[1]??"png",j=`generated-images/${crypto.randomUUID()}.${E}`,z=Uint8Array.from(atob(L.base64),(A)=>A.charCodeAt(0));return await Y.put(j,z,{contentType:w}),{uri:XN(j),mediaType:w}})),prompt:$.prompt,model:Q.id,usage:{inputTokens:N.usage.inputTokens??0,outputTokens:N.usage.outputTokens??0},usedReferenceImages:J?$.referenceImages.length:0}}function qD0($,Z){return h$({description:"Generate an image from a text description, optionally using reference images. Use this when the user asks you to create, generate, draw, or design an image. If the user has attached images and wants to modify or use them as a reference, pass them as referenceImages. "+"The image is displayed automatically by the UI \u2014 do NOT include image URLs or markdown images in your response.",inputSchema:Z0(dn),execute:async(X,Q)=>{let Y=performance.now();try{return await Ht0(X,Z)}finally{$.write({type:"data-tool-metadata",id:Q.toolCallId,data:{latencyMs:performance.now()-Y}})}}})}var ON4,BW$=20971520,OW$=45000,DW$=120000,dn,DN4;var mn=D(()=>{c4();c4();RD0();ON4=/\/api\/[^/]+\/files\/([^?#]+)/,dn=EC.object({prompt:EC.string().max(1e4).describe("Detailed description of the image to generate. Be specific about style, composition, colors, and subject matter."),referenceImages:EC.array(EC.object({uri:EC.string().describe("URI of the reference image (e.g. studio-storage://generated-images/uuid.png).")})).optional().describe("Reference images to use as input for image-to-image generation. Pass the URI of any image from the conversation (uploaded files, previously generated images, etc.) when the user wants to modify, transform, or use an existing image as a starting point."),aspectRatio:EC.enum(["1:1","16:9","9:16","4:3","3:4","3:2","2:3"]).optional().describe("Aspect ratio for the generated image. Defaults to 1:1."),n:EC.number().int().min(1).max(4).optional().describe("Number of images to generate. Defaults to 1.")}),DN4=[/^127\./,/^10\./,/^172\.(1[6-9]|2\d|3[01])\./,/^192\.168\./,/^169\.254\./,/^0\./,/^\[::1\]$/,/^\[f[cd]/,/^\[fe80:/,/^\[::ffff:/i,/^localhost$/i]});function wW$($,Z){return qD0($,{provider:Z.provider,imageModelInfo:Z.imageModelInfo,objectStorage:Z.objectStorage,allowHttpExternalUrls:Z.allowHttpExternalUrls})}var EW$=D(()=>{mn()});import{z as zN4}from"zod";function jW$($){return{background:!0,status:"started",jobId:$,note:PN4}}function TN4($){return!!$&&typeof $==="object"&&$.status==="started"&&$.background===!0}function pn($,Z,X,Q,Y){if(!Q)return X;let G=X.execute,J=Z0(Z.extend(AN4)),K=G.constructor.name==="AsyncGeneratorFunction"?async function*(H,N){let{background:U,...B}=H,O=async function*(){let{jobId:z}=await Q.start({toolName:$,input:B,toolCallId:N.toolCallId});yield jW$(z)};if(U){yield*O();return}let L=Y?.(N.toolCallId);if(!L){yield*G(B,N);return}let w=new AbortController,E=()=>w.abort();N.abortSignal?.addEventListener("abort",E,{once:!0});let j=G(B,{...N,abortSignal:w.signal})[Symbol.asyncIterator]();try{let z=j.next(),A=z.then((P)=>({kind:"next",r:P}));while(!0){let P=await Promise.race([A,L.flipped.then(()=>({kind:"flip"}))]);if(P.kind==="flip"){w.abort(),A.catch(()=>{}),(async()=>{try{await z}catch{}try{await j.return?.(void 0)}catch{}})(),yield*O();return}if(P.r.done)return;yield P.r.value,z=j.next(),A=z.then((I)=>({kind:"next",r:I}))}}finally{N.abortSignal?.removeEventListener("abort",E),L.dispose()}}:async(H,N)=>{let{background:U,...B}=H;if(U){let{jobId:O}=await Q.start({toolName:$,input:B,toolCallId:N.toolCallId});return jW$(O)}return G(B,N)};return{...X,inputSchema:J,execute:K,toModelOutput:(H)=>{if(TN4(H.output))return{type:"text",value:H.output.note};if(X.toModelOutput)return X.toModelOutput(H);return{type:"text",value:JSON.stringify(H.output)}}}}var PN4,AN4;var Nt0=D(()=>{c4();PN4="Running in the background. The result will appear in the conversation as "+"soon as it's ready \u2014 keep helping the user in the meantime, and do not "+"wait for it or call this tool again for the same request.",AN4={background:zN4.boolean().optional().describe("Run this in the BACKGROUND and return immediately instead of blocking this turn. Set true for long, fire-and-forget work whose result you do "+"NOT need in this same reply \u2014 it's delivered to the conversation when "+"it finishes and you'll be nudged to use it then. Leave false/omit when you need the result now to act on it this turn.")}});function zW$($,Z){let X=nn.get($);if(!X)X=new Map,nn.set($,X);let Q,Y=new Promise((G)=>{Q=G});return X.set(Z,Q),{flipped:Y,dispose(){let G=nn.get($);if(!G)return;if(G.delete(Z),G.size===0)nn.delete($)}}}function Ut0($,Z){nn.get($)?.get(Z)?.()}var nn;var Bt0=D(()=>{nn=new Map});import{z as PW$}from"zod";function Ot0($,Z){let{researchJob:X,toolOutputMap:Q,taskId:Y}=Z;return h$({description:Z.description??IN4,inputSchema:Z0(RN4),execute:async(G,J)=>{let W=performance.now(),K=(F)=>{$.write({type:"data-web-search",id:J.toolCallId,data:{text:F}})};try{let F=X({query:G.query,taskId:Y,toolCallId:J.toolCallId,abortSignal:J.abortSignal}),H=await F.next();while(!H.done)K(H.value.progress),H=await F.next();let N=H.value;return Q.set(J.toolCallId,N.text),qN4({query:G.query,text:N.text,citations:N.citations,usage:N.usage,resultUri:N.resultUri??null,preview:N.preview??""})}finally{let F=performance.now()-W;$.write({type:"data-tool-metadata",id:J.toolCallId,data:{latencyMs:F}})}}})}function qN4($){if($.resultUri)return{success:!0,uri:$.resultUri,preview:$.preview,query:$.query,usage:$.usage,...$.citations.length>0&&{citations:$.citations}};return{success:!0,content:$.text,query:$.query,usage:$.usage,...$.citations.length>0&&{citations:$.citations}}}var RN4,IN4="Search the web for up-to-date information and synthesize a concise answer. Use this for quick lookups, fact-checking, current events, or when the answer requires knowledge beyond your training data and a fast response is enough. For exhaustive, multi-source reports prefer `deep_research` when available.";var AW$=D(()=>{c4();RN4=PW$.object({query:PW$.string().max(1e4).describe("The research query. Be specific about what information you need. The research model will search the web and synthesize a comprehensive answer.")})});var jC;var Dt0=D(()=>{jC=class jC extends Error{constructor($){super($);this.name="AsyncResearchTerminalError"}}});var TW$=D(()=>{Dt0()});var RW$=D(()=>{TW$()});var Lt0=32000;function aY($,Z,X){let Q=Object.entries(X).filter(([,G])=>G!==void 0&&G!==null).map(([G,J])=>`${G}=${typeof J==="string"?J:JSON.stringify(J)}`).join(" "),Y=`[web-search] ${Z} ${Q}`.trim();if($==="error")console.error(Y);else if($==="warn")console.warn(Y);else console.log(Y)}function wt0($){let{provider:Z,modelInfo:X,ctx:Q,mode:Y,toolName:G}=$,J=X.id;return async function*(K){let F=Z.asyncResearch;if(Y==="deep"&&F?.canHandle(J)===!0&&F)return yield*MN4({params:K,asyncResearch:F,providerId:Z.info.id,modelId:J,toolName:G,ctx:Q});return yield*VN4({params:K,provider:Z,modelId:J,ctx:Q})}}async function*MN4({params:$,asyncResearch:Z,providerId:X,modelId:Q,toolName:Y,ctx:G}){let{toolCallId:J,taskId:W}=$,K={tc:J,thread:W,provider:X,model:Q},F=await G.storage.asyncResearchJobs.upsertPending({threadId:W,toolCallId:J,provider:X,modelId:Q,query:$.query});if(F.status==="completed"&&F.resultPreview!=null)return aY("info","replay-completed",{...K,job:F.id}),kN4(F);if(F.status==="failed"||F.status==="cancelled")throw aY("warn",`replay-${F.status}`,{...K,job:F.id,err:F.lastError}),Error(F.lastError??`previous research ${F.status}`);if(!F.interactionId){aY("info","submit",{...K,job:F.id});let B;try{B=(await Z.start({modelId:Q,query:$.query,abortSignal:$.abortSignal})).jobId}catch(O){let L=O.message??String(O);throw await G.storage.asyncResearchJobs.markFailed(J,L),aY("error","submit-failed",{...K,job:F.id,err:L}),O}await G.storage.asyncResearchJobs.markPolling(J,B,{threadId:W,toolName:Y,query:$.query}),F={...F,interactionId:B,status:"polling"},aY("info","polling-started",{...K,job:F.id,interaction:B})}else aY("info","polling-resumed",{...K,job:F.id,interaction:F.interactionId,attempts:F.attempts});let H=0,N=50,U=[];try{let B=!1,O,L=Z.resume({jobId:F.interactionId,abortSignal:$.abortSignal,onProgress:(P)=>{let I=Date.now();if(I-H>=N)H=I,U.push(P);G.storage.asyncResearchJobs.recordPoll(J).catch((k)=>{aY("warn","record-poll-failed",{...K,job:F.id,err:k.message})})}}).catch((P)=>{O=P;return}).finally(()=>{B=!0});while(!B){while(U.length>0)yield{progress:U.shift()};await Promise.race([L,L$(N)])}while(U.length>0)yield{progress:U.shift()};if(await L,O!==void 0)throw O;let w=await L;if(yield{progress:w.text},w.text.trim()==="")throw aY("error","empty-result",{...K,job:F.id,tokens:w.usage.outputTokens}),new jC("research completed with empty result");let E={inputTokens:w.usage.inputTokens,outputTokens:w.usage.outputTokens},j=w.usage.outputTokens>Lt0&&G.objectStorage!=null,z=null;if(j&&G.objectStorage){let P=`web-search/${crypto.randomUUID()}.md`;try{await G.objectStorage.put(P,new TextEncoder().encode(w.text),{contentType:"text/markdown"}),z=XN(P)}catch(I){aY("warn","blob-upload-failed",{...K,job:F.id,err:I.message})}}let A=uO(w.text);return await G.storage.asyncResearchJobs.markCompleted(J,{inputTokens:E.inputTokens,outputTokens:E.outputTokens,citations:w.citations,resultUri:z,resultPreview:A,resultContent:z?null:w.text}),aY("info","completed",{...K,job:F.id,tokens:E.outputTokens,citations:w.citations.length,uri:z??"inline"}),{text:w.text,citations:w.citations,usage:E,resultUri:z,preview:z?A:void 0}}catch(B){if($.abortSignal?.aborted)throw await G.storage.asyncResearchJobs.markCancelled(J,"aborted"),aY("info","cancelled",{...K,job:F.id}),B;let O=B.message??String(B);if(B instanceof jC||B instanceof Error&&B.name==="AsyncResearchTerminalError")throw await G.storage.asyncResearchJobs.markFailed(J,O),aY("error","terminal-failure",{...K,job:F.id,err:O}),B;throw await G.storage.asyncResearchJobs.recordPoll(J,O).catch(()=>{}),aY("warn","transient-error",{...K,job:F.id,err:O}),B}}function kN4($){if($.resultUri)return{text:"",citations:[],usage:{inputTokens:0,outputTokens:0},resultUri:$.resultUri,preview:$.resultPreview??""};return{text:$.resultContent??$.resultPreview??"",citations:[],usage:{inputTokens:0,outputTokens:0},resultUri:null}}async function*VN4({params:$,provider:Z,modelId:X,ctx:Q}){let Y=Z.aiSdk.languageModel(X),G=zO({model:Y,prompt:$.query,abortSignal:$.abortSignal}),J="",W=0,K=50;for await(let w of G.textStream){J+=w;let E=Date.now();if(E-W>=K)W=E,yield{progress:J}}yield{progress:J};let[F,H,N]=await Promise.all([G.usage,G.sources,G.providerMetadata]),U=F.inputTokens??0,B=F.outputTokens??0;e40(N);let O=[];if(H&&Array.isArray(H)){for(let w of H)if(w&&typeof w==="object"&&"sourceType"in w&&w.sourceType==="url"&&"url"in w&&typeof w.url==="string")O.push({url:w.url,title:"title"in w&&typeof w.title==="string"?w.title:void 0})}let L={inputTokens:U,outputTokens:B};if(B>Lt0&&Q.objectStorage){let w=`web-search/${crypto.randomUUID()}.md`,E=new TextEncoder().encode(J);try{return await Q.objectStorage.put(w,E,{contentType:"text/markdown"}),{text:J,citations:O,usage:L,resultUri:XN(w),preview:uO(J)}}catch(j){console.error("[web-search] Failed to upload to storage, returning inline",j)}}return{text:J,citations:O,usage:L,resultUri:null}}var IW$=D(()=>{c4();W4();RW$();_8();RD0();$N()});function qW$($){let{writer:Z,toolOutputMap:X,objectStorage:Q,imageTool:Y}=$,G={user_ask:zD0,todo_write:PD0,propose_plan:TD0,read_tool_output:wD0({toolOutputMap:X})};if(Y)G.generate_image=pn("generate_image",dn,qD0(Z,{...Y,objectStorage:Q}),null);return G}var MW$=D(()=>{Jt0();Wt0();Kt0();$N();mn();Nt0()});async function MD0($,Z,X){let Q=await $.findById(Z,X);if(!Q||Q.organization_id!==X)throw Error(`Virtual MCP not found: ${Z}`);return Q}function tn($,Z=Date.now()){let X=new Date($.updated_at).getTime(),Q=$.last_progress_at?new Date($.last_progress_at).getTime():Number.NaN,Y=Math.max(Number.isFinite(X)?X:Number.NEGATIVE_INFINITY,Number.isFinite(Q)?Q:Number.NEGATIVE_INFINITY);return!Number.isFinite(Y)||Z-Y>Et0}function FJ($,Z=Date.now()){let X=$.status;if(X==="in_progress"&&tn($,Z))X="expired";return{id:$.id,organization_id:$.organization_id,title:$.title,description:$.description,created_at:$.created_at,updated_at:$.updated_at,created_by:$.created_by,updated_by:$.updated_by,hidden:$.hidden??!1,status:X,virtual_mcp_id:$.virtual_mcp_id||void 0,trigger_id:$.trigger_id,branch:$.branch,harness_id:$.harness_id,metadata:$.metadata&&Object.keys($.metadata).length>0?$.metadata:void 0,run_config:$.run_config}}var Et0=1800000;var jt0,on;var kD0=D(()=>{jt0=["in_progress","requires_action","failed","completed"],on=["ended_after_delivery","superseded"]});import{z as I$}from"zod";var kW$,SN4,VW$,SK,SW$,CW$;var zC=D(()=>{kD0();cy();kW$=I$.object({id:I$.string().describe("Unique message ID"),thread_id:I$.string().describe("ID of the parent thread"),metadata:I$.unknown().optional().describe("Optional message metadata"),parts:I$.array(I$.record(I$.string(),I$.unknown())).describe("Message content parts (AI SDK UIMessagePart format)"),role:I$.enum(["user","assistant","system"]).describe("Message role"),created_at:I$.string().datetime().describe("Timestamp of creation"),updated_at:I$.string().datetime().describe("Timestamp of last update")}),SN4=I$.object({toolName:I$.string().describe("Fully qualified tool name"),appId:I$.string().describe("App ID that owns the tool"),args:I$.record(I$.string(),I$.unknown()).describe("Arguments used when expanding the tool"),expandedAt:I$.string().datetime().describe("When the tool was expanded")}),VW$=I$.object({expanded_tools:I$.array(SN4).optional(),read_only:I$.boolean().optional().describe("The thread takes no further input (an autonomous run the user cannot continue)"),runtime:I$.enum(vn0).optional().describe("Session runtime, stamped once at creation and immutable afterwards: 'cms' is a sandbox-less content session, 'sandbox' a coding session with a pod. Absent only on threads created before the stamp existed.")}).catchall(I$.unknown()),SK=I$.object({id:I$.string().describe("Unique thread ID"),organization_id:I$.string().describe("Organization this thread belongs to"),title:I$.string().describe("Thread title"),description:I$.string().nullable().describe("Thread description"),created_at:I$.string().datetime().describe("Timestamp of creation"),updated_at:I$.string().datetime().describe("Timestamp of last update"),hidden:I$.boolean().optional().describe("Whether the thread is hidden"),status:I$.enum([...jt0,"expired"]).describe("Thread execution status. 'expired' is virtual -- computed at read time for stale in_progress threads"),created_by:I$.string().describe("User ID who created the thread"),updated_by:I$.string().optional().describe("User ID who last updated the thread"),virtual_mcp_id:I$.string().optional().describe("Virtual MCP (agent) this thread was initiated with"),trigger_id:I$.string().nullable().optional().describe("Automation trigger that created this thread; null/absent for human-initiated threads."),branch:I$.string().nullable().optional().describe("Git branch this thread is pinned to (GitHub-linked vms only)"),harness_id:I$.string().nullable().optional().describe("Pinned on first message; selects which harness runs the thread (e.g. 'claude-code', 'codex', 'decopilot')."),metadata:VW$.optional().describe("Free-form per-thread UI state (e.g. expanded_tools)"),run_config:I$.record(I$.string(),I$.unknown()).nullable().optional().describe("Persisted run configuration (contains agent and model info)")}),SW$=I$.object({id:I$.string().optional().describe("Optional custom ID for the thread"),title:I$.string().optional().describe("Thread title"),description:I$.string().nullish().describe("Thread description"),virtual_mcp_id:I$.string().describe("Virtual MCP (agent) this thread is bound to"),branch:I$.string().min(1).optional().describe("Preferred branch. Used only when the vMCP has a githubRepo; ignored otherwise. When omitted, the server picks the most-recently-touched branch from the user's sandboxMap, falling back to a freshly generated name."),runtime:I$.enum(vn0).optional().describe("Session runtime for the new thread, honored verbatim and immutable for the thread's life. 'sandbox' starts a coding session even on a Fast Preview project, sharing the given branch (it continues the CMS draft). Omitted \u21D2 stamped with the project's default (Fast Preview capable \u21D2 'cms', else 'sandbox').")}),CW$=I$.object({title:I$.string().optional().describe("New thread title"),description:I$.string().nullish().describe("New thread description"),hidden:I$.boolean().optional().describe("Whether the thread is hidden"),status:I$.enum(jt0).optional().describe("New thread status (user-set override). 'expired' is a computed virtual status and cannot be set directly."),metadata:VW$.superRefine(($,Z)=>{if("sandboxMap"in $)Z.addIssue({code:"custom",path:["sandboxMap"],message:"sandboxMap is managed by the sandbox lifecycle"})}).optional().describe("Full replacement of the thread's user-managed metadata"),branch:I$.string().min(1).nullish().describe("New git branch for this thread"),virtual_mcp_id:I$.string().optional().describe("Re-point the thread at a different agent. Only meaningful for an unsent thread (changing the recipient of a new chat); the UI restricts it accordingly.")})});import{z as sY}from"zod";var CN4,_N4,PC;var zt0=D(()=>{nG();M0();zC();CN4=q3.extend({where:sY.object({created_by:sY.string().optional(),trigger_ids:sY.array(sY.string()).max(1000).optional(),virtual_mcp_id:sY.string().optional(),hidden:sY.boolean().optional(),has_trigger:sY.boolean().optional()}).optional(),startDate:sY.string().datetime().optional().describe("Filter threads updated at or after this ISO timestamp"),endDate:sY.string().datetime().optional().describe("Filter threads updated at or before this ISO timestamp"),search:sY.string().optional().describe("Full-text search on thread title (case-insensitive)"),status:sY.string().optional().describe("Filter by thread status (e.g. completed, failed, in_progress)"),userId:sY.string().optional().describe("Filter by the user who created the thread"),agentId:sY.string().optional().describe("Filter by agent (connection or virtual MCP) ID")}),_N4=IH(SK),PC=u({name:"COLLECTION_THREADS_LIST",description:"List threads with filtering, sorting, and pagination.",annotations:{title:"List Threads",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:CN4,outputSchema:_N4,handler:async($,Z)=>{await Z.access.check();let X=Z.auth.user?.id;if(!X)throw Error("User ID required to list threads");r(Z);let Q=$.offset??0,Y=$.limit??100,G=$.where?.trigger_ids,J=$.where?.virtual_mcp_id,W=$.userId??($.where?.created_by==="me"?X:$.where?.created_by),{threads:K,total:F}=G?.length?await Z.storage.threads.listByTriggerIds(G,{limit:Y,offset:Q}):await Z.storage.threads.list(W,{limit:Y,offset:Q,virtualMcpId:J,startDate:$.startDate,endDate:$.endDate,search:$.search,status:$.status,agentId:$.agentId,includeArchived:$.where?.hidden,hasTrigger:$.where?.has_trigger}),H=Q+Y<F,N=Date.now();return{items:K.map((U)=>FJ(U,N)),totalCount:F,hasMore:H}}})});var vN4,AC;var Pt0=D(()=>{nG();M0();zC();vN4=Gp(SK),AC=u({name:"COLLECTION_THREADS_GET",description:"Get a thread's details and metadata by ID.",annotations:{title:"Get Thread",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:Yp,outputSchema:vN4,handler:async($,Z)=>{o(Z),r(Z),await Z.access.check();let X=await Z.storage.threads.get($.id);if(!X)return{item:null};return{item:FJ(X)}}})});import{z as fN4}from"zod";function _W$($){if(!$)return null;if("field"in $&&$.field[0]==="thread_id"&&$.operator==="eq")return String($.value);if("conditions"in $&&($.operator==="and"||$.operator==="or"))for(let Z of $.conditions){let X=_W$(Z);if(X)return X}return null}var bN4,xN4,TC;var At0=D(()=>{nG();M0();zC();bN4=q3.extend({thread_id:fN4.string().optional().describe("ID of the thread to list messages for (required)")}),xN4=IH(kW$),TC=u({name:"COLLECTION_THREAD_MESSAGES_LIST",description:"List messages in a thread with pagination. Requires thread_id. Returns messages in chronological order.",annotations:{title:"List Thread Messages",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:bN4,outputSchema:xN4,handler:async($,Z)=>{r(Z),await Z.access.check();let X=$.thread_id??_W$($.where);if(!X)throw Error("thread_id is required (provide as top-level param or in where clause)");let Q=$.offset??0,Y=$.limit??100,G=$.orderBy?.[0]?.direction??"asc",J=await Z.storage.threads.get(X);if(!J)return{items:[],totalCount:0,hasMore:!1};if(J.message_storage_version===2){let{messages:H,total:N}=await Z.storage.threads.messageParts().loadWindow(X,{limit:Y,offset:Q,includeInFlight:!0});return{items:H.map((U)=>({id:U.id,thread_id:X,role:U.role,parts:U.parts,metadata:U.metadata??null,created_at:U.created_at,updated_at:U.created_at})),totalCount:N,hasMore:Q+Y<N}}let{messages:W,total:K}=await Z.storage.threads.listMessages(X,{limit:Y,offset:Q,sort:G}),F=Q+Y<K;return{items:W,totalCount:K,hasMore:F}}})});function vW$($){return{search_threads:h$({description:PC.description,inputSchema:Z0(PC.inputSchema),execute:(Z)=>PC.execute(Z,$)}),get_thread:h$({description:AC.description,inputSchema:Z0(AC.inputSchema),execute:(Z)=>AC.execute(Z,$)}),list_thread_messages:h$({description:TC.description,inputSchema:Z0(TC.inputSchema),execute:(Z)=>TC.execute(Z,$)})}}var fW$=D(()=>{c4();zt0();Pt0();At0()});function It0($){let Z=$.type;if(typeof Z!=="string")return!1;if(Z==="text"||Z==="reasoning")return $.state!=="streaming";if(Z==="step-start")return!1;if(Z.startsWith("tool-")||Z==="dynamic-tool")return $.state==="approval-requested"||Z==="tool-user_ask"&&$.state==="input-available"||$.state==="output-available"||$.state==="output-error"||$.state==="output-denied";return!0}function Tt0($){let Z=$.type??"";if(Z==="reasoning")return"reasoning";if(Z==="file")return"file";if(Z.startsWith("tool-")||Z==="dynamic-tool")return $.state==="output-available"||$.state==="output-error"||$.state==="output-denied"?"tool_result":"tool_call";return"text"}class qt0{ctx;base;seqByPart=new Map;emitted=new Set;finished=new Set;partKeyByRowId=new Map;finishMessageIdByRowId=new Map;nextSeq=0;constructor($){this.ctx=$;this.base=$.baseTimeMs??Date.now()}hasEmittedContentFor($){let Z=`${$}#`;for(let X of this.emitted)if(X.startsWith(Z))return!0;return!1}seqFor($){let Z=this.seqByPart.get($);if(Z!==void 0)return Z;let X=this.nextSeq++;return this.seqByPart.set($,X),X}row($,Z,X,Q,Y,G=null){return{id:`${this.ctx.runId}:${$}:${X}`,seq:X,org_id:this.ctx.orgId,thread_id:this.ctx.threadId,run_id:this.ctx.runId,message_id:$,role:Z,kind:Q,payload:Y,payload_ref:null,metadata:G,created_at:new Date(this.base+X).toISOString()}}emitMessageParts($){let Z=$.parts??[],X=[];for(let Q=0;Q<Z.length;Q++){let Y=Z[Q];if(!It0(Y))continue;let G=`${$.id}#${Q}`;if(this.emitted.has(G))continue;let J=this.seqFor(G),W=this.row($.id,$.role,J,Tt0(Y),Rt0(Y));this.partKeyByRowId.set(W.id,G),X.push(W)}return X}emitRequestMessageParts($){let Z=$.parts??[],X=[];for(let Q=0;Q<Z.length;Q++){let Y=Z[Q],G=`${$.id}#${Q}`,J=this.seqFor(G),W=this.row($.id,$.role,J,Tt0(Y),Rt0(Y));this.partKeyByRowId.set(W.id,G),X.push(W)}return X}markFinished($,Z,X=null){if(this.finished.has($))return[];let Q=this.seqFor(`${$}#finish`),Y=this.row($,Z,Q,"finish",{},X);return this.finishMessageIdByRowId.set(Y.id,$),[Y]}markRequestFinished($,Z,X=null){let Q=this.seqFor(`${$}#finish`),Y=this.row($,Z,Q,"finish",{},X);return this.finishMessageIdByRowId.set(Y.id,$),[Y]}acknowledge($){for(let Z of $){let X=this.partKeyByRowId.get(Z.id);if(X!==void 0)this.emitted.add(X);let Q=this.finishMessageIdByRowId.get(Z.id);if(Q!==void 0)this.finished.add(Q)}}emitUserMessage($){return[...this.emitMessageParts($),...this.markFinished($.id,$.role,$.metadata??null)]}emitRequestMessage($){return[...this.emitRequestMessageParts($),...this.markRequestFinished($.id,$.role,$.metadata??null)]}emitStepParts($){return this.emitMessageParts($)}emitFinal($){let Z=this.emitMessageParts($);if(Z.length===0&&!this.hasEmittedContentFor($.id))return Z;return[...Z,...this.markFinished($.id,$.role,$.metadata??null)]}emitFinalSnapshot($){let Z=$.parts??[],X=[];for(let G=0;G<Z.length;G++){let J=Z[G];if(!It0(J))continue;let W=`${$.id}#${G}`,K=this.seqFor(W),F=this.row($.id,$.role,K,Tt0(J),Rt0(J));this.partKeyByRowId.set(F.id,W),X.push(F)}if(X.length===0&&!this.hasEmittedContentFor($.id))return X;let Q=this.seqFor(`${$.id}#finish`),Y=this.row($.id,$.role,Q,"finish",{},$.metadata??null);return this.finishMessageIdByRowId.set(Y.id,$.id),[...X,Y]}emitError($,Z){let X=`${$}#error`,Q=[];if(!this.emitted.has(X)){let Y=this.seqFor(X),G=this.row($,"assistant",Y,"error",{type:"text",text:`Error: ${bW$(Z)}`});this.partKeyByRowId.set(G.id,X),Q.push(G)}return[...Q,...this.markFinished($,"assistant")]}}function bW$($){if($.length<=VD0)return $;let Z=$.length-VD0;return`${$.slice(0,VD0)}\u2026 [truncated ${Z} characters]`}function Rt0($){let Z=$.errorText;if(typeof Z!=="string"||Z.length<=VD0)return $;return{...$,errorText:bW$(Z)}}var VD0=8000;class JX{ctx;builder;constructor($){this.ctx=$;this.builder=new qt0($)}async appendBuiltRows($){await this.ctx.storage.appendParts($),this.builder.acknowledge($)}async emitUserMessage($){await this.appendBuiltRows(this.builder.emitUserMessage($))}async emitRequestMessage($){let Z=this.builder.emitRequestMessage($);await this.ctx.storage.replaceMessageParts(this.ctx.threadId,$.id,Z),this.builder.acknowledge(Z)}async emitStepParts($){await this.appendBuiltRows(this.builder.emitStepParts($))}async emitFinal($){await this.appendBuiltRows(this.builder.emitFinal($))}async replaceFinal($){let Z=this.builder.emitFinalSnapshot($);await this.ctx.storage.replaceMessageParts(this.ctx.threadId,$.id,Z),this.builder.acknowledge(Z)}async emitError($,Z){await this.appendBuiltRows(this.builder.emitError($,Z))}}var iO=()=>{};async function ey($,Z,X,Q){let Y=Z.organizationId,G=await lZ($,"smart"),J=X.virtual_mcp_id??Pw(Y),W={id:Q.messageId,role:"user",parts:[{type:"text",text:Q.prompt}],metadata:{created_at:new Date().toISOString()}};await new JX({storage:$.storage.threads.messageParts(),orgId:Y,threadId:X.id,runId:X.id}).emitRequestMessage(W),await QN({threadId:X.id,source:"background-tool",request:{messages:[W],models:{credentialId:G.credentialId,thinking:{id:G.modelId,title:G.modelMeta.title}},agent:{id:J,...Q.agent??{}},temperature:0.5,toolApprovalLevel:"auto",mode:"default",organizationId:Y,userId:Z.assignedBy??Z.createdBy,harnessId:X.harness_id==="claude-code"?"claude-code":"decopilot",...X.branch?{branch:X.branch}:{},taskId:X.id,runMetadata:{...XD0(Z),...Q.runClass?{[ny]:Q.runClass}:{}}}},{workflowID:Q.workflowID})}var SD0=D(()=>{fn();iO();aH();YN();ty();_8()});var CD0,xW$="notification.created";var _D0=D(()=>{CD0=["created","commented","mentioned","status_changed","assignee_changed","review_requested","review_approved","review_changes_requested","merge_failed"]});class hW${listeners=new Map;totalCount=0;strategy=null;started=!1;async start($){if(this.started){if(!$)return;await this.stop()}this.strategy=$,await this.strategy.start((Z,X)=>this.localEmit(Z,X)),this.started=!0}async stop(){if(!this.started||!this.strategy)return;await this.strategy.stop(),this.started=!1}add($){if(this.totalCount>=gW$)return console.warn(`[SSEHub] Total connection limit reached (${gW$})`),null;let Z=this.listeners.get($.organizationId);if(!Z)Z=new Map,this.listeners.set($.organizationId,Z);if(Z.size>=yW$)return console.warn(`[SSEHub] Per-org connection limit reached for ${$.organizationId} (${yW$})`),null;return Z.set($.id,$),this.totalCount++,$.id}remove($,Z){let X=this.listeners.get($);if(!X)return;if(X.delete(Z)){if(this.totalCount--,X.size===0)this.listeners.delete($)}}emit($,Z){if(this.strategy)this.strategy.broadcast($,Z);else this.localEmit($,Z)}countForOrg($){return this.listeners.get($)?.size??0}get count(){return this.totalCount}localEmit($,Z){let X=this.listeners.get($);if(!X||X.size===0)return;for(let Q of X.values()){if(Q.typePatterns&&!yN4(Z.type,Q.typePatterns))continue;try{Q.push(Z)}catch{this.remove($,Q.id)}}}}function yN4($,Z){for(let X of Z){if(X===$)return!0;if(X.endsWith(".*")){let Q=X.slice(0,-1);if($.startsWith(Q))return!0}}return!1}var yW$=50,gW$=500,C5;var rn=D(()=>{I6();C5=new hW$;w$.createObservableGauge("sse_hub.connections",{description:"Active SSE listeners held by this pod",unit:"{connections}"}).addCallback(($)=>$.observe(C5.count))});function gN4($){return $.replace(/[^a-zA-Z]/g,"").toUpperCase().slice(0,4)||"TASK"}function uW$($,Z,X){let Q=X?.trim();if(Q)return Q;if(Z==null)return null;return`${gN4($)}-${String(Z).padStart(2,"0")}`}var lW$=()=>{};function Mt0($){return $.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function uN4($,Z){let X=$.taskKeySeq===null?null:uW$($.orgSlug,$.taskKeySeq),Q=Mt0($.actorName??"The agent"),Y=Mt0($.taskTitle),G=X?`${Mt0(X)} \xB7 ${Y}`:Y,J=X?`<a href="${Z}/${encodeURIComponent($.orgSlug)}/t/${encodeURIComponent(X)}" style="color:#141413;">${G}</a>`:G;return`<p style="margin:0 0 12px 0;font-size:14px;color:#141413;line-height:1.6;font-family:Inter,system-ui,sans-serif;">${Q} ${hN4[$.type]} ${J}</p>`}function cW$($,Z){let X=$.length===1?"1 update on your tasks":`${$.length} updates on your tasks`;return{subject:X,html:A3({preheader:X,heading:X,body:$.map((Q)=>uN4(Q,Z)).join(`
|
|
1310
|
-
`),footnote:"You received this because you follow these tasks. Open a task and use Unfollow to stop."})}}var hN4;var dW$=D(()=>{lW$();hN4={created:"created",commented:"commented on",mentioned:"mentioned you on",status_changed:"moved",assignee_changed:"reassigned",review_requested:"requested review on",review_approved:"approved",review_changes_requested:"requested changes on",merge_failed:"couldn't merge"}});import{z as an}from"zod";var $g;var vD0=D(()=>{$g=an.object({taskTitle:an.string(),taskKeySeq:an.number().int().nullable(),actorName:an.string().nullable(),actorImage:an.string().nullable()})});import{DBOS as CK,SchedulerMode as lN4}from"@dbos-inc/dbos-sdk";function mW$($){St0=$}function _t0(){if(!St0)throw Error("[notifications] runtime not initialized \u2014 setNotificationDigestRuntime() must run before the workflow fires");return St0}function iW$(){return _t0().db.selectFrom("notifications as n").innerJoin("organization as o","o.id","n.organization_id").innerJoin("user as u","u.id","n.user_id").innerJoin("member as m",($)=>$.onRef("m.userId","=","n.user_id").onRef("m.organizationId","=","n.organization_id")).select(["n.id as id","n.user_id as userId","n.type as type","n.data as data","o.slug as orgSlug","u.email as email"]).where("n.emailed_at","is",null).where("n.read_at","is",null).orderBy("n.created_at","asc").limit(mN4)}function pW$($){return $.map((Z)=>{let X=$g.parse(Z.data);return{id:Z.id,userId:Z.userId,email:Z.email,type:Z.type,orgSlug:Z.orgSlug,taskTitle:X.taskTitle,taskKeySeq:X.taskKeySeq,actorName:X.actorName}})}async function pN4($){return pW$(await iW$().where("n.user_id","=",$).execute())}async function nN4($){return pW$(await iW$().where("n.created_at","<",$).execute())}async function tN4($){if($.length===0)return new Set;let Z=await _t0().db.updateTable("notifications").set({emailed_at:new Date}).where("id","in",$).where("emailed_at","is",null).returning("id").execute();return new Set(Z.map((X)=>X.id))}function oN4($){let Z=new Map;for(let X of $){let Q=Z.get(X.userId);if(Q)Q.push(X);else Z.set(X.userId,[X])}return[...Z.values()]}function vt0(){let $=PH().auth,Z=$.emailProviders??[],X=$.inviteEmailProviderId?P3(Z,$.inviteEmailProviderId):Z[0];return X?z3(X):null}async function rN4($){let Z=vt0();if(!Z)throw Error("no email provider configured");let{subject:X,html:Q}=cW$($,e5());await Z({to:$[0].email,subject:X,html:Q})}async function aN4($){await _t0().db.deleteFrom("notifications").where("created_at","<",$).execute()}async function nW$($,Z){if($.length===0)return;let X=await CK.runStep(()=>tN4($.map((Y)=>Y.id)),{name:`claimForEmail:${Z}`}),Q=$.filter((Y)=>X.has(Y.id));if(Q.length===0)return;await CK.runStep(()=>rN4(Q),{name:`sendDigest:${Z}`})}async function sN4($,Z){let X=Z-Date.now();if(X>0)await CK.sleep(X);if(!vt0())return;let Q=await CK.runStep(()=>pN4($),{name:"loadPendingForUser"});try{await nW$(Q,$)}catch(Y){console.warn(`[notifications] digest for ${$} failed:`,Y instanceof Error?Y.message:Y)}}async function eN4($,Z){let X=new Date($.getTime()-Vt0-dN4),Q=vt0()?await CK.runStep(()=>nN4(X),{name:"loadOrphanedNotifications"}):[];for(let Y of oN4(Q)){let G=Y[0].userId;try{await nW$(Y,G)}catch(J){console.warn(`[notifications] sweep digest for ${G} failed:`,J instanceof Error?J.message:J)}}if($.getUTCMinutes()<2)await CK.runStep(()=>aN4(new Date($.getTime()-iN4)),{name:"pruneOldNotifications"})}function tW$($){if(!Ct0)return;let Z=Math.floor(Date.now()/Vt0),X=(Z+1)*Vt0;CK.startWorkflow(Ct0,{workflowID:`notif-digest:${$}:${Z}`})($,X).catch((Q)=>{console.debug("[notifications] digest enqueue skipped:",Q instanceof Error?Q.message:Q)})}function oW$(){if(kt0)return;Ct0=CK.registerWorkflow(sN4,{name:"notificationUserDigestWorkflow"}),kt0=CK.registerWorkflow(eN4,{name:"notificationDigestWorkflow"}),CK.registerScheduled(kt0,{name:"notificationDigestWorkflow",crontab:cN4,mode:lN4.ExactlyOncePerIntervalWhenActive})}var cN4="*/2 * * * *",Vt0=30000,dN4=60000,mN4=500,iN4=2592000000,St0=null,kt0=null,Ct0=null;var ft0=D(()=>{g50();$9();mx();dW$();vD0()});async function $U4($,Z){return await $.selectFrom("task_board_items").select(["organization_id","title","key_seq"]).where("id","=",Z).executeTakeFirst()}async function ZU4($,Z){if(!Z)return{name:null,image:null};let X=await $.selectFrom("user").select(["name","image"]).where("id","=",Z).executeTakeFirst();return{name:X?.name??null,image:X?.image??null}}async function Zg($){let{db:Z,taskBoardItemId:X,type:Q,actorId:Y}=$;try{let G=[],J=await $U4(Z,X);if(!J)return;let W=async(K)=>{let F=[...new Set($.alsoSubscribe?.filter((L)=>!!L))];if(F.length>0)await K.insertInto("notification_subscriptions").values(F.map((L)=>({id:i$("nsub"),user_id:L,task_board_item_id:X}))).onConflict((L)=>L.columns(["user_id","task_board_item_id"]).doNothing()).execute();let H=$.recipients,U=(H?[...new Set(H.filter((L)=>!!L))]:(await K.selectFrom("notification_subscriptions").select("user_id").where("task_board_item_id","=",X).where("subscribed","=",!0).execute()).map((L)=>L.user_id)).filter((L)=>L!==Y);if(U.length===0)return;G=U;let B=await ZU4(K,Y),O=$g.parse({taskTitle:J.title,taskKeySeq:J.key_seq??null,actorName:B.name,actorImage:B.image});await K.insertInto("notifications").values(U.map((L)=>({id:i$("notif"),user_id:L,organization_id:J.organization_id,task_board_item_id:X,type:Q,actor_id:Y,data:JSON.stringify(O)}))).execute()};await(Z.isTransaction?W(Z):Z.transaction().execute(W));for(let K of G)tW$(K),C5.emit(J.organization_id,{id:crypto.randomUUID(),type:xW$,source:"notifications",subject:K,time:new Date().toISOString()})}catch(G){console.error("[notifications] fan-out failed",G)}}var fD0=D(()=>{SZ();_D0();rn();ft0();vD0()});import{sql as pO}from"kysely";function QU4($){return XU4.has($)?$:null}function bD0($){let Z=(X)=>X instanceof Date?X.toISOString():X;return{id:$.id,taskBoardItemId:$.task_board_item_id,parentId:$.parent_id,authorId:$.author_id,threadId:$.thread_id,body:$.body,resolved:$.resolved,createdAt:Z($.created_at),updatedAt:Z($.updated_at)}}function rW$($){if($&&typeof $==="object"&&!Array.isArray($)){let Z=$.text;if(typeof Z==="string"&&Z.trim())return Z.trim()}return null}function bt0($,Z=!1){if($.status!=="in_progress")return!1;let X=$.threads.filter((Q)=>Q.hasMessages);if(X.length===0)return!1;if($.repo!=null&&!Z)return!1;if(!X.every((Q)=>Q.status!==null&&sn.has(Q.status)))return!1;return X.some((Q)=>Q.status==="completed")}function WU4($){let Z=typeof $==="string"?(()=>{try{return JSON.parse($)}catch{return null}})():$;if(!Z||typeof Z!=="object")return!1;let X=Z.githubRepo?.url;return typeof X==="string"&&X.length>0}function KU4($){if($===null||$===void 0)return null;let Z=typeof $==="number"?$:Number($);return Number.isFinite(Z)?Z:null}function FU4($,Z){let X=(G)=>G instanceof Date?G.getTime():new Date(G).getTime(),Q=X($),Y=Z===null?Number.NEGATIVE_INFINITY:X(Z);return new Date(Math.max(Q,Y)).toISOString()}class ZQ{db;constructor($){this.db=$}inTransaction($){return this.db.isTransaction?$(this.db):this.db.transaction().execute($)}async list($){let X=(await this.db.selectFrom("task_board_items").selectAll().where("organization_id","=",$).where("dismissed_at","is",null).orderBy("sort_order","asc").execute()).map((Q)=>this.itemFromDbRow(Q));return await this.attachRefs(X,$),X}async getById($,Z){let X=await this.db.selectFrom("task_board_items").selectAll().where("id","=",$).where("organization_id","=",Z).executeTakeFirst();if(!X)return null;let Q=this.itemFromDbRow(X);return await this.attachRefs([Q],Z),Q}async create($){let Z=i$("board"),X=new Date().toISOString(),Q=$.status??"triage",Y=(J)=>J.insertInto("task_board_items").values({id:Z,organization_id:$.organizationId,title:$.title,description:$.description??null,status:Q,priority:$.priority??"medium",type:$.type??xd0,assignee_id:$.assigneeId??null,assigned_by:$.assignedBy??null,repo:$.repo??null,due_date:$.dueDate??null,sprint_id:$.sprintId??null,external_key:$.externalKey??null,sort_order:pO`(
|
|
1310
|
+
`),footnote:"You received this because you follow these tasks. Open a task and use Unfollow to stop."})}}var hN4;var dW$=D(()=>{lW$();hN4={created:"created",commented:"commented on",mentioned:"mentioned you on",status_changed:"moved",assignee_changed:"reassigned",review_requested:"requested review on",review_approved:"approved",review_changes_requested:"requested changes on",merge_failed:"couldn't merge"}});import{z as an}from"zod";var $g;var vD0=D(()=>{$g=an.object({taskTitle:an.string(),taskKeySeq:an.number().int().nullable(),actorName:an.string().nullable(),actorImage:an.string().nullable()})});import{DBOS as CK,SchedulerMode as lN4}from"@dbos-inc/dbos-sdk";function mW$($){St0=$}function _t0(){if(!St0)throw Error("[notifications] runtime not initialized \u2014 setNotificationDigestRuntime() must run before the workflow fires");return St0}function iW$(){return _t0().db.selectFrom("notifications as n").innerJoin("organization as o","o.id","n.organization_id").innerJoin("user as u","u.id","n.user_id").innerJoin("member as m",($)=>$.onRef("m.userId","=","n.user_id").onRef("m.organizationId","=","n.organization_id")).select(["n.id as id","n.user_id as userId","n.type as type","n.data as data","o.slug as orgSlug","u.email as email"]).where("n.emailed_at","is",null).where("n.read_at","is",null).orderBy("n.created_at","asc").limit(mN4)}function pW$($){return $.map((Z)=>{let X=$g.parse(Z.data);return{id:Z.id,userId:Z.userId,email:Z.email,type:Z.type,orgSlug:Z.orgSlug,taskTitle:X.taskTitle,taskKeySeq:X.taskKeySeq,actorName:X.actorName}})}async function pN4($){return pW$(await iW$().where("n.user_id","=",$).execute())}async function nN4($){return pW$(await iW$().where("n.created_at","<",$).execute())}async function tN4($){if($.length===0)return new Set;let Z=await _t0().db.updateTable("notifications").set({emailed_at:new Date}).where("id","in",$).where("emailed_at","is",null).returning("id").execute();return new Set(Z.map((X)=>X.id))}function oN4($){let Z=new Map;for(let X of $){let Q=Z.get(X.userId);if(Q)Q.push(X);else Z.set(X.userId,[X])}return[...Z.values()]}function vt0(){let $=PH().auth,Z=$.emailProviders??[],X=$.inviteEmailProviderId?P3(Z,$.inviteEmailProviderId):Z[0];return X?z3(X):null}async function rN4($){let Z=vt0();if(!Z)throw Error("no email provider configured");let{subject:X,html:Q}=cW$($,e5());await Z({to:$[0].email,subject:X,html:Q})}async function aN4($){await _t0().db.deleteFrom("notifications").where("created_at","<",$).execute()}async function nW$($,Z){if($.length===0)return;let X=await CK.runStep(()=>tN4($.map((Y)=>Y.id)),{name:`claimForEmail:${Z}`}),Q=$.filter((Y)=>X.has(Y.id));if(Q.length===0)return;await CK.runStep(()=>rN4(Q),{name:`sendDigest:${Z}`})}async function sN4($,Z){let X=Z-Date.now();if(X>0)await CK.sleep(X);if(!vt0())return;let Q=await CK.runStep(()=>pN4($),{name:"loadPendingForUser"});try{await nW$(Q,$)}catch(Y){console.warn(`[notifications] digest for ${$} failed:`,Y instanceof Error?Y.message:Y)}}async function eN4($,Z){let X=new Date($.getTime()-Vt0-dN4),Q=vt0()?await CK.runStep(()=>nN4(X),{name:"loadOrphanedNotifications"}):[];for(let Y of oN4(Q)){let G=Y[0].userId;try{await nW$(Y,G)}catch(J){console.warn(`[notifications] sweep digest for ${G} failed:`,J instanceof Error?J.message:J)}}if($.getUTCMinutes()<2)await CK.runStep(()=>aN4(new Date($.getTime()-iN4)),{name:"pruneOldNotifications"})}function tW$($){if(!Ct0)return;let Z=Math.floor(Date.now()/Vt0),X=(Z+1)*Vt0;CK.startWorkflow(Ct0,{workflowID:`notif-digest:${$}:${Z}`})($,X).catch((Q)=>{console.debug("[notifications] digest enqueue skipped:",Q instanceof Error?Q.message:Q)})}function oW$(){if(kt0)return;Ct0=CK.registerWorkflow(sN4,{name:"notificationUserDigestWorkflow"}),kt0=CK.registerWorkflow(eN4,{name:"notificationDigestWorkflow"}),CK.registerScheduled(kt0,{name:"notificationDigestWorkflow",crontab:cN4,mode:lN4.ExactlyOncePerIntervalWhenActive})}var cN4="*/2 * * * *",Vt0=30000,dN4=60000,mN4=500,iN4=2592000000,St0=null,kt0=null,Ct0=null;var ft0=D(()=>{g50();$9();mx();dW$();vD0()});async function $U4($,Z){return await $.selectFrom("task_board_items").select(["organization_id","title","key_seq"]).where("id","=",Z).executeTakeFirst()}async function ZU4($,Z){if(!Z)return{name:null,image:null};let X=await $.selectFrom("user").select(["name","image"]).where("id","=",Z).executeTakeFirst();return{name:X?.name??null,image:X?.image??null}}async function Zg($){let{db:Z,taskBoardItemId:X,type:Q,actorId:Y}=$;try{let G=[],J=await $U4(Z,X);if(!J)return;let W=async(K)=>{let F=[...new Set($.alsoSubscribe?.filter((L)=>!!L))];if(F.length>0)await K.insertInto("notification_subscriptions").values(F.map((L)=>({id:i$("nsub"),user_id:L,task_board_item_id:X}))).onConflict((L)=>L.columns(["user_id","task_board_item_id"]).doNothing()).execute();let H=$.recipients,U=(H?[...new Set(H.filter((L)=>!!L))]:(await K.selectFrom("notification_subscriptions").select("user_id").where("task_board_item_id","=",X).where("subscribed","=",!0).execute()).map((L)=>L.user_id)).filter((L)=>L!==Y);if(U.length===0)return;G=U;let B=await ZU4(K,Y),O=$g.parse({taskTitle:J.title,taskKeySeq:J.key_seq??null,actorName:B.name,actorImage:B.image});await K.insertInto("notifications").values(U.map((L)=>({id:i$("notif"),user_id:L,organization_id:J.organization_id,task_board_item_id:X,type:Q,actor_id:Y,data:JSON.stringify(O)}))).execute()};await(Z.isTransaction?W(Z):Z.transaction().execute(W));for(let K of G)tW$(K),C5.emit(J.organization_id,{id:crypto.randomUUID(),type:xW$,source:"notifications",subject:K,time:new Date().toISOString()})}catch(G){console.error("[notifications] fan-out failed",G)}}var fD0=D(()=>{SZ();_D0();rn();ft0();vD0()});import{sql as pO}from"kysely";function QU4($){return XU4.has($)?$:null}function bD0($){let Z=(X)=>X instanceof Date?X.toISOString():X;return{id:$.id,taskBoardItemId:$.task_board_item_id,parentId:$.parent_id,authorId:$.author_id,threadId:$.thread_id,body:$.body,resolved:$.resolved,createdAt:Z($.created_at),updatedAt:Z($.updated_at)}}function rW$($){if($&&typeof $==="object"&&!Array.isArray($)){let Z=$.text;if(typeof Z==="string"&&Z.trim())return Z.trim()}return null}function bt0($,Z=!1){if($.status!=="in_progress")return!1;let X=$.threads.filter((Q)=>Q.hasMessages);if(X.length===0)return!1;if($.repo!=null&&!Z)return!1;if(!X.every((Q)=>Q.status!==null&&sn.has(Q.status)))return!1;return X.some((Q)=>Q.status==="completed")}function WU4($){let Z=typeof $==="string"?(()=>{try{return JSON.parse($)}catch{return null}})():$;if(!Z||typeof Z!=="object")return!1;let X=Z.githubRepo?.url;return typeof X==="string"&&X.length>0}function KU4($){if($===null||$===void 0)return null;let Z=typeof $==="number"?$:Number($);return Number.isFinite(Z)?Z:null}function FU4($,Z){let X=(G)=>G instanceof Date?G.getTime():new Date(G).getTime(),Q=X($),Y=Z===null?Number.NEGATIVE_INFINITY:X(Z);return new Date(Math.max(Q,Y)).toISOString()}class ZQ{db;constructor($){this.db=$}inTransaction($){return this.db.isTransaction?$(this.db):this.db.transaction().execute($)}async list($){let X=(await this.db.selectFrom("task_board_items").selectAll().where("organization_id","=",$).where("dismissed_at","is",null).orderBy("sort_order","asc").execute()).map((Q)=>this.itemFromDbRow(Q));return await this.attachRefs(X,$),X}async getById($,Z){let X=await this.db.selectFrom("task_board_items").selectAll().where("id","=",$).where("organization_id","=",Z).executeTakeFirst();if(!X)return null;let Q=this.itemFromDbRow(X);return await this.attachRefs([Q],Z),Q}async create($){let Z=i$("board"),X=new Date().toISOString(),Q=$.status??"triage",Y=(J)=>J.insertInto("task_board_items").values({id:Z,organization_id:$.organizationId,title:$.title,description:$.description??null,status:Q,board_column_org:$.boardColumnOrg??null,priority:$.priority??"medium",type:$.type??xd0,assignee_id:$.assigneeId??null,assigned_by:$.assignedBy??null,repo:$.repo??null,due_date:$.dueDate??null,sprint_id:$.sprintId??null,external_key:$.externalKey??null,sort_order:pO`(
|
|
1311
1311
|
select coalesce(min(sort_order), 0) - 1
|
|
1312
1312
|
from task_board_items
|
|
1313
1313
|
where organization_id = ${$.organizationId}
|
|
@@ -1316,7 +1316,7 @@ Guidelines:
|
|
|
1316
1316
|
select coalesce(max(key_seq), 0) + 1
|
|
1317
1317
|
from task_board_items
|
|
1318
1318
|
where organization_id = ${$.organizationId}
|
|
1319
|
-
)`,created_by:$.by,created_at:X,updated_by:$.by,updated_at:X}).returningAll().executeTakeFirstOrThrow(),G=await this.inTransaction(async(J)=>{return await pO`select pg_advisory_xact_lock(hashtext(${`task-board-key-seq:${$.organizationId}`})::bigint)`.execute(J),Y(J)});return this.itemFromDbRow(G)}async update($,Z,X,Q){let Y=await this.db.updateTable("task_board_items").set({...X.title!==void 0?{title:X.title}:{},...X.description!==void 0?{description:X.description}:{},...X.status!==void 0?{status:X.status}:{},...X.priority!==void 0?{priority:X.priority}:{},...X.type!==void 0?{type:X.type}:{},...X.assigneeId!==void 0?{assignee_id:X.assigneeId}:{},...X.assignedBy!==void 0?{assigned_by:X.assignedBy}:{},...X.repo!==void 0?{repo:X.repo}:{},...X.dueDate!==void 0?{due_date:X.dueDate}:{},...X.sprintId!==void 0?{sprint_id:X.sprintId}:{},...X.sortOrder!==void 0?{sort_order:X.sortOrder}:{},...X.status!==void 0&&!JU4.has(X.status)?{review_cycle_started_at:null}:{},updated_by:Q,updated_at:new Date().toISOString()}).where("id","=",$).where("organization_id","=",Z).returningAll().executeTakeFirstOrThrow(),G=this.itemFromDbRow(Y);return await this.attachRefs([G],Z),G}async delete($,Z,X){return this.inTransaction(async(Q)=>{let Y=await Q.selectFrom("task_board_items").select(["created_by"]).where("id","=",$).where("organization_id","=",Z).executeTakeFirst();if(!Y)return!1;if(bQ({createdBy:Y.created_by}))return await Q.updateTable("task_board_items").set({dismissed_at:new Date().toISOString(),updated_by:X}).where("id","=",$).where("organization_id","=",Z).where("dismissed_at","is",null).execute(),!0;return await Q.deleteFrom("task_board_item_threads").where("task_board_item_id","=",$).where("organization_id","=",Z).execute(),await Q.deleteFrom("task_board_item_prs").where("task_board_item_id","=",$).where("organization_id","=",Z).execute(),await Q.deleteFrom("task_board_items").where("id","=",$).where("organization_id","=",Z).execute(),!0})}async dismissedFindingKeys($,Z){if(Z.length===0)return new Set;let X=await this.db.selectFrom("task_board_items").select(["external_key"]).where("organization_id","=",$).where("external_key","in",Z).where("dismissed_at","is not",null).execute();return new Set(X.flatMap((Q)=>Q.external_key??[]))}async listDismissedFindings($){return(await this.db.selectFrom("task_board_items").select(["external_key","updated_by","dismissed_at"]).where("organization_id","=",$).where("dismissed_at","is not",null).orderBy("dismissed_at","desc").execute()).flatMap((X)=>X.external_key&&X.dismissed_at?[{externalKey:X.external_key,dismissedBy:X.updated_by,dismissedAt:X.dismissed_at instanceof Date?X.dismissed_at.toISOString():X.dismissed_at}]:[])}async restoreDismissedFindings($,Z){if(Z&&Z.length===0)return 0;let X=this.db.updateTable("task_board_items").set({dismissed_at:null}).where("organization_id","=",$).where("dismissed_at","is not",null);if(Z)X=X.where("external_key","in",Z);let Q=await X.executeTakeFirst();return Number(Q.numUpdatedRows??0n)}async setItemTags($,Z,X){await this.inTransaction(async(Q)=>{if(await Q.deleteFrom("task_board_item_tags").where("task_board_item_id","=",$).$if(Z.length>0,(Y)=>Y.where("id","not in",Z)).execute(),Z.length>0)await Q.insertInto("task_board_item_tags").values(Z.map((Y)=>({task_board_item_id:$,id:Y,created_by:X,created_at:new Date().toISOString()}))).onConflict((Y)=>Y.doNothing()).execute()})}async addItemTags($,Z,X){if(Z.length===0)return;await this.db.insertInto("task_board_item_tags").values(Z.map((Q)=>({task_board_item_id:$,id:Q,created_by:X,created_at:new Date().toISOString()}))).onConflict((Q)=>Q.doNothing()).execute()}async linkThread($,Z,X){await this.db.insertInto("task_board_item_threads").values({task_board_item_id:$,thread_id:Z,organization_id:X}).onConflict((Q)=>Q.columns(["task_board_item_id","thread_id"]).doNothing()).execute()}async listItemsPendingReview($,Z,X){let Q=this.db.selectFrom("task_board_items").select(["id","organization_id as organizationId","updated_at"]).where((G)=>G.or([G("review_cycle_started_at","is not",null),G("status","=","in_review")])).where("dismissed_at","is",null);if(X)Q=Q.where((G)=>G.or([G("last_swept_at","is",null),G("last_swept_at","<",X)]));if(Z){let G=new Date(Z.updatedAt);Q=Q.where((J)=>J.or([J("updated_at",">",G),J.and([J("updated_at","=",G),J("id",">",Z.id)])]))}return(await Q.orderBy("updated_at","asc").orderBy("id","asc").limit($).execute()).map((G)=>({id:G.id,organizationId:G.organizationId,updatedAt:G.updated_at instanceof Date?G.updated_at.toISOString():String(G.updated_at)}))}async listItemsAwaitingArchive($,Z){return(await this.db.selectFrom("task_board_items as i").select(["i.id","i.organization_id as organizationId"]).where("i.status","=","done").where("i.dismissed_at","is",null).where("i.updated_at","<",$).where((Q)=>Q.exists(Q.selectFrom("task_board_item_prs as p").select("p.url").whereRef("p.task_board_item_id","=","i.id"))).orderBy("i.updated_at","asc").limit(Z).execute()).map((Q)=>({id:Q.id,organizationId:Q.organizationId}))}async listItemsAwaitingMergedTag($,Z){return(await this.db.selectFrom("task_board_items as i").select(["i.id","i.organization_id as organizationId"]).where("i.status","in",HU4).where("i.dismissed_at","is",null).where((Q)=>Q.exists(Q.selectFrom("task_board_item_prs as p").select("p.url").whereRef("p.task_board_item_id","=","i.id"))).where((Q)=>Q.not(Q.exists(Q.selectFrom("task_board_item_tags as t").innerJoin("organization_tags as g","g.id","t.id").select("t.id").whereRef("t.task_board_item_id","=","i.id").where(pO`lower(g.name)`,"=",$)))).orderBy("i.updated_at","desc").limit(Z).execute()).map((Q)=>({id:Q.id,organizationId:Q.organizationId}))}async claimSweep($,Z,X){let Q=await this.db.updateTable("task_board_items").set({last_swept_at:new Date}).where("id","=",$).where("organization_id","=",Z).where((Y)=>Y.or([Y("last_swept_at","is",null),Y("last_swept_at","<",X)])).executeTakeFirst();return Number(Q.numUpdatedRows??0)>0}async failedRunInfo($,Z){let X=await this.db.selectFrom("threads as t").leftJoinLateral((Q)=>Q.selectFrom("thread_message_parts as p").select("p.payload").whereRef("p.thread_id","=","t.id").where("p.kind","=","error").orderBy("p.created_at","desc").limit(1).as("err"),(Q)=>Q.onTrue()).select(["t.status","t.failure_kind as kind","err.payload as payload"]).where("t.id","=",$).where("t.organization_id","=",Z).executeTakeFirst();if(!X||X.status!=="failed")return null;return{kind:X.kind??null,errorText:rW$(X.payload)}}async scheduleRunRetry($,Z,X,Q){return(await this.db.updateTable("task_board_items").set({retry_at:Q,retry_attempts:X}).where("id","=",$).where("organization_id","=",Z).where("status","=","in_progress").where("dismissed_at","is",null).returning("id").execute()).length>0}async returnToTodoAfterFailure($,Z,X){if((await this.db.updateTable("task_board_items").set({status:"todo",retry_at:null,retry_attempts:0,updated_by:X,updated_at:new Date}).where("id","=",$).where("organization_id","=",Z).where("status","=","in_progress").where("dismissed_at","is",null).returning("id").execute()).length===0)return null;return await this.getById($,Z)}async failNeverStartedLinkedThreads($,Z,X){let Q=await this.db.selectFrom("threads as t").innerJoin("task_board_item_threads as l","l.thread_id","t.id").select(["t.id as threadId","l.task_board_item_id as itemId","l.organization_id as organizationId"]).where("t.status","=","in_progress").where("t.run_started_at","is",null).where((W)=>W.and([W("t.updated_at","<",Z),W.or([W("t.last_progress_at","is",null),W("t.last_progress_at","<",Z)])])).limit($).execute();if(Q.length===0)return[];let Y=Q.map((W)=>W.threadId),G=await this.db.updateTable("threads").set({status:"failed",failure_reason:X,failure_kind:"abandoned",run_owner_pod:null,run_config:null,run_started_at:null,updated_at:new Date().toISOString()}).where("id","in",Y).where("status","=","in_progress").returning("id").execute(),J=new Set(G.map((W)=>W.id));return Q.filter((W)=>J.has(W.threadId))}async relabelDeliveredFailure($,Z,X){return(await this.db.updateTable("threads").set({failure_reason:X,failure_kind:"ended_after_delivery",updated_at:new Date().toISOString()}).where("id","=",$).where("organization_id","=",Z).where("status","=","failed").where((Y)=>Y.or([Y("failure_kind","is",null),Y("failure_kind","not in",["cancelled",...on])])).returning("id").execute()).length>0}async supersedeFailedThreads($,Z){return(await this.db.updateTable("threads").set({failure_kind:"superseded",updated_at:new Date().toISOString()}).where("organization_id","=",Z).where("status","=","failed").where("failure_kind","is distinct from","cancelled").where((Q)=>Q("id","in",Q.selectFrom("task_board_item_threads").select("thread_id").where("task_board_item_id","=",$).where("organization_id","=",Z))).returning("id").execute()).length}async listItemsStuckAfterFailure($,Z){let X=await this.db.selectFrom("task_board_items as i").innerJoin("task_board_item_threads as l","l.task_board_item_id","i.id").innerJoin("threads as t","t.id","l.thread_id").select(["i.id as id","i.organization_id as organizationId","t.id as threadId"]).where("i.status","=","in_progress").where("i.assignee_id","=",Z8).where("i.dismissed_at","is",null).where("i.retry_at","is",null).where("t.status","=","failed").where((Y)=>Y.or([Y("t.failure_kind","is",null),Y("t.failure_kind","not in",[...on])])).where("t.updated_at","<",Z).where((Y)=>Y.not(Y.exists(Y.selectFrom("task_board_item_threads as l2").innerJoin("threads as t2","t2.id","l2.thread_id").select("t2.id").whereRef("l2.task_board_item_id","=","i.id").where("t2.status","in",["in_progress","requires_action"])))).orderBy("t.updated_at","desc").limit($).execute(),Q=new Set;return X.filter((Y)=>!Q.has(Y.id)&&Q.add(Y.id))}async listItemsDueForRetry($,Z){return await this.db.selectFrom("task_board_items").select(["id","organization_id as organizationId","retry_attempts as attempts"]).where("retry_at","is not",null).where("retry_at","<=",Z).where("status","=","in_progress").where("dismissed_at","is",null).orderBy("retry_at","asc").limit($).execute()}async claimDueRetry($,Z,X){return(await this.db.updateTable("task_board_items").set({retry_at:null}).where("id","=",$).where("organization_id","=",Z).where("retry_at","is not",null).where("retry_at","<=",X).returning("id").execute()).length>0}async clearRunRetry($,Z){await this.db.updateTable("task_board_items").set({retry_at:null,retry_attempts:0}).where("id","=",$).where("organization_id","=",Z).execute()}async clearSweepBudget($,Z){await this.db.updateTable("task_board_items").set({last_swept_at:null}).where("id","=",$).where("organization_id","=",Z).execute()}async linkedTaskIds($,Z){return(await this.db.selectFrom("task_board_item_threads").select("task_board_item_id as taskId").where("thread_id","=",$).where("organization_id","=",Z).execute()).map((Q)=>Q.taskId)}async linkPr($){await this.db.insertInto("task_board_item_prs").values({task_board_item_id:$.taskBoardItemId,organization_id:$.organizationId,url:$.url,pr_number:$.prNumber,repo_owner:$.repoOwner,repo_name:$.repoName,connection_id:$.connectionId??null}).onConflict((Z)=>Z.columns(["task_board_item_id","url"]).doNothing()).execute()}async listPrs($,Z){return(await this.db.selectFrom("task_board_item_prs").select(["url","pr_number as prNumber","repo_owner as repoOwner","repo_name as repoName","connection_id as connectionId","created_at as createdAt"]).where("task_board_item_id","=",$).where("organization_id","=",Z).orderBy("created_at","desc").execute()).map((Q)=>({url:Q.url,number:Q.prNumber,repoOwner:Q.repoOwner,repoName:Q.repoName,connectionId:Q.connectionId??null,createdAt:Q.createdAt instanceof Date?Q.createdAt.toISOString():Q.createdAt}))}async advanceLinkedTasksToReviewOnThreadFinish($,Z){let X=[];for(let Q of await this.linkedTaskIds($,Z)){let Y=await this.getById(Q,Z);if(!Y)continue;let G=(await this.listPrs(Q,Z)).length>0;if(!bt0(Y,G))continue;if(Y.reviewCycleStartedAt)continue;if(G){let W=await this.openReviewCycleIfInProgress(Q,Z);if(!W)continue;X.push(W);continue}let J=await this.advanceToReviewIfInProgress(Q,Z,Y.updatedBy);if(!J)continue;X.push(J),await this.recordActivity({taskBoardItemId:Q,action:"status_changed",actorId:null,data:{from:Y.status,to:"in_review"}}).catch((W)=>console.error("[task-board] in_review activity write failed",W))}return X}async openReviewCycleIfInProgress($,Z){let X=await this.db.updateTable("task_board_items").set({review_cycle_started_at:new Date,status:"in_progress"}).where("id","=",$).where("organization_id","=",Z).where((Y)=>Y.or([Y("status","=","in_progress"),Y.and([Y("status","=","in_review"),Y("assignee_id","=",Z8)])])).where("review_cycle_started_at","is",null).where("dismissed_at","is",null).returningAll().executeTakeFirst();if(!X)return null;let Q=this.itemFromDbRow(X);return await this.attachRefs([Q],Z),Q}async closeReviewCycle($,Z){await this.db.updateTable("task_board_items").set({review_cycle_started_at:null}).where("id","=",$).where("organization_id","=",Z).execute()}async advanceToReviewIfInProgress($,Z,X){let Q=await this.db.updateTable("task_board_items").set({status:"in_review",updated_by:X,updated_at:new Date().toISOString()}).where("id","=",$).where("organization_id","=",Z).where("status","=","in_progress").where("dismissed_at","is",null).returningAll().executeTakeFirst();if(!Q)return null;let Y=this.itemFromDbRow(Q);return await this.attachRefs([Y],Z),Y}async reopenLinkedTasksOnThreadRun($,Z){let X=[];for(let Q of await this.linkedTaskIds($,Z)){let Y=await this.getById(Q,Z);if(!Y||Y.status!=="in_review")continue;await this.closeReviewCycle(Q,Z),X.push(await this.update(Q,Z,{status:"in_progress"},Y.updatedBy))}return X}claimConflictResolution($,Z,X){return this.claimInReviewSuperAgentSlot($,Z,X)}async claimInReviewSuperAgentSlot($,Z,X){let Q=await this.db.updateTable("task_board_items").set({status:"in_progress",review_cycle_started_at:null,updated_by:X,updated_at:new Date().toISOString()}).where("id","=",$).where("organization_id","=",Z).where("status","=","in_review").where("assignee_id","=",Z8).returningAll().executeTakeFirst();if(!Q)return null;let Y=this.itemFromDbRow(Q);return await this.attachRefs([Y],Z),Y}async claimUnassignedForSuperAgent($,Z,X,Q){let Y=await this.db.updateTable("task_board_items").set({assignee_id:Z8,assigned_by:X,updated_by:Q,updated_at:new Date().toISOString()}).where("id","=",$).where("organization_id","=",Z).where("status","=","todo").where("assignee_id","is",null).returningAll().executeTakeFirst();if(!Y)return null;let G=this.itemFromDbRow(Y);return await this.attachRefs([G],Z),G}async unassignSuperAgent($,Z,X){let Q=await this.db.updateTable("task_board_items").set({assignee_id:null,updated_by:X,updated_at:new Date().toISOString()}).where("id","=",$).where("organization_id","=",Z).where("assignee_id","=",Z8).returningAll().executeTakeFirst();if(!Q)return null;let Y=this.itemFromDbRow(Q);return await this.attachRefs([Y],Z),Y}async attachRefs($,Z){if($.length===0)return;await this.inTransaction(async(X)=>{await this.attachThreads(X,$,Z),await this.attachTags(X,$),await this.attachJiraKeys(X,$),await this.attachReviewVerdicts(X,$)})}async attachThreads($,Z,X){let Q=Z.map((J)=>J.id),Y=await $.selectFrom("task_board_item_threads as link").innerJoin("threads as t","t.id","link.thread_id").leftJoinLateral((J)=>J.selectFrom("thread_message_parts as p").select("p.payload as payload").whereRef("p.thread_id","=","link.thread_id").where("p.role","=","assistant").where("p.kind","=","text").orderBy("p.created_at","desc").limit(1).as("lastmsg"),(J)=>J.onTrue()).leftJoinLateral((J)=>J.selectFrom("thread_message_parts as up").select((W)=>[W.fn.sum(pO`coalesce((up.metadata->'usage'->'providerMetadata'->'openrouter'->'usage'->>'cost')::numeric, 0)`).as("usd"),pO`
|
|
1319
|
+
)`,created_by:$.by,created_at:X,updated_by:$.by,updated_at:X}).returningAll().executeTakeFirstOrThrow(),G=await this.inTransaction(async(J)=>{return await pO`select pg_advisory_xact_lock(hashtext(${`task-board-key-seq:${$.organizationId}`})::bigint)`.execute(J),Y(J)});return this.itemFromDbRow(G)}async update($,Z,X,Q){let Y=await this.db.updateTable("task_board_items").set({...X.title!==void 0?{title:X.title}:{},...X.description!==void 0?{description:X.description}:{},...X.status!==void 0?{status:X.status}:{},...X.priority!==void 0?{priority:X.priority}:{},...X.type!==void 0?{type:X.type}:{},...X.assigneeId!==void 0?{assignee_id:X.assigneeId}:{},...X.assignedBy!==void 0?{assigned_by:X.assignedBy}:{},...X.repo!==void 0?{repo:X.repo}:{},...X.dueDate!==void 0?{due_date:X.dueDate}:{},...X.sprintId!==void 0?{sprint_id:X.sprintId}:{},...X.boardColumnOrg!==void 0?{board_column_org:X.boardColumnOrg}:{},...X.sortOrder!==void 0?{sort_order:X.sortOrder}:{},...X.status!==void 0&&!JU4.has(X.status)?{review_cycle_started_at:null}:{},updated_by:Q,updated_at:new Date().toISOString()}).where("id","=",$).where("organization_id","=",Z).returningAll().executeTakeFirstOrThrow(),G=this.itemFromDbRow(Y);return await this.attachRefs([G],Z),G}async delete($,Z,X){return this.inTransaction(async(Q)=>{let Y=await Q.selectFrom("task_board_items").select(["created_by"]).where("id","=",$).where("organization_id","=",Z).executeTakeFirst();if(!Y)return!1;if(bQ({createdBy:Y.created_by}))return await Q.updateTable("task_board_items").set({dismissed_at:new Date().toISOString(),updated_by:X}).where("id","=",$).where("organization_id","=",Z).where("dismissed_at","is",null).execute(),!0;return await Q.deleteFrom("task_board_item_threads").where("task_board_item_id","=",$).where("organization_id","=",Z).execute(),await Q.deleteFrom("task_board_item_prs").where("task_board_item_id","=",$).where("organization_id","=",Z).execute(),await Q.deleteFrom("task_board_items").where("id","=",$).where("organization_id","=",Z).execute(),!0})}async dismissedFindingKeys($,Z){if(Z.length===0)return new Set;let X=await this.db.selectFrom("task_board_items").select(["external_key"]).where("organization_id","=",$).where("external_key","in",Z).where("dismissed_at","is not",null).execute();return new Set(X.flatMap((Q)=>Q.external_key??[]))}async listDismissedFindings($){return(await this.db.selectFrom("task_board_items").select(["external_key","updated_by","dismissed_at"]).where("organization_id","=",$).where("dismissed_at","is not",null).orderBy("dismissed_at","desc").execute()).flatMap((X)=>X.external_key&&X.dismissed_at?[{externalKey:X.external_key,dismissedBy:X.updated_by,dismissedAt:X.dismissed_at instanceof Date?X.dismissed_at.toISOString():X.dismissed_at}]:[])}async restoreDismissedFindings($,Z){if(Z&&Z.length===0)return 0;let X=this.db.updateTable("task_board_items").set({dismissed_at:null}).where("organization_id","=",$).where("dismissed_at","is not",null);if(Z)X=X.where("external_key","in",Z);let Q=await X.executeTakeFirst();return Number(Q.numUpdatedRows??0n)}async setItemTags($,Z,X){await this.inTransaction(async(Q)=>{if(await Q.deleteFrom("task_board_item_tags").where("task_board_item_id","=",$).$if(Z.length>0,(Y)=>Y.where("id","not in",Z)).execute(),Z.length>0)await Q.insertInto("task_board_item_tags").values(Z.map((Y)=>({task_board_item_id:$,id:Y,created_by:X,created_at:new Date().toISOString()}))).onConflict((Y)=>Y.doNothing()).execute()})}async addItemTags($,Z,X){if(Z.length===0)return;await this.db.insertInto("task_board_item_tags").values(Z.map((Q)=>({task_board_item_id:$,id:Q,created_by:X,created_at:new Date().toISOString()}))).onConflict((Q)=>Q.doNothing()).execute()}async linkThread($,Z,X){await this.db.insertInto("task_board_item_threads").values({task_board_item_id:$,thread_id:Z,organization_id:X}).onConflict((Q)=>Q.columns(["task_board_item_id","thread_id"]).doNothing()).execute()}async listItemsPendingReview($,Z,X){let Q=this.db.selectFrom("task_board_items").select(["id","organization_id as organizationId","updated_at"]).where((G)=>G.or([G("review_cycle_started_at","is not",null),G("status","=","in_review")])).where("dismissed_at","is",null);if(X)Q=Q.where((G)=>G.or([G("last_swept_at","is",null),G("last_swept_at","<",X)]));if(Z){let G=new Date(Z.updatedAt);Q=Q.where((J)=>J.or([J("updated_at",">",G),J.and([J("updated_at","=",G),J("id",">",Z.id)])]))}return(await Q.orderBy("updated_at","asc").orderBy("id","asc").limit($).execute()).map((G)=>({id:G.id,organizationId:G.organizationId,updatedAt:G.updated_at instanceof Date?G.updated_at.toISOString():String(G.updated_at)}))}async listItemsAwaitingArchive($,Z){return(await this.db.selectFrom("task_board_items as i").select(["i.id","i.organization_id as organizationId"]).where("i.status","=","done").where("i.dismissed_at","is",null).where("i.updated_at","<",$).where((Q)=>Q.exists(Q.selectFrom("task_board_item_prs as p").select("p.url").whereRef("p.task_board_item_id","=","i.id"))).orderBy("i.updated_at","asc").limit(Z).execute()).map((Q)=>({id:Q.id,organizationId:Q.organizationId}))}async listItemsAwaitingMergedTag($,Z){return(await this.db.selectFrom("task_board_items as i").select(["i.id","i.organization_id as organizationId"]).where("i.status","in",HU4).where("i.dismissed_at","is",null).where((Q)=>Q.exists(Q.selectFrom("task_board_item_prs as p").select("p.url").whereRef("p.task_board_item_id","=","i.id"))).where((Q)=>Q.not(Q.exists(Q.selectFrom("task_board_item_tags as t").innerJoin("organization_tags as g","g.id","t.id").select("t.id").whereRef("t.task_board_item_id","=","i.id").where(pO`lower(g.name)`,"=",$)))).orderBy("i.updated_at","desc").limit(Z).execute()).map((Q)=>({id:Q.id,organizationId:Q.organizationId}))}async claimSweep($,Z,X){let Q=await this.db.updateTable("task_board_items").set({last_swept_at:new Date}).where("id","=",$).where("organization_id","=",Z).where((Y)=>Y.or([Y("last_swept_at","is",null),Y("last_swept_at","<",X)])).executeTakeFirst();return Number(Q.numUpdatedRows??0)>0}async failedRunInfo($,Z){let X=await this.db.selectFrom("threads as t").leftJoinLateral((Q)=>Q.selectFrom("thread_message_parts as p").select("p.payload").whereRef("p.thread_id","=","t.id").where("p.kind","=","error").orderBy("p.created_at","desc").limit(1).as("err"),(Q)=>Q.onTrue()).select(["t.status","t.failure_kind as kind","err.payload as payload"]).where("t.id","=",$).where("t.organization_id","=",Z).executeTakeFirst();if(!X||X.status!=="failed")return null;return{kind:X.kind??null,errorText:rW$(X.payload)}}async scheduleRunRetry($,Z,X,Q){return(await this.db.updateTable("task_board_items").set({retry_at:Q,retry_attempts:X}).where("id","=",$).where("organization_id","=",Z).where("status","=","in_progress").where("dismissed_at","is",null).returning("id").execute()).length>0}async returnToTodoAfterFailure($,Z,X){if((await this.db.updateTable("task_board_items").set({status:"todo",retry_at:null,retry_attempts:0,updated_by:X,updated_at:new Date}).where("id","=",$).where("organization_id","=",Z).where("status","=","in_progress").where("dismissed_at","is",null).returning("id").execute()).length===0)return null;return await this.getById($,Z)}async failNeverStartedLinkedThreads($,Z,X){let Q=await this.db.selectFrom("threads as t").innerJoin("task_board_item_threads as l","l.thread_id","t.id").select(["t.id as threadId","l.task_board_item_id as itemId","l.organization_id as organizationId"]).where("t.status","=","in_progress").where("t.run_started_at","is",null).where((W)=>W.and([W("t.updated_at","<",Z),W.or([W("t.last_progress_at","is",null),W("t.last_progress_at","<",Z)])])).limit($).execute();if(Q.length===0)return[];let Y=Q.map((W)=>W.threadId),G=await this.db.updateTable("threads").set({status:"failed",failure_reason:X,failure_kind:"abandoned",run_owner_pod:null,run_config:null,run_started_at:null,updated_at:new Date().toISOString()}).where("id","in",Y).where("status","=","in_progress").returning("id").execute(),J=new Set(G.map((W)=>W.id));return Q.filter((W)=>J.has(W.threadId))}async relabelDeliveredFailure($,Z,X){return(await this.db.updateTable("threads").set({failure_reason:X,failure_kind:"ended_after_delivery",updated_at:new Date().toISOString()}).where("id","=",$).where("organization_id","=",Z).where("status","=","failed").where((Y)=>Y.or([Y("failure_kind","is",null),Y("failure_kind","not in",["cancelled",...on])])).returning("id").execute()).length>0}async supersedeFailedThreads($,Z){return(await this.db.updateTable("threads").set({failure_kind:"superseded",updated_at:new Date().toISOString()}).where("organization_id","=",Z).where("status","=","failed").where("failure_kind","is distinct from","cancelled").where((Q)=>Q("id","in",Q.selectFrom("task_board_item_threads").select("thread_id").where("task_board_item_id","=",$).where("organization_id","=",Z))).returning("id").execute()).length}async listItemsStuckAfterFailure($,Z){let X=await this.db.selectFrom("task_board_items as i").innerJoin("task_board_item_threads as l","l.task_board_item_id","i.id").innerJoin("threads as t","t.id","l.thread_id").select(["i.id as id","i.organization_id as organizationId","t.id as threadId"]).where("i.status","=","in_progress").where("i.assignee_id","=",Z8).where("i.dismissed_at","is",null).where("i.retry_at","is",null).where("t.status","=","failed").where((Y)=>Y.or([Y("t.failure_kind","is",null),Y("t.failure_kind","not in",[...on])])).where("t.updated_at","<",Z).where((Y)=>Y.not(Y.exists(Y.selectFrom("task_board_item_threads as l2").innerJoin("threads as t2","t2.id","l2.thread_id").select("t2.id").whereRef("l2.task_board_item_id","=","i.id").where("t2.status","in",["in_progress","requires_action"])))).orderBy("t.updated_at","desc").limit($).execute(),Q=new Set;return X.filter((Y)=>!Q.has(Y.id)&&Q.add(Y.id))}async listItemsDueForRetry($,Z){return await this.db.selectFrom("task_board_items").select(["id","organization_id as organizationId","retry_attempts as attempts"]).where("retry_at","is not",null).where("retry_at","<=",Z).where("status","=","in_progress").where("dismissed_at","is",null).orderBy("retry_at","asc").limit($).execute()}async claimDueRetry($,Z,X){return(await this.db.updateTable("task_board_items").set({retry_at:null}).where("id","=",$).where("organization_id","=",Z).where("retry_at","is not",null).where("retry_at","<=",X).returning("id").execute()).length>0}async clearRunRetry($,Z){await this.db.updateTable("task_board_items").set({retry_at:null,retry_attempts:0}).where("id","=",$).where("organization_id","=",Z).execute()}async clearSweepBudget($,Z){await this.db.updateTable("task_board_items").set({last_swept_at:null}).where("id","=",$).where("organization_id","=",Z).execute()}async linkedTaskIds($,Z){return(await this.db.selectFrom("task_board_item_threads").select("task_board_item_id as taskId").where("thread_id","=",$).where("organization_id","=",Z).execute()).map((Q)=>Q.taskId)}async linkPr($){await this.db.insertInto("task_board_item_prs").values({task_board_item_id:$.taskBoardItemId,organization_id:$.organizationId,url:$.url,pr_number:$.prNumber,repo_owner:$.repoOwner,repo_name:$.repoName,connection_id:$.connectionId??null}).onConflict((Z)=>Z.columns(["task_board_item_id","url"]).doNothing()).execute()}async listPrs($,Z){return(await this.db.selectFrom("task_board_item_prs").select(["url","pr_number as prNumber","repo_owner as repoOwner","repo_name as repoName","connection_id as connectionId","created_at as createdAt"]).where("task_board_item_id","=",$).where("organization_id","=",Z).orderBy("created_at","desc").execute()).map((Q)=>({url:Q.url,number:Q.prNumber,repoOwner:Q.repoOwner,repoName:Q.repoName,connectionId:Q.connectionId??null,createdAt:Q.createdAt instanceof Date?Q.createdAt.toISOString():Q.createdAt}))}async advanceLinkedTasksToReviewOnThreadFinish($,Z){let X=[];for(let Q of await this.linkedTaskIds($,Z)){let Y=await this.getById(Q,Z);if(!Y)continue;let G=(await this.listPrs(Q,Z)).length>0;if(!bt0(Y,G))continue;if(Y.reviewCycleStartedAt)continue;if(G){let W=await this.openReviewCycleIfInProgress(Q,Z);if(!W)continue;X.push(W);continue}let J=await this.advanceToReviewIfInProgress(Q,Z,Y.updatedBy);if(!J)continue;X.push(J),await this.recordActivity({taskBoardItemId:Q,action:"status_changed",actorId:null,data:{from:Y.status,to:"in_review"}}).catch((W)=>console.error("[task-board] in_review activity write failed",W))}return X}async openReviewCycleIfInProgress($,Z){let X=await this.db.updateTable("task_board_items").set({review_cycle_started_at:new Date,status:"in_progress"}).where("id","=",$).where("organization_id","=",Z).where((Y)=>Y.or([Y("status","=","in_progress"),Y.and([Y("status","=","in_review"),Y("assignee_id","=",Z8)])])).where("review_cycle_started_at","is",null).where("dismissed_at","is",null).returningAll().executeTakeFirst();if(!X)return null;let Q=this.itemFromDbRow(X);return await this.attachRefs([Q],Z),Q}async closeReviewCycle($,Z){await this.db.updateTable("task_board_items").set({review_cycle_started_at:null}).where("id","=",$).where("organization_id","=",Z).execute()}async advanceToReviewIfInProgress($,Z,X){let Q=await this.db.updateTable("task_board_items").set({status:"in_review",updated_by:X,updated_at:new Date().toISOString()}).where("id","=",$).where("organization_id","=",Z).where("status","=","in_progress").where("dismissed_at","is",null).returningAll().executeTakeFirst();if(!Q)return null;let Y=this.itemFromDbRow(Q);return await this.attachRefs([Y],Z),Y}async reopenLinkedTasksOnThreadRun($,Z){let X=[];for(let Q of await this.linkedTaskIds($,Z)){let Y=await this.getById(Q,Z);if(!Y||Y.status!=="in_review")continue;await this.closeReviewCycle(Q,Z),X.push(await this.update(Q,Z,{status:"in_progress"},Y.updatedBy))}return X}claimConflictResolution($,Z,X){return this.claimInReviewSuperAgentSlot($,Z,X)}async claimInReviewSuperAgentSlot($,Z,X){let Q=await this.db.updateTable("task_board_items").set({status:"in_progress",review_cycle_started_at:null,updated_by:X,updated_at:new Date().toISOString()}).where("id","=",$).where("organization_id","=",Z).where("status","=","in_review").where("assignee_id","=",Z8).returningAll().executeTakeFirst();if(!Q)return null;let Y=this.itemFromDbRow(Q);return await this.attachRefs([Y],Z),Y}async claimUnassignedForSuperAgent($,Z,X,Q){let Y=await this.db.updateTable("task_board_items").set({assignee_id:Z8,assigned_by:X,updated_by:Q,updated_at:new Date().toISOString()}).where("id","=",$).where("organization_id","=",Z).where("status","=","todo").where("assignee_id","is",null).returningAll().executeTakeFirst();if(!Y)return null;let G=this.itemFromDbRow(Y);return await this.attachRefs([G],Z),G}async unassignSuperAgent($,Z,X){let Q=await this.db.updateTable("task_board_items").set({assignee_id:null,updated_by:X,updated_at:new Date().toISOString()}).where("id","=",$).where("organization_id","=",Z).where("assignee_id","=",Z8).returningAll().executeTakeFirst();if(!Q)return null;let Y=this.itemFromDbRow(Q);return await this.attachRefs([Y],Z),Y}async attachRefs($,Z){if($.length===0)return;await this.inTransaction(async(X)=>{await this.attachThreads(X,$,Z),await this.attachTags(X,$),await this.attachJiraKeys(X,$),await this.attachReviewVerdicts(X,$)})}async attachThreads($,Z,X){let Q=Z.map((J)=>J.id),Y=await $.selectFrom("task_board_item_threads as link").innerJoin("threads as t","t.id","link.thread_id").leftJoinLateral((J)=>J.selectFrom("thread_message_parts as p").select("p.payload as payload").whereRef("p.thread_id","=","link.thread_id").where("p.role","=","assistant").where("p.kind","=","text").orderBy("p.created_at","desc").limit(1).as("lastmsg"),(J)=>J.onTrue()).leftJoinLateral((J)=>J.selectFrom("thread_message_parts as up").select((W)=>[W.fn.sum(pO`coalesce((up.metadata->'usage'->'providerMetadata'->'openrouter'->'usage'->>'cost')::numeric, 0)`).as("usd"),pO`
|
|
1320
1320
|
case
|
|
1321
1321
|
when count(distinct up.metadata->'models'->'thinking'->>'provider') = 1
|
|
1322
1322
|
then max(up.metadata->'models'->'thinking'->>'provider')
|
|
@@ -1361,7 +1361,7 @@ ${Y}`:Y}case"media":return"";case"mediaSingle":case"mediaGroup":return Gg(fK(X),
|
|
|
1361
1361
|
|
|
1362
1362
|
${G}`.trim().slice(0,JF$)}function CB4($){let Z=$.fields.priority?.name?.toLowerCase();return Z&&IB4[Z]||"medium"}async function XF$($,Z,X){if(X.assigneeId)return X;let Q=Z.organizationId,Y=await(await rQ($,Q)).automationFor(X.status);if(!Y)return X;let G=await $.storage.taskBoard.claimUnassignedForSuperAgent(X.id,Q,Z.createdBy,bK);if(!G)return X;await $.storage.taskBoard.recordActivity({taskBoardItemId:X.id,action:"assignee_changed",actorId:null,data:{from:null,to:Z8}});try{await aO($,G,{instruction:Y.prompt??void 0})}catch(J){return console.warn(`[jira] auto-delegate of ${X.id} rejected, un-delegating:`,J instanceof Error?J.message:J),await $.storage.taskBoard.update(X.id,Q,{assigneeId:null,assignedBy:null},bK)}return G}async function QF$($,Z,X,Q,Y,G,J){let W=Z.organizationId,K=Q.fields.comment;if(K&&K.total===0)return;let F=K&&K.comments.length>=K.total?K.comments:await X.listComments(Q.id),H=await $.storage.jiraIntegrations.knownJiraCommentIds(W,F.map((B)=>B.id)),N=F.filter((B)=>!H.has(B.id)&&B.author?.accountId!==G);if(N.length===0)return;let U=await J.resolve(N.flatMap((B)=>Zt(B.body)));for(let B of N){let O=Yo0(B.body,U).slice(0,JF$),L=await $.storage.taskBoard.createComment({taskBoardItemId:Y,organizationId:W,authorId:bK,body:`**${B.author?.displayName??"Jira"} \xB7 via Jira:**
|
|
1363
1363
|
|
|
1364
|
-
${O}`});if(!L)continue;try{await $.storage.jiraIntegrations.createCommentLink({commentId:L.id,organizationId:W,jiraCommentId:B.id})}catch(w){if(w.code==="23505"){await $.storage.taskBoard.deleteComment(L.id,W,bK);continue}throw w}}}class WF${ctx;organizationId;ids=new Map;constructor($,Z){this.ctx=$;this.organizationId=Z}async seed($){if($.length===0)return;let Z=await this.ctx.storage.sprints.upsertManyFromJira(this.organizationId,$.map(YF$));for(let[X,Q]of Z)this.ids.set(X,Q)}async localIdFor($){if(!$)return null;let Z=this.ids.get($.id);if(Z)return Z;let X=await this.ctx.storage.sprints.upsertFromJira(this.organizationId,YF$($));return this.ids.set($.id,X),X}}function YF$($){return{jiraSprintId:$.id,name:$.name,state:$.state,startsAt:$.startsAt,endsAt:$.endsAt}}function _B4($,Z){if($.size===0)return[];return Z.filter((X)=>!$.has(X.jiraIssueId))}async function vB4($,Z,X,Q){let Y=Z.organizationId,G=await X.searchIssueIds(`(${Q}) AND issuetype IN standardIssueTypes()`);if(G.size===0)return console.warn(`[jira] scope for org ${Y} came back empty \u2014 skipping reconciliation rather than archiving the whole board`),0;let J=_B4(G,await $.storage.jiraIntegrations.listLinkedIssuesOnBoard(Y));if(J.length===0)return 0;for(let W of J){let K=await $.storage.taskBoard.getById(W.itemId,Y);if(!K||K.status==="archived")continue;let F=await $.storage.taskBoard.update(W.itemId,Y,{status:"archived"},bK);await $.storage.taskBoard.recordActivity({taskBoardItemId:W.itemId,action:"status_changed",actorId:null,data:{from:K.status,to:"archived"}}),b$(Y,F),console.log(`[jira] ${W.jiraIssueKey} is no longer in board ${Z.boardId}'s scope \u2014 archived its card`)}return J.length}async function fB4($,Z){let{organizationId:X,boardId:Q}=Z;if(!Q)throw Error("No Jira board selected");let Y=await $.storage.organizationSettings.get(Z.organizationId),G=O7(Y?.flags,"org_board_columns"),J=G?await qB4($,Z,Q):FK$(Z.statusMapping);if(J.size===0)throw Error(G?"This Jira board has no columns to mirror":"No status mapping configured");let W=Z.lastSyncedAt===null||Z.rescanPending,K=new eY(Z.siteUrl,Z.email,Z.apiToken),{accountId:F}=await K.myself(),H=new Go0(K),N=new Date,U=await K.getBoardScopeJql(Q),B=MB4(Z,U,N),O=new WF$($,X);await O.seed(await K.listBoardSprints(Q));let L={created:0,updated:0,unchanged:0,skipped:0,archived:0,unmappedStatuses:[]},w=new Set,E,j,z=0,A=0;while(z<Jo0&&A<GF$){A++;let k=await K.searchIssues({jql:B,nextPageToken:j});if(j=k.nextPageToken??void 0,k.issues.length===0){if(!j)break;continue}let M=await $.storage.jiraIntegrations.getLinksByIssueIds(X,k.issues.map((S)=>S.id));await H.resolve(k.issues.flatMap((S)=>[...Zt(S.fields.description),...(S.fields.comment?.comments??[]).flatMap((m)=>Zt(m.body))]));for(let S of k.issues){if(z>=Jo0)break;z++;let m=new Date(S.fields.updated);if(Number.isNaN(m.getTime()))throw Error(`Unparseable updated on ${S.key}`);let f=J.get(S.fields.status.name);if(!f||!ZF$(S)){if(!f&&ZF$(S))w.add(S.fields.status.name);L.skipped++,E=m;continue}let b=M.get(S.id);if(b&&kB4(b.jiraUpdatedAt,m,W)){L.unchanged++,E=m;continue}let i=S.fields.status.name,l={title:S.fields.summary,description:await SB4(Z.siteUrl,S,H),priority:CB4(S),sprintId:await O.localIdFor(bK$(S.sprints))};if(b){let t=b.jiraStatus!==i,N0=await $.storage.taskBoard.getById(b.itemId,X),D0=await $.storage.taskBoard.update(b.itemId,X,{...l,...t?{status:f}:{}},bK);if(await $.storage.jiraIntegrations.touchLink(b.itemId,{jiraStatus:i}),N0&&t&&N0.status!==f)await $.storage.taskBoard.recordActivity({taskBoardItemId:b.itemId,action:"status_changed",actorId:null,data:{from:N0.status,to:f}});if(t&&!W)D0=await XF$($,Z,D0);await QF$($,Z,K,S,b.itemId,F,H),await $.storage.jiraIntegrations.touchLink(b.itemId,{jiraUpdatedAt:m}),b$(X,D0),L.updated++}else{let t=await $.storage.taskBoard.create({organizationId:X,...l,status:f,by:bK});try{await $.storage.jiraIntegrations.createLink({itemId:t.id,organizationId:X,jiraIssueId:S.id,jiraIssueKey:S.key,jiraUpdatedAt:new Date(0),jiraStatus:i})}catch(N0){if(N0.code==="23505"){await $.storage.taskBoard.delete(t.id,X,bK),L.unchanged++,E=m;continue}throw N0}if(!W)t=await XF$($,Z,t);await QF$($,Z,K,S,t.id,F,H),await $.storage.jiraIntegrations.touchLink(t.id,{jiraUpdatedAt:m}),b$(X,t),L.created++}E=m}if(!j)break}L.unmappedStatuses=[...w].sort();let P=VB4(z,A);if(!P)L.archived=await vB4($,Z,K,U);let I=W&&P;if(E===void 0&&z===0)return{counts:L,watermark:N,rescanPending:I};return{counts:L,watermark:E,rescanPending:I}}var bK="jira",Jo0=500,RB4=5,GF$=25,JF$=1e4,IB4;var tD0=D(()=>{u9();hO();C6();GN();E5();nD0();rt0();IB4={highest:"urgent",high:"high",medium:"medium",low:"low",lowest:"low"}});var KF$={};J4(KF$,{setJiraSyncRuntime:()=>Ho0,registerJiraSyncWorkflow:()=>Uo0,maybeEnqueueJiraStatusPush:()=>rB4,enqueueJiraCommentPush:()=>No0});import{DBOS as XQ,SchedulerMode as bB4}from"@dbos-inc/dbos-sdk";function Ho0($){oD0=$}function Qt(){if(!oD0)throw Error("[jira] sync runtime not initialized \u2014 setJiraSyncRuntime() must run before the workflow fires");return oD0}function JN(){let{db:$,encryptionKey:Z}=Qt();return new IC($,new SY(Z))}function yB4(){return new ZQ(Qt().db)}async function gB4($){try{let{db:Z}=Qt(),X=await JN().getById($);if(!X)return{id:$,error:"integration no longer exists"};if(!X.enabled)return{id:$};let Q=await m3(Z,X.organizationId);if(!Q)return{id:$,error:"organization no longer exists"};let Y=await Jg(Q,X);return"error"in Y?{id:$,error:Y.error}:{id:$}}catch(Z){return{id:$,error:Z instanceof Error?Z.message:String(Z)}}}async function hB4($,Z){let X=await XQ.runStep(()=>JN().listEnabledIds(),{name:"loadJiraIntegrations"});for(let Q of X){let Y=await XQ.runStep(()=>gB4(Q),{name:`syncJira:${Q}`});if(Y.error)console.warn(`[jira] sync ${Y.id} failed: ${Y.error}`)}}async function lB4($){let Z=JN();if(!(await Z.getByOrg($.organizationId))?.enabled)return null;let Q=await Z.getLinkByItemId($.taskBoardItemId,$.organizationId);if(!Q)return null;if(await Z.hasCommentLink($.commentId))return null;return{jiraIssueId:Q.jiraIssueId}}async function cB4($){return(await Qt().db.selectFrom("organization").select("slug").where("id","=",$).executeTakeFirst())?.slug??null}async function dB4($,Z,X){let Q=await JN().getByOrg($);if(!Q?.enabled)return null;let G=(await m3(Qt().db,$))?.orgFs;if(!G)return null;let J=new eY(Q.siteUrl,Q.email,Q.apiToken);return eK$(X,{read:(W)=>G.read(W.volume,W.path).catch((K)=>{if(K instanceof VG)return null;throw K}),listAttachments:()=>J.listAttachments(Z),upload:(W)=>J.addAttachment(Z,W),mediaIdFor:(W)=>J.resolveMediaId(W)})}async function mB4($,Z,X){let Q=JN(),Y=await Q.getByOrg($.organizationId);if(!Y?.enabled)return null;let G=await Q.getLinkByItemId($.taskBoardItemId,$.organizationId);if(!G)return null;if(await Q.hasCommentLink($.commentId))return null;return(await new eY(Y.siteUrl,Y.email,Y.apiToken).addComment(G.jiraIssueId,Z,{header:`${$.authorLabel} \xB7 via Studio:`,media:new Map(X)})).id}async function iB4($,Z){try{await JN().createCommentLink({commentId:$.commentId,organizationId:$.organizationId,jiraCommentId:Z})}catch(X){if(X.code!=="23505")throw X}}async function pB4($){let Z=$.body.slice(0,uB4),X=await XQ.runStep(()=>lB4($),{name:"resolveCommentTarget",retriesAllowed:!0,maxAttempts:3});if(!X)return;let Q=[],Y=PK$(Z);if(Y.length>0){let J=await XQ.runStep(()=>cB4($.organizationId),{name:"readOrgSlug",retriesAllowed:!0,maxAttempts:3});for(let W of sK$(Y,J??""))try{let K=await XQ.runStep(()=>dB4($.organizationId,X.jiraIssueId,W),{name:`attachCommentImage:${W.name}`,retriesAllowed:!0,maxAttempts:3});if(K)Q.push([W.target,K])}catch(K){if(!JK$(K))throw K;console.warn(`[jira] could not attach ${W.ref.path}:`,K)}}let G=await XQ.runStep(()=>mB4($,Z,Q),{name:"postCommentToJira",retriesAllowed:!1});if(!G)return;await XQ.runStep(()=>iB4($,G),{name:"recordCommentLink",retriesAllowed:!0,maxAttempts:4})}async function nB4($){let Z=JN(),X=await Z.getByOrg($.organizationId);if(!X?.enabled)return null;let Q=await Z.getLinkByItemId($.itemId,$.organizationId);if(!Q)return null;let Y=await yB4().getById($.itemId,$.organizationId);if(!Y)return null;if(gt0(X.statusMapping,Y.status,Q.jiraStatus))return null;let J=await new eY(X.siteUrl,X.email,X.apiToken).listTransitions(Q.jiraIssueId),W=NK$({mapping:X.statusMapping,lane:Y.status,currentJiraStatus:Q.jiraStatus,availableTransitions:J.map((F)=>F.to.name)});if(W.kind!=="transition"){if(W.kind==="unreachable")console.warn(`[jira] ${Q.jiraIssueKey} is ${Y.status} on the board, but its workflow offers no transition to ${W.targets.join(" / ")} \u2014 `+"the card will not move on the Jira board");return null}let K=J.find((F)=>F.to.name===W.targetName);if(!K)return null;return{jiraIssueId:Q.jiraIssueId,transitionId:K.id,targetName:W.targetName}}async function tB4($,Z){let X=JN(),Q=await X.getByOrg($.organizationId);if(!Q?.enabled)return;let Y=await X.getLinkByItemId($.itemId,$.organizationId);if(!Y||Y.jiraStatus===Z.targetName)return;let G=new eY(Q.siteUrl,Q.email,Q.apiToken);if(await G.getStatusName(Z.jiraIssueId)===Z.targetName){await X.touchLink($.itemId,{jiraStatus:Z.targetName});return}await G.transitionIssue(Z.jiraIssueId,Z.transitionId),await X.touchLink($.itemId,{jiraStatus:Z.targetName})}async function oB4($){let Z=await XQ.runStep(()=>nB4($),{name:"resolveStatusTransition",retriesAllowed:!0,maxAttempts:3});if(!Z)return;await XQ.runStep(()=>tB4($,Z),{name:"executeStatusTransition",retriesAllowed:!0,maxAttempts:3})}function rB4($,Z){if(Z.updatedBy===bK)return;if(!Fo0||!oD0)return;let X=Fo0;(async()=>{if(!await JN().getLinkByItemId(Z.id,$))return;await XQ.startWorkflow(X,{queueName:aD,workflowID:`jira-status:${Z.id}:${Z.status}:${Date.parse(Z.updatedAt)}`,enqueueOptions:{queuePartitionKey:$}})({organizationId:$,itemId:Z.id})})().catch((Q)=>{console.warn(`[jira] status push enqueue failed for ${Z.id}:`,Q instanceof Error?Q.message:Q)})}async function No0($,Z){try{if(!Ko0)return;if(!await $.storage.jiraIntegrations.getLinkByItemId(Z.taskBoardItemId,Z.organizationId))return;await XQ.startWorkflow(Ko0,{queueName:aD,workflowID:`jira-cmt-push:${Z.commentId}`,enqueueOptions:{queuePartitionKey:Z.organizationId}})(Z)}catch(X){console.warn(`[jira] comment push enqueue failed for ${Z.commentId}:`,X instanceof Error?X.message:X)}}function Uo0(){if(Wo0)return;Wo0=XQ.registerWorkflow(hB4,{name:"jiraSyncWorkflow"}),XQ.registerScheduled(Wo0,{name:"jiraSyncWorkflow",crontab:xB4,mode:bB4.ExactlyOncePerIntervalWhenActive}),Ko0=XQ.registerWorkflow(pB4,{name:"jiraCommentPushWorkflow"}),Fo0=XQ.registerWorkflow(oB4,{name:"jiraStatusPushWorkflow"})}var xB4="2-59/10 * * * *",oD0=null,uB4=30000,Wo0=null,Ko0=null,Fo0=null;var rD0=D(()=>{WK$();fU();Qg();hD0();_K();Yw();nD0();$F$();nt0();tD0()});function aD0($,Z,X,Q){xY({event:$,organizationId:Z,properties:{task_id:X.id,reports_task:bQ(X),...Q}})}function b$($,Z){C5.emit($,{id:crypto.randomUUID(),type:Z0$,source:"task-board",subject:Z.id,data:Z,time:new Date().toISOString()}),Promise.resolve().then(() => (rD0(),KF$)).then((X)=>X.maybeEnqueueJiraStatusPush($,Z)).catch((X)=>{console.warn("[jira] status push hook unavailable:",X)})}function FF$($,Z){C5.emit($,{id:crypto.randomUUID(),type:X0$,source:"task-board",subject:Z,data:{id:Z},time:new Date().toISOString()})}function aB4($,Z){return $?[$]:Z}async function kC($,Z,X){let Q=$.metadata?.runMetadata?.taskBoardItemId,Y=!Q&&X?await $.storage.taskBoard.linkedTaskIds(X,Z):[];return aB4(Q,Y)}async function HF$($,Z,X){let Q=$.organization?.id;if(!Q)return;try{for(let Y of await kC($,Q,X)){let G=await $.storage.taskBoard.getById(Y,Q),J=RC(Z),W=RC(G?.status??"");if(!G||J!==null&&W!==null&&J<=W)continue;let K=await $.storage.taskBoard.update(Y,Q,{status:Z},$.auth?.user?.id??G.updatedBy);if(await $.storage.taskBoard.recordActivity({taskBoardItemId:Y,action:"status_changed",actorId:null,data:{from:G.status,to:Z}}).catch((F)=>console.error("[task-board] activity log write failed",F)),b$(Q,K),Z==="in_progress")aD0("task_run_started",Q,K,{from:G.status})}}catch(Y){console.error("[task-board] run transition failed",Y)}}async function sD0($,Z){let X=$.organization?.id;if(!X)return;try{for(let Q of await kC($,X,Z)){let Y=await $.storage.taskBoard.openReviewCycleIfInProgress(Q,X);if(!Y)continue;b$(X,Y),aD0("task_run_completed",X,Y,{from:"in_progress",via:"pr_open"})}}catch(Q){console.error("[task-board] review-cycle open failed",Q)}}async function eD0($,Z,X,Q){let Y=$.organization?.id;if(!Y)return;try{let G=xD0(Z);if(!G)return;let J=await kC($,Y,Q);for(let W of J)await $.storage.taskBoard.linkPr({taskBoardItemId:W,organizationId:Y,url:G.url,prNumber:G.number,repoOwner:G.owner,repoName:G.repo,connectionId:X??null})}catch(G){console.error("[task-board] PR capture failed",G)}}async function Wg($,Z,X,Q){try{let Y=await $.advanceLinkedTasksToReviewOnThreadFinish(Z,X);for(let G of Y)b$(X,G),aD0("task_run_completed",X,G,{from:"in_progress",via:"thread_finish"});for(let G of Y)await $.clearRunRetry(G.id,X).catch(()=>{})}catch(Y){console.error("[task-board] thread-finish transition failed",Y)}await Bo0($,Z,X),await Oo0($,Q,Z,X)}function NF$($){return(RC($.status)??-1)>=gD0.in_review||Boolean($.reviewCycleStartedAt)}async function Bo0($,Z,X){try{let Q=await $.failedRunInfo(Z,X);if(!Q)return;let Y=eW$(Q);for(let G of await $.linkedTaskIds(Z,X)){let J=await $.getById(G,X);if(!J)continue;if(NF$(J))await $.relabelDeliveredFailure(Z,X,$O4).catch(()=>{});if(J.status!=="in_progress")continue;if(J.reviewCycleStartedAt)continue;if(J.threads.some((F)=>F.hasMessages&&F.status==="in_progress"))continue;let W=J.retryAttempts;if(W<Y){let F=aZ(eB4,sB4,W,2,0.5);if(!await $.scheduleRunRetry(G,X,W+1,new Date(Date.now()+F)))continue;await $.recordActivity({taskBoardItemId:G,action:"status_changed",actorId:null,data:{from:"in_progress",to:"in_progress",retry:W+1,of:Y,reason:Q.errorText??Q.kind}}).catch(()=>{});continue}let K=await $.returnToTodoAfterFailure(G,X,J.updatedBy);if(!K)continue;await $.recordActivity({taskBoardItemId:G,action:"status_changed",actorId:null,data:{from:"in_progress",to:"todo",reason:Q.errorText??Q.kind,retriesSpent:W}}).catch(()=>{}),b$(X,K),aD0("task_run_failed",X,J,{reason:Q.kind??"error",retries_spent:W})}}catch(Q){console.error("[task-board] failed-run reaction failed",Q)}}async function Oo0($,Z,X,Q){try{for(let Y of await $.linkedTaskIds(X,Q)){let G=await $.getById(Y,Q);if(!G)continue;if(NF$(G))continue;if(G.threads.some((W)=>W.hasMessages&&(W.status===null||!sn.has(W.status))))continue;if((await $.listPrs(Y,Q)).length>0)continue;await J0$(Z,Q,Y)}}catch(Y){console.error("[task-board] quota refund pass failed",Y)}}async function Do0($,Z){if(Z.status!=="in_progress"||!aQ(Z))return;try{let X=await $.storage.taskBoard.update(Z.id,Z.organizationId,{status:"in_review"},Z.updatedBy);await $.storage.taskBoard.recordActivity({taskBoardItemId:Z.id,action:"status_changed",actorId:null,data:{from:Z.status,to:"in_review"}}).catch(()=>{}),b$(Z.organizationId,X)}catch(X){console.error(`[task-board] parking ${Z.id} for review failed`,X)}}async function xK($,Z,X){let Q=Z.organizationId;if(Z.assigneeId!==Z8)return!1;try{await Do0($,Z);let Y=await $.storage.taskBoard.unassignSuperAgent(Z.id,Q,Z.updatedBy);if(!Y)return!1;return await z6($,{taskBoardItemId:Z.id,action:"assignee_changed",actorId:null,data:{from:Z.assigneeId,to:null,reason:X}}),console.warn(`[task-board] ${Z.id} handed to a human: ${X}`),b$(Q,Y),!0}catch(Y){return console.error(`[task-board] handing ${Z.id} to a human failed`,Y),!1}}async function UF$($,Z,X){if(!(X instanceof nX))return!1;if(X.reason!=="runs_exhausted")return!1;return await xK($,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 BF$($,Z){let X=$.organization?.id;if(!X)return;try{let Q=await $.storage.taskBoard.reopenLinkedTasksOnThreadRun(Z,X);for(let Y of Q)b$(X,Y)}catch(Q){console.error("[task-board] thread-run reopen failed",Q)}}function OF$($){return $.includes("create_pull_request")||$.includes("createPullRequest")}function DF$($){if(ZO4.test($))return!0;return XO4.test($)&&QO4.test($)}var sB4=30000,eB4=120000,$O4="Run ended after it had already delivered \u2014 the task moved on without it",ZO4,XO4,QO4;var E5=D(()=>{sG();S4();_K();Xg();$K$();W4();rn();C6();WX();vK();ZO4=/\bgh\s+pr\s+create\b/,XO4=/api\.github\.com\/repos\/[^\s"']+\/pulls\b/,QO4=/(?:-X|--request)\s+POST/});function YO4($){if($.status==="completed")return"advance";if($.status==="failed"&&$.messageStorageVersion===2&&($.harnessId==="decopilot"||$.harnessId==="claude-code"))return"nudge";return"none"}function GO4($){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(`
|
|
1364
|
+
${O}`});if(!L)continue;try{await $.storage.jiraIntegrations.createCommentLink({commentId:L.id,organizationId:W,jiraCommentId:B.id})}catch(w){if(w.code==="23505"){await $.storage.taskBoard.deleteComment(L.id,W,bK);continue}throw w}}}class WF${ctx;organizationId;ids=new Map;constructor($,Z){this.ctx=$;this.organizationId=Z}async seed($){if($.length===0)return;let Z=await this.ctx.storage.sprints.upsertManyFromJira(this.organizationId,$.map(YF$));for(let[X,Q]of Z)this.ids.set(X,Q)}async localIdFor($){if(!$)return null;let Z=this.ids.get($.id);if(Z)return Z;let X=await this.ctx.storage.sprints.upsertFromJira(this.organizationId,YF$($));return this.ids.set($.id,X),X}}function YF$($){return{jiraSprintId:$.id,name:$.name,state:$.state,startsAt:$.startsAt,endsAt:$.endsAt}}function _B4($,Z){if($.size===0)return[];return Z.filter((X)=>!$.has(X.jiraIssueId))}async function vB4($,Z,X,Q){let Y=Z.organizationId,G=await X.searchIssueIds(`(${Q}) AND issuetype IN standardIssueTypes()`);if(G.size===0)return console.warn(`[jira] scope for org ${Y} came back empty \u2014 skipping reconciliation rather than archiving the whole board`),0;let J=_B4(G,await $.storage.jiraIntegrations.listLinkedIssuesOnBoard(Y));if(J.length===0)return 0;for(let W of J){let K=await $.storage.taskBoard.getById(W.itemId,Y);if(!K||K.status==="archived")continue;let F=await $.storage.taskBoard.update(W.itemId,Y,{status:"archived"},bK);await $.storage.taskBoard.recordActivity({taskBoardItemId:W.itemId,action:"status_changed",actorId:null,data:{from:K.status,to:"archived"}}),b$(Y,F),console.log(`[jira] ${W.jiraIssueKey} is no longer in board ${Z.boardId}'s scope \u2014 archived its card`)}return J.length}async function fB4($,Z){let{organizationId:X,boardId:Q}=Z;if(!Q)throw Error("No Jira board selected");let Y=await $.storage.organizationSettings.get(Z.organizationId),G=O7(Y?.flags,"org_board_columns"),J=G?await qB4($,Z,Q):FK$(Z.statusMapping);if(J.size===0)throw Error(G?"This Jira board has no columns to mirror":"No status mapping configured");let W=Z.lastSyncedAt===null||Z.rescanPending,K=new eY(Z.siteUrl,Z.email,Z.apiToken),{accountId:F}=await K.myself(),H=new Go0(K),N=new Date,U=await K.getBoardScopeJql(Q),B=MB4(Z,U,N),O=new WF$($,X);await O.seed(await K.listBoardSprints(Q));let L={created:0,updated:0,unchanged:0,skipped:0,archived:0,unmappedStatuses:[]},w=new Set,E,j,z=0,A=0;while(z<Jo0&&A<GF$){A++;let k=await K.searchIssues({jql:B,nextPageToken:j});if(j=k.nextPageToken??void 0,k.issues.length===0){if(!j)break;continue}let M=await $.storage.jiraIntegrations.getLinksByIssueIds(X,k.issues.map((S)=>S.id));await H.resolve(k.issues.flatMap((S)=>[...Zt(S.fields.description),...(S.fields.comment?.comments??[]).flatMap((m)=>Zt(m.body))]));for(let S of k.issues){if(z>=Jo0)break;z++;let m=new Date(S.fields.updated);if(Number.isNaN(m.getTime()))throw Error(`Unparseable updated on ${S.key}`);let f=J.get(S.fields.status.name);if(!f||!ZF$(S)){if(!f&&ZF$(S))w.add(S.fields.status.name);L.skipped++,E=m;continue}let b=M.get(S.id);if(b&&kB4(b.jiraUpdatedAt,m,W)){L.unchanged++,E=m;continue}let i=S.fields.status.name,l={title:S.fields.summary,description:await SB4(Z.siteUrl,S,H),priority:CB4(S),sprintId:await O.localIdFor(bK$(S.sprints)),boardColumnOrg:G?X:null};if(b){let t=b.jiraStatus!==i,N0=await $.storage.taskBoard.getById(b.itemId,X),D0=await $.storage.taskBoard.update(b.itemId,X,{...l,...t?{status:f}:{}},bK);if(await $.storage.jiraIntegrations.touchLink(b.itemId,{jiraStatus:i}),N0&&t&&N0.status!==f)await $.storage.taskBoard.recordActivity({taskBoardItemId:b.itemId,action:"status_changed",actorId:null,data:{from:N0.status,to:f}});if(t&&!W)D0=await XF$($,Z,D0);await QF$($,Z,K,S,b.itemId,F,H),await $.storage.jiraIntegrations.touchLink(b.itemId,{jiraUpdatedAt:m}),b$(X,D0),L.updated++}else{let t=await $.storage.taskBoard.create({organizationId:X,...l,status:f,by:bK});try{await $.storage.jiraIntegrations.createLink({itemId:t.id,organizationId:X,jiraIssueId:S.id,jiraIssueKey:S.key,jiraUpdatedAt:new Date(0),jiraStatus:i})}catch(N0){if(N0.code==="23505"){await $.storage.taskBoard.delete(t.id,X,bK),L.unchanged++,E=m;continue}throw N0}if(!W)t=await XF$($,Z,t);await QF$($,Z,K,S,t.id,F,H),await $.storage.jiraIntegrations.touchLink(t.id,{jiraUpdatedAt:m}),b$(X,t),L.created++}E=m}if(!j)break}L.unmappedStatuses=[...w].sort();let P=VB4(z,A);if(!P)L.archived=await vB4($,Z,K,U);let I=W&&P;if(E===void 0&&z===0)return{counts:L,watermark:N,rescanPending:I};return{counts:L,watermark:E,rescanPending:I}}var bK="jira",Jo0=500,RB4=5,GF$=25,JF$=1e4,IB4;var tD0=D(()=>{u9();hO();C6();GN();E5();nD0();rt0();IB4={highest:"urgent",high:"high",medium:"medium",low:"low",lowest:"low"}});var KF$={};J4(KF$,{setJiraSyncRuntime:()=>Ho0,registerJiraSyncWorkflow:()=>Uo0,maybeEnqueueJiraStatusPush:()=>rB4,enqueueJiraCommentPush:()=>No0});import{DBOS as XQ,SchedulerMode as bB4}from"@dbos-inc/dbos-sdk";function Ho0($){oD0=$}function Qt(){if(!oD0)throw Error("[jira] sync runtime not initialized \u2014 setJiraSyncRuntime() must run before the workflow fires");return oD0}function JN(){let{db:$,encryptionKey:Z}=Qt();return new IC($,new SY(Z))}function yB4(){return new ZQ(Qt().db)}async function gB4($){try{let{db:Z}=Qt(),X=await JN().getById($);if(!X)return{id:$,error:"integration no longer exists"};if(!X.enabled)return{id:$};let Q=await m3(Z,X.organizationId);if(!Q)return{id:$,error:"organization no longer exists"};let Y=await Jg(Q,X);return"error"in Y?{id:$,error:Y.error}:{id:$}}catch(Z){return{id:$,error:Z instanceof Error?Z.message:String(Z)}}}async function hB4($,Z){let X=await XQ.runStep(()=>JN().listEnabledIds(),{name:"loadJiraIntegrations"});for(let Q of X){let Y=await XQ.runStep(()=>gB4(Q),{name:`syncJira:${Q}`});if(Y.error)console.warn(`[jira] sync ${Y.id} failed: ${Y.error}`)}}async function lB4($){let Z=JN();if(!(await Z.getByOrg($.organizationId))?.enabled)return null;let Q=await Z.getLinkByItemId($.taskBoardItemId,$.organizationId);if(!Q)return null;if(await Z.hasCommentLink($.commentId))return null;return{jiraIssueId:Q.jiraIssueId}}async function cB4($){return(await Qt().db.selectFrom("organization").select("slug").where("id","=",$).executeTakeFirst())?.slug??null}async function dB4($,Z,X){let Q=await JN().getByOrg($);if(!Q?.enabled)return null;let G=(await m3(Qt().db,$))?.orgFs;if(!G)return null;let J=new eY(Q.siteUrl,Q.email,Q.apiToken);return eK$(X,{read:(W)=>G.read(W.volume,W.path).catch((K)=>{if(K instanceof VG)return null;throw K}),listAttachments:()=>J.listAttachments(Z),upload:(W)=>J.addAttachment(Z,W),mediaIdFor:(W)=>J.resolveMediaId(W)})}async function mB4($,Z,X){let Q=JN(),Y=await Q.getByOrg($.organizationId);if(!Y?.enabled)return null;let G=await Q.getLinkByItemId($.taskBoardItemId,$.organizationId);if(!G)return null;if(await Q.hasCommentLink($.commentId))return null;return(await new eY(Y.siteUrl,Y.email,Y.apiToken).addComment(G.jiraIssueId,Z,{header:`${$.authorLabel} \xB7 via Studio:`,media:new Map(X)})).id}async function iB4($,Z){try{await JN().createCommentLink({commentId:$.commentId,organizationId:$.organizationId,jiraCommentId:Z})}catch(X){if(X.code!=="23505")throw X}}async function pB4($){let Z=$.body.slice(0,uB4),X=await XQ.runStep(()=>lB4($),{name:"resolveCommentTarget",retriesAllowed:!0,maxAttempts:3});if(!X)return;let Q=[],Y=PK$(Z);if(Y.length>0){let J=await XQ.runStep(()=>cB4($.organizationId),{name:"readOrgSlug",retriesAllowed:!0,maxAttempts:3});for(let W of sK$(Y,J??""))try{let K=await XQ.runStep(()=>dB4($.organizationId,X.jiraIssueId,W),{name:`attachCommentImage:${W.name}`,retriesAllowed:!0,maxAttempts:3});if(K)Q.push([W.target,K])}catch(K){if(!JK$(K))throw K;console.warn(`[jira] could not attach ${W.ref.path}:`,K)}}let G=await XQ.runStep(()=>mB4($,Z,Q),{name:"postCommentToJira",retriesAllowed:!1});if(!G)return;await XQ.runStep(()=>iB4($,G),{name:"recordCommentLink",retriesAllowed:!0,maxAttempts:4})}async function nB4($){let Z=JN(),X=await Z.getByOrg($.organizationId);if(!X?.enabled)return null;let Q=await Z.getLinkByItemId($.itemId,$.organizationId);if(!Q)return null;let Y=await yB4().getById($.itemId,$.organizationId);if(!Y)return null;if(gt0(X.statusMapping,Y.status,Q.jiraStatus))return null;let J=await new eY(X.siteUrl,X.email,X.apiToken).listTransitions(Q.jiraIssueId),W=NK$({mapping:X.statusMapping,lane:Y.status,currentJiraStatus:Q.jiraStatus,availableTransitions:J.map((F)=>F.to.name)});if(W.kind!=="transition"){if(W.kind==="unreachable")console.warn(`[jira] ${Q.jiraIssueKey} is ${Y.status} on the board, but its workflow offers no transition to ${W.targets.join(" / ")} \u2014 `+"the card will not move on the Jira board");return null}let K=J.find((F)=>F.to.name===W.targetName);if(!K)return null;return{jiraIssueId:Q.jiraIssueId,transitionId:K.id,targetName:W.targetName}}async function tB4($,Z){let X=JN(),Q=await X.getByOrg($.organizationId);if(!Q?.enabled)return;let Y=await X.getLinkByItemId($.itemId,$.organizationId);if(!Y||Y.jiraStatus===Z.targetName)return;let G=new eY(Q.siteUrl,Q.email,Q.apiToken);if(await G.getStatusName(Z.jiraIssueId)===Z.targetName){await X.touchLink($.itemId,{jiraStatus:Z.targetName});return}await G.transitionIssue(Z.jiraIssueId,Z.transitionId),await X.touchLink($.itemId,{jiraStatus:Z.targetName})}async function oB4($){let Z=await XQ.runStep(()=>nB4($),{name:"resolveStatusTransition",retriesAllowed:!0,maxAttempts:3});if(!Z)return;await XQ.runStep(()=>tB4($,Z),{name:"executeStatusTransition",retriesAllowed:!0,maxAttempts:3})}function rB4($,Z){if(Z.updatedBy===bK)return;if(!Fo0||!oD0)return;let X=Fo0;(async()=>{if(!await JN().getLinkByItemId(Z.id,$))return;await XQ.startWorkflow(X,{queueName:aD,workflowID:`jira-status:${Z.id}:${Z.status}:${Date.parse(Z.updatedAt)}`,enqueueOptions:{queuePartitionKey:$}})({organizationId:$,itemId:Z.id})})().catch((Q)=>{console.warn(`[jira] status push enqueue failed for ${Z.id}:`,Q instanceof Error?Q.message:Q)})}async function No0($,Z){try{if(!Ko0)return;if(!await $.storage.jiraIntegrations.getLinkByItemId(Z.taskBoardItemId,Z.organizationId))return;await XQ.startWorkflow(Ko0,{queueName:aD,workflowID:`jira-cmt-push:${Z.commentId}`,enqueueOptions:{queuePartitionKey:Z.organizationId}})(Z)}catch(X){console.warn(`[jira] comment push enqueue failed for ${Z.commentId}:`,X instanceof Error?X.message:X)}}function Uo0(){if(Wo0)return;Wo0=XQ.registerWorkflow(hB4,{name:"jiraSyncWorkflow"}),XQ.registerScheduled(Wo0,{name:"jiraSyncWorkflow",crontab:xB4,mode:bB4.ExactlyOncePerIntervalWhenActive}),Ko0=XQ.registerWorkflow(pB4,{name:"jiraCommentPushWorkflow"}),Fo0=XQ.registerWorkflow(oB4,{name:"jiraStatusPushWorkflow"})}var xB4="2-59/10 * * * *",oD0=null,uB4=30000,Wo0=null,Ko0=null,Fo0=null;var rD0=D(()=>{WK$();fU();Qg();hD0();_K();Yw();nD0();$F$();nt0();tD0()});function aD0($,Z,X,Q){xY({event:$,organizationId:Z,properties:{task_id:X.id,reports_task:bQ(X),...Q}})}function b$($,Z){C5.emit($,{id:crypto.randomUUID(),type:Z0$,source:"task-board",subject:Z.id,data:Z,time:new Date().toISOString()}),Promise.resolve().then(() => (rD0(),KF$)).then((X)=>X.maybeEnqueueJiraStatusPush($,Z)).catch((X)=>{console.warn("[jira] status push hook unavailable:",X)})}function FF$($,Z){C5.emit($,{id:crypto.randomUUID(),type:X0$,source:"task-board",subject:Z,data:{id:Z},time:new Date().toISOString()})}function aB4($,Z){return $?[$]:Z}async function kC($,Z,X){let Q=$.metadata?.runMetadata?.taskBoardItemId,Y=!Q&&X?await $.storage.taskBoard.linkedTaskIds(X,Z):[];return aB4(Q,Y)}async function HF$($,Z,X){let Q=$.organization?.id;if(!Q)return;try{for(let Y of await kC($,Q,X)){let G=await $.storage.taskBoard.getById(Y,Q),J=RC(Z),W=RC(G?.status??"");if(!G||J!==null&&W!==null&&J<=W)continue;let K=await $.storage.taskBoard.update(Y,Q,{status:Z},$.auth?.user?.id??G.updatedBy);if(await $.storage.taskBoard.recordActivity({taskBoardItemId:Y,action:"status_changed",actorId:null,data:{from:G.status,to:Z}}).catch((F)=>console.error("[task-board] activity log write failed",F)),b$(Q,K),Z==="in_progress")aD0("task_run_started",Q,K,{from:G.status})}}catch(Y){console.error("[task-board] run transition failed",Y)}}async function sD0($,Z){let X=$.organization?.id;if(!X)return;try{for(let Q of await kC($,X,Z)){let Y=await $.storage.taskBoard.openReviewCycleIfInProgress(Q,X);if(!Y)continue;b$(X,Y),aD0("task_run_completed",X,Y,{from:"in_progress",via:"pr_open"})}}catch(Q){console.error("[task-board] review-cycle open failed",Q)}}async function eD0($,Z,X,Q){let Y=$.organization?.id;if(!Y)return;try{let G=xD0(Z);if(!G)return;let J=await kC($,Y,Q);for(let W of J)await $.storage.taskBoard.linkPr({taskBoardItemId:W,organizationId:Y,url:G.url,prNumber:G.number,repoOwner:G.owner,repoName:G.repo,connectionId:X??null})}catch(G){console.error("[task-board] PR capture failed",G)}}async function Wg($,Z,X,Q){try{let Y=await $.advanceLinkedTasksToReviewOnThreadFinish(Z,X);for(let G of Y)b$(X,G),aD0("task_run_completed",X,G,{from:"in_progress",via:"thread_finish"});for(let G of Y)await $.clearRunRetry(G.id,X).catch(()=>{})}catch(Y){console.error("[task-board] thread-finish transition failed",Y)}await Bo0($,Z,X),await Oo0($,Q,Z,X)}function NF$($){return(RC($.status)??-1)>=gD0.in_review||Boolean($.reviewCycleStartedAt)}async function Bo0($,Z,X){try{let Q=await $.failedRunInfo(Z,X);if(!Q)return;let Y=eW$(Q);for(let G of await $.linkedTaskIds(Z,X)){let J=await $.getById(G,X);if(!J)continue;if(NF$(J))await $.relabelDeliveredFailure(Z,X,$O4).catch(()=>{});if(J.status!=="in_progress")continue;if(J.reviewCycleStartedAt)continue;if(J.threads.some((F)=>F.hasMessages&&F.status==="in_progress"))continue;let W=J.retryAttempts;if(W<Y){let F=aZ(eB4,sB4,W,2,0.5);if(!await $.scheduleRunRetry(G,X,W+1,new Date(Date.now()+F)))continue;await $.recordActivity({taskBoardItemId:G,action:"status_changed",actorId:null,data:{from:"in_progress",to:"in_progress",retry:W+1,of:Y,reason:Q.errorText??Q.kind}}).catch(()=>{});continue}let K=await $.returnToTodoAfterFailure(G,X,J.updatedBy);if(!K)continue;await $.recordActivity({taskBoardItemId:G,action:"status_changed",actorId:null,data:{from:"in_progress",to:"todo",reason:Q.errorText??Q.kind,retriesSpent:W}}).catch(()=>{}),b$(X,K),aD0("task_run_failed",X,J,{reason:Q.kind??"error",retries_spent:W})}}catch(Q){console.error("[task-board] failed-run reaction failed",Q)}}async function Oo0($,Z,X,Q){try{for(let Y of await $.linkedTaskIds(X,Q)){let G=await $.getById(Y,Q);if(!G)continue;if(NF$(G))continue;if(G.threads.some((W)=>W.hasMessages&&(W.status===null||!sn.has(W.status))))continue;if((await $.listPrs(Y,Q)).length>0)continue;await J0$(Z,Q,Y)}}catch(Y){console.error("[task-board] quota refund pass failed",Y)}}async function Do0($,Z){if(Z.status!=="in_progress"||!aQ(Z))return;try{let X=await $.storage.taskBoard.update(Z.id,Z.organizationId,{status:"in_review"},Z.updatedBy);await $.storage.taskBoard.recordActivity({taskBoardItemId:Z.id,action:"status_changed",actorId:null,data:{from:Z.status,to:"in_review"}}).catch(()=>{}),b$(Z.organizationId,X)}catch(X){console.error(`[task-board] parking ${Z.id} for review failed`,X)}}async function xK($,Z,X){let Q=Z.organizationId;if(Z.assigneeId!==Z8)return!1;try{await Do0($,Z);let Y=await $.storage.taskBoard.unassignSuperAgent(Z.id,Q,Z.updatedBy);if(!Y)return!1;return await z6($,{taskBoardItemId:Z.id,action:"assignee_changed",actorId:null,data:{from:Z.assigneeId,to:null,reason:X}}),console.warn(`[task-board] ${Z.id} handed to a human: ${X}`),b$(Q,Y),!0}catch(Y){return console.error(`[task-board] handing ${Z.id} to a human failed`,Y),!1}}async function UF$($,Z,X){if(!(X instanceof nX))return!1;if(X.reason!=="runs_exhausted")return!1;return await xK($,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 BF$($,Z){let X=$.organization?.id;if(!X)return;try{let Q=await $.storage.taskBoard.reopenLinkedTasksOnThreadRun(Z,X);for(let Y of Q)b$(X,Y)}catch(Q){console.error("[task-board] thread-run reopen failed",Q)}}function OF$($){return $.includes("create_pull_request")||$.includes("createPullRequest")}function DF$($){if(ZO4.test($))return!0;return XO4.test($)&&QO4.test($)}var sB4=30000,eB4=120000,$O4="Run ended after it had already delivered \u2014 the task moved on without it",ZO4,XO4,QO4;var E5=D(()=>{sG();S4();_K();Xg();$K$();W4();rn();C6();WX();vK();ZO4=/\bgh\s+pr\s+create\b/,XO4=/api\.github\.com\/repos\/[^\s"']+\/pulls\b/,QO4=/(?:-X|--request)\s+POST/});function YO4($){if($.status==="completed")return"advance";if($.status==="failed"&&$.messageStorageVersion===2&&($.harnessId==="decopilot"||$.harnessId==="claude-code"))return"nudge";return"none"}function GO4($){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(`
|
|
1365
1365
|
`)}async function JO4($,Z,X){await ey($,Z,X,{messageId:`stall-nudge-${Z.id}-${X.id}`,prompt:GO4(X.harness_id),workflowID:`stall-nudge:${Z.id}:${X.id}`})}async function WO4($,Z){let X=await $.storage.threads.get(Z);if(!X)return{action:"none",thread:null};return{action:YO4({status:X.status,messageStorageVersion:X.message_storage_version,harnessId:X.harness_id}),thread:X}}function KO4($,Z=Date.now()){if($.status!=="in_progress")return!1;if($.run_started_at)return!1;return tn($,Z)}async function FO4($,Z){let X=[];for(let Q of Z.threads){if(Q.status!=="in_progress")continue;let Y=await $.storage.threads.get(Q.threadId);if(!Y||!KO4(Y))continue;if(await $.storage.threads.markRunFailed(Q.threadId,Lo0,"abandoned"))X.push(Q.threadId),console.warn(`[task-board] failed never-started thread ${Q.threadId} on ${Z.id}`)}return X}async function LF$($,Z){let X=$.organization?.id;if(!X)return;for(let Q of Z){if(Q.status==="in_progress")try{if((await FO4($,Q)).length>0)continue}catch(J){console.error(`[task-board] reaping threads for ${Q.id} failed`,J)}let Y;try{Y=Q.repo!=null&&(await $.storage.taskBoard.listPrs(Q.id,X)).length>0}catch(J){console.error(`[task-board] listPrs for ${Q.id} failed`,J);continue}if(!bt0(Q,Y))continue;let G=Q.threads.find((J)=>J.hasMessages);if(!G)continue;try{let{action:J,thread:W}=await WO4($,G.threadId);if(J==="none"||!W)continue;if(J==="advance")await Wg($.storage.taskBoard,G.threadId,X,$.storage.organizationBilling);else await JO4($,Q,W)}catch(J){console.error(`[task-board] stall recovery failed for ${Q.id}`,J)}}}var Lo0="Run never started \u2014 no pod picked it up before the idle window elapsed";var wo0=D(()=>{SD0();_K();E5()});import{z as NJ}from"zod";var HO4,VC;var Eo0=D(()=>{hO();M0();CQ();c3();wo0();HO4=NJ.object({key:NJ.string(),title:NJ.string(),position:NJ.number(),role:NJ.string().nullable()}),VC=u({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:NJ.object({}),outputSchema:NJ.object({items:NJ.array(py),repos:NJ.array(NJ.string()),sprints:NJ.array(VJ$),columns:NJ.array(HO4)}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");let[Q,{items:Y},G,J]=await Promise.all([Z.storage.taskBoard.list(X),Z.storage.connections.list(X,{slug:"mcp-github"}),Z.storage.sprints.listByOrg(X),rQ(Z,X).then((K)=>K.columns())]),W=Ge1(Y);return LF$(Z,Q),{items:Q,repos:W,sprints:G,columns:J}}})});import{z as $G}from"zod";function BO4($){return UO4.some((Z)=>$[Z]!==void 0)}function OO4($,Z){let X=[];for(let{field:G,action:J}of NO4){if(Z[G]===$[G])continue;X.push({action:J,data:{from:$[G],to:Z[G]}})}if(Z.description!==$.description)X.push({action:"description_changed"});let Q=new Set($.tags.map((G)=>G.id));if(Z.tags.length!==$.tags.length||Z.tags.some((G)=>!Q.has(G.id)))X.push({action:"tags_changed",data:{from:$.tags,to:Z.tags}});return X}function DO4($,Z){if($!==Z8)return!1;if(!Z)return!1;return Z.assigneeId!==Z8?!0:Z.status==="todo"}function wO4($,Z,X){let Q=$!==void 0&&LO4.has($),Y=Z!==void 0&&aQ(Z);return X&&Q&&Y}function jo0($,Z){return $!==void 0&&yt0($)&&!Z}var NO4,UO4,LO4,SC;var $L0=D(()=>{hO();M0();u9();c3();vK();hn0();GN();WX();gO();E5();Xg();sG();NO4=[{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"}],UO4=["title","description","status","priority","type","assigneeId","repo","dueDate","sortOrder","tagIds"];LO4=new Set(["approved","merged","post_deploy_validation","done","archived"]);SC=u({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:$G.object({id:$G.string(),title:$G.string().min(1).max(eO0).optional(),description:$G.string().max(sO0).nullable().optional(),status:rH.optional(),priority:LC.optional(),type:vn.optional(),assigneeId:$G.string().nullable().optional(),repo:$G.string().max($D0).nullable().optional(),dueDate:$G.string().datetime().nullable().optional(),sortOrder:$G.number().optional(),tagIds:$G.array($G.string()).max(1000).optional(),linkThreadId:$G.string().optional(),prUrl:$G.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:$G.object({item:py}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");let Q=$.prUrl?nO($.prUrl):null;if($.prUrl&&!Q)throw Error(`Not a GitHub pull request URL: ${$.prUrl} (expected https://github.com/<owner>/<repo>/pull/<number>)`);if($.assigneeId)await ZD0(Z,X,$.assigneeId);if($.linkThreadId){if(!await Z.storage.taskBoard.getById($.id,X))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,X)}let Y=BO4($),G=Y?await Z.storage.taskBoard.getById($.id,X):null;if(Y&&!G)throw Error(`Task board item not found: ${$.id}`);if($.status!==void 0)await rO0(await rQ(Z,X),$.status);if($.status!==void 0&&yt0($.status)){let H=await Z.storage.organizationSettings.get(X);if(jo0($.status,O7(H?.flags,"delivery_lanes_enabled")))throw Error("Delivery lanes are not enabled for this organization \u2014 enable "+"them in Settings before moving a task to Approved, Merged, or Post-deploy Validation.")}let J=oH.getStore()!==void 0;if(wO4($.status,G??void 0,J))throw Error("This task is under review \u2014 a run can't move it to Done or Archived. "+"Leave it for the reviewer; only a person, or TASK_BOARD_REVIEW_DECISION on a reviewer's own run, closes out a task under review.");let W=$.assigneeId!==void 0&&$.assigneeId!==(G?.assigneeId??null),K=DO4($.assigneeId,G);if(G&&bQ(G)){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(K)await Ky(Z,G,FO())}if($.tagIds!==void 0){let H=await Z.storage.tags.listOrgTags(X),N=new Set(H.map((U)=>U.id));for(let U of $.tagIds)if(!N.has(U))throw Error(`Tag not found: ${U}`);await Z.storage.taskBoard.setItemTags($.id,$.tagIds,o0(Z))}let F;if(Y)F=await Z.storage.taskBoard.update($.id,X,{title:$.title,description:$.description,status:K?"todo":$.status,priority:$.priority,type:$.type,assigneeId:$.assigneeId,assignedBy:W?$.assigneeId?o0(Z):null:void 0,repo:$.repo,dueDate:$.dueDate,sortOrder:$.sortOrder},o0(Z));else{let H=await Z.storage.taskBoard.getById($.id,X);if(!H)throw Error(`Task board item not found: ${$.id}`);F=H}if(Q)await Z.storage.taskBoard.linkPr({taskBoardItemId:F.id,organizationId:X,url:Q.url,prNumber:Q.number,repoOwner:Q.owner,repoName:Q.repo,connectionId:null});if(G){let H=o0(Z),N=OO4(G,F);if(N.length>0)await ZK$(Z,N.map((U)=>({taskBoardItemId:F.id,actorId:H,...U,alsoSubscribe:U.action==="assignee_changed"&&F.assigneeId!==Z8?[F.assigneeId]:void 0})))}if(G&&F.description!==G.description)await Z.storage.notifications.notifyMentions({taskBoardItemId:F.id,organizationId:X,actorId:o0(Z),body:F.description??"",previousBody:G.description});if(Y||$.linkThreadId||Q)b$(X,F);if(K)await aO(Z,F,{userInitiated:!0});return{item:F}}})});import{z as ZL0}from"zod";var CC;var zo0=D(()=>{M0();E5();CC=u({name:"TASK_BOARD_ITEM_DELETE",description:"Delete a task board item. A reports-pushed task also dismisses its finding, so the next diagnostic import won't re-create the card.",annotations:{title:"Delete Task Board Item",readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:ZL0.object({id:ZL0.string()}),outputSchema:ZL0.object({success:ZL0.boolean()}),handler:async($,Z)=>{o(Z),await Z.access.check();let X=Z.organization?.id;if(!X)throw Error("Organization ID required (no active organization in context)");if(!await Z.storage.taskBoard.delete($.id,X,o0(Z)??"system"))throw Error(`Task board item not found: ${$.id}`);return FF$(X,$.id),{success:!0}}})});function _C($){if($.length===0)return!1;let Z=new Map;for(let X of $){let Q=`${X.repoOwner}/${X.repoName}`.toLowerCase(),Y=Z.get(Q);if(Y)Y.push(X);else Z.set(Q,[X])}return[...Z.values()].every(EO4)}function EO4($){return $.some((Z)=>Z.merged===!0)&&$.every((Z)=>Z.merged===!0||Z.state==="closed")}async function jO4($,Z,X,Q){let Y=await $.storage.taskBoard.getById(X,Z);if(!Y||Y.status!=="done")return!1;let G=await $.storage.taskBoard.listPrs(X,Z),J=await Promise.all(G.map(async(F)=>({...F,...await Q($,Z,F)})));if(!_C(J))return!1;let W=await(await rQ($,Z)).archiveColumn();if(!W)return!1;let K=await $.storage.taskBoard.update(X,Z,{status:W},Y.updatedBy);return await z6($,{taskBoardItemId:X,action:"status_changed",actorId:null,data:{from:"done",to:W,reason:"merged_pr_auto_archive"}}),b$(Z,K),!0}async function wF$($,Z,X,Q=QL0){let Y=0;for(let G of X)try{if(await jO4($,Z,G,Q))Y+=1}catch(J){console.error(`[task-board-archive] ${G} failed`,J)}return{archived:Y}}function XL0($){let Z=new Map;for(let{id:X,organizationId:Q}of $){let Y=Z.get(Q);if(Y)Y.push(X);else Z.set(Q,[X])}return[...Z].map(([X,Q])=>({organizationId:X,itemIds:Q}))}var Kg=D(()=>{hO();WX();ZG();E5()});function YL0($){return $.replace(/\/api\/[^/\s)]+\/fs\/([^/\s)]+)\/read\?path=([^)\s]+)/g,(Z,X,Q)=>{let Y;try{Y=decodeURIComponent(Q)}catch{return Z}if(Y.startsWith("/")||Y.split("/").includes(".."))return Z;return TK(decodeURIComponent(X),Y)})}function GL0($,Z){return Z===$?null:"The image and file links in that description are real paths in this sandbox, not URLs \u2014 `Read` them. A screenshot the task points at is usually the clearest statement of what it wants."}var Po0=D(()=>{gE()});function zO4($){let Z=new Map($.map((G)=>[G.id,G])),X=new Map;for(let G of iy($)){let J=EF$(G.owner,G.repo);X.set(J,[...X.get(J)??[],G])}if(X.size!==1)return null;let Q=[...X.values()][0],Y=Q.find((G)=>{let J=Z.get(G.connectionId);return J?wE(J):!1})??Q[0];return{connectionId:Y.connectionId,owner:Y.owner,name:Y.repo,installationId:Y.installationId,url:`https://github.com/${Y.owner}/${Y.repo}`}}async function JL0($,Z){if(!As())return console.warn(`[task-board] claude-code skipped for org ${Z}: `+"hosted sandbox unavailable \u2014 running Decopilot"),null;try{let{items:X}=await $.storage.connections.list(Z,{slug:"mcp-github"}),Q=zO4(X);if(Q)return{repo:Q};let Y=new Map;for(let J of iy(X)){let W=EF$(J.owner,J.repo);if(!Y.has(W))Y.set(W,{connectionId:J.connectionId,repo:`${J.owner}/${J.repo}`})}let G=Y;if(G.size===0)return console.warn(`[task-board] claude-code skipped for org ${Z}: `+"no importable repos \u2014 running Decopilot"),null;return console.warn(`[task-board] claude-code for org ${Z}: ${G.size} importable repos \u2014 the run picks one with TASK_ADD_REPO`),{choices:[...G.values()]}}catch(X){return console.warn("[task-board] repo lookup for claude-code failed",X),null}}function jF$($,Z,X){let Q=["You've been assigned this task. Complete it and finish with a pull request if it makes sense (like a coding task) or is explicitly requested.","","You are running AUTONOMOUSLY \u2014 no human is watching, so drive this to "+"completion yourself. Make reasonable decisions and move on; do not stop to ask for confirmation.","",`Title: ${$.title}`];if($.description){let Y=YL0($.description);Q.push("","Description:",Y);let G=GL0($.description,Y);if(G)Q.push("",G)}if(Q.push("",Z?`The repository ${Z.owner}/${Z.name} is already cloned at your working directory, on its own branch. \`git\` and \`gh\` are authenticated. ${Ip}`:["Your working directory is EMPTY: this organization has several repositories, so nothing has been cloned yet. FIRST call `mcp__studio__TASK_ADD_REPO` with the connectionId of the repository this task is about. It clones that repository into your working directory and waits for the checkout, so once it returns the repository is there on its own branch and `git` and `gh` are authenticated. Do not read files, run `git`, or run `gh` before it returns; there is nothing there yet.","","Repositories in this organization:",...(X?.repoChoices??[]).map((Y)=>`- ${Y.repo} (connectionId: ${Y.connectionId})`),X?.repoChoices?.length?"Start with the one the task is about. If it turns out to need a change in "+"another of them too, call `mcp__studio__TASK_ADD_REPO` again \u2014 repositories "+"accumulate, so a second call adds a checkout beside the first rather than replacing it. Each lands in its own directory and keeps its own git remote, so open one pull request per repository you changed.":"Call `mcp__studio__TASK_ADD_REPO` with no arguments to list them."].join(`
|
|
1366
1366
|
`),""),X?.resolveConflict&&X.pr)Q.push(`Pull request #${X.pr.number} (${X.pr.url}) is approved but has a MERGE CONFLICT with its base branch.`,`Check that branch out (\`gh pr checkout ${X.pr.number}\`), merge or rebase the base branch into it, resolve the conflicts, and push to update the SAME pull request \u2014 do NOT open a new one. Resolve by preserving BOTH sides' intent; never blindly discard either side, and change only what the conflict requires.`,"");else if(X?.feedback)Q.push(X.pr?`A reviewer requested changes on pull request #${X.pr.number} (${X.pr.url}):`:"A reviewer requested changes on your previous work:",X.feedback,X.pr?`Check that branch out (\`gh pr checkout ${X.pr.number}\`) before editing, address the feedback, then push to update the SAME pull request \u2014 do NOT open a new one.`:"Address this feedback.","");else if(X?.pr)Q.push(`This task already has an open pull request #${X.pr.number} (${X.pr.url}), and you are already on its branch.`,"Continue that work: commit and push to update the SAME pull request \u2014 do NOT open a new one. If it already does everything the task asks, say so and stop rather than changing it.","");return Q.push("How to finish:","- Make the change, commit it, push the branch, and open a pull request"+(X?.pr?" \u2014 or push to the existing one, per the instruction above.":"."),"- Change only what the task needs. Don't refactor around it.","- The change must be REACHABLE from the surface the task names: edit the component that route actually renders, not one that merely looks like the right place. A change nothing imports is dead code, and it is the most common reason a task comes back rejected.","- Before handing over, VERIFY the task's outcome LOCALLY, in the sandbox: exercise the affected code path (the dev server hot-reloads, so hit the route it renders) and confirm the behaviour actually happens. A green test suite is not the bar. Do NOT wait for, or verify against, the PR's deploy preview \u2014 a reviewer checks that after you hand over.","- For a VISUAL change that means LOOKING at it: `qa-screenshot <url> <path>.png [--mobile] [--full] [--selector=<css>]` renders the page in headless Chromium \u2014 it reaches your own dev server on localhost, and unlike `curl` it runs the page's JS, so lazily-rendered sections are actually there. Then `Read` the file: a screenshot you never opened is not verification. It is already installed; do NOT look for playwright in the repo's `node_modules` or start a browser yourself.","- As soon as `gh pr create` prints the URL, call `mcp__studio__TASK_BOARD_ITEM_PR_LINK` with that url. Do this even if you also mention the PR in a comment \u2014 the reviewers are dispatched from the linked PR, not from your message.",'- If the task turns out to need no code change, do NOT open a PR: explain why in a comment on the task (`mcp__studio__TASK_BOARD_COMMENT_CREATE`) and move it to "done". There is nothing for a reviewer to review, so leaving it for one would strand it.',`- Anything a reviewer should know (a decision you made, something you found and deliberately left alone, a question) goes on the task as a comment: \`mcp__studio__TASK_BOARD_COMMENT_CREATE\` with taskBoardItemId "${$.id}". Read what's already there first with \`mcp__studio__TASK_BOARD_COMMENT_LIST\` \u2014 a comment may be addressed to you.`,"",`(task id: ${$.id})`),Q.join(`
|
|
1367
1367
|
`)}var EF$=($,Z)=>`${$}/${Z}`.toLowerCase();var Ao0=D(()=>{tO0();CQ();C6();R$();Po0()});import{createHmac as PO4,randomBytes as AO4,timingSafeEqual as TO4}from"crypto";function RO4(){if(WL0)return WL0;let $;try{let Z=b0();$=Z.studioJwtSecret??Z.betterAuthSecret}catch{$=void 0}return WL0=$?Buffer.from($):AO4(32),WL0}function To0($,Z,X){return`rtok_${PO4("sha256",RO4()).update(`${$}:${Z}:${X.toISOString()}`).digest("base64url")}`}function zF$($,Z,X,Q){let Y=Buffer.from($),G=Buffer.from(To0(Z,X,Q));return Y.length===G.length&&TO4(Y,G)}var WL0=null;var Ro0=D(()=>{R$()});import{createHash as IO4}from"crypto";function Yt($,Z){if($.status===null||PF$.has($.status))return!1;return!tn({updated_at:$.lastActiveAt,last_progress_at:null},Z)}function qO4($,Z){return $.threads.some((X)=>!NK.some((Q)=>WO(X.title,Q))&&Yt(X,Z))}function VO4($,Z){return Z-$>=kO4}async function KL0($,Z,X){let Q=await $.storage.organizationSettings.get(Z.organizationId),Y=CH(Q?.flags);if(Y.length===0)return;if(qO4(Z,Date.now()))return;let G=O7(Q?.flags,"cheap_reviewer_model")?"reviewer":"default",J=await $.storage.taskBoard.listActivity(Z.id,Z.organizationId),W=Z.reviewCycleStartedAt,K=_H(J,W),F=new Date(K),H=KO(J,{cycleStartedAt:W});await Promise.all(Y.map(async(N)=>{let U=H.has(N);if(!U){let O=xO4(J,K),L=bO4(Z,N,K,O);if(L){await uO4($,Z,N,L).catch((w)=>console.error(`[task-board] ${N} verdict nudge failed`,w));return}if(gO4(O,Date.now()))return}if(vO4(Z,N,K,Date.now(),U)){await xK($,Z,`${UK[N]} failed ${Io0} times on `+"this review \u2014 it will not be retried");return}if(X?.previewMatchesHead===!1){if(VO4(K,Date.now()))await xK($,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(fO4(Z,N,K,Date.now(),U))return;let B=SO4(Z,N,K,Date.now(),U);await dO4($,Z,N,F,B,G).catch((O)=>console.error(`[task-board] ${N} reviewer enqueue failed`,O))}))}function SO4($,Z,X,Q=Date.now(),Y=!0){return $.threads.filter((G)=>WO(G.title,Z)&&qo0(G,Q,Y)&&new Date(G.createdAt).getTime()>=X).length}function CO4($,Z){if(!$||!Z||!("choices"in Z))return null;return Z.choices.find((X)=>X.repo===$)?.connectionId??null}function _O4($,Z,X){let Q=$.threads.filter((Y)=>WO(Y.title,Z)&&Y.status==="completed"&&new Date(Y.createdAt).getTime()<X).map((Y)=>new Date(Y.lastActiveAt).getTime()).filter((Y)=>Number.isFinite(Y));return Q.length===0?0:Math.max(...Q)}function qo0($,Z,X=!0){if($.status==="failed")return!0;if($.status!==null&&PF$.has($.status))return!X;return $.status!==null&&!Yt($,Z)}function AF$($,Z,X,Q=Date.now()){return $.threads.filter((Y)=>{if(!WO(Y.title,Z))return!1;return Yt(Y,Q)||new Date(Y.createdAt).getTime()>=X})}function vO4($,Z,X,Q=Date.now(),Y=!0){let G=AF$($,Z,X,Q);return G.length>0&&G.every((J)=>qo0(J,Q,Y))&&G.length>=Io0}function fO4($,Z,X,Q=Date.now(),Y=!0){let G=AF$($,Z,X,Q);if(G.length===0)return!1;if(G.some((W)=>Yt(W,Q)))return!0;let J=G.filter((W)=>qo0(W,Q,Y));if(J.length>=Io0)return!0;return J.length!==G.length}function bO4($,Z,X,Q,Y=Date.now()){return $.threads.find((G)=>WO(G.title,Z)&&G.status==="completed"&&!Yt(G,Y)&&new Date(G.createdAt).getTime()>=X&&!Q.has(G.threadId))??null}function xO4($,Z){let X=new Map;for(let Q of $){if(Q.action!=="review_verdict_requested")continue;let Y=new Date(Q.occurredAt).getTime();if(Y<Z)continue;let G=Q.data?.threadId;if(typeof G==="string")X.set(G,Y)}return X}function gO4($,Z){for(let X of $.values())if(Z-X<yO4)return!0;return!1}function hO4($){return[`Your ${UK[$]} 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(`
|
|
@@ -2876,7 +2876,7 @@ Respond with the structured verdict and a short reason.`,hl$;var ll$=D(()=>{c4()
|
|
|
2876
2876
|
${G.join(`
|
|
2877
2877
|
`)}`:Y}function JN6($){let Z=new Set;for(let X of $)for(let Q of X.split(`
|
|
2878
2878
|
`)){let Y=Q.trim();if(/^Co-authored-by:\s/i.test(Y))Z.add(Y)}return[...Z]}var Ac$=200,aH6=12,eH6,ZN6=300,w71=3;var E71=D(()=>{cD();WT0();eH6={aheadBy:0,behindBy:0,files:[]}});function KN6($){if(!$||$.includes(".."))return!1;return WN6.test($)}function Rc$($){let Z=typeof $.__resolveType==="string"?$.__resolveType:null;if(!Z||!KN6(Z))return null;let{__resolveType:X,...Q}=$;return{resolveType:Z,payload:Q}}function Ic$($,Z){return`${$.replace(/\/+$/,"")}/deco/invoke/${Z}`}var WN6;var qc$=D(()=>{WN6=/^[\w./@-]+$/});function Ns($,Z){let X=$?.githubRepo;if(!X?.owner||!X?.name)return null;if(!X.connectionId)return X;if(!Z.includes(X.connectionId))return null;return X}async function Mc$($,Z,X,Q){if(!Q.connectionId)throw new Nv("Push requires a connected GitHub account. Connect mcp-github for this project and restart the sandbox.");let Y=$.organization?.id;if(!Y)throw new Nv(G9);await qO({ctx:$,connectionId:Q.connectionId,organizationId:Y,forceRefresh:!0,onLegacyMintError:(H)=>{let N=H instanceof Error?H.message:G9;throw new Nv(N)}});let{cloneUrl:G,gitUserName:J,gitUserEmail:W}=await AK(Q.connectionId,Q.owner,Q.name,$.db,$.vault).catch((H)=>{let{code:N,message:U}=j5$(H instanceof Error?H.message:String(H));throw N?new Nv(U):H}),K=gu($),F=await Z.proxyDaemonRequest(X,"/_sandbox/config",{method:"PUT",headers:new Headers({"content-type":"application/json"}),body:JSON.stringify({git:{repository:{cloneUrl:G},identity:{userName:J,userEmail:W}},...K?{operator:K}:{}})});if(!F.ok){let H=await IO(F,FN6).catch(()=>F.statusText);throw Error(`Failed to refresh sandbox git credentials (${F.status}): ${H}`)}}var FN6=10485760,Nv;var j71=D(()=>{QJ();rA0();Xn();Ni0();Iy();Nv=class Nv extends Error{constructor($){super($);this.name="GitPushAuthError"}}});function NN6($){let Z=$.startsWith("thread:")?$.slice(7):$;if(!Z||Z.length>255||Z.includes("..")||Z.startsWith("/")||Z.endsWith("/")||Z.endsWith(".lock")||!HN6.test(Z))throw Error(`Invalid branch name: ${$}`)}function Uv($){return AbortSignal.any([$.req.raw.signal,AbortSignal.timeout(BN6)])}async function DN6($,Z){let X=$.var.studioContext,Q=ZJ(Z.branch),Y=$.req.query("thread")??Q,G=Y&&Y===Q?Z.branchThread:Y?await X.storage.threads.get(Y).catch(()=>null):null,J=G?.virtual_mcp_id===Z.virtualMcpId?G:null,W=DC(J?.metadata?.runtime);if(W)return W;let K=dO0(Z.virtualMcpMetadata),F=K==="cms"?await $71(X,{claimName:Z.claimName}):"alive",H=K==="cms"&&F!=="alive"?"cms":"sandbox",N=!!J&&(F==="gone"||F==="alive"&&K==="cms");if(N&&J)Cn(X,J.id,H);if(K==="cms")console.log("sandbox proxy: no runtime stamp",{route:$.req.path,method:$.req.method,reason:J?"unstamped":"threadless",liveness:F,resolved:H,stamped:N});return H}async function LN6($){let Z=$.get("vmClaim");if(Z.runner)return Z.runner;try{return await $Q($.var.studioContext)}catch{return null}}function Bv($){let{runner:Z}=$.get("vmClaim");if(!Z)return $.json({error:"No sandbox runner configured"},503);return Z}async function du($){let{virtualMcpMetadata:Z,connectionIds:X}=$.get("vmClaim"),Q=$.var.studioContext,Y=Ns(Z,X);if(!Y)throw new h4(404,"AUTH","repo","Project has no GitHub repository");let G=r(Q);return aA0(Q,G.id,Y)}function z71($,Z){if(Z instanceof XA0)return $.json({error:Z.message},429,{...P5,...Z.retryAfterMs===null?{}:{"Retry-After":String(Math.ceil(Z.retryAfterMs/1000))}});if(Z instanceof h4){let Q=Z.status===404?404:Z.status===409||Z.status===422?409:502;return $.json({error:Z.message},Q,P5)}let X=Z instanceof Error?Z.message:String(Z);return $.json({error:X},502,P5)}async function Sc$($,Z,X){let Q;try{Q=await fetch(Z,X)}catch{return $.json({error:"Preview unreachable"},502)}let Y;try{Y=await Q.text()}catch{return $.json({error:"Preview unreachable"},502)}return new Response(Y,{status:Q.status,headers:{"content-type":Q.headers.get("content-type")??"application/json"}})}async function Cc$($){try{let Z=await du($),X=await KT0(Z,$.get("vmClaim").branch);return $.json(X,200,P5)}catch(Z){return z71($,Z)}}function Us($,Z){let Q=(NT0.get($)??Promise.resolve()).catch(()=>{}).then(Z),Y=Q.catch(()=>{});return NT0.set($,Y),Y.finally(()=>{if(NT0.get($)===Y)NT0.delete($)}),Q}async function tZ($,Z,X){if(!X?.runner&&$.get("vmClaim").runtime==="cms")return $.json({error:"sandbox not found: this session is sandbox-less"},404,P5);let Q=X?.runner??Bv($);if(Q instanceof Response)return Q;let{claimName:Y,userId:G,projectRef:J}=$.get("vmClaim"),W=X?.method??"POST",K=null,F=new Headers;if(X?.jsonBody!==void 0)K=X.jsonBody,F.set("content-type","application/json");else if(X?.forwardJsonBody)K=await $.req.text(),F.set("content-type","application/json");let H=X?.signal,N={method:W,headers:F,body:K,...H?{signal:H}:{}},U=async()=>{let B=await Q.proxyDaemonRequest(Y,Z,N);if(X?.map404to410&&B.status===404){try{await B.body?.cancel()}catch{}if(await Q.adoptLiveClaim({userId:G,projectRef:J},Y))B=await Q.proxyDaemonRequest(Y,Z,N);if(B.status===404){try{await B.body?.cancel()}catch{}return new Response(JSON.stringify({error:"Sandbox handle is gone. The sandbox needs to be re-provisioned."}),{status:410,headers:{"content-type":"application/json",...P5}})}}let O=await B.text(),L=X?.redactRepoDir?wN6(O):O,w=B.headers.get("content-type")??"application/json";return new Response(L,{status:B.status,headers:{"content-type":w,...P5}})};try{if(H){let B=U();return B.catch(()=>{}),await Promise.race([B,new Promise((L,w)=>{if(H.aborted)return w(H.reason);H.addEventListener("abort",()=>w(H.reason),{once:!0})})])}return await U()}catch(B){let O=B instanceof Error?B.message:String(B);return $.json({error:`Daemon unreachable: ${O}`},502)}}function wN6($){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 UT0($,Z,X,Q="GET",Y){let G=await $.proxyDaemonRequest(Z,X,{method:Q,headers:new Headers,body:null});if(G.status===404&&Y){try{await G.body?.cancel()}catch{}if(await $.adoptLiveClaim(Y,Z))G=await $.proxyDaemonRequest(Z,X,{method:Q,headers:new Headers,body:null})}if(G.status===404){try{await G.body?.cancel()}catch{}throw Error("SANDBOX_GONE")}let J=await G.text();if(!G.ok){let W=`Daemon error (${G.status})`;try{W=JSON.parse(J).error??W}catch{}throw Error(W)}return JSON.parse(J)}function EN6($){return _c$.includes($)}var HN6,kc$=524288,UN6=65536,BN6=1e4,Vc$=2000,ON6,NT0,P5,_c$,vc$=()=>{let $=new H1;$.use("/:virtualMcpId/:branch/*",ON6),$.post("/:virtualMcpId/:branch/write",(X)=>tZ(X,"/_sandbox/write",{forwardJsonBody:!0,signal:Uv(X)})),$.post("/:virtualMcpId/:branch/unlink",(X)=>tZ(X,"/_sandbox/unlink",{forwardJsonBody:!0,signal:Uv(X)})),$.post("/:virtualMcpId/:branch/mkdir",(X)=>tZ(X,"/_sandbox/mkdir",{forwardJsonBody:!0,signal:Uv(X)})),$.post("/:virtualMcpId/:branch/rename",(X)=>tZ(X,"/_sandbox/rename",{forwardJsonBody:!0,signal:Uv(X)})),$.post("/:virtualMcpId/:branch/read",(X)=>tZ(X,"/_sandbox/read",{forwardJsonBody:!0,signal:Uv(X)})),$.post("/:virtualMcpId/:branch/glob",(X)=>tZ(X,"/_sandbox/glob",{forwardJsonBody:!0,signal:Uv(X)})),$.post("/:virtualMcpId/:branch/grep",(X)=>tZ(X,"/_sandbox/grep",{forwardJsonBody:!0,signal:Uv(X)})),$.post("/:virtualMcpId/:branch/exec/:script",async(X)=>{let Q=X.req.param("script");if(!Q)return X.json({error:"missing script name"},400);return tZ(X,`/_sandbox/exec/${encodeURIComponent(Q)}`)}),$.post("/:virtualMcpId/:branch/exec/:script/kill",async(X)=>{let Q=X.req.param("script");if(!Q)return X.json({error:"missing script name"},400);return tZ(X,`/_sandbox/exec/${encodeURIComponent(Q)}/kill`)}),$.get("/:virtualMcpId/:branch/config",(X)=>tZ(X,"/_sandbox/config",{method:"GET",map404to410:!0,redactRepoDir:!0})),$.put("/:virtualMcpId/:branch/config",(X)=>tZ(X,"/_sandbox/config",{method:"PUT",forwardJsonBody:!0,map404to410:!0})),$.post("/:virtualMcpId/:branch/setup/:step",async(X)=>{let Q=X.req.param("step");if(!Q||!EN6(Q))return X.json({error:`step must be one of: ${_c$.join(", ")}`},400);let Y=X.get("vmClaim"),G=await $71(X.var.studioContext,{claimName:Y.claimName})==="gone"?null:await LN6(X);if(!G)return X.json({error:"sandbox not found: nothing is running at this ref"},404,P5);if(Q==="start"){let J=r(X.var.studioContext),W=Ty(Y.virtualMcpMetadata);try{await G70({ctx:X.var.studioContext,runner:G,handle:Y.claimName,orgId:J.id,userId:Y.callerUserId,entries:W})}catch(K){let F=K instanceof Error?K.message:String(K);return X.json({error:`Failed to push env to daemon: ${F}`},502)}}return tZ(X,`/_sandbox/setup/${Q}`,{signal:X.req.raw.signal,map404to410:!0,runner:G})}),$.get("/:virtualMcpId/:branch/events",(X)=>{let Q=X.get("vmClaim");if(!Q.runner)return dN(X,async(Y)=>{await Y.writeSSE({event:"phase",data:JSON.stringify({kind:"failed",reason:"unknown",message:"No sandbox runner configured on this studio instance."})})});return vl$(X,{ctx:X.var.studioContext,claimName:Q.claimName,runner:Q.runner,virtualMcpId:Q.virtualMcpId,branch:Q.branch,userId:Q.userId,projectRef:Q.projectRef,virtualMcpMetadata:Q.virtualMcpMetadata})}),$.get("/:virtualMcpId/:branch/git/status",(X)=>{if(X.get("vmClaim").runtime==="cms")return Cc$(X);return Z(X)});let Z=(X)=>tZ(X,"/_sandbox/git/status",{method:"GET",map404to410:!0,signal:AbortSignal.any([X.req.raw.signal,AbortSignal.timeout(Vc$)])});return $.post("/:virtualMcpId/:branch/git/status",(X)=>{if(X.get("vmClaim").runtime==="cms")return Cc$(X);return tZ(X,"/_sandbox/git/status",{map404to410:!0,signal:AbortSignal.any([X.req.raw.signal,AbortSignal.timeout(Vc$)])})}),$.post("/:virtualMcpId/:branch/git/diff",async(X)=>{let Q=X.get("vmClaim");if(Q.runtime==="cms")try{let Y=await X.req.json().catch(()=>({})),G=await du(X),J=await FT0(G,Q.branch,Y.base);return X.json(J,200,P5)}catch(Y){return z71(X,Y)}return tZ(X,"/_sandbox/git/diff",{forwardJsonBody:!0,map404to410:!0})}),$.post("/:virtualMcpId/:branch/git/publish",async(X)=>{if(X.get("vmClaim").runtime==="cms")return X.json({ok:!0},200,P5);let Q=Bv(X);if(Q instanceof Response)return Q;let{claimName:Y,virtualMcpMetadata:G,connectionIds:J}=X.get("vmClaim"),W=X.var.studioContext;return Us(Y,async()=>{try{await Z71(W,Q,Y);let K=Ns(G,J);if(K)await Mc$(W,Q,Y,K)}catch(K){if(K instanceof Nv)return X.json({error:K.message},403,P5);let F=K instanceof Error?K.message:String(K);return X.json({error:F},502,P5)}return tZ(X,"/_sandbox/git/publish",{forwardJsonBody:!0,map404to410:!0})})}),$.post("/:virtualMcpId/:branch/git/discard",async(X)=>{let Q=X.get("vmClaim");if(Q.runtime==="cms")return Us(Q.claimName,async()=>{let Y=await X.req.json().catch(()=>({})),G=Array.isArray(Y.filepaths)?Y.filepaths.filter((J)=>typeof J==="string"):[];if(G.length===0)return X.json({error:"filepaths is required"},400,P5);try{let J=await du(X);return await Tc$(J,Q.branch,G),X.json({ok:!0},200,P5)}catch(J){let W=J instanceof h4&&J.status===409?409:502,K=J instanceof Error?J.message:String(J);return X.json({error:K},W,P5)}});return Us(Q.claimName,()=>tZ(X,"/_sandbox/git/discard",{forwardJsonBody:!0,map404to410:!0}))}),$.post("/:virtualMcpId/:branch/git/rebase",async(X)=>{let Q=X.get("vmClaim");if(Q.runtime==="cms")return Us(Q.claimName,async()=>{try{let W=await X.req.json().catch(()=>({})),K=await du(X),F=W.base??await K.getDefaultBranch();return await HT0(K,Q.branch,F),X.json({ok:!0},200,P5)}catch(W){return z71(X,W)}});let Y=Bv(X);if(Y instanceof Response)return Y;let{claimName:G}=X.get("vmClaim"),J=X.var.studioContext;return Us(G,async()=>{try{await Z71(J,Y,G)}catch(W){let K=W instanceof Error?W.message:String(W);return X.json({error:K},502,P5)}return tZ(X,"/_sandbox/git/rebase",{forwardJsonBody:!0,map404to410:!0})})}),$.post("/:virtualMcpId/:branch/git/suggest-commit",p5({maxSize:kc$,onError:(X)=>X.json({error:"Payload too large"},413,P5)}),async(X)=>{let Q=X.get("vmClaim"),Y=null;if(Q.runtime!=="cms"){let F=Bv(X);if(F instanceof Response)return F;Y=F}let{claimName:G,userId:J,projectRef:W}=Q,K=X.var.studioContext;try{let F=await X.req.json().catch(()=>({})),H=F.status,N=F.diff,U=N!=null&&typeof N.diffs==="object"&&N.diffs!==null,[B,O]=Y71(H)&&U?[H,N]:Y?await Promise.all([UT0(Y,G,"/_sandbox/git/status","GET",{userId:J,projectRef:W}),UT0(Y,G,"/_sandbox/git/diff","GET",{userId:J,projectRef:W})]):await(async()=>{let w=await du(X);return Promise.all([KT0(w,Q.branch),FT0(w,Q.branch)])})(),L=await gl$(K,B,O);return X.json(L,200,P5)}catch(F){let H=F instanceof Error?F.message:String(F);if(H==="SANDBOX_GONE")return X.json({error:"Sandbox handle is gone. The sandbox needs to be re-provisioned."},410,P5);return X.json({error:H},502,P5)}}),$.post("/:virtualMcpId/:branch/git/judge-review",p5({maxSize:kc$,onError:(X)=>X.json({error:"Payload too large"},413,P5)}),async(X)=>{let Q=X.get("vmClaim"),Y=null;if(Q.runtime!=="cms"){let F=Bv(X);if(F instanceof Response)return F;Y=F}let{claimName:G,userId:J,projectRef:W}=Q,K=X.var.studioContext;try{let F=await X.req.json().catch(()=>({})),H=F.status,N=F.diff,U=N!=null&&typeof N.diffs==="object"&&N.diffs!==null,[B,O]=Y71(H)&&U?[H,N]:Y?await Promise.all([UT0(Y,G,"/_sandbox/git/status","GET",{userId:J,projectRef:W}),UT0(Y,G,"/_sandbox/git/diff","GET",{userId:J,projectRef:W})]):await(async()=>{let w=await du(X);return Promise.all([KT0(w,Q.branch),FT0(w,Q.branch)])})(),L=await ul$(K,B,O,typeof F.language==="string"?F.language:void 0);return X.json(L,200,P5)}catch(F){let H=F instanceof Error?F.message:String(F);if(H==="SANDBOX_GONE")return X.json({error:"Sandbox handle is gone. The sandbox needs to be re-provisioned."},410,P5);return X.json({error:H},502,P5)}}),$.get("/:virtualMcpId/:branch/preview-fetch",async(X)=>{let Q=Bv(X);if(Q instanceof Response)return Q;let{claimName:Y}=X.get("vmClaim"),G=X.req.query("path");if(!G||!G.startsWith("/")||G.startsWith("//")||G.includes("..")||G.includes("\\"))return X.json({error:"Path not allowed"},403);let J;try{J=await Q.getPreviewUrl(Y)}catch{return X.json({error:"Preview not available"},502)}if(!J)return X.json({error:"Preview not available"},502);let W=J.replace(/\/+$/,"");return Sc$(X,`${W}${G}`)}),$.post("/:virtualMcpId/:branch/preview-invoke",p5({maxSize:UN6,onError:(X)=>X.json({error:"Payload too large"},413)}),async(X)=>{let Q=Bv(X);if(Q instanceof Response)return Q;let{claimName:Y}=X.get("vmClaim"),G;try{G=await Q.getPreviewUrl(Y)}catch{return X.json({error:"Preview not available"},502)}if(!G)return X.json({error:"Preview not available"},502);let J;try{J=await X.req.json()}catch{return X.json({error:"Invalid JSON body"},400)}if(!J||typeof J!=="object"||Array.isArray(J))return X.json({error:"Invalid JSON body"},400);let W=Rc$(J);if(!W)return X.json({error:"Invalid or missing __resolveType"},400);let K=Ic$(G,W.resolveType);return Sc$(X,K,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(W.payload),signal:AbortSignal.timeout(30000)})}),$};var fc$=D(()=>{U8();DF();yu();eZ1();ap();Sl$();x3();cy();Cl$();l3();_l$();fl$();Ki0();$n();W71();ll$();F71();cD();E71();qc$();j71();HN6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;ON6=oA0(async($,Z)=>{let X=$.var.studioContext;try{o(X)}catch{return $.json({error:"Unauthorized"},401)}let Q=o0(X);if(!Q)return $.json({error:"Unauthorized"},401);let Y;try{Y=r(X)}catch{return $.json({error:"Organization scope required"},403)}let G=$.req.param("virtualMcpId"),J=$.req.param("branch");if(!G||!J)return $.json({error:"virtualMcpId and branch are required"},400);try{NN6(J)}catch(L){let w=L instanceof Error?L.message:String(L);return $.json({error:w},400)}let W=await X.storage.virtualMcps.findById(G);if(!W||W.organization_id!==Y.id)return $.json({error:"Virtual MCP not found"},404);let K=op({orgId:Y.id,virtualMcpId:G,branch:J}),F=await Xi0(X,J),H=Qi0(F,Q),N=Vl$({userId:H,projectRef:K}),U=W.metadata??null,B=await DN6($,{claimName:N,branch:J,virtualMcpId:G,sandboxUserId:H,virtualMcpMetadata:U,branchThread:F});if(B==="cms")return $.set("vmClaim",{claimName:N,callerUserId:Q,runner:null,virtualMcpId:G,branch:J,userId:H,projectRef:K,virtualMcpMetadata:U,connectionIds:W.connections?.map((L)=>L.connection_id)??[],runtime:B}),Z();let O;try{O=await $Q(X)}catch{O=null}if(!O)return $.json({error:"No sandbox runner found"},404);return $.set("vmClaim",{claimName:N,callerUserId:Q,runner:O,virtualMcpId:G,branch:J,userId:H,projectRef:K,virtualMcpMetadata:U,connectionIds:W.connections?.map((L)=>L.connection_id)??[],runtime:B}),Z()});NT0=new Map;P5={"Cache-Control":"no-store, no-cache, must-revalidate",Pragma:"no-cache"};_c$=["clone","install","start"]});function bc$($,Z,X){let Q=P71.get($);if(!Q)Q={pending:null,running:!1},P71.set($,Q);if(!Q.pending)Q.pending={set:new Map,del:new Set,deps:Z,resolvers:[],rejecters:[]};let Y=Q.pending;Y.deps=Z;for(let[J,W]of Object.entries(X.set??{}))Y.set.set(J,W),Y.del.delete(J);for(let J of X.delete??[])Y.del.add(J),Y.set.delete(J);let G=new Promise((J,W)=>{Y.resolvers.push(J),Y.rejecters.push(W)});if(!Q.running)zN6($,Q);return G}async function zN6($,Z){Z.running=!0;try{while(Z.pending){let X=Z.pending;Z.pending=null;try{let Q=await PN6(X);for(let Y of X.resolvers)Y(Q)}catch(Q){for(let Y of X.rejecters)Y(Q)}}}finally{if(Z.running=!1,!Z.pending)P71.delete($)}}async function PN6($){let{client:Z,branch:X,packagePath:Q}=$.deps;for(let Y=0;;Y++){let G=await cu(Z,X),J=await Z.getCommitTreeSha(G),W=await Z.getDecofileTree(J,Q),K=D71(W,Q),F=[],H=new Map(K.map((O)=>[O.path,{stem:O.stem,sha:O.sha}]));for(let[O,L]of $.set){let w=L71(K,O),E=`${JSON.stringify(L,null,2)}
|
|
2879
|
-
`,j=await Z.createBlob(E);await jc$(Z.owner,Z.repo,j,E);let z=w[0]??`${JT0(Q)}/${H71(O)}.json`;F.push({path:z,mode:"100644",type:"blob",sha:j});let A=z.slice(z.lastIndexOf("/")+1,-5);H.set(z,{stem:A,sha:j,content:E});for(let P of w.slice(1))F.push({path:P,mode:"100644",type:"blob",sha:null}),H.delete(P)}for(let O of $.del)for(let L of L71(K,O))F.push({path:L,mode:"100644",type:"blob",sha:null}),H.delete(L);if(F.length===0)return G;let N=Q?`${Q}/.deco/blocks.gen.json`:".deco/blocks.gen.json";if(W.some((O)=>O.type==="blob"&&O.path===N)){let O=await Promise.all([...H.values()].map(async(j)=>({stem:j.stem,content:j.content??await Z.getBlobText(j.sha)}))),{decofile:L,skipped:w}=Ws(O);if(w.length>0)console.warn("decofile gen: dropped blocks that were not valid JSON",{repo:`${Z.owner}/${Z.repo}`,branch:X,packagePath:Q,blocks:w.map((j)=>j.key)});let E=await Z.createBlob(L);F.push({path:N,mode:"100644",type:"blob",sha:E})}let U=await Z.createTree(J,F),B=await Z.createCommit({message:AN6($),treeSha:U,parentShas:[G]});try{return await Z.updateRef(X,B),B}catch(O){if(!(O instanceof h4&&O.status===422)||Y>=jN6-1)throw O;await L$(aZ(2000,200,Y,2,0.5))}}}function AN6($){let Z=(Y)=>{let G=Y.slice(0,3).join(", ");return Y.length>3?`${G} (+${Y.length-3} more)`:G},X=[];if($.set.size>0)X.push(`update ${Z([...$.set.keys()])}`);if($.del.size>0)X.push(`delete ${Z([...$.del])}`);let Q=`chore(decofile): ${X.join("; ")}`;return rm0(Q,$.deps.coAuthor)}var jN6=3,P71;var xc$=D(()=>{yO0();eA0();W4();cD();WT0();P71=new Map});import{createHmac as yc$,randomBytes as TN6,timingSafeEqual as RN6}from"crypto";function gc$(){if(BT0)return BT0;let $;try{let Z=b0();$=Z.studioJwtSecret??Z.betterAuthSecret}catch{$=void 0}return BT0=$?Buffer.from($):TN6(32),BT0}function A71($){let Z=$.nowMs??Date.now(),X={o:$.organizationId,m:$.virtualMcpId,b:$.branch,e:Math.floor((Z+IN6)/1000)},Q=Buffer.from(JSON.stringify(X)).toString("base64url"),Y=yc$("sha256",gc$()).update(Q).digest("base64url");return`${Q}.${Y}`}function hc$($,Z){let X=$.indexOf(".");if(X<0)return!1;let Q=$.slice(0,X),Y=Buffer.from($.slice(X+1)),G=Buffer.from(yc$("sha256",gc$()).update(Q).digest("base64url"));if(Y.length!==G.length||!RN6(Y,G))return!1;let J;try{J=JSON.parse(Buffer.from(Q,"base64url").toString())}catch{return!1}let W=Math.floor((Z.nowMs??Date.now())/1000);return J.o===Z.organizationId&&J.m===Z.virtualMcpId&&J.b===Z.branch&&typeof J.e==="number"&&J.e>=W}var IN6=21600000,BT0=null;var uc$=D(()=>{R$()});import{z as mu}from"zod";function MN6($){return $.length>0&&$.length<=255&&!$.includes("..")&&!$.endsWith("/")&&!$.endsWith(".lock")&&qN6.test($)}function ic$($){return $.req.header("x-forwarded-host")??new URL($.req.url).host}async function Bs($){let Z=$.get("decofileScope");return aA0($.var.studioContext,Z.organizationId,Z.githubRepo)}function Os($,Z){if(Z instanceof h4){let Q=Z.status===404?404:Z.status===409?409:Z.status===422?409:502;return $.json({error:Z.message},Q)}let X=Z instanceof Error?Z.message:String(Z);return $.json({error:X},500)}function pc$(){let $=new H1;return $.use("/:virtualMcpId/:branch",mc$),$.use("/:virtualMcpId/:branch/*",mc$),$.get("/:virtualMcpId/:branch",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await Bs(Z),Y=await zc$(Q,X.branch,X.packagePath,{createBranchIfMissing:!!X.userId}),G={ETag:`"${Y.sha}"`,"Cache-Control":"no-store","Access-Control-Allow-Origin":"*"};if(Z.req.header("if-none-match")===`"${Y.sha}"`)return Z.body(null,304,G);if(!X.userId)return Z.body(Y.decofile,200,{...G,"content-type":"application/json"});let J=A71({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.body(`{"version":${JSON.stringify(Y.sha)},"token":${JSON.stringify(J)},"apiHost":${JSON.stringify(ic$(Z))},"decofile":${Y.decofile}}`,200,{...G,"content-type":"application/json"})}catch(Q){return Os(Z,Q)}}),$.get("/:virtualMcpId/:branch/meta",async(Z)=>{let X=Z.get("decofileScope"),Q=X.packagePath?`${X.packagePath}/.deco/meta.gen.json`:".deco/meta.gen.json";try{let Y=await Bs(Z),G=await Y.getFileTextAtRef(X.branch,Q);if(G===null){let J=await Y.getDefaultBranch();if(J!==X.branch)G=await Y.getFileTextAtRef(J,Q)}if(G===null)return Z.json({error:"meta.gen.json not committed"},404);return Z.body(G,200,{"content-type":"application/json","Cache-Control":"no-store","Access-Control-Allow-Origin":"*"})}catch(Y){return Os(Z,Y)}}),$.patch("/:virtualMcpId/:branch",VN6,async(Z)=>{let X=Z.get("decofileScope"),Q=Z.var.studioContext,Y=SN6.safeParse(await Z.req.json().catch(()=>null));if(!Y.success)return Z.json({error:"Invalid body",details:Y.error.issues},400);let G=Y.data;for(let J of[...Object.keys(G.set??{}),...G.delete??[]])try{sA0(J)}catch(W){let K=W instanceof Error?W.message:String(W);return Z.json({error:K},400)}for(let[J,W]of Object.entries(G.set??{}))if(typeof W!=="object"||W===null||Array.isArray(W))return Z.json({error:`Block "${J}" must be a JSON object`},400);try{let J=await Bs(Z),W=await bc$(`${X.organizationId}/${X.virtualMcpId}/${X.branch}`,{client:J,branch:X.branch,packagePath:X.packagePath,coAuthor:gu(Q)},G),K=A71({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.json({version:W,token:K,apiHost:ic$(Z)})}catch(J){return Os(Z,J)}}),$.post("/:virtualMcpId/:branch/publish",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await Bs(Z),Y=await Q.getDefaultBranch();if(Y===X.branch)return Z.json({error:"Branch is already the default branch"},400);let G=`chore(decofile): publish ${X.branch}`;try{let J;try{J=await Q.mergeBranch(Y,X.branch,G)}catch(W){if(!(W instanceof h4&&W.status===409))throw W;await HT0(Q,X.branch,Y),J=await Q.mergeBranch(Y,X.branch,G)}return J?Z.json({result:"merged",sha:J}):Z.json({result:"up-to-date"})}catch(J){if(J instanceof h4&&J.status===409)return Z.json({error:"merge-conflict"},409);if(J instanceof h4&&J.status===405){let K=await Q.findOpenPullRequest(Y,X.branch)??await Q.createPullRequest({base:Y,head:X.branch,title:`Publish ${X.branch}`});return Z.json({result:"pull-request",number:K.number,url:K.html_url})}throw J}}catch(Q){return Os(Z,Q)}}),$.get("/:virtualMcpId/:branch/status",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await Bs(Z),Y=await Q.getDefaultBranch();if(Y===X.branch)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0,lastCommitAt:null});try{let[{aheadBy:G,behindBy:J},W]=await Promise.all([Q.compare(Y,X.branch),Q.getBranchHead(X.branch)]);return Z.json({baseBranch:Y,aheadBy:G,behindBy:J,lastCommitAt:W.committedAt})}catch(G){if(G instanceof h4&&G.status===404)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0,lastCommitAt:null});throw G}}catch(Q){return Os(Z,Q)}}),$}var qN6,lc$=500,cc$=1048576,dc$=1024,kN6=8388608,VN6,SN6,mc$;var nc$=D(()=>{_n0();eA0();U8();DF();eZ1();rA0();j71();F71();xc$();uc$();E71();cD();WT0();qN6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;VN6=p5({maxSize:kN6,onError:($)=>$.json({error:"Payload too large"},413)}),SN6=mu.object({set:mu.record(mu.string(),mu.unknown()).optional(),delete:mu.array(mu.string()).optional()}).refine(($)=>Object.keys($.set??{}).length>0||($.delete?.length??0)>0,{message:"Patch must set or delete at least one block"}).refine(($)=>Object.keys($.set??{}).length+($.delete?.length??0)<=lc$,{message:`Patch cannot touch more than ${lc$} blocks`}).refine(($)=>Object.values($.set??{}).every((Z)=>JSON.stringify(Z).length<=cc$),{message:`Each block must be at most ${cc$} bytes`}).refine(($)=>[...Object.keys($.set??{}),...$.delete??[]].every((Z)=>Z.length<=dc$),{message:`Each block key must be at most ${dc$} characters`}),mc$=oA0(async($,Z)=>{let X=$.var.studioContext,Q=X.organization;if(!Q)return $.json({error:"Organization scope required"},500);let Y=$.req.param("virtualMcpId"),G=$.req.param("branch");if(!Y||!G)return $.json({error:"virtualMcpId and branch are required"},400);if(!MN6(G))return $.json({error:`Invalid branch name: ${G}`},400);let J=X.auth?.user?.id??null;if(!J){let B=$.req.query("token");if(!($.req.method==="GET"&&!$.req.path.match(/\/(publish|status)$/)))return $.json({error:"Unauthorized"},401);if(!B||!hc$(B,{organizationId:Q.id,virtualMcpId:Y,branch:G}))return $.json({error:"Unauthorized"},401)}let W=await X.storage.virtualMcps.findById(Y);if(!W||W.organization_id!==Q.id)return $.json({error:"Virtual MCP not found"},404);let K=W.metadata??null;if(!cO0(K))return $.json({error:"Project has no preview server configured"},404);let H=W.connections?.map((B)=>B.connection_id)??[],N=Ns(K,H);if(!N)return $.json({error:"Project has no GitHub repository"},404);let U=K?.runtime;return $.set("decofileScope",{organizationId:Q.id,virtualMcpId:Y,branch:G,packagePath:U?.path?.replace(/^\/+|\/+$/g,"")||null,githubRepo:N,userId:J}),Z()})});var tc$=($)=>{let Z=new H1;if(Z.use("*",Zv),Z.route("/",UA0()),Z.route("/",Hg$()),Z.route("/",Ll$()),Z.route("/",Bl$()),Z.route("/",pA0()),Z.route("/tools",Tl$()),Z.route("/",zl$()),Z.route("/",pu$({kvStorage:$.kvStorage})),Z.route("/",mu$()),Z.route("/fs",Jl$({getConnection:$.getNatsConnection})),Z.route("/sandbox",vc$()),Z.route("/decofile",pc$()),Z.route("/",Hl$()),Z.route("/deco-sites",OA0()),Z.route("/sso",JA0()),Z.route("/",nA0({tokenStorage:$.tokenStorage,automationEventDispatcher:$.automationEventDispatcher})),Z.route("/webhooks",Xg$()),$.mountDevAssets)Z.route("/dev-assets",DA0({orgFromPath:!0}));return Z.use("/mcp/:connectionId?",$.mcpAuth),Z.use("/mcp/:connectionId/ui-resource",$.mcpAuth),Z.use("/mcp/gateway/:virtualMcpId?",$.mcpAuth),Z.use("/mcp/virtual-mcp/:virtualMcpId?",$.mcpAuth),Z.use("/mcp/self",$.mcpAuth),Z.use("/mcp/task-run/:threadId",$.mcpAuth),Z.route("/",Ab$()),Z.get("/mcp/:gateway?/:connectionId/.well-known/oauth-protected-resource/*",$.betterAuthProtectedResourceHandler),Z.get("/mcp/.well-known/oauth-protected-resource",$.betterAuthProtectedResourceHandler),Z.route("/mcp/task-run",Kl$()),Z.route("/mcp",Lw0()),Z.route("/mcp/self",iA0()),Z.route("/mcp",jw0()),Z.all("/oauth-proxy/:connectionId/*",$.oauthProxyHandler),Z.get("/watch",$.watchHandler),Z};var oc$=D(()=>{U8();P91();Qg$();I91();LA0();va();j91();iu$();nu$();Wl$();ut();B91();zw0();pZ1();Fl$();Nl$();Ol$();wl$();Pl$();tZ1();Rl$();oZ1();ww0();fc$();nc$()});function CN6($){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 _N6=async($,Z)=>{if(!$.get("studioContext").auth.user?.id)return $.json({error:"Unauthorized"},401);return Z()},rc$=()=>{let $=new H1;return $.use("*",_N6),$.get("/",async(Z)=>{let X=b0(),Q=X.decoSupabaseUrl,Y=X.decoSupabaseServiceKey;if(!Q||!Y)return Z.json({apps:[]});try{let G=await nZ(Q,Y,"apps?select=name,title,description,logo,category,vendors(alias,url)");return Z.json({apps:CN6(G)})}catch(G){return console.error("[deco-apps] GET error:",G),Z.json({error:"Failed to fetch apps"},502)}}),$};var ac$=D(()=>{U8();R$();HP0()});import{z as M1}from"zod";function zF($,Z="invalid_request_error",X=null,Q=null){return{error:{message:$,type:Z,param:X,code:Q}}}function cN6($){if(!$)return null;let Z=$.indexOf(":");if(Z===-1)return{credentialId:null,modelId:$};let X=$.substring(0,Z),Q=$.substring(Z+1);if(!X||!Q)return null;return{credentialId:X,modelId:Q}}function dN6($,Z,X){try{return JSON.parse($)}catch{throw new $d$(`Invalid JSON in tool call arguments for function '${X}' (tool_call_id: ${Z}): ${$}`)}}function mN6($){let Z={};for(let X of $)if(X.role==="assistant"&&X.tool_calls)for(let Q of X.tool_calls)Z[Q.id]=Q.function.name;return $.map((X)=>{switch(X.role){case"system":return{role:"system",content:X.content};case"user":if(typeof X.content==="string")return{role:"user",content:X.content};return{role:"user",content:X.content.map((Y)=>{if(Y.type==="text")return{type:"text",text:Y.text};return{type:"image",image:Y.image_url.url}})};case"assistant":if(X.tool_calls&&X.tool_calls.length>0)return{role:"assistant",content:X.tool_calls.map((Y)=>({type:"tool-call",toolCallId:Y.id,toolName:Y.function.name,input:dN6(Y.function.arguments,Y.id,Y.function.name)}))};return{role:"assistant",content:X.content??""};case"tool":let Q=Z[X.tool_call_id]??"unknown";return{role:"tool",content:[{type:"tool-result",toolCallId:X.tool_call_id,toolName:Q,output:{type:"text",value:X.content}}]}}})}function iN6($){let Z=$.map((X)=>{let Q=X.function.parameters?mY(X.function.parameters):mY({type:"object",properties:{}});return[X.function.name,h$({description:X.function.description,inputSchema:Q})]});return Object.fromEntries(Z)}function pN6($){if(!$)return;return{openai:{response_format:$}}}function nN6(){return`chatcmpl-${crypto.randomUUID().replace(/-/g,"").substring(0,29)}`}function sc$($,Z,X,Q,Y,G){let J={model:$,messages:Z,tools:X,temperature:Q.temperature,maxTokens:Q.max_tokens,topP:Q.top_p,frequencyPenalty:Q.frequency_penalty,presencePenalty:Q.presence_penalty,stopSequences:Q.stop?Array.isArray(Q.stop)?Q.stop:[Q.stop]:void 0,abortSignal:G};return Y?{...J,providerOptions:Y}:J}function ec$($){if($==="tool-calls")return"tool_calls";if($==="length")return"length";return"stop"}var vN6=256,fN6,bN6,xN6,yN6,gN6,hN6,uN6,lN6,$d$,Zd$,Xd$;var Qd$=D(()=>{c4();U8();yu();AN();fN6=M1.object({type:M1.literal("function"),function:M1.object({name:M1.string(),description:M1.string().optional(),parameters:M1.record(M1.string(),M1.unknown()).optional()})}),bN6=M1.object({id:M1.string(),type:M1.literal("function"),function:M1.object({name:M1.string(),arguments:M1.string()})}),xN6=M1.discriminatedUnion("role",[M1.object({role:M1.literal("system"),content:M1.string(),name:M1.string().optional()}),M1.object({role:M1.literal("user"),content:M1.union([M1.string(),M1.array(M1.union([M1.object({type:M1.literal("text"),text:M1.string()}),M1.object({type:M1.literal("image_url"),image_url:M1.object({url:M1.string(),detail:M1.string().optional()})})]))]),name:M1.string().optional()}),M1.object({role:M1.literal("assistant"),content:M1.string().nullable().optional(),name:M1.string().optional(),tool_calls:M1.array(bN6).optional()}),M1.object({role:M1.literal("tool"),content:M1.string(),tool_call_id:M1.string()})]),yN6=M1.object({type:M1.literal("text")}),gN6=M1.object({type:M1.literal("json_object")}),hN6=M1.object({type:M1.literal("json_schema"),json_schema:M1.object({name:M1.string(),description:M1.string().optional(),schema:M1.record(M1.string(),M1.unknown()),strict:M1.boolean().optional()})}),uN6=M1.union([yN6,gN6,hN6]),lN6=M1.object({model:M1.string().describe("Format: 'model_id' or 'credential_id:model_id'"),messages:M1.array(xN6),stream:M1.boolean().optional().default(!1),temperature:M1.number().min(0).max(2).optional(),max_tokens:M1.number().positive().optional(),top_p:M1.number().min(0).max(1).optional(),frequency_penalty:M1.number().min(-2).max(2).optional(),presence_penalty:M1.number().min(-2).max(2).optional(),stop:M1.union([M1.string(),M1.array(M1.string())]).optional(),tools:M1.array(fN6).optional(),tool_choice:M1.union([M1.literal("auto"),M1.literal("none"),M1.literal("required"),M1.object({type:M1.literal("function"),function:M1.object({name:M1.string()})})]).optional(),response_format:uN6.optional(),user:M1.string().optional()});$d$=class $d$ extends Error{constructor($){super($);this.name="MessageConversionError"}};Zd$=new H1;Zd$.post("/:org/v1/chat/completions",async($)=>{let Z=$.get("studioContext"),X=$.req.param("org");try{if(!Z.auth.apiKey?.id)return $.json(zF("API key authentication required. Provide a valid API key via Authorization header.","authentication_error"),401);if(!Z.organization)return $.json(zF("Organization context is required. Ensure your API key has organization metadata.","invalid_request_error","organization"),400);if((Z.organization.slug??Z.organization.id)!==X)return $.json(zF("Organization mismatch. The API key's organization does not match the requested organization.","invalid_request_error","organization"),403);let Q=await $.req.json(),Y=lN6.safeParse(Q);if(!Y.success){let w=Y.error.issues[0]??{message:"Invalid request",path:[]};return $.json(zF(`Invalid request: ${w.message}`,"invalid_request_error",w.path.length>0?w.path.join("."):null),400)}let G=Y.data,J=cN6(G.model);if(!J)return $.json(zF("Invalid model format. Expected 'model_id' or 'credential_id:model_id' (e.g., 'claude-sonnet-4-6' or 'key_abc123:claude-sonnet-4-6')","invalid_request_error","model"),400);let{credentialId:W}=J,{modelId:K}=J;if(!W){let E=(await Z.storage.aiProviderKeys.list({organizationId:Z.organization.id})).find((j)=>Jw(j.providerId));if(!E)return $.json(zF("No AI provider credentials configured for this organization. Add a credential in settings or specify one explicitly via 'credential_id:model_id'.","invalid_request_error","model"),400);W=E.id}let F;try{F=await Z.aiProviders.activate(W,Z.organization.id)}catch{return $.json(zF(`AI provider credential not found or inaccessible: ${W}`,"invalid_request_error","model"),404)}let H=F.aiSdk.languageModel(K),N=mN6(G.messages),U=G.tools?iN6(G.tools):void 0,B=pN6(G.response_format),O=nN6(),L=Math.floor(Date.now()/1000);if(G.stream)return dN($,async(w)=>{let E=sc$(H,N,U,G,B,$.req.raw.signal);try{let j=zO(E),z=!1,A=0,P="",I=async()=>{if(P.length===0)return;let k=P;P="",await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{content:k},finish_reason:null}]})})};for await(let k of j.fullStream){if(!z&&(k.type==="text-delta"||k.type==="tool-call"))await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{role:"assistant",content:""},finish_reason:null}]})}),z=!0;if(k.type==="text-delta"){if(P+=k.text,P.length>=vN6)await I()}else if(k.type==="tool-call"){await I();let M=A++;await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{tool_calls:[{index:M,id:k.toolCallId,type:"function",function:{name:k.toolName,arguments:JSON.stringify(k.input)}}]},finish_reason:null}]})})}else if(k.type==="finish")await I(),await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{},finish_reason:ec$(k.finishReason)}],usage:k.totalUsage?{prompt_tokens:k.totalUsage.inputTokens??0,completion_tokens:k.totalUsage.outputTokens??0,total_tokens:k.totalUsage.totalTokens??0}:void 0})})}await I(),await w.writeSSE({data:"[DONE]"})}catch(j){let z=j;console.error("[openai-compat:stream] Error:",z.message),await w.writeSSE({data:JSON.stringify({error:{message:z.message,type:"server_error"}})})}});else{let w=sc$(H,N,U,G,B,$.req.raw.signal),E=await EO(w),j={role:"assistant",content:E.text||null};if(E.toolCalls&&E.toolCalls.length>0)j.tool_calls=E.toolCalls.map((z)=>({id:z.toolCallId,type:"function",function:{name:z.toolName,arguments:JSON.stringify("input"in z?z.input:{})}})),j.content=null;return $.json({id:O,object:"chat.completion",created:L,model:G.model,choices:[{index:0,message:j,finish_reason:ec$(E.finishReason)}],usage:{prompt_tokens:E.usage?.inputTokens??0,completion_tokens:E.usage?.outputTokens??0,total_tokens:E.usage?.totalTokens??0}})}}catch(Q){let Y=Q;if(Y.name==="AbortError")return $.json(zF("Request aborted","invalid_request_error"),400);if(Y.name==="MessageConversionError")return $.json(zF(Y.message,"invalid_request_error","messages"),400);return console.error("[openai-compat] Error:",Y.message,Y.stack),$.json(zF(Y.message,"server_error"),500)}});Xd$=Zd$});function tN6($){if(typeof $!=="object"||$===null)return!1;let X=$.githubRepo?.url;return typeof X==="string"&&X.length>0}function Yd$(){let $=new H1;return $.use("*",async(Z,X)=>{await X(),Z.header("Cache-Control","private, no-store"),Z.header("Vary","Cookie")}),$.get("/",async(Z)=>{let X=Z.get("studioContext"),Q=o0(X);if(!Q)return Z.json({error:"Authentication required"},401);let G=(Z.req.query("site")??"").trim().toLowerCase();if(!rG(G))return Z.json({error:"Invalid site slug"},400);let J=await X.db.selectFrom("member").innerJoin("organization","organization.id","member.organizationId").select(["organization.id as id","organization.slug as slug","organization.name as name","organization.metadata as metadata"]).where("member.userId","=",Q).execute(),W=[];for(let F of J){if(!F.slug||vZ(F))continue;let H=await X.storage.virtualMcps.list(F.id);for(let N of H){if(ss1(N)!==G)continue;if(!tN6(N.metadata))continue;W.push({orgSlug:F.slug,orgName:F.name??F.slug,project:{id:N.id,title:N.title,icon:N.icon??null}})}}let K={matches:W};return Z.json(K)}),$}var Gd$=D(()=>{U8();$O()});var Wd$;var Jd$=D(()=>{Wd$={name:"decocms",version:"4.301.1",description:"Deco CMS \u2014 Self-hostable MCP Gateway for managing AI connections and tools",author:"Deco team",repository:{type:"git",url:"git+https://github.com/decocms/studio.git",directory:"apps/api"},bugs:{url:"https://github.com/decocms/studio/issues"},type:"module",bin:{deco:"./dist/server/cli.js"},files:["dist/**/*"],scripts:{dev:"bun run migrate && bun run dev:server","dev:server":"bun run --cwd=../../packages/sandbox build && NODE_ENV=development bun --env-file=.env --hot run src/index.ts",build:"bun run build:server","build:server":"bun run scripts/bundle-server-script.ts --dist ./dist/server","generate:tool-contracts":"bun run scripts/generate-tool-contracts.ts","db:migrate":"bun run ./dist/server/migrate.js","db:migrate:dbos":"bun run ./dist/server/migrate-dbos.js",check:"tsc --noEmit",start:"bun run ./dist/server/server.js",migrate:"bun run src/database/migrate.ts","migrate:dbos":"bun run src/database/migrate-dbos.ts",test:"bun test src","better-auth:migrate":"bunx --bun @better-auth/cli migrate -y --config src/auth/index.ts",prepublishOnly:"bun run --cwd=../.. build:studio"},optionalDependencies:{"@duckdb/node-api":"^1.5.0-r.1"},dependencies:{"@ai-sdk/anthropic":"^3.0.85","@ai-sdk/google":"^3.0.83","@ai-sdk/openai":"^3.0.73","@anthropic-ai/sdk":"^0.105.0","@aws-sdk/client-s3":"^3.1013.0","@aws-sdk/client-sts":"^3.1013.0","@aws-sdk/lib-storage":"^3.1013.0","@aws-sdk/s3-request-presigner":"^3.1013.0","@clickhouse/client":"^1.8.1","@dbos-inc/dbos-sdk":"^4.21.6","@inkjs/ui":"^2.0.0","@nats-io/jetstream":"3.4.0","@nats-io/kv":"3.4.0","@nats-io/nats-core":"3.4.0","@nats-io/transport-node":"3.4.0","@openrouter/ai-sdk-provider":"^2.9.1","@opentelemetry/core":"^2.6.0","embedded-postgres":"^18.3.0-beta.16",ink:"^6.8.0",kysely:"^0.28.12","posthog-node":"^5.0.0",react:"^19.2.6","react-dom":"^19.2.6"},devDependencies:{"@ai-sdk/provider":"^3.0.10","@better-auth/sso":"1.4.1","@decocms/better-auth":"1.5.17","@decocms/bindings":"workspace:*","@decocms/mcp-utils":"workspace:*","@decocms/runtime":"workspace:*","@decocms/sandbox":"workspace:*","@decocms/shared":"workspace:*","@jitl/quickjs-wasmfile-release-sync":"0.31.0","@modelcontextprotocol/sdk":"1.29.0","@opentelemetry/api":"^1.9.0","@opentelemetry/api-logs":"^0.211.0","@opentelemetry/exporter-logs-otlp-proto":"^0.211.0","@opentelemetry/exporter-prometheus":"^0.208.0","@opentelemetry/exporter-trace-otlp-proto":"^0.207.0","@opentelemetry/instrumentation-runtime-node":"^0.24.0","@opentelemetry/resources":"^2.6.0","@opentelemetry/sdk-logs":"^0.211.0","@opentelemetry/sdk-metrics":"^2.2.0","@opentelemetry/sdk-node":"^0.207.0","@opentelemetry/sdk-trace-base":"^2.5.0","@types/bun":"^1.3.1","@types/google.maps":"^3.65.2","@types/pg":"^8.15.6","@types/react-syntax-highlighter":"^15.5.13","@vercel/nft":"^1.1.1",ai:"^6.0.208","better-auth":"1.4.22",croner:"^9.1.0",degit:"^2.8.4",hono:"^4.10.7",jose:"^6.0.11",nanoid:"^5.1.6",pg:"^8.16.3",typescript:"^7.0.2",typescript5:"npm:typescript@^5.9.3",zod:"4.3.6"},homepage:"https://github.com/decocms/studio",keywords:["mcp","model-context-protocol","ai","gateway","self-hosted","tools"],license:"MIT",publishConfig:{access:"public"}}});function aN6(){let $=process.env.POSTHOG_KEY;if(!$)return null;return{key:$,host:process.env.POSTHOG_HOST??rN6}}var Kd$,rN6="https://ph.studio.decocms.com",Fd$;var Hd$=D(()=>{U8();g50();xC();$9();R$();Y91();Jd$();Kd$=new H1;Kd$.get("/",($)=>{let Z={version:Wd$.version,theme:Ai1(),...PH().logo&&{logo:PH().logo},...FN()&&{internalUrl:aC1()},...b0().enableDecoImport&&{enableDecoImport:!0},brandExtractEnabled:!!b0().firecrawlApiKey,auth:Uy$(),posthog:aN6(),googleMapsApiKey:process.env.GOOGLE_MAPS_API_KEY?.trim()||null,runtime:{agentSandbox:As()}};return $.header("Cache-Control","no-store"),$.json({success:!0,config:Z})});Fd$=Kd$});function iu($){let Z=($??"").trim().toLowerCase();return Z=Z.replace(/^https?:\/\//,""),Z=Z.replace(/^www\./,""),Z=Z.split(/[/?#]/)[0]??"",Z.replace(/\/+$/,"")}function T71($){return(iu($).split(".")[0]||$).replace(/[-_]/g," ").split(" ").filter(Boolean).map((X)=>X.charAt(0).toUpperCase()+X.slice(1)).join(" ")}function Ud$($,Z=64){return`https://www.google.com/s2/favicons?domain=${encodeURIComponent(iu($))}&sz=${Z}`}function Nd$($,Z){let X=$.trim();if(X.length<=Z)return X;let Q=X.slice(0,Z-1),Y=Q.lastIndexOf(" ");return`${(Y>Z*0.6?Q.slice(0,Y):Q).trimEnd()}\u2026`}function Bd$($){let{brand:Z,domain:X,score:Q,verdict:Y}=$,G=typeof Q==="number"?`${Z} commerce report \u2014 ${Math.round(Q)}/100 \xB7 decocms`:`${Z} commerce report \xB7 decocms`,J=`See the full ${Z} scorecard \u2014 SEO, performance, conversion & AEO signals scored by decocms.`,W=Y?.trim()?Nd$(`${Y.trim().replace(/\s+/g," ")} \u2014 ${J}`,200):Nd$(`How does ${X} really perform? ${J}`,200);return{title:G,description:W}}import{z as c0}from"zod";var Ov,sN6,eN6,$U6,ZU6,Od$;var Dd$=D(()=>{Ov=c0.enum(["good","bad","neutral"]),sN6=c0.preprocess(($)=>{if(Array.isArray($))return{kind:"text",value:$.find((X)=>X!==null&&typeof X!=="object")??""};return $!==null&&typeof $==="object"?$:{kind:"text",value:$}},c0.object({kind:c0.enum(["text","number","sparkline","badge","score"]).catch("text"),value:c0.coerce.string().optional(),tone:Ov.optional(),muted:c0.boolean().optional(),delta:c0.coerce.string().optional(),deltaDir:c0.enum(["up","down","neutral"]).optional(),points:c0.array(c0.coerce.number()).optional(),label:c0.coerce.string().optional()}).transform(($)=>{if($.kind==="badge"&&$.label==null)$.label=$.value??"";if($.kind==="score"){let Z=Number($.value);if(Number.isNaN(Z))return{...$,kind:"text"}}return $})),eN6=c0.preprocess(($)=>{let Z=$;if(Z&&typeof Z==="object"&&!Array.isArray(Z)&&Array.isArray(Z.cells))Z=Z.cells;if(Array.isArray(Z)&&Z.length===1&&Array.isArray(Z[0]))Z=Z[0];if(Array.isArray(Z))return Z;if(Z&&typeof Z==="object")return Object.values(Z);return Z},c0.array(sN6)),$U6={key:c0.coerce.string(),title:c0.coerce.string(),eyebrow:c0.coerce.string().optional(),headline:c0.coerce.string(),annotation:c0.coerce.string().optional(),methodology:c0.coerce.string().optional(),sources:c0.array(c0.object({name:c0.coerce.string(),logoUrl:c0.coerce.string()})).optional()},ZU6=c0.discriminatedUnion("template",[c0.object({template:c0.literal("cover"),score:c0.object({value:c0.coerce.number(),max:c0.coerce.number().optional(),grade:c0.coerce.string().optional(),label:c0.coerce.string().optional()}).optional(),brandImage:c0.coerce.string().optional(),screenshot:c0.coerce.string().optional(),mobileScreenshot:c0.coerce.string().optional()}),c0.object({template:c0.literal("cta"),ctaUrl:c0.coerce.string().optional(),ctaLabel:c0.coerce.string().optional(),bullets:c0.array(c0.coerce.string()).optional()}),c0.object({template:c0.literal("series"),points:c0.array(c0.coerce.number()).min(2),xLabels:c0.array(c0.coerce.string()).min(1),unit:c0.coerce.string().optional(),callout:c0.object({index:c0.coerce.number(),value:c0.coerce.string(),tone:Ov.optional()})}),c0.object({template:c0.literal("threshold"),value:c0.coerce.string().default(""),metricLabel:c0.coerce.string().optional(),ratio:c0.coerce.number(),thresholdRatio:c0.coerce.number().optional(),thresholdLabel:c0.coerce.string().default(""),tone:Ov.optional()}),c0.object({template:c0.literal("stats"),stats:c0.array(c0.object({value:c0.coerce.string(),label:c0.coerce.string(),tone:Ov.optional()})).min(1)}),c0.object({template:c0.literal("bars"),items:c0.array(c0.object({value:c0.coerce.string(),label:c0.coerce.string(),ratio:c0.coerce.number(),tone:Ov.optional()})).min(1)}),c0.object({template:c0.literal("gauges"),gauges:c0.array(c0.object({label:c0.coerce.string(),value:c0.coerce.string(),status:c0.enum(["good","warn","bad"]).catch("warn"),caption:c0.coerce.string().optional(),ratio:c0.coerce.number().optional()})).min(1)}),c0.object({template:c0.literal("checklist"),checks:c0.array(c0.object({label:c0.coerce.string(),status:c0.enum(["pass","fail","warn"]).catch("fail"),value:c0.coerce.string().optional()})).min(1)}),c0.object({template:c0.literal("table"),columns:c0.array(c0.object({label:c0.coerce.string(),align:c0.enum(["left","right"]).optional()})).min(1),rows:c0.array(eN6).min(1),highlightRow:c0.coerce.number().optional()}),c0.object({template:c0.literal("products"),products:c0.array(c0.object({name:c0.coerce.string(),price:c0.coerce.string().optional(),image:c0.coerce.string().optional(),url:c0.coerce.string().optional()})).min(1)}),c0.object({template:c0.literal("list"),entries:c0.array(c0.object({label:c0.coerce.string(),severity:c0.enum(["error","warning","notice"]).catch("notice")})).min(1),moreCount:c0.coerce.number().optional()}),c0.object({template:c0.literal("keywords"),volumeLabel:c0.coerce.string().optional(),keywords:c0.array(c0.object({term:c0.coerce.string(),volume:c0.coerce.string(),position:c0.coerce.number().catch(0)})).min(1)}),c0.object({template:c0.literal("competitor"),metricLabel:c0.coerce.string().optional(),competitors:c0.array(c0.object({name:c0.coerce.string(),value:c0.coerce.string(),tone:Ov.optional(),isYou:c0.boolean().optional()})).min(1)}),c0.object({template:c0.literal("scorecard"),rivalLabel:c0.coerce.string().optional(),dimensions:c0.array(c0.object({label:c0.coerce.string(),you:c0.coerce.string(),rival:c0.coerce.string().optional(),rivalName:c0.coerce.string().optional(),tone:Ov.optional()})).min(1)})]),Od$=c0.object({...$U6,template:ZU6})});function OT0($){let Z=[],X=[...$.sections].sort((Y,G)=>Y.position-G.position).map((Y)=>{let G=Od$.safeParse(Y.props);if(G.success)return G.data;let J=G.error.issues[0];return Z.push({section_type:Y.section_type,position:Y.position,reason:J?`${J.path.join(".")||"(root)"}: ${J.message}`:"contract violation"}),null}).filter((Y)=>Y!==null),Q=X.filter((Y)=>Y.template.template!=="cover"&&Y.template.template!=="cta").map((Y)=>({key:Y.key,title:Y.title}));return{deck:{meta:{...$.meta,scores:$.summary?.scores,scannedAt:$.scanned_at,toc:Q},slides:X},drops:Z}}var R71=D(()=>{Dd$()});import{join as Ld$}from"path";async function QU6($){try{let Z=await fetch(`${QK({})}/api/v2/public/diagnostics/${encodeURIComponent($)}`,{headers:{Accept:"application/json"},signal:AbortSignal.timeout(XU6)});if(!Z.ok)return null;let X=await Z.json(),{deck:Q}=OT0(X);if(!Q.slides.length)return null;let Y=Q.slides.find((W)=>W.template.template==="cover"),G=Y?.template,J=G&&G.template==="cover"?G:void 0;return{brand:Q.meta.brand?.trim()||T71($),score:Q.meta.scores?.cover??J?.score?.value,verdict:Y?.annotation?.trim()||Y?.headline?.trim()||void 0}}catch{return null}}function LG($){return $.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function YU6($,Z){let X=iu($),Q=Z?.brand?.trim()||T71(X),Y=Ud$(X,128),J=`${(b0().baseUrl??"https://studio.decocms.com").replace(/\/+$/,"")}/report/${encodeURIComponent(X)}`,{title:W,description:K}=Bd$({brand:Q,domain:X,score:Z?.score,verdict:Z?.verdict}),F=`${J}/og.png`,H=`${Q} commerce report 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(J)}" />`,`<meta property="og:image" content="${LG(F)}" />`,'<meta property="og:image:width" content="1200" />','<meta property="og:image:height" content="630" />',`<meta property="og:image:alt" content="${LG(H)}" />`,'<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(F)}" />`,`<meta name="twitter:image:alt" content="${LG(H)}" />`,`<link rel="canonical" href="${LG(J)}" />`,`<link rel="icon" href="${LG(Y)}" sizes="any" />`].join(`
|
|
2879
|
+
`,j=await Z.createBlob(E);await jc$(Z.owner,Z.repo,j,E);let z=w[0]??`${JT0(Q)}/${H71(O)}.json`;F.push({path:z,mode:"100644",type:"blob",sha:j});let A=z.slice(z.lastIndexOf("/")+1,-5);H.set(z,{stem:A,sha:j,content:E});for(let P of w.slice(1))F.push({path:P,mode:"100644",type:"blob",sha:null}),H.delete(P)}for(let O of $.del)for(let L of L71(K,O))F.push({path:L,mode:"100644",type:"blob",sha:null}),H.delete(L);if(F.length===0)return G;let N=Q?`${Q}/.deco/blocks.gen.json`:".deco/blocks.gen.json";if(W.some((O)=>O.type==="blob"&&O.path===N)){let O=await Promise.all([...H.values()].map(async(j)=>({stem:j.stem,content:j.content??await Z.getBlobText(j.sha)}))),{decofile:L,skipped:w}=Ws(O);if(w.length>0)console.warn("decofile gen: dropped blocks that were not valid JSON",{repo:`${Z.owner}/${Z.repo}`,branch:X,packagePath:Q,blocks:w.map((j)=>j.key)});let E=await Z.createBlob(L);F.push({path:N,mode:"100644",type:"blob",sha:E})}let U=await Z.createTree(J,F),B=await Z.createCommit({message:AN6($),treeSha:U,parentShas:[G]});try{return await Z.updateRef(X,B),B}catch(O){if(!(O instanceof h4&&O.status===422)||Y>=jN6-1)throw O;await L$(aZ(2000,200,Y,2,0.5))}}}function AN6($){let Z=(Y)=>{let G=Y.slice(0,3).join(", ");return Y.length>3?`${G} (+${Y.length-3} more)`:G},X=[];if($.set.size>0)X.push(`update ${Z([...$.set.keys()])}`);if($.del.size>0)X.push(`delete ${Z([...$.del])}`);let Q=`chore(decofile): ${X.join("; ")}`;return rm0(Q,$.deps.coAuthor)}var jN6=3,P71;var xc$=D(()=>{yO0();eA0();W4();cD();WT0();P71=new Map});import{createHmac as yc$,randomBytes as TN6,timingSafeEqual as RN6}from"crypto";function gc$(){if(BT0)return BT0;let $;try{let Z=b0();$=Z.studioJwtSecret??Z.betterAuthSecret}catch{$=void 0}return BT0=$?Buffer.from($):TN6(32),BT0}function A71($){let Z=$.nowMs??Date.now(),X={o:$.organizationId,m:$.virtualMcpId,b:$.branch,e:Math.floor((Z+IN6)/1000)},Q=Buffer.from(JSON.stringify(X)).toString("base64url"),Y=yc$("sha256",gc$()).update(Q).digest("base64url");return`${Q}.${Y}`}function hc$($,Z){let X=$.indexOf(".");if(X<0)return!1;let Q=$.slice(0,X),Y=Buffer.from($.slice(X+1)),G=Buffer.from(yc$("sha256",gc$()).update(Q).digest("base64url"));if(Y.length!==G.length||!RN6(Y,G))return!1;let J;try{J=JSON.parse(Buffer.from(Q,"base64url").toString())}catch{return!1}let W=Math.floor((Z.nowMs??Date.now())/1000);return J.o===Z.organizationId&&J.m===Z.virtualMcpId&&J.b===Z.branch&&typeof J.e==="number"&&J.e>=W}var IN6=21600000,BT0=null;var uc$=D(()=>{R$()});import{z as mu}from"zod";function MN6($){return $.length>0&&$.length<=255&&!$.includes("..")&&!$.endsWith("/")&&!$.endsWith(".lock")&&qN6.test($)}function ic$($){return $.req.header("x-forwarded-host")??new URL($.req.url).host}async function Bs($){let Z=$.get("decofileScope");return aA0($.var.studioContext,Z.organizationId,Z.githubRepo)}function Os($,Z){if(Z instanceof h4){let Q=Z.status===404?404:Z.status===409?409:Z.status===422?409:502;return $.json({error:Z.message},Q)}let X=Z instanceof Error?Z.message:String(Z);return $.json({error:X},500)}function pc$(){let $=new H1;return $.use("/:virtualMcpId/:branch",mc$),$.use("/:virtualMcpId/:branch/*",mc$),$.get("/:virtualMcpId/:branch",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await Bs(Z),Y=await zc$(Q,X.branch,X.packagePath,{createBranchIfMissing:!!X.userId}),G={ETag:`"${Y.sha}"`,"Cache-Control":"no-store","Access-Control-Allow-Origin":"*"};if(Z.req.header("if-none-match")===`"${Y.sha}"`)return Z.body(null,304,G);if(!X.userId)return Z.body(Y.decofile,200,{...G,"content-type":"application/json"});let J=A71({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.body(`{"version":${JSON.stringify(Y.sha)},"token":${JSON.stringify(J)},"apiHost":${JSON.stringify(ic$(Z))},"decofile":${Y.decofile}}`,200,{...G,"content-type":"application/json"})}catch(Q){return Os(Z,Q)}}),$.get("/:virtualMcpId/:branch/meta",async(Z)=>{let X=Z.get("decofileScope"),Q=X.packagePath?`${X.packagePath}/.deco/meta.gen.json`:".deco/meta.gen.json";try{let Y=await Bs(Z),G=await Y.getFileTextAtRef(X.branch,Q);if(G===null){let J=await Y.getDefaultBranch();if(J!==X.branch)G=await Y.getFileTextAtRef(J,Q)}if(G===null)return Z.json({error:"meta.gen.json not committed"},404);return Z.body(G,200,{"content-type":"application/json","Cache-Control":"no-store","Access-Control-Allow-Origin":"*"})}catch(Y){return Os(Z,Y)}}),$.patch("/:virtualMcpId/:branch",VN6,async(Z)=>{let X=Z.get("decofileScope"),Q=Z.var.studioContext,Y=SN6.safeParse(await Z.req.json().catch(()=>null));if(!Y.success)return Z.json({error:"Invalid body",details:Y.error.issues},400);let G=Y.data;for(let J of[...Object.keys(G.set??{}),...G.delete??[]])try{sA0(J)}catch(W){let K=W instanceof Error?W.message:String(W);return Z.json({error:K},400)}for(let[J,W]of Object.entries(G.set??{}))if(typeof W!=="object"||W===null||Array.isArray(W))return Z.json({error:`Block "${J}" must be a JSON object`},400);try{let J=await Bs(Z),W=await bc$(`${X.organizationId}/${X.virtualMcpId}/${X.branch}`,{client:J,branch:X.branch,packagePath:X.packagePath,coAuthor:gu(Q)},G),K=A71({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.json({version:W,token:K,apiHost:ic$(Z)})}catch(J){return Os(Z,J)}}),$.post("/:virtualMcpId/:branch/publish",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await Bs(Z),Y=await Q.getDefaultBranch();if(Y===X.branch)return Z.json({error:"Branch is already the default branch"},400);let G=`chore(decofile): publish ${X.branch}`;try{let J;try{J=await Q.mergeBranch(Y,X.branch,G)}catch(W){if(!(W instanceof h4&&W.status===409))throw W;await HT0(Q,X.branch,Y),J=await Q.mergeBranch(Y,X.branch,G)}return J?Z.json({result:"merged",sha:J}):Z.json({result:"up-to-date"})}catch(J){if(J instanceof h4&&J.status===409)return Z.json({error:"merge-conflict"},409);if(J instanceof h4&&J.status===405){let K=await Q.findOpenPullRequest(Y,X.branch)??await Q.createPullRequest({base:Y,head:X.branch,title:`Publish ${X.branch}`});return Z.json({result:"pull-request",number:K.number,url:K.html_url})}throw J}}catch(Q){return Os(Z,Q)}}),$.get("/:virtualMcpId/:branch/status",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await Bs(Z),Y=await Q.getDefaultBranch();if(Y===X.branch)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0,lastCommitAt:null});try{let[{aheadBy:G,behindBy:J},W]=await Promise.all([Q.compare(Y,X.branch),Q.getBranchHead(X.branch)]);return Z.json({baseBranch:Y,aheadBy:G,behindBy:J,lastCommitAt:W.committedAt})}catch(G){if(G instanceof h4&&G.status===404)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0,lastCommitAt:null});throw G}}catch(Q){return Os(Z,Q)}}),$}var qN6,lc$=500,cc$=1048576,dc$=1024,kN6=8388608,VN6,SN6,mc$;var nc$=D(()=>{_n0();eA0();U8();DF();eZ1();rA0();j71();F71();xc$();uc$();E71();cD();WT0();qN6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;VN6=p5({maxSize:kN6,onError:($)=>$.json({error:"Payload too large"},413)}),SN6=mu.object({set:mu.record(mu.string(),mu.unknown()).optional(),delete:mu.array(mu.string()).optional()}).refine(($)=>Object.keys($.set??{}).length>0||($.delete?.length??0)>0,{message:"Patch must set or delete at least one block"}).refine(($)=>Object.keys($.set??{}).length+($.delete?.length??0)<=lc$,{message:`Patch cannot touch more than ${lc$} blocks`}).refine(($)=>Object.values($.set??{}).every((Z)=>JSON.stringify(Z).length<=cc$),{message:`Each block must be at most ${cc$} bytes`}).refine(($)=>[...Object.keys($.set??{}),...$.delete??[]].every((Z)=>Z.length<=dc$),{message:`Each block key must be at most ${dc$} characters`}),mc$=oA0(async($,Z)=>{let X=$.var.studioContext,Q=X.organization;if(!Q)return $.json({error:"Organization scope required"},500);let Y=$.req.param("virtualMcpId"),G=$.req.param("branch");if(!Y||!G)return $.json({error:"virtualMcpId and branch are required"},400);if(!MN6(G))return $.json({error:`Invalid branch name: ${G}`},400);let J=X.auth?.user?.id??null;if(!J){let B=$.req.query("token");if(!($.req.method==="GET"&&!$.req.path.match(/\/(publish|status)$/)))return $.json({error:"Unauthorized"},401);if(!B||!hc$(B,{organizationId:Q.id,virtualMcpId:Y,branch:G}))return $.json({error:"Unauthorized"},401)}let W=await X.storage.virtualMcps.findById(Y);if(!W||W.organization_id!==Q.id)return $.json({error:"Virtual MCP not found"},404);let K=W.metadata??null;if(!cO0(K))return $.json({error:"Project has no preview server configured"},404);let H=W.connections?.map((B)=>B.connection_id)??[],N=Ns(K,H);if(!N)return $.json({error:"Project has no GitHub repository"},404);let U=K?.runtime;return $.set("decofileScope",{organizationId:Q.id,virtualMcpId:Y,branch:G,packagePath:U?.path?.replace(/^\/+|\/+$/g,"")||null,githubRepo:N,userId:J}),Z()})});var tc$=($)=>{let Z=new H1;if(Z.use("*",Zv),Z.route("/",UA0()),Z.route("/",Hg$()),Z.route("/",Ll$()),Z.route("/",Bl$()),Z.route("/",pA0()),Z.route("/tools",Tl$()),Z.route("/",zl$()),Z.route("/",pu$({kvStorage:$.kvStorage})),Z.route("/",mu$()),Z.route("/fs",Jl$({getConnection:$.getNatsConnection})),Z.route("/sandbox",vc$()),Z.route("/decofile",pc$()),Z.route("/",Hl$()),Z.route("/deco-sites",OA0()),Z.route("/sso",JA0()),Z.route("/",nA0({tokenStorage:$.tokenStorage,automationEventDispatcher:$.automationEventDispatcher})),Z.route("/webhooks",Xg$()),$.mountDevAssets)Z.route("/dev-assets",DA0({orgFromPath:!0}));return Z.use("/mcp/:connectionId?",$.mcpAuth),Z.use("/mcp/:connectionId/ui-resource",$.mcpAuth),Z.use("/mcp/gateway/:virtualMcpId?",$.mcpAuth),Z.use("/mcp/virtual-mcp/:virtualMcpId?",$.mcpAuth),Z.use("/mcp/self",$.mcpAuth),Z.use("/mcp/task-run/:threadId",$.mcpAuth),Z.route("/",Ab$()),Z.get("/mcp/:gateway?/:connectionId/.well-known/oauth-protected-resource/*",$.betterAuthProtectedResourceHandler),Z.get("/mcp/.well-known/oauth-protected-resource",$.betterAuthProtectedResourceHandler),Z.route("/mcp/task-run",Kl$()),Z.route("/mcp",Lw0()),Z.route("/mcp/self",iA0()),Z.route("/mcp",jw0()),Z.all("/oauth-proxy/:connectionId/*",$.oauthProxyHandler),Z.get("/watch",$.watchHandler),Z};var oc$=D(()=>{U8();P91();Qg$();I91();LA0();va();j91();iu$();nu$();Wl$();ut();B91();zw0();pZ1();Fl$();Nl$();Ol$();wl$();Pl$();tZ1();Rl$();oZ1();ww0();fc$();nc$()});function CN6($){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 _N6=async($,Z)=>{if(!$.get("studioContext").auth.user?.id)return $.json({error:"Unauthorized"},401);return Z()},rc$=()=>{let $=new H1;return $.use("*",_N6),$.get("/",async(Z)=>{let X=b0(),Q=X.decoSupabaseUrl,Y=X.decoSupabaseServiceKey;if(!Q||!Y)return Z.json({apps:[]});try{let G=await nZ(Q,Y,"apps?select=name,title,description,logo,category,vendors(alias,url)");return Z.json({apps:CN6(G)})}catch(G){return console.error("[deco-apps] GET error:",G),Z.json({error:"Failed to fetch apps"},502)}}),$};var ac$=D(()=>{U8();R$();HP0()});import{z as M1}from"zod";function zF($,Z="invalid_request_error",X=null,Q=null){return{error:{message:$,type:Z,param:X,code:Q}}}function cN6($){if(!$)return null;let Z=$.indexOf(":");if(Z===-1)return{credentialId:null,modelId:$};let X=$.substring(0,Z),Q=$.substring(Z+1);if(!X||!Q)return null;return{credentialId:X,modelId:Q}}function dN6($,Z,X){try{return JSON.parse($)}catch{throw new $d$(`Invalid JSON in tool call arguments for function '${X}' (tool_call_id: ${Z}): ${$}`)}}function mN6($){let Z={};for(let X of $)if(X.role==="assistant"&&X.tool_calls)for(let Q of X.tool_calls)Z[Q.id]=Q.function.name;return $.map((X)=>{switch(X.role){case"system":return{role:"system",content:X.content};case"user":if(typeof X.content==="string")return{role:"user",content:X.content};return{role:"user",content:X.content.map((Y)=>{if(Y.type==="text")return{type:"text",text:Y.text};return{type:"image",image:Y.image_url.url}})};case"assistant":if(X.tool_calls&&X.tool_calls.length>0)return{role:"assistant",content:X.tool_calls.map((Y)=>({type:"tool-call",toolCallId:Y.id,toolName:Y.function.name,input:dN6(Y.function.arguments,Y.id,Y.function.name)}))};return{role:"assistant",content:X.content??""};case"tool":let Q=Z[X.tool_call_id]??"unknown";return{role:"tool",content:[{type:"tool-result",toolCallId:X.tool_call_id,toolName:Q,output:{type:"text",value:X.content}}]}}})}function iN6($){let Z=$.map((X)=>{let Q=X.function.parameters?mY(X.function.parameters):mY({type:"object",properties:{}});return[X.function.name,h$({description:X.function.description,inputSchema:Q})]});return Object.fromEntries(Z)}function pN6($){if(!$)return;return{openai:{response_format:$}}}function nN6(){return`chatcmpl-${crypto.randomUUID().replace(/-/g,"").substring(0,29)}`}function sc$($,Z,X,Q,Y,G){let J={model:$,messages:Z,tools:X,temperature:Q.temperature,maxTokens:Q.max_tokens,topP:Q.top_p,frequencyPenalty:Q.frequency_penalty,presencePenalty:Q.presence_penalty,stopSequences:Q.stop?Array.isArray(Q.stop)?Q.stop:[Q.stop]:void 0,abortSignal:G};return Y?{...J,providerOptions:Y}:J}function ec$($){if($==="tool-calls")return"tool_calls";if($==="length")return"length";return"stop"}var vN6=256,fN6,bN6,xN6,yN6,gN6,hN6,uN6,lN6,$d$,Zd$,Xd$;var Qd$=D(()=>{c4();U8();yu();AN();fN6=M1.object({type:M1.literal("function"),function:M1.object({name:M1.string(),description:M1.string().optional(),parameters:M1.record(M1.string(),M1.unknown()).optional()})}),bN6=M1.object({id:M1.string(),type:M1.literal("function"),function:M1.object({name:M1.string(),arguments:M1.string()})}),xN6=M1.discriminatedUnion("role",[M1.object({role:M1.literal("system"),content:M1.string(),name:M1.string().optional()}),M1.object({role:M1.literal("user"),content:M1.union([M1.string(),M1.array(M1.union([M1.object({type:M1.literal("text"),text:M1.string()}),M1.object({type:M1.literal("image_url"),image_url:M1.object({url:M1.string(),detail:M1.string().optional()})})]))]),name:M1.string().optional()}),M1.object({role:M1.literal("assistant"),content:M1.string().nullable().optional(),name:M1.string().optional(),tool_calls:M1.array(bN6).optional()}),M1.object({role:M1.literal("tool"),content:M1.string(),tool_call_id:M1.string()})]),yN6=M1.object({type:M1.literal("text")}),gN6=M1.object({type:M1.literal("json_object")}),hN6=M1.object({type:M1.literal("json_schema"),json_schema:M1.object({name:M1.string(),description:M1.string().optional(),schema:M1.record(M1.string(),M1.unknown()),strict:M1.boolean().optional()})}),uN6=M1.union([yN6,gN6,hN6]),lN6=M1.object({model:M1.string().describe("Format: 'model_id' or 'credential_id:model_id'"),messages:M1.array(xN6),stream:M1.boolean().optional().default(!1),temperature:M1.number().min(0).max(2).optional(),max_tokens:M1.number().positive().optional(),top_p:M1.number().min(0).max(1).optional(),frequency_penalty:M1.number().min(-2).max(2).optional(),presence_penalty:M1.number().min(-2).max(2).optional(),stop:M1.union([M1.string(),M1.array(M1.string())]).optional(),tools:M1.array(fN6).optional(),tool_choice:M1.union([M1.literal("auto"),M1.literal("none"),M1.literal("required"),M1.object({type:M1.literal("function"),function:M1.object({name:M1.string()})})]).optional(),response_format:uN6.optional(),user:M1.string().optional()});$d$=class $d$ extends Error{constructor($){super($);this.name="MessageConversionError"}};Zd$=new H1;Zd$.post("/:org/v1/chat/completions",async($)=>{let Z=$.get("studioContext"),X=$.req.param("org");try{if(!Z.auth.apiKey?.id)return $.json(zF("API key authentication required. Provide a valid API key via Authorization header.","authentication_error"),401);if(!Z.organization)return $.json(zF("Organization context is required. Ensure your API key has organization metadata.","invalid_request_error","organization"),400);if((Z.organization.slug??Z.organization.id)!==X)return $.json(zF("Organization mismatch. The API key's organization does not match the requested organization.","invalid_request_error","organization"),403);let Q=await $.req.json(),Y=lN6.safeParse(Q);if(!Y.success){let w=Y.error.issues[0]??{message:"Invalid request",path:[]};return $.json(zF(`Invalid request: ${w.message}`,"invalid_request_error",w.path.length>0?w.path.join("."):null),400)}let G=Y.data,J=cN6(G.model);if(!J)return $.json(zF("Invalid model format. Expected 'model_id' or 'credential_id:model_id' (e.g., 'claude-sonnet-4-6' or 'key_abc123:claude-sonnet-4-6')","invalid_request_error","model"),400);let{credentialId:W}=J,{modelId:K}=J;if(!W){let E=(await Z.storage.aiProviderKeys.list({organizationId:Z.organization.id})).find((j)=>Jw(j.providerId));if(!E)return $.json(zF("No AI provider credentials configured for this organization. Add a credential in settings or specify one explicitly via 'credential_id:model_id'.","invalid_request_error","model"),400);W=E.id}let F;try{F=await Z.aiProviders.activate(W,Z.organization.id)}catch{return $.json(zF(`AI provider credential not found or inaccessible: ${W}`,"invalid_request_error","model"),404)}let H=F.aiSdk.languageModel(K),N=mN6(G.messages),U=G.tools?iN6(G.tools):void 0,B=pN6(G.response_format),O=nN6(),L=Math.floor(Date.now()/1000);if(G.stream)return dN($,async(w)=>{let E=sc$(H,N,U,G,B,$.req.raw.signal);try{let j=zO(E),z=!1,A=0,P="",I=async()=>{if(P.length===0)return;let k=P;P="",await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{content:k},finish_reason:null}]})})};for await(let k of j.fullStream){if(!z&&(k.type==="text-delta"||k.type==="tool-call"))await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{role:"assistant",content:""},finish_reason:null}]})}),z=!0;if(k.type==="text-delta"){if(P+=k.text,P.length>=vN6)await I()}else if(k.type==="tool-call"){await I();let M=A++;await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{tool_calls:[{index:M,id:k.toolCallId,type:"function",function:{name:k.toolName,arguments:JSON.stringify(k.input)}}]},finish_reason:null}]})})}else if(k.type==="finish")await I(),await w.writeSSE({data:JSON.stringify({id:O,object:"chat.completion.chunk",created:L,model:G.model,choices:[{index:0,delta:{},finish_reason:ec$(k.finishReason)}],usage:k.totalUsage?{prompt_tokens:k.totalUsage.inputTokens??0,completion_tokens:k.totalUsage.outputTokens??0,total_tokens:k.totalUsage.totalTokens??0}:void 0})})}await I(),await w.writeSSE({data:"[DONE]"})}catch(j){let z=j;console.error("[openai-compat:stream] Error:",z.message),await w.writeSSE({data:JSON.stringify({error:{message:z.message,type:"server_error"}})})}});else{let w=sc$(H,N,U,G,B,$.req.raw.signal),E=await EO(w),j={role:"assistant",content:E.text||null};if(E.toolCalls&&E.toolCalls.length>0)j.tool_calls=E.toolCalls.map((z)=>({id:z.toolCallId,type:"function",function:{name:z.toolName,arguments:JSON.stringify("input"in z?z.input:{})}})),j.content=null;return $.json({id:O,object:"chat.completion",created:L,model:G.model,choices:[{index:0,message:j,finish_reason:ec$(E.finishReason)}],usage:{prompt_tokens:E.usage?.inputTokens??0,completion_tokens:E.usage?.outputTokens??0,total_tokens:E.usage?.totalTokens??0}})}}catch(Q){let Y=Q;if(Y.name==="AbortError")return $.json(zF("Request aborted","invalid_request_error"),400);if(Y.name==="MessageConversionError")return $.json(zF(Y.message,"invalid_request_error","messages"),400);return console.error("[openai-compat] Error:",Y.message,Y.stack),$.json(zF(Y.message,"server_error"),500)}});Xd$=Zd$});function tN6($){if(typeof $!=="object"||$===null)return!1;let X=$.githubRepo?.url;return typeof X==="string"&&X.length>0}function Yd$(){let $=new H1;return $.use("*",async(Z,X)=>{await X(),Z.header("Cache-Control","private, no-store"),Z.header("Vary","Cookie")}),$.get("/",async(Z)=>{let X=Z.get("studioContext"),Q=o0(X);if(!Q)return Z.json({error:"Authentication required"},401);let G=(Z.req.query("site")??"").trim().toLowerCase();if(!rG(G))return Z.json({error:"Invalid site slug"},400);let J=await X.db.selectFrom("member").innerJoin("organization","organization.id","member.organizationId").select(["organization.id as id","organization.slug as slug","organization.name as name","organization.metadata as metadata"]).where("member.userId","=",Q).execute(),W=[];for(let F of J){if(!F.slug||vZ(F))continue;let H=await X.storage.virtualMcps.list(F.id);for(let N of H){if(ss1(N)!==G)continue;if(!tN6(N.metadata))continue;W.push({orgSlug:F.slug,orgName:F.name??F.slug,project:{id:N.id,title:N.title,icon:N.icon??null}})}}let K={matches:W};return Z.json(K)}),$}var Gd$=D(()=>{U8();$O()});var Wd$;var Jd$=D(()=>{Wd$={name:"decocms",version:"4.302.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 migrate && bun run dev:server","dev:server":"bun run --cwd=../../packages/sandbox build && NODE_ENV=development bun --env-file=.env --hot run src/index.ts",build:"bun run build:server","build:server":"bun run scripts/bundle-server-script.ts --dist ./dist/server","generate:tool-contracts":"bun run scripts/generate-tool-contracts.ts","db:migrate":"bun run ./dist/server/migrate.js","db:migrate:dbos":"bun run ./dist/server/migrate-dbos.js",check:"tsc --noEmit",start:"bun run ./dist/server/server.js",migrate:"bun run src/database/migrate.ts","migrate:dbos":"bun run src/database/migrate-dbos.ts",test:"bun test src","better-auth:migrate":"bunx --bun @better-auth/cli migrate -y --config src/auth/index.ts",prepublishOnly:"bun run --cwd=../.. build:studio"},optionalDependencies:{"@duckdb/node-api":"^1.5.0-r.1"},dependencies:{"@ai-sdk/anthropic":"^3.0.85","@ai-sdk/google":"^3.0.83","@ai-sdk/openai":"^3.0.73","@anthropic-ai/sdk":"^0.105.0","@aws-sdk/client-s3":"^3.1013.0","@aws-sdk/client-sts":"^3.1013.0","@aws-sdk/lib-storage":"^3.1013.0","@aws-sdk/s3-request-presigner":"^3.1013.0","@clickhouse/client":"^1.8.1","@dbos-inc/dbos-sdk":"^4.21.6","@inkjs/ui":"^2.0.0","@nats-io/jetstream":"3.4.0","@nats-io/kv":"3.4.0","@nats-io/nats-core":"3.4.0","@nats-io/transport-node":"3.4.0","@openrouter/ai-sdk-provider":"^2.9.1","@opentelemetry/core":"^2.6.0","embedded-postgres":"^18.3.0-beta.16",ink:"^6.8.0",kysely:"^0.28.12","posthog-node":"^5.0.0",react:"^19.2.6","react-dom":"^19.2.6"},devDependencies:{"@ai-sdk/provider":"^3.0.10","@better-auth/sso":"1.4.1","@decocms/better-auth":"1.5.17","@decocms/bindings":"workspace:*","@decocms/mcp-utils":"workspace:*","@decocms/runtime":"workspace:*","@decocms/sandbox":"workspace:*","@decocms/shared":"workspace:*","@jitl/quickjs-wasmfile-release-sync":"0.31.0","@modelcontextprotocol/sdk":"1.29.0","@opentelemetry/api":"^1.9.0","@opentelemetry/api-logs":"^0.211.0","@opentelemetry/exporter-logs-otlp-proto":"^0.211.0","@opentelemetry/exporter-prometheus":"^0.208.0","@opentelemetry/exporter-trace-otlp-proto":"^0.207.0","@opentelemetry/instrumentation-runtime-node":"^0.24.0","@opentelemetry/resources":"^2.6.0","@opentelemetry/sdk-logs":"^0.211.0","@opentelemetry/sdk-metrics":"^2.2.0","@opentelemetry/sdk-node":"^0.207.0","@opentelemetry/sdk-trace-base":"^2.5.0","@types/bun":"^1.3.1","@types/google.maps":"^3.65.2","@types/pg":"^8.15.6","@types/react-syntax-highlighter":"^15.5.13","@vercel/nft":"^1.1.1",ai:"^6.0.208","better-auth":"1.4.22",croner:"^9.1.0",degit:"^2.8.4",hono:"^4.10.7",jose:"^6.0.11",nanoid:"^5.1.6",pg:"^8.16.3",typescript:"^7.0.2",typescript5:"npm:typescript@^5.9.3",zod:"4.3.6"},homepage:"https://github.com/decocms/studio",keywords:["mcp","model-context-protocol","ai","gateway","self-hosted","tools"],license:"MIT",publishConfig:{access:"public"}}});function aN6(){let $=process.env.POSTHOG_KEY;if(!$)return null;return{key:$,host:process.env.POSTHOG_HOST??rN6}}var Kd$,rN6="https://ph.studio.decocms.com",Fd$;var Hd$=D(()=>{U8();g50();xC();$9();R$();Y91();Jd$();Kd$=new H1;Kd$.get("/",($)=>{let Z={version:Wd$.version,theme:Ai1(),...PH().logo&&{logo:PH().logo},...FN()&&{internalUrl:aC1()},...b0().enableDecoImport&&{enableDecoImport:!0},brandExtractEnabled:!!b0().firecrawlApiKey,auth:Uy$(),posthog:aN6(),googleMapsApiKey:process.env.GOOGLE_MAPS_API_KEY?.trim()||null,runtime:{agentSandbox:As()}};return $.header("Cache-Control","no-store"),$.json({success:!0,config:Z})});Fd$=Kd$});function iu($){let Z=($??"").trim().toLowerCase();return Z=Z.replace(/^https?:\/\//,""),Z=Z.replace(/^www\./,""),Z=Z.split(/[/?#]/)[0]??"",Z.replace(/\/+$/,"")}function T71($){return(iu($).split(".")[0]||$).replace(/[-_]/g," ").split(" ").filter(Boolean).map((X)=>X.charAt(0).toUpperCase()+X.slice(1)).join(" ")}function Ud$($,Z=64){return`https://www.google.com/s2/favicons?domain=${encodeURIComponent(iu($))}&sz=${Z}`}function Nd$($,Z){let X=$.trim();if(X.length<=Z)return X;let Q=X.slice(0,Z-1),Y=Q.lastIndexOf(" ");return`${(Y>Z*0.6?Q.slice(0,Y):Q).trimEnd()}\u2026`}function Bd$($){let{brand:Z,domain:X,score:Q,verdict:Y}=$,G=typeof Q==="number"?`${Z} commerce report \u2014 ${Math.round(Q)}/100 \xB7 decocms`:`${Z} commerce report \xB7 decocms`,J=`See the full ${Z} scorecard \u2014 SEO, performance, conversion & AEO signals scored by decocms.`,W=Y?.trim()?Nd$(`${Y.trim().replace(/\s+/g," ")} \u2014 ${J}`,200):Nd$(`How does ${X} really perform? ${J}`,200);return{title:G,description:W}}import{z as c0}from"zod";var Ov,sN6,eN6,$U6,ZU6,Od$;var Dd$=D(()=>{Ov=c0.enum(["good","bad","neutral"]),sN6=c0.preprocess(($)=>{if(Array.isArray($))return{kind:"text",value:$.find((X)=>X!==null&&typeof X!=="object")??""};return $!==null&&typeof $==="object"?$:{kind:"text",value:$}},c0.object({kind:c0.enum(["text","number","sparkline","badge","score"]).catch("text"),value:c0.coerce.string().optional(),tone:Ov.optional(),muted:c0.boolean().optional(),delta:c0.coerce.string().optional(),deltaDir:c0.enum(["up","down","neutral"]).optional(),points:c0.array(c0.coerce.number()).optional(),label:c0.coerce.string().optional()}).transform(($)=>{if($.kind==="badge"&&$.label==null)$.label=$.value??"";if($.kind==="score"){let Z=Number($.value);if(Number.isNaN(Z))return{...$,kind:"text"}}return $})),eN6=c0.preprocess(($)=>{let Z=$;if(Z&&typeof Z==="object"&&!Array.isArray(Z)&&Array.isArray(Z.cells))Z=Z.cells;if(Array.isArray(Z)&&Z.length===1&&Array.isArray(Z[0]))Z=Z[0];if(Array.isArray(Z))return Z;if(Z&&typeof Z==="object")return Object.values(Z);return Z},c0.array(sN6)),$U6={key:c0.coerce.string(),title:c0.coerce.string(),eyebrow:c0.coerce.string().optional(),headline:c0.coerce.string(),annotation:c0.coerce.string().optional(),methodology:c0.coerce.string().optional(),sources:c0.array(c0.object({name:c0.coerce.string(),logoUrl:c0.coerce.string()})).optional()},ZU6=c0.discriminatedUnion("template",[c0.object({template:c0.literal("cover"),score:c0.object({value:c0.coerce.number(),max:c0.coerce.number().optional(),grade:c0.coerce.string().optional(),label:c0.coerce.string().optional()}).optional(),brandImage:c0.coerce.string().optional(),screenshot:c0.coerce.string().optional(),mobileScreenshot:c0.coerce.string().optional()}),c0.object({template:c0.literal("cta"),ctaUrl:c0.coerce.string().optional(),ctaLabel:c0.coerce.string().optional(),bullets:c0.array(c0.coerce.string()).optional()}),c0.object({template:c0.literal("series"),points:c0.array(c0.coerce.number()).min(2),xLabels:c0.array(c0.coerce.string()).min(1),unit:c0.coerce.string().optional(),callout:c0.object({index:c0.coerce.number(),value:c0.coerce.string(),tone:Ov.optional()})}),c0.object({template:c0.literal("threshold"),value:c0.coerce.string().default(""),metricLabel:c0.coerce.string().optional(),ratio:c0.coerce.number(),thresholdRatio:c0.coerce.number().optional(),thresholdLabel:c0.coerce.string().default(""),tone:Ov.optional()}),c0.object({template:c0.literal("stats"),stats:c0.array(c0.object({value:c0.coerce.string(),label:c0.coerce.string(),tone:Ov.optional()})).min(1)}),c0.object({template:c0.literal("bars"),items:c0.array(c0.object({value:c0.coerce.string(),label:c0.coerce.string(),ratio:c0.coerce.number(),tone:Ov.optional()})).min(1)}),c0.object({template:c0.literal("gauges"),gauges:c0.array(c0.object({label:c0.coerce.string(),value:c0.coerce.string(),status:c0.enum(["good","warn","bad"]).catch("warn"),caption:c0.coerce.string().optional(),ratio:c0.coerce.number().optional()})).min(1)}),c0.object({template:c0.literal("checklist"),checks:c0.array(c0.object({label:c0.coerce.string(),status:c0.enum(["pass","fail","warn"]).catch("fail"),value:c0.coerce.string().optional()})).min(1)}),c0.object({template:c0.literal("table"),columns:c0.array(c0.object({label:c0.coerce.string(),align:c0.enum(["left","right"]).optional()})).min(1),rows:c0.array(eN6).min(1),highlightRow:c0.coerce.number().optional()}),c0.object({template:c0.literal("products"),products:c0.array(c0.object({name:c0.coerce.string(),price:c0.coerce.string().optional(),image:c0.coerce.string().optional(),url:c0.coerce.string().optional()})).min(1)}),c0.object({template:c0.literal("list"),entries:c0.array(c0.object({label:c0.coerce.string(),severity:c0.enum(["error","warning","notice"]).catch("notice")})).min(1),moreCount:c0.coerce.number().optional()}),c0.object({template:c0.literal("keywords"),volumeLabel:c0.coerce.string().optional(),keywords:c0.array(c0.object({term:c0.coerce.string(),volume:c0.coerce.string(),position:c0.coerce.number().catch(0)})).min(1)}),c0.object({template:c0.literal("competitor"),metricLabel:c0.coerce.string().optional(),competitors:c0.array(c0.object({name:c0.coerce.string(),value:c0.coerce.string(),tone:Ov.optional(),isYou:c0.boolean().optional()})).min(1)}),c0.object({template:c0.literal("scorecard"),rivalLabel:c0.coerce.string().optional(),dimensions:c0.array(c0.object({label:c0.coerce.string(),you:c0.coerce.string(),rival:c0.coerce.string().optional(),rivalName:c0.coerce.string().optional(),tone:Ov.optional()})).min(1)})]),Od$=c0.object({...$U6,template:ZU6})});function OT0($){let Z=[],X=[...$.sections].sort((Y,G)=>Y.position-G.position).map((Y)=>{let G=Od$.safeParse(Y.props);if(G.success)return G.data;let J=G.error.issues[0];return Z.push({section_type:Y.section_type,position:Y.position,reason:J?`${J.path.join(".")||"(root)"}: ${J.message}`:"contract violation"}),null}).filter((Y)=>Y!==null),Q=X.filter((Y)=>Y.template.template!=="cover"&&Y.template.template!=="cta").map((Y)=>({key:Y.key,title:Y.title}));return{deck:{meta:{...$.meta,scores:$.summary?.scores,scannedAt:$.scanned_at,toc:Q},slides:X},drops:Z}}var R71=D(()=>{Dd$()});import{join as Ld$}from"path";async function QU6($){try{let Z=await fetch(`${QK({})}/api/v2/public/diagnostics/${encodeURIComponent($)}`,{headers:{Accept:"application/json"},signal:AbortSignal.timeout(XU6)});if(!Z.ok)return null;let X=await Z.json(),{deck:Q}=OT0(X);if(!Q.slides.length)return null;let Y=Q.slides.find((W)=>W.template.template==="cover"),G=Y?.template,J=G&&G.template==="cover"?G:void 0;return{brand:Q.meta.brand?.trim()||T71($),score:Q.meta.scores?.cover??J?.score?.value,verdict:Y?.annotation?.trim()||Y?.headline?.trim()||void 0}}catch{return null}}function LG($){return $.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function YU6($,Z){let X=iu($),Q=Z?.brand?.trim()||T71(X),Y=Ud$(X,128),J=`${(b0().baseUrl??"https://studio.decocms.com").replace(/\/+$/,"")}/report/${encodeURIComponent(X)}`,{title:W,description:K}=Bd$({brand:Q,domain:X,score:Z?.score,verdict:Z?.verdict}),F=`${J}/og.png`,H=`${Q} commerce report 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(J)}" />`,`<meta property="og:image" content="${LG(F)}" />`,'<meta property="og:image:width" content="1200" />','<meta property="og:image:height" content="630" />',`<meta property="og:image:alt" content="${LG(H)}" />`,'<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(F)}" />`,`<meta name="twitter:image:alt" content="${LG(H)}" />`,`<link rel="canonical" href="${LG(J)}" />`,`<link rel="icon" href="${LG(Y)}" sizes="any" />`].join(`
|
|
2880
2880
|
`)}function GU6($,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}
|
|
2881
2881
|
</head>`)}function wd$($){let Z=new H1;return Z.get("/:domain/og.png",async(X)=>{let Q=iu(X.req.param("domain")),Y=async()=>{let G=$?Bun.file(Ld$($,"report-og-fallback.png")):null;if(!G||!await G.exists())return X.notFound();return X.body(new Uint8Array(await G.arrayBuffer()),200,{"Content-Type":"image/png","Cache-Control":"public, max-age=0, s-maxage=3600"})};try{let G=await fetch(`${QK({})}/api/v2/public/diagnostics/${encodeURIComponent(Q)}/og.png`,{signal:AbortSignal.timeout(JU6)}),J=G.headers.get("content-type")??"";if(!G.ok||!J.startsWith("image/")||!G.body)return Y();return X.body(G.body,200,{"Content-Type":J,"Cache-Control":"public, max-age=0, s-maxage=604800"})}catch{return Y()}}),Z.get("/:domain",async(X)=>{let Q=X.req.param("domain"),Y=$?Ld$($,"index.html"):null,G=Y?Bun.file(Y):null;if(!G||!await G.exists())return X.notFound();let J=await G.text();try{let W=await QU6(iu(Q)),K=YU6(Q,W);return X.html(GU6(J,K),200,{"Cache-Control":"public, max-age=0, s-maxage=300"})}catch{return X.html(J)}}),Z}var XU6=2500,JU6=1e4;var Ed$=D(()=>{U8();R71();HE();R$()});function Ds($,Z){return fetch(`${QK({})}${$}`,Z)}async function WU6($,Z,X){let Q=new URLSearchParams;if(Z)Q.set("pw",Z);if(X)Q.set("lang",X);let Y=Q.toString()?`?${Q.toString()}`:"",G=await Ds(`/api/v2/public/diagnostics/${encodeURIComponent($)}${Y}`,{headers:{Accept:"application/json"}});if(G.status===404)return{status:"not_found",deck:null,scanned_at:null,drops:[]};if(!G.ok)throw Error(`report read HTTP ${G.status}`);let J=await G.json(),{deck:W,drops:K}=OT0(J);return{status:W.slides.length?"ready":"empty",deck:W,scanned_at:J.scanned_at,drops:K}}var KU6,iN,jd$=async($,Z)=>{if(!$.get("reportUser"))return $.json({error:"Authentication required"},401);await Z();return},zd$;var Pd$=D(()=>{U8();uY();HE();R71();KU6=new Set(["complete","errored","terminated","unknown"]),iN=new H1;iN.use("*",async($,Z)=>{let X=await Q8.api.getSession({headers:$.req.raw.headers});$.set("reportUser",X?.user?.id?{email:X.user.email}:void 0),await Z(),$.header("Cache-Control","private, no-store"),$.header("Vary","Cookie");return});iN.use("/link-token/*",jd$);iN.use("/suggest",jd$);iN.get("/site/:domain",async($)=>{let Z=$.req.param("domain").trim();if(!Z)return $.json({error:"domain is required"},400);let X=$.get("reportUser"),Q=$.req.query("key")?.trim()||void 0,Y=$.req.query("lang")?.trim()||void 0;try{let G=await WU6(Z,Q,Y);if($.header("Cache-Control","private, no-store"),X||!G.deck)return $.json(G);return $.json({...G,deck:{...G.deck,slides:G.deck.slides.slice(0,1)},truncated:G.status==="ready"})}catch{return $.json({error:"report read failed"},502)}});iN.post("/run",async($)=>{let Z=$.get("reportUser"),X;try{X=await $.req.json()}catch{return $.json({error:"invalid JSON"},400)}let Q=typeof X.domain==="string"?X.domain.trim():"";if(!Q)return $.json({error:"domain is required"},400);let Y=Z?.email,G=typeof X.distinctId==="string"&&X.distinctId.trim()&&X.distinctId.length<=200?X.distinctId.trim():void 0;try{let J=await Ds("/api/v2/diagnostics/run",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${FE({})}`},body:JSON.stringify({url:Q,...Y?{email:Y}:{},distinct_id:G})});if(!J.ok)return $.json({error:`run HTTP ${J.status}`},502);let W=await J.json(),K=W.blocked?{state:"blocked"}:W.status==="fresh"?{state:"fresh"}:W.mode==="sync"?{state:"sync"}:{state:"running",id:W.id??null};return $.json(K)}catch{return $.json({error:"run failed"},502)}});iN.get("/status",async($)=>{let Z=$.req.query("id");if(!Z)return $.json({error:"id is required"},400);try{let X=await Ds(`/api/v2/diagnostics/status?id=${encodeURIComponent(Z)}`,{headers:{Authorization:`Bearer ${FE({})}`}});if(!X.ok)return $.json({error:`status HTTP ${X.status}`},502);let Y=(await X.json()).status??"unknown",G={done:KU6.has(Y),status:Y};return $.json(G)}catch{return $.json({error:"status failed"},502)}});iN.get("/link-token/:id",async($)=>{let Z=$.req.param("id");try{let X=await Ds(`/api/v2/public/link-tokens/${encodeURIComponent(Z)}`,{headers:{Accept:"application/json"}});if(X.status===404)return $.json(null);if(!X.ok)return $.json({error:`link token HTTP ${X.status}`},502);return $.json(await X.json())}catch{return $.json({error:"link token resolve failed"},502)}});iN.get("/suggest",async($)=>{let Z=($.req.query("q")??"").trim().slice(0,64);if(Z.length<2)return $.json({suggestions:[]});try{let X=await Ds(`/api/v2/public/suggest?q=${encodeURIComponent(Z)}`,{headers:{Accept:"application/json"}});if(!X.ok)return $.json({suggestions:[]});let Q=await X.json();return $.json({suggestions:Array.isArray(Q.suggestions)?Q.suggestions:[]})}catch{return $.json({suggestions:[]})}});zd$=iN});import{createHmac as FU6,timingSafeEqual as HU6}from"crypto";function Td$($,Z,X,Q=Date.now()){if(!Z||!X)return!1;let Y,G=[];for(let F of Z.split(",")){let H=F.indexOf("=");if(H<=0)continue;let N=F.slice(0,H).trim(),U=F.slice(H+1).trim();if(N==="t")Y=U;else if(N==="v1")G.push(U)}if(!Y||G.length===0)return!1;let J=Number(Y);if(!Number.isFinite(J)||Math.abs(Q/1000-J)>NU6)return!1;let W=FU6("sha256",X).update(`${Y}.${$}`).digest("hex"),K=Buffer.from(W,"hex");return G.some((F)=>{let H=Buffer.from(F,"hex");return K.length===H.length&&HU6(K,H)})}function Rd$($){let Z;try{Z=JSON.parse($)}catch{return null}let X=bJ(Z),Q=bJ(bJ(X?.data)?.object);if(!X||typeof X.type!=="string"||!Q)return null;return{id:PF(X.id),type:X.type,created:typeof X.created==="number"?X.created:void 0,livemode:typeof X.livemode==="boolean"?X.livemode:void 0,data:{object:Q}}}function Id$($){switch($){case"active":case"trialing":return"active";case"past_due":return"past_due";default:return"canceled"}}function PF($){return typeof $==="string"?$:void 0}function bJ($){return typeof $==="object"&&$!==null?$:void 0}function DT0($){return typeof $==="number"?new Date($*1000):null}function M71($){return PF($)??PF(bJ($)?.id)}function UU6($){return M71($.subscription)??PF(bJ(bJ($.parent)?.subscription_details)?.subscription)}function BU6($){let Z=DT0($.current_period_end);if(Z)return Z;let X=bJ($.items)?.data;if(!Array.isArray(X))return null;let Q=0;for(let Y of X){let G=bJ(Y)?.current_period_end;if(typeof G==="number"&&G>Q)Q=G}return Q>0?new Date(Q*1000):null}function I71($,Z){let X=DT0($.created);return!!X&&!!Z.lastStripeEventAt&&X<Z.lastStripeEventAt}function q71($,Z){let X=DT0($.created);if(!X)return;return Z.lastStripeEventAt&&Z.lastStripeEventAt>X?void 0:X}async function OU6($,Z){let X=Z.data.object;switch(Z.type){case"checkout.session.completed":case"checkout.session.async_payment_succeeded":{let Q=PF(bJ(X.metadata)?.orgId);if(!Q)return{handled:!1,reason:"no orgId"};if(PF(bJ(X.metadata)?.kind)==="topup"){if(X.mode!=="payment")return{handled:!1,reason:"topup with wrong mode"};if(PF(X.payment_status)!=="paid")return{handled:!1,reason:"payment not confirmed"};let J=PF(X.id);if(!J)return console.error("stripe webhook: topup session without id",{eventId:Z.id,organizationId:Q}),{handled:!1,reason:"topup session without id"};let W=Number(bJ(X.metadata)?.creditCents);if(!Number.isInteger(W)||W<=0)return console.error("stripe webhook: paid topup with bad metadata \u2014 credit NOT applied",{eventId:Z.id,organizationId:Q,creditCents:bJ(X.metadata)?.creditCents}),{handled:!1,reason:"bad topup metadata"};return{handled:!0,organizationId:Q,topUp:{creditCents:W,referenceId:`stripe-topup:${J}`}}}if(X.mode!=="subscription")return{handled:!1,reason:"not a subscription checkout"};if(PF(X.payment_status)!=="paid")return{handled:!1,reason:"payment not confirmed"};let Y=await $.getBilling(Q);if(!Y)return{handled:!1,reason:"unknown org"};let G=M71(X.subscription);if(Y.stripeSubscriptionId&&G&&Y.stripeSubscriptionId!==G)return console.error("stripe webhook: refused checkout rebind",{organizationId:Q,eventId:Z.id}),{handled:!1,reason:"org already bound to another subscription",orphanSubscriptionId:G};if(I71(Z,Y))return{handled:!1,reason:"stale event"};return await $.updateStripeState(Q,{stripeCustomerId:M71(X.customer),stripeSubscriptionId:G,status:"active",lastStripeEventAt:q71(Z,Y)}),{handled:!0,organizationId:Q}}case"customer.subscription.updated":case"customer.subscription.deleted":{let Q=PF(X.id);if(!Q)return{handled:!1,reason:"no sub id"};let Y=await $.getBillingByStripeSubscriptionId(Q);if(!Y)return{handled:!1,reason:"unknown subscription"};let G=Z.type==="customer.subscription.deleted";if(!G&&I71(Z,Y))return{handled:!1,reason:"stale event"};let J=G?"canceled":Id$(X.status);return await $.updateStripeState(Y.organizationId,{status:J,currentPeriodEnd:BU6(X),...G&&{stripeSubscriptionId:null},lastStripeEventAt:q71(Z,Y)}),{handled:!0,organizationId:Y.organizationId}}case"invoice.paid":{let Q=UU6(X);if(!Q)return{handled:!1,reason:"no sub id"};let Y=await $.getBillingByStripeSubscriptionId(Q);if(!Y)return{handled:!1,reason:"unknown subscription"};if(I71(Z,Y))return{handled:!1,reason:"stale event"};return await $.updateStripeState(Y.organizationId,{status:"active",currentPeriodEnd:DT0(X.period_end),lastStripeEventAt:q71(Z,Y)}),{handled:!0,organizationId:Y.organizationId}}default:return{handled:!1,reason:`unhandled event ${Z.type}`}}}function DU6($,Z){if(!Z.handled||$.livemode===!1)return null;let X=$.data.object;if(Z.topUp)return{name:"credits_topup_succeeded",organizationId:Z.organizationId,properties:{credit_cents:Z.topUp.creditCents}};switch($.type){case"checkout.session.completed":case"checkout.session.async_payment_succeeded":return{name:"subscription_started",organizationId:Z.organizationId,properties:{}};case"customer.subscription.deleted":return{name:"subscription_canceled",organizationId:Z.organizationId,properties:{}};case"customer.subscription.updated":return{name:"subscription_updated",organizationId:Z.organizationId,properties:{status:Id$(X.status),...typeof X.cancel_at_period_end==="boolean"?{cancel_at_period_end:X.cancel_at_period_end}:{}}};case"invoice.paid":if(X.billing_reason==="subscription_create")return null;return{name:"subscription_renewed",organizationId:Z.organizationId,properties:{}};default:return null}}function Ad$($,Z){let X=DU6($,Z);if(!X)return;xY({event:X.name,organizationId:X.organizationId,...$.id?{uuid:Sn1(`stripe:${$.id}:${X.name}`)}:{},...$.created?{timestamp:new Date($.created*1000)}:{},properties:X.properties})}async function qd$($){let Z=new eW(r8().db),X=await OU6(Z,$);if(!(X.handled&&X.topUp))Ad$($,X);if(X.handled&&X.topUp)await iE$({organizationId:X.organizationId,amountCents:X.topUp.creditCents,referenceId:X.topUp.referenceId}),Ad$($,X);if(!X.handled&&X.orphanSubscriptionId)try{await oe1(X.orphanSubscriptionId),console.error("stripe webhook: canceled orphan subscription",{subscriptionId:X.orphanSubscriptionId,eventId:$.id})}catch(Q){if(!(Q instanceof lY&&(Q.status===400||Q.status===404)))throw Q}return X}var NU6=300;var Md$=D(()=>{mG();S4();w50();jE();y01()});var LU6=1048576,k71;var kd$=D(()=>{U8();DF();R$();Md$();k71=new H1;k71.post("/webhook",p5({maxSize:LU6,onError:($)=>$.json({error:"payload too large"},413)}),async($)=>{let Z=b0().stripeWebhookSecret;if(!Z)return $.json({error:"stripe billing not configured"},503);let X=await $.req.text();if(!Td$(X,$.req.header("stripe-signature"),Z))return $.json({error:"invalid signature"},400);let Y=Rd$(X);if(!Y)return $.json({error:"invalid payload"},400);let G=await qd$(Y);return console.log("stripe webhook",{eventId:Y.id,type:Y.type,livemode:Y.livemode,...G}),$.json({received:!0})})});import{timingSafeEqual as wU6}from"crypto";function jU6($,Z,X){if(!Z?.startsWith("sha256="))return!1;let Q=new Bun.CryptoHasher("sha256",X).update($).digest("hex"),Y=Z.slice(7);if(Y.length!==Q.length)return!1;return wU6(Buffer.from(Y),Buffer.from(Q))}var EU6=5242880,V71;var Vd$=D(()=>{U8();DF();l3();V71=new H1;V71.post("/webhook",p5({maxSize:EU6,onError:($)=>$.json({error:"payload too large"},413)}),async($)=>{let Z=process.env.GITHUB_WEBHOOK_SECRET;if(!Z)return $.json({error:"github webhook not configured"},503);let X=await $.req.text();if(!jU6(X,$.req.header("x-hub-signature-256"),Z))return $.json({error:"invalid signature"},400);if($.req.header("x-github-event")!=="push")return $.json({ok:!0,ignored:"event"});let Q;try{Q=JSON.parse(X)}catch{return $.json({error:"invalid payload"},400)}let Y=Q.ref,G=Q.repository?.full_name;if(!Y||!G)return $.json({ok:!0,ignored:"shape"});let W=(await Sn0())?.markTenantPoolsDirty(G,Y)??[];return $.json({ok:!0,pools:W})})});function Sd$($,Z){if(Z.startsWith("text/html")||Z.startsWith("image/svg"))$.set("Content-Security-Policy","sandbox allow-scripts allow-modals allow-same-origin")}var Cd$,zU6,PU6,_d$;var vd$=D(()=>{U8();j3();Ng();Zy();Cd$=new H1,zU6=["range","if-none-match","if-modified-since"],PU6=["content-type","content-length","content-range","accept-ranges","etag","last-modified"];Cd$.get("/:org/files/*",async($)=>{let Z=$.get("studioContext"),X=Z.organization?.id;if(!Z.auth?.user?.id){if(Eu($))return $.redirect(`/login?next=${encodeURIComponent($.req.path)}`,302);throw new Z$(401,{message:"Authentication required"})}if(!X)throw new Z$(401,{message:"Organization context required"});let Q=$.req.path.replace(/^.*\/files\//,"");if(!Q)throw new Z$(400,{message:"Missing file key"});let Y=await Nt(Q,Z);if(!Y)throw new Z$(503,{message:"Object storage not configured"});if(Y.startsWith("data:")&&tG()){let K=Y.match(/^data:([^;]+);base64,(.+)$/s);if(!K)throw new Z$(500,{message:"Invalid data URL from storage"});let[,F,H]=K,N=Buffer.from(H,"base64"),U=new Headers({"Content-Type":F,"Cache-Control":"private, max-age=86400"});return Sd$(U,F),new Response(N,{status:200,headers:U})}let G=new Headers;for(let K of zU6){let F=$.req.header(K);if(F)G.set(K,F)}let J=await fetch(Y,{headers:G});if(J.status===403||J.status===404)throw new Z$(404,{message:"File not found"});if(!J.ok&&J.status!==304&&J.status!==416)throw console.error(`[files] upstream storage error ${J.status} for key:`,Q),new Z$(502,{message:"Upstream storage error"});let W=new Headers;for(let K of PU6){let F=J.headers.get(K);if(F)W.set(K,F)}return W.set("Cache-Control","private, max-age=86400"),Sd$(W,W.get("content-type")??""),new Response(J.body,{status:J.status,headers:W})});_d$=Cd$});var Ls=_((Dv)=>{var AU6=Dv&&Dv.__createBinding||(Object.create?function($,Z,X,Q){if(Q===void 0)Q=X;var Y=Object.getOwnPropertyDescriptor(Z,X);if(!Y||("get"in Y?!Z.__esModule:Y.writable||Y.configurable))Y={enumerable:!0,get:function(){return Z[X]}};Object.defineProperty($,Q,Y)}:function($,Z,X,Q){if(Q===void 0)Q=X;$[Q]=Z[X]}),TU6=Dv&&Dv.__exportStar||function($,Z){for(var X in $)if(X!=="default"&&!Object.prototype.hasOwnProperty.call(Z,X))AU6(Z,$,X)};Object.defineProperty(Dv,"__esModule",{value:!0});TU6(PY(),Dv)});var xd$=_((fd$)=>{Object.defineProperty(fd$,"__esModule",{value:!0});fd$.version=void 0;fd$.version="3.4.0"});var hd$=_((AF)=>{var RU6=AF&&AF.__importDefault||function($){return $&&$.__esModule?$:{default:$}};Object.defineProperty(AF,"__esModule",{value:!0});AF.NodeTransport=AF.VERSION=void 0;AF.nodeResolveHost=SU6;var s6=Ls(),IU6=j0("net"),S71=j0("tls"),qU6=j0("path"),yd$=j0("fs"),MU6=RU6(j0("dns")),kU6=xd$();AF.VERSION=kU6.version;var VU6="nats.js";class gd${socket;version;lang;yields=[];signal=(0,s6.deferred)();closedNotification=(0,s6.deferred)();options;connected=!1;tlsName="";done=!1;closeError;constructor(){this.lang=VU6,this.version=AF.VERSION}async connect($,Z){this.tlsName=$.tlsName,this.options=Z;let{tls:X}=this.options,{handshakeFirst:Q}=X||{};try{if(Q===!0)this.socket=await this.tlsFirst($);else this.socket=await this.dial($);if(this.done)this.socket?.destroy();let Y=await this.peekInfo();(0,s6.checkOptions)(Y,Z);let{tls_required:G,tls_available:J}=Y,W=J===!0&&Z.tls!==null;if(!Q&&(G||W))this.socket=await this.startTLS();if(this.done)this.socket?.destroy();if(G&&this.socket.encrypted!==!0)throw s6.errors.InvalidArgumentError.format("tls","is not available on this server");return this.connected=!0,this.setupHandlers(),this.signal.resolve(),Promise.resolve()}catch(Y){let G=Y;if(!G)G=new s6.errors.ConnectionError("error connecting - node provided an undefined error");let{code:J}=G,W=J==="ECONNREFUSED"?new s6.errors.ConnectionError("connection refused",{cause:G}):G;throw this.socket?.destroy(),W}}dial($){let Z=(0,s6.deferred)(),X,Q=(0,IU6.createConnection)($.port,$.hostname,()=>{Z.resolve(Q),Q.removeAllListeners()});return Q.on("error",(Y)=>{X=Y}),Q.on("close",()=>{Q.removeAllListeners(),Z.reject(X)}),Q.setNoDelay(!0),Z}get isClosed(){return this.done}close($){return this._closed($,!1)}peekInfo(){let $=(0,s6.deferred)(),Z;return this.socket.on("data",(X)=>{this.yields.push(X);let Q=s6.DataBuffer.concat(...this.yields),Y=(0,s6.extractProtocolMessage)(Q);if(Y!=="")try{let G=s6.INFO.exec(Y);if(!G)throw Error("unexpected response from server");let J=JSON.parse(G[1]);$.resolve(J)}catch(G){$.reject(G)}finally{this.socket.removeAllListeners()}}),this.socket.on("error",(X)=>{Z=X}),this.socket.on("close",()=>{this.socket.removeAllListeners(),$.reject(Z)}),$}loadFile($){if(!$)return Promise.resolve();let Z=(0,s6.deferred)();try{if($=(0,qU6.resolve)($),!(0,yd$.existsSync)($))Z.reject(Error(`${$} doesn't exist`));(0,yd$.readFile)($,(X,Q)=>{if(X)return Z.reject(X);Z.resolve(Q)})}catch(X){Z.reject(X)}return Z}async loadClientCerts(){let $={},{certFile:Z,cert:X,caFile:Q,ca:Y,keyFile:G,key:J}=this.options.tls;try{if(Z){let W=await this.loadFile(Z);if(W)$.cert=W}else if(X)$.cert=X;if(G){let W=await this.loadFile(G);if(W)$.key=W}else if(J)$.key=J;if(Q){let W=await this.loadFile(Q);if(W)$.ca=[W]}else if(Y)$.ca=Y;return Promise.resolve($)}catch(W){return Promise.reject(W)}}async tlsFirst($){let Z,X={servername:this.tlsName,rejectUnauthorized:!0};if(this.socket)X.socket=this.socket;if(typeof this.options.tls==="object")try{let Y=await this.loadClientCerts()||{};X=(0,s6.extend)(X,this.options.tls,Y)}catch(Y){return Promise.reject(new s6.errors.ConnectionError(Y.message,{cause:Y}))}let Q=(0,s6.deferred)();try{let Y=(0,S71.connect)($.port,$.hostname,X,()=>{Y.removeAllListeners(),Q.resolve(Y)});Y.on("error",(G)=>{Z=G}),Y.on("secureConnect",()=>{if(X.rejectUnauthorized===!1)return;if(!Y.authorized)throw Y.authorizationError}),Y.on("close",()=>{Q.reject(Z),Y.removeAllListeners()}),Y.setNoDelay(!0)}catch(Y){Q.reject(new s6.errors.ConnectionError(Y.message,{cause:Y}))}return Q}async startTLS(){let $,Z={socket:this.socket,servername:this.tlsName,rejectUnauthorized:!0};if(typeof this.options.tls==="object")try{let Q=await this.loadClientCerts()||{};Z=(0,s6.extend)(Z,this.options.tls,Q)}catch(Q){return Promise.reject(new s6.errors.ConnectionError(Q.message,{cause:Q}))}let X=(0,s6.deferred)();try{let Q=(0,S71.connect)(Z,()=>{Q.removeAllListeners(),X.resolve(Q)});Q.on("error",(Y)=>{$=Y}),Q.on("secureConnect",()=>{if(Z.rejectUnauthorized===!1)return;if(!Q.authorized)throw Q.authorizationError}),Q.on("close",()=>{X.reject($),Q.removeAllListeners()})}catch(Q){X.reject(new s6.errors.ConnectionError(Q.message,{cause:Q}))}return X}setupHandlers(){let $;this.socket.on("data",(Z)=>{return this.yields.push(Z),this.signal.resolve()}),this.socket.on("error",(Z)=>{$=Z}),this.socket.on("end",()=>{if(this.socket?.destroyed)return;this.socket?.write(new Uint8Array(0),()=>{this.socket?.end()})}),this.socket.on("close",()=>{this._closed($,!1)})}[Symbol.asyncIterator](){return this.iterate()}async*iterate(){while(!0){if(this.yields.length===0)await this.signal;let $=this.yields;this.yields=[];for(let Z=0;Z<$.length;Z++){if(this.options.debug)console.info(`> ${(0,s6.render)($[Z])}`);yield $[Z]}if(this.done)break;else if(this.yields.length===0)$.length=0,this.yields=$,this.signal=(0,s6.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 S71.TLSSocket}_send($){if(this.isClosed||this.socket===void 0)return Promise.resolve();if(this.options.debug)console.info(`< ${(0,s6.render)($)}`);let Z=(0,s6.deferred)();try{this.socket.write($,(X)=>{if(X){if(this.options.debug)console.error(`!!! ${(0,s6.render)($)}: ${X}`);return Z.reject(X)}return Z.resolve()})}catch(X){if(this.options.debug)console.error(`!!! ${(0,s6.render)($)}: ${X}`);Z.reject(X)}return Z}send($){this._send($).catch((X)=>{})}async _closed($,Z=!0){if(!this.connected)return;if(this.done){this.socket?.destroy();return}if(this.closeError=$,!$&&this.socket&&Z)try{await this._send(new TextEncoder().encode(""))}catch(X){if(this.options.debug)console.log("transport close terminated with an error",X)}try{if(this.socket)this.socket.removeAllListeners(),this.socket?.destroy(),this.socket=void 0}catch(X){console.log(X)}this.done=!0,this.closedNotification.resolve(this.closeError)}closed(){return this.closedNotification}}AF.NodeTransport=gd$;function SU6($){let Z=(0,s6.deferred)();return MU6.default.lookup($,{all:!0},(X,Q)=>{if(X){Z.reject(X);return}let Y=[];for(let G of Q)Y.push(G.address);if(Y.length===0)Y.push($);Z.resolve(Y)}),Z}});var md$=_((dd$)=>{Object.defineProperty(dd$,"__esModule",{value:!0});dd$.connect=CU6;var ud$=hd$(),ld$=Ls(),cd$=Ls();function CU6($={}){if((0,cd$.hasWsProtocol)($))return Promise.reject(cd$.errors.InvalidArgumentError.format("servers","node client doesn't support websockets, use the 'wsconnect' function instead"));return(0,ld$.setTransportFactory)({factory:()=>{return new ud$.NodeTransport},dnsResolveFn:ud$.nodeResolveHost}),ld$.NatsConnectionImpl.connect($)}});var id$=_((pN)=>{var vU6=pN&&pN.__createBinding||(Object.create?function($,Z,X,Q){if(Q===void 0)Q=X;var Y=Object.getOwnPropertyDescriptor(Z,X);if(!Y||("get"in Y?!Z.__esModule:Y.writable||Y.configurable))Y={enumerable:!0,get:function(){return Z[X]}};Object.defineProperty($,Q,Y)}:function($,Z,X,Q){if(Q===void 0)Q=X;$[Q]=Z[X]}),fU6=pN&&pN.__exportStar||function($,Z){for(var X in $)if(X!=="default"&&!Object.prototype.hasOwnProperty.call(Z,X))vU6(Z,$,X)};Object.defineProperty(pN,"__esModule",{value:!0});pN.connect=void 0;var bU6=md$();Object.defineProperty(pN,"connect",{enumerable:!0,get:function(){return bU6.connect}});fU6(Ls(),pN)});function od$($){let Z=$?.connectFn??hU6,X=null,Q=null,Y=!1,G=!1,J=!1,W=[];function K(){return X!==null&&!X.isClosed()&&!X.isDraining()&&!J}function F(){console.log(`[NatsProvider] fireReady: ${W.length} callbacks`);for(let U of W)try{U()}catch{}}function H(U){(async()=>{for await(let B of U.status())if(B.type==="disconnect")console.log("[NatsProvider] Disconnected"),J=!0;else if(B.type==="reconnect")console.log("[NatsProvider] Reconnected, re-firing ready callbacks"),J=!1,Q=null,F()})().catch(()=>{})}async function N(U,B){let O=0;while(!G)try{X=await Z({servers:U,timeout:gU6,reconnect:!0,maxReconnectAttempts:-1,...B?{authenticator:B}:{}}),console.log(`[NatsProvider] Connected to ${X.getServer()} after ${O} attempt(s)`),Q=null,J=!1,H(X),F();return}catch{O++;let L=aZ(yU6,xU6,O-1,2,0.5);await L$(L)}}return{init(U,B){if(Y)return;Y=!0,G=!1;let O=B?.creds?pd$.credsAuthenticator(new TextEncoder().encode(B.creds)):void 0;N(U,O).catch(()=>{})},isConnected(){return K()},getConnection(){return K()?X:null},getJetStream(){if(!K())return null;if(!Q)Q=td$.jetstream(X);return Q},onReady(U){if(W.push(U),K())try{U()}catch{}},async drain(){if(G=!0,Y=!1,Q=null,J=!1,X){let U=X;X=null,await U.drain().catch(()=>{})}}}}function hU6($){return nd$.connect($)}var pd$,nd$,td$,xU6=100,yU6=3000,gU6=3000;var rd$=D(()=>{W4();pd$=V(Ll(),1),nd$=V(id$(),1),td$=V(BL(),1)});function C71($,Z){return`${$}.${Z}`}class _71{cache;constructor($){this.cache=eh({ttlMs:$?.ttlMs??uU6,maxSize:$?.maxSize??lU6})}async get($,Z){return this.cache.get(C71($,Z))??null}async set($,Z,X){this.cache.set(C71($,Z),X)}async invalidate($,Z){this.cache.delete(C71($,Z))}teardown(){this.cache.clear()}}var uU6=600000,lU6=5000;var ad$=()=>{};function LT0($,Z){return`${$}:${Z}`}function v71($){let Z=eh({ttlMs:$?.ttlMs??cU6,maxSize:$?.maxSize??dU6}),X=$?.getConnection,Q=crypto.randomUUID(),Y=new TextEncoder,G=new TextDecoder,J=null;function W(K,F){let H=X?.();if(!H)return;try{H.publish(sd$,Y.encode(JSON.stringify({organizationId:K,keyId:F,originId:Q})))}catch(N){console.warn("[ProviderKeyCache] Publish failed (non-critical):",N)}}return{get(K,F){return Z.get(LT0(K,F))},set(K,F,H){Z.set(LT0(K,F),H)},invalidate(K,F){Z.delete(LT0(K,F)),W(K,F)},start(){if(J)return;let K=X?.();if(!K)return;J=K.subscribe(sd$),(async()=>{for await(let F of J)try{let H=JSON.parse(G.decode(F.data));if(H.originId===Q)continue;Z.delete(LT0(H.organizationId,H.keyId))}catch{}})().catch(console.error)},teardown(){J?.unsubscribe(),J=null,Z.clear()}}}var sd$="studio.ai-provider-keys.invalidate",cU6=30000,dU6=5000;var ed$=()=>{};class f71{options;subscription=null;onCancel=null;encoder=new TextEncoder;originId=crypto.randomUUID();constructor($){this.options=$}async start($){if($)this.onCancel=$;if(this.subscription)return;if(!this.onCancel)return;let Z=this.options.getConnection();if(!Z)return;let X=new TextDecoder,Q=Z.subscribe("studio.decopilot.cancel");this.subscription=Q,(async()=>{for await(let Y of Q)try{let G=JSON.parse(X.decode(Y.data));if(G.originId===this.originId)continue;this.onCancel?.(G.taskId)}catch{}})().catch(console.error)}broadcast($){if(/[.*>\s]/.test($)){console.warn("[NatsCancelBroadcast] Invalid threadId, skipping broadcast");return}this.onCancel?.($);try{let Z=this.options.getConnection();if(!Z)return;let X=this.encoder.encode(JSON.stringify({taskId:$,originId:this.originId}));Z.publish("studio.decopilot.cancel",X)}catch(Z){console.warn("[NatsCancelBroadcast] Publish failed (non-critical):",Z)}}async stop(){this.subscription?.unsubscribe(),this.subscription=null,this.onCancel=null}}var $m$=($)=>{let Z;return()=>Z??=$()},b71,x71;var Zm$=D(()=>{I6();b71=$m$(()=>w$.createHistogram("decopilot.stream.encode_ms",{description:"Per-chunk JSON.stringify+encode time for decopilot stream",unit:"ms"})),x71=$m$(()=>w$.createCounter("decopilot.stream.published_chunks",{description:"Logical decopilot stream chunks published to JetStream",unit:"{chunks}"}))});function rU6($=Ym$){return{name:cK,subjects:[`${ar0}.>`],storage:BW.StorageType.File,max_age:pU6,max_bytes:tU6,max_msgs_per_subject:oU6,discard:BW.DiscardPolicy.Old,retention:BW.RetentionPolicy.Limits,duplicate_window:nU6,num_replicas:$}}class Gm${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 Xm$($){let Z=Qm$.headers();for(let[X,Q]of Object.entries($))Z.set(X,Q);return Z}function $B6($,Z){let X=0;return{publish(Q,Y,G,J){Q.publish(Y,G,J?{headers:J}:void 0).catch((W)=>{if(X++,iU6().add(1,{"org.id":Z??"unknown"}),X===1||X%100===0)console.warn(`[Decopilot] JetStream publish failed for thread ${$} (${X} total):`,W)})},get errorCount(){return X}}}function ZB6($,Z){return $.info?.cluster?Z:1}function XB6($){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 y71{options;js=null;jsm=null;constructor($){this.options=$}async init(){let $=this.options.getConnection();if(!$){console.log("[Decopilot] StreamBuffer.init skipped: NATS not connected yet");return}let Z=async(Q,Y)=>{let G=rU6(Y);try{await Q.streams.info(cK),await Q.streams.update(cK,G)}catch(J){if(J instanceof Error&&J.message.includes("stream not found"))await Q.streams.add(G),await Q.streams.update(cK,G);else if(J instanceof Error&&/can ?not change.*storage|storage type/i.test(J.message))await Q.streams.delete(cK),await Q.streams.add(G);else throw J}},X=await g6(async()=>{let Q=this.options.getJetStreamManager?await this.options.getJetStreamManager():await BW.jetstreamManager($),Y=ZB6($,Ym$);try{await Z(Q,Y)}catch(G){if(Y<=1||!XB6(G))throw G;console.warn(`[Decopilot] StreamBuffer: NATS rejected num_replicas=${Y} (${G.message}); falling back to an unreplicated stream`),await Z(Q,1)}return Q},{maxAttempts:5,minTimeout:250,maxTimeout:4000,jitter:0.5,isRetriable:Ag});this.js=this.options.getJetStream(),this.jsm=X,console.log(`[Decopilot] StreamBuffer.init ${this.js?"ready":"degraded (js=null)"}`)}pump($,Z,X,Q){let Y=this.js;if(!Y)return console.warn(`[Decopilot] pump: JetStream client unavailable for thread ${Z}; chunks NOT published to NATS`),Promise.resolve();let G=$B6(Z,Q),J=!1,W=()=>{if(J)return;J=!0;let F=vB$(Z);Y.publish(F.subject,F.data).catch(()=>{})};X.addEventListener("abort",W,{once:!0});let K=(F)=>{let H=performance.now(),N=er0(F,{runId:Z}),U=performance.now()-H;b71().record(U),x71().add(1,{"org.id":Q??"unknown"}),eU6?.record(U,N.reduce((B,O)=>B+O.data.length,0));for(let B of N)G.publish(Y,B.subject,B.data,B.headers?Xm$(B.headers):void 0)};return(async()=>{let F=$.getReader(),H=0,N=0,U;try{while(!0){let{done:B,value:O}=await F.read();if(B)break;if(K(O),N++,++H>=64)H=0,await new Promise((L)=>setImmediate(L))}}catch(B){U=B,console.warn(`[Decopilot] stream pump error for thread ${Z}:`,B?.message??B)}finally{if(F.releaseLock(),W(),sU6)console.warn(JSON.stringify({msg:"decopilot-stream-diag",event:"pump-done",taskId:Z,publishedChunks:N,publishErrors:G.errorCount}))}if(U!==void 0)throw U})()}async publishSerialized($,Z){try{return await g6(()=>$.publish(Z.subject,Z.data,{...Z.headers?{headers:Xm$(Z.headers)}:{},...Z.msgId?{msgID:Z.msgId}:{}}),{maxAttempts:6,minTimeout:250,maxTimeout:5000,jitter:0.5,isRetriable:Ag}),!0}catch(X){return console.error(`[Decopilot] publish failed after retries subject=${Z.subject}`,X),!1}}async publishRawChunk($,Z,X){let Q=this.js;if(!Q)return!1;let Y=performance.now(),G=er0(Z,{runId:$,dedup:X});b71().record(performance.now()-Y),x71().add(1);for(let J of G)if(!await this.publishSerialized(Q,J))return!1;return!0}async publishDone($,Z,X){let Q=this.js;if(!Q)return!1;let Y=_B$({runId:$,fenceToken:Z,finalSeq:X});return await this.publishSerialized(Q,Y)}async createTailStream($,Z,X){let Q=this.js;if(!Q)return console.warn(`[Decopilot] createTailStream: JetStream client unavailable for thread ${$}; no live tail`),null;let Y=X?.deliverPolicy==="new"?BW.DeliverPolicy.New:BW.DeliverPolicy.All,G=X?.closeOnDone??!1,J=YD($),W;try{W=await g6(async()=>{return(await Q.consumers.get(cK,{filter_subjects:J,deliver_policy:Y})).consume()},{maxAttempts:6,minTimeout:250,maxTimeout:5000,jitter:0.5,isRetriable:Ag})}catch(L){return console.warn("[Decopilot] JetStream tail unavailable (non-critical):",L?.message??L),null}let H=rL0({messages:async function*(){try{for await(let L of W)yield{subject:L.subject,data:L.data,headers:L.headers}}finally{W.stop()}}(),onCancel:()=>W.stop()}).pipeThrough(pL0()).pipeThrough(nL0()).getReader(),N=!1,U=()=>{if(N)return;N=!0;try{H.releaseLock()}catch{}},B=!1,O=()=>{if(B)return;B=!0,W.stop(),H.cancel().catch(()=>{}),U()};return Z?.addEventListener("abort",O,{once:!0}),new ReadableStream({async pull(L){for(;;){let{done:w,value:E}=await H.read();if(w){O(),L.close();return}let j=E;if(j.kind==="done"){if(G){O(),L.close();return}continue}L.enqueue(j.chunk);return}},cancel(){O()}})}purge($){if(!this.jsm)return;this.jsm.streams.purge(cK,{filter:YD($)}).catch(()=>{})}teardown(){this.js=null,this.jsm=null}}var BW,Qm$,mU6=($)=>{let Z;return()=>Z??=$()},iU6,pU6=86400000000000,nU6=120000000000,tU6=4294967296,Ym$,oU6=500000,aU6,sU6,eU6;var Jm$=D(()=>{W4();$a0();aL0();tL0();I6();Zm$();BW=V(BL(),1),Qm$=V(Ll(),1),iU6=mU6(()=>w$.createCounter("decopilot.stream.publish_errors",{description:"Number of JetStream publish failures for decopilot stream chunks",unit:"{errors}"})),Ym$=Math.max(1,Number(process.env.DECOPILOT_STREAM_REPLICAS??3)||3);aU6=process.env.STREAM_ENCODE_TRACE==="1",sU6=process.env.DECOPILOT_STREAM_TRACE==="1";eU6=aU6?new Gm$:null});function wT0($,Z,X,Q){if(!Q)return!1;return $.emit(Z,xW(X,Q.status,{title:Q.title??void 0,virtualMcpId:Q.virtual_mcp_id??void 0,createdBy:Q.created_by??void 0,triggerId:Q.trigger_id??null,branch:Q.branch??null,harnessId:Q.harness_id??void 0,createdAt:Q.created_at,updatedAt:Q.updated_at})),!0}var Wm$=D(()=>{_8()});class g71{storage;options;timer=null;constructor($,Z={}){this.storage=$;this.options=Z}start(){if(this.timer)return;let $=this.options.intervalMs??300000;this.timer=setInterval(()=>{this.runOnce()},$)}async runOnce(){let $=this.options.staleAfterMs??3600000;try{let Z=await this.storage.sweepAbandoned($);if(Z>0)console.log(`[async-research-sweeper] marked ${Z} stale jobs as abandoned`);return Z}catch(Z){return console.error("[async-research-sweeper] sweep failed",Z),0}}dispose(){if(this.timer)clearInterval(this.timer),this.timer=null}}async function Km$($,Z,X){let Q=Z.organizationId;if(!aQ(Z))return!1;if(!_C(X))return!1;if(await $.storage.taskBoard.hasHumanRejectedDone(Z.id,Q))return!1;let Y=await $.storage.organizationSettings.get(Q),G=BK(Y?.flags),J=await $.storage.taskBoard.update(Z.id,Q,{status:G},Z.updatedBy);return await z6($,{taskBoardItemId:Z.id,action:"status_changed",actorId:null,data:{from:Z.status,to:G,reason:"pr_merged"}}),b$(Q,J),console.log(`[task-board-review-sweeper] ${Z.id}: linked PR already merged \u2014 moved to ${G}`),!0}var Fm$=D(()=>{C6();WX();Kg();vK();E5()});function FB6($){return $ instanceof nX}function HB6($,Z){return Z-$>=WB6}class h71{taskBoard;contextFactory;billing;options;timer=null;running=!1;cursor=null;constructor($,Z,X,Q={}){this.taskBoard=$;this.contextFactory=Z;this.billing=X;this.options=Q}start(){if(this.timer)return;let $=this.options.intervalMs??QB6;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??GB6,X=this.options.itemIntervalMs??YB6,Q=new Date(Date.now()-X),Y=await this.taskBoard.listItemsPendingReview(Z,this.cursor,Q),G=Y.at(-1);this.cursor=Y.length===Z&&G?{updatedAt:G.updatedAt,id:G.id}:null;for(let{id:J,organizationId:W}of Y)try{if(await this.reconcileItem(J,W,Q))$++}catch(K){console.error(`[task-board-review-sweeper] ${J} failed`,K)}await this.reapNeverStartedThreads(Z),$+=await this.dispatchDueRetries(Z),await this.reactToUnhandledFailures(Z)}catch(Z){console.error("[task-board-review-sweeper] sweep failed",Z)}finally{this.running=!1}return $}async reapNeverStartedThreads($){try{let Z=await this.taskBoard.failNeverStartedLinkedThreads($,new Date(Date.now()-Et0),Lo0);for(let X of Z)console.warn(`[task-board-review-sweeper] failed never-started thread ${X.threadId} on ${X.itemId}`)}catch(Z){console.error("[task-board-review-sweeper] reaping failed",Z)}}async reactToUnhandledFailures($){let Z=await this.taskBoard.listItemsStuckAfterFailure($,new Date(Date.now()-KB6));for(let{id:X,organizationId:Q,threadId:Y}of Z)try{console.warn(`[task-board-review-sweeper] reacting to an unhandled failure on ${X}`),await Bo0(this.taskBoard,Y,Q),await Oo0(this.taskBoard,this.billing,Y,Q)}catch(G){console.error(`[task-board-review-sweeper] unhandled-failure reaction for ${X} failed`,G)}}async dispatchDueRetries($){let Z=0,X=await this.taskBoard.listItemsDueForRetry($,new Date);for(let{id:Q,organizationId:Y,attempts:G}of X)try{if(!await this.taskBoard.claimDueRetry(Q,Y,new Date))continue;let J=await this.taskBoard.getById(Q,Y);if(!J||J.status!=="in_progress"||J.assigneeId!==Z8)continue;let W=await this.contextFactory(Y,J.assignedBy??J.createdBy);if(!W)continue;await WN(W,J,{runClass:"retry"}),Z++,console.warn(`[task-board-review-sweeper] re-dispatched ${Q} after a failure (attempt ${G})`)}catch(J){if(console.error(`[task-board-review-sweeper] retry dispatch for ${Q} failed`,J),FB6(J)){await this.returnToTodo(Q,Y,J instanceof Error?J.message:String(J));continue}await this.taskBoard.scheduleRunRetry(Q,Y,G,new Date(Date.now()+JB6)).catch((W)=>console.error(`[task-board-review-sweeper] re-arming ${Q} failed`,W))}return Z}async returnToTodo($,Z,X){try{let Q=await this.taskBoard.getById($,Z);if(!Q||Q.status!=="in_progress")return;let Y=await this.taskBoard.returnToTodoAfterFailure($,Z,Q.updatedBy);if(!Y)return;await this.taskBoard.recordActivity({taskBoardItemId:$,action:"status_changed",actorId:null,data:{from:"in_progress",to:"todo",reason:X}}).catch(()=>{}),b$(Z,Y)}catch(Q){console.error(`[task-board-review-sweeper] returning ${$} to todo failed`,Q)}}async handOffReviewWithoutPr($,Z){let X=await this.taskBoard.listActivity(Z.id,Z.organizationId);if(!HB6(_H(X,Z.reviewCycleStartedAt),Date.now()))return;await xK($,Z,"no pull request is linked to this task \u2014 there is nothing for a "+"reviewer to review")}async reconcileItem($,Z,X){if(!await this.taskBoard.claimSweep($,Z,X))return!1;let Q=await this.taskBoard.getById($,Z);if(!Q)return!1;if(!aQ(Q))return!1;let Y=Q.assigneeId===Z8,G=await this.taskBoard.listPrs($,Z),J=await this.contextFactory(Z,Q.assignedBy??Q.createdBy);if(!J)return!1;if(G.length===0){if(Y)await this.handOffReviewWithoutPr(J,Q);return!1}let W=await Promise.all(G.map(async(K)=>({...K,...await Hg(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 Km$(J,Q,W))return!0;if(await AO$(J,Q))return!0;if(!Y)return!1;if(!xo0(W))return!1;return await KL0(J,Q,{previewMatchesHead:yo0(W)}),!0}dispose(){if(this.timer)clearInterval(this.timer),this.timer=null}}var QB6=60000,YB6=300000,GB6=50,JB6=60000,WB6=900000,KB6=120000;var Hm$=D(()=>{C6();Mo0();GN();_t();vK();Fm$();E5();sG();wo0();ZG();Wt()});import{readdir as NB6,rm as ET0}from"fs/promises";import{join as jT0}from"path";async function zT0($){let Z=new Date;Z.setUTCDate(Z.getUTCDate()-UB6),Z.setUTCHours(0,0,0,0);let X=0;try{let Q=await Lv($);for(let Y of Q)if(/^\d{4}$/.test(Y))X+=await Nm$($,Y,Z);else if(!Y.startsWith(".")){let G=jT0($,Y),J=await Lv(G);for(let K of J){if(!/^\d{4}$/.test(K))continue;X+=await Nm$(G,K,Z)}if((await Lv(G)).length===0)await ET0(G,{recursive:!0,force:!0})}}catch(Q){console.warn("monitoring retention cleanup failed:",Q)}return X}async function Nm$($,Z,X){let Q=0,Y=jT0($,Z),G=await Lv(Y);for(let W of G){if(!/^\d{2}$/.test(W))continue;let K=jT0(Y,W),F=await Lv(K);for(let N of F){if(!/^\d{2}$/.test(N))continue;let U=new Date(`${Z}-${W}-${N}T00:00:00Z`);if(isNaN(U.getTime()))continue;if(U<X){let B=jT0(K,N);await ET0(B,{recursive:!0,force:!0}),Q++}}if((await Lv(K)).length===0)await ET0(K,{recursive:!0,force:!0})}if((await Lv(Y)).length===0)await ET0(Y,{recursive:!0,force:!0});return Q}async function Lv($){try{return(await NB6($)).filter((X)=>!X.startsWith("."))}catch{return[]}}var UB6=30;var u71=()=>{};import{DBOS as l71,SchedulerMode as BB6}from"@dbos-inc/dbos-sdk";async function DB6(){let $=[yJ(),wv(),qF()],Z=0;for(let X of $)try{Z+=await zT0(X)}catch(Q){console.error("[monitoring-retention] cleanup failed:",Q)}return console.log(`[monitoring-retention] deleted ${Z} day-dir(s) across ${$.length} signal dir(s)`),{deleted:Z,dirs:$.length}}async function LB6($,Z){await l71.runStep(()=>DB6(),{name:"monitoringRetention"})}function Bm$(){if(Um$)return;Um$=!0;let $=l71.registerWorkflow(LB6,{name:"monitoringRetentionWorkflow"});l71.registerScheduled($,{name:"monitoringRetentionWorkflow",crontab:OB6,mode:BB6.ExactlyOncePerIntervalWhenActive})}var OB6="23 4 * * *",Um$=!1;var Om$=D(()=>{wY();u71()});function Dm$($){return async(Z,X)=>{let Q=await $.db.selectFrom("member").innerJoin("organization","organization.id","member.organizationId").select(["member.role","organization.id as orgId","organization.slug as orgSlug","organization.name as orgName"]).where("member.userId","=",X).where("member.organizationId","=",Z).executeTakeFirst();if(!Q)return console.warn(`[automationContextFactory] User ${X} not found in org ${Z} \u2014 returning null`),null;let Y=await HJ.create();Y.auth.user={id:X,role:Q.role},Y.organization={id:Q.orgId,slug:Q.orgSlug,name:Q.orgName};let G=await Dt($.db,Z,Q.role);return Y.boundAuth=l51({auth:Y.authInstance,headers:new Headers,role:Q.role,permissions:G,userId:X}),Y.access=new nw(X,void 0,Y.boundAuth,Q.role,"self"),tO(Y,{id:Q.orgId,slug:Q.orgSlug}),Y}}var Lm$=D(()=>{tw();oO()});function wB6(){return[{name:"Postgres",status:"pending",port:0},{name:"NATS",status:"pending",port:0}]}function EB6(){return{services:wB6(),migrationsStatus:"pending",serverUrl:null,logs:[]}}function zB6(){for(let $ of jB6)$()}function wm$($){let Z=[...c71.logs,$];c71={...c71,logs:Z.length>500?Z.slice(-500):Z},zB6()}function d71(){return PB6}var c71,jB6,PB6=!1;var m71=D(()=>{c71=EB6(),jB6=new Set});import{EventEmitter as AB6}from"events";var i71;var Em$=D(()=>{m71();i71=new AB6;i71.on("request",($)=>{wm$($)})});function jm$(){return async($,Z)=>{let X=Date.now(),Q=$.req.method,Y=$.req.path;if(Y==="/api/auth/get-session"||Y.includes("favicon")){await Z();return}let G="",J=!1;if(Y.startsWith("/mcp")&&Q==="POST"){J=!0;try{if($.req.header("Content-Type")?.includes("application/json")){let U=await $.req.raw.clone().json();if(U.method==="tools/call"&&U.params?.name){let B=pu(U.params.name),O=U.params.arguments||{},L=Object.keys(O).map((E)=>pu(E)),w=L.length>0?L.slice(0,3).join(",")+(L.length>3?"\u2026":""):"";G=`${J5.tool}${B}${J5.dim}(${w})${J5.reset}`}else if(U.method)G=`${J5.dim}${pu(U.method)}${J5.reset}`}}catch{}}let W=pu(Y);if(Y.startsWith("/mcp/conn_")){let H=Y.split("/")[2]??"";W=`/mcp/${J5.mcp}${pu(H.slice(0,12))}\u2026${J5.reset}`}else if(Y==="/mcp")W=`${J5.mcp}/mcp${J5.reset}`;else if(Y==="/mcp/registry")W=`${J5.mcp}/mcp/registry${J5.reset}`;let K=RB6(Q),F=J?"\u25C0":"\u2190";if(!d71())console.log(`${J5.dim}${F}${J5.reset} ${K}${Q}${J5.reset} ${W}${G?` ${G}`:""}`);try{await Z()}finally{let H=Date.now()-X,N=$.res.status,U=TB6(N),B=H<1000?`${H}ms`:`${(H/1000).toFixed(1)}s`,O=J?"\u25B6":"\u2192";if(!d71())console.log(`${J5.dim}${O}${J5.reset} ${K}${Q}${J5.reset} ${W}${G?` ${G}`:""} ${U}${N}${J5.reset} ${J5.duration}${B}${J5.reset}`);i71.emit("request",{method:Q,path:pu(Y),status:N,duration:H,timestamp:new Date})}}}var J5,TB6=($)=>{if($>=500)return J5.serverError;if($>=400)return J5.clientError;if($>=300)return J5.redirect;return J5.ok},RB6=($)=>{return J5[$]||J5.reset},pu=($)=>{return $.replace(/\r/g,"").replace(/\n/g,"").replace(/\x1b\[[0-9;]*m/g,"").replace(/[\x00-\x1f\x7f-\x9f]/g,"")};var zm$=D(()=>{m71();Em$();J5={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 Rm$}from"crypto";import{mkdir as IB6,readdir as qB6,rm as Pm$,stat as Im$}from"fs/promises";import{join as n71,relative as MB6}from"path";import{z as P$}from"zod";function Mm$($){let Z=$.replace(/[^a-zA-Z0-9_-]/g,"_");return n71(kB6,Z)}function km$($){return $.replace(/^\/+/,"").replace(/\.\./g,"")}function p71($,Z){let X=Mm$($),Q=km$(Z);return n71(X,Q)}function VB6($,Z,X,Q){let Y=b0().encryptionKey||"dev-secret",G=`${$}:${Z}:${X}:${Q}`;return Rm$("sha256",Y).update(G).digest("hex")}function Tm$($,Z,X,Q,Y){let G=Math.floor(Date.now()/1000)+Q,J=VB6(Z,X,G,Y),W=new URL(`/api/dev-assets/${Z}/${km$(X)}`,$);return W.searchParams.set("expires",G.toString()),W.searchParams.set("signature",J),W.searchParams.set("method",Y),W.toString()}function Vm$($,Z,X){let Q=`${$}:${Z.getTime()}:${X}`;return`"${Rm$("md5","etag").update(Q).digest("hex")}"`}async function Sm$($,Z,X,Q,Y){try{let G=await qB6($,{withFileTypes:!0});for(let J of G){let W=n71($,J.name),F=MB6(Z,W).replace(/\\/g,"/");if(X&&!F.startsWith(X))continue;if(J.isDirectory())if(Q){let H=F+"/";if(!X||H.startsWith(X)){if(!(X?F.slice(X.length):F).includes("/"))Y.commonPrefixes.add(H)}}else await Sm$(W,Z,X,Q,Y);else if(J.isFile()){if(Q&&X){let H=F.slice(X.length);if(H.includes(Q)){let N=H.indexOf(Q),U=X+H.slice(0,N+1);Y.commonPrefixes.add(U);continue}}try{let H=await Im$(W);Y.objects.push({key:F,size:H.size,lastModified:H.mtime.toISOString(),etag:Vm$(W,H.mtime,H.size)})}catch{}}}}catch{}}function Cm$($,Z){let Q=r($).id;return[{name:"LIST_OBJECTS",description:"List objects in the local assets directory with pagination support",inputSchema:P$.object({prefix:P$.string().optional(),maxKeys:P$.number().optional().default(1000),continuationToken:P$.string().optional(),delimiter:P$.string().optional()}),outputSchema:P$.object({objects:P$.array(P$.object({key:P$.string(),size:P$.number(),lastModified:P$.string(),etag:P$.string()})),nextContinuationToken:P$.string().optional(),isTruncated:P$.boolean(),commonPrefixes:P$.array(P$.string()).optional()}),handler:async(Y)=>{let G=Y,J=G.prefix||"",W=G.maxKeys??1000,K=G.delimiter,F=G.continuationToken,H=Mm$(Q);await IB6(H,{recursive:!0});let N={objects:[],commonPrefixes:new Set};await Sm$(H,H,J,K,N),N.objects.sort((w,E)=>w.key.localeCompare(E.key));let U=0;if(F){if(U=N.objects.findIndex((w)=>w.key>F),U===-1)U=N.objects.length}let B=N.objects.slice(U,U+W),O=U+W<N.objects.length,L=O?B[B.length-1]?.key:void 0;return{objects:B,isTruncated:O,nextContinuationToken:L,commonPrefixes:Array.from(N.commonPrefixes).sort()}}},{name:"GET_OBJECT_METADATA",description:"Get metadata for a file in the local assets directory",inputSchema:P$.object({key:P$.string()}),outputSchema:P$.object({contentType:P$.string().optional(),contentLength:P$.number(),lastModified:P$.string(),etag:P$.string(),metadata:P$.record(P$.string(),P$.string()).optional()}),handler:async(Y)=>{let G=Y,J=p71(Q,G.key),W=await Im$(J);return{contentType:M91(G.key),contentLength:W.size,lastModified:W.mtime.toISOString(),etag:Vm$(J,W.mtime,W.size)}}},{name:"GET_PRESIGNED_URL",description:"Generate a presigned URL for downloading a file from local storage",inputSchema:P$.object({key:P$.string(),expiresIn:P$.number().optional()}),outputSchema:P$.object({url:P$.string(),expiresIn:P$.number()}),handler:async(Y)=>{let G=Y,J=G.expiresIn??Am$;return{url:Tm$(Z,Q,G.key,J,"GET"),expiresIn:J}}},{name:"PUT_PRESIGNED_URL",description:"Generate a presigned URL for uploading a file to local storage",inputSchema:P$.object({key:P$.string(),expiresIn:P$.number().optional(),contentType:P$.string().optional()}),outputSchema:P$.object({url:P$.string(),expiresIn:P$.number()}),handler:async(Y)=>{let G=Y,J=G.expiresIn??Am$;return{url:Tm$(Z,Q,G.key,J,"PUT"),expiresIn:J}}},{name:"DELETE_OBJECT",description:"Delete a single file from local storage",inputSchema:P$.object({key:P$.string()}),outputSchema:P$.object({success:P$.boolean(),key:P$.string()}),handler:async(Y)=>{let G=Y,J=p71(Q,G.key);try{return await Pm$(J),{success:!0,key:G.key}}catch{return{success:!1,key:G.key}}}},{name:"DELETE_OBJECTS",description:"Delete multiple files from local storage",inputSchema:P$.object({keys:P$.array(P$.string()).max(1000)}),outputSchema:P$.object({deleted:P$.array(P$.string()),errors:P$.array(P$.object({key:P$.string(),message:P$.string()}))}),handler:async(Y)=>{let G=Y,J=[],W=[];return await Promise.all(G.keys.map(async(K)=>{let F=p71(Q,K);try{await Pm$(F),J.push(K)}catch(H){W.push({key:K,message:H instanceof Error?H.message:"Unknown error"})}})),{deleted:J,errors:W}}}]}async function t71($,Z,X){let Q=Cm$(Z,X),Y=new dW({name:"dev-assets-mcp",version:"1.0.0"},{capabilities:{tools:{}},jsonSchemaValidator:N5});for(let J of Q){let W="shape"in J.inputSchema?J.inputSchema.shape:P$.object({}).shape,K=J.outputSchema&&"shape"in J.outputSchema?J.outputSchema.shape:P$.object({}).shape;Y.registerTool(J.name,{description:J.description??"",inputSchema:W,outputSchema:K,annotations:J.annotations,_meta:J._meta},async(F)=>{try{let H=await J.handler(F);return{content:[{type:"text",text:JSON.stringify(H)}],structuredContent:H}}catch(H){return{content:[{type:"text",text:`Error: ${H.message}`}],isError:!0}}})}let G=new QQ({enableJsonResponse:$.headers.get("Accept")?.includes("application/json")??!1});return await Y.connect(G),jJ(Y,G,$,"mcp:dev-assets")}async function _m$($,Z,X,Q){let G=Cm$(X,Q).find((J)=>J.name===$);if(!G)return{content:[{type:"text",text:`Tool not found: ${$}`}],isError:!0};try{let J=await G.handler(Z);return{content:[{type:"text",text:JSON.stringify(J)}]}}catch(J){return{content:[{type:"text",text:J instanceof Error?J.message:String(J)}],isError:!0}}}var kB6="./data/assets",Am$=3600,qm$,vm$;var fm$=D(()=>{R$();Vg();U8();hd();$_();gX();LA0();qm$=new H1;qm$.all("/",async($)=>{let Z=$.get("studioContext"),X=new URL($.req.url),Q=`${X.protocol}//${X.host}`;return t71($.req.raw,Z,Q)});vm$=qm$});var bm$={};J4(bm$,{mountDevRoutes:()=>SB6});function SB6($,Z){$.all("/mcp/:connectionId{.*_dev-assets$}",Z,async(Q)=>{let Y=Q.get("studioContext"),G=new URL(Q.req.url),J=`${G.protocol}//${G.host}`;return t71(Q.req.raw,Y,J)}),$.all("/mcp/:connectionId{.*_dev-assets$}/call-tool/:toolName",Z,async(Q)=>{let Y=Q.get("studioContext"),G=new URL(Q.req.url),J=`${G.protocol}//${G.host}`,W=Q.req.param("toolName");if(!W)return Q.json({error:"Missing tool name"},400);let K=await Q.req.json(),F=await _m$(W,K,Y,J);if(F.isError)return Q.json(F.content,500);return Q.json(F.content)}),$.use("/mcp/dev-assets",Z),$.route("/mcp/dev-assets",vm$);let X=new H1;X.use("*",NW({mountPath:"/api/dev-assets"})),X.route("/",DA0({orgFromPath:!1})),$.route("/api/dev-assets",X)}var xm$=D(()=>{U8();z91();LA0();fm$()});import{sql as CB6}from"kysely";import{randomUUID as ym$}from"crypto";import{z as _B6}from"zod";async function fB6($){let Z=new Date().toISOString(),X=ym$(),Q=C8.SELF($.organizationId),Y="registry.publish_request.created",G={requestId:$.request.id,requestedId:$.request.requested_id,title:$.request.title,status:$.request.status,createdAt:$.request.created_at,requester:{name:$.request.requester_name,email:$.request.requester_email}};await $.db.insertInto("events").values({id:X,organization_id:$.organizationId,type:"registry.publish_request.created",source:Q,specversion:"1.0",subject:$.request.id,time:Z,datacontenttype:"application/json",dataschema:null,data:JSON.stringify(G),cron:null,status:"pending",attempts:0,last_error:null,next_retry_at:null,created_at:Z,updated_at:Z}).execute();let J=await $.db.selectFrom("event_subscriptions").select(["id"]).where("organization_id","=",$.organizationId).where("enabled","=",1).where("event_type","=","registry.publish_request.created").where((W)=>W.or([W("publisher","is",null),W("publisher","=",Q)])).execute();if(J.length>0)await $.db.insertInto("event_deliveries").values(J.map((W)=>({id:ym$(),event_id:X,subscription_id:W.id,status:"pending",attempts:0,last_error:null,delivered_at:null,next_retry_at:null,created_at:Z}))).execute();try{await CB6`SELECT
|
|
2882
2882
|
pg_notify('studio_events', ${X}),
|